Hi!
Hab's jetzt einigermaßen hinbekommen, UKW-Radio-Sendungen (nicht Internet, nein, ganz altmodisch UKW... 😇 ) per Skript zeitgesteuert auszusuchen und auf die Platte zu bannen.
Man benötigt natürlich eine FM-fähige Karte, außerdem die Programme Gnomeradio, Zenity, das Paket xautomation und den gnome-sound-recorder (der ist aber immer installiert). Außerdem muss man sich eine Liste der Radiosender anlegen, die mit Gnomeradio gehört werden können; erst der Name des Senders (ohne Leerzeichen darin!), dann eine Leerstelle, dann die Position auf der Liste der Gnomeradio-Presets; z.B. so:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Bremen_1 1 Hit_Radio_Ant._NiedSa 2 Funkhaus_Europa 3 Bremen_4 4 Deutschlandfunk 5 NDR_2 6 DeutschlandRadio 7 NDR_1_Niedersachen 8 NDR_Info 9 NDR_Kultur 10 Radio_ffn 11 ENERGY_Bremen 12 Radio_Weser_TV 13 NordwestRadio 14 |
Das folgende Skript ermöglicht es, den gewünschten Sender, den Aufnahmetag, die Zeit und die Dauer der Aufzeichnung festzulegen; außerdem den Speicherort und Namen (voreingestellt ist das Verzeichnis ~/Gnomeradio-Aufnahmen/"Sendername (NR.)-Tag-Zeit"):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/bin/bash # UKW-Radio-Aufnahme-Skript Autor Heinrich Schwietering (c) 2009 # http://forum.ubuntuusers.de/post/2109350 MCD=/usr/bin/gnome-sound-recorder USER=~/Gnomeradio-Aufnahmen DISPLAY=:0.0 zenity --help > /dev/null || { echo "Fehler: Du benötigst \"zenity\" um dieses Script nutzen zu können." && exit 1 ; } test -e $MCD || { zenity --error --text "Fehler: Du benötigst \"gnome-sound-recorder\" um dieses Script nutzen zu können." && exit 1 ; } test ! -e ~/.gnomeradio/Sender.lst && zenity --error --text "~/.gnomeradio/Sender.lst wurde nicht gefunden" && exit 1 SENDER=`cat ~/.gnomeradio/Sender.lst | cut -d " " -f 1,2 | zenity --list --title "Bitte Sender auswählen" --column "Sender:"` || exit 0 test "$SENDER" || { zenity --error --text "Es wurde kein Sender ausgewählt." && exit 1 ; } DAY=`zenity --calendar --title "Aufnahmedatum" --text "Bitte das Datum der Aufnahme festlegen"` || exit 0 TIME=`zenity --entry --title "Aufnahmestart (HH.MM)" --text "Bitte den Startzeitpunkt der Aufnahme festlegen" --entry-text "$(date --date="1 minutes" +%H.%M)"` || exit 0 DAUER=`zenity --entry --title "Dauer" --entry-text "2" --text "Bitte die Aufnahmedauer in Minuten eingeben"` || exit 0 FILE=`zenity --file-selection --save --confirm-overwrite --title "Name und Ort zum Speichern auswählen" --filename="$USER"/"$SENDER"-"$DAY"-"$TIME".mp3` || exit 0 echo "DISPLAY=$DISPLAY ~/.gnomeradio/Senderwahl.sh "$SENDER"" | at $TIME $DAY &> /tmp/recerror test $? -gt 0 && zenity --error --text "$(cat /tmp/recerror)" && rm /tmp/recerror && exit 1 (echo "killall $MCD" && echo mv /tmp/gsr*.* "\"$FILE\"") | at $TIME $DAY+$DAUER minutes &> /tmp/recerror1 test $? -gt 0 && zenity --error --text "$(cat /tmp/recerror1)" && rm /tmp/recerror1 && exit 1 zenity --info --text "Sender: $SENDER\nBeginn: $DAY, $TIME Uhr\nDauer: $DAUER Minuten, Dateiname: $FILE\n\nStatus: OK\n$(cat /tmp/recerror)\n$(cat /tmp/recerror1)\n\n\nTermin mit \"atq\" im Terminal überprüfbar;\n\mit \"atrm 'jobnr'\" löschbar!" test -e /tmp/recerror && rm /tmp/recerror test -e /tmp/recerror1 && rm /tmp/recerror1 |
Es erstellt at-Jobs die zur dem Start/Endzeit ausgeführte werden. Die eigentliche Aufnahme wird duch das Senderwahl.sh-Skript geregelt, das ich in ~/.gnomeradio hinterlegt habe (ist aber letztendlich egal, muss halt im Skript oben angepasst werden):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/bin/bash count=1 gnomeradio & sleep 0.7 xte 'key Page_Up' while [ $count -le ${2} ] do xte 'key Down' count=$[$count+1] done sleep 1 gnome-sound-recorder & sleep 2 xte 'keydown Control_L' 'keydown R' 'keyup Control_L' 'keyup R' sleep 20 killall gnomeradio exit 1 |
Damit wird zur gewählten Zeit Gnomeradio aufgerufen, der gewünschte Sender eingestellt (geht so, und dann der gnome-sound-recorder angeschmissen, gleich mit Aufnahmefunktion. Da Gnomeradio bei mir eigentlich "nur" die Funktion hat, den Sender meiner TerraTec Cinergy Hybrid T USB XS FM einzustellen (die UKW-Wiedergabe funktiert nicht "wirklich", siehe auch hier), wird die Anwendung nach dem Start recht bald wieder gekillt; man kann aber sehen, ob tatsächlich der richtige Sender läuft.
Wenn die Zeit abgelaufen ist, wird die Aufnahme des Recorders in das angegeben Verzeichnis kopiert, z.B. als Funkhaus_Europa 3-16.08.2009-13.57.mp3.
Die Verwendung des gnome-sound-recorders hat den Vorteil, dass man sich dort sein gewünschtes Format selbst aussuchen kann (muss natürlich vorher erfolgen).
Es gibt auch eine Version, die den Stream mit arecord aufzeichnet, damit sind allerdings nur sehr wenige Formate realisierbar (eigentlich nur als Wave praktikabel, die Aufnahmen können da aber sehr schnell sehr groß werden; eine Minute schlägt mit 11 MB zu Buche; die Stunde braucht also schlappe 660 MB...):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/bin/bash # UKW-Radio-Aufnahme-Skript, arecord-Version; Autor Heinrich Schwietering (c) 2009 # http://forum.ubuntuusers.de/post/2109350 MCD=/usr/bin/gnome-sound-recorder USER=~/Gnomeradio-Aufnahmen DISPLAY=:0.0 zenity --help > /dev/null || { echo "Fehler: Du benötigst \"zenity\" um dieses Script nutzen zu können." && exit 1 ; } test -e $MCD || { zenity --error --text "Fehler: Du benötigst \"gnome-sound-recorder\" um dieses Script nutzen zu können." && exit 1 ; } test ! -e ~/.gnomeradio/Sender.lst && zenity --error --text "~/.gnomeradio/Sender.lst wurde nicht gefunden" && exit 1 SENDER=`cat ~/.gnomeradio/Sender.lst | cut -d " " -f 1,2 | zenity --list --title "Bitte Sender auswählen" --column "Sender:"` || exit 0 test "$SENDER" || { zenity --error --text "Es wurde kein Sender ausgewählt." && exit 1 ; } DAY=`zenity --calendar --title "Aufnahmedatum" --text "Bitte das Datum der Aufnahme festlegen"` || exit 0 TIME=`zenity --entry --title "Aufnahmestart (HH.MM)" --text "Bitte den Startzeitpunkt der Aufnahme festlegen" --entry-text "$(date --date="30 seconds" +%H.%M)"` || exit 0 DAUER=`zenity --entry --title "Dauer" --entry-text "2" --text "Bitte die Aufnahmedauer in Minuten eingeben"` || exit 0 LENGTH=($(($DAUER*60))) FILE=`zenity --file-selection --save --confirm-overwrite --title "Name und Ort zum Speichern auswählen" --filename="$USER"/"$SENDER"-"$DAY"-"$TIME".wav` || exit 0 (echo "DISPLAY=$DISPLAY ~/.gnomeradio/Senderwahl.sh $SENDER" && echo "arecord -f dat -D hw:2,0 -t wav -d $LENGTH --buffer-size 1000 \"$FILE\"" ) | at $TIME $DAY &> /tmp/recerror test $? -gt 0 && zenity --error --text "$(cat /tmp/recerror)" && rm /tmp/recerror && exit 1 zenity --info --text "Sender: $SENDER\nBeginn: $DAY, $TIME Uhr\nDauer: $DAUER Minuten, Dateiname: $FILE\n\nStatus: OK\n$(cat /tmp/recerror)n\n\nTermin mit \"atq\" im Terminal überprüfbar;\n\mit \"atrm 'jobnr'\" löschbar!" test -e /tmp/recerror && rm /tmp/recerror |
Das Senderwahl.sh-Skript muss dafür natürlich angepasst werden, damit der gnome-sound-recorder nicht aufgerufen wird:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/bash count=1 gnomeradio & sleep 0.7 xte 'key Page_Up' while [ $count -le ${2} ] do xte 'key Down' count=$[$count+1] done sleep 5 killall gnomeradio exit 1 |
Die sleep
-Werte im Senderwahl.sh müssen ggf. angepasst werden; hängt bei mir von der Auslastung der alten Kiste ab, können für "moderne" Rechner wahrscheinlich auch kürzer gewählt werden.
Eine (kleine) Sache hab' ich noch nicht hinbekommen: Beim Auslesen der Liste wird der Sender mit der Nummer ausgelesen; ich würde gerne die Nummer extra auslesen, dann braucht sie im Sendenamen nicht aufzutauchen, und an das Sendewahlskript könnte sie als erstes Argument übergeben werden. Ich hab' aber (noch) nicht herausgefunden, wie das zu realisieren wäre... Kann man die cut-Funktion so einsetzen, dass automatisch zwei Variablen (einmal SENDER (Feld 1 der ausgelesenen Listenzeile), einmal Sendernummer (Feld 2 der Liste)) ausgelesen werden?
Also: Viel Spaß beim Aufzeichnen!
so long
hank