|  |  | 
 |  |  |  | 
 |  |  | import com.google.gson.Gson; | 
 |  |  | import com.sun.net.httpserver.HttpExchange; | 
 |  |  | import de.uhilger.tango.App; | 
 |  |  | import de.uhilger.tango.Server; | 
 |  |  | import de.uhilger.tango.entity.Abspielvorgang; | 
 |  |  | import de.uhilger.tango.entity.Abspieler; | 
 |  |  | import de.uhilger.tango.entity.Abspielliste; | 
 |  |  | import de.uhilger.tango.entity.Einstellung; | 
 |  |  | import de.uhilger.tango.entity.Entity; | 
 |  |  | import de.uhilger.tango.entity.Livestream; | 
 |  |  | import de.uhilger.tango.entity.Titel; | 
 |  |  | 
 |  |  |  * Abspielgeraet. | 
 |  |  |  * | 
 |  |  |  * HTTP GET /mz/api/strg/abspieler/play/liste/[name]  | 
 |  |  |  * HTTP GET /mz/api/strg/abspieler/next | 
 |  |  |  * HTTP GET /mz/api/strg/abspieler/ende | 
 |  |  |  * | 
 |  |  |  * HTTP POST /mz/api/strg/abspieler/play/titel mit dem Titel im Body | 
 |  |  |  * HTTP POST /mz/api/strg/abspieler/play/stream mit dem Livestream im Body (nur Name gefuellt) | 
 |  |  |  *  | 
 |  |  |  * HTTP POST /mz/api/strg/abspieler/weiter/titel mit dem Titel im Body | 
 |  |  |  * DEPRECATED: HTTP POST /mz/api/strg/abspieler/weiter/titel mit dem Titel im Body | 
 |  |  |  * | 
 |  |  |  * HTTP GET /mz/api/strg/abspieler/pause  | 
 |  |  |  * HTTP GET /mz/api/strg/abspieler/stop  | 
 |  |  |  * HTTP GET /mz/api/strg/abspieler/seek/[sekunden] | 
 |  |  |  *  | 
 |  |  |  * Faustregel: Anzahl Elemente eines URL plus 1 ist die Anzahl der Elemente des  | 
 |  |  |  * Ergebnisses von String.split. | 
 |  |  |  * | 
 |  |  |  * Mit der Funktion ende liefert die MediaSteuerung die Moeglichkeit, Titel aus  | 
 |  |  |  * einer Abspielliste gesteuert von Tango abzuspielen. Die Nutzung der Funktion wird  | 
 |  |  |  * ausgeloest vom Aufruf an abspieler/play/liste/[name]. Tango erwartet dann von einem  | 
 |  |  |  * Abspieler die Rueckmeldung, dass dieser den zuletzt von Tango an den  | 
 |  |  |  * Abspieler zum Abspielen uebermittelten Titel zuende abgespielt hat. Tango  | 
 |  |  |  * uebergibt dem Abspieler dann den naechsten Titel, bis die Abspielliste zuende ist. | 
 |  |  |  *  | 
 |  |  |  * Diese Form unterscheidet sich vom Abspielen einer Abspielliste als einzelner  | 
 |  |  |  * Stream, wie es vom StreamHandler realisiert wird. | 
 |  |  |  * | 
 |  |  |  * @author Ulrich Hilger | 
 |  |  |  * @version 1, 9.4.2021 | 
 |  |  | 
 |  |  |   private static final Logger logger = Logger.getLogger(MediaSteuerung.class.getName()); | 
 |  |  |  | 
 |  |  |   public static final String PL_CMD_PLAY = "play"; | 
 |  |  |   public static final String PL_CMD_SEEK = "seek"; | 
 |  |  |   public static final String PL_DEFAULT_PARAMS = "?titel="; | 
 |  |  |   public static final String PL_PARAM_RUECK = "&r="; | 
 |  |  |   public static final String PL_API_STRG = "api/strg/";  | 
 |  |  |   public static final String PL_CMD_ENDE = "ende"; | 
 |  |  |   public static final String PL_CMD_STOP = "stop"; | 
 |  |  |   public static final String PL_CMD_VOLDN = "voldn"; | 
 |  |  |   public static final String PL_CMD_VOLUP = "volup"; | 
 |  |  |   public static final String PL_CMD_PAUSE = "pause"; | 
 |  |  |   public static final String PL_CMD_PLAYON = "weiter"; | 
 |  |  |   public static final String PL_CMD_NEXT = "next"; | 
 |  |  |   public static final String PL_CMD_CALYPSO_STOP = "stop"; | 
 |  |  |   public static final String PL_CMD_CALYPSO_VOL_INC = "vol-inc"; | 
 |  |  |   public static final String PL_CMD_CALYPSO_VOL_DEC = "vol-dec"; | 
 |  |  |   public static final String PL_CMD_CALYPSO_PAUSE = "pause"; | 
 |  |  |   public static final String PL_CMD_CALYPSO_PLAYON = "playon"; | 
 |  |  |   public static final String DEFAULT_HOST = "http://localhost:9090"; | 
 |  |  | 
 |  |  |         } else if(elems[5].equalsIgnoreCase(PL_CMD_STOP)) { | 
 |  |  |           spielt.remove(elems[4]); | 
 |  |  |           response = kommandoSenden(fs, elems[4], PL_CMD_CALYPSO_STOP); | 
 |  |  |         } else if(elems[5].equalsIgnoreCase(PL_CMD_VOLDN)) { | 
 |  |  |           response = kommandoSenden(fs, elems[4], PL_CMD_CALYPSO_VOL_DEC); | 
 |  |  |         } else if(elems[5].equalsIgnoreCase(PL_CMD_VOLUP)) { | 
 |  |  |           response = kommandoSenden(fs, elems[4], PL_CMD_CALYPSO_VOL_INC); | 
 |  |  |         } else if(elems[5].equalsIgnoreCase(PL_CMD_PAUSE)) { | 
 |  |  |           response = kommandoSenden(fs, elems[4], PL_CMD_CALYPSO_PAUSE); | 
 |  |  |         //} else if(elems[5].equalsIgnoreCase(PL_CMD_PLAYON)) { | 
 |  |  |         //  response = kommandoSenden(fs, elems[4], PL_CMD_CALYPSO_PLAYON); | 
 |  |  |         } else if(elems[5].equalsIgnoreCase(PL_CMD_NEXT)) { | 
 |  |  |           response = kommandoSenden(fs, elems[4], PL_CMD_CALYPSO_STOP); | 
 |  |  |           //response = naechsterTitel(fs, elems[4]); | 
 |  |  |         } else { | 
 |  |  |           response = meldung("Ungueltiges Kommando: " + elems[5], AbstractHandler.RTC_NOT_FOUND); | 
 |  |  |         } | 
 |  |  |         break; | 
 |  |  |       case 7: | 
 |  |  |         if (elems[5].equalsIgnoreCase(PL_CMD_SEEK)) { | 
 |  |  |           // /calypso/seek?pos=[sekunden] | 
 |  |  |           response = kommandoSenden(fs, elems[4], "seek?pos=" + elems[6]); | 
 |  |  |         } else { | 
 |  |  |           response = meldung("Ungueltiges Kommando: " + elems[5], AbstractHandler.RTC_NOT_FOUND); | 
 |  |  |         } | 
 |  |  | 
 |  |  |     String path = e.getRequestURI().toString(); | 
 |  |  |     String[] elems = path.split(Server.SLASH); | 
 |  |  |     logger.info(elems[5]); | 
 |  |  |     if(elems[5].equalsIgnoreCase(PL_CMD_PLAYON)) { | 
 |  |  |       abspielerKmd = PL_CMD_CALYPSO_PLAYON; | 
 |  |  |     } else if(elems[5].equalsIgnoreCase(PL_CMD_PLAY)){ | 
 |  |  |     // PLAYON ist deprecated | 
 |  |  |     //if(elems[5].equalsIgnoreCase(PL_CMD_PLAYON)) { | 
 |  |  |     //  abspielerKmd = PL_CMD_CALYPSO_PLAYON; | 
 |  |  |     //} else if(elems[5].equalsIgnoreCase(PL_CMD_PLAY)){ | 
 |  |  |     //  abspielerKmd = PL_CMD_PLAY; | 
 |  |  |     //} | 
 |  |  |     if(elems[5].equalsIgnoreCase(PL_CMD_PLAY)){ | 
 |  |  |       abspielerKmd = PL_CMD_PLAY; | 
 |  |  |     } | 
 |  |  |     try { | 
 |  |  | 
 |  |  |  | 
 |  |  |     return kmd;     | 
 |  |  |   } | 
 |  |  |    | 
 |  |  |   private String getEinstellung(Storage s, String key, String standardWert) { | 
 |  |  |     Entity entity = s.read(Einstellung.class.getSimpleName(), key); | 
 |  |  |     if (entity instanceof Einstellung) { | 
 |  |  |       Einstellung einstellung = (Einstellung) entity; | 
 |  |  |       Object o = einstellung.getValue(); | 
 |  |  |       if(o instanceof String) { | 
 |  |  |         return o.toString(); | 
 |  |  |       } else { | 
 |  |  |         return standardWert; | 
 |  |  |       } | 
 |  |  |     } else { | 
 |  |  |       return standardWert; | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  |    | 
 |  |  |      | 
 |  |  |   private void abspielerKommandoSenden(String kommando) { | 
 |  |  |     /* | 
 |  |  |       TODO hier evtl. mit mehreren Versuchen ausgleichen,  |