Wednesday 22 June 2016

Aktuelle Lindenstraße Folgen automatisch hernunterladen.

Seitdem die Website der Lindenstraße im November 2015 erneuert wurde, ist es schwieriger geworden, die Lindenstraße Folgen als video herunterzuladen. Früher konnte man die URL direkt zu den Videodateien im .flv Format rein aus der Nummer der Folge ermitteln. Nun geht das nicht mehr, und statt dessen muß man mehrere Webseiten und ein Java Skript parsen, um an die URL der Videodatei (nun im .mp4 Format) zu gelangen.

Das folgende shell script (POSIX compliant) dient dem automatischen Herunterladen der Lindenstraße Folgen, die von der ARD zum Download bereitgestellt werden.  Wenn Ihr es einmal wöchentlich von einer crontab aufruft, bekommt Ihr immer die letzte auf der Lindenstraße Website aktuelle Folge heruntergeladen.

Dieses Shell Script ist für Linux und andere Un*x-like Betriebssysteme.  Für Windoof User: Neuerdings gibt es unter Windows 10 eine Linux Bash Shell.  Das Shell Script läuft womöglich damit auch unter Windows, allerdings wurde dies bislang noch nicht getestet.  Ansonsten kann man das Skript auch unter cygwin laufen lassen.

Das Skript kann mit folgenden Argumenten aufgerufen werden:

[-q] [--res=N] [Folge]

Alle Argumente sind optional.

Wird keine Folgennummer als Argument mitgegeben, so lädt das Skript die neueste Folge herunter. Wenn eine Folgennummer angegeben wird, wird die entsprechende Folge, soweit auf der ARD Website vorhanden, heruntergeladen.

Mit der Option --res kann die Videoauflösung gewählt werden. Als Argument kann eine Zahl zwischen 1 und 3 angegeben werden, wobei 1 die höchste und 3 die niedrigste Auflösung ist.  Wird keine --res Option angegeben, so wird die Folge in der höchsten Auflösung heruntergeladen.

Die Option -q oder --quiet unterdrückt die Ausgabe (sinnvoll für Aufrufe aus einer crontab)

Die "savepath" variable könnt Ihr nach Bedarf anpassen (insbesondere bei Aufruf aus einer crontab). Ansonsten wird die Folge ins aktuelle Verzeichnis mit dem Prefix "lindenstrasse" gespeichert.

#!/bin/sh

base_url="http://www1.wdr.de"
path_url=$base_url"/daserste/lindenstrasse/"
videos=$path_url"videos/"
liste=$videos"videos-der-folgen-100.html"
index=$path_url"index.html"
savepath="lindenstrasse"

# Set resolution default value (first resolution in url)
resol=1
folge=""

usage () {
echo "Usage: $0 [-q] [--res=N] [Folge]" >&2
exit 1;
}

err () {
echo "wget or parse error" >&2
exit 1;
}

# NDP used as a counter to catch more than one non-option argument
NDP=0

while [ "$1" != "" ]; do
    PARAM=`echo $1 | awk -F= '{print $1}'`
    VALUE=`echo $1 | awk -F= '{print $2}'`
    case $PARAM in
 -h | --help)
     usage
     ;;
 -q | --quiet)
     qarg="-q"
     ;;
 --res)
     resol=$VALUE
     case $resol in
        ''|*[!1-3])
   echo "ERROR: Resolution must be a number between 1 and 3"
   usage
   ;;
     esac
     ;;
 *)
     case $NDP in
  0)
      NDP=$((NDP+1))
      folge=$PARAM
      ;;
  *)
      # if we are not here for the first time, there are too many non-option arguments
      usage
      ;;
            esac
            ;;
    esac
    shift
done

# no folge set - download latest
if [ -z "$folge" ]; then
 if ! [ "$qarg" == "-q" ]; then  echo "Downloading latest episode."; fi 
 href_tag=$(wget $qarg -O - $index | grep -B1 -m1 "zur aktuellen Folge" | tr -d "\n") || err
 folge=$(echo $href_tag | sed 's/.*Folge \([0-9]*\).*/\1/') || err
fi

case $folge in
    [1-9][0-9][0-9][0-9])
 href_tag=$(wget $qarg -O - $liste | grep -B9 -m1 "Folge ${folge}" | tr -d "\n") || err
 ;;
    *)
 echo "ERROR: Folge must be a number between 1000-9999"
 usage
 ;;
esac


# Test if $href_tag contains data
if [ -z "$href_tag" ]; then 
   if ! [ "$qarg" == "-q" ]; then
      echo "Folge ${folge} not found"
   fi
   exit 1;
fi

url=$base_url$(echo $href_tag | sed "s/.*<a href=\"\(.*html\).*/\1/") || err

#echo $url; exit


url=$(wget $qarg -O - $url | grep -o -m1 'data-extension.*}}' | grep -o 'http:.*\.js') || err


#url=$(wget $qarg -O - $url | grep -o '"alt":{"videoURL".*}' | grep -o 'http:.*\.mp4') || err

resol=$(expr ${resol} + 1 )

url=$(wget $qarg -O - $url | grep -o '"dflt":{"videoURL".*}' | grep -o -m1 'http:.*\.f4m' | cut -d',' -f1,${resol},5) || err

# need to translate like this
#http://adaptiv.wdr.de/z/medstdp/ww/fsk0/89/891425/,891425_9779266,.mp4.csmil/manifest.f4m
#http://ondemand-ww.wdr.de/medstdp/fsk0/89/891425/891425_9779266.mp4

url=$(echo ${url} | grep -o 'http:.*\.mp4' | tr -d ',' | sed 's/adaptiv/ondemand-ww/' | sed 's#z/##' | sed 's#ww/##') || err

if ! [ "$qarg" == "-q" ]; then
   echo "Downloading Folge: $folge"
fi

wget $qarg -O ${savepath}${folge}.mp4 $url || err