Stream Recorder

Aus TV-Browser Wiki
Version vom 22. April 2017, 00:20 Uhr von TuxNix⧼word-separator⧽⧼parentheses⧽ ⧼parentheses⧽
⧼revision-nav⧽
Wechseln zu: Navigation⧼comma-separator⧽Suche

Stream Recorder ist ein Script zur zeitgesteuerten Aufnahme von TV Livestreams aus dem TV-Browser heraus.

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

#!/bin/bash


##### Programm: streamrecorder Version 0.1, April 2017

##### From TuxNix Lizenz 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=~/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
echo $sName

startZeit=$sStunde:$sMinute' '$sJahr-$sMonat-$sTag
endZeit=$eStunde:$eMinute' '$eJahr-$eMonat-$eTag

sysTime=`date --date='now' +%s`
sTime=`date --date="$sJahr-$sMonat-$sTag $sStunde:$sMinute" +%s`

if [ $operation == 'record' ] && [ $sysTime > $sTime ] ; then

    echo "Abbruch: Der Aufnahmebeginn liegt in der Vergangenheit!"
    exit 3
fi

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 im TV-Browser 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
  
    Monate=([1]=Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
   
    # Für den Fall, dass mittels TV-Browser die laufende Aufnahme gestestoppt wird.
    # Da der Stopp Job gelöscht wird, muss der Prozess mencoder abgebrochen werden, sonst läuft die Aufnahme ewig!
    if (( $sysTime > $sTime )) ; then
        killall mencoder
        echo "Die Aufnahme wurde beendet"
    else
        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
    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