Du bist hier:Start»Linux»Radio

Radio 2.0

Wir schreiben das Jahr 2016 und noch immer wird Radio über analogen UKW-Funk gesendet. Da PolitikerInnen das analoge Radio immer noch nicht beerdigt haben, bleibt nur das Internet als digitales Radio zu nutzen. Im folgenden Beitrag schreibe ich, wie Webradio und die Playlists der "traditionellen" Radiosender unter Linux benutzt werden können. Zunächst einmal eine Tabelle mit Internetstreams von Radiosendern aus Berlin mit Stand vom 24.04.2016. (Die Radiosender vom RBB sind im Januar 2016 komplett auf Akamai umgestiegen.)

Berliner Radiosender im Netz

Radiosender Link / URL Bitrate (kbps) / Werbung
87,9 Star FM http://85.25.209.152:8000 128 / w
88,8 Radio Berlin http://rbb-mp3-radioberlin-m.akacast.akamaistream.net/7/70/292096/v1/gnl.akacast.akamaistream.net/rbb_mp3_radioberlin_m 128
89,6 Deutschlandradio Kultur http://stream.dradio.de/7/530/142684/v1/gnl.akacast.akamaistream.net/dradio_mp3_dkultur_m 128
90,2 Radio Teddy http://streams.ir-media-tec.com/radioteddy.mp3 128
91,4 Berliner Rundfunk http://stream.berliner-rundfunk.de/brf/mp3-128 128 / W
92,4 RBB Kulturradio http://rbb-mp3-kulturradio-m.akacast.akamaistream.net/7/935/292095/v1/gnl.akacast.akamaistream.net/rbb_mp3_kulturradio_m 128
93,1 Inforadio (RBB) http://rbb-mp3-inforadio-m.akacast.akamaistream.net/7/134/292094/v1/gnl.akacast.akamaistream.net/rbb_mp3_inforadio_m 128
93,6 Jam FM http://stream.jam.fm/jamfm-live/mp3-192 192
94,3 RS2 http://stream.rs2.de/rs2/mp3-128 128 / w
95,8 Radio Eins http://rbb-mp3-radioeins-m.akacast.akamaistream.net/7/854/292097/v1/gnl.akacast.akamaistream.net/rbb_mp3_radioeins_m 128
96,3 Funkhaus Europa http://funkhaus-europa.akacast.akamaistream.net/7/264/119440/v1/gnl.akacast.akamaistream.net/funkhaus-europa 128
97,7 Deutschlandfunk http://dradio_mp3_dlf_m.akacast.akamaistream.net/7/249/142684/v1/gnl.akacast.akamaistream.net/dradio_mp3_dlf_m 128
98,2 Radio Paradiso http://klang.center:8080/paradiso.bln.mp3 128
98,8 Kiss FM http://stream.kissfm.de/kissfm/mp3-128 128 / W
99,7 RBB Antenne Brandenburg http://rbb-mp3-antenneb-m.akacast.akamaistream.net/7/516/292092/v1/gnl.akacast.akamaistream.net/rbb_mp3_antenneb_m 128
100,6 Flux FM http://fluxfm.hoerradar.de/fluxfm-berlin 128
101,3 Klassik Radio http://klassikradio.hoerradar.de/klassikradio-live-mp3-hq 192 / W
102,6 Fritz http://rbb-mp3-fritz-m.akacast.akamaistream.net/7/799/292093/v1/gnl.akacast.akamaistream.net/rbb_mp3_fritz_m.mp3 128
103,4 Energy http://www.energyradio.de/berlin 96 / W
104,6 RTL http://stream.104.6rtl.com/rtl-live/mp3-192 192 / w
105,5 Spreeradio http://stream.spreeradio.de/spree-live/mp3-192 192 / W
106,0 Radio B2 http://mp3ad.radiob2.c.nmdn.net/ps-radiob2regional/livestream.mp3 128
106,8 Jazzradio http://streaming.radio.co/s774887f7b/listen 128
107,5 BB Radio http://streams.ir-media-tec.com/bbradio.mp3 128

Hier sind die Sender als Playlist zum Herunterladen.

Webradio in der Kommandozeile

Eine Seite mit Links zu Internetradios gibt es unter anderem im Wiki von Ubuntuusers oder in der Tabelle oben. Auch wenn es Programme mit grafischer Oberfläche fürs Internetradio gibt wie zum Beispiel Rhythmbox, benutze ich als Kommandozeilen-Freak lieber das Programm mplayer zum Aufnehmen und Abspielen von Webradio. In den folgenden Kommandozeilen bedeutet das Zeichen "#" eine Kommentarzeile. Zuerst muss der mplayer installiert werden. Bei Linux-Systemen mit dem Advanced Packaging Tool (apt) funktioniert die Installation folgendermaßen:

# install mplayer
sudo apt-get install mplayer

Webradio anhören

Nach der Installation von mplayer kann es mit dem Anhören losgehen. Hier ein Beispiel mit der Internetadresse von Radio Fritz in Berlin:

# set the URL of the internet radio
streamURL="http://rbb-mp3-fritz-m.akacast.akamaistream.net/7/799/292093/v1/gnl.akacast.akamaistream.net/rbb_mp3_fritz_m.mp3"

# play the stream with a buffer (cache) and non verbose
mplayer -quiet -cache 100 "$streamURL"

Zum Beenden von mplayer einfach q für Quit oder Control + C drücken.

Webradio speichern

Zum Speichern des Internetradios auf Festplatte kennt mplayer den Parameter dumpstream. Mit der folgenden Kommandozeile speichert mplayer den Internetstream in einer Datei mit Datum und Uhrzeit:

mplayer -dumpstream "$streamURL" -dumpfile $(date +"internetStream_%F_%H-%M-%S.mp3")

Aufnahme abspielen

Zum Abspielen der Aufnahme kann ebenfalls mplayer benutzt werden:

# for faster access you can use an alias:
alias m='mplayer'
m internetStream_*

# or use a graphical program like:
rhythmbox internetStream_*

Musik aus einer Aufnahme herausschneiden

Um ein Musikstück aus einer Radioaufnahme herauszuschneiden, gibt es unter Linux natürlich auch freie Software. Das Programm dafür nennt sich mp3splt (split MP3). Eine ausführliche Anleitung gibt es auf Sourceforge.

# example to cut 50 seconds from a webradio stream starting at 10 seconds

mp3splt internetStream_*.mp3 0.10 1.00

# this means cut from 10 seconds to the 1 minute position

Werbung stummschalten

Einige Radiosender schalten vor dem Internetstream noch Werbung - meistens aber nicht länger als 30 Sekunden. Auch dafür gibt es in Linux eine Lösung - am Beispiel von Radio Energy:

# example of radio station "energy"
streamURL="http://www.energyradio.de/berlin"

# create a first in first out queue (fifo) for mplayer
mkfifo /tmp/mplayer.fifo

# sleep 30 seconds in the background, then set the volume of mplayer to 100%
(sleep 30; echo "set_property volume 100" > /tmp/mplayer.fifo) &

# start mplayer mute and in slave mode
mplayer -volume 0 -slave -input file=/tmp/mplayer.fifo -quiet -cache 100 "$streamURL"

Alternativ könnte ein Internetstream mit vorgesetzter Werbung immer im Hintergrund mitlaufen und nur bei Benutzung die Stummschaltung aufgehoben werden. Allerdings wäre das Energieverschwendung (kleines Wortspiel).

Um die Berliner Radiosender nacheinander abzuspielen, ist die playlist-Option von mplayer hilfreich:

wget http://torsten-traenkner.de/linux/radio/radiostations_berlin.m3u
mplayer -quiet -cache 100 -playlist radiostations_berlin.m3u

Anschließend kann mit der Taste > zur nächsten Radiostation gesprungen werden.

Playlists der Radiosender herunterladen

Um die Playlist von einem Radiosender herunterzuladen sind keine Programmierkenntnisse erforderlich. Allerdings werden Kenntnisse über reguläre Ausdrücke (regular expressions) benötigt. Zunächst lädt das Programm wget die Playlist vom Webserver in eine temporäre Datei. Das Verzeichnis /dev/shm/ befindet sich im Arbeitsspeicher von Linux-Systemen und belastet somit die Festplatte nicht. Anschließend wird die Datei mit dem stream editor sed bearbeitet und mit grep gefiltert. Beginnen wir mit einem einfachen Beispiel von Jazzradio Berlin. Der folgende Block kann in einem Terminal mit Bash-Shell ausgeführt werden.

Playlist von Jazzradio Berlin herunterladen

Das folgende Shell-Skript lädt die Playlist mit den aktuell gespielten Titeln von Jazzradio.net herunter:

cat > downloadJazzradioPlaylist.sh <<EOF
#!/bin/bash

# download the playlist
wget -T 15 -q http://jazzradio.net/en -O /dev/shm/jazzradio.html

# check if download was success
if [ \$? -ne 0 ];then
  echo "Playlist download failed."
  exit 1
fi

# check if the string 'playlist last' exists
grep -q -i "playing last" /dev/shm/jazzradio.html
if [ \$? -ne 0 ];then
  echo "Playlist does not contain the string 'playing last'."
  exit 2
fi

# filter the web result
grep -m 1 -i "playing last" /dev/shm/jazzradio.html | sed 's|<[^>]*>|\'\$'\n|g' | grep -v "^[[:space:]]*\$" | grep -v -i "^playing last" | sed 'N;s/\n/ /'
EOF

chmod 755 downloadJazzradioPlaylist.sh

# start download
./downloadJazzradioPlaylist.sh

Mit wget wird zunächst die Webseite http://jazzradio.net/en heruntergeladen. Die Option -q bedeutet quiet - also ohne Ausschriften von wget. Die Option -T ist der Timeout zum Warten auf eine Antwort des Webservers. In diesem Fall wird 15 Sekunden auf die Antwort gewartet. Die heruntergeladene Webseite wird in der Datei /dev/shm/jazzradio.html gespeichert. Mit der folgenden if-Abfrage -ne 0 wird der Rückgabewert von wget überprüft. Ist der Rückgabewert nicht 0 (ne bedeutet not equal), dann kommt die Ausschrift, dass die Playlist nicht heruntergeladen werden konnte. Nach erfolgreichem Herunterladen wird mit grep auf die Zeichenkette "playing last" in der Datei gefiltert, wobei die Groß- und Kleinschreibung ignoriert wird. Ist die Zeichenkette vorhanden, dann ersetzt sed die Tags mit den spitzen Klammern (<>) durch "newlines" - also Zeilenumbrüche. Anschließend werden leere Zeilen und die Zeichenkette "playing last" weggefiltert. Wenn alles erfolgreich lief, sollten nur die Uhrzeiten und die Lieder der Playlist übrig bleiben.

Für weitere Fragen gilt wie üblich unter Linux RTFM - read the fine manual - also die schöne Anleitung lesen. Über die Kommandozeile lassen sich die Anleitungen mit folgenden Befehlen anzeigen:
man wget
man grep
man sed
Die Anleitung von sed enthält allerdings keine Anleitung zu regulären Ausdrücken. Einige Beispiele zu regulären Ausdrücken in sed mit Erklärung gibt es hier: http://sed.sourceforge.net/sed1line_de.html. Meistens benutze ich nur die Option s von sed. Sie steht für substitute - also das Ersetzen von Zeichenketten durch andere Zeichen.

Playlist von Energy Berlin herunterladen

Nachfolgend steht ein etwas komplizierteres Beispiel der Playlist von Radio Energy (Stand: Februar 2015).

cat > downloadEnergyPlaylist.sh <<EOF
#!/bin/bash

# get the correct date for the web query
dateString=\$(date +"stationnumber=1&startzeit=%H&tag=%d.%m.%Y")

# download the playlist
wget -T 5 -q --post-data="\${dateString}" http://www.energy.de/songserver.php -O /dev/shm/energy.txt

# check if download was success
if [ \$? -ne 0 ];then
  echo "Playlist download failed."
  exit 1
fi

# check for known string in the playlist
grep -q -i "playlistSongsTable" /dev/shm/energy.txt
if [ \$? -ne 0 ];then
  echo "Playlist does not contain the string 'playlistSongsTable'."
  exit 2
fi

# filter the web result
sed 's|<[^>]*>|\'\$'\n|g' /dev/shm/energy.txt | grep -v "^[[:space:]]*\$" | sed 's|@|AAATTT|g' | tr '\n' '@' | sed -e 's|@#resultSongs.*|@|' -e 's|.*@Länge@||' | sed 's|\([^@]*\)@\([^@]*\)@\([^@]*\)@\([^@]*\)@|\1, \4, \2 - \3\n|g' | sed -e 's|AAATTT|@|g' -e 's|&amp;|and|' | sort -r
EOF

chmod 755 downloadEnergyPlaylist.sh

# start download
./downloadEnergyPlaylist.sh

Im Beispiel von Energy benutze ich zu den bei Jazzradio beschriebenen Optionen des Programms wget noch die Option "post-data". Post-Daten werden normalerweise in Web-Formularen benutzt. Bei der Playlist von Energy wird im Web-Formular der Ort des Radiosenders und die Uhrzeit der Playlist übertragen. Anschließend wird in der heruntergeladenen Playlist nach bestimmten Mustern gefiltert. Da der stream editor sed nicht über mehrere Zeilen arbeitet (multiline sed), benutze ich hier einen kleinen Trick. Vor der Benutzung von sed, ersetze ich alle @-Zeichen durch die Zeichenkette AAATTT und danach alle Zeilenumbrüche durch das @-Zeichen. Die runden Klammern bei sed \(...\) umschließen eine Zeichenkette, die später mit \Nummer referenziert werden kann. Damit ordne ich die Uhrzeit und die Liedernamen in einer bestimmten Reichenfolge an. Schließlich sortiere ich die Liste der Lieder nach der Uhrzeit mit dem Befehl sort.

Playlist von RTL-Radio Berlin herunterladen

Und noch ein Beispiel anhand der Playlist von 104,6 RTL. Das Beispiel funktioniert noch mit Stand vom 15.05.2015.

cat > downloadRTLPlaylist.sh <<EOF
#!/bin/bash

USER_AGENT="Mozilla/5.0 (X11; Linux x86_64; rv:37.0) Gecko/20100101 Firefox/37.0"

wget -T 10 -q --user-agent="\$USER_AGENT" "http://www.104.6rtl.com/programm/radio-hoeren/hitfinder/der-hitfinder" -O token.txt

token=\$(grep '"token":"' token.txt | sed 's|.*"token":"\([^"]*\)".*|\1|g')
token_date=\$(grep '"ts":"' token.txt | sed 's|.*"ts":"\([^"]*\)".*|\1|g')

wget -T 10 -q --user-agent="\$USER_AGENT" "http://api.104.6rtl.com/?action=hitfinder&identifier=0&ts=\${token_date}&appid=2&token=\${token}&callback=radiocore_hitfinder_process_timeline" -O timeline.txt

printf "\$(sed 's|"artist":"|\n|g' timeline.txt | sed 's|"program":.*||g' | grep -v "^radiocore_hitfinder_process_timeline" | sed -e 's|","song":"| - |g' -e 's|^\(.*\)","ts":"\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)",|\2-\3-\4 \5-\6-\7: \1|g')" | iconv -f ISO_8859-15 -t UTF-8; echo
EOF

chmod 755 downloadRTLPlaylist.sh

# start download
./downloadRTLPlaylist.sh

Im Script für die Playlist von 104,6 RTL benutze ich zusätzlich die Programme printf und iconv, damit die Unicode-Zeichen der Playlist ordentlich dargestellt werden.

Das Prinzip der oberen drei Beispiele ist immer gleich und sollte klar geworden sein. An den regulären Ausdrücken führt leider kein weg vorbei. Im Internet gibt es aber genügend Beispiele und Erklärungen für sed.

Falls noch etwas unklar sein sollte, dann kannst du die Kommentar-Funktion benutzen.

Kommentar schreiben