|  |  | 
 |  |  | import com.sun.net.httpserver.HttpExchange; | 
 |  |  | import de.uhilger.tango.PlaylistListener; | 
 |  |  | import de.uhilger.tango.Server; | 
 |  |  | import static de.uhilger.tango.api.ListFileHandler.RB_VIDEOEXTS; | 
 |  |  | import de.uhilger.tango.entity.Ablageort; | 
 |  |  | 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; | 
 |  |  | import de.uhilger.tango.store.FileStorage; | 
 |  |  | import de.uhilger.tango.store.Storage; | 
 |  |  | import java.io.File; | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.net.HttpURLConnection; | 
 |  |  | import java.net.URL; | 
 |  |  | import java.util.Collection; | 
 |  |  | import java.util.HashMap; | 
 |  |  | import java.util.Iterator; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Map; | 
 |  |  | import java.util.Set; | 
 |  |  | import java.util.logging.Level; | 
 |  |  | 
 |  |  |    | 
 |  |  |   private final Map spielt = new HashMap(); | 
 |  |  |    | 
 |  |  |   private String conf; | 
 |  |  |   private final String conf; | 
 |  |  |    | 
 |  |  |   public MediaSteuerung(String conf) { | 
 |  |  |     this.conf = conf; | 
 |  |  | 
 |  |  |     String abspielerKmd = PL_CMD_PLAY; | 
 |  |  |     String path = e.getRequestURI().toString(); | 
 |  |  |     String[] elems = path.split(Server.SLASH); | 
 |  |  |     logger.info(elems[5]); | 
 |  |  |     logger.info("POST elem 0: " + elems[0]); | 
 |  |  |     logger.info("POST elem 1: " + elems[1]); | 
 |  |  |     logger.info("POST elem 2: " + elems[2]); | 
 |  |  |     logger.info("POST elem 3: " + elems[3]); | 
 |  |  |     logger.info("POST elem 4: " + elems[4]); | 
 |  |  |     logger.info("POST cmd: " + elems[5]); | 
 |  |  |     // PLAYON ist deprecated | 
 |  |  |     //if(elems[5].equalsIgnoreCase(PL_CMD_PLAYON)) { | 
 |  |  |     //  abspielerKmd = PL_CMD_CALYPSO_PLAYON; | 
 |  |  | 
 |  |  |     FileStorage fs = new FileStorage(conf); | 
 |  |  |     if(elems[6].equalsIgnoreCase("titel")) { | 
 |  |  |       String titelJson = bodyLesen(e); | 
 |  |  |       logger.finest("Titel aus Body: " + titelJson); | 
 |  |  |       Gson gson = new Gson(); | 
 |  |  |       Object o = gson.fromJson(titelJson, fs.typeFromName(Titel.class.getSimpleName()).getType()); | 
 |  |  |       if(o instanceof Titel) { | 
 |  |  |         Titel titel = (Titel) o; | 
 |  |  |         logger.finest("Katalog-URL: " + titel.getKatalogUrl()); | 
 |  |  |         logger.finest("Titel-Pfad: " + titel.getPfad()); | 
 |  |  |         String titelUrl = titel.getKatalogUrl() + titel.getPfad() + titel.getName(); | 
 |  |  |         logger.finest("Titel-URL: " + titelUrl); | 
 |  |  |          | 
 |  |  |         Entity entity = fs.read(FileStorage.ST_ABSPIELER, elems[4]); | 
 |  |  |         if (entity instanceof Abspieler) { | 
 |  |  |           Abspieler abspieler = (Abspieler) entity; | 
 |  |  |           String server = getEinstellung(fs, getResString(RB_HOST), DEFAULT_HOST); | 
 |  |  |           String signal = abspielKommando(fs, abspieler, server, titelUrl, abspielerKmd).toString(); | 
 |  |  |           String signal = abspielKommando(fs, abspieler, server, e.getHttpContext().getPath(), titel.getKatalogUrl(), titelUrl, abspielerKmd).toString(); | 
 |  |  |           abspielerKommandoSenden(signal); | 
 |  |  |           return signal + "gesendet."; | 
 |  |  |         } else { | 
 |  |  | 
 |  |  |           if (entity instanceof Abspieler) { | 
 |  |  |             Abspieler abspieler = (Abspieler) entity; | 
 |  |  |             String server = ""; | 
 |  |  |             String signal = abspielKommando(fs, abspieler, server, stream.getUrl(), PL_CMD_PLAY).toString(); | 
 |  |  |             String signal = abspielKommando(fs, abspieler, server, "", "", stream.getUrl(), PL_CMD_PLAY).toString(); | 
 |  |  |             abspielerKommandoSenden(signal); | 
 |  |  |             return signal + "gesendet."; | 
 |  |  |           } else { | 
 |  |  | 
 |  |  |     kmd.append(server); | 
 |  |  |     kmd.append(titelUrl); | 
 |  |  |     */ | 
 |  |  |     StringBuilder kmd = abspielKommando(s, abspieler, server, titelUrl, PL_CMD_PLAY); | 
 |  |  |     StringBuilder kmd = abspielKommando(s, abspieler, server, "", "", titelUrl, PL_CMD_PLAY); | 
 |  |  |     kmd.append(PL_PARAM_RUECK); | 
 |  |  |     kmd.append(server); | 
 |  |  |     if(!server.endsWith(Server.SLASH)) { | 
 |  |  | 
 |  |  |     return kmd.toString(); | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   private StringBuilder abspielKommando(Storage s, Abspieler abspieler, String server, String titelUrl, String abspielKmd) { | 
 |  |  |      | 
 |  |  |   private StringBuilder abspielKommando(Storage s, Abspieler abspieler, String server, String ctx, String katalogUrl, String titelUrl, String abspielKmd) { | 
 |  |  |     logger.finest("Server: " + server); | 
 |  |  |     // Kommando an den Abspieler zusammenbauen | 
 |  |  |     StringBuilder kmd = new StringBuilder(); | 
 |  |  |     kmd.append(abspieler.getUrl()); | 
 |  |  | 
 |  |  |     kmd.append(server); | 
 |  |  |     kmd.append(titelUrl); | 
 |  |  |  | 
 |  |  |     /* | 
 |  |  |       Wenn eine Untertiteldatei gleichen Names vorliegt, wird  | 
 |  |  |       diese beim Abspielen aktiviert. Soll also kein Untertitel  | 
 |  |  |       erscheinen, darf keine Untertiteldatei beigelegt werden,  | 
 |  |  |       deren Name so lautet wie der abzuspielende Titel. | 
 |  |  |      | 
 |  |  |       Beispiel: Titel mein-video.mp4 und eine Datei mein-video.srt aktiviert  | 
 |  |  |                 die Unteritel-Datei. Lautet der Name der Untertiteldatei  | 
 |  |  |                 stattdessen mein-video.de-de.forced.srt werden Untertitel  | 
 |  |  |                 nicht aktiviert | 
 |  |  |       | 
 |  |  |     */ | 
 |  |  |     if(isVideo(s, titelUrl)) { | 
 |  |  |       if(hasSub((FileStorage) s, ctx, katalogUrl, titelUrl)) { | 
 |  |  |         logger.info(titelUrl + " has subFile"); | 
 |  |  |         kmd.append("&sub=on"); | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |  | 
 |  |  |     return kmd;     | 
 |  |  |   } | 
 |  |  |      | 
 |  |  |   private boolean hasSub(FileStorage s, String ctx, String katalogUrl, String titelUrl) { | 
 |  |  |     //String titel = titelUrl.substring(0, titelUrl.lastIndexOf(".")); | 
 |  |  |     String titel = titelUrl.substring(katalogUrl.length()); | 
 |  |  |     logger.finest(titel); | 
 |  |  |     String pfad = ablageortFromKatalog(s, ctx, katalogUrl); | 
 |  |  |     File titelFile = new File(pfad, titel); | 
 |  |  |     File parentFile = titelFile.getParentFile(); | 
 |  |  |     File subFile = new File(parentFile, titelFile.getName().substring(0, titelFile.getName().lastIndexOf(".")) + ".srt"); | 
 |  |  |     logger.finest("subFile abs path: " + subFile.getAbsolutePath()); | 
 |  |  |     boolean doesExist = subFile.exists(); | 
 |  |  |     logger.finest("subFile exist? " + doesExist); | 
 |  |  |     return doesExist; | 
 |  |  |   } | 
 |  |  |    | 
 |  |  |   private boolean isVideo(Storage s, String titelUrl) { | 
 |  |  |     String werte = getEinstellung(s, getResString(RB_VIDEOEXTS), "mp4"); | 
 |  |  |     String[] exts = werte.split(","); | 
 |  |  |     for(String ext : exts) { | 
 |  |  |       //extMap.put(ext, typ); | 
 |  |  |       if(titelUrl.toLowerCase().endsWith(ext.toLowerCase())) { | 
 |  |  |         return true; | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |     return false; | 
 |  |  |   } | 
 |  |  |    | 
 |  |  |   private String ablageortFromKatalog(Storage s, String ctx, String katalogUrl) { | 
 |  |  |     String ort = ""; | 
 |  |  |     logger.finest("start"); | 
 |  |  |     String typ = Ablageort.class.getSimpleName(); | 
 |  |  |     logger.finest("typ: " + typ); | 
 |  |  |     //FileStorage store = new FileStorage(conf); | 
 |  |  |     FileStorage store = (FileStorage) s; | 
 |  |  |     List<String> orte = store.list(typ); | 
 |  |  |     Iterator<String> i = orte.iterator(); | 
 |  |  |     while(i.hasNext()) { | 
 |  |  |       String ortName = i.next(); | 
 |  |  |       logger.finest("ortname: " + ortName); | 
 |  |  |       Entity e = store.read(typ, ortName); | 
 |  |  |       if(e instanceof Ablageort) { | 
 |  |  |         Ablageort ablageort = (Ablageort) e; | 
 |  |  |         logger.log(Level.FINE, "Ablageort {0}{1}", new Object[]{ctx, ablageort.getUrl()}); | 
 |  |  |         logger.fine(ablageort.getOrt()); | 
 |  |  |         if(ablageort.getUrl().endsWith(katalogUrl)) { | 
 |  |  |           logger.finest("MATCH for " + katalogUrl + " Pfad " + ablageort.getOrt()); | 
 |  |  |           ort = ablageort.getOrt(); | 
 |  |  |         } | 
 |  |  |         //server.createContext(ctx + ablageort.getUrl(),   | 
 |  |  |           //new ListFileHandler(new File(ablageort.getOrt()).getAbsolutePath(), conf)); | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |     return ort; | 
 |  |  |   } | 
 |  |  |      | 
 |  |  |   private void abspielerKommandoSenden(String kommando) { | 
 |  |  |     /* | 
 |  |  |       TODO hier evtl. mit mehreren Versuchen ausgleichen,  |