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. In der Senderlistendatei sind bekannte Info-/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.

Mp3splt-GTK

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

Verweise auf aktuelle Seite