Inleiding kort: ik wil het hebben over de online YouTube-speler voor Android met lokale afspeellijsten, kanalen en aanbevelingen.

Inleiding uitgebreid:
Enige tijd geleden kwam ik precies hetzelfde probleem tegen als de auteur van deze geweldige applicatie. , en ik ben er op dezelfde manier over gaan denken: ik wil af en toe mijn kind de tablet of smartphone geven met tekenfilms, maar ik ben absoluut niet tevreden met waar de standaard YouTube-app na 2-3 klikken het kind naar toe leidt met de aanbevelingen.
Helaas, na het installeren van de Channel Whitelist-app ontdekte ik al een andere meer prozaïsche, maar toch fatale tekortkoming — NIH leek mij (en vooral mijn zoon) niet erg gebruiksvriendelijk, vooral na de gewoonte om de YouTube Kids-speler te gebruiken.
Over het algemeen groeide ik na enige tijd dat ik mijn eigen implementatie wilde maken. En nog wat later werd het mogelijk om de tag voor de eerste release te plaatsen.
Belangrijkste mogelijkheden:
- Voeg je favoriete kanalen en afspeellijsten toe — ze worden opgeslagen en geïndexeerd in de lokale database.
- Binnen de toegevoegde afspeellijsten kun je ongewenste video's uitzetten als je ze niet nodig hebt.
- De lijst met aanbevelingen wordt willekeurig gegenereerd uit alleen de in de applicatie toegevoegde kanalen en afspeellijsten.
De bronbestanden zijn open, licentie GPLv3:
Hierna volgt een gedetailleerde beoordeling van de belangrijkste mogelijkheden, plus een paar technische details over hoe je video's van YouTube in jouw applicatie op Android kunt afspelen zonder gebruik te maken van de Google API en web wrappers.
Op het startscherm en het afspeelscherm: willekeurige aanbevelingen uit niet-willekeurige kanalen.
Directe zoekfunctie in de lokale database.
=>
Voeg een nieuw kanaal of afspeellijst toe.
Zoek online op naam of plak een bekend adres. De lijst met video's van het kanaal of de afspeellijst wordt in de lokale database opgeslagen, iconen worden niet gecachet.
Dynamische afspeellijst — speel zoekresultaten af.
=>
In de aanbevelingen onder de video zullen er alleen video's zijn die voldoen aan de zoekopdracht.
Evenzo, als je een video opent vanuit de afspeellijst-instellingen, zullen de aanbevelingen alleen video's uit diezelfde afspeellijst bevatten.
Afspeellijsten en kanalen kunnen tijdelijk worden uitgeschakeld en weer opnieuw ingeschakeld.
Let op: clips uit een uitgeschakelde afspeellijst verdwijnen ook uit zoekresultaten, kijkgeschiedenis en de favorietenlijst. Maar maak je geen zorgen, ze verschijnen daar weer zodra de afspeellijst opnieuw is ingeschakeld.
Voeg video toe aan de zwarte lijst
Een geblokkeerde video wordt niet weergegeven in aanbevelingen, in zoekresultaten, verdwijnt uit de favorietenlijst en uit de kijkgeschiedenis. De video blijft echter zichtbaar in de afspeellijstinstellingen.
Bekijk de zwarte lijst en schakel items die per ongeluk zijn geblokkeerd opnieuw in:
Instellingen > menu in de kop > Zwarte lijst
Favoriete video's en kijkgeschiedenis
Favoriete video's op het scherm van de speler hebben een sterretje in de rechterbovenhoek.
Contextmenu’s in de kop van het scherm en bij langdurig klikken in galerieën en lijsten
Kopieer de naam of het adres van de video of afspeellijst op het afspeelscherm of in elke lijst.
Snelle start — voeg aanbevolen kanalen en afspeellijsten toe
=>
De applicatie ziet er meteen uit zoals op de screenshots hierboven.
Ongewenste kanalen en afspeellijsten kunnen worden uitgeschakeld of verwijderd in de instellingen.
Installatie
Projectpagina:
in het Engels:
uitgaven:
- Er zijn momenteel geen applicaties op Google Play en die zullen er ook voorlopig niet zijn (Google bannt applicaties die hun website zonder toestemming via de API parsers, waaronder de genoemde Channel Whitelist of de NewPipe speler)
- Verzamel uit de bronnen:
- Download apk uit het uitgaven-gedeelte:
- Ik hoop dat deze binnenkort in de catalogus verschijnt (, maar het is al bijna een maand niet verder gegaan), maar er is nog niets
Houd er rekening mee dat je niet tussen verschillende versies van verschillende bronnen op één apparaat kunt schakelen vanwege verschillende handtekeningen van het apk-bestand. Voordat je een versie uit een nieuwe bron installeert, moet je eerst de geïnstalleerde versie samen met de gegevens — cache van afspeellijsten en kijkgeschiedenis — verwijderen (of bedenken hoe je deze gegevens kunt overzetten).
Technische details
Geen Google/Youtube account vereist, alleen internet is nodig, maakt gebruik van bibliotheken:
- voor het verkrijgen van gegevens van de YouTube-service en
- voor het afspelen van video’s.
Open source, vrije licentie GPLv3.
Vraag: Is het legaal om websites zonder toestemming (of met een expliciet verbod) van de auteurs te parseren? , die hun API niet gebruiken en hun websites parseren, omdat ze in strijd zijn met hun gebruikersovereenkomst.
antwoord: natuurlijk, het is legaal, het is aan jou welke tool je gebruikt om openbare informatie te lezen. Bovendien: , maar Gul kan er anders over denken, persoonlijk heb ik nog geen zin om naar de Amerikaanse rechtbank te gaan om hen te overtuigen.
Een beetje code
Bibliotheek — een hulpproject voor de speler , stelt je in staat om een lijst met video's voor een opgegeven kanaal of afspeellijst te downloaden, gedetailleerde informatie over een bekend video te downloaden (wat zichtbaar is op de webpagina van de video), de URL van de video-icoon te krijgen, en ook de stream-URL van de video te verkrijgen.
De code voor het downloaden van de afspeellijst is een beetje omslachtig, daarom zal ik die hier niet geven, als je geïnteresseerd bent — kijk dan in de bronbestanden, het is voornamelijk de klasse .
Laten we eens kijken hoe we de stream-URL van de video kunnen verkrijgen op basis van de openbaar beschikbare pagina-URL van de video en deze afspelen in de speler.
Voeg de bibliotheek toe in
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Het is interessant dat je het na dit nog steeds niet kunt gebruiken, omdat de voorbeelden zullen klagen over de ontbrekende klasse Downloader. Deze kun je kopiëren naar het project vanuit de map voor automatische tests. — werkt voor versie 0.17.4 (het lijkt erop dat in een nieuwere versie van de bibliotheek dit gedeelte is herschreven, maar dat moet nog worden gecontroleerd).
Verkrijg de stream-URL van de video op basis van de URL van de video pagina op 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;
}Als video-adres kan ytVidUrl een openbaar adres zijn van de pagina van elke video op YouTube, bijvoorbeeld
De speler zal van Google zelf. Dit is geen webwrapper voor YouTube, maar een echte ingebedde speler voor het afspelen van video's, die voldoende flexibel en configureerbaar is. Hij kan ook videostreams van YouTube afspelen, mits het juiste adres wordt opgegeven. Het adres van de stream hebben we net verkregen, dus laten we eens kijken hoe we dat naar de speler kunnen sturen.
Voeg de bibliotheek toe aan het project :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}We zullen niet ingaan op alle details van het plaatsen van de spelercomponent op het scherm van de applicatie (je kunt de voorbeelden op de projectwebsite of in de code bekijken), maar we zullen alleen kijken naar hoe we video van YouTube kunnen afspelen in de speler met het hierboven verkregen adres:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// stop het afspelen van de huidige video als deze is geladen
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);
// Pauzeer de oude video terwijl we de nieuwe voorbereiden
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Als we hier pauzeren nadat de speler zelf op pauze is gegaan, nadat hij
// de video heeft afgespeeld, krijgen we hier een tweede STATE_ENDED event, dus
// we hebben hier een speciale controle nodig.
// Hier blijft de waarde van getPlayWhenReady() true, dus we controleren de status.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Bereid de speler voor met de bron.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Geef de huidige positie meteen op bij het laden van de video
// (in de opmerkingen wordt iets gezegd over datasources die ondersteunen of niet ondersteunen
// het zoeken bij het laden, maar het lijkt erop dat dit onzin is - laten we gewoon
// meteen na het laden het zoeken doen)
// Exoplayer speelt nieuwe afspeellijst vanaf het begin in plaats van vanaf de opgegeven positie
// https://github.com/google/ExoPlayer/issues/4375
// Hoe laad je de stream op de gewenste positie? #2197
// https://github.com/google/ExoPlayer/issues/2197
// op dit punt is de normale duur nog niet beschikbaar, dus we controleren het niet
//if(seekTo > 0 && seekTo 0) {
// 5 seconden eerder
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Bekende problemen
- Speelt geen video's met leeftijdsbeperkingen die inloggen op een Google/YouTube-account vereisen.
bijvoorbeeld: ,
Tip: voeg dergelijke video's toe aan de zwarte lijst of vraag de auteur van de video om de foutieve beperking op te heffen.
- Speelt sommige live video's niet, waarvoor de service een nulpunt teruggeeft (voor dergelijke video's is de duur in lijsten en galerijen aangegeven als „[dur undef]“)
bijvoorbeeld: ,
Tip: voeg dergelijke video's toe aan de zwarte lijst.
- Video's die alleen via directe links beschikbaar zijn, verschijnen mogelijk niet in de lokale afspeellijst, zelfs niet als je alle video's van de gebruiker uploadt.
bijvoorbeeld:
Als je een publieke video tegenkomt die geen login vereist, in de browser afspeelt, maar niet in de speler, stuur dan een bugrapport (het is goed mogelijk dat het probleem al in een nieuwe versie is opgelost) NewPipeExtractor en je alleen de build met deze versie hoeft bij te werken. ).
De interface kan haperen bij een langzame (maar niet uitgeschakelde) internetverbinding.
Uiteindelijk
Mijn zoon is overgestapt van een tablet naar een Samsung smart-tv, die geen Android-apps kan draaien. Daarom blijft persoonlijke ouderlijke controle de beste optie.
Maar de app is toch behoorlijk gebruiksvriendelijk geworden, zodat ik het zelf ben gaan gebruiken. De eerste indruk van de vroege werkende versies was dat ik in een andere wereld was beland. Alle content wordt van YouTube geladen, maar dit is al niet meer YouTube, maar iets anders, veilig en beheersbaar, alsof ik een schorpioen uit mijn oog heb getrokken en in een glazen pot heb geplaatst. Het gaat vooral om de aanbevelingen.
Bron: habr.com
