From 0e9cd39f81a9635dffd31e1d72229e6ca75d5f84 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Sat, 10 Apr 2021 12:09:53 +0000
Subject: [PATCH] Abspielliste spielen erster Entwurf fertig

---
 src/de/uhilger/mediaz/entity/Abspielvorgang.java |   58 ++++++++
 src/de/uhilger/mediaz/api/ListHandler.java       |    4 
 src/de/uhilger/mediaz/App.java                   |   10 +
 src/de/uhilger/mediaz/Mediazentrale.java         |   27 +++
 src/de/uhilger/mediaz/api/FileHandler.java       |    6 
 src/de/uhilger/mediaz/api/StorageHandler.java    |   11 
 src/de/uhilger/mediaz/store/FileStorage.java     |    2 
 src/de/uhilger/mediaz/Initialiser.java           |   32 ++++
 src/mediaz_de_DE.properties                      |    6 
 src/de/uhilger/mediaz/Server.java                |    7 
 src/de/uhilger/mediaz/api/MediaSteuerung.java    |  188 +++++++++++++++++++-------
 src/de/uhilger/mediaz/api/ListFileHandler.java   |    8 
 src/de/uhilger/mediaz/api/AbstractHandler.java   |   40 +++++
 13 files changed, 320 insertions(+), 79 deletions(-)

diff --git a/src/de/uhilger/mediaz/App.java b/src/de/uhilger/mediaz/App.java
index 6c9b472..6c311a8 100644
--- a/src/de/uhilger/mediaz/App.java
+++ b/src/de/uhilger/mediaz/App.java
@@ -25,8 +25,10 @@
 import java.util.logging.Logger;
 
 /**
- *
- * @author ulrich
+ * Die Hauptklasse der Mediazentrale mit der Methode <code>main</code>.
+ * 
+ * @author Ulrich Hilger
+ * @version 1, 25.3.2021
  */
 public class App {
 
@@ -48,11 +50,15 @@
   public static final String RB_AP_CTX = "appParamCtx"; 
   public static final String RB_AP_UI = "appParamUi"; 
   public static final String RB_EP_LISTE = "epliste"; 
+  public static final String RB_AUDIOEXTS = "audioexts";
+  public static final String RB_VIDEOEXTS = "videoexts";
+  public static final String RB_PLAYERPARAMS = "playerparams";
 
   /**
    * <p>Start-Methode dieser Anwendung</p>
    *
    * @param args Kommandozeilenparameter
+   * @throws java.lang.ClassNotFoundException
    */
   public static void main(String[] args) throws ClassNotFoundException {
     rb = ResourceBundle.getBundle(RB_NAME);
diff --git a/src/de/uhilger/mediaz/Initialiser.java b/src/de/uhilger/mediaz/Initialiser.java
new file mode 100644
index 0000000..37bf3b4
--- /dev/null
+++ b/src/de/uhilger/mediaz/Initialiser.java
@@ -0,0 +1,32 @@
+/*
+  Mediazentrale - Personal Media Center
+  Copyright (C) 2021  Ulrich Hilger
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU Affero General Public License as
+  published by the Free Software Foundation, either version 3 of the
+  License, or (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Affero General Public License for more details.
+
+  You should have received a copy of the GNU Affero General Public License
+  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package de.uhilger.mediaz;
+
+/**
+ * Der Initialiser sorgt fur die Herstellung der Rahmenbedingungen fuer 
+ * die Ausfuehrung der App.
+ * 
+ * @todo Alle Initialisierungsschritte aus der Kalss App hierher uebertragen
+ * 
+ * @author Ulrich Hilger
+ * @version 1, 10.4.2021
+ */
+public class Initialiser {
+  
+  
+}
diff --git a/src/de/uhilger/mediaz/Mediazentrale.java b/src/de/uhilger/mediaz/Mediazentrale.java
new file mode 100644
index 0000000..feb84ab
--- /dev/null
+++ b/src/de/uhilger/mediaz/Mediazentrale.java
@@ -0,0 +1,27 @@
+/*
+  Mediazentrale - Personal Media Center
+  Copyright (C) 2021  Ulrich Hilger
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU Affero General Public License as
+  published by the Free Software Foundation, either version 3 of the
+  License, or (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Affero General Public License for more details.
+
+  You should have received a copy of the GNU Affero General Public License
+  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package de.uhilger.mediaz;
+
+/**
+ *
+ * @author Ulrich Hilger
+ * @version 1, 10.4.2021
+ */
+public class Mediazentrale {
+  
+}
diff --git a/src/de/uhilger/mediaz/Server.java b/src/de/uhilger/mediaz/Server.java
index f662f2f..2f71fc9 100644
--- a/src/de/uhilger/mediaz/Server.java
+++ b/src/de/uhilger/mediaz/Server.java
@@ -56,7 +56,7 @@
   public static final String RB_STOP_SERVER = "stopServer";
   //public static final String RB_ABLAGE_TEST = "testAblage";
   //public static final String RB_STORE_TEST = "testStore";
-  public static final String RB_SLASH = "slash";
+  public static final String SLASH = "/";
 
   private int port;
 
@@ -87,9 +87,8 @@
    * @param ctxName Name des Kontexts, unter dem der Server aufrufbar sein soll
    */
   public void setContextName(String ctxName) {
-    String slash = App.getRs(RB_SLASH);
-    if (!ctxName.startsWith(slash)) {
-      this.ctx = slash + ctxName;
+    if (!ctxName.startsWith(SLASH)) {
+      this.ctx = SLASH + ctxName;
     } else {
       this.ctx = ctxName;
     }
diff --git a/src/de/uhilger/mediaz/api/AbstractHandler.java b/src/de/uhilger/mediaz/api/AbstractHandler.java
index 038b647..9389ac4 100644
--- a/src/de/uhilger/mediaz/api/AbstractHandler.java
+++ b/src/de/uhilger/mediaz/api/AbstractHandler.java
@@ -48,11 +48,19 @@
   /** Name der HTTP Methode DELETE */
   public static final String HTTP_DELETE = "DELETE";
   
+  public static final int RTC_OK = 200;
+  public static final int RTC_NOT_FOUND = 404;
+  
+  protected int returnCode;
+
+  public AbstractHandler() {
+    this.returnCode = RTC_OK;
+  }
+  
   @Override
   public void handle(HttpExchange e) throws IOException {
     String method = e.getRequestMethod();
     String response = "";
-    int code = 200;
     switch(method) {
       case HTTP_GET:
         String json = get(e);
@@ -60,7 +68,7 @@
           response = json;
         } else {
           response = "nicht gefunden";
-          code = 404;
+          returnCode = RTC_NOT_FOUND;
         }
         break;
         
@@ -70,7 +78,6 @@
         
       case HTTP_POST:
         response = post(e);
-        code = 404;
         break;
         
       case HTTP_DELETE:
@@ -82,10 +89,18 @@
         }
         break;
     }
-    e.sendResponseHeaders(code, response.length());
+    e.sendResponseHeaders(getReturnCode(), response.length());
     OutputStream os = e.getResponseBody();
     os.write(response.getBytes());
     os.close();        
+  }
+  
+  protected void setReturnCode(int code) {
+    this.returnCode = code;
+  }
+  
+  protected int getReturnCode() {
+    return returnCode;
   }
   
   protected String bodyLesen(HttpExchange e) throws IOException {
@@ -102,10 +117,27 @@
     return json;
   }
 
+  protected String put(HttpExchange e) throws IOException {
+    setReturnCode(RTC_NOT_FOUND);
+    return "nicht unterstuetzt";
+  }
+
+  protected String post(HttpExchange e) {
+    setReturnCode(RTC_NOT_FOUND);
+    return "nicht unterstuetzt";
+  }
+
+  protected boolean delete(HttpExchange e) {
+    setReturnCode(RTC_NOT_FOUND);
+    return false;
+  }
+  
   
   protected abstract String get(HttpExchange e);
+  /*
   protected abstract String put(HttpExchange e) throws IOException;
   protected abstract String post(HttpExchange e);
   protected abstract boolean delete(HttpExchange e);
+  */
   
 }
diff --git a/src/de/uhilger/mediaz/api/FileHandler.java b/src/de/uhilger/mediaz/api/FileHandler.java
index d83a705..5b8f846 100644
--- a/src/de/uhilger/mediaz/api/FileHandler.java
+++ b/src/de/uhilger/mediaz/api/FileHandler.java
@@ -21,7 +21,7 @@
 import com.sun.net.httpserver.HttpExchange;
 import com.sun.net.httpserver.HttpHandler;
 import de.uhilger.mediaz.App;
-import static de.uhilger.mediaz.Server.RB_SLASH;
+import de.uhilger.mediaz.Server;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -114,7 +114,7 @@
       if (headers.containsKey(RANGE_HEADER)) {
         serveFileParts(e, new File(fileBase, fName));
       } else {
-        if (fName.length() < 1 || fName.endsWith(App.getRs(RB_SLASH))) {
+        if (fName.length() < 1 || fName.endsWith(Server.SLASH)) {
           fName += App.getRs(RB_WELCOME_FILE);
         }
         serveFile(e, new File(fileBase, fName));
@@ -316,7 +316,7 @@
     sb.append(range.getStart());
     sb.append(App.getRs(RB_DASH));
     sb.append(range.getEnd());
-    sb.append(App.getRs(RB_SLASH));
+    sb.append(Server.SLASH);
     sb.append(file.length());
     return sb.toString();
   }
diff --git a/src/de/uhilger/mediaz/api/ListFileHandler.java b/src/de/uhilger/mediaz/api/ListFileHandler.java
index 3b01afe..4c31548 100644
--- a/src/de/uhilger/mediaz/api/ListFileHandler.java
+++ b/src/de/uhilger/mediaz/api/ListFileHandler.java
@@ -49,14 +49,14 @@
   public ListFileHandler(String absoluteDirectoryPathAndName) {
     super(absoluteDirectoryPathAndName);
     /*
-      Nachfolgend hart codiert die Ermittlung von Dateifiltern. 
+      Ermittlung von Dateifiltern. 
       Sie werden erwartet in den Einstellungen 'audioexts' und 'videoexts'
       jeweils als Dateierweiterungen mit Komma getrennt
       z.B. "mp4,m4v"
     */
     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
-    initMap(fs, "audioexts", StorageFile.TYP_AUDIO);
-    initMap(fs, "videoexts", StorageFile.TYP_VIDEO);
+    initMap(fs, App.getRs(App.RB_AUDIOEXTS), StorageFile.TYP_AUDIO);
+    initMap(fs, App.getRs(App.RB_VIDEOEXTS), StorageFile.TYP_VIDEO);
   }
 
   private void initMap(Storage s, String key, String typ) {
@@ -73,7 +73,7 @@
   public void handle(HttpExchange e) throws IOException {
     String path = e.getRequestURI().toString();
     logger.fine(path);
-    if(path.endsWith(App.getRs(Server.RB_SLASH))) {
+    if(path.endsWith(Server.SLASH)) {
       String fName = getFileName(e);
       logger.fine(fName);
       File dir = new File(fileBase, fName);
diff --git a/src/de/uhilger/mediaz/api/ListHandler.java b/src/de/uhilger/mediaz/api/ListHandler.java
index b947f5e..fe5c06e 100644
--- a/src/de/uhilger/mediaz/api/ListHandler.java
+++ b/src/de/uhilger/mediaz/api/ListHandler.java
@@ -47,7 +47,7 @@
   @Override
   protected String get(HttpExchange e) {
     String path = e.getRequestURI().toString();
-    String[] elems = path.split(App.getRs(Server.RB_SLASH));
+    String[] elems = path.split(Server.SLASH);
     String plname = elems[elems.length - 1];
     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
     String json = fs.readJson(FileStorage.ST_ABSPIELLISTE, plname);
@@ -57,7 +57,7 @@
   @Override
   protected String put(HttpExchange e) throws IOException {
     String path = e.getRequestURI().toString();
-    String[] elems = path.split(App.getRs(Server.RB_SLASH));
+    String[] elems = path.split(Server.SLASH);
     String response = "ListHandler.put: ungueltiger URL";
     switch(elems.length) {
       case 5: // ohne nr am Ende
diff --git a/src/de/uhilger/mediaz/api/MediaSteuerung.java b/src/de/uhilger/mediaz/api/MediaSteuerung.java
index f697353..6a7dffb 100644
--- a/src/de/uhilger/mediaz/api/MediaSteuerung.java
+++ b/src/de/uhilger/mediaz/api/MediaSteuerung.java
@@ -20,92 +20,176 @@
 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 java.io.IOException;
+import de.uhilger.mediaz.store.Storage;
 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.
+ * 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
  * 
- * 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
- * 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_CMD_ENDE = "ende";
+
+  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)));
+    
+    // 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 {
+          response = meldung("Ungueltiges Kommando: " + elems[5], AbstractHandler.RTC_NOT_FOUND);
+        }
+        break;
       case 8:
-        response = play(e, elems[4], elems[7]);
+        response = listenTitelSpielen(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 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) {
+  private String meldung(String text, int code) {
+    setReturnCode(code);
+    return text;
+  }
+
+  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;
-        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);
+        int titelNr = av.getTitelNr();
+        if (liste.getTitel().size() > ++titelNr) {
+          response = listenTitelSpielen(s, abspielerName, liste, titelNr);
+        } else {
+          response = "Liste " + liste.getName() + " ist zuende gespielt.";
+        }
+      } 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);
     }
-    String response = "Abspielen der Liste " + lName + " auf Abspieler " + aName + " gestartet.";
     return response;
   }
-  
-  private String kommando() {
-    return "avd/play?th=60&ti=60&o=local&titel=";
+
+  private String listenTitelSpielen(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);
+    }
+    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);
+      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);
+
+    // Kommando an den Abspieler zusammenbauen
+    StringBuilder kmd = new StringBuilder();
+    kmd.append(abspieler.getUrl());
+    kmd.append(PL_CMD_PLAY);
+    // Parameter fuer den Abspieler holen
+    Entity entity = s.read(Einstellung.class.getSimpleName(), App.getRs(App.RB_PLAYERPARAMS));
+    if (entity instanceof Einstellung) {
+      Einstellung einstellung = (Einstellung) entity;
+      kmd.append(einstellung.getValue());
+    } else {
+      kmd.append(PL_DEFAULT_PARAMS);
+    }
+    kmd.append(titelUrl);
+    // hier noch Rueckmeldung anfuegen
+
+    return kmd.toString();
+  }
+
   // 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
-  
 }
diff --git a/src/de/uhilger/mediaz/api/StorageHandler.java b/src/de/uhilger/mediaz/api/StorageHandler.java
index e6521bc..d12e6c1 100644
--- a/src/de/uhilger/mediaz/api/StorageHandler.java
+++ b/src/de/uhilger/mediaz/api/StorageHandler.java
@@ -22,7 +22,6 @@
 import de.uhilger.mediaz.App;
 import static de.uhilger.mediaz.App.RB_EP_LISTE;
 import de.uhilger.mediaz.Server;
-import static de.uhilger.mediaz.Server.RB_SLASH;
 import de.uhilger.mediaz.store.FileStorage;
 import de.uhilger.mediaz.entity.Entity;
 import java.io.IOException;
@@ -43,7 +42,7 @@
   @Override
   protected String put(HttpExchange e) throws IOException {
     String path = e.getRequestURI().toString();
-    String[] elems = path.split(App.getRs(Server.RB_SLASH));
+    String[] elems = path.split(Server.SLASH);
     String type = elems[elems.length - 2];
     String elemName = elems[elems.length - 1]; // alter Name, wenn Aenderung
     if(!elemName.equalsIgnoreCase(App.getRs(RB_EP_LISTE))) {
@@ -59,7 +58,7 @@
         } else {
           fs.write(entity, false);
         }
-        return type + App.getRs(Server.RB_SLASH) + entity.getName();
+        return type + Server.SLASH + entity.getName();
       } else {
         return "Ungueltiges Objekt im Body.";
       }
@@ -70,7 +69,7 @@
   
   private boolean loeschen(HttpExchange e) {
     String path = e.getRequestURI().toString();
-    String[] elems = path.split(App.getRs(Server.RB_SLASH));
+    String[] elems = path.split(Server.SLASH);
     String type = elems[elems.length - 2];
     String elemName = elems[elems.length - 1];
     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
@@ -79,9 +78,9 @@
   
   private String lesen(HttpExchange e) {
     String path = e.getRequestURI().toString();
-    String[] elems = path.split(App.getRs(Server.RB_SLASH));
+    String[] elems = path.split(Server.SLASH);
     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
-    if(path.endsWith(App.getRs(RB_SLASH))) {
+    if(path.endsWith(Server.SLASH)) {
       List list = null;
       if(elems[elems.length - 1].equalsIgnoreCase(App.getRs(RB_EP_LISTE))) {
         String type = elems[elems.length - 2];
diff --git a/src/de/uhilger/mediaz/entity/Abspielvorgang.java b/src/de/uhilger/mediaz/entity/Abspielvorgang.java
new file mode 100644
index 0000000..f1a2efc
--- /dev/null
+++ b/src/de/uhilger/mediaz/entity/Abspielvorgang.java
@@ -0,0 +1,58 @@
+/*
+  Mediazentrale - Personal Media Center
+  Copyright (C) 2021  Ulrich Hilger
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU Affero General Public License as
+  published by the Free Software Foundation, either version 3 of the
+  License, or (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Affero General Public License for more details.
+
+  You should have received a copy of the GNU Affero General Public License
+  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package de.uhilger.mediaz.entity;
+
+/**
+ * Hier merkt sich die Mediazentrale, welcher Titel einer Abspielliste 
+ * gerade spielt.
+ * 
+ * @author Ulrich Hilger
+ */
+public class Abspielvorgang {
+  
+  private String abspieler;
+
+  public String getAbspieler() {
+    return abspieler;
+  }
+
+  public void setAbspieler(String abspieler) {
+    this.abspieler = abspieler;
+  }
+  private String liste;
+  private int titelNr;
+
+  public String getListe() {
+    return liste;
+  }
+
+  public void setListe(String liste) {
+    this.liste = liste;
+  }
+
+  public int getTitelNr() {
+    return titelNr;
+  }
+
+  public void setTitelNr(int titelNr) {
+    this.titelNr = titelNr;
+  }
+  
+  
+  
+}
diff --git a/src/de/uhilger/mediaz/store/FileStorage.java b/src/de/uhilger/mediaz/store/FileStorage.java
index 7a86477..2d768cf 100644
--- a/src/de/uhilger/mediaz/store/FileStorage.java
+++ b/src/de/uhilger/mediaz/store/FileStorage.java
@@ -137,7 +137,7 @@
   }
   
   private String typeNameFromPath(File file) {
-    String[] parts = file.getPath().split(App.getRs(Server.RB_SLASH));
+    String[] parts = file.getPath().split(Server.SLASH);
     return parts[parts.length-2];
   }
 
diff --git a/src/mediaz_de_DE.properties b/src/mediaz_de_DE.properties
index f5f7892..d33bd5c 100644
--- a/src/mediaz_de_DE.properties
+++ b/src/mediaz_de_DE.properties
@@ -6,6 +6,11 @@
 appParamCtx=ctx
 appParamUi=ui
 
+# Parameter der Mediazentrale
+audioexts=audioexts
+videoexts=videoexts
+playerparams=playerparams
+
 # HTTP-Endpunkte
 webroot=/
 # uiroot=/ui
@@ -18,7 +23,6 @@
 testStore=/api/test/store
 
 
-slash=/
 dash=-
 bytes=bytes
 notFound=nicht gefunden.

--
Gitblit v1.9.3