Programmseiten im Web …

… gibt es wahrscheinlich wie Sand am Meer, aber für mich – wer nur mal schnell schauen will was läuft gerade oder was kommt am Abend – gibt es eigentlich nicht so viele. Meistens sind die Dinger mit Webung, Popup’s und Cookie-Abfragen überlastet das es einfach keinen Spaß macht diese aufzurufen.

Ich hatte mich dann vor Jahren auf tvtv.de eingeschossen. Jedenfalls hatte man nach 1,2 Klicks was ich brauchte – nicht optimal aber ausreichend. Leider war man der Meinung die Seite benötigt zum Jahreswechsel ein Re-Design und jetzt ist Feierabend mit schneller Übersicht.

Jetzt werden einige sagen, da gab es doch was im Forum mit RSS usw. – ja habe ich auch – aber die Übersicht finde ich leider auch nicht besonders toll und für das Spätprogramm (ab 22 Uhr) kann man es meiner Meinung nach komplett vergessen.

Programm via RSS für 20:15 Uhr
Programm via RSS für 22:00 Uhr

Eigentlich wollte ich schon immer die gleiche Ansicht wie moderne Fernseher liefern, d.h. eine tabellarische Übersicht mit allen Sendern bzw. den Sendern die man als Favoriten gespeichert hat.

Dabei bin ich auf ein Projekt bei github.com/iptv-org aufmerksam geworden. Dieses stellt für eine Vielzahl von Ländern die aktuellen EPG-Daten (Guide) zur Verfügung. Als ich mit dem Skript begonnen hatte, gab es pro Land immer eine Datei – leider wurde das jetzt pro Service aufgesplittet und liefert jetzt für Deutschland 19 XML Dateien 🙁 Dazu aber gleich mehr.

Allgemeines Zusammenspiel

In den xmltv-Dateien befinden sich 2 Arten von Informationen. Zum einen die Kanaldetails (channel) mit ID, Namen und Icon. Danach die reinen Programmdetails (programme) mit der Assoziation zur Kanal-ID. Das eigentliche Skript baut im Endeffekt aus den Informationen dann die Programmübersicht (-tabelle) zusammen.

<!-- Beispiel für eine Kanaldefinition -->
<channel id="BRFernsehenSud.de"><display-name>BR Fernsehen Sud</display-name><icon src="https://i.imgur.com/wfqDL6Z.png"/><url>https://horizon.tv</url></channel>
<!-- Beispiel für eine Sendung -->
<programme start="20230122180000 +0000" stop="20230122190000 +0000" channel="123tv.de"><title lang="de">Clever Wounder</title></programme>

Wie schon erwähnt, waren initial alle Programminformationen in einer de.xml Datei enthalten. Dementsprechend auch hunderte von Kanälen die ich alle gar nicht anschaue bzw. brauchte. Auch die hinterlegten Icons pro Kanal waren nicht immer sehr hübsch 😉

Dementsprechend habe ich mich entschieden eine Konfigurationsdatei einzuführen (channels.json). Darin wird für jede Channel-ID die Reihenfolge id (derzeit noch nicht ausgewertet), der name, das logo und die EPG-Quelle source festgehalten.

{
  "DasErste.de": {
    "id": 1,
    "name": "Das Erste",
    "logo": "/user/guide/img/ard.png",
    "source": "horizon.tv"
  },
  "ZDF.de": {
    "id": 2,
    "name": "ZDF",
    "logo": "/user/guide/img/zdf.png",
    "source": "hd-plus.de"
  },

  ......
}

Wie man am Beispiel sehen kann, wird auch die Quelle (EPG-Datei) mit berücksichtigt und ermöglicht so eine eineindeutige Zuordnung – weil – die 19 möglichen Anbieter überschneiden sich in ihrem Angebot 🙁

EPG-Daten und Setup-Datei bereitstellen

Wie vielleicht klar geworden ist, benötigt man die EPG-Daten (xmltv-Dateien) und die Setupinformation (json-Datei) damit das Skript überhaupt funktionieren kann. Wies sieht das jetzt praktisch aus …

pi:/var/lib/symcon/webfront/user $ cd guide/
pi:/var/lib/symcon/webfront/user/guide $ ll

drwxrwxrwx  5 root root 4096 13. Jan 19:25 .
drwxrwxrwx 19 root root 4096 13. Dez 09:26 ..
drwxrwxrwx  2 root root 4096 13. Jan 19:23 img
drwxrwxrwx  2 root root 4096 11. Jan 17:08 xml
-rw-rw-rw-  1 root root 7384 13. Jan 19:16 channels.json

Ich habe die ganzen Sachen ins webfront/user Verzeichnis gelegt. Kann man auch gern wo anders ablegen. Ich mach das immer so, damit man die Dateien halt über den IPS-Webserver abholen kann (z.B. später die Logo-Bilder).

pi:/var/lib/symcon/webfront/user/guide $ cd xml
pi:/var/lib/symcon/webfront/user/guide/xml $ ll
drwxrwxrwx 2 root root    4096 11. Jan 17:08 .
drwxrwxrwx 5 root root    4096 13. Jan 19:25 ..
-rw-rw-rw- 1 root root 1120707 21. Jan 10:25 hd-plus.de.xml
-rw-rw-rw- 1 root root 1752058 21. Jan 10:25 horizon.tv.xml

Im Hauptverzeichnis liegt die JSON-Setupdatei und in den Unterverzeichnissen xml die EPG-Daten und im img Verzeichnis die Logobilder.

Da in den xmltv-Dateien nur die Programminformationen für die nächsten 2,3 Tage beinhalten, müssen sie zyklisch abgeholt bzw. erneuert werden. Bei mir macht das ein kleines bash-Script mit wget, welches ich über ein tägliches Event in IPS (Teil des Skriptes) steuere. Dieses liegt im root Verzeichnis von IPS (/var/lib/symcon). Wenn man dann durch manuelle Recherche herausgefunden hat welche Sender von welchem Anbieter geliefert wird (bei mir horizont.tv und hd-plus.de) ist das schnell gemacht bzw. erweitert.

#!/bin/sh
DIR="/var/lib/symcon/webfront/user/guide/xml"
URL1="https://iptv-org.github.io/epg/guides/de/horizon.tv.xml"
URL2="https://iptv-org.github.io/epg/guides/de/hd-plus.de.xml"

# Datei nur holen wenn neuer als vorhandene (-N -P)
wget -N -P $DIR $URL1
wget -N -P $DIR $URL2

Hinweis:
Link zum downloaden des bash-Scripts, meine Senderkonfiguration und der Logos findet ihr am Ende des Artikels!

Das TV-Guide Skript

Zum Skript selber brauche ich eigentlich gar nicht so viel schreiben. Wenn man all die Dinge vorher korrekt eingerichtet hat und die entsprechenden Sender konfiguriert hat, sollte alles automatisch laufen. D.h. man lässt das Skript einmal in der Konsole laufen damit alle Variablen und Timer angelegt werden. Danach noch die EPG-Variable ins Webfront hängen und man sollte folgendes Ergebnis bekommen:

Script TV Guide
TV Guide Skript

Im Standard-Setup wird ein Zeitfenster von -1 Stunde bis +2 Stunden vom aktuellen Zeitpunkt auf 15 Minuten gerundet dargestellt.

# Time-Zone-Offset
$TZO = 3600;
# Zeitbereich auf x Minuten runden
$MIN = 15;
# Sekunden sind im xmlTV immer Null
$FMT = 'YmdHi00';
# EPG source files
$EPG = [
    'horizon.tv',
    'hd-plus.de',
];
# Source file extension
$EXT = '.xml';
# Bash Script, welches täglich die xmltv-Dateien abholt
$BSH = '../guide.sh';
# Channel Configuration File
$CHN = 'webfront/user/guide/channels.json';
# Verzeichnis, wo die xmltv Dateien liegen
$XML = 'webfront/user/guide/xml/';

Die Konfiguration im Skript beinhaltet ein paar Variablen, welche natürlich nur mit entsprechender Kenntnis verändert werden sollten.

Datei- und Verzeichnisstruktur
$BSH, $CHN und $XML sollten der eigenen Dateistruktur angepasst werden.

Ich glaube zwar das mit Horizont und HD-Plus alle nützlichen Sender vorhanden sind, aber man weiß ja nie 😉

EPG Anbieter
Solltet ihr noch andere Anbieter als meine schon vorausgewählten benötigen, dann das $EPG Array erweitern.

Da die EPG Daten in UTC geliefert werden, muss eine Stunde ($TZO) draufaddiert werden.

Zeiten und Formate
Änderungen an $TZO, $MIN und $FMT können das Skript unbrauchbar machen!

Was noch fehlt?

Derzeit wird die Übersicht aller 15 Minuten neu gebaut. Wenn man sich jetzt am Morgen das Abendprogramm anschauen will ist das noch nicht möglich. Da die Daten aber verfügbar sind ist ein schalten übers Webfront kein großes Hexenwerk und wird in einer der nächsten Versionen kommen.

HINWEIS
Voraussetzung für das Funktionieren des Skriptes ist aber die Verwendung bzw. Benutzung meiner IPS Skript Bibliothek!!!

Zusammenfassung

Ich hoffe ich konnte die allgemeine Vorgehensweise bis zum erhofften Ergebnis fehlerfrei darstellen. Wenn man die gleichen Sender verwendet wie ich, ist das glaube ich in einer Stunde gut zu schaffen. Das Raussuchen der Channel-IDs und der Abgleich mit den Anbietern kann schon etwas hakelig sein. Habe da aber auch keine Patentlösung zur Hand, derzeit muss man das leider händisch machen. Im schlimmsten Fall einfach fragen 😉

Fazit
Grundsätzlich bietet das Skript eine gute Voraussetzung für ein Modul. Aber der größte Anteil hätte dann wahrscheinlich die Konfiguration und das habe ich jetzt erstmal mittel bash-Skript und json-Konfig-Datei umgangen 🙂 Mal schauen was die Zukunft bringt.

Meine Bewertung:

Bereitstellung & Installieren

Über folgende URL gelangt man zum Repository auf GitHub
https://github.com/wilkware/ips-scripts/

Hier kann man sich die anderen Dateien runterladen!