Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Introduktionen er kort: Jeg vil gerne tale om YouTube online-afspilleren til Android med lokale afspilningslister, kanaler og anbefalinger.

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Udvidet introduktion:
For nogen tid siden stod jeg over for præcis det samme problem som forfatteren til en vidunderlig ansøgning Kanalens hvidliste, og bestemte for mig selv præcis samme holdning til hende: Jeg vil gerne kunne give barnet en tablet eller smartphone med tegnefilm fra tid til anden, men jeg er slet ikke tilfreds med, hvor der efter 2-3 klik liste over anbefalinger fører barnet i standardapplikationer - YouTube-klienter.

Desværre, efter installation af Channel Whitelist-applikationen, havde den allerede en anden mere prosaisk, men stadig fatal fejl - NIH forekom mig (og vigtigst af alt for min søn) at dens grænseflade ikke var særlig bekvem, især efter vanen med at bruge YouTube Kids spiller.

Generelt modnes jeg efter nogen tid til at lave min egen implementering. Efter noget tid blev det muligt at sætte et tag på den første udgivelse.

Nøglefunktioner:

  • Tilføj dine yndlingskanaler og afspilningslister - de vil blive gemt og indekseret i den lokale database
  • Slå ekstra videoer fra i de tilføjede afspilningslister, hvis du ikke har brug for dem
  • Listen over anbefalinger genereres kun tilfældigt fra de kanaler og afspilningslister, der er føjet til applikationen

Kilderne er åbne, GPLv3-licens: https://github.com/sadr0b0t/yashlang/

Det følgende er en oversigt over de vigtigste funktioner mere detaljeret, plus nogle tekniske detaljer om, hvordan du afspiller YouTube-videoer i din Android-app uden at bruge Google API'er og web-wrappers.

På hovedskærmen og på afspillerskærmen: tilfældige anbefalinger fra ikke-tilfældige kanaler

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Øjeblikkelig søgning i den lokale database

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) => Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Tilføj en ny kanal eller afspilningsliste

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Søg på navn online eller indsæt en kendt adresse. Listen over videoer fra en kanal eller afspilningsliste gemmes i en lokal database, ikoner gemmes ikke i cache.

Dynamisk afspilningsliste - afspil søgeresultater

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) => Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

I anbefalingerne under videoen vil der kun være videoer, der opfylder søgeforespørgslen.

På samme måde, hvis du åbner en video fra afspilningslisteindstillingerne, vil kun videoer fra den samme afspilningsliste blive vist på listen med anbefalinger.

Afspilningslister og kanaler kan midlertidigt slås fra og til igen

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Bemærk venligst: videoer fra den deaktiverede afspilningsliste forsvinder også fra søgeresultaterne, browserhistorikken og fra favoritlisten. Men bare rolig, de vises der igen umiddelbart efter, at afspilningslisten er tændt igen.

Sortliste video

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

En blokeret video vises ikke i anbefalinger, i søgeresultater, forsvinder fra listen over favoritter og fra visningshistorikken. Videoen vil stadig være synlig i playlisteindstillingerne.

Se sortlisten, og genaktiver elementer, der er blokeret ved en fejl:
Indstillinger > overskriftsmenu > Sortliste

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Yndlingsvideoer og visningshistorik

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Favoritvideoer på afspillerskærmen er markeret med en stjerne i øverste højre hjørne.

Kontekstmenuer i skærmtitlen og ved langt klik i gallerier og lister

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Kopiér navnet eller adressen på en video eller afspilningsliste på visningsskærmen eller en hvilken som helst liste.

Hurtig start - tilføj anbefalede kanaler og afspilningslister

Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?) => Koshcheis død på listen over anbefalinger (er det muligt at gøre YouTube hyggeligt og sikkert?)

Applikationen vil straks se ud som skærmbillederne ovenfor.

Unødvendige kanaler og afspilningslister kan slås fra eller slettes i indstillingerne.

Installation

Projektside: https://github.com/sadr0b0t/yashlang/
på engelsk: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
udgivelser: https://github.com/sadr0b0t/yashlang/releases

Husk, at skift mellem forskellige versioner fra forskellige kilder på den samme enhed ikke vil fungere på grund af forskellige signaturer af apk-filen, før du installerer versionen fra en ny kilde, skal du først slette den installerede version sammen med dataene - playliste-cache og browserhistorik (eller find ud af, hvordan disse overfører data).

Tekniske detaljer

Kræver ikke en Google / YouTube-konto, kun internettet er nødvendigt, bruger biblioteker:

Open source, gratis licens GPLv3.

Spørgsmål: Er skrabesteder uden forfatternes tilladelse (eller med et eksplicit forbud) generelt lovligt? Google fjerner apps fra Google Play, som ikke bruger deres API, men parser deres websteder, pga. de overtræder deres brugeraftale.
Svar: Selvfølgelig er det lovligt, det er op til dig, hvilket værktøj du skal bruge til at læse offentlig information. Desuden: Den amerikanske domstol legaliserede fuldstændigt skrabning af hjemmesider og forbød, at den blev teknisk blokeret, men Gul kan have en anden mening, personligt har jeg ikke lyst til at gå til en amerikansk domstol for at overbevise dem.

Noget kode

bibliotek NewPipeExtractor - spillerhjælperprojekt NewPipe, giver dig mulighed for at downloade en liste over videoer til den angivne kanal eller afspilningsliste, downloade detaljerede oplysninger om en berømt video (hvad der er synligt på videoens webside), få ​​adressen på videoikonet og også få adressen på videostrømmen.

Koden til at indlæse afspilningslisten er lidt besværlig, så jeg vil ikke bringe den her, for dem der er interesserede - se på kilden, det er dybest set en klasse ContentLoader.

Lad os se, hvordan du får adressen på videostrømmen fra adressen på den offentlige videoside og afspiller den i afspilleren.

Tilslut biblioteket til
app/build.gradle

dependencies {
...
    // NewPipe: youtube parser
    // https://github.com/TeamNewPipe/NewPipeExtractor
    implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}

Det er mærkeligt, at det efter det stadig ikke kan bruges, fordi. eksemplerne vil klage over den manglende Downloader-klasse. Det kan kopieres til projektet fra biblioteket for automatiske tests NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java - virker til version 0.17.4 (det ser ud til, at denne del er blevet lavet om i en nyere version af biblioteket, men skal stadig kontrolleres).

Hent adressen på videostrømmen fra adressen på videosiden på YouTube-webstedet:

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;
    }

YtVidUrl-videoadressen kan f.eks. være den offentlige adresse på siden for enhver video på YouTube-webstedet https://www.youtube.com/watch?v=pd2RlatmNRk

Spilleren vil exospiller fra Google selv. Dette er ikke en web-indpakning over YouTube, men en rigtig indlejrbar afspiller til afspilning af alle videoer, ret fleksibel og kan tilpasses. Herunder ved, hvordan man afspiller videostreams fra YouTube, hvis du angiver den korrekte adresse til det. Vi har netop modtaget streamadressen, så lad os se, hvordan vi sender den til afspilleren.

Tilslut biblioteket til projektet app/build.gradle:

dependencies {
...
    // google Exoplayer
    // https://github.com/google/ExoPlayer
    // https://exoplayer.dev/
    implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}

Vi vil ikke overveje alle nuancerne ved at placere afspillerkomponenten på applikationsskærmen (du kan se det i eksemplerne på projektets hjemmeside eller i koden), vi vil kun se på, hvordan man begynder at afspille videoer fra YouTube i afspilleren på ovenstående adresse:

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

private void playVideoStream(final String streamUrl, final long seekTo) {
    if (streamUrl == null) {
        // остановить проигрывание текущего ролика, если был загружен
        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);

        // Поставим на паузу старое видео, пока готовим новое
        if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
            // Если ставить на паузу здесь после того, как плеер встал на паузу сам, закончив
            // играть видео, получим здесь второе событие STATE_ENDED, поэтому нам нужна здесь
            // специальная проверка.
            // При этом значение getPlayWhenReady() останется true, поэтому проверяем именно состояние.
            // https://github.com/google/ExoPlayer/issues/2272
            videoPlayerView.getPlayer().setPlayWhenReady(false);
        }

        // Prepare the player with the source.
        ((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);

        // Укажем текущую позицию сразу при загрузке видео
        // (в коментах что-то пишут что-то про датасорсы, которые поддерживают или не поддерживают
        // переходы seek при загрузке, похоже, что это фигня - просто делаем seek сразу после загрузки)
        // Exoplayer plays new Playlist from the beginning instead of provided position
        // https://github.com/google/ExoPlayer/issues/4375
        // How to load stream in the desired position? #2197
        // https://github.com/google/ExoPlayer/issues/2197
        // в этом месте нормлаьный duration еще не доступен, поэтому его не проверяем
        //if(seekTo > 0 && seekTo < videoPlayerView.getPlayer().getDuration()) {
        if (seekTo > 0) {
            // на 5 секунд раньше
            videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
        }
        videoPlayerView.getPlayer().setPlayWhenReady(true);
    }
}

kendte problemer

  • Vil ikke afspille videoer med aldersbegrænsninger, der kræver et Google/YouTube-kontologin

for eksempel: Ilya Muromets, Mosfilm Cinema Concern, Ruslan og Lyudmila 1. serie / Ruslan og Lyudmila film 1, Mosfilm Cinema Concern

råd: føj sådanne videoer til sortlisten, eller bed forfatteren af ​​videoen om at fjerne den begrænsning, der er angivet ved en fejl.

  • Nogle udsendelsesvideoer, for hvilke tjenesten returnerer nul længde, afspilles ikke (for sådanne videoer er varigheden i listerne og galleriet markeret som "[dur undef]").

for eksempel: Vente på det! Alle numre Soyuzmultfilm HD (Tegnefilm til børn), tegnefilm fra Soyuzmultfilm-studiet, Top tegnefilm Soyuzmultfilm, Tegnefilm studie Soyuzmultfilm

tip: føj sådanne videoer til den sorte liste.

  • Videoer, der kun er tilgængelige via direkte links, er muligvis ikke inkluderet i den lokale afspilningsliste, selvom du downloader alle brugerens videoer

for eksempel: Taming the Fire Afsnit 1, Mosfilm Cinema Concern

  • Hvis du støder på en offentlig video, der ikke kræver et login, afspilles i browseren, men ikke afspiller i afspilleren, så send en fejlrapport (det er meget muligt, problemet er allerede blevet rettet i den nye version NewPipeExtractor og du behøver kun at opdatere samlingen med denne version, for eksempel).

  • Grænsefladen kan blive langsommere med et langsomt (men ikke slukket) internet

Som følge heraf

Sønnen flyttede fra en tablet til et Samsung-smart-tv, som ikke kan køre Android-applikationer. Derfor er den bedste forældrekontrol stadig personlig.

Men applikationen viste sig at være praktisk nok til, at jeg selv kunne begynde at bruge den. Det første indtryk fra de tidlige arbejdsversioner var, at jeg kom ind i en anden verden. Alt indhold downloades fra YouTube, men det er ikke længere YouTube, men noget andet, sikkert og kontrolleret, som om man tog en tusindben ud af øjet og puttede den i en glaskrukke. Og det handler om anbefalingerne.

Kilde: www.habr.com

Tilføj en kommentar