Kort introduktion: Jag vill berÀtta om Youtube-spelaren för Android med lokala spellistor, kanaler och rekommendationer.

Utvecklad introduktion:
För ett tag sedan stötte jag pÄ precis samma problem som författaren till den fantastiska appen , och jag hade samma instÀllning: jag vill kunna ge mitt barn en surfplatta eller smartphone med tecknat dÄ och dÄ, men jag Àr helt och hÄllet missnöjd med vart rekommendationslistan i de standard Youtube-apparna leder barnet efter 2-3 klick.
TyvĂ€rr, efter installationen av Channel Whitelist upptĂ€ckte jag en annan mer prosaisk men Ă€ndĂ„ fatal nackdel â NIH kĂ€ndes (och framför allt min son) inte sĂ„ bekvĂ€m, speciellt efter att ha vant mig vid att anvĂ€nda Youtube Kids-spelaren.
AlltsÄ, efter en tid kÀnde jag mig redo att göra min egen implementation. Lite senare blev det möjligt att sÀtta en tagg pÄ den första utgÄvan.
Key features:
- LĂ€gg till dina favoritkanaler och spellistor â de kommer att sparas och indexeras i den lokala databasen
- Inuti de tillagda spellistorna kan du stÀnga av onödiga videor om de inte behövs
- Rekommendationslistan genereras slumpmÀssigt endast frÄn de kanaler och spellistor som lagts till i appen
KÀllorna Àr öppna, licensen Àr GPLv3:
HÀrnÀst en översikt av de viktigaste funktionerna mer i detalj, plus lite tekniska detaljer om hur man spelar video frÄn Youtube i din Android-app utan att anvÀnda Googles API och webbomslag.
PÄ huvudsidan och pÄ spelarsidan: slumpmÀssiga rekommendationer frÄn icke-slumptÀvlade kanaler
Omedelbar sökning i den lokala databasen
=>
LĂ€gg till ny kanal eller spellista
Sök efter namn online eller klistra in en kÀnd adress. Videolistan för kanalen eller spellistan sparas i den lokala databasen, ikoner cachas inte.
Dynamisk spellista â spela resultaten frĂ„n din sökning
=>
I rekommendationerna under videon kommer det endast finnas videor som uppfyller sökfrÄgan.
PÄ liknande sÀtt, om du öppnar en video frÄn spellistinstÀllningarna, kommer endast videor frÄn samma spellista att visas i rekommendationerna.
Spellistor och kanaler kan tillfÀlligt stÀngas av och slÄs pÄ igen
Observera: videor frÄn den avstÀngda spellistan kommer Àven att försvinna frÄn sökresultaten, visningshistoriken och favoriter. Men oroa dig inte, de kommer att dyka upp dÀr igen sÄ fort spellistan slÄs pÄ igen.
LĂ€gg videon i svarta listan
Den blockerade videon kommer inte att visas i rekommendationerna, sökresultaten, försvinner frÄn favoriter och visningshistoriken. Videon kommer fortfarande att vara synlig i spellistans instÀllningar.
Se över svarta listan och Äteraktivera objekt som blockerats av misstag:
InstÀllningar > meny i rubriken > Svart lista
Favoritvideor och visningshistorik
Favoritvideor pÄ spelarskÀrmen markeras med en stjÀrna i det övre högra hörnet.
Kontextmenyer i rubriken pÄ skÀrmen och vid lÄngt tryck i gallerier och listor
Kopiera namn eller adress för video eller spellista frÄn visningsskÀrmen eller i vilken lista som helst.
Snabbstart â lĂ€gg till rekommenderade kanaler och spellistor
=>
Appen kommer omedelbart att se ut som pÄ skÀrmbilderna ovan.
Onödiga kanaler och spellistor kan stÀngas av eller tas bort i instÀllningarna.
Installation
Projektets sida:
pÄ engelska:
utgÄvor:
- Det finns inga pÄ Google Play och det kommer inte att finnas inom den nÀrmaste tiden (Google blockerar appar som kringgÄr API:et för att skrapa deras webbplats, inklusive nÀmnda Channel Whitelist eller spelaren NewPipe)
- Samla frÄn kÀllkoden:
- Ladda ner apk frÄn avsnittet med utgÄvor:
- Jag hoppas att det kommer att dyka upp i katalogen snart (, men har inte rört sig framÄt pÄ nÀstan en mÄnad), men fortfarande inte
Ha i Ă„tanke att det inte gĂ„r att vĂ€xla mellan olika versioner frĂ„n olika kĂ€llor pĂ„ en och samma enhet pĂ„ grund av olika signaturer pĂ„ apk-filen. Innan du installerar en version frĂ„n en ny kĂ€lla mĂ„ste du först ta bort den installerade versionen tillsammans med data â cache för spellistor och visningshistorik (eller komma pĂ„ hur dessa data kan överföras).
Tekniska detaljer
KrÀver inget Google/YouTube-konto, endast internet, anvÀnder bibliotek:
- för att hÀmta data frÄn YouTube-tjÀnsten och
- för att spela upp video.
Ăppen kĂ€llkod, fri licens GPLv3.
FrĂ„ga: Ăr det lagligt att skrapa webbplatser utan tillstĂ„nd (eller med uttrycklig förbud) frĂ„n upphovsmĂ€nnen? , som inte anvĂ€nder deras API, utan hĂ€mtar deras webbplatser, eftersom de bryter mot deras anvĂ€ndarvillkor.
svaret: sjÀlvklart, det Àr lagligt, det Àr ditt beslut vilken verktyg du anvÀnder för att lÀsa offentlig information. Mer Àn sÄ: , men Google kan ha en annan Äsikt, personligen har jag för nÀrvarande ingen lust att gÄ till amerikansk domstol för att övertyga dem.
Lite kod
Bibliotek â ett hjĂ€lpprojekt för spelaren , lĂ„ter dig ladda ner en lista med videor för en angiven kanal eller spellista, hĂ€mta detaljerad information om en kĂ€nd video (det som syns pĂ„ webbsidan för videon), fĂ„ adressen till videons ikon samt hĂ€mta adressen till videoströmmen.
Koden för att ladda ner spellistan Ă€r lite klumpig, sĂ„ jag kommer inte att ta med den hĂ€r, för den som Ă€r intresserad â kika i kĂ€llorna, det handlar i huvudsak om klassen .
LÄt oss se hur man fÄr adressen till videoströmmen via adressen till videons offentliga sida och spela upp den i spelaren.
Anslut biblioteket i
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Det Ă€r intressant att efter detta kommer det fortfarande inte att gĂ„ att anvĂ€nda, eftersom exemplen kommer att klaga pĂ„ den saknade klassen Downloader. Den kan kopieras till projektet frĂ„n katalogen för automatiska tester â fungerar för version 0.17.4 (det verkar som om denna del har Ă€ndrats i en nyare version av biblioteket, men det behöver kontrolleras).
Att fÄ adressen till videoströmmen via adressen till videons sida pÄ 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;
}Som adress för videon kan ytVidUrl vara den publika adressen till sidan för vilken som helst video pÄ YouTube, till exempel
Spelaren kommer att frÄn Google. Detta Àr inte en webblÀsartillÀgg pÄ YouTube, utan en riktig inbÀddad spelare för att spela upp videoklipp, som Àr tillrÀckligt flexibel och anpassningsbar. Den kan ocksÄ spela videoströmmar frÄn YouTube om rÀtt adress anges. Adressen till strömmen fick vi just nu, sÄ lÄt oss se hur vi skickar den till spelaren.
Anslut biblioteket till projektet :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Vi kommer inte att gÄ igenom alla detaljer kring placeringen av komponenten pÄ appens skÀrm (du kan titta pÄ exemplen pÄ projektets webbplats eller i koden), utan fokuserar bara pÄ hur man startar uppspelning av video frÄn YouTube i spelaren med den adress vi fick ovan:
privat void spelaVideoström(final String strömUrl, final long sökTill) {
if (strömUrl == null) {
// stoppa uppspelningen av den aktuella videon, om den har laddats
videoPlayerView.getPlayer().stop(true);
} else {
// https://exoplayer.dev/
// https://github.com/google/ExoPlayer
final Uri mp4VideoUri = Uri.parse(strömUrl);
final MediaSource videoSource = new ProgressiveMediaSource.Factory(videoDataSourceFactory)
.createMediaSource(mp4VideoUri);
// SÀtt den gamla videon pÄ paus medan vi förbereder den nya
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Om vi pausar hÀr efter att spelaren har pausat sig sjÀlv, nÀr den avslutat
// spela videon, fÄr vi hÀr ett andra hÀndelse STATE_ENDED, sÄ vi behöver hÀr
// en sÀrskild kontroll.
// Dessutom kommer vÀrdet för getPlayWhenReady() att förbli true, sÄ vi kontrollerar just tillstÄndet.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Förbered spelaren med kÀllan.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Ange den aktuella positionen omedelbart vid videoladdning
// (i kommentarerna nÀmns nÄgot om datakÀllor som stöder eller inte stöder
// sökningar vid laddning, verkar som att det Àr nonsens - vi gör bara sökning direkt efter laddning)
// Exoplayer spelar nya spellistor frÄn början istÀllet för angiven position
// https://github.com/google/ExoPlayer/issues/4375
// Hur man laddar ström i önskad position? #2197
// https://github.com/google/ExoPlayer/issues/2197
// hÀr Àr den normala lÀngden Ànnu inte tillgÀnglig, sÄ vi kontrollerar den inte
//if(sökTill > 0 && sökTill 0) {
// 5 sekunder tidigare
videoPlayerView.getPlayer().seekTo(sökTill - 5000 > 0 ? sökTill - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}KĂ€nda problem
- Kommer inte att spela videor med ÄldersbegrÀnsningar som krÀver inloggning pÄ Google/YouTube
till exempel: ,
tips: lÀgg sÄdana videor pÄ svarta listan eller be videoförfattaren att ta bort begrÀnsningen som stÀllts in av misstag.
- Kommer att spela vissa livevideor dÀr tjÀnsten returnerar noll lÀngd (för sÄdana videor anges lÀngden i listor och galleri som "[dur undef]")
till exempel: ,
Tips: Add such videos to the blacklist.
- Videos that are only available via direct links may not appear in the local playlist, even if you upload all the user's videos.
till exempel:
If you encounter a public video that doesn't require a login, plays in the browser, but doesn't play in the player, please send a bug report (itâs quite possible that the issue has already been fixed in the new version, NewPipeExtractor and only updating to this version will be necessary. ).
The interface may lag with slow (but not turned off) internet.
I slutÀndan
My son moved from a tablet to a Samsung smart TV, which cannot run Android applications. Therefore, the best parental control is still personal involvement.
But the app turned out to be convenient enough for me to start using it myself. My first impression from the early working versions was that I had entered another world. All content is loaded from YouTube, but it is no longer YouTube; itâs something else, safe and controlled, as if I removed a centipede from my eye and placed it in a glass jar. And itâs all about the recommendations.
KĂ€lla: habr.com
