Programme zeitgesteuert starten mit at und timeout

… und damit Internet-Radio aufzeichnen

Ja, ich will tatsächlich einen Live-Stream zu einer bestimmten Zeit rippen. Dafür gibt’s Tools wie streamripper (für MP3-Stream) und yt-dlp (für alles andere einschließlich AAC über HLS), doch die wollen zu einer bestimmten Zeit gestartet und wieder gestoppt werden. Zumindest streamripper kann sich per entsprechender Option auch selbst wieder beenden, aber yt-dlp läuft, wenn der Stream nicht von sich aus endet, endlos weiter.

Für’s Starten dachte ich zuerst an cron, aber wenn es nicht um wiederkehrende Aufgaben, sondern um ein einmaliges Starten geht, geht es auch einfacher mit at.

Bei at ist zu beachten, dass der auszuführende Befehl über die Standardeingabe an at gesendet wird und die Ausgabe standardmäßig von at über sendmail versendet wird. Wenn das nicht installiert oder konfiguriert ist, kann man das Verhalten mit der Option at -M ausschalten. Falls die Ausgabe der gestarteten Programme interessiert, kann man die auch in ein File umleiten.

Für’s Beenden gibt es den Befehl timeout, der nach einer definierten Anzahl von Sekunden einen Prozess killt. Für meinen konkreten Fall, das Beenden der Aufzeichnung von yt-dlp, musste ich noch die Option timeout --signal=2 mitgeben, damit yt-dlp nicht abgeschossen, sondern über das gleiche Signal, das einem Strg+C an der Kommandozeile entspricht, beendet wird. Nur dann schließt yt-dlp den angefangenen Stream korrekt ab und es entsteht ein fertiges (in meinem konkreten Fall .mp4-) File.

Zur Vereinfachung hier das Ganze fertig in Skripte gesteckt, wo direkt schon mal die URLs für das Web-Radio von hr2 drin stehen. Das atq am Ende zeigt den aktuellen Stand der Queue an, näheres steht in der Manpage zu at.

Bei der Gelegenheit sollte man übrigens noch mal dringen prüfen, ob die Zeitzone richtig eingestellt ist und das ggf. mit sudo timedatectl set-timezone "Europe/Berlin" (oder was auch immer für eine Zeitzone gewünscht wird) nachholen.

Beispiel für streamripper:

#!/bin/sh                                                                                           

# Starte eine Stream-Aufzeichnung mit streamripper zu einer definierten Zeit.                       

# Dazu wird "at" benutzt mit -M, weil at sonst versucht zu mailen...                                
# Einstellung der URL, der Dauer und der Zeit ueber Variablen.                                      
# duration in Sekunden, time HHMM, month engl. Abkuerzung                                           

url="https://dispatcher.rndfnk.com/hr/hr2/live/mp3/high"
duration=10920
time=1959
day=21
month=MAR
command="streamripper $url -a -A -l $duration"

echo $command
echo $command |at $time $day $month -M
atq

Beispiel für yt-dlp, was HLS kann, aber keinen eigenen Timeout hat:

#!/bin/sh                                                                                           

# Starte eine Stream-Aufzeichnung mit yt-dlp zu einer definierten Zeit.                             

# Dazu wird "at" benutzt mit -M, weil at sonst versucht zu mailen...                                
# Einstellung der URL, der Dauer und der Zeit ueber Variablen.                                      
# duration in Sekunden, time HHMM, month engl. Abkuerzung                                           
# Beachten: signal=2 beim timeout sollte dafuer sorgen, dass yt-dlp den Output fixt                 

url="https://hlshr2.akamaized.net/hls/live/2016534/hr2/master.m3u8"
duration=10920
time=1959
day=21
month=MAR
command="timeout --signal=2 $duration yt-dlp $url"

echo $command
echo $command |at $time $day $month -M
atq

Über das zeitgesteuerte Aufnahmen von Internetradio mit at und yt-dlp steht auch was in dem Blogartikel „Internetradio zeitgesteuert aufnehmen mit yt-dlp“ von Wolfgang Kirk.