Persoenliche Mediazentrale
ulrich
2025-03-24 89e41699fee6789130e20837831509bcacc9b1ff
src/de/uhilger/tango/api/MediaSteuerung.java
@@ -21,20 +21,25 @@
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;
@@ -102,7 +107,7 @@
  
  private final Map spielt = new HashMap();
  
  private String conf;
  private final String conf;
  
  public MediaSteuerung(String conf) {
    this.conf = conf;
@@ -164,7 +169,12 @@
    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;
@@ -189,18 +199,23 @@
    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);
        }
@@ -219,9 +234,9 @@
          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);
          }
@@ -346,7 +361,7 @@
    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)) {
@@ -359,8 +374,8 @@
    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());
@@ -370,9 +385,83 @@
    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) {
    /*