¿Cuántas veces intentaste descargar un video YouTube, Facebook o Instagram y terminaste lidiando con páginas llenas de spam, captchas infinitos y botones falsos de "Descargar" que te querían hacer descargar software dudosísimo?
Para los que preferimos la terminal y las herramientas limpias, yt-dlp es la opción preferida. Pero a veces escribir comandos gigantes en la consola para elegir el formato ideal, configurar el audio o filtrar idiomas puede ser bastante molesto, sobre todo si no es una herramienta que quizás usamos tan seguido.
El programa que les comparto hoy: PytDown, un script interactivo en Python para la terminal que automatiza todo este proceso con una interfaz un tanto más amigable.
Originalmente el script se centraba exclusivamente en la descarga de videos de YT, luego me di cuenta que con pocas modificaciones podía adaptarse para funcionar bien con FB e IG (al momento de escribir esto la compatibilidad con IG requiere una actualización de yt-dlp ¯(ツ)/¯ )

Objetivos de este proyecto:
- Crear una interfaz interactiva en la terminal: Con tablas limpias y barras de progreso fluidas usando la librería
Rich. - Filtrar formatos duplicados y doblados: Seleccionar automáticamente el video en su idioma original, evitando descargar por error una pista doblada a otro idioma (detesto este tema de los doblajes automáticos que a veces mete YT).
- Integración con Deno: Utilizar este runtime de JavaScript para procesar las firmas y descifrados de YouTube, necesario para que las descargas no fallen.
- Convertir el script en un comando global: Usar
uvopippara instalarlo en el sistema y ejecutarlo escribiendo simplementepytdowndesde cualquier carpeta.
¿Cómo está estructurado?
Como vimos en nuestro post sobre modularización), el proyecto está dividido en trozos lógicos para que sea fácil de comprender y mantener:
pyproject.toml: Donde definimos la configuración del paquete, los requerimientos (Python >= 3.13) y cómo se registra el comando global (pytdown).src/pytdown/main.py: El punto de entrada y la interfaz de la consola. Acá es donde se arma la tabla con los formatos disponibles usandoRichy se le pide al usuario que elija qué descargar.src/pytdown/get_video_info.py: Se conecta a la URL medianteyt-dlpsin descargar nada, extrae los formatos válidos, filtra y se queda solo con lo que sirve.src/pytdown/download_video.py: Se encarga de llamar a la descarga real, de buscar la carpeta destino (con un selector de archivos visual o por consola, según este instalado tkinter) y de actualizar la barra de progreso.src/pytdown/utils.py: Tiene funciones para formatear el tamaño de los bytes (a KB, MB, GB), sanitizar nombres de archivos y chequear si FFmpeg está instalado.
¿Por qué necesitamos Deno?
Si leíste el código de extracción de datos, seguro notaste esta línea:
ydl_opts: dict[str, Any] = {
...
"js_runtimes": {"deno": {"path": deno.find_deno_bin()}}
}
¿Por qué usamos Deno? YouTube cambia constantemente la forma en que entrega los videos y usa scripts en JavaScript en su frontend para descifrar las URLs de streaming (las famosas firmas o signature ciphers). Para resolver esto sin problemas, yt-dlp necesita un intérprete de JavaScript.
En lugar de depender de engines más pesados o complejos, el paquete de Python deno nos permite instalar y acceder al binario de Deno, asegurando que yt-dlp pueda descifrar el código dinámico de YouTube sin problema.
El idioma original y la fusión con FFmpeg
Al diseñar este script nos topamos con dos problemas típicos que suelen ser bastante molestos:
1. El audio correcto
Últimamente, canales populares de YouTube suben videos con múltiples pistas de audio para distintos doblajes. Si hacés una descarga genérica, es muy probable que termines con el audio en un idioma que no querés. PytDown detecta el language original del video en los metadatos y, cuando inicia la descarga, fuerza a yt-dlp a buscar e integrar prioritariamente esa pista de audio usando el formato:format_id+bestaudio[language=original_lang]/bestaudio/best.
2. El misterio de los formatos HD (FFmpeg)
En YouTube y otras redes sociales, los videos de alta calidad (1080p, 4K, etc.) se transmiten por separado: el flujo de video va por un lado y el de audio por otro. Para poder descargar el video completo, ambos flujos deben ser descargados e integrados. La herramienta encargada de hacer esto es FFmpeg.
Si no tenés FFmpeg instalado, PytDown hace dos cosas:
- En la tabla de calidades marca el formato con un asterisco (
*) y los deshabilita visualmente. - Si intentás seleccionar uno de esos formatos de todas formas, el script termina su ejecución avisándote que necesitás instalar FFmpeg.
¿Cómo se usa?
La instalación es sencilla. Si sos del equipo de uv (herramienta moderna para gestionar proyectos de Python que recomendamos), podés clonar el repositorio e instalarlo como una herramienta global de tu sistema con un solo comando:
# Clonás el repositorio
git clone https://github.com/mcattani/pytdown.git
cd youtube_downloader
# Lo instalás globalmente en tu sistema
uv tool install .
Si preferís el método clásico con pip, también podés hacerlo:
pip install .
Una vez instalado solo tenés que abrir tu terminal y ejecutar:
pytdown
El script te va a pedir la URL, va a procesar la info y te va a mostrar una tabla. Según esté instalado o no ffmpeg:

Elegís el número de la opción, se abrirá un selector de carpetas gráfico (usando Tkinter) para que elijas dónde guardarlo (si tkinter no esta instalado te va a permitir escribir la ruta a mano), ¡y listo! Vas a ver una barra de progreso indicando que la descarga está en curso.
Como siempre, podés ver y descargar todo el código fuente del proyecto desde el repo: https://github.com/mcattani/pytdown
¿Qué te pareció el proyecto? ¿Qué otra función le agregarías? ¡Todos los comentarios son siempre bienvenidos!
Y si te sirvió de ayuda, acordate que podés invitarme un cafecito para apoyar el blog.







