Proof of Concept - Automatischer Sendungsdownload von '7 Tage Ö1' mit einem *nix System.
Wichtig: Dies ist ein Proof of Concept und keine für den Einsatz gedachte Software. Mit einem kleinen Skript wird hier demonstriert, dass es theoretisch möglich ist einzelne Sendungen automatisiert herunterzuladen. Verwendet wurde für den Test OS X 10.9.1 Prinzipiell sollten die verwendete Befehlt aber auf allen anständigen *nix Systemen identisch funktionieren. Es ist nicht geplant eine Software wie MediathekView zu entwickeln.
1. Sendungsliste
Ein kurzer Blick in den Quelltext der Website zeigt, dass der Player mit JavaScript umgesetzt wurde. Besonders interessant ist der Link zu /programm/konsole/heute Ruft man die Seite oe1.orf.at/programm/konsole/heute auf so gibt die angezeigte Datei die Information Preis von welcher Quelle die Adressen für den Stream der Sendungen geladen werden: An oe1.orf.at/programm/konsole/tag/ ist eine achtstellige Zahl angehängt. Diese gibt das Datum der Sendungsliste in der Form Jahr Monat Tag an. Verfügbar sind die 8 Dateien mit diesem Aufbau. Der aktuelle Tag sowie der letzte Tag sind nicht komplett, da diese Streams erst hochgeladen bzw. wieder entfernt werden.http://oe1.orf.at/programm/konsole/tag/YYYYmmdd
2. Datum von Gestern
Die aktuellste Liste für einen kompletten Überblick über alle Sendungen eines Tages ist somit die Liste der Sendungen des Vortages. Daher macht es Sinn diese Liste einmal täglich abzufragen und nach den Links für die Streams zu durchsuchen. Das Datum lässt sich mit der Kommandozeile (unter OS X steht hierfür das Programm Terminal zur Verfügung) mit den Befehl date abfragen. Ausgegeben wird von diesem Programm die aktuelle Zeit auf dem Computer. (Wir gehen davon aus, dass wir uns in der selben Zeitzone wie der Sender befinden.) Uns interessiert das Datum des Vortages. Ein kurzer Blick auf die Hilfe (man date) zeigt die möglichen Argumente. Interessant hierbei ist die Option mit -v -1d die ausgegebene Zeit um einen Tag zurück zu setzen. Für die Ausgabe der Form YYYYmmdd muss noch +"%Y%m%d" an den Befehl angehängt werden.date -v -1d +"%Y%m%d"
3. Download mit curl
Natürlich ist es möglich sich die Links aus diesem File heraus zu kopieren und die verknüpften mp3-files herunterzuladen. In den nächsten Schritten soll dies automatisiert werden. Dazu macht es Sinn sich die Datei mit den Links einmal herunter zu laden und mit einem Editor näher anzuschauen. Für den download kann curl verwendet werden. Nach etwas scrollen in man curl findet sich die Option mit –o den heruntergeladenen Datenstrom in eine Datei zu speichern. Zusätzlich bietet sich an für ein Script noch den Output für den Fortschritt mit –s zu unterdrücken. Alternativ kann natürlich auch wget eingesetzt werden.curl -s http://oe1.orf.at/programm/konsole/tag/$GESTERN -o $GESTERNFILE
4. Script und Variablen
Obriger Befehl wird natürlich noch nicht funktionieren, da ja die Variablen $GESTERN und $GESTERNFILE noch nicht die entsprechenden Werte haben. Da noch einige Befehle dazukommen werden bietet sich an mit einem Texteditor der Wahl ein kleines Testskript zu erstellen. Wenn das Terminal schon offen ist, so bieten sich vi oder nano an. Im TextEdit sollte darauf geachtet werden, dass über Format -> In reinen Text umwandeln gewählt wurde. Nachdem bash die Standard-Shell ist, macht es Sinn diese für das Skript zu verwenden und in der ersten Zeile mit #!/bin/bash zu definieren. Als Dateiendung für spätere leichter Auffindbarkeit bietet sich .sh an. Um den curl Befehl zum Download ausführen zu können fehlt nur noch die Zuordnung der entsprechenden Werte an die Variablen. Das Script in der Datei test.sh könnte etwa so aussehen:#!/bin/bash
GESTERN=`date -v -1d +"%Y%m%d"`
GESTERNFILE=`echo "$GESTERN".txt`
curl -s http://oe1.orf.at/programm/konsole/tag/$GESTERN -o $GESTERNFILE
Zum Ausführen können entweder die entsprechenden Rechte mit chmod gesetzt werden oder das Script wird an sh übergeben:
sh test.sh
5. Auswahl mit grep
Ein übersichtliches Programm würde die Informationen auslesen und die Sendungstitel zur Auswahl geben. Wenn es nur um ein Proof of Concept geht, so reicht es einen beliebigen Titel auszuwählen. Um einzelne Zeilen aus einem File, die ein bestimmtes Suchmuster enthalten, zu exportieren, bietet sich grep an. Ein genauerer Blick auf die Adresse in der Zeile url_stream zeigt, dass diese sehr übersichtlich aufgebaut ist. Nach Datum, Uhrzeit, Sendungsnummer und Sendungsteil folgen Sendungstitel sowie eine Abkürzung. Reichen sollte somit der Sendungstitel inklusive führenden und beendenden _ um nicht mit anderen Beschreibungen in Konflikt zu geraten. Für die sonntägliche Sendung matrix - computer & neue medien wäre das Suchmuster etwa _matrix_grep '_matrix_' $GESTERNFILE
Die Ausgabe kann entweder direkt weiterverarbeitet oder in eine weitere Datei abgespeichert werden. Sollen mehrere Sendungen heruntergeladen werden so bietet sich Zweiteres an.
# Sendungslinks heraussuchen
# grep '_Sendungstitel_' $GESTERNFILE >> "$GESTERNFILE".tmp
grep '_matrix_' $GESTERNFILE >> "$GESTERNFILE".tmp
6. Downloadschleife
Für den Download selbst bietet sich wieder curl an. Allerdings müssen die Links noch von den zusätzlichen Informationen in der Zeile bereinigt werden. Dazu gibt es viele Möglichkeiten mit den unterschiedlichsten Programmen. Da der Aufbau immer identisch ist und die Links immer zwischen Anführungszeichen stehen kann cut verwendet und das 4. Feld zur Weiterverarbeitung ausgegeben werden. Zum Auslesen der Datei kann less verwendet werden.less "$GESTERNFILE".tmp | cut -d "\"" -f 4
Für den Download bietet sich an den Dateinamen aus dem Link zu verwenden. Das abschneiden der URL kann zum Beispiel mit egrep -o '20(.*)' erledigt werden. Da mehrere (oder keine) URLs heruntergeladen werden können, kann der jeweilige Download in einer while Schleife ablaufen.
less "$GESTERNFILE".tmp | cut -d "\"" -f 4 | while read -r DOWNLOADURL ; do
FILENAME=`echo $DOWNLOADURL | egrep -o '20(.*)'`
curl -s $DOWNLOADURL -o "$FILENAME".mp3
done
7. Aufräumen
Es wurden einige Dateien angelegt, die nach dem Download nicht mehr benötigt werden. Diese können mit rm direkt gelöscht werden.rm $GESTERNFILE "$GESTERNFILE".tmp
8. Das Skript
Das war es eigentlich auch schon. Das Skript mit ca. 10 Zeilen kann nun um Sendungslinks ergänzt werden und sollte 1 x Pro Tag aufgerufen werden.#!/bin/bash
GESTERN=`date -v -1d +"%Y%m%d"`
GESTERNFILE=`echo "$GESTERN".txt`
curl -s http://oe1.orf.at/programm/konsole/tag/$GESTERN -o $GESTERNFILE
# Sendungslinks heraussuchen
grep '_matrix_' $GESTERNFILE >> "$GESTERNFILE".tmp
less "$GESTERNFILE".tmp | cut -d "\"" -f 4 | while read -r DOWNLOADURL ; do
FILENAME=`echo $DOWNLOADURL | egrep -o '20(.*)'`
curl -s $DOWNLOADURL -o "$FILENAME".mp3
done
rm $GESTERNFILE "$GESTERNFILE".tmp
9. Dateityp und Umwandlung
Der Stream hat keine Dateiendung. Informationen über Format und Codierung gibt das Programm file aus. Zum Zeitpunkt des Tests war dies MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, JntStereo Soll der Inhalt stärker komprimiert werden kann lame verwendet werden. Dies ist bei OS X nicht standardmäßig installiert und muss zuerst heruntergeladen und kompiliert (wozu Xcode installiert sein muss) werden. lame können unterschiedliche Parameter übergeben werden, die die Stärke der Komprimierung angeben. Um eine tatsächliche Verkleinerung der Datei zu erreichen kommen aber nur -V7, -V8 oder -V9 infrage. Auch bei lame kann mit --quiet die Ausgabe der Aktivität unterdrückt werden. Die Umwandlung kann in die while Schleife eingebaut werden.10. crontab vs. launchd
Da das Script ja einmal pro Tag ausgeführt werden soll, macht es Sinn dies automatisiert zu erledigen. Auf Servern, die 7/24 laufen bietet sich an crontab zu verwenden. Nachteil ist jedoch, dass - sollte der Rechner zum Ausführungszeitpunkt nicht laufen – der entsprechende Tag einfach ausgelassen wird. Unter OS X wird daher die Verwendung von launchd empfohlen. Nähere Informationen zur Einrichtung – erraten siehe man crontab11. Bemerkungen
Die Formatierung und der Aufbau der Playlist sowie die entsprechenden Links können jederzeit geändert werden. Daher gibt es keine Garantie, dass das Script in dieser Form in Zukunft noch funktioniert. Sollte es sich nur um kleinere Änderungen handeln so ist auf dieser Seite das wichtigste Werkzeug um diese vorzunehmen.Das Script überprüft nicht die Korrektheit der heruntergeladenen Playlist oder ob diese überhaupt erhalten wurde. Daher führt ein fehlerhafter Download dieses Files zum Verlust der Sendungen eines Tages. Auch ein fehlerhafter oder abgebrochener Download eines Streams wird nicht bemerkt.
Natürlich wäre eine grafische Oberfläche für normale Anwender über die einzelne Sendereihen ausgewählt werden können angenehm. Bei Verständnis der Funktionsweise, ist dies aber überflüssig.
Ob ein automatisierter Download und die Speicherung im Sinne des Anbieters ist, und in wie fern sich das mit Urheberrecht und Gewissen vereinbaren lässt, möge bitte jeder für sich selbst beantworten. An der geistigen Schöpfungshöhe des obrigen 10-Zeilers wage ich aber zu zweifeln ;)
Ziel war ein Proof of Concept zu erstellen - also die relative einfache Machbarkeit mit wenige Zeilen auf einem *nix System ohne der Installation von zusätzlicher Software - und somit zu zeigen, dass es relativ einfach möglich wäre ein Programm dafür zu schreiben.