Hi,
ich schreibe mal ein paar kurze Erfahrungen bezüglich automatischen EPG-Holens. Das war ein langsamer Lernprozess, den ich schrittweise mit euch teilen möchte.
Erstmal: Die Kiste läuft aus Energiekostengründen nicht 24/7. Eher ziemlich selten, es klaffen also öfter mal große Lücken im EPG. Ziel war es nun, das EPG automatisch holen zu lassen, sodass VDRAdmin seine Autotimer setzen kann und ich dennoch keine Aufname verpasse. LinVDR wollte ich aus verschiedenen Gründen nicht einsetzen und somit ging die Bastelei los...
Idee 1:
Als noch VDR-Anfänger dachte ich mir damals, warum nicht für die wichtigsten Transponder tägliche Timer programmieren, die jeweils 1 Minute aufnähmen und deren Aufnahmen beim Runterfahren automatisch gelöscht würden?
Es bieten sich z.B. Uhrzeiten wie 2:00 Uhr bis 2:01 Uhr, 2:01 Uhr bis 2:02 Uhr usw. an. Der Name der Aufnahme muss immer gleich sein, so kann man sie am besten automatisch löschen lassen. Also z.B. "EPG-Scan". Wichtig ist auch, die Priorität so klein wie möglich zu wählen.
Nun schreibt man noch in die vdrshutdown oben eine Zeile nach dem Motto
hinein. Fertig. VDR und NVRAM-Wakeup erledigen den Rest. Leider gibt es auch ein kleines Problem: Da VDRAdmin nur beim Start und dann alle 10 Minuten die Autotimer aktualisiert (es sei denn man macht es manuell), kann es schon einmal passieren, dass einige Einträge nicht beachtet werden. Das passiert in unserem Fall, da der VDR nur kurz läuft.
Zusammenfassung:
Vorteile:
- Absolut idiotensicher, da kein großes Gefrickel mit Script (mal von der einen Zeile abgesehen)
Nachteile:
- VDRAdmin bekommt u.U. nicht alles mit (vor allem bei Sendern, die weniger als 48h EPG-Daten haben),
- sieht im Timer-Menü unschön aus.
Idee 2:
Die stammt hier irgendwo aus dem Board (zusammengepflückt aus verschiedenen Postings). Ist aber nicht zu empfehlen! Ich werde erklären, warum.
Ausgehend von obigem Problem, dass der VDRAdmin also hinterherhinkt, wurde die vdrshutdown so verändert:
case $PIPESTATUS in
0) lilo -R Linux
(wget "http://127.0.0.1/vdradmin.pl?aktion=force_update" -T 30 -O /dev/null;
shutdown -h now) &
$SVDRPCMD MESG Aktualisiere Autotimer... &
exit 0
;;
1) lilo -R PowerOff
(wget "http://127.0.0.1/vdradmin.pl?aktion=force_update" -T 30 -O /dev/null;
shutdown -r now) &
$SVDRPCMD MESG Aktualisiere Autotimer und setze Aufwachzeit... &
exit 0
;;
2) # something went wrong
# don't do anything - just exit with status 1
exit 1
;;
esac
Alles anzeigen
Das bewirkt, dass die Autotimer beim Runterfahren aktualisiert werden (VDRAdmin muss ohne Benutzername/Passwort funktionieren). Eigentlich logisch und eine einfache Lösung? Aaaber: Beim Aufruf des Shutdownscriptes hat VDR ja schon die nächste Aufwachzeit übergeben! Eventuell danach dazukommende Timer ändern daran auch nichts mehr. Daher wird man auch hier, wenn es hart auf hart kommt, Aufnahmen verpassen.
Idee 3:
Jetzt bleibt eigentlich nur noch, ein Script zu schreiben, dass den EPG-Scan-Vorgang automatisiert. Und wenn man das macht, dann gleich richtig (auch nicht auf meinem Mist gewachsen, aber aus dem Board zusammengekratzt und stark modifiziert). Zu meiner Verteidigung muss ich sagen, dass das im VDR 1.3 enthaltene EPG-Scan-Feature nicht funktioniert (nur eine DVB-Karte, das mag der Grund sein).
Also das Script epgscan:
#!/bin/bash
SVDRPCMD=/usr/local/src/VDR/svdrpsend.pl
$SVDRPCMD MESG "EPG-Scan wird durchgeführt..."
$SVDRPCMD CLRE
$SVDRPCMD CHAN +
$SVDRPCMD CHAN - > svdrp.chan
lastchannel=`cat svdrp.chan | awk '/^250/ { print $2 }'`
rm svdrp.chan
OLDIFS=$IFS
IFS=$'\t'$'\n'
for i in `grep '^[A-Z]' /etc/vdr/channels.conf | awk -F ':' '{print $2$3$4":"$1}' | sort -nu | awk -F ':' '{print $2}'`; do
$SVDRPCMD CHAN $i;
sleep 10;
done
IFS=$OLDIFS
$SVDRPCMD CHAN $lastchannel
$SVDRPCMD MESG "EPG-Scan beendet. Aktualisiere Autotimer..."
wget "http://127.0.0.1/vdradmin.pl?aktion=force_update" -T 30 -O /dev/null
$SVDRPCMD HITK Power
Alles anzeigen
Das Script scannt alle Transponder durch (keinen doppelt), wartet dazwischen 10 Sekunden und schaltet am Ende den alten Kanal wieder ein, bevor es VDRAdmin dazu anweist, die Autotimer zu aktualisieren und den VDR anschließend herunterfährt.
Dazu muss der VDR natürlich schon laufen. Das erreicht man über diese Zeilen in der vdrshutdown (der obere Teil macht was ganz anderes, nämlich verhindern, dass man den VDR bei z.B. laufendem NOAD runterfährt, das ist vielleicht aber auch ganz nützlich, deshalb poste ich es gleich mit):
CMD_LST="noad transcode vcdimager mencoder tosvcd lame tcmplex"
for x in $CMD_LST
do
if (pidof $x >/dev/null) ; then
echo "$SVDRPCMD HITK Power" | at now + 5 minutes >/dev/null 2>&1
$SVDRPCMD MESG Shutdown wegen $x um 5 Minuten verzögert & exit 1
fi
done
timer=$1
night=`date -d "2:00" +%s`
[ $night -lt `date +%s` ] && night=$(( $night + 24*60*60 ))
[ $timer -eq 0 ] && timer=$night
[ $night -lt $timer ] && boottime=$night || boottime=$timer
$NVRAMCMD --syslog --settime $boottime
Alles anzeigen
Die letzten 6 Zeilen sind ein Ersatz für den schon vorhandenen NVRAM-Aufruf. Sie bewirken, dass der VDR nachts um 2 Uhr angeht, auch falls der nächste Timer erst später käme. Genauer gesagt geht der VDR um 1:55 Uhr an, aber damit er den EPG-Scan dann auch wirklich um 2 Uhr ausführt, braucht man noch diese Zeile in der crontab:
So, dass ist der aktuelle Stand in meinem System. Ideen werden aber gerne angenommen.