From 50e53e791b318e29a9deb9228a6d1b615b8a9053 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Sat, 10 Apr 2021 17:46:18 +0000
Subject: [PATCH] UI-Anpassungen
---
src/de/uhilger/mediaz/api/MediaSteuerung.java | 251 ++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 202 insertions(+), 49 deletions(-)
diff --git a/src/de/uhilger/mediaz/api/MediaSteuerung.java b/src/de/uhilger/mediaz/api/MediaSteuerung.java
index f697353..edd5fb3 100644
--- a/src/de/uhilger/mediaz/api/MediaSteuerung.java
+++ b/src/de/uhilger/mediaz/api/MediaSteuerung.java
@@ -20,92 +20,245 @@
import com.sun.net.httpserver.HttpExchange;
import de.uhilger.mediaz.App;
import de.uhilger.mediaz.Server;
+import de.uhilger.mediaz.entity.Abspielvorgang;
import de.uhilger.mediaz.entity.Abspieler;
import de.uhilger.mediaz.entity.Abspielliste;
+import de.uhilger.mediaz.entity.Einstellung;
import de.uhilger.mediaz.entity.Entity;
import de.uhilger.mediaz.entity.Titel;
import de.uhilger.mediaz.store.FileStorage;
+import de.uhilger.mediaz.store.Storage;
import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
+import java.util.logging.Level;
import java.util.logging.Logger;
/**
- * Die MediaSteuerung verarbeitet HTTP-Signale zur Steuerung von Media-Operationen
- * wie z.B. dem Spielen einer Abspielliste oder dem Starten oder Stoppen eines Videos
- * auf einem entfernten Abspielgeraet.
- *
- * HTTP GET /mz/api/strg/abspieler/play/liste/[name]
- * HTTP GET /mz/api/strg/abspieler/play/[titel-url]
- * HTTP GET /mz/api/strg/abspieler/pause
- * HTTP GET /mz/api/strg/abspieler/stop
+ * Die MediaSteuerung verarbeitet HTTP-Signale zur Steuerung von Media-Operationen wie z.B. dem
+ * Spielen einer Abspielliste oder dem Starten oder Stoppen eines Videos auf einem entfernten
+ * Abspielgeraet.
+ *
+ * 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 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.
+ *
+ *
* @author Ulrich Hilger
* @version 1, 9.4.2021
*/
public class MediaSteuerung extends AbstractHandler {
private static final Logger logger = Logger.getLogger(MediaSteuerung.class.getName());
-
- private Map spielt = new HashMap();
+
+ public static final String PL_CMD_PLAY = "avd/play";
+ 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_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();
@Override
protected String get(HttpExchange e) {
- String response = "in Arbeit..";
+ String response;
String path = e.getRequestURI().toString();
- String[] elems = path.split(App.getRs(Server.RB_SLASH));
- // 4 Player name, 7 listenname
- switch(elems.length) {
+ 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.
+ switch (elems.length) {
+ case 6:
+ if (elems[5].equalsIgnoreCase(PL_CMD_ENDE)) {
+ response = naechsterTitel(fs, elems[4]);
+ } else if(elems[5].equalsIgnoreCase(PL_CMD_STOP)) {
+ 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);
+ }
+ break;
case 8:
- response = play(e, elems[4], elems[7]);
+ response = ersterTitel(fs, elems[4], elems[7]);
+ break;
+ default:
+ response = "Ungueltiger URL";
break;
}
return response;
}
-
- @Override
- protected String put(HttpExchange e) throws IOException {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- protected String post(HttpExchange e) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- protected boolean delete(HttpExchange e) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+
+ 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);
+ return kommando + " gesendet.";
+ } else {
+ return meldung("Abspielliste nicht gefunden.", AbstractHandler.RTC_NOT_FOUND);
+ }
}
- private String play(HttpExchange e, String aName, String lName) {
- FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
- Entity entity = fs.read(FileStorage.ST_ABSPIELER, aName);
- if(entity instanceof Abspieler) {
- Abspieler abspieler = (Abspieler) entity;
- String aUrl = abspieler.getUrl();
- entity = fs.read(FileStorage.ST_ABSPIELLISTE, lName);
- if(entity instanceof Abspielliste) {
- Abspielliste liste = (Abspielliste) entity;
- Titel titel = liste.getTitel().get(0);
- spielt.put(aName, (int) 0);
- String titelUrl = titel.getKatalogUrl() + titel.getPfad() + titel.getName();
- logger.info("abspielen von " + titelUrl + " auf " + aUrl);
- }
+ private String ersterTitel(Storage s, String aName, String lName) {
+ String response;
+ Entity entity = s.read(FileStorage.ST_ABSPIELLISTE, lName);
+ if (entity instanceof Abspielliste) {
+ Abspielliste liste = (Abspielliste) entity;
+ response = listentitelSpielen(s, aName, liste, 0);
+ } else {
+ response = meldung("Abspielliste nicht gefunden.", AbstractHandler.RTC_NOT_FOUND);
}
- String response = "Abspielen der Liste " + lName + " auf Abspieler " + aName + " gestartet.";
return response;
}
+
+ private String naechsterTitel(Storage s, String abspielerName) {
+ String response;
+ Object o = spielt.get(abspielerName);
+ if (o instanceof Abspielvorgang) {
+ Abspielvorgang av = (Abspielvorgang) o;
+ Entity entity = s.read(FileStorage.ST_ABSPIELLISTE, av.getListe());
+ if (entity instanceof Abspielliste) {
+ Abspielliste liste = (Abspielliste) entity;
+ int titelNr = av.getTitelNr();
+ if (liste.getTitel().size() > ++titelNr) {
+ 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);
+ }
+ //response = listenTitelSpielen(e, elems[4]);
+ } else {
+ response = meldung("Abspielvorgang fuer Abspieler " + abspielerName, AbstractHandler.RTC_NOT_FOUND);
+ }
+ return response;
+ }
+
+ private String listentitelSpielen(Storage s, String aName, Abspielliste liste, int titelNr) {
+ String response;
+ Entity entity = s.read(FileStorage.ST_ABSPIELER, aName);
+ if (entity instanceof Abspieler) {
+ Abspieler abspieler = (Abspieler) entity;
+ String kommando = kommandoFuerTitel(s, liste, abspieler, titelNr);
+ //String kommando = kmd.toString();
+ logger.info(kommando);
+ abspielerKommandoSenden(kommando);
+ response = "Abspielen der Liste " + liste.getName() + " auf Abspieler " + aName + " gestartet.";
+ } else {
+ response = meldung("Abspieler nicht gefunden.", AbstractHandler.RTC_NOT_FOUND);
+ }
+ return response;
+ }
+
+ /**
+ * Das Kommando zum Abspielen fuer den Titel einer Abspielliste und einen bestimmten Abspieler
+ * ermitteln.
+ *
+ * @param s die Ablage, in der Abspieler und Abspiellisten zu finden sind
+ * @param liste Name der Liste, die den gewuenschten Titel enthaelt
+ * @param abspieler Name des Abspielers, der zum Abspielen dienen soll
+ * @param titelNr Nummer des Titels in der Liste
+ * @return das Kommando zum Abspielen (ein URL)
+ */
+ private String kommandoFuerTitel(Storage s, Abspielliste liste, Abspieler abspieler, int titelNr) {
+ // ersten Titel aus Liste holen
+ Titel titel = liste.getTitel().get(titelNr);
+
+ // URL des Titels ermitteln
+ String titelUrl = titel.getKatalogUrl() + titel.getPfad() + titel.getName();
+ logger.log(Level.INFO, "abspielen von {0} auf {1}", new Object[]{titelUrl, abspieler.getUrl()});
+
+ // Titel als 'spielt' vermerken
+ Abspielvorgang vorgang = new Abspielvorgang();
+ vorgang.setAbspieler(abspieler.getName());
+ vorgang.setListe(liste.getName());
+ vorgang.setTitelNr(titelNr);
+ spielt.put(abspieler.getName(), vorgang);
+
+ String server = getEinstellung(s, App.getRs(App.RB_HOST), DEFAULT_HOST);
+
+ // 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);
+ kmd.append(PL_PARAM_RUECK);
+ kmd.append(server);
+ kmd.append(PL_API_STRG);
+ kmd.append(abspieler.getName());
+ kmd.append("/ende");
+
+ return kmd.toString();
+ }
- private String kommando() {
- return "avd/play?th=60&ti=60&o=local&titel=";
+ 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,
+ dass ein einzelner Versuch nicht 'durchkommt'...
+ */
+ logger.info(kommando);
+ try {
+ HttpURLConnection conn = (HttpURLConnection) new URL(kommando).openConnection();
+ conn.setRequestMethod("GET");
+ conn.connect();
+ int status = conn.getResponseCode();
+ String msg = conn.getResponseMessage();
+ logger.log(Level.INFO, "Kommando {0} mit Status {1} {2} gesendet.", new Object[]{kommando, status, msg});
+ } catch(IOException ex) {
+ logger.log(Level.INFO, ex.getMessage(), ex);
+ }
+ }
+
+ private String meldung(String text, int code) {
+ setReturnCode(code);
+ return text;
}
// rpi4-az:9090/avd/play?titel=/Filme/S/sound_city.m4v&th=60&ti=60&o=local
// aUrl http://rpi4-wz:9090/
// titelUrl /media/test/A/The-Alan-Parsons-Project/I-Robot/02-I-Wouldnt-Want-to-Be-Like-You.mp3
-
}
--
Gitblit v1.9.3