nerdism

CaptuRadio – ein Mitschnittservice fürs Internetradio

Mit dem Wegfall meines vServers zum Monatsende und meinem Komplettumzug zu Uberspace hatte ich noch eine harte Nuss zu knacken: Bisher lief auf meinem Server ein Dienst, mit dem ich Sendungen aus dem Nachtprogramm des Deutschlandradios (später kamen auch andere Sender hinzu) mitschneiden und zeitversetzt nachhören konnte. Dieser Dienst bestand aus StreamRipper zum Mitschneiden der MP3-Streams, einem Perl-Skript drumherum für die Nachbearbeitung der Metadaten und einer Handvoll Cronjobs für die zeitgenaue Aufnahme.

Mit dem Umzug auf ein Shared Hosting fiel die StreamRipper-option weg. Auch war es nach den ~4 Jahren Zeit, dass ich mir das Skript mal für ein Update vornehme.

Herausgekommen ist CaptuRadio, ein ausschließlich in Python geschriebenem Tool, der mein bisheriges Setup komplett ersetzt und ein paar neue Optionen hinzufügt. Das Projekt besteht aus zwei Skipten:

Weiterhin übernehmen Cronjobs die Zeitsteuerung. Ich will die Mp3-Mitschnitt-Dateien als „private Podcasts“ unter einer Subdomain für mich zum Download bereitstellen, nennen wir sie http://music.example.org/. Wie funktioniert das nun?

Nach der erfolgreichen Installation wird eine Datei ~/.capturadiorc oder ~/.capturadio/capturadiorc erstellt und dort die Stream-URLs als Stationen definiert

[settings]
destination = ~/music.example.org/

[stations]
dlf = http://dradio.ic.llnwd.net/stream/dradio_dlf_m_a
dkultur = http://dradio.ic.llnwd.net/stream/dradio_dkultur_m_a

Nun wird ein Cronjob definiert, der das Skript aufruft (Anmerkung: Ich habe capturadio.pyund create_podcast_feed.py nach ~/bin installiert, dieser Ordner ist in meinem Pfad enthalten):

5 1 * * 2   capturadio.py -s dlf -l 3300 -b Nachtradio -t "Jazz zur Nacht"

Da in der Konfigurationsdatei im Abschnitt [settings] ein Wert destination definiert ist, werden die Mitschnitte dort abgelegt.
Nun läuft einmal je Stunde per Cronjob das Skript `

@hourly create_podcast_feed.py -r ~/music.example.org/

und erzeugt in allen Ordnern unterhalb von ~/music.example.org/ eine Datei rss.xml, die jeweils alle darunter befindlichen MP3-Dateien als Podcastfeed ausliefern kann.

Letzte Aktion ist, eine Datei .htaccess im Ordner ~/music.example.org/ mit folgendem Inhalt anzulegen:

DirectoryIndex rss.xml
IndexOptions Type=application/rss+xml

So werden mit den „Podcast“-URLs

  • http://music.example.org/ alle vorhandenen Mittschnitte abgerufen
  • http://music.example.org/Deutschlandfunk alle vorhandenen Mittschnitte der
    Station mit dem Namen „Deutschlandfunk“ abgerufen
  • http://music.example.org/Deutschlandfunk/Nachtradio alle vorhandenen
    Mittschnitte der Sendung „Nachradio“ im „Deutschlandfunk“ abgerufen

So kann ich meiner Tochter eine Kindersendung mitschneden und ihr Podcast-Client ruft nur den Feed zu ihrer Sendung ab, währenddessen ich täglich zu tn habe, all die anderen Mitschnitte nachzuhören.

Achja: Ein weitere Cronjob ist für die Verzeichnishygiene verantwortlich und löscht alle Podcasts, die älter als 7 Tage sind.

@daily   find ~/music.example.org/ -mindepth 1 -mtime +7 -type f -name \*.mp3 -exec rm "{}" \;

Diese Miniprojekt hat erfreulicherweise nur zwei Abende in Anspruch genommen, auch dank eleganter APIs und Bibliotheken. Und ich hatte nach Jahren der Pause wieder mal Gelegenheit, mich der Programmiersprache Python zu nähern. Hat Spaß gemacht und könnte eine Fortsetzung erfahren. Mit dem Projekt bin ich natürlich auch noch nicht fertig, aber: Es läuft und ist mein aktuelles „Projekt des Monats“. 🙂

Autor

Ich bin Softwareentwickler und derzeit vor allem mit PHP und Webanwendungen beschäftigt. Nach 10 Jahren mit Drupal habe ich mich gerade frisch in Laravel verliebt. Jenseits dessen verteilen sich meine digitalen Interessen zwischen Python, diversen Linuxen und macOS.