Hyrja shkurt: dua të flas për lojtarin online YouTube për Android me lista lojarish lokale, kanale dhe rekomandime.

Hyrja e zgjeruar:
Pak kohë më parë, u përballa me të njëjtin problem si autori i aplikacionit të mrekullueshëm , dhe e definova për veten time një qëndrim të ngjashëm: dua të kem mundësinë t'i jap fëmijës një tablet apo smartphone për të parë karikatura, por nuk jam aspak i kënaqur me atë ku e çon lista e rekomandimeve në aplikacionet standarde të YouTube pas 2-3 klikimesh.
Fatkeqësisht, pas instalimit të aplikacionit Channel Whitelist, u zbulua një tjetër, më prozatik, por përsëri fatal, disavantazh - NIH më duket (dhe, më e rëndësishmja, djalit tim) një ndërfaqe jo shumë e përshtatshme, sidomos pas zakonit për të përdorur lojtarin YouTube Kids.
Në përgjithësi, pas disa kohësh, u bëra gati të krijoja implementimin tim. Pas ca kohësh, u bë e mundur të vendosja etiketën në lëshimin e parë.
Funksionalitetet kryesore:
- Shtoni kanalet dhe listat lojarish të preferuara - ato do të ruhen dhe indeksohen në bazën e dhënash lokale
- Brenda listave të shtuar, çaktivizoni video të tepërta nëse nuk i nevojiteni
- Lista e rekomandimeve gjenerohet rastësisht vetëm nga kanalët dhe listat e shtuar në aplikacion
Burimet janë të hapura, licenca GPLv3:
Më pas, një përmbledhje më e detajuar e funksioneve kryesore, plus disa detaje teknike rreth mënyrës se si të luani video nga YouTube në aplikacionin tuaj për Android pa përdorur API-në e Google dhe mbështjelljet në web.
Në ekranin kryesor dhe në ekranin e lojtarit: rekomandime rastësore nga kanale jo-rastësore
Kërkesa e menjëhershme në bazën e dhënash lokale
=>
Shto një kanal të ri ose listë lojarish
Kërkoni me emër online ose ngjitni një adresë të njohur. Lista e videove të kanalit ose listës lojarish ruhet në bazën e dhënash lokale, ikonat nuk ruhen në cache.
Lista dinamike - luani rezultatet e kërkimit
=>
Në rekomandimet nën video do të jenë vetëm video që i përmbushin kërkesat e kërkimit.
Në mënyrë të ngjashme, nëse hapni një video nga cilësimet e listës lojarish, në listën e rekomandimeve do të ketë vetëm video nga kjo listë lojarish.
Listat lojarish dhe kanalet mund të deaktivizohen përkohësisht dhe të rinstalohen
Kujdes: video nga lista e deaktivizuar do të zhduken gjithashtu nga rezultatet e kërkimit, historia e shikimeve dhe lista e preferuar. Por mos u shqetësoni, ato do të shfaqen përsëri menjëherë pas rinisjes së listës lojarish.
Shtoni një video në listën e zezë
Video e bllokuar nuk do të shfaqet në rekomandime, në rezultatet e kërkimit, do të zhduket nga lista e preferuar dhe nga historia e shikimeve. Videoja ende do të jetë e dukshme në cilësimet e listës lojarish.
Shikoni listën e zezë dhe rindezni elementet e bllokuara gabimisht:
Cilësimet > menyja në krye > Lista e zezë
Videot e preferuara dhe historia e shikimeve
Videot e preferuara në ekranin e lojtarit shënohen me një yll në këndin e sipërm të djathtë.
Menytë kontekstuale në krye të ekranit dhe me një klikim të gjatë në galeritë dhe listat
Kopjoni emrin ose adresën e videos ose listës së luajtjes në ekranin e shikimit ose në çdo listë.
Fillim i shpejtĂ« â shtoni kanalet dhe listat e rekomanduara
=>
Aplikacioni menjëherë do të duket si në pamjet e mësipërme.
Kanalet dhe listat e padëshiruara mund të fikën ose fshihen në cilësime.
Instalimi
Faqja e projektit:
në gjuhën angleze:
daljet:
- Nuk ka në Google Play dhe nuk do të jetë për një kohë të afërt (Google ndalon aplikacionet që përshpejtojnë faqet e tyre pa përdorur API, përfshirë Channel Whitelist ose player NewPipe)
- Mblidhni nga burimet:
- Shkarkoni apk nga seksioni i daljeve:
- Shpresoj që pas një kohe do të shfaqet në katalog (, por nuk ka lëvizur për gati një muaj), por akoma nuk ka
Kujdes: nuk do tĂ« mund tĂ« kaloni ndĂ«rmjet versione tĂ« ndryshme nga burime tĂ« ndryshme nĂ« njĂ« pajisje tĂ« vetme pĂ«r shkak tĂ« nĂ«nshkrimeve tĂ« ndryshme tĂ« skedarit apk, para se tĂ« instaloni njĂ« version nga njĂ« burim tĂ« ri, duhet tĂ« fshini versionin e instaluar sĂ« pari, bashkĂ« me tĂ« dhĂ«nat â cache tĂ« listave tĂ« luajtjes dhe historinĂ« e shikimeve (ose tĂ« mendojeni se si tĂ« transferoni kĂ«to tĂ« dhĂ«na).
Detaje teknike
Nuk kërkon llogari Google/YouTube, vetëm internet, përdor bibliotekat:
- për të marrë të dhënat nga shërbimi YouTube dhe
- për luajtjen e videove.
Kodi burimor i hapur, licencë e lirë GPLv3.
pyetje: A është e ligjshme të përshkruash faqet pa leje (ose me ndalim të qartë) nga autorët? , që nuk përdorin API-në e tyre, por përshpejtojnë faqet e tyre, sepse shkelin marrëveshjen e përdorimit.
përgjigje: natyrisht, është e ligjshme, është puna juaj se cilin mjet të përdorni për të lexuar informacione të hapura. Më shumë se kaq: , por Gula mund të ketë një mendim tjetër, personalisht nuk kam dëshirë të shkoj në gjykatën amerikane për ta bindur atë.
Disa kod
Biblioteka â njĂ« projekt ndihmĂ«s i lojtarit , lejon shkarkimin e listĂ«s sĂ« videove pĂ«r njĂ« kanal ose playlist tĂ« caktuar, tĂ« shkarkojĂ« informacion tĂ« detajuar pĂ«r njĂ« video tĂ« njohur (ato qĂ« duken nĂ« faqen e internetit tĂ« videos), tĂ« marrĂ« adresĂ«n e ikonĂ«s sĂ« videos, si dhe tĂ« marrĂ« adresĂ«n e rrjedhĂ«s sĂ« videos.
Kodi pĂ«r shkarkimin e playlist-it Ă«shtĂ« pak i komplikuar, prandaj nuk do ta sjell kĂ«tu, atyre qĂ« janĂ« tĂ« interesuar â hidhni njĂ« sy nĂ« burimet, kryesisht Ă«shtĂ« klasa .
Le të shohim si të marrim adresën e rrjedhës së videos nga adresa publike e faqes së videos dhe si ta luajmë atë në lojtar.
Për të lidhur bibliotekën në
dependencies {
...
// NewPipe: parser youtube
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}ĂshtĂ« interesant qĂ« pasi kjo, ajo nuk do tĂ« funksionojĂ« akoma, sepse shembujt do tĂ« ankojnĂ« pĂ«r klasĂ«n e munguar Downloader. Ajo mund tĂ« kopjohet nĂ« projekt nga katalogu i testeve automatike â funksionon pĂ«r versionin 0.17.4 (duket se nĂ« njĂ« version mĂ« tĂ« ri tĂ« bibliotekĂ«s kjo pjesĂ« Ă«shtĂ« rregulluar, por duhet ta verifikohet akoma).
Merrni adresën e rrjedhës së videos nga faqja e videos në 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;
}Si adresë video ytVidUrl mund të jetë adresa publike e faqes së çdo videoje në YouTube, për shembull
Lojtari do të nga Google vetë. Kjo nuk është një mbulese web mbi YouTube, por një lojtar i vërtetë për të luajtur çdo video, mjafton të ketë adresën e duhur për rrjedhën e videos. Adresa e rrjedhës që sapo e morëm, prandaj le të shohim si ta dërgojmë atë në lojtar.
Për të lidhur bibliotekën në projekt :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Nuk do të shqyrtojmë të gjitha nuancat e vendosjes së komponentit të lojtarit në ekranin e aplikacionit (mund të shihni në shembujt në faqen e projektit ose në kod), do të shohim vetëm se si të fillojmë Luaj videon nga YouTube me adresën që morëm më lart:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// ndaloi luajtjen e videos aktuale, nëse ishte shkarkuar
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);
// Do ta pauzojmë videon e vjetër, derisa të përgatisim të re;
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Nëse e vendosim në pauzë këtu, pasi lojtarit të ndalojë vetë, përfundimin e videos, do të kemi një ngjarje të dytë STATE_ENDED këtu, kështu që na nevojitet një kontroll i veçantë.
// Në të njëjtën kohë, vlera e getPlayWhenReady() do të mbetet true, prandaj kontrollojmë saktësisht gjendjen.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Përgatit lojtarin me burimin.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// U tregojmë pozitat aktuale menjëherë teksa shkarkojmë videon
// (në komente flasin diçka për burimat që mbështesin ose nuk mbështesin
// kalimet e kërkesës dhe duket se kjo është një gjë - thjesht bëjmë kërkesën menjëherë pas shkarkimit)
// Exoplayer luan playlist të re nga fillimi për vendin që u dha
// https://github.com/google/ExoPlayer/issues/4375
// Si të ngarkohet rrjedha në pozitën e dëshiruar? #2197
// https://github.com/google/ExoPlayer/issues/2197
// në këtë moment, normalisht, koha e duhur nuk është akoma e disponueshme, prandaj nuk e kontrollojmë
//if(seekTo > 0 && seekTo 0) {
// 5 sekonda më herët
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Problemet e njohura
- Nuk do të luajë video me kufizime moshe, që kërkojnë hyrje në llogarinë Google/YouTube
për shembull: ,
këshillë: shtoni këto video në listën e zezë ose kërkoni nga autori i videos të heqë kufizimin e vendosur gabimisht.
- Nuk do të luajë disa video-transmetime për të cilat shërbimi kthen gjatësi zero (për këto video, gjatësi e listave dhe galerisë shënohet si «[dur undef]»)
për shembull: ,
këshillë: shtoni këto video në listën e zezë.
- Videot që janë të aksesueshme vetëm me lidhje të drejtpërdrejta mund të mos futen në listën lokale të luajtjes, edhe nëse po ngarkoni të gjitha videot e përdoruesit.
për shembull:
Nëse hasni një video publike që nuk kërkon identifikim, luan në shfletues, por nuk luan në lojtar, dërgoni një raport për gabime (është e mundur që problemi është ndrequr tashmë në versionin e ri, NewPipeExtractor dhe vetëm duhet të përditësoni ndërtimin me këtë version, ).
Interfeisi mund të ngadalësohet në internet të ngadaltë (por jo të fikur).
Si rezultat
Djali kaloi nga tableti në smart-tv Samsung, i cili nuk di të ekzekutojë aplikacione Android. Prandaj, kontrolli më i mirë i prindit është gjithmonë personal.
Por aplikacioni doli mjaft i përshtatshëm për sa kam filluar ta përdor edhe vetë. Një përshtypje e parë nga versionet e hershme të funksionimit - si të hysh në një botë tjetër. Të gjithë përmbajtja përmblidhet nga YouTube, por nuk është më YouTube, por diçka tjetër, e sigurt dhe e kontrolluar, si të kishte hequr një skëterë nga syri dhe ta kishe vendosur në një shishe prej xhami. Dhe problemi qëndron pikërisht në rekomandime.
Burimi: habr.com
