Na moim koncie YouTube mam coraz większą listę filmów do obejrzenia, głównie przesłuchania różnych wywiadów, konferencji czy innych pozycji w których głównym elementem jest głos – obraz jest zbędny. Niestety aplikacja YouTube na androida nie posiada możliwości (na chwilę obecną) odtwarzania pozycji na wygaszonym ekranie. Dodatkowo więcej baterii zużywamy oraz transferu danych. Z drugiej zaś strony też jesteśmy “uzależnieni od jakiejś platformy, urządzenia, która nam serwuje treść z YouTube” – mam tutaj na myśli np.: WWW, TV, tablet itp. Ja natomiast potrzebowałem prostego narzędzia, które wyciągnie audio z video i zaserwuje mi treść niezależnie od urządzenia. Stąd narodził się pomysł stworzenia własnego serwera podcast / audio, który będzie serwował mi pozycję z wybranej playlisty YouTube. Oczywiście poniższy projekt może też serwować inne pliki które mu dostarczymy np.: audiobooki.
1. Wymagania serwera
Cały sprawa sprowadza się do posiadania sprzętu z zainstalowanym systemem Linux lub pochodnym. W moim przypadku skorzystałem z Raspberry Pi. Oczywiście może to być też VPS itp. Nie testowałem na Windowsie – aczkolwiek może działać :). Jak ktoś przetestuje proszę dać znać. Oprócz tego będziemy potrzebowali Pythona + kilka zależności, FFmpeg i skryptu który wykona za nas robotę.
Jeżeli chodzi o YouTube musimy stworzyć playlistę niepubliczną lub publiczną – nie może być prywatna.
2. Przygotowanie serwera
Poniższe komendy wydawałem na systemie raspbian (ale też powinny działać na innych systemach linux). Wszystkie potrzebne rzeczy zainstalujemy wydając komendę:
sudo apt-get install libav-tools python sudo pip install mutagen youtube-dl
3. Projekt GenPodcastFromYT
Projekt możesz znaleźć na github. Możemy go ściągnąć przez git’a lub bezpośrednio i zapisać go na dysku.
Na początku musimy poustawiać kilka rzeczy które znajdują się na początku pliku:
- PLAYLIST – adres url lub “nr” playlisty z YouTube,
- PATH_MP3 – ścieżka gdzie mają zapisywać się pliki z mp3,
- HOST – nazwa hosta/IP na którym znajdują się serwer,
- PORT – nr portu serwera podcastu,
- REFRESH_RSS – jak często serwer ma pobierać pliki i generować nowy plik rss,
- Reszta można zostawić domyślnie lub zmienić według uznania.
San projekt składa się z czterech funkcji:
- start_server() – uruchamia prosty serwer WWW w pythonie.
- dlAudio() – ta funkcja odpowiada za pobieranie pozycji z YouTube i konwertuje do formatu mp3,
- gen_rss() – generuje plik rss,
- check_net() – funkcja pomocnicza, sprawdza czy jest internet jeśli nie to czeka 1 min i ponownie sprawdza.
Skrypt działa w oparciu o następujący kod:
start_server() while True: check_net() dlAudio() time.sleep(2) gen_rss() time.sleep(REFRESH_RSS)
Jeśli posiadasz już serwer WWW i chcesz z niego korzystać to zakomentuj lub usuń wpis który uruchamia serwer. Jest to linia 139 (w pliku). Pamiętaj tutaj, że pliki z mp3 nie mogą znajdować się poza katalogiem WWW,
Jeżeli potrzebujesz tylko serwera podcast i nie chcesz pobierać plików z YouTube zakomentuj linie dlAudio(). Dodajesz tylko pliki audio do katalogu PATH_MP3, a serwer robi resztę sam.
4. Uruchamiamy serwer
Mamy dwie opcję uruchomienia pierwsza z wiersza poleceń:
python GenPodcastFromYT.py
Wadą tego jest jak wyjdziesz z terminala (jeśli łączyć się przez ssh) serwer przestanie działać, zawsze można dodać do screena. Innym rozwiązaniem jest dodanie do crona i jego uruchomienie podczas startu systemu.
@reboot python /path/GenPodcastFromYT.py
5. Podsumowanie
Stworzenie własnego serwera podcast nie jest trudne i może przynieść korzyści. Projekt który stworzyłem może nie jest jakiś super idealny pod względem kodu, ale miał to być szybki i prosty sposób na uruchomienie serwera audio w sieci lokalnej. Projekt miał spełnić dwa warunki:
- Działać jako serwer audio / podcast,
- Dodatkowo pobierać pozycje z YouTube.
i spełnił te warunki. Złą wiadomością jest to, że jeśli odsłuchamy dany plik musimy go kasować ręcznie + pozycję które znajdują się na YouTube. Nie wykluczam w przyszłości rozbudowania tego skryptu jeśli będzie taka potrzeba. Zapraszam do zgłaszania propozycji lub uwag. Mile widziany feedback