Keine Lost-Folgen mehr verpassen

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:

  1. per Hand eintippen (Niemals!!!11)

  2. 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.

  3. 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.

  4. 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

XSLT ist eine Scriptsprache mit der man XML in anderes XML (in diesem Fall HTML) umwandeln kann. Mehr bei Wikipedia.

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.

Ich verlinke an dieser Stelle direkt auf mein Stylesheet. Wenn dieser Artikel also schon einige Wochen alt ist, kann sich das Stylesheet schon gehörig verändert haben.

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

  1. im Titel "Lost" stehen haben
  2. 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.


Comments closed

Sorry, new comments are no longer allowed for this entry.

Write me an email if you have feedback or any questions regarding this post. If you found this post useful and just want to say thank you then don't forget that I have an Amazon Wishlist. :-)


↑ to the elevators

© 2001—2010 Martin Mahner. This is an I ♥ Django Project.

Admin | Generated: Wed, 1 Sep 2010 16:27:11 +0200