Úvod stručně: Chci se podělit o online přehrávač YouTube pro Android s lokálními playlisty, kanály a doporučeními.

Úvod rozšířeně:
Nedávno jsem se setkal s přesně takovým problémem jako autor úžasné aplikace , a vyjádřil jsem k němu právě takový vztah: chci mít možnost občas dát dítěti tablet nebo smartphone s pohádkami, ale vůbec mě neuspokojuje, kam dítě dostává seznam doporučení ve standardních aplikacích — klientech YouTube po 2-3 kliknutích.
Bohužel, po instalaci aplikace Whitelist kanálů byl odhalen další, prozaický, ale stále fatální nedostatek — NIH mi (a především synovi) přišel jako nepohodlné rozhraní, zejména po zvyku používat přehrávač YouTube Kids.
Celkově, po nějakém čase jsem dospěl k tomu, abych vytvořil svou implementaci. Po nějakém čase se podařilo postavit tag na první vydání.
Hlavní funkce:
- Přidávejte oblíbené kanály a playlisty — budou uloženy a indexovány v lokální databázi.
- Uvnitř přidaných playlistů vypněte nepotřebné videa, pokud je nepotřebujete.
- Seznam doporučení se generuje náhodně pouze z přidaných kanálů a playlistů v aplikaci.
Zdrojové kódy jsou otevřené, licence GPLv3:
Dále podrobnější přehled hlavních funkcí, plus trochu technických podrobností o tom, jak přehrávat videa z YouTube ve vaší aplikaci na Androidu bez použití Google API a webových wrapperů.
Na hlavní obrazovce a na obrazovce přehrávače: náhodná doporučení z nepříležitostných kanálů.
Okamžité vyhledávání v lokální databázi.
=>
Přidat nový kanál nebo playlist.
Hledat podle názvu online nebo vložit známou adresu. Seznam videí kanálu nebo playlistu se ukládá do lokální databáze, ikony nejsou ukládány do cache.
Dynamický playlist — přehrávat výsledky vyhledávání.
=>
V doporučeních pod videem budou pouze videa, která splňují vyhledávací dotaz.
Podobným způsobem, pokud otevřete video z nastavení playlistu, v seznamu doporučení budou pouze videa z tohoto stejného playlistu.
Playlisty a kanály lze dočasně vypínat a znovu zapínat.
Všimněte si, že videa z vypnutého playlistu zmizí také z výsledků vyhledávání, historie zhlédnutí a ze seznamu oblíbených. Ale nebojte se, znovu se tam objeví hned poté, co bude playlist opět zapnut.
Přidat video do černé listiny
Blokované video se nebude zobrazovat v doporučeních, ve výsledcích vyhledávání, zmizí ze seznamu oblíbených a z historie zhlédnutí. Video stále bude viditelné v nastaveních playlistu.
Prohlédnout černou listinu a znovu aktivovat položky blokované omylem:
Nastavení > menu v záhlaví > Černá listina
Oblíbená videa a historie zhlédnutí
Oblíbená videa na obrazovce přehrávače jsou označena hvězdičkou v pravém horním rohu.
Kontextová menu v záhlaví obrazovky a po dlouhém kliknutí v galeriích a seznamech
Kopírovat název nebo adresu videa či playlistu na obrazovce přehrávání nebo v jakémkoli seznamu.
Rychlý start — přidat doporučené kanály a playlisty
=>
Aplikace se okamžitě začne vypadat tak, jak na screenech výše.
Nežádoucí kanály a playlisty lze vypnout nebo odstranit v nastaveních.
Instalace
Stránka projektu:
v anglickém jazyce:
vydání:
- Na Google Play není a v nejbližší době nebude (Google blokuje aplikace, které obcházejí API, aby parsovaly jejich stránky, vč. zmíněného Channel Whitelist nebo přehrávače NewPipe)
- Sestavujte z otevřených zdrojů:
- Stahujte apk z části s vydáními:
- Doufám, že se brzy objeví v katalogu (, ale od té doby se už téměř měsíc nic neděje), ale zatím není
Mějte na paměti, že přepínání mezi různými verzemi z různých zdrojů na jednom zařízení nebude možné kvůli různým podpisům souboru apk, před instalací verze z nového zdroje je nutné nejprve odstranit nainstalovanou verzi spolu s daty — keší playlistů a historií zhlédnutí (nebo vymyslet, jak tato data převést).
Technické detaily
Nevyžaduje účet Google/YouTube, potřebujete pouze internet, využívá knihovny:
- pro získávání dat z služby YouTube a
- pro přehrávání videa.
Otevřený zdroj, svobodná licence GPLv3.
otázka: Je legální parsovat stránky bez povolení (nebo s jasným zákazem) autorů obecně? , které nepoužívají jejich API, ale procházejí jejich stránky, protože porušují jejich uživatelskou smlouvu.
odpověď: samozřejmě, je to legální, je na vás, jaký nástroj použijete pro čtení veřejně dostupných informací. Navíc: , ale Google může mít jiný názor, osobně zatím nemám chuť se odvážit do amerického soudu je přesvědčovat.
Trochu kódu
Knihovna — pomocný projekt přehrávače , umožňuje stahovat seznam videí pro zvolený kanál nebo playlist, stahovat podrobné informace o známém videu (to, co je vidět na webové stránce videa), získávat adresu ikony videa, a také získávat adresu streamu videa.
Kód pro stahování playlistu je poněkud nezbedný, takže ho zde nebudu uvádět, kdo má zájem — podívejte se do zdrojáků, většinou je to třída .
Podívejme se, jak získat adresu streamu videa podle adresy veřejné stránky videa a přehrát ho v přehrávači.
Připojte knihovnu v
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Zajímavé je, že i po tomto ji stejně nebude možné použít, protože příklady budou hlásit chybějící třídu Downloader. Tu lze zkopírovat do projektu z katalogu automatických testů — funguje pro verzi 0.17.4 (vypadá to, že v novější verzi knihovny byla tato část přepracována, ale je třeba to ještě zkontrolovat).
Získejte adresu streamu videa podle adresy stránky videa 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 adresu videa ytVidUrl může být veřejná adresa stránky jakéhokoli videa na YouTube, například
Přehrávač bude od samotného Google. Nejmenuje se to webový wrapper nad YouTube, ale skutečně se jedná o vestavěný přehrávač pro přehrávání jakýchkoli videí, který je dost flexibilní a přizpůsobitelný. Může také přehrávat video streamy z YouTube, pokud mu poskytnete správnou adresu. Adresu streamu jsme právě získali, a tak se podíváme, jak ji poslat do přehrávače.
Připojit knihovnu do projektu :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Nevěnujeme se všem nuancím umístění komponenty přehrávače na obrazovce aplikace (můžete se podívat na příklady na webu projektu nebo v kódu), podíváme se pouze na to, jak spustit přehrávání videa z YouTube v přehrávači podle výše uvedené adresy:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// zastavit přehrávání aktuálního videa, pokud bylo načteno
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);
// Pozastavíme staré video, zatímco připravujeme nové
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Pokud pozastavíme zde po tom, co se přehrávač sám pozastavil, skončiv
// hrát video, obdržíme zde druhou událost STATE_ENDED, proto potřebujeme zde
// speciální kontrolu.
// Přitom hodnota getPlayWhenReady() zůstane true, proto kontrolujeme právě stav.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Připravíme přehrávač s obsahem.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Určíme aktuální pozici hned při načítání videa
// (v komentářích něco píší o datových zdrojích, které podporují nebo nepodporují
// přechody seek při načítání, vypadá to, že to je nesmysl - prostě děláme seek hned po načtení)
// Exoplayer přehrává nové playlisty od začátku místo zadané pozice
// https://github.com/google/ExoPlayer/issues/4375
// Jak načíst stream na požadované pozici? #2197
// https://github.com/google/ExoPlayer/issues/2197
// na tomto místě normální duration ještě není dostupná, proto ji neprocházíme
//if(seekTo > 0 && seekTo 0) {
// o 5 sekund dříve
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Známé problémy
- Nebudou přehrávána videa s věkovým omezením, která vyžadují přihlášení do účtu Google/YouTube
například: ,
rada: přidávat taková videa na černou listinu nebo požádat autora videa, aby zrušil omezení, které bylo nastaveno omylem.
- Nebudou přehrávána některá videa v přenosu, pro která služba vrací nulovou délku (pro taková videa je délka v seznamech a galerii označena jako '[dur undef]')
například: ,
Tip: add such videos to the blacklist.
- Videos available only through direct links may not appear in the local playlist, even if you upload all the user's videos.
například:
If you encounter a public video that does not require a login, plays in the browser but not in the player, please send a bug report (it's quite possible that the issue has already been fixed in a newer version. NewPipeExtractor and you will only need to update to that version, ).
The interface may lag with slow (but not off) internet.
Nakonec
My son moved from a tablet to a Samsung smart TV, which cannot run Android applications. Therefore, the best parental control remains personal supervision.
But the app turned out to be convenient enough that I started using it myself. First impressions from the early working versions - I entered another world. All content is loaded from YouTube, but it's no longer YouTube; it's something else, safe and controlled, as if I had removed a centipede from my eye and placed it in a glass jar. And it all comes down to recommendations.
Zdroj: habr.com
