Podcast z kanału na YouTube
Ytrss – jak zmienić kanał YouTube w podcast

Mówią, że najlepsze projekty to takie, z których się samemu korzysta. Od lat używam własnego narzędzia, które zmienia kanały na YouTube w podcasty i ciągle je ulepszam. Dziś chciałbym napisać o nim kilka słów.
tl;dr
- Artykuł zawiera krótką historię powstania projektu
- Ideą aplikacji było pobieranie informacji o nowych filmach na YouTube
- Projekt napisany w bashu i przepisany na Pythona
- Powstanie obrazu kontenera
- Kilka informacji na temat tego, skąd pobrać i jak uruchomić projekt
Jak powstała idea aplikacji?
Kiedy podczas studiów jeździłem na weekendy do domu, pojawił się spory zapas czasu, w którym nie miałem co robić. Godzinne przejazdy trudno było wykorzystać na odpoczynek, a na pracę nie dawały zbyt wiele przestrzeni.
Początkowo słuchałem w tym czasie muzyki, ale szybko zaczęło mnie to nudzić. Teoretycznie można było ten czas poświęcić na lekturę jakiejś książki lub materiałów do nauki, ale nie było to zbyt wygodne w trzęsącym się pojeździe. Nie można było też zbytnio korzystać z internetu, ponieważ trasa prowadziła przez miejscowości ze słabym zasięgiem, a w tych czasach łączność z internetem nie była dostępna w każdym miejscu.
Najlepszym więc rozwiązaniem było znalezienie jakiejś audycji radiowej, ściągnięcie pliku na telefon i odsłuchanie w czasie przejazdu. W ten sposób trafiłem na podcasty. Nie były one jeszcze tak popularne i dostępne jak dzisiaj, dlatego ich znalezienie i obsługa wymagały trochę więcej zachodu.
Audycje na YouTube
Początkowo miałem kilka ulubionych programów, które mogłem przed podróżą ściągnąć na smartfon, ale większość audycji ludzie wrzucali po prostu na platformę YouTube. To generowało dodatkowy krok do całego procesu. Jeśli chciałem odsłuchać jakiś plik offline, bez dostępu do internetu, musiałem go pobrać i przekonwertować do mp3, tak aby mój telefon mógł to obsłużyć.
Istniały wtedy gotowe strony, które umożliwiały taką operację. Wystarczyło podać adres URL i już po chwili miałeś możliwość pobrania świeżutkiego pliku na swoje urządzenie. Dzięki temu miałem zawsze pobrane kilka audycji, abym mógł cieszyć się aktualnymi newsami pośród dróg Lubelszczyzny.
Prawdziwe podcasty
Trzeba tutaj nadmienić, że mówiąc o podcastach, mam na myśli nie tylko audycje do odsłuchiwania. Za tym pojęciem idzie także pewnego rodzaju technologia, z której dzisiejsi słuchacze nie do końca zdają sobie sprawę.
Autor podcastu, oprócz pliku dźwiękowego, dostarczał też plik, który informował urządzenie słuchacza, jakie audycje są dostępne. Plik ten był dostępny z internetu, a odpowiednia aplikacja sprawdzała, czy nie pojawiło się w nim nic nowego. Wtedy można było wyświetlić informacje o nowej audycji i w razie potrzeby pobrać ją na urządzenie. Jeśli wiesz, czym są kanały RSS, to podcasty były praktycznie tym samym, z dodatkową informacją, gdzie znajduje się nagranie.
Dziś serwisy takie jak Spotify udostępniają wiele audycji, ukrywając przed użytkownikami szczegóły implementacyjne. Z jednej strony zwiększa to dostępność, z drugiej jednak uzależnia słuchaczy od konkretnych platform i zabiera możliwość niezależnego publikowania treści.
Co zatem chciałem uzyskać?
A więc moją ideą było automatyczne pobieranie filmów z serwisu YouTube, w taki sposób, abym mógł je uruchamiać w moim odtwarzaczu podcastów.
Po nitce do kłębka
Kiedy cele stały się jasne, zacząłem powoli brać się do pracy. Aplikacja Podcast Addict pozwalała utworzyć “wirtualny podcast” z plików w wybranym folderze telefonu. Każdy plik, który się tam pojawiał, był nowym odcinkiem w aplikacji. Szybko okazało się, że funkcja “wirtualnych podcastów” znacznie ułatwi pracę. Nie potrzebowałem więc tworzyć całego mechanizmu podcastu. Wystarczyło przekopiować pliki do odpowiedniego folderu w telefonie.
Biorąc pod uwagę, że synchronizacja plików pomiędzy komputerem a telefonem była przeze mnie wcześniej opracowana, wystarczyło napisać skrypt, który by te pliki przygotowywał.
Prosty skrypt
Zadanie było łatwe, więc aby nie komplikować spraw, postanowiłem napisać prosty skrypt w bashu. Program składał się z dwóch modułów. Pierwszy czytał z pliku listę adresów URL, z których miał pobrać filmy do odpowiedniego folderu. Drugi, na podstawie YouTube’owego RSS-a, odczytywał nowo dodane filmy i wrzucał je na opisaną wcześniej listę.
Takie rozwiązanie było nie tylko banalnie proste, ale umożliwiało mi również dodanie do listy filmów, które nie były na moich listach RSS, ale które z jakiegoś powodu chciałem dodać ręcznie.
Skrypt przeniosłem na Raspberry Pi, dzięki czemu mógł pobierać nowe filmy na bieżąco, a po połączeniu się z siecią lokalną telefon mógł w tle pobrać te pliki na następny dzień.
W ten sposób mogłem cieszyć się aktualnymi audycjami nie tylko gdy jechałem do domu, ale również gdy jechałem do pracy lub na uczelnię.
Przesiadka na Pythona
O ile skrypt działał poprawnie w standardowych przypadkach, o tyle pojawiały się problemy np. przy niepoprawnym pobraniu filmu lub gdy z jakiegoś powodu musiałem odłączyć Raspberry Pi od prądu w trakcie pobierania plików. Zapragnąłem również, aby skrypt oprócz pobierania audio mógł także generować pliki z opisem audycji, z których stworzy się plik RSS (feed podcastu). Rzeczy te były możliwe w bashu, ale bardzo komplikowały kod.
Ponieważ w pozostałych projektach opierałem się na programowaniu obiektowym, a idea pakietów, którą implementuje Python, bardzo mi się wtedy spodobała, postanowiłem, że napiszę ten program właśnie w tym języku.
Dodatkowym argumentem za tym językiem programowania był fakt, że skrypt, który wykorzystywałem do pobierania plików, był napisany właśnie w nim. Korzystałem wtedy z youtube-dl, który z czasem zastąpiłem yt-dlp. Było to zatem łatwiejsze do zintegrowania.
Python pozwolił mi na wprowadzenie kilku nowych ulepszeń. Chociaż program nadal działał jako oddzielny skrypt, który musiał być odpalany raz na jakiś czas, to dzięki zastosowaniu mechanizmów systemowych mogło się to dziać całkowicie automatycznie.
Czas na kontener
Projekt na jakiś czas trafił na półkę. W tym czasie nie miałem możliwości uruchomienia Raspberry Pi z moim skryptem. Skupiłem się więc na bieżącym odsłuchiwaniu filmów na YouTube. Kiedy w końcu przyszła myśl o reaktywacji projektu, postanowiłem dodać do niego nowy szczegół.
Instalacja takich projektów pokazuje nam, jak problematyczny może okazać się powrót do starego kodu po dłuższej przerwie. Instalacja to nie tylko odpowiednie wywołanie skryptów, ale także przygotowanie systemu do obsługi naszej aplikacji.
Uznałem, że fajnie byłoby mieć gotowy kontener tak, aby można było uruchomić projekt bez zastanawiania się nad szczegółami implementacji. Również przekazanie takiego projektu komuś innemu jest łatwiejsze, gdy może to zrobić bez wiedzy o tym, jak zainstalować poszczególne elementy.
Myślę, że środowisko uruchomieniowe projektu, zamknięte w zgrabnym pliku Dockerfile, jest niezbędnym elementem, który powinien być dodany do każdego projektu. O ile łatwiejsza byłaby konfiguracja i powrót do starych projektów, gdybym tego typu konfigurację dołączał do moich studenckich projektów.
Jak działa to dziś?
Dzisiaj dzięki opisanym zmianom jestem w stanie szybko i sprawnie przejść przez proces deploymentu tego projektu. Obecnie działa on w tle w Dockerze na moim prywatnym laptopie i generuje nowe pliki dla filmów, które ktoś wrzuca na swój kanał.
Pliki, które wygenerowałem, mogą być więc udostępniane w lokalnej sieci, a dowolna aplikacja do obsługi podcastów nawet nie ma pojęcia, że coś jest nie tak.
Pamiętaj, że pobieranie filmów z YouTube może naruszać jego regulamin. Zawsze upewnij się, że możesz to zrobić, i nie udostępniaj materiałów, do których nie masz praw autorskich.
YouTube często zmienia zabezpieczenia platformy, dlatego często trzeba aktualizować skrypt pobierania yt-dlp.
Gdzie znaleźć projekt?
Projekt możesz pobrać i przetestować na stronie github.com/rafyco/ytrss. Polecam zacząć od dokumentacji, w której znajdziesz wiele informacji na temat funkcji czy metod uruchomienia. Więcej informacji znajdziesz w sekcji Bibliografia.
Jeśli chciałbyś pomóc w rozwijaniu oprogramowania lub masz pomysły na nowe funkcjonalności, zapraszam do pisania na moich kontach społecznościowych.
Jak uruchomić projekt?
Instalacja z PyPI
Projekt możesz pobrać za pomocą narzędzia pip. Po prostu wykonaj polecenie:
pip install ytrssA następnie utwórz plik konfiguracyjny z informacją na temat kanałów, które chcesz pobierać. Dokładny opis konfiguracji oraz przykład znajdziesz na stronie dokumentacji.
Kiedy konfiguracja będzie już gotowa i znajdzie się w odpowiednim miejscu, możesz automatycznie pobrać pliki i wygenerować podcasty za pomocą polecenia:
ytrss runWarto dodać je do crona, aby wykonywało się automatycznie.
Możesz też skorzystać z polecenia:
ytrss daemonKomenda ta będzie uruchamiała sprawdzanie feedów raz na godzinę i automatycznie zaktualizuje podcasty, jeśli pojawią się nowe filmy. Polecenie to można uruchomić w tle lub wykorzystać je do stworzenia serwisu np. z wykorzystaniem systemctl.
Instalacja z Dockerem
Być może znacznie wygodniejszą metodą na przetestowanie mojego oprogramowania jest wykorzystanie go w ramach obrazu Dockera. Możesz go pobrać z publicznego repozytorium za pomocą polecenia:
docker pull rafyco/ytrss:latestNajprostsze wywołanie wygląda następująco:
docker run -d \
--name ytrss \
-v $(pwd)/volumes/ytrss/config.yml:/home/ytrss/.config/ytrss/config/config.yml:ro \
-v $(pwd)/volumes/ytrss/podcasts:/home/ytrss/podcasts \
rafyco/ytrss:latestW dokumentacji przeczytasz o dodatkowych przykładach oraz o konfiguracji Docker Compose, która znacznie zwiększa możliwości oprogramowania.
Plany na przyszłość
Dziś mój projekt jest już dosyć zaawansowany i z dużą pewnością mogę stwierdzić, że wiele się na nim nauczyłem. Powstał jeszcze przed erą AI, więc niemal każdą linijkę napisałem sam metodą prób i błędów.
Nieocenione w tym procesie okazało się także doświadczenie związane z narzędziami DevOps, które mogłem na nim przetestować. Poszerza to niezwykle horyzonty, jeśli chodzi o zrozumienie procesu powstawania oprogramowania, i chociaż teraz wszystko mógłbym zrobić niemal w jeden wieczór, to wiem, na jakie elementy zwracać uwagę podczas tworzenia takiego projektu.
Starałem się budować swój projekt modułowo, tak aby główna funkcjonalność nie była silnie związana z platformą YouTube czy nawet samą ideą podcastów, dlatego myślę, że kolejnym krokiem było stworzenie mechanizmu zewnętrznych modułów, które mogłyby poszerzać możliwości oprogramowania.
Obsługa innych serwisów czy kreatywny sposób na zapisywanie i generowanie treści to coś, nad czym będę prawdopodobnie pracował w przyszłości.
… o ile starczy mi czasu…
Bibliografia
- https://github.com/rafyco/ytrss Kod źródłowy
- https://ytrss.readthedocs.io/ Dokumentacja
- https://pypi.org/project/ytrss/ - Projekt na PyPI
- https://hub.docker.com/r/rafyco/ytrss - Obraz docker do pobrania
- yt-dlp - Skrypt do pobierania filmów