Persoenliche Mediazentrale
ulrich
2021-04-10 0e9cd39f81a9635dffd31e1d72229e6ca75d5f84
commit | author | age
b56bb3 1 /*
U 2   Mediazentrale - Personal Media Center
3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.mediaz.api;
19
20 import com.sun.net.httpserver.HttpExchange;
21 import de.uhilger.mediaz.App;
22 import de.uhilger.mediaz.Server;
0e9cd3 23 import de.uhilger.mediaz.entity.Abspielvorgang;
b56bb3 24 import de.uhilger.mediaz.entity.Abspieler;
U 25 import de.uhilger.mediaz.entity.Abspielliste;
0e9cd3 26 import de.uhilger.mediaz.entity.Einstellung;
b56bb3 27 import de.uhilger.mediaz.entity.Entity;
U 28 import de.uhilger.mediaz.entity.Titel;
29 import de.uhilger.mediaz.store.FileStorage;
0e9cd3 30 import de.uhilger.mediaz.store.Storage;
b56bb3 31 import java.util.HashMap;
U 32 import java.util.Map;
0e9cd3 33 import java.util.logging.Level;
b56bb3 34 import java.util.logging.Logger;
U 35
36 /**
0e9cd3 37  * Die MediaSteuerung verarbeitet HTTP-Signale zur Steuerung von Media-Operationen wie z.B. dem
U 38  * Spielen einer Abspielliste oder dem Starten oder Stoppen eines Videos auf einem entfernten
39  * Abspielgeraet.
40  *
41  * HTTP GET /mz/api/strg/abspieler/play/liste/[name] 
42  * HTTP GET /mz/api/strg/abspieler/ende
43  *
44  * HTTP GET /mz/api/strg/abspieler/play/[url]
45  *
46  * HTTP GET /mz/api/strg/abspieler/pause HTTP GET /mz/api/strg/abspieler/stop HTTP GET
47  * /mz/api/strg/abspieler/weiter
b56bb3 48  * 
0e9cd3 49  * Faustregel: Anzahl Elemente eines URL plus 1 ist die Anzahl der Elemente des 
U 50  * Ergebnisses von String.split.
51  *
52  *
b56bb3 53  * @author Ulrich Hilger
U 54  * @version 1, 9.4.2021
55  */
56 public class MediaSteuerung extends AbstractHandler {
57
58   private static final Logger logger = Logger.getLogger(MediaSteuerung.class.getName());
0e9cd3 59
U 60   public static final String PL_CMD_PLAY = "avd/play";
61   public static final String PL_DEFAULT_PARAMS = "?titel=";
62   public static final String PL_CMD_ENDE = "ende";
63
64   private final Map spielt = new HashMap();
b56bb3 65
U 66   @Override
67   protected String get(HttpExchange e) {
0e9cd3 68     String response;
b56bb3 69     String path = e.getRequestURI().toString();
0e9cd3 70     String[] elems = path.split(Server.SLASH);
U 71     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
72     
73     // Faustregel: Anzahl Elemente eines URL plus 1 ist die Anzahl der Elemente des 
74     // Ergebnisses von String.split.
75     switch (elems.length) {
76       case 6:
77         if (elems[5].equalsIgnoreCase(PL_CMD_ENDE)) {
78           response = naechsterTitel(fs, elems[4]);
79         } else {
80           response = meldung("Ungueltiges Kommando: " + elems[5], AbstractHandler.RTC_NOT_FOUND);
81         }
82         break;
b56bb3 83       case 8:
0e9cd3 84         response = listenTitelSpielen(fs, elems[4], elems[7]);
U 85         break;
86       default:
87         response = "Ungueltiger URL";
b56bb3 88         break;
U 89     }
90     return response;
91   }
92   
0e9cd3 93   private String meldung(String text, int code) {
U 94     setReturnCode(code);
95     return text;
96   }
97
98   private String naechsterTitel(Storage s, String abspielerName) {
99     String response;
100     Object o = spielt.get(abspielerName);
101     if (o instanceof Abspielvorgang) {
102       Abspielvorgang av = (Abspielvorgang) o;
103       Entity entity = s.read(FileStorage.ST_ABSPIELLISTE, av.getListe());
104       if (entity instanceof Abspielliste) {
b56bb3 105         Abspielliste liste = (Abspielliste) entity;
0e9cd3 106         int titelNr = av.getTitelNr();
U 107         if (liste.getTitel().size() > ++titelNr) {
108           response = listenTitelSpielen(s, abspielerName, liste, titelNr);
109         } else {
110           response = "Liste " + liste.getName() + " ist zuende gespielt.";
111         }
112       } else {
113         response = meldung("Abspielliste nicht gefunden.", AbstractHandler.RTC_NOT_FOUND);
b56bb3 114       }
0e9cd3 115       //response = listenTitelSpielen(e, elems[4]);
U 116     } else {
117       response = meldung("Abspielvorgang fuer Abspieler " + abspielerName, AbstractHandler.RTC_NOT_FOUND);
b56bb3 118     }
U 119     return response;
120   }
0e9cd3 121
U 122   private String listenTitelSpielen(Storage s, String aName, String lName) {
123     String response;
124     Entity entity = s.read(FileStorage.ST_ABSPIELLISTE, lName);
125     if (entity instanceof Abspielliste) {
126       Abspielliste liste = (Abspielliste) entity;
127       response = listenTitelSpielen(s, aName, liste, 0);
128     } else {
129       response = meldung("Abspielliste nicht gefunden.", AbstractHandler.RTC_NOT_FOUND);
130     }
131     return response;
b56bb3 132   }
0e9cd3 133
U 134   private String listenTitelSpielen(Storage s, String aName, Abspielliste liste, int titelNr) {
135     String response;
136     Entity entity = s.read(FileStorage.ST_ABSPIELER, aName);
137     if (entity instanceof Abspieler) {
138       Abspieler abspieler = (Abspieler) entity;
139       String kommando = kommandoFuerTitel(s, liste, abspieler, titelNr);
140       //String kommando = kmd.toString();
141       logger.info(kommando);
142       response = "Abspielen der Liste " + liste.getName() + " auf Abspieler " + aName + " gestartet.";
143     } else {
144       response = meldung("Abspieler nicht gefunden.", AbstractHandler.RTC_NOT_FOUND);
145     }
146     return response;
147   }
148
149   /**
150    * Das Kommando zum Abspielen fuer den Titel einer Abspielliste und einen bestimmten Abspieler
151    * ermitteln.
152    *
153    * @param s die Ablage, in der Abspieler und Abspiellisten zu finden sind
154    * @param liste Name der Liste, die den gewuenschten Titel enthaelt
155    * @param abspieler Name des Abspielers, der zum Abspielen dienen soll
156    * @param titelNr Nummer des Titels in der Liste
157    * @return das Kommando zum Abspielen (ein URL)
158    */
159   private String kommandoFuerTitel(Storage s, Abspielliste liste, Abspieler abspieler, int titelNr) {
160     // ersten Titel aus Liste holen
161     Titel titel = liste.getTitel().get(titelNr);
162
163     // URL des Titels ermitteln
164     String titelUrl = titel.getKatalogUrl() + titel.getPfad() + titel.getName();
165     logger.log(Level.INFO, "abspielen von {0} auf {1}", new Object[]{titelUrl, abspieler.getUrl()});
166
167     // Titel als 'spielt' vermerken
168     Abspielvorgang vorgang = new Abspielvorgang();
169     vorgang.setAbspieler(abspieler.getName());
170     vorgang.setListe(liste.getName());
171     vorgang.setTitelNr(titelNr);
172     spielt.put(abspieler.getName(), vorgang);
173
174     // Kommando an den Abspieler zusammenbauen
175     StringBuilder kmd = new StringBuilder();
176     kmd.append(abspieler.getUrl());
177     kmd.append(PL_CMD_PLAY);
178     // Parameter fuer den Abspieler holen
179     Entity entity = s.read(Einstellung.class.getSimpleName(), App.getRs(App.RB_PLAYERPARAMS));
180     if (entity instanceof Einstellung) {
181       Einstellung einstellung = (Einstellung) entity;
182       kmd.append(einstellung.getValue());
183     } else {
184       kmd.append(PL_DEFAULT_PARAMS);
185     }
186     kmd.append(titelUrl);
187     // hier noch Rueckmeldung anfuegen
188
189     return kmd.toString();
190   }
191
b56bb3 192   // rpi4-az:9090/avd/play?titel=/Filme/S/sound_city.m4v&th=60&ti=60&o=local
U 193   // aUrl http://rpi4-wz:9090/
194   // titelUrl /media/test/A/The-Alan-Parsons-Project/I-Robot/02-I-Wouldnt-Want-to-Be-Like-You.mp3
195 }