La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

La introducció és breu: vull parlar del reproductor en línia de YouTube per a Android amb llistes de reproducció locals, canals i recomanacions.

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

Introducció ampliada:
Fa un temps em vaig enfrontar exactament al mateix problema que l'autor d'una meravellosa aplicació Llista blanca del canal, i vaig decidir per mi mateix exactament la mateixa actitud cap a ella: vull poder regalar al nen una tauleta o un telèfon intel·ligent amb dibuixos animats de tant en tant, però no estic gens satisfet amb on, després de 2-3 clics, el llista de recomanacions porta el nen en aplicacions estàndard: clients de YouTube.

Malauradament, després d'instal·lar l'aplicació Channel Whitelist, ja tenia un altre defecte més prosaic, però encara fatal: NIH em va semblar (i, el més important, al meu fill), la seva interfície no era gaire convenient, sobretot després de l'hàbit d'utilitzar YouTube Kids. jugador.

En general, després d'un temps vaig madurar per fer la meva pròpia implementació. Després d'un temps, va ser possible posar una etiqueta a la primera versió.

Característiques clau:

  • Afegeix els teus canals i llistes de reproducció preferides: es desaran i s'indexaran a la base de dades local
  • Desactiveu els vídeos addicionals a les llistes de reproducció afegides si no els necessiteu
  • La llista de recomanacions es genera aleatòriament només a partir dels canals i llistes de reproducció afegits a l'aplicació

Les fonts són obertes, llicència GPLv3: https://github.com/sadr0b0t/yashlang/

El que segueix és una visió general de les funcions principals amb més detall, a més d'alguns detalls tècnics sobre com reproduir vídeos de YouTube a la vostra aplicació per a Android sense utilitzar les API de Google i els embolcalls web.

A la pantalla principal i a la pantalla del reproductor: recomanacions aleatòries de canals no aleatoris

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

Cerca instantània a la base de dades local

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) => La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

Afegeix un nou canal o llista de reproducció

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

Cerqueu per nom en línia o inseriu una adreça coneguda. La llista de vídeos d'un canal o llista de reproducció es desa a una base de dades local, les icones no s'emmagatzemen a la memòria cau.

Llista de reproducció dinàmica: reprodueix els resultats de la cerca

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) => La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

A les recomanacions del vídeo, només hi haurà vídeos que compleixin la consulta de cerca.

De la mateixa manera, si obriu un vídeo des de la configuració de la llista de reproducció, només apareixeran a la llista de recomanacions els vídeos de la mateixa llista de reproducció.

Les llistes de reproducció i els canals es poden desactivar i tornar a activar temporalment

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

Tingueu en compte: els vídeos de la llista de reproducció desactivada també desapareixeran dels resultats de la cerca, de l'historial de navegació i de la llista de preferits. Però no us preocupeu, apareixeran allà de nou immediatament després que la llista de reproducció torni a activar-se.

Vídeo de llista negra

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

Un vídeo bloquejat no apareixerà a les recomanacions, als resultats de la cerca, desapareixerà de la llista de favorits i de l'historial de visualitzacions. El vídeo encara serà visible a la configuració de la llista de reproducció.

Consulta la llista negra i torna a activar els elements bloquejats per error:
Configuració > menú de capçalera > Llista negra

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

Vídeos preferits i historial de visualitzacions

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

Els vídeos preferits a la pantalla del reproductor estan marcats amb un asterisc a la cantonada superior dreta.

Menús contextuals al títol de la pantalla i fent clic llarg a les galeries i llistes

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

Copia el nom o l'adreça d'un vídeo o llista de reproducció a la pantalla de visualització o a qualsevol llista.

Inici ràpid: afegeix canals i llistes de reproducció recomanades

La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?) => La mort de Koshchei a la llista de recomanacions (és possible que YouTube sigui acollidor i segur?)

L'aplicació semblarà immediatament a les captures de pantalla anteriors.

Els canals i les llistes de reproducció innecessàries es poden desactivar o suprimir a la configuració.

Instal · lació

Pàgina del projecte: https://github.com/sadr0b0t/yashlang/
en anglès: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
llançaments: https://github.com/sadr0b0t/yashlang/releases

Tingueu en compte que canviar entre diferents versions de diferents fonts al mateix dispositiu no funcionarà a causa de les diferents signatures del fitxer apk, abans d'instal·lar la versió des d'una font nova, primer haureu d'eliminar la versió instal·lada juntament amb les dades - memòria cau de llistes de reproducció i historial de navegació (o esbrineu com transfereixen les dades).

Detalls tècnics

No requereix un compte de Google/Youtube, només es necessita Internet, utilitza biblioteques:

codi obert, llicència lliure GPLv3.

Pregunta: generalment és legal l'escrapat de llocs sense el permís (o amb una prohibició explícita) dels autors? Google elimina aplicacions de Google Play, que no utilitzen la seva API, però analitzen els seus llocs, perquè. incompleixen el seu acord d'usuari.
Resposta: És clar, legal, depèn de tu quina eina utilitzar per llegir la informació pública. A més: El tribunal nord-americà va legalitzar completament el raspat de llocs web i va prohibir que s'obstruís tècnicament, però Gul pot tenir una opinió diferent, personalment no tinc ganes d'anar a un tribunal nord-americà per convèncer-los.

Algun codi

Biblioteca NewPipeExtractor - Projecte d'ajuda al jugador Newpipe, us permet descarregar una llista de vídeos per al canal o llista de reproducció especificada, descarregar informació detallada sobre un vídeo famós (el que és visible a la pàgina web del vídeo), obtenir l'adreça de la icona del vídeo i també obtenir l'adreça de el flux de vídeo.

El codi per carregar la llista de reproducció és una mica complicat, així que no el portaré aquí, per a aquells que estiguin interessats: mireu la font, bàsicament és una classe ContentLoader.

Vegem com obtenir l'adreça del flux de vídeo des de l'adreça de la pàgina de vídeo pública i reproduir-la al reproductor.

Connecteu la biblioteca a
app/build.gradle

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

És curiós que després encara no es pugui utilitzar, perquè. els exemples es queixaran de la falta de classe Downloader. Es pot copiar al projecte des del directori de proves automàtiques NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java - funciona per a la versió 0.17.4 (sembla que aquesta part s'ha tornat a fer en una versió més nova de la biblioteca, però encara s'ha de comprovar).

Obteniu l'adreça del flux de vídeo a l'adreça de la pàgina de vídeo al lloc web de 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;
    }

L'adreça del vídeo ytVidUrl pot ser l'adreça pública de la pàgina de qualsevol vídeo del lloc de YouTube, per exemple https://www.youtube.com/watch?v=pd2RlatmNRk

El jugador ho farà ExoPlayer del mateix Google. Aquest no és un embolcall web a YouTube, sinó un veritable reproductor incrustable per reproduir qualsevol vídeo, bastant flexible i personalitzable. Inclou sap com reproduir fluxos de vídeo de YouTube, si especifiqueu l'adreça correcta. Acabem de rebre l'adreça del flux, així que anem a veure com enviar-la al reproductor.

Connecteu la biblioteca al projecte app/build.gradle:

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

No tindrem en compte tots els matisos de col·locar el component del reproductor a la pantalla de l'aplicació (pots veure'l als exemples del lloc web del projecte o al codi), només mirarem com començar a reproduir vídeos de YouTube al reproductor a l'adreça obtinguda anteriorment:

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

Problemes coneguts

  • No reproduirà vídeos amb restriccions d'edat que requereixin iniciar sessió al compte de Google/YouTube

per exemple: Ilya Muromets, Mosfilm Cinema Concern, Ruslan i Lyudmila 1a sèrie / Ruslan i Lyudmila pel·lícula 1, Mosfilm Cinema Concern

consell: afegiu aquests vídeos a la llista negra o demaneu a l'autor del vídeo que elimini la restricció establerta per error.

  • Alguns vídeos d'emissió per als quals el servei retorna una durada zero no es reproduiran (per a aquests vídeos, la durada a les llistes i la galeria està marcada com a "[dur undef]").

per exemple: Espera-ho! Tots els números Soyuzmultfilm HD (dibuixos animats per a nens), dibuixos animats de l'estudi Soyuzmultfilm, Els millors dibuixos animats Soyuzmultfilm, estudi de dibuixos animats Soyuzmultfilm

consell: afegiu aquests vídeos a la llista negra.

  • És possible que els vídeos que només estan disponibles mitjançant enllaços directes no s'incloguin a la llista de reproducció local, encara que baixeu tots els vídeos de l'usuari.

per exemple: Taming the Fire Episodi 1, Mosfilm Cinema Concern

  • Si us trobeu amb un vídeo públic que no requereix un inici de sessió, es reprodueix al navegador, però no es reprodueix al reproductor, envieu un informe d'error (és molt possible, el problema ja s'ha solucionat a la nova versió NewPipeExtractor i només caldrà actualitzar el muntatge amb aquesta versió, per exemple).

  • La interfície pot alentir-se amb una Internet lenta (però no apagada).

Com a resultat, els

El fill va passar d'una tauleta a un televisor intel·ligent de Samsung, que no pot executar aplicacions d'Android. Per tant, el millor control parental segueix sent personal.

Però l'aplicació va resultar prou convenient per començar a utilitzar-la jo mateix. La primera impressió de les primeres versions de treball va ser que vaig entrar en un altre món. Tot el contingut es descarrega de YouTube, però això ja no és YouTube, sinó una altra cosa, segura i controlada, com si us traguéssiu un centpeus de l'ull i el fiquessis en un pot de vidre. I tot és qüestió de recomanacions.

Font: www.habr.com

Afegeix comentari