Keine Lost-Folgen mehr verpassen
Geschrieben 1 Jahr, 9 Monate zuvor

Ich bin ein fanatischer Lost-Gucker und diesen Freitag startet endlich die dritte Staffel auf Premiere. Leider hat Premiere die Angewohnheit sehr, sehr oft Sendungen zu wiederholen und damit ich alle Sendungstermine im Überblick behalte habe ich mir einen kleinen Service gebastelt, der (täglich aktualisiert) alle Lost-Folgen der nächsten Woche anzeigt. Diesen Service findet ihr auf mahner.org/lost.
Ich denke auch, dass es viele interessiert, wie das ganze funktioniert. Deswegen gebe ich euch hier einen Überblick, wie ich diesen Service aufgebaut habe.
Die Fernsehdaten
Das ist das Problem überhaupt. Woher nimmt man die Fernsehdaten. Es gibt mehrere Möglichkeinte:
per Hand eintippen (Niemals!!!11)
Man kauft sich Daten. Datenanbieter gibt es genug und jeder Fernsehsender selbst stellt im Pressebereich seine Daten in irgendeinem Format zur Verfügung, meist auch nur gegen Entgeld. Da dieser Service aber schon garnicht Geld kosten soll, fällt diese Lösung aus.
Im Videotext-Stream vieler Sender (hierzulande Kabel1) findet sich ein spezieller Service "nexTView" der die Programmdaten fast aller deutschen Sender liefert. Dafür gibt es eine spezielle Software nexTView EPG der diese Daten ausliest und in vielen Formaten bereit stellt. Das hielt ich schon für den heiligen Gral aber leider funktioniert diese Software nur mit analogen TV-Karten, ich besitze nur eine digitale, damit fällt auch dieses aus.
Man schaut einmal auf Sourceforge ob nicht schon jemand anderes ein ähnliches Problem hatte und wie das bei Sourceforge so ist, man wird eigentlich immer fündig: xmltv ist ein Programm das genau für diesen Zweck entworfen wurde. Es grabbt die TV-Daten aus nicht genannten Quellen und packt alle in eine große XML-Datei. Dabei lässt sich penibel festlegen, welche Sender aus welchen Ländern gespeichert werden sollen. Genial!
Debian und ich denke auch viele andere Linux-Distributionen stellen xmltv übrigens auch als Paket zur Verfügung. In Debian lässt es sich einfach mit:
apt-get install xmltv
installieren. Typisch für Debian ist dieses Paket total veraltet, so dass ich nicht umhin kam es selbst zu kompilieren. Das lief aber problemlos und wer eine Fehlermeldung kommt, dass das XML::Writer-Paket zu alt ist, kann dieses auch nachinstallieren:
cpan install XML::Writer
xmltv gibt die Fernsehdaten leider nur für die nächsten 7 Tage zurück, für meine Zwecke reicht das aber aus. Das Resultat findet ihr unter service.mahner.org/tv/tv.xml. (Vorsicht, die Datei ist etwas über 2MB groß und mein Firefox hat es während des Downloads komplett aufgehängt.)
Es gibt übrigens ein Paket das diese Daten ohne Umwege aufbereitet und als Pseudo-Fernsehzeitung anzeigt: xsltvgrid. Ein Beispiel und damit meine persönliche Fernsehzeitung findet ihr unter service.mahner.org/tv.
Aufbereitung
Es gibt tausend-und-eine Möglichkeiten XML-Dateien zu verarbeiten. Normalerweise bevorzuge ich es, sich mittels DOM-Funktionen durch das XML zu arbeiten. Aber da ich in diesem Fall einfach nur XML in HTML umwandeln möchte ist das Mittel der Wahl XSLT. Wer aber unter chronischem Speichermangel auf seinem Server leidet – die XML-Datei erreicht je nach Anzahl der Sender und Land locker 5MB, die ja komplett im Speicher gelagert werden muss – sollte vielleicht auch einen SAX-Parser in Betracht ziehen.
Zurück zur Verarbeitung. Ein Teil der Programmdaten sieht wie folgt aus:
<programme start="20070323193000 +0100" stop="20070323201000 +0100" channel="premdirekt.tvtoday.de"> <title lang="de">Lost</title> <desc lang="de">Serienspecial - Lost: Die Geschichte vom Überleben</desc> </programme>
Dies liefert uns alle Daten die wir brauchen, die Start- und Endzeit sowie der Titel der Sendung. Für andere Sendungen gibt es unter Umständen auch noch Zusatzinformationen (eine längere Beschreibung, Namen der Schauspieler etc.), Premiere rückt aber für seine Sendungen nicht mit mehr Daten raus.
Und genau diese Daten sollen jetzt gefiltert werden und als Webseite wieder angezeigt werden. Dazu nutzte ich dieses XSLT-Stylesheet. Dieses filtert mir aus allen Sendungen die aus welche
- im Titel "Lost" stehen haben
- deren Sendername PremiereSerie ist (Prosieben sendet ja derzeit nicht)
Verarbeitung
Jetzt fehlt nur noch der letzte Schritt, die Verarbeitung der XML-Datei mit XSL. Ich verwende hier für meine Hompage das Framwork Django, was wiederum in Python geschrieben ist. Daher zeige ich hier auch nur wie sich das ganze in Django einbauen lässt. Die Umwandlung mit PHP geht aber mit Hilfe der XSLT-Funktionen ähnlich einfach.
Meine kleine Funktion benötigt 2 Pakete, libxml2 und libxslt1 welche sich aber problemlos über apt nachinstallieren lassen.
apt-get install python2.3-libxml2 apt-get install python2.3-libxslt1
Mein Templatetag in Django sieht dann wie folgt aus. (Es überprüft nicht, ob die beiden übergebenen Dateipfade stimmen und enthält auch sonst keinerlei Fehlerbehandlung, das müsste in Zukunft noch verbessert werden.)
import libxml2 import libxslt def transform(xmlfile, xslfile): styledoc = libxml2.parseFile(xslfile) style = libxslt.parseStylesheetDoc(styledoc) doc = libxml2.parseFile(xmlfile) result = style.applyStylesheet(doc, None) value = style.saveResultToString(result) return value register.simple_tag(transform)
Im Django-Template selbst wird diese Funktion direkt aufgerufen:
{% transform "/path/to/xml" "/path/to/xsl" %}
Der Rückgabewert ist dann die hübsche Lost-Seite.
Wie ich schon mehrmals *schnarch* erwähnt hatte, ist die XML-Datei recht groß und ich möchte es meinem schwachbrüstigen Webserver nicht zumuten, bei jedem Request den Vorgang erneut durchzuführen, daher ist Caching hier Pflicht! Derzeit werden die TV-Daten einmal Nachts aktualisiert und somit steht die Caching-Zeit der Lost-Seite auch auf 24 Stunden.
Bisher wurde noch kein Kommentar hinterlassen.
Keine neuen Kommentare für diesen Beitrag mehr möglich.







