From b56bb3e0be136a9465589df74dd443b2bc063f90 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Fri, 09 Apr 2021 17:22:54 +0000
Subject: [PATCH] Abspielen in Arbeit

---
 src/de/uhilger/mediaz/api/StorageHandler.java  |   89 -----------------
 src/de/uhilger/mediaz/store/StorageFile.java   |    2 
 www/ui/data/tpl/abs_sel.tpl                    |    2 
 src/mediaz_de_DE.properties                    |    1 
 src/de/uhilger/mediaz/Server.java              |    3 
 src/de/uhilger/mediaz/api/MediaSteuerung.java  |  111 ++++++++++++++++++++++
 www/ui/js/app.js                               |   22 ++++
 src/de/uhilger/mediaz/api/JsonHelper.java      |   21 +++
 src/de/uhilger/mediaz/api/ListFileHandler.java |    6 +
 src/de/uhilger/mediaz/api/AbstractHandler.java |   21 +++
 www/ui/data/tpl/katalog_inhalt_liste.tpl       |    6 +
 11 files changed, 181 insertions(+), 103 deletions(-)

diff --git a/src/de/uhilger/mediaz/Server.java b/src/de/uhilger/mediaz/Server.java
index 69228eb..f662f2f 100644
--- a/src/de/uhilger/mediaz/Server.java
+++ b/src/de/uhilger/mediaz/Server.java
@@ -21,6 +21,7 @@
 import de.uhilger.mediaz.api.FileHandler;
 import de.uhilger.mediaz.api.ListFileHandler;
 import de.uhilger.mediaz.api.ListHandler;
+import de.uhilger.mediaz.api.MediaSteuerung;
 import de.uhilger.mediaz.api.StopServerHandler;
 import de.uhilger.mediaz.api.StorageHandler;
 import de.uhilger.mediaz.store.FileStorage;
@@ -49,6 +50,7 @@
   public static final String RB_SERVER_START_MSG = "msgServerStart";
   public static final String RB_WEBROOT = "webroot";
   public static final String RB_STORE = "store";
+  public static final String RB_STRG = "strg";
   public static final String RB_ALIST= "alist";
   //public static final String RB_UI_ROOT = "uiroot";
   public static final String RB_STOP_SERVER = "stopServer";
@@ -111,6 +113,7 @@
     server.createContext(ctx + App.getRs(RB_WEBROOT), new FileHandler(wwwDir.getAbsolutePath()));
     ablageorteEinklinken(server);
     server.createContext(ctx + App.getRs(RB_STORE), new StorageHandler());
+    server.createContext(ctx + App.getRs(RB_STRG), new MediaSteuerung());
     server.createContext(ctx + App.getRs(RB_ALIST), new ListHandler());
     server.createContext(ctx + App.getRs(RB_STOP_SERVER), new StopServerHandler());
     server.setExecutor(Executors.newFixedThreadPool(20));
diff --git a/src/de/uhilger/mediaz/api/AbstractHandler.java b/src/de/uhilger/mediaz/api/AbstractHandler.java
index 45befae..038b647 100644
--- a/src/de/uhilger/mediaz/api/AbstractHandler.java
+++ b/src/de/uhilger/mediaz/api/AbstractHandler.java
@@ -1,7 +1,19 @@
 /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
+  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.api;
 
@@ -17,7 +29,8 @@
 
 /**
  *
- * @author ulrich
+ * @author Ulrich Hilger
+ * @version 1, 8.4.2021
  */
 public abstract class AbstractHandler extends JsonHelper implements HttpHandler {
   
diff --git a/src/de/uhilger/mediaz/api/JsonHelper.java b/src/de/uhilger/mediaz/api/JsonHelper.java
index b84c51e..21b323e 100644
--- a/src/de/uhilger/mediaz/api/JsonHelper.java
+++ b/src/de/uhilger/mediaz/api/JsonHelper.java
@@ -1,7 +1,19 @@
 /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
+  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.api;
 
@@ -9,7 +21,8 @@
 
 /**
  *
- * @author ulrich
+ * @author Ulrich Hilger
+ * @version 1, 9.4.2021
  */
 public class JsonHelper {
   
diff --git a/src/de/uhilger/mediaz/api/ListFileHandler.java b/src/de/uhilger/mediaz/api/ListFileHandler.java
index cb9e9b4..3b01afe 100644
--- a/src/de/uhilger/mediaz/api/ListFileHandler.java
+++ b/src/de/uhilger/mediaz/api/ListFileHandler.java
@@ -85,6 +85,7 @@
           StorageFile sf = new StorageFile();
           String fname = file.getName();
           sf.setName(fname);
+          sf.setTitelAnzName(fname);
           if(file.isDirectory()) {
             sf.setTyp(StorageFile.TYP_FOLDER);
           } else {
@@ -117,7 +118,10 @@
     if(sf.getTyp().equalsIgnoreCase(StorageFile.TYP_AUDIO)) {
       Track track = new Track(file);
       sf.setInterpret(track.getArtist());
-      sf.setTitelAnzName(track.getTitle());
+      String trackTitel = track.getTitle();
+      if(trackTitel != null && trackTitel.length() > 0) {
+        sf.setTitelAnzName(trackTitel);
+      }
       sf.setAlbum(track.getAlbum());
     }
   }
diff --git a/src/de/uhilger/mediaz/api/MediaSteuerung.java b/src/de/uhilger/mediaz/api/MediaSteuerung.java
new file mode 100644
index 0000000..f697353
--- /dev/null
+++ b/src/de/uhilger/mediaz/api/MediaSteuerung.java
@@ -0,0 +1,111 @@
+/*
+  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.api;
+
+import com.sun.net.httpserver.HttpExchange;
+import de.uhilger.mediaz.App;
+import de.uhilger.mediaz.Server;
+import de.uhilger.mediaz.entity.Abspieler;
+import de.uhilger.mediaz.entity.Abspielliste;
+import de.uhilger.mediaz.entity.Entity;
+import de.uhilger.mediaz.entity.Titel;
+import de.uhilger.mediaz.store.FileStorage;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+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
+ * HTTP GET /mz/api/strg/abspieler/weiter
+ * 
+ * 
+ * @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();
+
+  @Override
+  protected String get(HttpExchange e) {
+    String response = "in Arbeit..";
+    String path = e.getRequestURI().toString();
+    String[] elems = path.split(App.getRs(Server.RB_SLASH));
+    // 4 Player name, 7 listenname
+    switch(elems.length) {
+      case 8:
+        response = play(e, elems[4], elems[7]);
+        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) {
+        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);
+      }
+    }
+    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=";
+  }
+  
+  // 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 aea2ffc..e6521bc 100644
--- a/src/de/uhilger/mediaz/api/StorageHandler.java
+++ b/src/de/uhilger/mediaz/api/StorageHandler.java
@@ -40,95 +40,6 @@
   
   private static final Logger logger = Logger.getLogger(StorageHandler.class.getName());
 
-  
-  /*  
-    Das REST-Muster fuer die Mediazentrale (Beispiel Ablageort):
-    
-    1. HTTP GET Ablageort/[Name]  - Liefere den Ablageort namens [Name]
-    2. HTTP GET Ablageort/liste/  - Liefere eine Liste mit Namen aller Ablageorte
-                                     Es duerfen keine Elemente namens "liste" angelegt werden
-    3. HTTP GET Ablageort/        - Liefere eine Liste aller Ablageort-Objekte als JSON
-    4. HTTP PUT Ablageort/[Name]  - Der Ablageort wird angelegt. Wenn er bereits existiert, 
-                                      wird er geändert. (im Falle einer Aenderung des Namens
-                                      muss der alte Name im URL stehen und im Body die Aenderung)
-    5. HTTP DELETE                - loesche den Ablageort
-  
-    Beispiele:
-  
-    HTTP GET /mz/api/store/Ablageort/
-    liefert alle Ablageort-Objekte
-  
-    HTTP GET /mz/api/store/Ablageort/liste/  
-    liefert eine Liste der Namen vorhandener Ablageorte
-  
-    HTTP GET /mz/api/store/Ablageort/[Name]
-    liest den Ablageort namens [Name]
-  
-    HTTP PUT /mz/api/store/Ablageort/[Name]
-    wenn [Name] existiert: Aenderung, sonst neu anlegen
-  
-    HTTP DELETE /mz/api/store/Ablageort/[Name]
-    löscht den Ablageort namens [Name]
-  
-  */
-  
-  /** Name der HTTP Methode GET */
-  //public static final String HTTP_GET = "GET";
-  
-  /** Name der HTTP Methode PUT */
-  //public static final String HTTP_PUT = "PUT";
-  
-  /** Name der HTTP Methode POST */
-  //public static final String HTTP_POST = "POST";
-  
-  /** Name der HTTP Methode DELETE */
-  //public static final String HTTP_DELETE = "DELETE";
-  
-  //public static final String EP_LISTE = "liste/";
-
-  /*
-  @Override
-  public void handle(HttpExchange e) throws IOException {
-    String method = e.getRequestMethod();
-    String response = "";
-    int code = 200;
-    switch(method) {
-      case HTTP_GET:
-        String json = lesen(e);
-        if(json != null) {
-          response = json;
-        } else {
-          response = "nicht gefunden";
-          code = 404;
-        }
-        break;
-        
-      case HTTP_PUT:
-        response = put(e);
-        break;
-        
-      case HTTP_POST:
-        response = "nicht unterstuertzt.";
-        code = 404;
-        break;
-        
-      case HTTP_DELETE:
-        boolean geloescht = loeschen(e);
-        if(geloescht) {
-          response = "geloescht";
-        } else {
-          response = "nicht geloescht";
-        }
-        break;
-    }
-    logger.fine(response);
-    e.sendResponseHeaders(code, response.length());
-    OutputStream os = e.getResponseBody();
-    os.write(response.getBytes());
-    os.close();        
-  }
-  */
-  
   @Override
   protected String put(HttpExchange e) throws IOException {
     String path = e.getRequestURI().toString();
diff --git a/src/de/uhilger/mediaz/store/StorageFile.java b/src/de/uhilger/mediaz/store/StorageFile.java
index 8c183c5..2e1a7bb 100644
--- a/src/de/uhilger/mediaz/store/StorageFile.java
+++ b/src/de/uhilger/mediaz/store/StorageFile.java
@@ -67,7 +67,7 @@
 
   public void setTitelAnzName(String tan) {
     if(tan != null) {
-    this.titelAnzName = tan;
+      this.titelAnzName = tan;
     }
   }
 
diff --git a/src/mediaz_de_DE.properties b/src/mediaz_de_DE.properties
index ec16c5d..f5f7892 100644
--- a/src/mediaz_de_DE.properties
+++ b/src/mediaz_de_DE.properties
@@ -11,6 +11,7 @@
 # uiroot=/ui
 store=/api/store
 alist=/api/alist
+strg=/api/strg
 epliste=liste
 stopServer=/api/server/stop
 testAblage=/api/test/ablage
diff --git a/www/ui/data/tpl/abs_sel.tpl b/www/ui/data/tpl/abs_sel.tpl
index b42a2ea..5a36ab4 100644
--- a/www/ui/data/tpl/abs_sel.tpl
+++ b/www/ui/data/tpl/abs_sel.tpl
@@ -1,5 +1,5 @@
 <select class="u-full-width ctrl-item ctrl-select" id="abspieler" title="Abspieler">
   {{#ArrayList}}
-  <option value="{{url}}">{{name}}</option>
+  <option value="{{.}}">{{.}}</option>
   {{/ArrayList}}
 </select>  
\ No newline at end of file
diff --git a/www/ui/data/tpl/katalog_inhalt_liste.tpl b/www/ui/data/tpl/katalog_inhalt_liste.tpl
index 0bbda60..b62cf46 100644
--- a/www/ui/data/tpl/katalog_inhalt_liste.tpl
+++ b/www/ui/data/tpl/katalog_inhalt_liste.tpl
@@ -6,7 +6,11 @@
   <ul class='entity-liste'>
     {{#Medialiste}}
     <li class='entity-eintrag entity-typ-{{typ}}' 
-        interpret='{{interpret}}' album='{{album}}' titelAnzName='{{titelAnzName}}'>{{name}}</li>
+        typ='{{typ}}'
+        interpret='{{interpret}}' 
+        album='{{album}}' 
+        titelAnzName='{{titelAnzName}}' 
+        dateiName='{{name}}'>{{titelAnzName}}</li>
     {{/Medialiste}}
   </ul>
 </div>
diff --git a/www/ui/js/app.js b/www/ui/js/app.js
index 87f417d..87fdf6b 100644
--- a/www/ui/js/app.js
+++ b/www/ui/js/app.js
@@ -194,7 +194,7 @@
   };
   
   this.abspieler_auswahl_fuellen = function() {
-    self.http_get('../api/store/Abspieler/', function (responseText) {
+    self.http_get('../api/store/Abspieler/liste/', function (responseText) {
       self.vorlage_laden_und_fuellen("data/tpl/abs_sel.tpl", JSON.parse(responseText), function (html) {
         document.querySelector(".abs-sel").innerHTML = html;
       });    
@@ -205,13 +205,17 @@
     self.http_get('../api/store/Abspielliste/', function (responseText) {
       self.vorlage_laden_und_fuellen("data/tpl/pl_sel.tpl", JSON.parse(responseText), function (html) {
         document.querySelector(".pl-sel").innerHTML = html;
+        self.addEvtListener('#playlist', 'change', function() {
+          self.titel_liste();
+        });
       });    
     });
   };
   
   this.addSelectedTitel = function() {
     var elem = document.querySelector(".selected");
-    var titelName = elem.textContent;
+    //var titelName = elem.textContent;
+    var titelName = elem.attributes.dateiName.nodeValue;
     var album = elem.attributes.album.nodeValue;
     var interpret = elem.attributes.interpret.nodeValue;
     var anzName = elem.attributes.titelAnzName.nodeValue;
@@ -237,6 +241,7 @@
       self.abspieler_auswahl_fuellen();
       self.abspielliste_auswahl_fuellen();
       self.addEvtListener('#dazu-btn', 'click', self.addSelectedTitel);
+      self.addEvtListener('#play-btn', 'click', self.play);
       self.media_liste();
     });
   };
@@ -258,6 +263,19 @@
     });
   };  
   
+  /* ------------- Media-Steuerung ------------------------- */
+  
+  this.play = function() {
+    var abs = document.querySelector('#abspieler').value;
+    var lst = document.querySelector('#playlist').value;
+    console.log(
+      "play playlist.value: " + document.querySelector('#playlist').value + 
+      ", abspieler.value: " + document.querySelector('#abspieler').value);
+    self.http_get('../api/strg/' + abs + '/play/liste/' + lst, function(responseText) {
+      self.meldung_mit_timeout(responseText, 1500);
+    });
+  };
+  
   /* ------------- Helfer fuer Entitaets-Formulare ----------------------- */
   
   /*

--
Gitblit v1.9.3