Wprowadzenie w skrócie: chcę opowiedzieć o odtwarzaczu online YouTube dla Androida z lokalnymi listami odtwarzania, kanałami i rekomendacjami.

Rozbudowane wprowadzenie:
Jakiś czas temu miałem dokładnie ten sam problem, co autor wspaniałej aplikacji , i dokładnie tak samo podchodziłem do tej kwestii: chciałem mieć możliwość od czasu do czasu dawać dziecku tablet lub smartfon z bajkami, ale zupełnie nie odpowiadało mi, dokąd prowadzi dziecko lista rekomendacji w standardowych aplikacjach — klientach YouTube po 2-3 kliknięciach.
Niestety, po zainstalowaniu aplikacji Channel Whitelist zauważyłem inny, bardziej przyziemny, ale wciąż fatalny niedobór — interfejs NIH wydawał mi się (i, co najważniejsze, mojemu synowi) niezbyt wygodny, zwłaszcza po przyzwyczajeniu się do korzystania z YouTube Kids.
W każdym razie, po pewnym czasie dojrzałem do stworzenia własnej implementacji. Po pewnym czasie możliwe stało się wprowadzenie tagu do pierwszej wersji.
Podstawowe funkcje:
- Dodawaj ulubione kanały i playlisty — będą one zapisane i zindeksowane w lokalnej bazie
- W dodanych playlistach wyłączaj niepotrzebne filmiki, jeśli ich nie potrzebujesz
- Lista rekomendacji generowana jest losowo tylko z dodanych do aplikacji kanałów i playlist
Kod źródłowy jest otwarty, licencja GPLv3:
Poniżej przegląd głównych możliwości w bardziej szczegółowy sposób, plus kilka technicznych szczegółów na temat tego, jak odtwarzać wideo z YouTube w swojej aplikacji na Androida bez używania API Google i powłok webowych.
Na głównym ekranie i na ekranie odtwarzacza: losowe rekomendacje z nierandomowych kanałów
Natychmiastowe wyszukiwanie w lokalnej bazie
=>
Dodaj nowy kanał lub playlistę
Szukaj według nazwy online lub wklej znany adres. Lista filmów kanału lub playlisty jest zapisywana w lokalnej bazie, ikony nie są buforowane.
Dynamiczna playlista — odtwarzaj wyniki wyszukiwania
=>
W rekomendacjach pod wideo będą tylko filmiki spełniające wymagania zapytania wyszukiwania.
Podobnie, jeśli otworzysz wideo z ustawień playlisty, w liście rekomendacji będą tylko filmiki z tej samej playlisty.
Playlisty i kanały można tymczasowo wyłączać i ponownie włączać
Uwaga: filmiki z wyłączonej playlisty znikną również z wyników wyszukiwania, historii oglądania i listy ulubionych. Ale nie ma się czym martwić, ponownie pojawią się tam zaraz po ponownym włączeniu playlisty.
Dodaj film do czarnej listy
Zablokowany film nie będzie się pojawiać w rekomendacjach, w wynikach wyszukiwania, zniknie z listy ulubionych i z historii oglądania. Film nadal będzie widoczny w ustawieniach playlisty.
Przejrzyj czarną listę i znów włącz elementy, które zostały błędnie zablokowane:
Ustawienia > menu w nagłówku > Czarna lista
Ulubione filmy i historia oglądania
Ulubione filmy na ekranie odtwarzacza oznaczone są gwiazdką w prawym górnym rogu.
Menu kontekstowe w nagłówku ekranu i po długim kliknięciu w galeriach i listach
Skopiuj nazwę lub adres filmu lub playlisty w ekranie oglądania lub w dowolnej liście.
Szybki start — dodaj zalecane kanały i playlisty
=>
Aplikacja od razu będzie wyglądać tak, jak na powyższych zrzutach ekranu.
Niepotrzebne kanały i playlisty można wyłączyć lub usunąć w ustawieniach.
Instalacja
Strona projektu:
w języku angielskim:
wydania:
- Nie ma w Google Play i w najbliższym czasie nie będzie (Google blokuje aplikacje, które omijają API, przeszukując ich stronę, w tym wspomniane Channel Whitelist lub odtwarzacz NewPipe)
- Zbuduj z źródeł:
- Pobierz apk z sekcji z wydaniami:
- Mam nadzieję, że wkrótce pojawi się w katalogu (, ale od prawie miesiąca nic się nie dzieje), ale na razie brak
Pamiętaj, że nie można przełączać się między różnymi wersjami z różnych źródeł na jednym urządzeniu z powodu różnych podpisów pliku apk, przed zainstalowaniem wersji z nowego źródła musisz najpierw usunąć zainstalowaną wersję razem z danymi — pamięcią podręczną playlist i historią oglądania (lub wymyślić, jak te dane przenieść).
Szczegóły techniczne
Nie wymaga konta Google/YouTube, potrzebny jest tylko internet, korzysta z bibliotek:
- do pozyskiwania danych z serwisu YouTube i
- do odtwarzania wideo.
Otwarty kod źródłowy, wolna licencja GPLv3.
pytanie: Czy parsowanie stron bez zgody (lub z wyraźnym zakazem) autorów jest w ogóle legalne? , które nie korzystają z ich API, a przeszukują ich strony, ponieważ naruszają ich zasady użytkowania.
odpowiedź: Oczywiście, że legalne, to twoja sprawa, jakiego narzędzia używać do czytania ogólnodostępnych informacji. Ba, więcej: , ale Gul może mieć inne zdanie, ja osobiście na razie nie mam chęci przekonywać ich w amerykańskim sądzie.
Trochę kodu
Biblioteka — pomocniczy projekt odtwarzacza , umożliwia pobieranie listy filmów dla wskazanej strony lub playlisty, pobieranie szczegółowych informacji o znanym wideo (tych, które są widoczne na stronie filmu), uzyskiwanie adresu ikony wideo oraz adresu strumienia wideo.
Kod do pobrania playlisty jest nieco rozbudowany, dlatego nie będę go tutaj podawać, kto jest ciekawy — może zajrzeć do źródeł, głównie jest to klasa .
Zobaczmy, jak uzyskać adres strumienia wideo na podstawie adresu publicznej strony z wideo i odtworzyć go w odtwarzaczu.
Dodać bibliotekę w
dependencies {
...
// NewPipe: parser YouTube
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Ciekawostką jest to, że po tym i tak nie będzie można jej używać, ponieważ przykłady będą zgłaszać brakujący klasę Downloader. Można ją skopiować do projektu z katalogu testów automatycznych — działa dla wersji 0.17.4 (wygląda na to, że w nowszej wersji biblioteki ta część została zmieniona, ale trzeba to jeszcze sprawdzić).
Uzyskaj adres strumienia wideo na podstawie adresu strony z wideo na YouTube:
public String extractYtStreamUrl(final String ytVidUrl) throws ExtractionException, IOException {
// https://github.com/TeamNewPipe/NewPipeExtractor/blob/dev/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorDefaultTest.java
NewPipe.init(Downloader.getInstance(), new Localization("GB", "en"));
final YoutubeStreamExtractor extractor = (YoutubeStreamExtractor) YouTube
.getStreamExtractor(ytVidUrl);
extractor.fetchPage();
final String streamUrl = extractor.getVideoStreams().size() > 0 ? extractor.getVideoStreams().get(0).getUrl() : null;
// for (final VideoStream stream : extractor.getVideoStreams()) {
// stream.getUrl();
// }
return streamUrl;
}Jako adres wideo ytVidUrl może być publiczny adres strony z dowolnym wideo na YouTube, na przykład
Odtwarzacz będzie od samego Google. To nie jest opakowanie internetowe na YouTube, lecz prawdziwy odtwarzacz osadzony do odtwarzania dowolnych filmów, wystarczająco elastyczny i konfigurowalny. Potrafi także odtwarzać strumienie wideo z YouTube, jeśli podano mu prawidłowy adres. Adres strumienia właśnie otrzymaliśmy, więc sprawdzimy, jak wysłać go do odtwarzacza.
Podłącz bibliotekę do projektu :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Nie będziemy rozważać wszystkich niuansów umieszczania komponentu odtwarzacza na ekranie aplikacji (możesz zobaczyć to w przykładach na stronie projektu lub w kodzie), skupimy się tylko na tym, jak uruchomić odtwarzanie wideo z YouTube w odtwarzaczu za pomocą adresu uzyskanego powyżej:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// zatrzymaj odtwarzanie aktualnego wideo, jeśli zostało załadowane
videoPlayerView.getPlayer().stop(true);
} else {
// https://exoplayer.dev/
// https://github.com/google/ExoPlayer
final Uri mp4VideoUri = Uri.parse(streamUrl);
final MediaSource videoSource = new ProgressiveMediaSource.Factory(videoDataSourceFactory)
.createMediaSource(mp4VideoUri);
// Wstrzymaj stare wideo podczas przygotowywania nowego
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Jeśli zatrzymujesz tutaj po tym, jak odtwarzacz już zrobił pauzę, kończąc
// odtwarzanie wideo, dostaniemy tutaj drugie zdarzenie STATE_ENDED, dlatego potrzebujemy tutaj
// specjalnej weryfikacji.
// Wartość getPlayWhenReady() pozostanie true, więc sprawdzamy właśnie stan.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Przygotuj odtwarzacz z źródłem.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Ustawimy aktualną pozycję od razu przy ładowaniu wideo
// (w komentarzach piszą o źródłach danych, które wspierają lub nie wspierają
// przesunięć seek przy ładowaniu, wydaje się, że to bzdura - po prostu robimy seek zaraz po ładowaniu)
// Exoplayer odtwarza nową playlistę od początku, zamiast podanej pozycji
// https://github.com/google/ExoPlayer/issues/4375
// Jak załadować strumień w żądanej pozycji? #2197
// https://github.com/google/ExoPlayer/issues/2197
// w tym miejscu normalny czas trwania jeszcze nie jest dostępny, dlatego go nie sprawdzamy
//if(seekTo > 0 && seekTo 0) {
// o 5 sekund wcześniej
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Znane problemy
- Nie będzie odtwarzać filmów z ograniczeniami wiekowymi, wymagających logowania do konta Google/Youtube
na przykład: ,
rada: dodaj takie filmy do czarnej listy lub poproś autora filmu o usunięcie ograniczenia, nałożonego przez pomyłkę.
- Nie będzie odtwarzać niektórych filmów na żywo, dla których serwis zwraca zerową długość (dla takich filmów długość w listach i galerii oznaczona jest jako „[dur undef]”)
na przykład: ,
Porada: dodawaj takie filmy do czarnej listy.
- Filmy dostępne tylko pod bezpośrednimi linkami mogą nie trafić do lokalnej listy odtwarzania, nawet jeśli przesyłasz wszystkie filmy użytkownika.
na przykład:
Jeśli natkniesz się na publiczny film, który nie wymaga logowania, działa w przeglądarce, ale nie działa w odtwarzaczu, zgłoś błąd (możliwe, że problem został już naprawiony w nowej wersji. NewPipeExtractor Należy tylko zaktualizować wersję tej wersji, ).
Interfejs może się zacinać przy wolnym (ale nie wyłączonym) internecie.
W konsekwencji,
Syn przeszedł z tabletu na smart TV Samsunga, który nie potrafi uruchamiać aplikacji Android. Dlatego najlepsza kontrola rodzicielska to jednak osobista forma.
Jednak aplikacja okazała się na tyle wygodna, że zacząłem z niej korzystać sam. Pierwsze wrażenie z wczesnych działających wersji – trafiłem do innego świata. Cała zawartość ładowana jest z YouTube, ale to już nie jest YouTube, a coś innego, bezpiecznego i kontrolowanego, jakby wyjął skolopendrę z oka i umieścił ją w szklanym słoju. A kwestia dotyczy właśnie rekomendacji.
Źródło: habr.com
