Stream Recorder
Stream Recorder ist ein Script zur zeitgesteuerten Aufnahme von TV Livestreams aus dem TV-Browser heraus.
Inhaltsverzeichnis
Vorraussetzungen
- Internetanschluß
- Linux Pc
- at (Paket)
- mencoder (Paket)
Installation
Benötigt werden die Pakete at und mencoder.
Der at Dienst wird von systemd gesteuert. Zur Aktivuerung gibt man auf der Konsole sudo systemctl enable --now atd.service
ein.
Danach das Script kopieren und z.B. mit dem Namen (streamrecoder)
abspeichern. Mit (chmod a+rx streamrecorder)
wird das Script ausführbar gemacht.
Im Tv-Browser im Menu Extras > Aufnahmesteuerung > Geräte > Gerät-hinzufügen den Standardtreiber auswählen. Beim Eintrag Gerät kann ein beliebiger Namen angegeben werden.
Das Script (streamrecoder)
wird hier als "Applikation" angegeben.
Parameter für die Aufnahme:
record {start_hour} {start_minute} {start_year} {start_month} {start_day} {end_hour} {end_minute} {end_year} {end_month} {end_day} {channel_name} "{title}" {production_year}
Parameter für das Löschen:
delete {start_hour} {start_minute} {start_year} {start_month} {start_day} {end_hour} {end_minute} {end_year} {end_month} {end_day}
Bei den Einstellungen bitte nur eine Aufnahme gleichzeitig erlauben.
Die Sender URL der öffentlich rechtlichen Sender sind im Script gelistet (Stand April 2017). Man kann beliebig viele Sender hinzufügen. Die Namen der Sender sollte im TV-Browser und im Script übereinstimmen und sollten angepasst werden. Leerstellen im Sendernamen werden nicht unterstützt. Der Speicherort der Aufnahme ist auf ~/Video vor eingestellt und kann auf eigene Bedürfnisse angepasst werden.
Benutzung
Die Benutzung ist eigentlich selbsterklärend. Mit der rechten Maustaste wählt man eine Sendung aus. Mit der Linken Maustaste wird auf Aufnahme gedrückt. Das Script erlaubt nur die Aufnahme einer Sendung zur gleichen Zeit. Zum Rückgängig machen der Aufnahmejobs geht man entsprechend vor. Ein Dialogfenster von TV-Browser öffnet sich und gibt jeweils Auskunft über den Programmablauf.
Hintergrund
Zur Zeitsteuerung habe ich at ausgewählt. Cronie und systemd.timers hätten sich nicht so gut für diesen Zweck geeignet. Wer wissen möchte wie die Jobs gespeichert werden, kann auf der Konsole die Befehle atq, at -c <job> und atrm <job> mal ausprobieren. Für das eigentliche Streaming ist mencoder verantwortlich.
Viel Spaß damit TuxNix
Das Script
<nowiki>
- !/bin/bash
- Programm: streamrecorder Version 0.1 April 1017
- From TuxNix Lizens GPLv3 with no garanty at all.
- Parameter für Tv-Browser: Aufnahme
- record {start_hour} {start_minute} {start_year} {start_month} {start_day} {end_hour} {end_minute} {end_year} {end_month} {end_day} {channel_name} "{title}" {production_year} {episode_number} "{episode}"
- Parameter für Tv-Browser: Löschen
- delete {start_hour} {start_minute} {start_year} {start_month} {start_day} {end_hour} {end_minute} {end_year} {end_month} {end_day}
- benötigt die Programm-Pakete
- at
- mencoder
- User Konfiguration
recPath=~/MEDIEN/Videos/
- Das Script
args=("$@")
operation=${args[0]}
sStunde=${args[1]} if (( ${#sStunde} < 2 )) ; then
sStunde="0"${args[1]}
fi
sMinute=${args[2]} if (( ${#sMinute} < 2 )) ; then
sMinute="0"$sMinute
fi
sJahr=${args[3]}
sMonat=${args[4]} if (( ${#sMonat} < 2 )) ; then
sMonat="0"$sMonat
fi
sTag=${args[5]} if (( ${#sTag} < 2 )) ; then
sTag="0"$sTag
fi
eStunde=${args[6]} if (( ${#eStunde} < 2 )) ; then
eStunde="0"$eStunde
fi
eMinute=${args[7]} if (( ${#eMinute} < 2 )) ; then
eMinute="0"$eMinute
fi
eJahr=${args[8]}
eMonat=${args[9]} if (( ${#eMonat} < 2 )) ; then
eMonat="0"$eMonat
fi eTag=${args[10]} if (( ${#args[10]} < 2 )) ; then
eTag="0"${args[10]}
fi
Kanal=${args[11]}
sTitel=`echo ${args[12]} | sed 's/ /_/g'`
if (( ${#args[13]} > 3 )) ; then
sProdJahr="-${args[13]}"
fi
sName=$sTitel$sProdJahr #$sEpisNr$sEpis
echo $sName
startZeit=$sStunde:$sMinute' '$sJahr-$sMonat-$sTag endZeit=$eStunde:$eMinute' '$eJahr-$eMonat-$eTag
if [ $operation == 'record' ] ; then
if [ $Kanal == 'ARD' ] ; then stream_url='http://daserste_live-lh.akamaihd.net/i/daserste_de@91204/master.m3u8' echo "Sender: ARD" elif [ $Kanal == 'alpha' ] ; then stream_url="http://livestreams.br.de/i/bralpha_germany@119899/master.m3u8" echo "Sender: alpha" elif [ $Kanal == 'one' ] ; then stream_url="http://wdr_einsfestival-lh.akamaihd.net/i/wdr_einsfestival@328300/master.m3u8" echo "Sender: one" elif [ $Kanal == 'Tagesschau' ] ; then stream_url="http://tagesschau-lh.akamaihd.net/i/tagesschau_1@119231/master.m3u8" echo "Sender: Tagesschau" elif [ $Kanal == 'Arte' ] ; then stream_url="http://artelive-lh.akamaihd.net/i/artelive_de@393591/master.m3u8" echo "Sender: Arte" elif [ $Kanal == 'BR' ] ; then stream_url="http://livestreams.br.de/i/bfsnord_germany@119898/master.m3u8" echo "Sender: BR" elif [ $Kanal == 'DW' ] ; then stream_url="http://dwstream72-lh.akamaihd.net/i/dwstream72_live@123556/master.m3u8" echo "Sender: DW" elif [ $Kanal == 'hr' ] ; then stream_url="http://live1_hr-lh.akamaihd.net/i/hr_fernsehen@75910/master.m3u8" echo "Sender: hr" elif [ $Kanal == 'Kika' ] ; then stream_url="http://kika_geo-lh.akamaihd.net/i/livetvkika_de@75114/master.m3u8" echo "Sender: Kika" elif [ $Kanal == 'mdr' ] ; then stream_url="http://mdr_th_hls-lh.akamaihd.net/i/livetvmdrthueringen_de@106903/master.m3u8" echo "Sender: mdr" elif [ $Kanal == 'NDR' ] ; then stream_url="http://ndr_fs-lh.akamaihd.net/i/ndrfs_nds@119224/master.m3u8" echo "Sender: NDR" elif [ $Kanal == phoenix ] ; then stream_url="http://zdf0910-lh.akamaihd.net/i/de09_v1@392871/master.m3u8" echo "Sender: phoenix" elif [ $Kanal == 'rbb' ] ; then stream_url="http://rbb_live-lh.akamaihd.net/i/rbb_brandenburg@107638/master.m3u8" echo "Sender: rbb" elif [ $Kanal == '3sat' ] ; then stream_url="http://zdf0910-lh.akamaihd.net/i/dach10_v1@392872/master.m3u8" echo "Sender: 3sat" elif [ $Kanal == 'SR' ] ; then stream_url="http://live2_sr-lh.akamaihd.net/i/sr_universal02@107595/master.m3u8" echo "Sender: SR" elif [ $Kanal == 'SWR' ] ; then stream_url="http://swrbw-lh.akamaihd.net/i/swrbw_live@196738/master.m3u8" echo "Sender: SWR" elif [ $Kanal == 'WDR' ] ; then stream_url="http://wdr_fs_geo-lh.akamaihd.net/i/wdrfs_geogeblockt@112044/master.m3u8" echo "Sender: WDR" elif [ $Kanal == 'ZDF' ] ; then stream_url="http://zdf1314-lh.akamaihd.net/i/de14_v1@392878/master.m3u8" echo "Sender: ZDF" elif [ $Kanal == 'ZDFinfo' ] ; then stream_url="http://zdf1112-lh.akamaihd.net/i/de12_v1@392882/master.m3u8" echo "Sender: ZDFinfo" elif [ $Kanal == 'ZDFneo' ] ; then stream_url="http://zdf1314-lh.akamaihd.net/i/de13_v1@392877/master.m3u8" echo "Sender: ZDFneo" else echo "Abbruch: Der Sender $Kanal ist im Aufnahmeskript noch nicht gelistet" echo "Bitte Sendernamen auch in kaffeine ohne Leerzeichen eintragen" exit 1 fi
echo 'Erstelle at-Jobs' echo "mencoder $stream_url -vid 9 -oac pcm -ovc copy -o $recPath$sName.mp4" | at $startZeit echo "killall mencoder" | at $endZeit
elif [ $operation == 'delete' ] ; then
echo
Monate=([1]=Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
atq | grep "${Monate[${args[4]}]} ${args[5]} $sStunde:$sMinute:00 $sJahr" > atq.txt Job=`cut -f1 atq.txt` echo "Job $Job gelöscht" atrm $Job # Dies für den Fall, dass mittels kaffeine die laufende Aufnahme gestestoppt wird. # Da der Stopp Job der Prozess mencoder wird abgebrochen, sonst läuft er ewig! sysTime=`date --date='now' +%s` sTime=`date --date="$sJahr-$sMonat-$sTag $sStunde:$sMinute" +%s` if (( $sysTime > $sTime )) ; then killall mencoder echo "Die Aufnahme wurde beendet" fi atq | grep "${Monate[${args[9]}]} ${args[10]} $eStunde:$eMinute:00 $eJahr" > atq.txt Job=`cut -f1 atq.txt` echo "Job $Job gelöscht" atrm $Job
else echo 'Abbruch: Der Operator $operator ist nicht korrekt.' exit 2 fi exit 0 <\nowiki>