Angeregt durch das "tv.sh"-Script, das einige Kanäle anzeigt, hab ich selbst mal ein kleines Skript zusammengefrickelt, das in "Conky" die aktiven Timer anzeigt (in der Grundeinstellung 7 Stück).
Auch wenn es nicht gerade schnell ist, läßt es sich sehr gut z. B. über einen Aufruf wie ${execi 300 ~/.conky/scripte/vdr_timer.sh} in .conkyrc aufrufen.
Durch anhängen einer Zahl, kann man bestimmen, wie viele Zeilen ausgegeben werden. Durch anhängen von "max" ohne Anführungszeichen werden alle aktiven Timer ausgegeben. Wer Lust hat mehr zu verändern, kann anhand der Kommentare halbwegs nachvollziehen, was das Skript tut und es selber in einem Terminal ausprobieren.Falls jemand sogar eine Idee hat, wie man das Problem mit der gleichen Startzeit in den Griff bekommt oder wie das ganze insgesamt effektiver oder eleganter geht - ich bin nun mal nicht so der "Skripter" - her damit!Mit dem kleinen Scriptzusatz "Freiraum" habe ich versucht die Ausgabe der Timer an einer Achse auszurichten.
so ungefähr sieht die Ausgabe aus:
... heute um 16:42 Uhr -> Heiter bis tödlich: Alles Klara ~ Der allerletzte Zeuge
... heute um 19:08 Uhr -> Der Hundeprofi ~ 2014.09.27-19:10-Sa
... heute um 19:15 Uhr -> ARTE Journal
28. September 19:15 Uhr -> ARTE Journal
28. September 19:30 Uhr -> Karambolage ~ Magazin
29. September 08:30 Uhr -> X:enius ~ Was ist warum wie lange haltbar?
29. September 18:29 Uhr -> nano
#!/bin/bash
#
# NAME=vdr_timer.sh
PORT=$( grep "^SVDRP_PORT=" /usr/lib/vdr/config-loader* 2>/dev/null | sed 's/^SVDRP_PORT=//' | head );
k=$1 #Anzahl der auszugebenden Zeilen (die Zahl die nach dem Script eingegeben wird)
i=0 # Zählvariable initialisieren
akt_timer=$( svdrpsend -d localhost -p $PORT LSTT | grep "^250.[0-9]* [^0]:" | sed -e 's/:/#/8;s/#.*$//' | sed -e 's/^250.[0-9]* [^0]:[0-9]*://') # aktive Timer in Variable
WTimer=$( echo "$akt_timer" | sed -e "s/^.......@//g" | grep "^.......:" ); # Wöchentliche Timer in Variable
sort_zeit[0]=0 # ersten Arraycounter füllen
t1="Serie~"; t2="Filme~"; t3="T.glich~"; t4="Doku~"; t5="~[0-9]*\.[0-9]*\.[0-9]*-*.*"; t6="video~"; t7="~.*agazin.*" ; t8="~.*elt von mo.*" ; t9="~Krimi von.*" ; t10="~Folge [0-9].*"; t11=",.* [0-9][0-9][0-9][0-9]" #überflüssige Begriffe die ausgenommen werden
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
freiraum() # die unterschiedlichen Leerräume vor den Timern anhand des Monats festlegen
{
case $(date --date @${unixzeit[$i]} +%m) in
01|08) leer=" " ;; 02|10) leer=" " ;; 03) leer=" " ;; 04) leer=" " ;; 05) leer=" " ;; 06) leer=" " ;; 07) leer=" " ;; 09) leer="" ;; 11) leer="" ;; 12) leer=" " ;; *) leer=" " ;; esac
}
wochentimer()
{
WTagNr=(M...... .T..... ..W.... ...T... ....F.. .....S. ......S)
case $(date +%u) in 1) WTage=(0 1 2 3 4 5 6);; 2) WTage=(6 0 1 2 3 4 5);; 3) WTage=(5 6 0 1 2 3 4);; 4) WTage=(4 5 6 0 1 2 3);; 5) WTage=(3 4 5 6 0 1 2);; 6) WTage=(2 3 4 5 6 0 1);; 7) WTage=(1 2 3 4 5 6 0);;
esac
for i in ${WTage[@]}; do WTage[$i]=`date +"%Y-%m-%d" -d "+ ${WTage[$i]} days"` ; done # die Wochentage im Array formatieren
for i in {0..6}
do
WT_temp=$(echo -e "$WTimer" | sed -e "s/^${WTagNr[$i]}/${WTage[$i]}/g" | grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}:")
WT_plus=$(echo -e "$WT_plus\\n$WT_temp")
done
akt_timer=$(echo -e "$akt_timer\\n$WT_plus"); # die WTimer rausfischen
}
sortierte_timer() # Aktive Timer sortiert nach & ab Datum in Variable schreiben
{
sort_timer=$(echo "$akt_timer" | grep -oE "@?[0-9]{4}-[0-9]{2}-[0-9]{2}:[0-9]{4}.*" | sort | sauber | head -n $k)
}
sauber() # bereinigen der Sortierten Timer
{
sed -e "s/^.*\://;s/$t1//;s/$t2//;s/$t3//;s/$t4//;s/$t5//;s/$t6//;s/$t7//;s/$t8//;s/$t9//;s/$t10//;s/$t11//;s/~/ ~ /;s/"/\"/;s/&/\&/"
}
kleinstesdatum()
{
sort_zeit+=($( echo "$akt_timer" | grep -oE "[0-9]{4}-[0-9]{2}-[0-9]{2}:[0-9]*" | sort | head -n $k )) # Zeilen mit Timern sortierten & Startzeit ins Array
echo
for ((i=1; i<=$k; (i++) )); do # in Unix Zeitstempel umwandeln & ins Array
unixzeit[$i]=$(date -d "$(echo ${sort_zeit[$i]} | sed -e 's/\:\([^:]*\)$/ \1/' -e :a -e 's/ \(.*[0-9]\)\([0-9]\{2\}\)/ \1:\2/;ta')" +%s)
done
}
zeit() # bestimmen wann der Startzeitpunkt des Timers ist und der Ausgabezeile voranstellen
{
if [ `date +"%s"` -ge ${unixzeit[$i]} ]; then
echo -ne " ... seit `date --date @${unixzeit[$i]} +"%H:%M Uhr ->"` "
elif [ `date +%d%m%Y` -eq `date --date @${unixzeit[$i]} +"%d%m%Y"` ]; then
echo -ne " ... heute um `date --date @${unixzeit[$i]} +"%H:%M Uhr ->"` "
elif [ `date --date="yesterday" +%d%m%Y` -eq `date --date @${unixzeit[$i]} +"%d%m%Y"` ]; then
echo -ne " ... gestern um `date --date @${unixzeit[$i]} +"%H:%M Uhr ->"` "
elif [ `date --date='tomorrow' +%d%m%Y` -eq `date --date @${unixzeit[$i]} +"%d%m%Y"` ]; then
echo -ne " ... morgen um `date --date @${unixzeit[$i]} +"%H:%M Uhr ->"` "
else
echo -ne "$leer `date --date @${unixzeit[$i]} +"%d. %B %H:%M Uhr ->"` "
fi
}
erzeugen() # zeilenweise zum vorangestellten Startzeitpunkt den dazugehörigen Timer ausgeben
{
for ((i=1; i<=$k; i++)); do
freiraum; zeit; echo "$sort_timer" | sed -e "$i"q -e '$!d' # Ausgabe mit "sed" wie Head & Tail
done
}
ktest() # abfragen ob ein Wert übergeben wurde
{
zeilen=$( echo "$akt_timer" | sed -e $= -n -e '$q' ) # Anzahl der zu lesenden Zeilen (nur aktive Timer)
if [ -z $k ]; then k=9 ;fi
if [[ $k =~ ^-?[0-9]+$ ]] ; then
if [ $k -gt $zeilen ];then k=$zeilen ; echo " Es gibt nur $zeilen aktive Timer"; ping localhost -c 3 1>/dev/null;
else k=$k;
fi
elif [ $k = "max" ] ; then k=$zeilen ; echo " Es gibt $zeilen aktive Timer"; ping localhost -c 3 1>/dev/null;
else k=9 ;
fi
}
main()
{
wochentimer; ktest; sortierte_timer
kleinstesdatum; erzeugen
exit 0
}
#######################################################
main
exit 0
Display More