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

Introducción detallada:
Hace un tiempo, me encontré exactamente con el mismo problema que el autor de esta maravillosa aplicación , 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:
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.
Búsqueda instantánea en la base de datos local.
=>
Agregar un nuevo canal o lista de reproducción.
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.
=>
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.
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
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
Videos favoritos e historial de visualización
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
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 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:
en inglés:
lanzamientos:
- No hay en Google Play y no habrá en el futuro cercano (Google bloquea aplicaciones que eluden la API y extraen su sitio, incluyendo el mencionado Channel Whitelist o el reproductor NewPipe)
- Compilaciones desde las fuentes:
- Descargue el apk desde la sección de lanzamientos:
- Espero que aparezca en el catálogo pronto (, pero no ha avanzado en casi un mes), pero todavía no está
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:
- para obtener datos del servicio de YouTube y
- para reproducir videos.
Código abierto, licencia libre GPLv3.
pregunta: ¿Es legal extraer sitios sin el permiso (o con la prohibición explícita) de los autores? , 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: , 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 — proyecto de apoyo del reproductor , 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 .
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
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. — 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:
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
El reproductor estará 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 :
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:
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: ,
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: ,
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:
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. ).
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
