Linux: Radiostream-Rekorder
Einleitung
Weil mir die grafischen Tools zum Aufnehmen/Mitschneiden von Internet Radiosendern nicht gefielen, ich meinen eigenen „Mitschnittservice“ wollte und ich das zwangsweise Depublizieren von Beiträgen des Öffentlich-rechtlichen Rundfunks für einen ungeheuren Skandal halte, habe ich mir ein 08/15 Skript geschrieben, das mit streamripper und at arbeitet, um MP3-Radiostreams zu rippen. In der Senderlistendatei sind bekannte Info- und Kultur-Sender des Öffentlich-rechtlichen Rundfunks enthalten. Natürlich kann man das Skript mit anderen Streams fahren.
Abfragen und Eingaben
- Sender, dessen Stream aufzunehmen ist
- Einfacher Abgleich mit Aufnahmearchiv
- Angaben für ID3 Tags
- URL zur Sendung
- Anfang- und Endzeitpunkt des Sendebeitrags
- Aufnahmedatum
- Kommando des at Jobs
Die Aufnahme erfolgt aufgrund der streamripper Optionen nicht in einzelne Trackdateien, sondern in eine MP3 Datei. Am Ende wird der erstellte at Job zur Kontrolle angezeigt. Für jede Datei erstellt das Skript ein kleines Shellskript, dessen Aufruf die abgefragten ID3 Taginhalte mit dem KDE/QT ID3 Tagging Programm Kid3 in die bearbeitete / geschnittene MP3 Datei überträgt. Wer das nicht benötigt, kommentiert die ID3 Abfragen und den Block zur Erstellung des Shellskripts aus.
Der Download mit streamripper funktioniert übrigens mit der -p proxy Option sehr gut per Privoxy und Tor, falls man Downloads anonymisieren möchte.
Schneiden von Aufnahmen
Zum Schneiden der Aufnahme hat sich mp3splt bzw. die mp3splt-GTK GUI mit Audacious als Player bewährt. Über die einfache Handhabung und Bedienung hat man in wenigen Minuten die Aufnahmedatei zurechtgeschnitten und das Ergebnis exportiert.

Da ich nicht über umfangreiche Shell Scripting Kenntnisse verfüge, kann man bestimmt ein paar Punkte verbessern. Vorschläge sind erwünscht.
Für den Einsatz werden zuerst die benötigten Anwendungen installiert:
sudo aptitude install audacious kid3-qt mp3splt-gtk streamripper
"radiostreamer" Skript
Beispiel:
~$ radiostreamer Senderliste: [1] BR2 [2] BR3 [3] DRadio Kultur [4] DLF [5] DRadio Wissen [6] HR2 Kultur [7] HR Info [8] MDR Info [9] NDR Info [10] NDR Kultur [11] RBB Info [12] RBB Kultur [13] RBB radioeins [14] SR2 Kultur [15] SWR Info [16] SWR2 Kultur [17] WDR 1Live [18] WDR3 [19] WDR5 Sender [Nr]: 10 Beitragstitel (keine Leerzeichen, sondern '_'): mühsam_briefe1 Suche im Archiv - folgende Aufnahmen wurden gefunden: Fortsetzen [y|n]? y Angaben für ID3 Tags: Titel: Anwalt der Verstoßenen - Briefe 1 Autor: Erich Mühsam Album: Am Abend vorgelesen Jahr: 2011 Genre: Lesung URL für Informationen zum Beitrag speichern [y|n]? n Beginn des Beitrags (HH:MM): 22:00 Ende des Beitrags (HH:MM): 22:35 Wann soll die Aufnahme erfolgen [h]eute, [m]orgen oder bestimmtes [d]atum?: h Kommando für Aufnahme-Job 254 Tue Mar 7 22:00:00 2011: streamripper http://ndrstream.ic.llnwd.net/stream/ndrstream_ndrkultur_hi_mp3 -l 2100 -d /opt/downloads/sound/streamripper -u WinampMPEG/5.59 -T -o never --codeset-filesys=UTF-8 --codeset-id3=ISO-8859-1 --codeset-metadata=ISO-8859-1 -a lesung_mühsam_briefe1 -A --xs2 && rm /opt/downloads/sound/streamripper/lesung_mühsam_briefe1.cue
#!/bin/bash # # Skript, um die Aufnahme von Internet Radiostreams per at jobs und streamripper zu "programmieren". # Zum Schneiden der Streamdatei kann z. B. mp3splt/mp3splt-gtk, zum Zusammenfügen z. B. mp3wrap, ffmpeg # und für das ID3 Tagging Kid3 oder EasyTag verwendet werden. Für eine grafische Übersicht/Info zu # weiteren Stationen streamtuner2. Informationen zu deutschsprachigen, öffentlich-rechtlichen Sendern # finden sich unter http://web.ard.de/radio/radionet/. # # Author: (no copyright) Kai Raven <kr@kairaven.de> http://wiki.kairaven.de/open/os/linux/streamrip # mit Modifikationen / Ergänzungen von Ralf Bell <ralf.bell@web.de> # Version: 0.7 27.06.2012 # Wo der Stream als MP3 Datei gespeichert wird outbasedir="/opt/downloads/sound/streamripper" # Wo die geschnittene MP3 Datei bzw. das dazugehörige ID3 Tagging Skript gespeichert wird outputdir="/opt/downloads/sound" # Wo Aufnahmen archiviert werden archivdir="/opt/aufnahmen/radio" # Stream Applikation (offensichtlich streamripper) # streamripper Optionen werden unter 'Programmierung' festgelegt streamer="streamripper" # Senderliste mit den Namen und Playlisten URLs der Sender # Neuzugänge in radiostreamer_sender eintragen senderliste=~/radio/radiostreamer_sender streamnr=0 streamax=$(cat $senderliste | wc -l) # Anzeige der Sender echo "" printf "Senderliste:\n\n" while read zeile do streamnr=`expr $streamnr + 1` sendername=`echo $zeile | cut -d'=' -f1` stream[$streamnr]=`echo $zeile | cut -d'=' -f2` echo [$streamnr] $sendername done < $senderliste # ''Programmierung'' # Senderauswahl echo "" printf "Sender [Nr]: " "$state" read state if [ "$state" -gt "$streamax" -o "$state" -lt "1" ] ; then printf "Keine Sender [Nr] von 1 - $streamnr gewählt, bitte neue Eingabe: " "$state" read state ; fi # Beitragstitel als Dateiname für die Aufnahme angeben (beitragstitel bzw. beitrags_titel). echo "" printf "Beitragstitel ('_' statt Leerzeichen): " "$beitrag" read beitrag # Einfache Abfrage, um Doppelaufnahmen zu vermeiden. echo "Suche im Archiv - folgende Aufnahmen wurden gefunden:" find $archivdir -type f -iname '*'$beitrag'*' -exec basename '{}' \.mp3 \; | sort echo "" printf "Fortsetzen [y|n]? " "$weiter" read weiter # Angaben für das ID3 Tagging Skript abfragen. # Bestimmung der Standardoptionen (srdefault) für streamripper. # Sollen Streams über Proxy geladen werden, in der srdefault Zeile -p http://ip:port/ # ergänzen oder http_proxy Variable nutzen. if [ "$weiter" = "y" ] ; then echo "" printf "Angaben für ID3 Tags:\n\n" printf "Titel: " "$TIT2" read TIT2 printf "Autor: " "$TPE1" read TPE1 printf "Album: " "$TALB" read TALB printf "Jahr: " "$TYER" read TYER printf "Genre: " "$TCON" read TCON && tcon=$(echo $TCON | tr 'A-Z' 'a-z') && \ srdefault="-d $outbasedir -u WinampMPEG/5.59 -T -o never --codeset-filesys=UTF-8 --codeset-id3=ISO-8859-1 --codeset-metadata=ISO-8859-1 -a "$tcon"_"$beitrag" -A --xs2 && rm $outbasedir/"$tcon"_"$beitrag".cue" ; else echo "Das Skript wird beendet." exit 0 fi # URL zur Webseite mit näheren Informationen zum Beitrag speichern echo "" printf "URL für Informationen zum Beitrag speichern [y|n]? " "$url" read url if [ "$url" = "y" ] ; then echo "" printf "URL für Information zum Beitrag eingeben: " "$info" read info echo "$info" > $outbasedir/"$tcon"_"$beitrag".url ; fi # Start- und Endzeitpunkt der Aufnahme echo "" printf "Beginn des Beitrags (HH:MM): " "$begin" read begin echo "" printf "Ende des Beitrags (HH:MM): " "$end" read end # für die Zeitdauer in Sek sek=$(($(echo "$end" | awk -F: '{print $1*3600+$2*60}')-$(echo "$begin" | awk -F: '{print $1*3600+$2*60}'))) # Datum der Aufnahme echo "" echo "Wann soll die Aufnahme erfolgen?" printf "[h]eute, [m]orgen oder bestimmtes [d]atum?: " "$datein" read datein if [ "$datein" = "h" ] ; then date="today" ; elif [ "$datein" = "m" ] ; then date="tomorrow" ; elif [ "$datein" = "d" ] ; then printf "Geben Sie das Datum (DD.MM.YYYY) ein: " "$date" read date ; fi # Erstellung des at jobs quelle=${stream[$state]} echo "$streamer $quelle -l $sek $srdefault" > /tmp/radio_at && \ at -f /tmp/radio_at "$begin" "$date" > /dev/null 2>&1 && rm /tmp/radio_at ; # ID3 Tagging Skript für Kid3 erstellen # Nach dem Schneiden der MP3 Datei ausführen. Öffnet die KDE/QT ID3-Tagging Programm Kid3 # auf der 2. Arbeitsfläche, das die ID3 Tags überträgt, speichert und danach wieder # beendet wird. printf "#!/bin/sh\n\n" > $outputdir/"$tcon"_"$beitrag"_id3.sh printf "kstart --desktop 2 --keepbelow --skiptaskbar --windowclass kid3-qt kid3-qt && \\" >> $outputdir/"$tcon"_"$beitrag"_id3.sh printf "\nsleep 5\n" >> $outputdir/"$tcon"_"$beitrag"_id3.sh printf "qdbus net.sourceforge.kid3 /Kid3 openDirectory $outputdir/"$tcon"_"$beitrag".mp3 && \\" >> $outputdir/"$tcon"_"$beitrag"_id3.sh printf "\nqdbus net.sourceforge.kid3 /Kid3 setFrame 2 TIT2 \"$TIT2\"\n" >> $outputdir/"$tcon"_"$beitrag"_id3.sh printf "qdbus net.sourceforge.kid3 /Kid3 setFrame 2 TPE1 \"$TPE1\"\n" >> $outputdir/"$tcon"_"$beitrag"_id3.sh printf "qdbus net.sourceforge.kid3 /Kid3 setFrame 2 TALB \"$TALB\"\n" >> $outputdir/"$tcon"_"$beitrag"_id3.sh printf "qdbus net.sourceforge.kid3 /Kid3 setFrame 2 TYER \"$TYER\"\n" >> $outputdir/"$tcon"_"$beitrag"_id3.sh printf "qdbus net.sourceforge.kid3 /Kid3 setFrame 2 TCON \"$TCON\" && \\" >> $outputdir/"$tcon"_"$beitrag"_id3.sh printf "\nqdbus net.sourceforge.kid3 /Kid3 save && qdbus net.sourceforge.kid3 /Kid3 quit\n\n" >> $outputdir/"$tcon"_"$beitrag"_id3.sh printf "exit 0\n\n" >> $outputdir/"$tcon"_"$beitrag"_id3.sh chmod 0750 $outputdir/"$tcon"_"$beitrag"_id3.sh # Info-Anzeige zum erstellten at Job. ajid=$(atq | sort | tail -n 1 | cut -f 1) echo "" echo "Kommando für Aufnahme-Job $(atq | sort | tail -n 1):" echo "" echo "$(at -c $ajid | tail -n 2)" ; exit 0
- radiostreamer_sender
BR2=http://streams.br-online.de/bayern2_2.m3u BR3=http://streams.br-online.de/bayern3_2.m3u DRadio Kultur=http://www.dradio.de/streaming/dkultur.m3u DLF=http://www.dradio.de/streaming/dlf.m3u DRadio Wissen=http://www.dradio.de/streaming/dradiowissen.m3u HR2 Kultur=http://metafiles.gl-systemhaus.de/hr/hr2_2.m3u HR Info=http://metafiles.gl-systemhaus.de/hr/hrinfo_2.m3u MDR Info=http://avw.mdr.de/livestreams/mdr_info_live_128.m3u NDR Info=http://ndrstream.ic.llnwd.net/stream/ndrstream_ndrinfo_hi_mp3 NDR Kultur=http://ndrstream.ic.llnwd.net/stream/ndrstream_ndrkultur_hi_mp3 RBB Info=http://www.inforadio.de/live.m3u RBB Kultur=http://www.kulturradio.de/live.m3u RBB radioeins=http://www.radioeins.de/live.m3u SR2 Kultur=http://streaming01.sr-online.de/sr2_2.m3u SWR Info=http://mp3-live.swr.de/contra_m.m3u SWR2 Kultur=http://mp3-live.swr.de/swr2_m.m3u WDR 1Live=http://www.wdr.de/wdrlive/media/einslive.m3u WDR3=http://www.wdr.de/wdrlive/media/wdr3.m3u WDR5=http://www.wdr.de/wdrlive/media/wdr5.m3u