| | |
| | | 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."; |
| | | return signal + " gesendet."; |
| | | } else { |
| | | return meldung("Ungueltiger Abspieler.", 404); |
| | | } |
| | |
| | | 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."; |
| | | return signal + " gesendet."; |
| | | } else { |
| | | return meldung("Ungueltiger Abspieler.", 404); |
| | | } |
| | |
| | | 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(getEinstellung(s, getResString(RB_PLAYERPARAMS), PL_DEFAULT_PARAMS)); |
| | | 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) { |
| | | /* |