ubuntuusers.de

UKW-Radio (FM-Radio) zeitgesteuert aufnehmen

Status: Gelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11325

Wohnort: Bremen

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

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11325

Wohnort: Bremen

Hi!

Kleine Nachtrag:

Bei "Sofort-Aufnahmen" kann's etwas eng werden, da die Abfragen im Skript sich mit dem Startzeitpunkt überschneiden können - und wenn das letzte Kontrollfenster aufscheint, während das Senderwechsel-Skript noch dabei ist, den Sender einzustellen, oder den gnome-sound-recorder zu starten, laufen die xte-Anweisungen ins Leere (Sprich: der Sender wird nicht richtig eingestellt, oder die Aufnahme nicht mehr gestartet, weil xte anscheinend immer das Fenster im Fokus bedient)... Also lieber eine Minute draufgeben.

Die Länge der Aufnahme im Skript ist als Test-Vorgabe mit 2 Minuten angegeben,

1
DAUER=`zenity --entry --title "Dauer" --entry-text "2" --text "Bitte die Aufnahmedauer in Minuten eingeben"` || exit 0

das kann bei -- entry-text natürlich auch geändert werden. Wer z.B. regelmäßig einstündige Sendungen aufzeichnen will, kann da auch gleich "60" reinschreiben.

Für die arecord-Version ist noch nachzutragen, dass das Audiodevice den eigenen Verhältnissen entsprechend angegeben werden muss, also bei

1
(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

statt hw:2.0 ggf. das tatsächlich verwendete Device eintragen! Auch die Puffergröße (--buffer-size) kann variieren; dieser Wert funktioniert bei mir ganz gut; ohne kam es ständig zu Puffer-Überlaufen, und daraufhin gab arecord dann auf...

so long
hank

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11325

Wohnort: Bremen

Hi!

Um mich selbst zu zitieren:

Heinrich Schwietering hat geschrieben

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?

Geht jetzt auch: Die aus der Liste ausgelesene Variable $SENDER (z.B. "Funkhaus_Europa 3") wird in eine Textdatei ausgegeben; aus der lese ich dann per cut den ersten Teil (Funkhaus_Europa) als SENDERNAME und den zweiten Teil (3) als SENDERNUMMER aus. Die Textdatei wird daraufhin sofort wieder gelöscht; die "geteilte" Variable kann ich für den Dateinamen und als Übergabevariable für das Senderwahlskript benutzen. Dort muss natürlich der Wert in der Zählschleife auf ${1} gesetzt werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# UKW-Radio Aufnahme-Skript Autor Heinrich Schwietering (c) 2009
# http://forum.ubuntuusers.de/topic/ukw-radio-fm-radio-zeitgesteuert-aufnehmen
MCD=/usr/bin/gnome-sound-recorder
USER=~/Gnomeradio-Aufnahme
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
echo $SENDER &> ~/.gnomeradio/Sender
SENDERNUMMER=`cat ~/.gnomeradio/Sender | cut -d " " -f 2`
SENDERNAME=`cat ~/.gnomeradio/Sender | cut -d " " -f 1` && rm ~/.gnomeradio/Sender
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"/"$SENDERNAME"-"$DAY"-"$TIME".mp3` || exit 0
echo "DISPLAY=$DISPLAY ~/.gnomeradio/Schleife1.sh "$SENDERNUMMER"" | 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: $SENDERNAME\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

Das ganze jetzt auch im Wiki: Baustelle/Skripte/UKW-Radio zeitgesteuert aufnehmen.

so long
hank

Antworten |