Bedienoberfläche für Webradio
ulrich
2018-01-22 611cabb5dfb736898a68b75cec879f8d0e6d3e54
commit | author | age
623a61 1 # radio-ui
U 2
3 Eine Bedienoberfläche für Webradio
851c9c 4
70e1ff 5 ## Prototyp
U 6
ec55bf 7 Diese Anwendung ist zur Zeit im Bau. Der aktuelle Prototyp zum Stand des Codes in diesem Repository ist hier zu sehen: [Link zum Prototyp](/data/ulrich/test/radio-ui).
851c9c 8
ad1fef 9 ## Vorgesehene Funktionen
U 10
11 Das radio-ui zeigt eine Übersicht von Radiosendern. Antippen eines Senders in der Übersicht spielt den Sender ab.
12
13 Radiosender können hinzugefügt, geändert und gelöscht werden. Ein Suchfeld ermöglicht das Einschränken der Übersicht auf bestimmte Sender.
14
fe1cb2 15 Das Abspiel-Ziel ist konfigurierbar: Ein Radionsender kann entweder auf dem Gerät abgespielt werden, auf dem das radio-ui im Browser läuft oder auf einem anderen Gerät wie z.B. einem Raspberry Pi.
ad1fef 16
U 17 Zum Abspielen auf einem Raspberry Pi ist die Nutzung der Anwendung [pirc](/gitblit/docs/pirc.git) vorgesehen, die zum Spielen von Audiostreams den [omxplayer](https://elinux.org/Omxplayer) mit einer unter [Tomcat](https://de.wikipedia.org/wiki/Apache_Tomcat) laufenden Fernbedienung kombiniert, die per HTTP gesteuert werden kann.
18
8d53d7 19 ## Beispielcharakter
U 20
21 Neben dem praktischen Nutzen veranschaulicht das radio-ui verschiedene Aspekte des Baus von Webanwendungen:
22
96834e 23 + app-layout
8d53d7 24 + Vorlagen
96834e 25 + app-menu
8d53d7 26 + CRUD-Muster (Create, Read, Update, Delete)
U 27
28 Wie in der Anwendung radio-ui die obigen Themen umgesetzt sind, ist nachfolgend kurz betrachtet.
96834e 29
U 30 ### app-layout
31
611cab 32 Das radio-ui verwendet das [app-layout](/gitblit/docs/web!app-layout.git), das mit Hilfe von HTML und CSS die Grundlage einer für Webanwendungen geeigneten Bedienoberfläche schafft.
8d53d7 33
U 34 ### Nutzung von Vorlagen
851c9c 35
611cab 36 Die Datei `index.html` definiert Bereiche einer HTML-Seite als `div`-Elemente, die während der Ausführung des Programmes dynamisch mit wechselnden Inhalten gefüllt werden.
e8a097 37
6592dc 38 Inhalte werden dabei mit Hilfe von [Mustache](https://github.com/janl/mustache.js) aus einer Vorlage und einer Inhaltsbeschreibung in [JSON](https://de.wikipedia.org/wiki/JavaScript_Object_Notation) zu [HTML](https://de.wikipedia.org/wiki/Hypertext_Markup_Language) zusammengesetzt.
96834e 39
U 40 Durch die Nutzung von Vorlagen lassen sich dynamische und statische Inhalte sowie deren Gestaltung und Struktur optimal und frei von Redundanzen zusammenführen.
41
42 ### app-menu
43
6d5a45 44 Das [app-menu](/gitblit/docs/web!app-menu.git) setzt auf die Nutzung von Vorlagen auf und fügt dem radio-ui ein Menü zur Bedienung der Anwendung hinzu. Es ist zudem eingebettet in die Funktion des app-layout. Das radio-ui zeigt so den Einsatz des app-menu und mithin das Zusammenspiel von Vorlagen, app-layout und Menü am praktischen Beispiel.
851c9c 45
8d53d7 46 ### CRUD-Muster
U 47
48 CRUD (Create, Read, Update, Delete) ist ein häufig vorkommendes Nutzungsmuster von Anwendungen, Daten werden erzeugt, gelesen, bearbeitet und gelöscht. Bei Webanwendungen zerfällt es in einen Teil, der auf dem Server ausgeführt wird und einen, der im Browser abläuft (Bedienoberfläche).
49
6d5a45 50 Allein bezogen auf den Umgang mit den Daten auf der Serverseite ist das CRUD-Muster schnell umgesetzt. Eine Datenstruktur wird erzeugt, gelesen, gespeichert und gelöscht. Eine Bedienoberfläche zur Ausführung dieser Operationen erfordert allerdings mehr als nur den Anstoß der jeweiligen Operation.
U 51
52 Beim radio-ui wird beispielsweise mit den Daten der Radiosender auf diese Weise umgegangen. Die folgende Tabelle veranschaulicht die benötigten Funktionen.
8d53d7 53
U 54 | Operation        | Bedienoberfläche (radio-ui)           | Server  |
55 | ------------- |-------------| -----|
56 | Create      | Funktion zum Auslösen der Erstellung eines neuen Senders, Dialog zur Eingabe der Daten, Funktion zum Senden der neuen Daten  | Speichern eines neuen Senders |
96834e 57 | Read      | Funktion zum Abruf der Senderliste, Lesen der Senderliste, Darstellen der Liste als Kacheln      |   Ausgeben einer Liste von Sendern |
8d53d7 58 | Update | Funktion zum Auslösen der Änderung an einem Sender, Funktion zur Auswahl eines Senders aus einer Liste, Darstellen der Daten des gewählten Senders in einem Dialog zum Bearbeiten, Funktion zum Senden der Änderungen    |    Speichern von Änderungen an einem bestehenden Sender |
U 59 | Delete | Funktion zum Auslösen der Löschfunktion, Funktion zur Auswahl eines Senders oder mehrerer Sender aus einer Liste, Funktion zum Senden einer Liste zu löschender Sender, Funktion zur Absicherung gegenüber versehentlichem Löschen    |    Löschen eines Senders oder mehrerer Sender |
60
61 Die Tabelle läßt ahnen, dass der größere Aufwand zur Herstellung eines CRUD-Musters auf die Bedienoberfläche entfällt.
62
96834e 63 Mit seinen Menüfunktionen und der Art, wie mit Daten als Liste und als einzelnem Datensatz umgegangen wird sowie der Kombination dieser Funktionen mit der Verwendung von Vorlagen zeigt das radio-ui einen generischen Lösungsansatz, der sich für die Wiederverwendung in anderen Anwendungen eignet und dabei wenige Abhängigkeiten erfordert.
8d53d7 64
36646e 65 ## Abhängigkeiten
f927ec 66
36646e 67 Zur Verwendung des radio-ui sind die folgenden Komponenten erforderlich
f927ec 68
36646e 69 + [jQuery](http://jquery.com/)
U 70 + [Mustache](https://github.com/janl/mustache.js)
71 + [app-menu](/gitblit/docs/web!app-menu.git)
f927ec 72
36646e 73 Diese sind in der Datei `index.html` über die folgenden Einträge eingebunden.
f927ec 74
36646e 75 ````
U 76 <link rel="stylesheet" type="text/css" href="../jslib/app-menu/app-menu.css">
77 <script src="../jslib/jquery-1.11.1/jquery-1.11.1.min.js"></script>
78 <script src="../jslib/mustache/mustache.min.js"></script>
79 <script src="../jslib/app-menu/app-menu.js"></script>
80 ````
851c9c 81
899220 82 Sollen einzelne Komponenten von einem anderen Ort wie beispielsweise einem Content Delivery Network (CDN) eingebunden werden, müssen nur die obigen Einträge entsprechend angepasst werden.
851c9c 83
fe1cb2 84 ## Kombination von pirc und radio-ui
U 85
611cab 86 Zur Verwendung des radio-ui mit [pirc](/gitblit/docs/pirc.git) kann die Anwendung radio-ui direkt auf einen Raspberry Pi installiert werden, beispielsweise ähnlich wie pirc als Webanwendung für Tomcat. Stattdessen kann radio-ui auch von einer anderen Maschine aus die pirc-Instanz auf einen Raspberry Pi aufrufen.
fe1cb2 87
U 88 ### Abspielen auf dem Raspberry Pi
89
611cab 90 Kommandos an [pirc](/gitblit/docs/pirc.git) werden via HTTP an die betreffende Maschine gesendet und bestehen aus einem Klassennamen `c`, einem Methodennamen `m` und einem Parameter `p`. Ein Kommando setzt sich wie folgt zusammen
fe1cb2 91
U 92 1. `http://raspi:8080/` - URL der Maschine
93 1. `pirc/` - Name des Kontext, unter dem die Anwendung pirc läuft
94 1. `sys/rpc` - Service-Endpunkt der pirc-API
95 1. `c=de.uhilger.pirc.App` - Name der Klasse von pirc, die die Abspielmethode enthält
96 1. `m=abspielen` - Name der Methode zum Abspielen
97 1. `p=Sender-URL` - der Parameter mit dem URL zum Audiostream des Webradiosenders
98
99 Zum Aufruf des Kommandos mit dem radio-ui kann es weitgehend unverändert bleiben. Nur der Teil 6. mit dem URL des Senders muss veränderlich gestaltet sein.
100
101 #### Beispiel Abspielen
102
103 Ist die Fernbedienung pirc auf einem Raspberry Pi installiert, lautet das Kommando zum Abspielen des Webradiosenders radiobob (vgl. Senderliste weiter unten) wie folgt
104
105 ````
abef80 106 http://raspi:8080/pirc/sys/rpc?c=de.uhilger.pirc.App&m=abspielen&p=http://bob.hoerradar.de/radiobob-live-mp3-hq&p=
fe1cb2 107 ````
U 108
109 Das obige Kommando geht davon aus, dass der betreffende Raspberry Pi unter dem Namen `raspi` auf Port `8080` über `HTTP` erreichbar ist und dass auf dem Pi die Anwendung pirc unter dem Kontextnamen `pirc` installiert wurde. Es bewirkt, dass auf dem betreffenden Raspberry Pi eine Instanz des omxplayer gestartet wird und diese fortlaufend den Webradio-Stream unter der angegebenen Adresse abspielt.
110
111 #### Beispiel Stoppen
112
113 Zum Stoppen des zur Zeit abgespielten Webradios dient das folgende Kommando
114
115 ````
116 http://raspi:8080/sys/rpc?c=de.uhilger.pirc.App&m=kommando&p=q
117 ````
118
119 Mit dem obigen Aufruf wird das Kommando `q` an den laufenden Prozess des omxplayer gesendet. Das bewirkt, dass der omxplayer das Abspielen stoppt und der laufende omxplayer-Prozess endet.
120
121
899220 122 ## Radiostreams
851c9c 123
899220 124 Nachfolgend die Adressen einiger Radiostreams
851c9c 125
899220 126 ### hr3
851c9c 127
899220 128 [Livestream-Übersicht](http://www.hr3.de/service/hr3-online-hoeren,webradio-100.html)
851c9c 129
899220 130 128 kbit http://hr-hrinfo-live.cast.addradio.de/hr/hrinfo/live/mp3/128/stream.mp3
851c9c 131
899220 132 48 kbit http://hr-hr3-live.cast.addradio.de/hr/hr3/live/mp3/48/stream.mp3
f927ec 133
899220 134 ### hr info
f927ec 135
899220 136 [Livestream-Übersicht](http://www.hr-inforadio.de/livestream/index.html)
f927ec 137
899220 138 128 kBit/s http://hr-hrinfo-live.cast.addradio.de/hr/hrinfo/live/mp3/128/stream.mp3
f927ec 139
899220 140 48 kBit/s http://hr-hrinfo-live.cast.addradio.de/hr/hrinfo/live/mp3/48/stream.mp3
36646e 141
899220 142 ### radiobob
36646e 143
899220 144 [Livestream-Übersicht](http://www.radiobob.de/radiobob/empfang/livestream)
36646e 145
899220 146 MP3: http://bob.hoerradar.de/radiobob-live-mp3-hq
36646e 147
899220 148 Mobile Nutzung: http://bob.hoerradar.de/aac-radiobob
36646e 149
377dc9 150 #### Test der Bandbreite
U 151
152 Spielt man den URL 'hq' von Radiobob im Browser zeigt der Netzwerkmonitor von Linux eine Netznutzung von 24-32 kbit/s. Das ergibt die folgende Betrachtung:
153
154 + 32    kBit/s
155 + 115.20.000    Bit/Std (kBit x 3600 x 1000)
156 + 13,74    MB pro Stunde (Bit : 8 : 1.024 : 1.024)
157
899220 158 ### FFH
36646e 159
899220 160 [Livestream-Übersicht](https://www.ffh.de/musik/webradios/stream-adressen.html)
36646e 161
899220 162 128kbps http://mp3.ffh.de/radioffh/hqlivestream.mp3
36646e 163
899220 164 48kbps http://mp3.ffh.de/radioffh/livestream.aac
576085 165
U 166 ## Noch zu erledigen
167
168 ### Templates für Mustache dynamisch laden
169
170 Spart Ladezeit zu Beginn. Lösungsansatz: Eine Funktion, die als Parameter das Element erhält, dessen html mit dem gerenderten Template ersetzt werden soll und den zu rendernden Inhalt. Die dynamische Ladefunktion
171
172 1. prüft, ob das Template schon im cache ist
173 1. Lädt das Template, wenn nicht
174 1. wartet, bis das Template geladen ist
175 1. rendert das Template mit dem übergebenen Inhalt
176 1. schreibt das Ergebnis ins html des übergebenen Elements
177
178 Der letzte Teil des Ablaufs muss asynchron gefasst sein, damit auf das Laden gewartet werden kann.
179
180 ## Schnittstellenbeschreibung
181
6a62bd 182 Für den Prototyp des radio-ui können verschiedene Arten des Umgangs mit Sendern und Abspielern hergestellt werden. Die folgenden Angaben zeigen die Punkte auf, an denen eine konkrete Implementierung ansetzen kann.
576085 183
6a62bd 184 ### Sender
U 185
186 #### Senderliste lesen
576085 187
U 188 Aufruf
068ce7 189
576085 190 ````
U 191 data/sender.json
192 ````
193
194 Antwort
068ce7 195
576085 196 ````
U 197 {
198   "senderliste": {
199     "titel": "Senderliste",
200     "inhalt":  [
201       {
202         "senderid": 1,
203         "sendername": "hr info",
204         "senderurl": "http://hr-hrinfo-live.cast.addradio.de/hr/hrinfo/live/mp3/128/stream.mp3",
205         "senderlogo": "../bilder/hr-info.png"
206       },
207       {
208         "senderid": 2,
209         "sendername": "radiobob",
210         "senderurl": "http://bob.hoerradar.de/radiobob-live-mp3-hq",
211         "senderlogo": "../bilder/radio-bob-logo-80.png"
212       },
213       usw.
214     ]
215   }
216 }
217 ````
218
6a62bd 219 #### Neuen Sender speichern
576085 220
U 221 Noch nicht realisiert.
222
6a62bd 223 #### Änderungen an einem Sender speichern
576085 224
U 225 Noch nicht realisiert.
226
6a62bd 227 #### Sender löschen
U 228
229 Noch nicht realisiert.
230
231 ### Abspieler
232
233 #### Abspielerliste lesen
234
235 Aufruf
236
237 ````
238 data/abspieler.json
239 ````
240
241 Antwort
242
243 ````
244 {
245   "abspielerliste": {
246     "titel": "Abspielerliste",
247     "inhalt":  [
248       {
249         "abspielerid": 1,
250         "abspielername": "dieses Gerät",
251         "abspielerurl": "",
252         "abspielertyp":"lokal",
253         "abspielerbild": "",
254         "abspielerzustand":""
255       },
256       {
257         "abspielerid": 2,
258         "abspielername": "Raspberry Pi Wohnzimmer",
259         "abspielerurl": "",
260         "abspielertyp":"pirc",
261         "abspielerbild": "",
262         "abspielerzustand":"selected"
263       },
264       usw.
265     ]
266   }
267 }
268 ````
269
270 #### Neuen Abspieler speichern
271
272 Noch nicht realisiert.
273
274 #### Änderungen an einem Abspieler speichern
275
276 Noch nicht realisiert.
277
278 #### Abspieler löschen
576085 279
U 280 Noch nicht realisiert.