Descargar videos de sitios de streaming

Ahora que el título de este post tiene tu atención, debo aclarar que este método puede funcionar en algunos sitios pero no en otros. En particular, lo he usado para descargar de las páginas de Televisa y TV Azteca. La única forma de averiguar si funciona en la página de tu preferencia es probarlo.

En este post usaré Firefox, cURL y FFmpeg para descargar los videos así que si eres, por ejemplo, usuario de Chrome debes buscar en otro lugar.

Si sigues leyendo, entonces te interesa usar las herramientas mencionadas para descargar videos. Para empezar, recuerda que tu primera opción es probar con youtube-dl y solamente si la página de tu preferencia no es soportada entonces puedes probar con las instrucciones en este post.

Originalmente empecé a usar este método en la página de Televisa para descargar los capítulos de Lost Canvas, aunque algunos capítulos nunca estuvieron disponibles 😦 . Ahora lo estoy usando en la página de TV Azteca para descargar los capítulos de Ranma, de los que algunos tampoco están disponilbes 😦 .

Muchos sitios de streaming usan el formato m3u8 para crear una lista de reproducción de pequeños fragmentos que conforman el video. Podemos usar las herramientas de desarrollador de Firefox para obtener la información para descargar los fragmentos. Para hacerlo debemos abrir las herramientas de desarrollador con Ctrl+Shift+I y seleccionar la pestaña Red o Network. Ahora podemos abrir la página con el video que queremos descargar y veremos toda la actividad de red en la pestaña de herramientas de desarrollador. En cuanto el video empiece a reproducirse podemos detenerlo o pausarlo y escribir en el filtro de URLs la extensión m3u8; esto nos mostrará el archivo m3u8 que contiene la información de los fragmentos del video. Si seleccionamos ese archivo en la ventana de herramientas de desarrollador podemos hacer click derecho sobre el nombre del archivo y seleccionar la opción de “Copiar > Copiar como cURL”, esto pondrá en el portapapeles el comando de curl para descargar el archivo m3u8 así que podemos abrir una ventana de terminal y pegar el comando agregando el caracter de redirección ‘>’ para enviar la salida del comando a un archivo (nota que en este post he truncado los comandos de curl para mostrar solamente la información más relevante):

monstruosoft@debian:/dev/shm$ curl 'http://tvazvod-i.azteca7.com/index_0_av.m3u8' -H 'Origin: http://www.azteca7.com' > ranma.m3u8

Obviamente debes tener curl instalado para que el comando anterior funcione. Una vez descargado el archivo m3u8 podemos abrirlo para ver una lista de URLs para todos los fragmentos del video pero, más importante en este caso, podemos ver el número total de fragmentos:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:YES
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10.000,
http://tvazvod-i.azteca7.com/segment1_0_av.ts 
…
…
#EXTINF:10.000,
http://tvazvod-i.azteca7.com/segment357_0_av.ts
#EXTINF:0.509,
http://tvazvod-i.azteca7.com/segment358_0_av.ts
#EXT-X-ENDLIST

Ahora que conocemos el número total de fragmentos del video (358 en esta caso) podemos regresar a Firefox y seleccionar en la ventana de desarrollador el primer fragmento del video (archivo con extensión .ts y del tipo mp2t) y seleccionar una vez más la opción de “Copiar > Copiar como cURL”, esto nos dará una vez más el comando de curl con toda la información necesaria para descargar un fragmento pero a diferencia del paso anterior no queremos descargar manualmente cada uno de los 358 fragmentos, en cambio podemos usar un ciclo for() estilo C para descargar todos los fragmentos del video, por ejemplo:

monstruosoft@debian:/dev/shm$ FRAGMENTOS=358
monstruosoft@debian:/dev/shm$ for (( i = 1; i <= $FRAGMENTOS; i++ ))
> do
> curl 'http://tvazvod-i.azteca7.com/segment'"$i"'_0_av.ts' -H 'Origin: http://www.azteca7.com' > "ranma-$i.mp4"
> done

Nota que en el comando anterior he asignado el número total del fragmentos a la variable para el ciclo for() y he reemplazado el número de segmento del link original (por ejemplo segment358_0_av.ts) con la variable usada en el ciclo for() (segment'”$i”‘_0_av.ts). Notarás también que estoy usando /dev/shm para descargar los archivos, esto es porque estos archivos son temporales y al final serán eliminados pero puedes usar cualquier otra ruta, sobre todo si /dev/shm no tiene suficiente espacio libre si intentas descargar archivos muy grandes.

Cuando el ciclo for() anterior termine su ejecución habrá descargado todos los fragmentos del video. Ahora tenemos 358 fragmentos con duración de 10 segundos cada uno. Aunque podemos reproducirlos, no es precisamente la mejor forma para almacenar nuestros videos. En el último paso de este post usaremos FFmpeg para unir todos los fragmentos en un solo archivo.

Si buscas información sobre la opción concat de FFmpeg encontrarás las instrucciones exactas para unir los fragmentos de video que tenemos. En primer lugar debemos crear un archivo de texto con la lista de archivos que hemos descargado (nota que deben aparecer en el orden correcto):

monstruosoft@debian:/dev/shm$ for f in $(ls -v ranma*)
> do 
> echo "file '$f'" >> ranma.txt
> done

Ahora podemos unir los fragmentos con FFmpeg:

monstruosoft@debian:/dev/shm$ ffmpeg -f concat -safe 0 -i ranma.txt -c copy ranma-completo.mp4

¡Felicidades! Ahora tienes un archivo con el video completo que has descargado. Puedes copiar el video completo a tu carpeta de videos y eliminar todos los archivos de fragmentos de video.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s