TV7 mit Plex

Vor ein paar Wochen (oder schon Monate) hat Init7 ja bekanntlich ihr TV7 Angebot ohne Mehrkosten in ihr Fiber7 oder Crossover7 integriert. Der von Init7 empfohlene Weg TV7 zu beziehen ist über eine AppleTV App. Darauf habe ich aber keine Lust, da ich kein AppleTV habe sondern eine AndroidTV Box. Da Init7 aber extrem offen ist, können die TV Streams mit einem beliebigen anderen Client über einen Multicast Stream ist bester Qualität bezogen werden.

Nun stellt sich aber die Frage, wie kommt der Stream ins Wohnzimmer. Dafür gibt es mehrere Möglichkeiten, eine davon wäre z.B. der IPTV Simple Client mit Kodi zu verwenden. Dazu stellt Init7 ein .m3u File zur Verfügung. Das ganze funktioniert ohne Probleme, mir fehlt aber der bisher bekannte Komfort wie zappen, EPG, „Non-Nerd“-Friendly Bedienung etc. Eine weiter Möglichkeit ist das TVHeadend Plugin für Kodi zu Verwenden. Dazu muss ein TVHeadend Server laufen. Um das auszuprobieren, habe ich auf meinem Synology NAS das ganze mal in einem Docker Container ausprobiert. Auch das funktionierte grundsätzlich. Die Bedienung anschliessend in Kodi ist aber immer noch nicht so ganz 100% zufriedenstellend. Ich hab sogar kurz darüber nachgedacht, eine eigene AndroidTV App zu schreiben:

Allerdings habe ich damit nicht wirklich Erfahrung und deshalb war mir der Aufwand zu gross.

Kürzlich bin ich dann auf diesen Tweet gestossen:

und da ich Plex auch verwende, wollte ich das gleich mal ausprobieren. Udpxy und Telly habe ich auf meinen Synlology als Docker Container am laufen.

Telly präsentiert sich Plex als HDHomerun Device, welches kompatibel mit Plex ist.

Damit Telly die TV7 Sender Plex zur Verfügung stellt, benötigt es die URL des .m3u File von TV7. Darin stehen alle vorhandenen TV7 Sender, allerdings mit den Multicast URLs der Streams. Plex kann diese nicht direkt abspielen, deshalb wird Udpxy verwendet um aus dem UDP Multicast Stream einen HTTP Stream zu erstellen. Udpxy hat ein HTTP Interface mit welchem der HTTP Stream geladen wird. Die Multicast URL aus dem .m3u File muss also etwas angepasst werden und dann an Udpxy gesendet werden. Das Format welches Udpxy erwartet sieht so aus:

http://ip:port/cmd/mgroup_address:mgroup_port/

Im m3u File sieht die URL so aus:

udp://@239.77.0.5:5000

Nun wäre es möglich, ein eigenes .m3u File manuell zu erstellen und Telly mitzugeben, ich wollte das aber nicht um nicht bei jeder Änderung von TV7 erneut ein m3u File zu erstellen. Ich hab dann halt einfach Telly ein wenig umgeschrieben um das umformatieren der URL automatisch zu machen. Mein Fork von Telly ist unter meinem Github Account zu finden: https://github.com/splattner/telly. Telly ist in Go geschrieben, die Änderungen die ich gemacht habe, sind relativ klein. Das könnte sicher noch etwas schöner gemacht werden, ich habs halt einfach auf meine Bedürfnisse angepasst. Im Repository befindet sich auch ein Dockerfile und der Docker Container dazu wird automatisch gebaut und steht auf Docker Hub zur Verfügung. Mit meiner Änderung kann dem Container neu die Umgebungsvariable UDPXY mit IP:PORT des udpxy Service angegeben werden und telly wandelt dann automatisch die Multicast URL’s in udpxy URL’s um, die Plex abspielen kann.

Plex verwendet anschliessend EPG Daten und verknüpft diese mit den Kanälen von TV7. Ich verwende hier Quickline als EPG Quelle, Plex findet allerdings auch weitere Anbieter in der Schweiz. Das Mapping zwischen TV7 Kanal und dem Quickline EPG musste ich teilweise manuell anpassen, da die Kanäle nicht immer ganz gleich heissen. Weiter sind in den Quickline EPG Daten auch nicht ganz alle Kanäle von TV7 vorhanden. Hier ist noch Optimierungspotential vorhanden (aber Init7 arbeitet wohl bestimmt schon an offenen EPG Daten 😉 )

Anschliessend zeigt Plex die einzelnen Kanäle mit den dazugehörigen EPG Daten an. Plex kann auch direkt Recordings von Filmen / TV Serien etc erstellen. Man kann z.B. automatisch alle Folgen einer TV-Serie aufnehmen.

Die Programme (oder Aufnahmen) kann ich anschliessen mit einem beliebigen Plex Client anschauen, z.B. auf meinem AndroidTV Player im Wohnzimmer. Allerdings muss man hier sagen, auch hier muss man sich etwas an Plex gewöhnen. Man wählt vielmehr die Sendung aus, die man sehen will und Plex spielt dan den ensprechenden Kanal ab. Wenn euer Plex Server aus dem Internet erreichbar ist, könnt ihr somit auch von überall unterwegs TV7 schauen.

Hier noch ein paar Details wie meine Docker-Container laufen:

Telly, läuft bei mir mit Network = Host. Würde aber auch normal mit Bridge und Port-Mapping gehen. Bei mir verwende ich die folgenden Env Variabeln (ihr müsst das natürlich anpassen).

Mit DIRECTMODE = true sagt ihr telly, dass es direkt die UDPXY URL Plex mitteilen soll, damit wir ein unnötiges HTTP Redirect auf dem telly Server umgangen.

Udpxy muss wegen dem Multicast Stream mit Network = Host laufen. Hier werden keine speziellen env Variabeln verwendet. Ich verwende das folgende Image dafür: https://hub.docker.com/r/vistalba/udpxy/

PHP API für Mailman und OpenSource Volleyball-Vereinsmanager MyVBC

Kennt Ihr Mailman? Bei meinem Hosting Provicer Cyon kann ich Mailman für Maillisten verwenden. Aktuell nur in der Version 2.1.20, leider. Warum leider? Dazu komme ich gleich. Gerne stelle ich euch aber zuerst meinen OpenSource Volleyball-Vereinsmanager MyVBC vor.

Für den Volleyball Verein in dem ich engagiert bin (VBC Langenthal) habe ich schon vor längerem eine PHP Web-Applikation geschrieben um die ganzen administrativen Angelegenheiten des Vereins zu regeln. Dies insbesondere, da ich länger als Chef-TK tätig war und mir das Leben während einer Volleyball Saison so einfach wie möglich machen wollte. Irgendwann habe ich dann diese Web-Applikation auf Github unter dem Namen MyVBC veröffentlicht. MyVBC basiert auf einem sehr einfach, auch selbst geschriebenen, PHP Framework. Auch das habe ich der OpenSource Community via Github zur Verfügung gestellt. Den beiden Projekten fehlt es bestimmt noch einiges an Dokumentation damit sie jedermann benutzen kann. Insbesondere ist/war mein PHP Framework sehr stark mit MyVBC gekoppelt und speziell dafür entwickelt worden. Ich habe es erst später herausgelöst und als eigenständige Library eingebunden. Für ein stabiles, flexibles und mächtiges PHP Framework, gibt es viele andere PHP-Frameworks die besser geeignet sind. Auch in MyVBC gibt es noch einige Sachen, die man schöner, flexibler und robuster machen könnte. Primär sind die beiden Projekte auf meinen Use-Case zugeschnitten. Wenn jemand daran Interesse hat, feel free to use. Forkt das Projekt, stellt fragen und beteiligt euch.

MyVBC bietet unter anderen:

  • Eine Mitgliederverwaltung (Stammdaten wie Anschrift/ Adresse und was dazu gehört)
  • Eine Teamverwaltung um zu erfassen, welche Teams wir haben und insbesondere, wer in welchen Teams spielt.
  • Eine Lizenzverwaltung, damit unsere Teamverantwortlichen die Volleyball Lizenzen bestellen können.
  • Eine Spielverwaltung, um einen Überblick über unsere Spiele zu haben. Die Spieldaten werden hierbei automatisch via Schnittstelle unseres Verbandes Swiss Volley Region Solothurn sowie Swiss Volley eingetragen.
  • Eine Schreiberverwaltung, um unseren Spielen, einfach und schnell einen Schreiber zuzuweisen inkl. automatische Benachrichtigung via SMS. (Im Volleyball müssen die Spiele protokoliert werden, dazu werden die Schreiber benötigt).
  • Eine Schlüssenverwaltung, um um unsere diversen Schlüssen den Personen zuzuordnen.
  • Diverse Reports um einfache Auswertungen zu machen.

Hier ein paar Screenshots:

Wenn Ihr MyVBC ausprobieren wollt, könnt ihr alles dazu via Github herunterladen. Ich habe vor kurzen auch einen Installer/Updater für die Datenbank geschrieben. Wenn jemand Interesse hat, oder Mühe hat beim Ausprobieren, setzt euch einfach mit mir in Verbindung. Gerne versuche ich zu helfen. Ee hat sicher noch viel Verbesserungspotential. Übrigens, MyVBC lässt sich auch via Openshift z.B. auf Appuio betreiben. Ich werde versuchen, mal dazu noch etwas zu dokumentieren.

Zurück zu Mailman, unser Verein hat eine Mailliste um alle aktiven Mitglieder zu erreichen. Was liegt als näher, als die Daten aus MyVBC zu verwenden? Leider hat Mailman in der 2.x Version keine brauchbare Schnittstelle. Deshalb habe ich dazu eine einfache PHP API geschrieben. Auch diese findet ihr auf Github. Die API mach HTTP Request auf die Mailman Admin Webseiten. Mit Hilfe von etwas HTTP Response und HTML Parsing kann ich so die Cookie Authentifizierung abgreifen, den CSRF-Token der Forms hohlen und damit via PHP API Interface Member in der Mailliste verwalten. Eine Anleitung dazu findet Ihr im README auf Github. Die PHP API habe ich nur mit Version 2.1.10 von Mailman getestet! Keine Garantie, dass es für alle Versionen geht. Insbesondere hängt die API stark von HTML Layout ab um auf die Daten zuzugreifen. Somit werden nun endlich die Mitglieder automatisch mit Mailman abgeglichen.