Im Beitrag zu tatort-dl und dem Download von Beiträgen aus der ARD-Mediathek wurde ich gefragt, ob es denn sowas nicht auch für die ZDF-Mediathek geben würde. Im Netz habe ich dazu zwar vereinzelte Code-Schnipsel gefunden, aber kein komplettes Skript. Daher möchte ich euch an dieser Stelle zdf-dl vorstellen. Das Skript arbeitet ähnlich wie tatort-dl, es lädt die entsprechende Seite aus der ZDF-Mediathek per Curl runter, filtert den Stream raus und lädt ihn dann per mplayer herunter. Am Ende habt Ihr dann eine Video-Datei, die Ihr mit jedem Player abspielen könnt.

Für das Skript habe ich bei GitHub ein entsprechendes Repository eingerichtet, aus dem Ihr euch gerne bedienen könnt, das Skript ist unter der recht freien Apache License, Version 2.0 lizenziert. Ich würde mich freuen, wenn Ihr weitere Ideen entweder direkt in das Git einpflegt, oder euch in den Kommentaren einbringt. Vielleicht lohnt es sich ja mal die ganzen Skripte in einer mediathek-dl Bibliothek zusammenzufassen.

$ sudo apt-get install curl mplayer
$ wget https://raw.github.com/linuxundich/zdf-dl/master/zdf-dl -O ~/bin/zdf-dl
$ chmod +x ~/bin/zdf-dl

Die Installation des Skripts ist einfach: Holt euch das Skript aus dem Github, packt es nach ~/bin (legt das Verzeichnis an und startet euer Terminal neu, dann steckt das Verzeichnis umgehend in eurem $PATH) und setzt noch die entsprechenden Rechte. Danach könnt Ihr URLs aus eurem Browser dem Skript übergeben.

$ zdf-dl "http://www.zdf.de/ZDFmediathek/beitrag/video/1634214/heute-show-vom-04.05.2012?bc=sts;stm&flash=off"

Achtet aber bitte drauf URLs zur HTML-Version der ZDF-Mediathek zu nutzen. Aus der Flash-Variante lässt sich die URL zum Stream nur schwer generieren, daher funktioniert zdf-dl auch nur mit Links, die eben ein „flash=off“ enthalten. Das Skript generiert aus der URL einen Dateinamen, wer lieber selber Namen vergibt, der packt diesen einfach noch ans Ende des Kommandos.

$ zdf-dl "http://www.zdf.de/ZDFmediathek/beitrag/video/1634214/heute-show-vom-04.05.2012?bc=sts;stm&flash=off" heute-show.wma

Das Beispiel ist aufgrund der Depublizierung ja nur ein paar Tage gültig, aber ich denke Ihr wisst wohin der Zug geht. Die Anführungszeichen rund um die URL sind leider nötig, da in den URLs der Mediathek öfters mal ein Ampersand „&“ steckt, ohne die Anführungszeichnen interpretiert die Shell die Eingabe leider als foobar & und übergeht den Rest der Eingabe.

Die ZDF-Mediathek auf die HTML-Version umstellen.
Über zdf-dl landet dann zum Beispiel die heute-show auf der Festplatte.

Kleiner Tipp am Rande: Mit youtube-dl gibt es ein Kommandozeilen-Tool mit dem sich sehr bequem YouTube-Videos auf die Festplatte laden lassen. Das Programm kann aber deutlich mehr, als es der Namen vermuten lässt. Youtube-dl lädt auch Videos von anderen Video-Plattformen wie Vimeo oder MyVideo herunter. Zudem unterstützt das Programm auch diverse Mediatheken wie die der öffentlich-rechtlichen Sender ARD und ZDF. Allgemeine Flash-Videos diverse Videohoster holen Sie sich am besten direkt aus dem Zwischenspeicher auf die Festplatte: Flash Video Download Linux.

31 KOMMENTARE

  1. Prinzipiell eine nette Idee. Praktisch kann man aber zwei Dinge schöner machen:
    – Die per rtmp ausgelieferte Datei hat eine bessere Qualität als die .wmv-Datei
    – Die ZDFmediathek hat extra eine XML-basierte API ( http://www.zdf.de/ZDFmediathek/xmlservice/web/beitragsDetails?id=$1 ). Da braucht man dann nicht zu Screenscrapen sondern kann ein wohldefiniertes Format verwenden.

    Etwa so: http://paste.ubuntuusers.de/408042/

  2. Hallo Christoph
    Ich verfolge schon seit einer längeren Zeit deinen Blog und es gefält mir immer wieder die neuen Aspekte, die ich bei dir kennen lerne.
    So auch wieder heute… mit diesen kurzen Zeilen Code.

    Zur Verbesserung, die mir einfallen.
    1. Mehrfach auswahl bei der Qualität und Format, bei einem Stream mit 2 Qualitäten, übergibt das Skript zwei URL’s, die zweite verursacht einen Fehler
    Mein Vorschlag wäre dies mit einem Qualitäts-Schalter zurealisieren.

    grep -e "2000.*asx"
    #bzw
    grep -e "1000.*asx"
    #bzw für mov
    grep -e "1000.*mov"
    grep -e "2000.*mov"
    

    2. Durch die Ermitlung der ID könnte man auch die Flash-URL nehmen und ein ?flash=no dran hängen. Damit wäre es egal welche URL man verwendet.

    id=$(echo $url_noflash | grep -o -e "video/.*/")
    url="http://www.zdf.de/ZDFmediathek/beitrag/"
    url+=$id
    url+="?flash=off"
    

    Leider muss man dann den Namen wo anders herholen.

    Jonas

    Edit: Da war wohl jemand schneller. Die API kannte ich noch nicht.

  3. Versuche jetzt den gesamten Sonntag schon, ein Video der MDR Mediathek herunter zu laden. Habe MediathekView ausprobiert, aber das hängt sich mit einer Fehlermeldung auf. Die neueste BETA Version stürzt schon vor dem herunterladen ab. Habe ein paar Browserplugins und Kommandozeilen Tools probiert, aber komme nicht weiter. Hat irgend jemand eine Idee?

    Hier der Link: http://www.mdr.de/mediathek/fernsehen/a-z/video54350_zc-ea9f5e14_zs-dea15b49.html

    • Die MDRmediathek bietet ebenfalls eine XML-basierte API an. Dazu muss man die Video-ID kennen. Das ist in diesem Fall „video54350”. Die Adresse zur API lautet dann:
      http://www.mdr.de/mediathek/fernsehen/a-z/video54350-avCustom.xml

      Mit etwas grep-Magic bekommt man so einen Stapel voll URLs in unterschiedlicher Qualität:
      wget -q -O- http://www.mdr.de/mediathek/fernsehen/a-z/video54350-avCustom.xml | grep progressiveDownloadUrl | cut -d\> -f2 | cut -d\< -f1

      • Wow, danke für die schnelle Antwort! Hat mir wirklich geholfen. Mein Vater wollte den Beitrag ganz dringend für immer auf Festplatte bannen. 😉 Mitschnitt vom MDR kostet ja um die 40€, das ist für 25min ganz schön happig!

        Ich hab mir jetzt zwar schon den besten Stream herausgesucht, aber rein interessehalber: gibt es eine Möglichkeit automatisch den besten Stream auszuwählen? Also, kann man wget anweisen, den Stream mit der besten Qualität zu laden bzw. die größte Datei in dem Fall?! Hab mir eben mal die Hilfedatei angeschaut und nichts dergleichen gefunden. Vielleicht mit grep? Dazu müsste man dann aber irgendwie die Dateigröße aller Links ermitteln können… ?!

        • Das Teure am Mittschnittdienst der Fernsehsender ist, das tatsächlich händisch Mitschnitte kopiert werden müssen. Genau deswegen gibt es ja die Mediatheken und ihre (leider nicht dokumentierten) APIs.

          Die Download-Server geben an, wie groß die Datei ist. Theoretisch (als rein technisch gesehen) könnte wget eine Liste von URLs durchprobieren und die größte Datei komplett laden. Praktisch ist so eine Funktion nicht in wget implementiert.

          Wenn du einen Blick auf die genannte XML-Datei wirfst, siehst du, dass die Kindknoten von avDocument → assets, also die asset-Tags, ihrerseits ein Tag fileSize und ein Tag progressiveDownloadUrl enthalten. Das erstgenannte gibt die Dateigröße in Byte an, das zweite den Downloadlink. Es wäre möglich die XML-Datei entsprechend zu behandeln.

          Im vorliegenden Fall ist die größte Datei jedoch die zweite. Ein „sed -n 2p“ nach dem grep-Befehl würde nur diese Zeile ausgeben. Etwa:
          wget -q -O- http://www.mdr.de/mediathek/fernsehen/a-z/video54350-avCustom.xml | grep progressiveDownloadUrl | sed -n 2p | cut -d\> -f2 | cut -d\< -f1

          Im allgemeinen Fall ist diese Methode jedoch nicht immer verlässlich, weil die Reihenfolge der Links zu den unterschiedlichen Formaten ja nicht unbedingt fest sein muss. Bei Stichproben hat sich diese Heuristik jedoch als zutreffend erwiesen.

        • Hmm, wenn man jetzt das Script automatisch die Größte Datei auswhählen lassen könnte (abhängig von der Dateigröße, nicht von der Reihenfolge in der XML), könnte man das ganze als MDR-Script verpacken! 😉 Ich muss mich wirklich mal mit shell Befehlen/programmieren im Allgemeinen mehr auseinandersetzen. Komm mir immer so dumm vor fragen zu müssen. 😉

          Jedenfalls Danke für Deine Hilfe!

        • Wie gesagt. Bislang ist das beste Format immer das zweite in der Liste. Aber das ist nur eine Heuristik. Für den Anfang würde das eigentlich reichen.

  4. Also ich bin ein Anfänger und finde es tausend mal praktischer einfach via Wine 1.4.1 den Adobe Flash Player für Windows zu installieren, danach das kostenlose Programm StreamTransport…einfach alles viel hübscher und sooooo einfach 🙂 ! Danke nochmal an das WINE-Team, ihr seid klasse 😀 ich freue mich schon auf Wine 1.6 😉 !

  5. Hallo, ich habe das Skript modifiziert, so funktioniert es tadellos:

     mov_id=$(echo "${url_noflash}" | grep -oP "(?<=http://www.zdf.de/ZDFmediathek/beitrag/video/)[^/]+")
    echo "Film id: ${mov_id}"
     
    url_xmlfile=$(echo "http://www.zdf.de/ZDFmediathek/xmlservice/web/beitragsDetails?id=${mov_id}")
    echo "Pfad xml-Datei: ${url_xmlfile}"
     
    xmlfile=$(curl -s ${url_xmlfile})
     
    # Extract from xml-file the elements "formitaet", then search for "veryhigh", then for filename pattern
    url_stream=$(echo ${xmlfile}  | xmlstarlet sel -t -m '//formitaet' -v . -n | grep -n1 'veryhigh' | grep -o 'http://rodl.zdf.de/none/zdf[^"]*.m
    p4')
     
    # Get stream and save it to disk
    echo "Lade ${url_stream}  herunter, bitte haben Sie etwas Geduld..."
    wget -c ${url_stream}
    • Videos von illegalen Webseiten mit JDownloader herunterzuladen ist nicht „unkonventionell“ sondern gewöhnlich. Es ist sogar derart gewöhnlich, dass davon auszugehen ist, dass dein Artikel und dein Kommentar nur zwecks Suchmaschinenspam platziert wurden.

      Unkonventionell wäre es, Videos aus legalen Mediatheken aufzunehmen, indem man die Techniken auseinander nimmt und sich selbst überlegt, wie man das Video wegspeichert.