Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Introduksjonen er kort: Jeg vil snakke om YouTube-nettspilleren for Android med lokale spillelister, kanaler og anbefalinger.

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Utvidet introduksjon:
For en tid siden møtte jeg nøyaktig det samme problemet som forfatteren av en fantastisk applikasjon Hviteliste for kanaler, og bestemte for meg selv nøyaktig samme holdning til det: Jeg ønsker å kunne gi barnet mitt et nettbrett eller smarttelefon med tegneserier fra tid til annen, men jeg er slett ikke fornøyd med hvor, etter 2-3 klikk, listen av anbefalinger i standardapplikasjoner – YouTube-klienter – tar barnet.

Dessverre, etter å ha installert Channel Whitelist-applikasjonen, ble det oppdaget en annen mer prosaisk, men fortsatt fatal feil - NIH Jeg (og viktigst av alt, min sønn) fant grensesnittet ikke veldig praktisk, spesielt etter vanen med å bruke YouTube Kids-spilleren.

Generelt, etter en tid var jeg klar til å gjøre min egen implementering. Etter en tid ble det mulig å sette en tag på den første utgivelsen.

Nøkkelegenskaper:

  • Legg til favorittkanalene og spillelistene dine - de vil bli lagret og indeksert i den lokale databasen
  • Innenfor lagte spillelister, slå av unødvendige videoer hvis du ikke trenger dem
  • Listen over anbefalinger genereres kun tilfeldig fra kanaler og spillelister som er lagt til applikasjonen

Åpen kildekode, GPLv3-lisens: https://github.com/sadr0b0t/yashlang/

Nedenfor er en oversikt over hovedfunksjonene i mer detalj, pluss noen tekniske detaljer om hvordan du spiller av YouTube-videoer i Android-applikasjonen din uten å bruke Google API og web-innpakninger.

På hovedskjermen og på spillerskjermen: tilfeldige anbefalinger fra ikke-tilfeldige kanaler

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Øyeblikkelig søk i lokal database

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) => Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Legg til en ny kanal eller spilleliste

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Søk etter navn på nettet eller legg inn en kjent adresse. Listen over videoer til en kanal eller spilleliste lagres i den lokale databasen; ikoner bufres ikke.

Dynamisk spilleliste - spill av søkeresultater

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) => Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

I videoanbefalingene vil det kun være videoer som tilfredsstiller søket.

På samme måte, hvis du åpner en video fra spillelisteinnstillingene, vil bare videoer fra samme spilleliste vises i listen over anbefalinger.

Spillelister og kanaler kan slås midlertidig av og på igjen

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Merk: videoer fra en deaktivert spilleliste vil også forsvinne fra søkeresultater, visningshistorikk og fra favorittlisten. Men ikke bekymre deg, de vil vises der igjen umiddelbart etter at spillelisten er slått på igjen.

Legg til en video på svartelisten

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

En blokkert video vil ikke vises i anbefalinger, i søkeresultater, og vil forsvinne fra listen over favoritter og fra visningsloggen. Videoen vil fortsatt være synlig i spillelisteinnstillingene.

Se svartelisten og aktiver gjenstander som er blokkert ved en feiltakelse:
Innstillinger > overskriftsmeny > Svarteliste

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Favorittvideoer og seerhistorikk

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Favorittvideoer på spillerskjermen er merket med en stjerne i øvre høyre hjørne.

Kontekstmenyer i skjermtittelen og langklikk i gallerier og lister

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Kopier navnet eller adressen til en video eller spilleliste i visningsskjermen eller i en hvilken som helst liste.

Rask start – legg til anbefalte kanaler og spillelister

Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?) => Koshcheis død er på listen over anbefalinger (er det mulig å gjøre YouTube koselig og trygt?)

Applikasjonen vil umiddelbart se ut som skjermbildene ovenfor.

Unødvendige kanaler og spillelister kan slås av eller slettes i innstillingene.

Installasjon

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

Husk at veksling mellom forskjellige versjoner fra forskjellige kilder på samme enhet ikke vil fungere på grunn av forskjellige signaturer til apk-filen; før du installerer versjonen fra en ny kilde, må du først slette den installerte versjonen sammen med dataene - spillelistebufferen og nettleserloggen (eller finne ut hvordan du overfører data).

Tekniske detaljer

Krever ikke en Google/YouTube-konto, du trenger bare Internett, bruker følgende biblioteker:

Åpen kildekode, gratis GPLv3-lisens.

spørsmål: Er det generelt lovlig å skrape nettsider uten tillatelse (eller med et eksplisitt forbud) fra forfatterne? Google fjerner apper fra Google Play, som ikke bruker deres API, men analyserer nettstedene deres, fordi de bryter brukeravtalen.
svar: selvfølgelig er det lov, det er opp til deg hvilket verktøy du skal bruke for å lese offentlig tilgjengelig informasjon. Dessuten: En amerikansk domstol har fullstendig legalisert skraping av nettsider og forbudt teknisk inngrep med det., men Gul kan ha en annen oppfatning; personlig har jeg ennå ikke lyst til å gå til en amerikansk domstol for å overbevise dem.

Litt kode

Bibliotek NewPipeExtractor - spillerstøtteprosjekt NewPipe, lar deg laste ned en liste over videoer for en spesifisert kanal eller spilleliste, laste ned detaljert informasjon om en kjent video (det som er synlig på videoens nettside), få ​​adressen til videoikonet og også få adressen til videoen strøm.

Koden for å laste spillelisten er litt tungvint, så jeg vil ikke gi den her, for de som er interessert, ta en titt på kildekoden, det er i utgangspunktet en klasse ContentLoader.

La oss se hvordan du får adressen til en videostrøm fra adressen til den offentlige videosiden og spiller den av i spilleren.

Koble biblioteket til
app/build.gradle

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

Det er merkelig at du etter dette fortsatt ikke vil kunne bruke den, fordi... eksempler vil klage på den manglende Downloader-klassen. Den kan kopieres til prosjektet fra katalogen for automatiserte tester NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java - fungerer for versjon 0.17.4 (det ser ut til at denne delen ble gjort om i en nyere versjon av biblioteket, men vi må fortsatt sjekke).

Få adressen til videostrømmen etter adressen til videosiden på YouTube-nettstedet:

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

Videoadressen ytVidUrl kan være den offentlige adressen til siden til en hvilken som helst video på YouTube-nettstedet, for eksempel https://www.youtube.com/watch?v=pd2RlatmNRk

Spilleren vil være exospiller fra Google selv. Dette er ikke en web-innpakning over YouTube, men en ekte innebygd spiller for å spille av videoer, ganske fleksibel og tilpassbar. Den kan også spille av videostrømmer fra YouTube hvis du gir den riktig adresse. Vi har nettopp mottatt strømadressen, så la oss se hvordan du sender den til spilleren.

Koble biblioteket til prosjektet 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 vurdere alle nyansene ved å plassere spillerkomponenten på applikasjonsskjermen (du kan se på eksemplene på prosjektets nettside eller i koden), vi vil bare se på hvordan du begynner å spille en video fra YouTube i spilleren på adressen mottatt ovenfor:

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

kjente problemer

  • Vil ikke spille av videoer med aldersbegrensninger som krever pålogging til Google/YouTube-kontoen din

for eksempel: Ilya Muromets, Mosfilm Cinema Concern, Ruslan og Lyudmila film 1, Mosfilm Film Concern

råd: legg til slike videoer på svartelisten eller be forfatteren av videoen om å fjerne begrensningen som ble satt ved en feiltakelse.

  • Noen kringkastingsvideoer som tjenesten returnerer null lengde for, spilles ikke av (for slike videoer er varigheten i listene og galleriet merket som "[dur undef]").

for eksempel: Vent på det! Alle utgaver av Soyuzmultfilm HD (Tegneserier for barn), tegneserier fra Soyuzmultfilm studio, Topp tegneserier Soyuzmultfilm, tegneserier fra Soyuzmultfilm studio

råd: legg slike videoer til svartelisten.

  • Videoer som bare er tilgjengelige via direkte lenker er kanskje ikke inkludert i den lokale spillelisten, selv om du laster ned alle brukerens videoer

for eksempel: Taming of Fire Episode 1, Mosfilm Cinema Concern

  • Hvis du kommer over en offentlig video som ikke krever pålogging, som spilles av i nettleseren, men som ikke spilles av i spilleren, send en feilrapport (det er godt mulig at problemet allerede er løst i den nye versjonen NewPipeExtractor og du trenger bare å oppdatere sammenstillingen med denne versjonen, for eksempel).

  • Grensesnittet kan tregere hvis Internett er tregt (men ikke slått av)

Som et resultat,

Sønnen min flyttet fra et nettbrett til en Samsung smart-TV, som ikke kan kjøre Android-applikasjoner. Derfor er den beste foreldrekontrollen fortsatt personlig.

Men applikasjonen viste seg å være praktisk nok til at jeg kunne begynne å bruke den selv. Førsteinntrykket fra de tidlige arbeidsversjonene var at jeg var i en annen verden. Alt innhold lastes ned fra YouTube, men dette er ikke lenger YouTube, men noe annet, trygt og kontrollert, som om du tok en tusenbein ut av øyet og puttet den i en glasskrukke. Og alt handler om anbefalingene.

Kilde: www.habr.com

Legg til en kommentar