¿Cómo funcionan todos estos servicios de "Guardar video de YouTube"?

62

Quiero decir, ¿cómo funcionan, en general? ¿Cómo reciben el enlace a una transmisión de video en sí (no solo la página que contiene un reproductor Flash)?

Hice una búsqueda en la web pero no pude encontrar nada útil (todos los enlaces apuntan a dichos servicios, pero ninguno de ellos dice cómo se implementan realmente).

PaulD
fuente

Respuestas:

51

Hay un descargador de línea de comandos de código abierto muy popular llamado youtube-dl, que hace exactamente eso. Captura los enlaces de archivos de audio y video reales de un enlace de YouTube dado, o cualquier otro sitio web de video popular como Vimeo, Yahoo! Video, uStream, etc.

Para ver cómo se hace, mira en el extractor de YouTube . Eso es demasiado para mostrar aquí. Existen otros extractores para sitios más simples . Steven Penny también tiene un descargador de JavaScript simple para YouTube, que es un poco más sencillo.

Pero básicamente, para un reproductor de video Flash, debe inicializarse y configurarse a través de JavaScript. Simplemente hablando, el reproductor del objeto Flash recibirá una URL de una transmisión de video para cargar.

Para encontrar la secuencia de video, tendría que analizar el código HTML y JS de la página de video para encontrar el código de inicialización relevante, y luego intentar encontrar el enlace al archivo MP4 real. Puede estar allí en texto plano, pero también puede generarse sobre la marcha con algunos tokens de descarga específicos. A menudo, el JavaScript se ofusca para que sea más difícil rediseñarlo. O la información del video puede estar contenida en un archivo XML que JS carga de forma asíncrona.

Para el video de descarga progresiva HTML5, el archivo fuente real generalmente se menciona directamente en el elemento sourcesecundario de la videoetiqueta, por lo que si busca la página mp4o algo similar. Por ejemplo, en el programa de noticias alemán Tagesschau 100 , encontrarás:

<source src="http://media.tagesschau.de/video/2014/0626/TV-20140626-1649-5801.webl.h264.mp4" type="video/mp4">

Para tecnologías de reproducción más avanzadas como MPEG DASH o HTTP Live Streaming (HLS) de Apple, debe analizar un archivo de metainformación para obtener la transmisión de video real. El metaarchivo ( .mpdpor ejemplo, en DASH y .m3u8para HLS) contendrá enlaces a segmentos de video y audio, que luego deberá combinar para obtener un archivo reproducible.

No hay una solución general para esto. Requiere una cuidadosa inspección y depuración del sitio objetivo.

slhck
fuente
3
Una pregunta, ¿cuál es la política de Youtube / Google sobre esto? ¿Están de acuerdo con esto, o no tanto?
JMK
31
Los Términos de servicio de YouTube en §5.1.L no permiten el consumo de su contenido a través de cualquier otro medio que no sea la transmisión, por lo que, en teoría, no está permitido. Sin embargo, en la práctica, no podrán hacer cumplir eso. Cualquier descargador puede simular más o menos que solo se está transmitiendo.
slhck
2
@StevenPenny, ¿tienes alguna versión no minificada de eso?
TankorSmash
55
@slhck Flash también podría realizar solicitudes HTTP por sí mismo. En cambio, utiliza el motor HTTP del navegador. Si Flash realizara las solicitudes, no serían "visibles" para el navegador. Seguro que sería genial para los anunciantes. ;)
Daniel B
3
@slhck no pueden hacerla cumplir mediante programación , pero si logran sacar a su equipo de abogados, ¿podrían hacerlo legalmente ?
Cruncher
35

Marcador de YouTube

Así lo hice con JavaScript

Comience con el ytplayer.config.argsobjeto. Este contiene todas las URL para el video. Se divide en

url_encoded_fmt_stream_map // traditional: contains video and audio stream
adaptive_fmts              // DASH: contains video or audio stream

Cada uno de estos es una matriz separada por comas de lo que yo llamaría "objetos de flujo". Cada "objeto continuo" contendrá valores como este

url  // direct HTTP link to a video
itag // code specifying the quality
s    // signature, security measure to counter downloading

Cada URL se codificará, por lo que deberá decodificarlas. Ahora la parte difícil.

YouTube tiene al menos 3 niveles de seguridad para sus videos

unsecured // as expected, you can download these with just the unencoded URL
s         // see below
RTMPE     // uses "rtmpe://" protocol, no known method for these

Los videos RTMPE se usan típicamente en películas oficiales de larga duración, y están protegidos con SWF Verification Type 2. Esto ha existido desde 2011 y aún no se ha realizado ingeniería inversa.

Los videos de tipo "s" son los más difíciles que realmente se pueden descargar. Normalmente los verá en los videos de VEVO y similares. Comienzan con una firma como

AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5

Luego, la firma se codifica con una función como esta

function mo(a) {
  a = a.split("");
  a = lo.rw(a, 1);
  a = lo.rw(a, 32);
  a = lo.IC(a, 1);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 44);
  return a.join("")
}

Esta función es dinámica, normalmente cambia todos los días. Para hacerlo más difícil, la función está alojada en una URL como

http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js

Esto introduce el problema de la política del mismo origen . Básicamente, no puede descargar este archivo www.youtube.comporque son dominios diferentes. Una solución alternativa a este problema es CORS . Con CORS, s.ytimg.compodría agregar este encabezado

Access-Control-Allow-Origin: http://www.youtube.com

y permitiría descargar JavaScript desde www.youtube.com. Por supuesto que no hacen esto. Una solución alternativa para esta solución alternativa es utilizar un proxy CORS. Este es un proxy que responde con el siguiente encabezado a todas las solicitudes

Access-Control-Allow-Origin: *

Entonces, ahora que ha procesado su archivo JS y ha utilizado la función para codificar la firma, puede usar eso en la cadena de consulta para descargar un video.

Steven Penny
fuente
1
¿Sabes (para la reproducción DASH) cómo el reproductor de YouTube determina los intervalos de bytes que se solicitarán a la representación de los medios? El archivo MPD solo enumera segmentos.
slhck
2
No exactamente ... Hay un solo archivo para video y audio, pero YouTube los solicita por intervalos de bytes, en varios fragmentos. Si cambia a otra calidad, también cambiará el rango de bytes. Solo me pregunto cómo sabe el jugador qué segundo corresponde a qué desplazamiento de byte.
slhck
1
¿Puedes dar un ejemplo de un stipo de video y un RTMPEtipo de video?
Chloe
@SurajJain aquí hay una nueva página - Reescribiré esta respuesta ya que ahora uso un método diferente github.com/svnpenn/umber/blob/master/bmklet/youtube/download.js
Steven Penny
El enlace me da un 404. ¿Has eliminado el repositorio?
darksoulsong
1

Mi respuesta: a partir del 22 de enero de 2019, el uso de estos métodos puede quedar atrapado si intenta omitir sin vincular también su información de usuario.

¿Por qué? Como soy un nuevo usuario de esta plataforma, no puedo comentar la regla especificada por @ Daniel-B . Según los nuevos ToS (en alemán como estoy en Alemania; traduzca) para YouTube por menos de $ 6.1 G $:

Usted acepta que cualquier sistema automatizado (incluido, entre otros, cualquier robot, araña o lector fuera de línea) usarlo en los accesos del sitio web de tal manera que más solicitudes al servidor dentro de un tiempo específico dirigido por YouTube puedan producir razonablemente como un ser humano dentro del mismo período de tiempo que utiliza un navegador web estándar, no modificado, disponible públicamente;

Ahora pueden averiguar el tiempo de duración de cada solicitud y pueden rastrear si usted está violando. Cómo es posible ahora, dado este escenario y su dirección IP externa se conocerá incluso si usa una VPN para protegerse sin vincular los detalles del usuario a ningún servicio.

usuario103720
fuente
1
Bienvenido viajero del futuro ... No está claro cómo esto responde la pregunta del autor
Ramhound
Si quería advertir al autor, con respecto a una respuesta específica, debería haber enviado un comentario y rechazado cualquier respuesta que no creyera útil debido a los posibles problemas legales que podrían surgir. Esta respuesta se parece más a lo que encontraría en una publicación del foro de discusión, y Super Usuario, no es un foro de discusión
Ramhound