Persoenliche Mediazentrale
ulrich
2021-04-21 a29f5ca76074f014d2a82390610797907528efc1
src/de/uhilger/mediaz/api/MediaSteuerung.java
@@ -17,6 +17,7 @@
 */
package de.uhilger.mediaz.api;
import com.google.gson.Gson;
import com.sun.net.httpserver.HttpExchange;
import de.uhilger.mediaz.App;
import de.uhilger.mediaz.Server;
@@ -25,6 +26,7 @@
import de.uhilger.mediaz.entity.Abspielliste;
import de.uhilger.mediaz.entity.Einstellung;
import de.uhilger.mediaz.entity.Entity;
import de.uhilger.mediaz.entity.Livestream;
import de.uhilger.mediaz.entity.Titel;
import de.uhilger.mediaz.store.FileStorage;
import de.uhilger.mediaz.store.Storage;
@@ -44,10 +46,12 @@
 * HTTP GET /mz/api/strg/abspieler/play/liste/[name] 
 * HTTP GET /mz/api/strg/abspieler/ende
 *
 * HTTP GET /mz/api/strg/abspieler/play/[url]
 * 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 GET /mz/api/strg/abspieler/pause HTTP GET /mz/api/strg/abspieler/stop HTTP GET
 * /mz/api/strg/abspieler/weiter
 * HTTP GET /mz/api/strg/abspieler/pause
 * HTTP GET /mz/api/strg/abspieler/stop
 * HTTP GET /mz/api/strg/abspieler/weiter
 * 
 * Faustregel: Anzahl Elemente eines URL plus 1 ist die Anzahl der Elemente des 
 * Ergebnisses von String.split.
@@ -65,6 +69,12 @@
  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_PAUSE = "pause";
  public static final String PL_CMD_PLAYON = "playon";
  public static final String PL_CMD_AVD_STOP = "avd/stop";
  public static final String PL_CMD_AVD_PAUSE = "avd/pause";
  public static final String PL_CMD_AVD_PLAYON = "avd/playon";
  public static final String DEFAULT_HOST = "http://localhost:9090";
  private final Map spielt = new HashMap();
@@ -75,6 +85,7 @@
    String path = e.getRequestURI().toString();
    String[] elems = path.split(Server.SLASH);
    FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
    logger.fine(path);
    
    // Faustregel: Anzahl Elemente eines URL plus 1 ist die Anzahl der Elemente des 
    // Ergebnisses von String.split.
@@ -82,6 +93,13 @@
      case 6:
        if (elems[5].equalsIgnoreCase(PL_CMD_ENDE)) {
          response = naechsterTitel(fs, elems[4]);
        } else if(elems[5].equalsIgnoreCase(PL_CMD_STOP)) {
          spielt.remove(elems[4]);
          response = kommandoSenden(fs, elems[4], PL_CMD_AVD_STOP);
        } else if(elems[5].equalsIgnoreCase(PL_CMD_PAUSE)) {
          response = kommandoSenden(fs, elems[4], PL_CMD_AVD_PAUSE);
        } else if(elems[5].equalsIgnoreCase(PL_CMD_PLAYON)) {
          response = kommandoSenden(fs, elems[4], PL_CMD_AVD_PLAYON);
        } else {
          response = meldung("Ungueltiges Kommando: " + elems[5], AbstractHandler.RTC_NOT_FOUND);
        }
@@ -94,6 +112,86 @@
        break;
    }
    return response;
  }
  @Override
  protected String post(HttpExchange e) {
    String response;
    try {
      return urlAbspielen(e);
    } catch (IOException ex) {
      logger.log(Level.SEVERE, null, ex);
      return meldung(ex.getLocalizedMessage(), 404);
    }
  }
  // titel.katalogUrl + titel.pfad + titel.name
  private String urlAbspielen(HttpExchange e) throws IOException {
    String path = e.getRequestURI().toString();
    String[] elems = path.split(Server.SLASH);
    FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
    if(elems[5].equalsIgnoreCase("titel")) {
      String titelJson = bodyLesen(e);
      Gson gson = new Gson();
      Object o = gson.fromJson(titelJson, fs.typeFromName(Titel.class.getSimpleName()).getType());
      if(o instanceof Titel) {
        Titel titel = (Titel) o;
        String titelUrl = titel.getKatalogUrl() + titel.getPfad() + titel.getName();
        Entity entity = fs.read(FileStorage.ST_ABSPIELER, elems[4]);
        if (entity instanceof Abspieler) {
          Abspieler abspieler = (Abspieler) entity;
          String server = getEinstellung(fs, App.getRs(App.RB_HOST), DEFAULT_HOST);
          String signal = abspielKommando(fs, abspieler, server, titelUrl).toString();
          abspielerKommandoSenden(signal);
          return signal + "gesendet.";
        } else {
          return meldung("Ungueltiger Abspieler.", 404);
        }
      } else {
        return meldung("Ungueltiger Titel.", 404);
      }
    } else if(elems[5].equalsIgnoreCase("stream")) {
      String streamJson = bodyLesen(e);
      Gson gson = new Gson();
      Object o = gson.fromJson(streamJson, fs.typeFromName(Livestream.class.getSimpleName()).getType());
      if(o instanceof Livestream) {
        Entity entity = fs.read(FileStorage.ST_LIVESTREAM, ((Livestream) o).getName());
        if(entity instanceof Livestream) {
          Livestream stream = (Livestream) entity;
          entity = fs.read(FileStorage.ST_ABSPIELER, elems[4]);
          if (entity instanceof Abspieler) {
            Abspieler abspieler = (Abspieler) entity;
            String server = "";
            String signal = abspielKommando(fs, abspieler, server, stream.getUrl()).toString();
            abspielerKommandoSenden(signal);
            return signal + "gesendet.";
          } else {
            return meldung("Ungueltiger Abspieler.", 404);
          }
        } else {
          return meldung("Ungueltiger Livestream.", 404);
        }
      } else {
       return meldung("Ungueltiger Livestream.", 404);
      }
    } else {
      return meldung("Ungueltiger URL.", 404);
    }
  }
  private String kommandoSenden(Storage s, String aName, String kommando) {
    Entity entity = s.read(FileStorage.ST_ABSPIELER, aName);
    if (entity instanceof Abspieler) {
      Abspieler abspieler = (Abspieler) entity;
      StringBuilder kmd = new StringBuilder();
      kmd.append(abspieler.getUrl());
      kmd.append(kommando);
      String signal = kmd.toString();
      abspielerKommandoSenden(signal);
      return signal + " gesendet.";
    } else {
      return meldung("Abspielliste nicht gefunden.", AbstractHandler.RTC_NOT_FOUND);
    }
  }
  
  private String ersterTitel(Storage s, String aName, String lName) {
@@ -121,6 +219,7 @@
          response = listentitelSpielen(s, abspielerName, liste, titelNr);
        } else {
          response = "Liste " + liste.getName() + " ist zuende gespielt.";
          logger.info(response);
        }
      } else {
        response = meldung("Abspielliste nicht gefunden.", AbstractHandler.RTC_NOT_FOUND);
@@ -175,6 +274,8 @@
    
    String server = getEinstellung(s, App.getRs(App.RB_HOST), DEFAULT_HOST);
    /*
    // Kommando an den Abspieler zusammenbauen
    StringBuilder kmd = new StringBuilder();
    kmd.append(abspieler.getUrl());
@@ -183,6 +284,8 @@
    kmd.append(getEinstellung(s, App.getRs(App.RB_PLAYERPARAMS), PL_DEFAULT_PARAMS));
    kmd.append(server);
    kmd.append(titelUrl);
    */
    StringBuilder kmd = abspielKommando(s, abspieler, server, titelUrl);
    kmd.append(PL_PARAM_RUECK);
    kmd.append(server);
    kmd.append(PL_API_STRG);
@@ -191,6 +294,20 @@
    return kmd.toString();
  }
  private StringBuilder abspielKommando(Storage s, Abspieler abspieler, String server, String titelUrl) {
    // Kommando an den Abspieler zusammenbauen
    StringBuilder kmd = new StringBuilder();
    kmd.append(abspieler.getUrl());
    kmd.append(PL_CMD_PLAY);
    // Parameter fuer den Abspieler holen
    kmd.append(getEinstellung(s, App.getRs(App.RB_PLAYERPARAMS), PL_DEFAULT_PARAMS));
    kmd.append(server);
    kmd.append(titelUrl);
    return kmd;
  }
  
  private String getEinstellung(Storage s, String key, String standardWert) {
    Entity entity = s.read(Einstellung.class.getSimpleName(), key);