De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

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

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

Inleiding uitgebreid:
Enige tijd geleden kwam ik precies hetzelfde probleem tegen als de auteur van deze geweldige applicatie. Channel Whitelist, 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: https://github.com/sadr0b0t/yashlang/

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.

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

Directe zoekfunctie in de lokale database.

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) => De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

Voeg een nieuw kanaal of afspeellijst toe.

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

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.

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) => De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

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.

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

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

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

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

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

Favoriete video's en kijkgeschiedenis

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

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

De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

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 dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?) => De dood van Koschei in de aanbevelingen (kan YouTube gezellig en veilig worden gemaakt?)

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: https://github.com/sadr0b0t/yashlang/
in het Engels: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
uitgaven: https://github.com/sadr0b0t/yashlang/releases

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:

Open source, vrije licentie GPLv3.

Vraag: Is het legaal om websites zonder toestemming (of met een expliciet verbod) van de auteurs te parseren? Google verwijdert applicaties uit de Google Play, 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: De Amerikaanse rechtbank heeft web scraping volledig gelegaliseerd en verboden om het technisch te belemmeren., 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 NewPipeExtractor — een hulpproject voor de speler NewPipe, 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 ContentLoader.

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
app/build.gradle

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. NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java — 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:

app/src/main/java/su/sadrobot/yashlang/controller/ContentLoader.java

    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 https://www.youtube.com/watch?v=pd2RlatmNRk

De speler zal ExoPlayer 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 app/build.gradle:

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:

app/src/main/java/su/sadrobot/yashlang/WatchVideoActivity.java

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: Ilja Moeromeets, Filmconcern „Mosfilm“, Ruslan en Ljoedmila aflevering 1 / Ruslan and Lyudmila film 1, Filmconcern „Mosfilm“

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: Nou, Wacht! Alle afleveringen Soyuzmultfilm HD (tekenfilms voor kinderen), Tekenfilms van de studio Soyuzmultfilm, Top tekenfilms van Soyuzmultfilm, Tekenfilms van de studio Soyuzmultfilm

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: Temmen van Vuur, Aflevering 1, Filmconcern 'Mosfilm'

  • 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. bijvoorbeeld).

  • 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

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster