From d027b57c66dcdb183683c34101518df1572c1bf8 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Mon, 12 Apr 2021 16:53:30 +0000
Subject: [PATCH] Livestreams erste Fassung fertig
---
src/de/uhilger/mediaz/api/StorageHandler.java | 4 +
src/de/uhilger/mediaz/store/FileStorage.java | 5 +
www/ui/data/tpl/livestream_liste.txt | 7 +
src/de/uhilger/mediaz/api/MediaSteuerung.java | 63 +++++++++++----
www/ui/js/app.js | 63 ++++++++++++++-
src/de/uhilger/mediaz/api/ListFileHandler.java | 1
www/ui/index.html | 2
src/de/uhilger/mediaz/api/AbstractHandler.java | 2
src/de/uhilger/mediaz/entity/Livestream.java | 47 +++++++++++
www/ui/data/tpl/form_livestream.txt | 11 ++
10 files changed, 177 insertions(+), 28 deletions(-)
diff --git a/src/de/uhilger/mediaz/api/AbstractHandler.java b/src/de/uhilger/mediaz/api/AbstractHandler.java
index af0ba5b..2d9b71a 100644
--- a/src/de/uhilger/mediaz/api/AbstractHandler.java
+++ b/src/de/uhilger/mediaz/api/AbstractHandler.java
@@ -69,7 +69,7 @@
response = json;
} else {
response = "nicht gefunden";
- returnCode = RTC_NOT_FOUND;
+ //returnCode = RTC_NOT_FOUND;
}
break;
diff --git a/src/de/uhilger/mediaz/api/ListFileHandler.java b/src/de/uhilger/mediaz/api/ListFileHandler.java
index e31d016..c54c9c7 100644
--- a/src/de/uhilger/mediaz/api/ListFileHandler.java
+++ b/src/de/uhilger/mediaz/api/ListFileHandler.java
@@ -33,7 +33,6 @@
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
diff --git a/src/de/uhilger/mediaz/api/MediaSteuerung.java b/src/de/uhilger/mediaz/api/MediaSteuerung.java
index bb056f4..e40fbf1 100644
--- a/src/de/uhilger/mediaz/api/MediaSteuerung.java
+++ b/src/de/uhilger/mediaz/api/MediaSteuerung.java
@@ -26,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;
@@ -45,7 +46,8 @@
* HTTP GET /mz/api/strg/abspieler/play/liste/[name]
* HTTP GET /mz/api/strg/abspieler/ende
*
- * HTTP POST /mz/api/strg/abspieler/play mit dem Titel im Body
+ * 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
@@ -128,25 +130,52 @@
String path = e.getRequestURI().toString();
String[] elems = path.split(Server.SLASH);
FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
-
- 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.";
+ 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 Abspieler.", 404);
+ 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 Titel.", 404);
+ return meldung("Ungueltiger URL.", 404);
}
}
diff --git a/src/de/uhilger/mediaz/api/StorageHandler.java b/src/de/uhilger/mediaz/api/StorageHandler.java
index d12e6c1..b49b219 100644
--- a/src/de/uhilger/mediaz/api/StorageHandler.java
+++ b/src/de/uhilger/mediaz/api/StorageHandler.java
@@ -24,6 +24,7 @@
import de.uhilger.mediaz.Server;
import de.uhilger.mediaz.store.FileStorage;
import de.uhilger.mediaz.entity.Entity;
+import static de.uhilger.mediaz.store.FileStorage.ST_ABLAGEORT;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
@@ -86,6 +87,9 @@
String type = elems[elems.length - 2];
logger.fine(type);
list = fs.list(type);
+ if(type.equalsIgnoreCase(ST_ABLAGEORT)) {
+ list.add("Livestreams");
+ }
} else {
String type = elems[elems.length - 1];
logger.fine(type);
diff --git a/src/de/uhilger/mediaz/entity/Livestream.java b/src/de/uhilger/mediaz/entity/Livestream.java
new file mode 100644
index 0000000..3659cc7
--- /dev/null
+++ b/src/de/uhilger/mediaz/entity/Livestream.java
@@ -0,0 +1,47 @@
+/*
+ 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;
+
+/**
+ *
+ * @author Ulrich Hilger
+ */
+public class Livestream implements Entity {
+
+ private String name;
+ private String url;
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+
+}
diff --git a/src/de/uhilger/mediaz/store/FileStorage.java b/src/de/uhilger/mediaz/store/FileStorage.java
index 2d768cf..ce6b60f 100644
--- a/src/de/uhilger/mediaz/store/FileStorage.java
+++ b/src/de/uhilger/mediaz/store/FileStorage.java
@@ -19,7 +19,6 @@
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
-import de.uhilger.mediaz.App;
import de.uhilger.mediaz.Server;
import de.uhilger.mediaz.entity.Ablageort;
import de.uhilger.mediaz.entity.Abspieler;
@@ -33,6 +32,7 @@
import java.io.IOException;
import java.util.logging.Logger;
import de.uhilger.mediaz.entity.Entity;
+import de.uhilger.mediaz.entity.Livestream;
import de.uhilger.mediaz.entity.Titel;
import java.util.ArrayList;
import java.util.HashMap;
@@ -60,6 +60,7 @@
public static final String ST_EINSTELLUNG = "Einstellung";
public static final String ST_ABSPIELER = "Abspieler";
public static final String ST_ABSPIELLISTE = "Abspielliste";
+ public static final String ST_LIVESTREAM = "Livestream";
private final String fileBase;
@@ -73,6 +74,7 @@
TypeToken<Einstellung> ttEinstellung = new TypeToken<Einstellung>() {};
TypeToken<Abspieler> ttAbspieler = new TypeToken<Abspieler>() {};
TypeToken<Abspielliste> ttAbspielliste = new TypeToken<Abspielliste>() {};
+ TypeToken<Livestream> ttLivestream = new TypeToken<Livestream>() {};
TypeToken<Titel> ttTitel = new TypeToken<Titel>() {};
types = new HashMap();
types.put(Ablageort.class.getSimpleName(), ttAblageort);
@@ -80,6 +82,7 @@
types.put(Abspieler.class.getSimpleName(), ttAbspieler);
types.put(Abspielliste.class.getSimpleName(), ttAbspielliste);
types.put(Titel.class.getSimpleName(), ttTitel);
+ types.put(Livestream.class.getSimpleName(), ttLivestream);
}
/**
diff --git a/www/ui/data/tpl/form_livestream.txt b/www/ui/data/tpl/form_livestream.txt
new file mode 100644
index 0000000..c5144d6
--- /dev/null
+++ b/www/ui/data/tpl/form_livestream.txt
@@ -0,0 +1,11 @@
+<form>
+ <div class="entity-formular">
+ <input name="name" class="entity-element" type="text" id="livestream-name" placeholder="Name" value="{{name}}" />
+ <input name="url" class="entity-element" type="text" id="livestream-url" placeholder="Pfad" value="{{url}}" />
+ <div class="entity-buttons">
+ <button type="submit" class="button-primary" id="ok-btn">Speichern</button>
+ <button class="button" id="cancel-btn">Abbrechen</button>
+ <button class="button" id="loeschen-btn">Löschen</button>
+ </div>
+ </div>
+</form>
diff --git a/www/ui/data/tpl/livestream_liste.txt b/www/ui/data/tpl/livestream_liste.txt
new file mode 100644
index 0000000..9872957
--- /dev/null
+++ b/www/ui/data/tpl/livestream_liste.txt
@@ -0,0 +1,7 @@
+<div class='entity-formular'>
+ <ul class='entity-liste'>
+ {{#ArrayList}}
+ <li class='entity-eintrag'>{{.}}</li>
+ {{/ArrayList}}
+ </ul>
+</div>
diff --git a/www/ui/index.html b/www/ui/index.html
index 3b3ed7c..5ab8654 100644
--- a/www/ui/index.html
+++ b/www/ui/index.html
@@ -52,7 +52,7 @@
<a id="mi-listen"><i class="icon-list"></i> Abspiellisten</a>
<a id="mi-orte"><i class="icon-database"></i> Kataloge</a>
<a id="mi-player"><i class="icon-play"></i> Abspieler</a>
- <a id="mi-radio"><i class="icon-ellipsis-vert"></i> Radio</a>
+ <a id="mi-live"><i class="icon-ellipsis-vert"></i> Livestream</a>
<a id="mi-prefs"><i class="icon-sliders"></i> Einstellungen</a>
</div>
</div>
diff --git a/www/ui/js/app.js b/www/ui/js/app.js
index 7837d59..5be012f 100644
--- a/www/ui/js/app.js
+++ b/www/ui/js/app.js
@@ -30,6 +30,7 @@
self.addEvtListener('#mi-player', 'click', self.abspieler_liste);
self.addEvtListener('#mi-listen', 'click', self.abspielliste_liste);
self.addEvtListener('#mi-list', 'click', self.titel_liste);
+ self.addEvtListener('#mi-live', 'click', self.livestream_liste);
self.fusszeile_umschalten();
self.seitenleiste_umschalten();
@@ -37,6 +38,21 @@
};
/* ---------------- Entitaets-Listen ----------------- */
+
+ this.livestream_selection = function() {
+ document.querySelector('.breadcrumb-behaelter').textContent = '';
+ document.querySelector('.bereich-name').textContent = 'Livestream-Auswahl';
+ self.http_get('../api/store/Livestream/liste/', function(responseText) {
+ self.vorlage_laden_und_fuellen("data/tpl/livestream_liste.txt", JSON.parse(responseText), function (html) {
+ document.querySelector(".zentraler-inhalt").innerHTML = html;
+ self.addEvtListener('.entity-eintrag', 'click', function (event) {
+ var t = event.target;
+ self.removeClassMulti('selected');
+ t.classList.add('selected');
+ });
+ });
+ });
+ };
// auf der obersten Ebene werden die Kataloge angezeigt,
// darunter der Inhalt des aktuellen Pfades
@@ -55,11 +71,15 @@
self.addEvtListener('.entity-eintrag', 'click', function (event) {
var t = event.target;
self.katName = t.textContent;
- self.http_get('../api/store/Ablageort/' + t.textContent, function(responseText) {
- var ablageort = JSON.parse(responseText);
- self.ortPfad = ablageort.url;
- self.media_liste();
- });
+ if(self.katName !== "Livestreams") {
+ self.http_get('../api/store/Ablageort/' + t.textContent, function(responseText) {
+ var ablageort = JSON.parse(responseText);
+ self.ortPfad = ablageort.url;
+ self.media_liste();
+ });
+ } else {
+ self.livestream_selection();
+ }
});
});
});
@@ -161,6 +181,15 @@
});
};
+ this.livestream_liste = function() {
+ self.entitaet_liste('Livestream','../api/store/Livestream/liste/',
+ "data/tpl/livestream_liste.txt", '../api/store/Livestream/',
+ "self.livestream_form", function(responseText) {
+ var livestream = JSON.parse(responseText);
+ self.livestream_form(livestream);
+ });
+ };
+
this.abspielliste_liste = function() {
self.entitaet_liste('Abspielliste','../api/store/Abspielliste/liste/',
"data/tpl/abspielliste_liste.txt", '../api/store/Abspielliste/',
@@ -191,6 +220,14 @@
'#abspieler-name', function() {
self.abspieler_auswahl_fuellen();
self.abspieler_liste();
+ });
+ };
+
+ this.livestream_form = function(ls) {
+ self.entitaet_form('Livestream', ls, ls.name,
+ "data/tpl/form_livestream.txt", '../api/store/Livestream/',
+ '#livestream-name', function() {
+ self.livestream_liste();
});
};
@@ -322,9 +359,16 @@
url: /media/test/M/Muenchener-Freiheit/01-Ohne-Dich-schlaf-ich-heut-Nacht-nicht-ein.mp3
*/
console.log('plname: ' + playername + ' url: ' + titel.katalogUrl + titel.pfad + titel.name);
- self.http_post('../api/strg/' + playername, JSON.stringify(titel), function(responseText) {
+ self.http_post('../api/strg/' + playername + '/titel', JSON.stringify(titel), function(responseText) {
self.meldung_mit_timeout(responseText, 1500);
- });
+ });
+ } else if(bereichName === 'Livestream-Auswahl') {
+ var streamName = document.querySelector(".selected").textContent;
+ var playername = document.querySelector('#abspieler').value;
+ var stream = new Livestream(streamName, '-');
+ self.http_post('../api/strg/' + playername + '/stream', JSON.stringify(stream), function(responseText) {
+ self.meldung_mit_timeout(responseText, 1500);
+ });
} else {
var abs = document.querySelector('#abspieler').value;
var lst = document.querySelector('#playlist').value;
@@ -772,6 +816,11 @@
this.url = u;
}
+function Livestream(n, u) {
+ this.name = n;
+ this.url = u;
+}
+
function Abspielliste(n) {
this.name = n;
}
--
Gitblit v1.9.3