sobota, 28 czerwca 2014

Buforowanie utworów radia internetowego

Normalne odtwarzanie radia internetowego polega na bezpośrednim przesyłaniu danych z serwera źródłowego. Zależnie od sytuacji może być to sporym minusem:

  • wymaga stałego połączenia z siecią, w przypadku jego braku odtwarzanie zostanie przerwane

  • niektóre programy nie obsługują poprawnie przesyłania informacji o odsłuchanych utworach radiowych do serwisów jak Last.fm

    • mogą w ogóle nie podejmować prób wysyłania

    • lub wysyłać błędne dane zawierające tagi radia lub reklamy

  • po zatrzymaniu utworu tracimy i jego wznowieniu nie trafimy już na ten sam utwór

Dość trafnym przykładem działania z użyciem lokalnego buforowania może być słuchanie radia podczas pracy, w siedzibie firmy.

  • Po rozpoczęciu procesu, każdy pobrany utwór zostaje osobno zapisany na dysku

  • Przy okazji odfiltrowane zostają reklamy, tagi zmienione na poprawne

  • Tak przygotowany plik zostaje dodany do aktualnie odtwarzanej listy aplikacji

  • Każdy odtworzony utwór zostaje usunięty z playlisty i dysku

  • W przypadku spotkania firmowego, odtwarzanie w aplikacji można zatrzymać, pliki będą wciąz pobierane

  • Po powrocie, można kontynuuować odtwarzanie z miejsca w którym się skończyło

  • Nagle połączenie z internetem przestaje działać - w niczym nam to nie przeszkadza gdyż mamy zapas muzyki pobranej podczas wcześniejszego spotkania :)

Potrzebne aplikacje

  • Streamripper - do pobierania utworów, filtrowania i zmiany metadanych

  • Audacious - zarządzanie listą utworów, odtwarzanie

  • Python3 - do uruchomienia skryptu łączącego dwie poprzednie aplikacje, dodatkowo potrzebne są biblioteki:

Skrypt streambuffer'a jest dostępny do pobrania tutaj.

Jak to działa

Streamripper łączy się z zadanym radiem i pobiera utwory do wskazanego katalogu. Gdy dany utwór zostaje przeniesiony do katalogu gotowe, Streambuffer doda go jako nowy utwór w Audacious'ie. Gdy audacious zmieni pozycję na playliście na następną, wcześniejsze których pliki znajdują się w katalogu gotowe zostaną usunięte (z kolejki jak i z dysku).

Do nasłuchiwania zmiany plików przez streamripper'a używane jest inotify, natomiast do komunikacji z playerem d-bus.

Struktura i opis plików
- katalog główny
\- data
 \- *.* - utwory w pełni pobrane
 \- incomplete
  \- *.* - utwory niepełne
\- pattern.txt - filtry streamripper'a

Użycie

Najpierw należy samodzielnie uruchomić odtwarzacz Audacious.

Następnie,

jako skrypt python:

m = Manager("/my/music", "http://itori.animenfo.com:443/")
m.run()

lub prosto z linii poleceń:

./rip "/my/music" "http://itori.animenfo.com:443/"