Hallo zusammen,
ich habe mich gestern mal hin gesetzt und ein KSH-Script geschrieben, welches automatisiert den Tatort aus der Mediathek herunterladen soll.
Mein Ziel ist es, dem PI einfach täglich dieses Script ausführen zu lassen, so dass ich immer den neusten Tatort auf der Platte habe.
Das funktioniert auch so weit gut, daher wollte ich das Script einfach mal mit Euch teilen.
Man kann sicherlich noch einiges optimieren, bisher scheint es aber seinen Zweck zu erfüllen.
Bei Fragen oder Anregungen, bitte direkt melden.[/code]
Code
#! /bin/ksh
#benoetigt: ksh awk
#optional: notify-send
#variabeln
mediathek="http://mediathek.daserste.de/suche?searchText=tatort&topRessort=-&sort=date"
thetvdb="http://thetvdb.com/?tab=seasonall&id=83214&lid=14"
datetime=$(date "+%Y-%m-%d_%H")
date=$(date "+%Y-%m-%d")
filename="mediathek_${datetime}.htm"
filenameTVDB="thetvdb_${date}.htm"
filenameMediaJSON=""
videoname=""
mediathekDL=""
dlfolder="$HOME/video/TV Shows/Tatort"
echo "--$0--"
echo "--$(date "+%Y-%m-%d %H:%M:%S")--"
#Argumente abgreifen
#d = directory to save files
#i = id for movie
#r = remote directory to save files if connected (e.g. usb drive)
#v = url to direct download #not done yet
while getopts "d:i:r:v:" opt; do
#
case $opt in
d)
echo "--Directory: $OPTARG--"
dlfolder="$OPTARG"
;;
i)
documentId="$OPTARG"
filename=${filename}_${documentId}
echo "--documentId: $documentId--"
;;
r)
if [ -d "$OPTARG" ]; then
dlfolder="$OPTARG"
fi;
;;
v) echo $OPTARG
exit 1
;;
\?)
echo "Unbekannte Option: -$OPTARG"
;;
esac
done
# Parameter umshiften erforderlich, da -wc etc sonst $1 waeren.
shift $((OPTIND - 1))
if [ ! -d "${dlfolder}" ]; then
mkdir -p "${dlfolder}";
fi;
cd "${dlfolder}"
if [ -f $filename ]; then
echo "--${filename} already exists--"
fi
#Mediathek aufrufen
wget -q "${mediathek}" -O "${filename}" >/dev/null
#Fehler beim Aufruf
if [[ $? > 0 ]]; then
echo "-2: $? Fehler beim Aufruf der Mediathek: ${mediathek}" >&2
exit 2
fi
echo "--${filename}--"
if [[ ${#documentId} == 0 ]]; then
#index(in, find)
#substr(string, start, length)
#Document ID wird fuer den Download benoetigt
documentId=$( awk '{
v=index($0,"Video-tgl-ab-20-Uhr");
i=index($0,"documentId");
if (v>0 && i>0) {
s=substr($0,i+11,10);
d=substr(s,0,index(s,"&")-1);
print d;
exit;
}
}' $filename);
if [[ ${#documentId} == 0 ]]; then
echo "-3: Keine Videos gefunden" >&2
exit 3
fi
#Staffelname / Folge
saesonname=$( awk '{
v=index($0,"Video-tgl-ab-20-Uhr");
i=index($0,"Tatort/");
h=index($0,"Hörfassung");
if (v>0 && i>0 && h == 0) {
s=substr($0,i+7);
d=substr(s,0,index(s,"-Video-tgl-ab-20-Uhr")-1);
print d;
exit;
}
}' $filename);
else
#Staffelname / Folge
saesonname=$( awk '{
v=index($0,$documentId);
i=index($0,"Tatort/");
si=substr($0,i+7,50);
j=index(si,"Tatort-");
if (v>0 && i>0) {
if( j > 0 ) {
d=substr(si,j+7,29);
} else {
d=ssubstr(js,0,29);
}
print d;
exit;
}
}' $filename);
fi #documentId was filled
if [[ ${#saesonname} == 0 ]]; then
echo "-4: Kein saesonname gefunden." >&2
exit 4
fi
if [ -f "${saesonname}.done" ]; then
echo "-5: ${saesonname}: Video bereits geladen." >&2
exit 5
fi
echo "--'${saesonname}' gefunden. Starte Aufbereitung --"
start="${saesonname}"
touch "${start}.start"
saesonname=$(echo $saesonname | awk '{gsub("-"," "); print $0}')
if [[ ! -f "${filenameTVDB}" ]]; then
#TheTVDB aufrufen
wget -q "${thetvdb}" -O "${filenameTVDB}" >/dev/null
#Fehler beim Aufruf
if [[ $? > 0 ]]; then
videoname=${saesonname}
echo "$? Fehler beim Aufruf der TVDB: ${TheTVDB}. Verwende ${videoname}"
fi
fi
echo "--${filenameTVDB}--"
#Kompletten Seasonname suchen
#print "Tatort_" season "_" name ".avi";
#print "href:" href " season:" season " name:" name;
videoname=$( awk -vvname="$saesonname" '{
v=index($0,vname);
if (v>0) {
href=substr($0,index($0,"<a href=")+9)
href=substr(href,0,index(href,">")-2)
s=substr($0,index($0,href) + length(href)+2);
season=substr(s,0,index(s,"</a>")-1)
href=substr(s,index(s,"<a href=")+9)
href=substr(href,0,index(href,">")-2)
s=substr(s,index(s,href) + length(href)+2);
name=substr(s,href,index(s,"</a>")-1)
print "Tatort_S" season "_" name ".avi";
exit;
}
}' $filenameTVDB );
echo "--${videoname}--"
if [[ ${#videoname} == 0 ]]; then
videoname="${saesonname}.avi"
echo "$?: Videoname nicht in der TVDB gefunden. Verwende ${videoname}"
else
videoname=$(echo $videoname | awk '{gsub(" - ","_"); print $0}')
videoname=$(echo $videoname | awk '{
v=index($0," x ");
b=index($0,"_S")
season=substr($0,b+2,v-b-2)
begin=substr($0,0,v)
s=substr($0,length(begin)+3)
b=index(s,"_")
episode=substr(s,0,b-1)
s=substr(s,length(episode)+1)
if(length(episode) < 2) { episode=0 episode; }
print "Tatort_S" season "E" episode s
}')
videoname=$(echo $videoname | awk '{gsub(" ","_"); print $0}')
if [[ ${#videoname} == 0 ]]; then
echo "-5: Kein Videoname gefunden."
exit 5
fi
fi
echo "--${videoname}--"
mediathekDL="http://www.ardmediathek.de/play/media/${documentId}?devicetype=pc&features=flash"
filenameMediaJSON="mediaJSON_${documentId}.htm"
#Mediathe aufrufen
wget -q "${mediathekDL}" -O "${filenameMediaJSON}" >/dev/null
#Fehler beim Aufruf
if [[ $? > 0 ]]; then
echo "-10: $? Fehler beim Aufruf der Mediathek: ${mediathekDL}" >&2
exit 10
fi
echo "--${filenameMediaJSON}--"
mediathekDL=$( awk '{
v=index($0,"_quality");
if (v>0) {
s=$0;
while(length(s) > 0) {
s=substr(s,index(s,"_quality")+8);
d=index(s,":");
k=index(s,",");
q=substr(s,d+1,k-d-1);
if(q == 3) {
s=substr(s,index(s,"_stream")+10);
d=index(s,"\"");
json=substr(s,0,d-1);
print json;
}
}
d=substr(s,0,index(s,"_stream")+3);
exit;
}
}' $filenameMediaJSON);
if [[ ${#mediathekDL} == 0 ]]; then
echo "-11: Kein mediathek-Download gefunden." >&2
exit 11
fi
if [ -f "${videoname}" ]; then
echo "-12: ${videoname}: Video bereits vorhanden." >&2
exit 12
fi
#Video herunterladen
echo "Speichere ${videoname} nach '${dlfolder}'"
which notify-send
#notify-send is installed
if [[ $? = 0 ]]; then
notify-send "Speichere ${videoname}"
fi
wget -q "${mediathekDL}" -O "${videoname}.filepart" >/dev/null
#Fehler beim Aufruf
if [[ $? > 0 ]]; then
echo "-13: $? Fehler beim Aufruf der Mediathek: ${mediathekDL}" >&2
which notify-send
#notify-send is installed
if [[ $? = 0 ]]; then
notify-send "Fehler beim Aufruf der Mediathek: ${mediathekDL}. Siehe Protokolleintrag"
fi
exit 13
fi
mv "${videoname}.filepart" "${videoname}"
mv "${start}.start" "${start}.done"
echo "--${mediathekDL}--"
echo "--DONE--"
which notify-send
#notify-send is installed
if [[ $? = 0 ]]; then
notify-send "Tatort erfolgreich heruntergeladen"
fi
Alles anzeigen