Actualizado el sábado 8 de enero de 2022
youtube-dl es un programa realizado con lenguaje Python para descargar audio y vídeo, que acepta donaciones vía Paypal, Bitcoin ¡e incluso por una cuenta IBAN en Alemania! (al proveedor de alojamiento web de esa página). Creado originalmente por Ricardo Garcia Gonzalez un programador que como veis no debe ser anglosajón… Sin embargo youtube-dl está totalmente escrito en idioma inglés y aunque el sr. García González no está activo en el proyecto, muchos otros llevan la batuta. Con licencia pública totalmente libre (libertad absoluta) traemos esta entrada para darle un uso realmente práctico a este software, desde el punto de vista venezolano.
Los detalles adicionales sobre este software lo pueden leer en la Wikipedia en castellano, pero esencialmente como dije debemos tener Python instalado y algunos otros software como ffmpeg, etc. Obviamente que sirve para descargar material del sitio YoutTube («-dl» es abreviatura de «DownLoad») pero lo podemos aprovechar para muchos otros sitios web.
Como dijimos le daremos un uso práctico: en nuestro país Venezuela contamos con poquísimos centros de datos capaces de alojar servidores web por lo que todo lo tenemos que traer desde el extranjero. La idea es descargar los vídeos en formatos adecuados para nuestro hardware, acá usamos pantallas o monitores con resoluciones de 1024 por 768 píxeles o ligeramente superiores, ¿para qué vamos a descargar resoluciones a 4K? (a menos que sea para estudiar vídeos de microorganismos o microelectrónica).
Tabla de contenido:
Consideraciones previas
Para instalar youtube-dl debemos descargar la última versión directo desde su repositorio:
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl
Actualizado el sábado 8 de enero de 2022
Para Ubuntu 20 debemos instalar, además:
sudo apt-get install python-is-python3
sudo apt install ffmpeg
Fíjense que estamos descargando de una página web cifrada (HTTPS), sin embargo si queremos comprobar que lo que descargamos es fiel y exacto del original debemos instalar la clave pública de Sergey M. para luego descargar la firma y comparar con lo que «bajamos»:
wget https://dstftw.github.io/keys/18A9236D.asc -O 18A9236D.asc
gpg --import 18A9236D.asc
sudo wget https://yt-dl.org/downloads/latest/youtube-dl.sig -O youtube-dl.sig
gpg --verify youtube-dl.sig /usr/local/bin/youtube-dl
Aunque no lo crean, las actualizaciones de youtube-dl son bastantes frecuentes, antes de comenzar cada día es bueno actualizar:
sudo youtube-dl -U
Acá estamos usando Ubuntu 18.04 de 64 bits, ese es nuestro entorno, consultamos luego la versión que tenemos instalada:
youtube-dl --version
>> 2020.05.08
Si necesitamos ver la ayuda de los parámetros youtube-dl usaremos –help. De ahora en adelante no necesitaremos del comando sudo para tener derechos de usuario raíz o administrador porque trabajaremos en nuestros propios documentos. Recomiendo que creen una carpeta con el comando mkdir con el nombre adecuado o que ustedes quieran y luego entren a esa carpeta con el comando cd [nombre_de_carpeta]. En esa carpeta guardarán los vídeos de prueba de este tutorial.
Listando las opciones de audio y vídeo
En la imagen anterior están los dos primeros comandos de actualizar y listar versión. En el tercer comando llamamos con el parámetro -F para saber cuales opciones disponemos:
youtube-dl -F https://www.youtube.com/watch?v=izQkP0l7Syw
El vídeo que hemos seleccionado para el ejemplo tiene el siguiente título:
$2,400 Laptop From 1994: Packard Bell Statesman
Ese signo de pesos al comienzo nos va a dar un poco más de trabajo, pero aprenderemos más también ¡tomen café negro, atentas y atentos!
En la primera columna bajo el encabezado «format code» tenemos unos números identificativos, en la segunda columna las extensiones (tipos de ficheros). Generalmente siempre lista primero los de audio y luego los de vídeo, pero esto no necesariamente es así siempre, ¡vamos, que debemos revisar la lista completa!
De arriba hacia abajo, los de audio, tomamos nota del código del primer fichero con extensión «.m4a», osea audio en formato MP4. No escogemos webm porque eso da para otro tutorial completo por sí solo. El número escogido es 140 (tamaño 11,70 megabytes).
Ahora con los ficheros de vídeo, teniendo muy en cuenta el tamaño de nuestro monitor, buscamos uno cuya resolución no la supere y que además esté en formato MP4. Para nuestro caso el escogido es el 135, una resolución de 854 por 480 píxeles (tamaño 16,87 megabytes)
Ahora podemos pulsar la tecla flecha arriba y editar el comando, el parámetros es con la letra efe minúscula acompañado del código escogido y la misma dirección web del vídeo.
Descargando audio y vídeo
Ahora debemos fundir audio y vídeo en un solo archivo por medio de ffmpeg sin embargo vamos a practicar el uso de guiones en BASH, haremos un archivo llamado funde_audio_video.sh con el siguiente contenido:
NOM=$1
ORDEN="ffmpeg -i \"$NOM.mp4\" -i \"$NOM.m4a\" -c:v copy -c:a aac salida.mp4"
echo $ORDEN > funde_audio_video2.sh
He agregado color para que diferenciemos bien:
- La primera línea recoge el nombre sin extensión del material descargado: en la terminal de comandos escribimos sh, luego pulsamos espacio y la escribimos la primera letra (efe)y pulsamos la tecla tabulador para que nos termine de escribir el nombre del fichero que contiene el guion. Luego pulsamos espacio y escribimos la primera letra del material descargado. Sin embargo en este caso el nombre del fichero comienza con un caracter especial (signo de pesos) que para decirle al interprete de comandos que lo tome como símbolo o carácter en vez de un comodín: escribiremos «sh funde_audio_video.sh \$» y luego sí pulsamos la tecla tabulador. Pongan atención de no pasar la extensión del archivo, ni siquiera el puntito, solo necesitamos el nombre del fichero para ser procesado en la variable $NOM en la siguiente línea.
- Usaremos una variable llamada $ORDEN con ayuda de la variable $NOM que involucra el comando ffmpeg:
- Primer parámetro -i acompañado del nombre del fichero de audio. Fíjense el uso de \» para encerrar todo el nombre del archivo porque contiene espacios además de un caracter especial.
- El segundo parámetro igual pero con el fichero de audio.
- El tercer parámetro -c:v copy le indicamos el códec, que use el mismo en que está el vídeo (sin cambios en el códec pero debemos indicarlo de manera explícita).
- El cuarto parámetro tambén es códec pero para el audio, le indicamos que utilice el formato aac.
- Por último indicamos el nombre del fichero que funde auidio y vídeo, para nuestro caso lo llamamos «salida.mp4».
- La tercer línea tomamos esa orden y la grabamos en un segundo guion llamado funde_audio_video2.sh, la idea es poder llamar ese segundo proceso por lotes ¡pero antes debemos corregir algo!
Limitando la velocidad de descarga
- Debemos ser conscientes de no acaparar todo el ancho de banda de nuestros módem, es decir, hoy en día cada conexión ADSL provista por CANTV surte a una red de área local en cada hogar, negocio u oficina. Así que debemos usar el limitador -r o –limit-rate acompañado del valor adecuado. Nosotros acá usamos «-r 850K» para indicar que vamos a bajar a 850 mil bytes por segundo; también podemos usar la letra M para indicar megabytes por segundo.
- También si nuestro ordenador tiene dos o más tarjetas de red (por ejemplo las computadoras portátiles viejas que traían para conectar por cable de red Ethernet y Wi-Fi) indicaremos que queremos utilizar explicitamente una de ellas con –source-address IP.
¿IPv4 o IPv6?
Para nuestros servidores virtuales en el exterior también podremos colocar si deseamos usar conexión por IPv4 o IPv6 usando -4, –force-ipv4 o -6, –force-ipv6, respectivamente.
Lamentablemente desde el 11 de julio de 2019 YouTube ha colocado un bloqueo a las direcciones IPv6, por lo que debemos usar –force-ipv4 si tenemos un error tipo «HTTP Error 429: Too Many Requests».
Corrigiendo el segundo guion
Si ejecutamos el segundo guion encontraremos un error: el nombre con el que comienza ambos ficheros (audio y vídeo) y el signo de pesos es interpretado como si fuera un nombre de variable. Debemos abrir con el editor de texto nano (o el que gusten) y antecederle una barra invertida de esta manera:
ffmpeg -i "\$2,400 Laptop From 1994 - Packard Bell Statesman-izQkP0l7Syw.mp4" -i "\$2,400 Laptop From 1994 - Packard Bell Statesman-izQkP0l7Syw.m4a" -c:v copy -c:a aac salida.mp4
Queda como tarea para ustedes corregir:
- Que acepte caracteres especiales en los nombres de los archivos.
- Que funcione en un solo guion.
Subtítulos
Un servicio adicional que presta YouTube (es «mucho con demasiado») consiste en agregar subtítulos de manera automatizada y además traduciendo a diversos idiomas. El siguiente ejemplo es, entonces, válido solamente para YouTube:
youtube-dl --list-subs https://www.youtube.com/watch?v=izQkP0l7Syw
Debemos leer muy bien: primero nos muestra los subtítulos automáticos que puede ser traducidos (y los formatos de fichero disponible) y al final nos muestra realmente el subtítulo disponible. Esto funciona así: uno sube un vídeo con audio en alguno de los idiomas principales y YouTube lo transcribe, más bien que mal, de manera automática, sin uno solicitarlo. Luego nuestros usuarios podrán solicitar una traducción automática a su propio idioma cuando ven el vídeo por un navegador web como Mozilla Firefox:
El visitante (ver imagen, paso 1) podrá escoger una traducción automática de los subtítulos a su idioma. En el paso 2 de la figura vemos los subtítulos por defecto, en inglés en este caso, del vídeo subido. En el tercer paso,si queremos colaborar con el autor del vídeo podremos traducir nosotros mismos, ya sea en línea o subiendo unfichero con los subtítulos ya traducidos, y agregar idiomas disponibles. Si hacemos esto debemos contar que el «dueño» del vídeo acepte nuestra colaboración, si no perderemos nuestro tiempo y trabajo (me ha sucedido eso).
Nota: también podemos usar el parámetro –all-subs y simplemente descargar todos los subtítulos posibles que tenga registrado YouTube para ese vídeo.
Es muy importante que pasemos el parámetro «-f» acompañado del número identificador de alguno de los materiales ya descargados: de esta manera youtube-dl solo descargará el subtítulo solicitado.
Para mí está bien el audio y los subtítulos, ambos, en inglés, pero también podremos descargar el subtítulo traducido de forma automática con el siguiente comando (repito, debemos consultar primero con –list-subs si están disponibles las traducciones automáticas en el idioma deseado ):
youtube-dl --write-auto-sub --sub-lang es -f 140 https://www.youtube.com/watch?v=izQkP0l7Sy
En este punto bien podemos disfrutar del vídeo con subtítulos en su idioma original pero sin audio. La tarea ahora es unir vídeo, audio y subtítulos en un solo fichero.
Subtítulos opcionales
Como ya practicamos el uso de BASH vamos a trabajar ahora directo por línea de comando directamente. En el siguiente ejemplo didáctico tenemos cuatros ficheros descargados según las secciones anteriores pero con los siguientes nombres:
- Vídeo: mi_video.mp4
- Audio: mi_audio.m4a
- Subtítulo en inglés: mi_subtitulo_ingles.vtt
- Subtítulo en castellano: mi_subtitulo_castellano.vtt
Dado este panorama usaremos lo siguiente:
ffmpeg -i mi_video.mp4 -i mi_subtitulo_ingles.vtt -i mi_audio.m4a -c:v copy -c:s mov_text -c:a aac salida_con_subtitulo_opcional.mp4
Es sumamente importante el estricto orden con que le pasemos los parámetros al comando ffmpeg
Los tres primeros parámetros -i acompañado de los nombres nombres de los ficheros le «dicen» a ffmpeg con lo que va a trabajar, en este orden: archivo de video, archivo de subtítulo y archivo de audio.
Luego los tres parámetros siguientes en el mismo orden correspondiente ordena a ffmpeg que del fichero de vídeo use el mismo códec, del fichero de subtítulo utilice el formato mov_text y del tercer fichero de audio utilize el códec aac.
Claro que fue fácil ya que solo agregamos un solo subtítulo, en inglés: ahora agreguemos en castellano pero para ello vamos a alterar el orden de los factores.
Primero le pasaremos a ffmpeg el vídeo, luego el audio, a continuación el subtítulo en inglés (cuyo audio está en inglés) y luego el subtítulo en español, nos valdremos del parámetro -map para guiar a ffmpeg:
ffmpeg -i mi_video.mp4 -i mi_audio.m4a -i mi_subtitulo_ingles.vtt -i mi_subtitulo_castellano.vtt -map 0:0 -map 1:0 -map 2:0 -map 3:0 -c:v copy -c:a aac -c:s mov_text -c:s mov_text salida_con_subtitulo_opcional.mp4
Acá lo desgloso:
ffmpeg \
-i mi_video.mp4 \
-i mi_audio.m4a \
-i mi_subtitulo_ingles.vtt \
-i mi_subtitulo_castellano.vtt \
-map 0:0 -map 1:0 -map 2:0 -map 3:0 \
-c:v copy \
-c:a aac \
-c:s mov_text \
-c:s mov_text \
salida_con_subtitulo_opcional.mp4
Resultado de nuestro trabajo
GitHub borra repositorio de youtube-dl
Actualizado el jueves 29 de octubre de 2020
Desde hace varios días hemos notado que no recibimos actualizaciones para youtube-dl… la razón de ello: GitHub, el popular repositorio sin costo para aplicaciones libres (propiedad ahora de la gigante empresa Microsoft) ha borrado los repositorios de youtube-dl (original y bifurcaciones). La petición de borrado fue hecha por la Recording Industry Association of America (Asociación de Industrias Discográficas de Estados Unidos) basándose en el hecho que en el código fuente colocaron explícitamente unos ejemplos para descargar de YouTube canciones y vídeos específicos de varios cantantes por ellos representados.
Recordemos que youtube-dl es una simple herramienta, pero al haber colocado esos ejemplos específicos lo toman para decir que «¿ven cómo violan los derechos de autor de las canciones y artistas?»; lo que yo me pregunto es ¿cómo harán para borrar todas las demás copias del repositorio en el mundo? ¿cómo impedirán que sigamos contribuyendo con más código fuente a partir de esas bifurcaciones? ¿cómo demonios borrarán las copias de respaldos de GitHub que están almacenadas y enterradas a cientos de metros en la Antártica?
En idioma castellano
En idioma francés
- «».
- «».
- «».
En idioma inglés
- «Use ffmpeg to add text subtitles».
- «Comparison of video container formats».
- «Converting WebM to MP4 Using FFmpeg».
<Eso es todo, por ahora>.