La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

Introducción breve: quiero hablar sobre el reproductor de YouTube en línea para Android con listas de reproducción locales, canales y recomendaciones.

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

Introducción detallada:
Hace un tiempo, me encontré exactamente con el mismo problema que el autor de esta maravillosa aplicación Channel Whitelist, y definí para mí el mismo enfoque: quiero poder darle a mi hijo una tablet o un smartphone con dibujos animados de vez en cuando, pero no me gusta en absoluto a dónde lleva al niño la lista de recomendaciones en las aplicaciones estándar del cliente de YouTube después de 2-3 clics.

Desafortunadamente, después de instalar la aplicación Channel Whitelist, ya había descubierto otro defecto más prosaico, pero aún así fatal: NIH me (y, sobre todo, a mi hijo) pareció que su interfaz no era muy cómoda, especialmente después de acostumbrarme a utilizar el reproductor YouTube Kids.

En general, después de un tiempo, me decidí a hacer mi propia implementación. Después de un tiempo más, fue posible lanzar la primera versión.

Principales características:

  • Agrega tus canales y listas de reproducción favoritos; serán guardados e indexados en la base de datos local.
  • Dentro de las listas de reproducción añadidas, desactiva los videos innecesarios si no los necesitas.
  • La lista de recomendaciones se genera aleatoriamente solo a partir de los canales y listas de reproducción añadidos a la aplicación.

El código fuente es abierto, licencia GPLv3: https://github.com/sadr0b0t/yashlang/

A continuación se presenta una descripción más detallada de las principales funciones, junto con algunos detalles técnicos sobre cómo reproducir videos de YouTube en su aplicación para Android sin utilizar la API de Google y envolturas web.

En la pantalla principal y en la pantalla del reproductor: recomendaciones aleatorias de canales no aleatorios.

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

Búsqueda instantánea en la base de datos local.

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) => La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

Agregar un nuevo canal o lista de reproducción.

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

Buscar por nombre en línea o pegar una dirección conocida. La lista de videos del canal o lista de reproducción se guarda en la base de datos local; los íconos no se almacenan en caché.

Lista de reproducción dinámica: reproducir los resultados de la búsqueda.

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) => La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

En las recomendaciones bajo el video, solo habrá videos que satisfacen la consulta de búsqueda.

De manera similar, si abres un video desde la configuración de la lista de reproducción, en la lista de recomendaciones solo habrá videos de esa misma lista.

Las listas de reproducción y los canales se pueden desactivar temporalmente y volver a activar.

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

Tenga en cuenta que los videos de una lista de reproducción desactivada también desaparecerán de los resultados de búsqueda, el historial de visualización y la lista de favoritos. Pero no se preocupe, volverán a aparecer tan pronto como se reactive la lista de reproducción.

Añadir video a la lista negra

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

El video bloqueado no se mostrará en las recomendaciones, en los resultados de búsqueda, desaparecerá de la lista de favoritos y del historial de visualización. El video aún será visible en la configuración de la lista de reproducción.

Ver la lista negra y volver a activar elementos bloqueados por error:
Configuraciones > menú en la parte superior > Lista negra

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

Videos favoritos e historial de visualización

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

Los videos favoritos en la pantalla del reproductor se marcan con una estrella en la esquina superior derecha.

Menús contextuales en la parte superior de la pantalla y con un clic largo en galerías y listas

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

Copiar el nombre o la URL del video o de la lista de reproducción en la pantalla de visualización o en cualquier lista.

Inicio rápido: añadir canales y listas de reproducción recomendadas

La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?) => La muerte de Koschei en las recomendaciones (¿se puede hacer de YouTube un lugar acogedor y seguro?)

La aplicación se verá de inmediato como en las capturas de pantalla anteriores.

Los canales y listas de reproducción no deseados se pueden desactivar o eliminar en la configuración.

Instalación

Página del proyecto: https://github.com/sadr0b0t/yashlang/
en inglés: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
lanzamientos: https://github.com/sadr0b0t/yashlang/releases

Tenga en cuenta que no se puede cambiar entre diferentes versiones de diferentes fuentes en un mismo dispositivo debido a las diferentes firmas del archivo apk; antes de instalar la versión de una nueva fuente, primero debe eliminar la versión instalada junto con los datos: el caché de las listas de reproducción y el historial de visualización (o pensar en cómo transferir esos datos).

Detalles técnicos

No requiere cuenta de Google/YouTube, solo necesita Internet, utiliza bibliotecas:

Código abierto, licencia libre GPLv3.

pregunta: ¿Es legal extraer sitios sin el permiso (o con la prohibición explícita) de los autores? Google elimina del Google Play aplicaciones, que no utilizan su API y extraen sus sitios, ya que violan su acuerdo de usuario.
Respuesta: claro, es legal, es asunto suyo qué herramienta usar para leer información pública. Además: La corte de EE. UU. legalizó completamente el scraping de sitios y prohibió dificultar técnicamente su ejecución., pero puede que Gula tenga una opinión diferente; personalmente, no tengo ganas de ir a la corte estadounidense a persuadirlos.

Un poco de código

La biblioteca NewPipeExtractor — proyecto de apoyo del reproductor NewPipe, permite descargar una lista de videos de un canal o lista de reproducción específica, obtener información detallada sobre un video conocido (lo que se ve en la página web del video), obtener la dirección del ícono del video, así como la dirección del flujo de video.

El código para descargar la lista de reproducción es un poco engorroso, así que no lo incluiré aquí; a quienes les interese, pueden mirar el código fuente; principalmente, es la clase ContentLoader.

Veamos cómo obtener la dirección del flujo de video a partir de la dirección pública de la página del video y reproducirlo en el reproductor.

Conectar la biblioteca en
app/build.gradle

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

Curiosamente, después de esto, aún no se podrá utilizar, ya que los ejemplos arrojarán errores por la falta de la clase Downloader. Se puede copiar en el proyecto desde el directorio de pruebas automáticas. NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java — funciona para la versión 0.17.4 (parece que en versiones más nuevas de la biblioteca esta parte ha sido reestructurada, pero aún debe verificarse).

Obtener la dirección del flujo de video desde la dirección de la página del video en el sitio 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;
    }

Como dirección de video, ytVidUrl puede ser la dirección pública de la página de cualquier video en YouTube, por ejemplo https://www.youtube.com/watch?v=pd2RlatmNRk

El reproductor estará ExoPlayer desde Google. No es un simple envoltorio web para YouTube, sino un auténtico reproductor incrustado para reproducir cualquier video, lo suficientemente flexible y configurable. También puede reproducir flujos de video de YouTube, si se le indica la dirección correcta. Acabamos de obtener la dirección del flujo, así que veamos cómo enviarla al reproductor.

Conectar la biblioteca al proyecto app/build.gradle:

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

No vamos a considerar todos los matices de la colocación del componente del reproductor en la pantalla de la aplicación (pueden consultar los ejemplos en el sitio del proyecto o en el código), solo veremos cómo iniciar la reproducción de video de YouTube en el reproductor utilizando la dirección obtenida anteriormente:

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

private void playVideoStream(final String streamUrl, final long seekTo) {
    if (streamUrl == null) {
        // detener la reproducción del video actual, si ha sido cargado
        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);

        // Pondremos en pausa el video antiguo mientras preparamos el nuevo
        if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
            // Si pauso aquí después de que el reproductor se haya detenido solo, terminando
            // de reproducir el video, obtendremos aquí un segundo evento STATE_ENDED, por lo que necesitamos aquí
            // una verificación especial.
            // Al mismo tiempo, el valor de getPlayWhenReady() seguirá siendo true, así que verificamos exactamente el estado.
            // https://github.com/google/ExoPlayer/issues/2272
            videoPlayerView.getPlayer().setPlayWhenReady(false);
        }

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

        // Establecemos la posición actual inmediatamente al cargar el video
        // (en los comentarios dicen algo sobre fuentes de datos que soportan o no soportan
        // la búsqueda al cargar, parece que eso es una tontería - simplemente hacemos la búsqueda inmediatamente después de cargar)
        // Exoplayer reproduce la nueva lista de reproducción desde el principio en lugar de la posición proporcionada
        // https://github.com/google/ExoPlayer/issues/4375
        // ¿Cómo cargar el flujo en la posición deseada? #2197
        // https://github.com/google/ExoPlayer/issues/2197
        // en este punto, la duración normal aún no está disponible, así que no la verificamos
        //if(seekTo > 0 && seekTo < videoPlayerView.getPlayer().getDuration()) {
        if (seekTo > 0) {
            // 5 segundos antes
            videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
        }
        videoPlayerView.getPlayer().setPlayWhenReady(true);
    }
}

Problemas conocidos

  • No reproducirá videos con restricciones de edad que requieran iniciar sesión en una cuenta de Google/YouTube.

por ejemplo: Ilya Muromets, Cine-Concert «Mosfilm», Ruslan y Lyudmila episodio 1 / Ruslan and Lyudmila film 1, Cine-Concert «Mosfilm»

consejo: agregar dichos videos a la lista negra o pedir al autor del video que elimine la restricción, que fue establecida por error.

  • No reproducirá algunos videos de transmisión, para los cuales el servicio devuelve una longitud nula (para tales videos, la duración en las listas y galería se marca como «[dur undef]»)

por ejemplo: ¡Bueno, espera! Todos los episodios de Soyuzmultfilm HD (dibujos animados para niños), Dibujos animados del estudio Soyuzmultfilm, Los mejores dibujos animados de Soyuzmultfilm, Dibujos animados del estudio Soyuzmultfilm

Consejo: añadir estos videos a la lista negra.

  • Los videos disponibles solo a través de enlaces directos pueden no aparecer en la lista de reproducción local, incluso si estás subiendo todos los videos del usuario.

por ejemplo: Domar al Fuego, Episodio 1, Film Studio 'Mosfilm'

  • Si encuentras un video público que no requiere inicio de sesión, se reproduce en el navegador, pero no en el reproductor, envía un informe de error (es posible que el problema ya se haya solucionado en una nueva versión. NewPipeExtractor y solo necesites actualizar a esta versión. por ejemplo).

  • La interfaz puede ralentizarse con una conexión a internet lenta (pero no apagada).

En resumen

El hijo se mudó de la tablet a un smart TV Samsung, que no puede ejecutar aplicaciones de Android. Por lo tanto, el mejor control parental sigue siendo el personal.

Pero la aplicación resultó ser lo suficientemente cómoda como para que yo comenzara a usarla también. La primera impresión de las primeras versiones en funcionamiento es que entré a otro mundo. Todo el contenido se carga desde YouTube, pero ya no es YouTube, es algo diferente, seguro y controlado, como si hubiera sacado una alacrán del ojo y la hubiera puesto en un frasco de vidrio. Y se trata principalmente de las recomendaciones.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster