Compartir
Portada de Media Downloader
Logo de Media DownloaderProyecto python · desktopai

Media Downloader

Descargador de escritorio sobre yt-dlp: vídeo o MP3, transcripción local con Whisper y subida directa a un servidor por SFTP. Interfaz Qt 6 con estética Matrix.

1 mar 20263 minde lectura
Plataformas
11+
Modelos Whisper
5
Versión
2.0
Código
~3,8k líneas
año
2026
estado
Online

Qué es Media Downloader

Media Downloader es una aplicación de escritorio en Python que pone una interfaz gráfica encima de yt-dlp. Pegas una URL, eliges vídeo o solo audio y decides el destino: una carpeta local o una carpeta de un servidor remoto al que se sube por SFTP. Si bajas audio a local, puede además transcribirlo a texto con Whisper, en tu propia máquina.

La hice para no tener que recordar comandos de yt-dlp y para mandar contenido directamente a mi servidor sin pasos intermedios. El código es público en GitHub.

Portada de Media Downloader: una URL se convierte en onda de audio y sale a MP3, transcripción o servidor SFTP

La aplicación

Pestaña Local: plataforma, formato, calidad, transcripción y carpeta de destino

Pestaña Local: plataforma, formato, calidad, transcripción y carpeta de destino

Pestaña SSH: perfiles guardados y conexión al servidor de destino

Pestaña SSH: perfiles guardados y conexión al servidor de destino

Las plataformas del selector

Las plataformas del selector

Descarga en curso (vídeo CC BY)

Descarga en curso (vídeo CC BY)

Audio transcrito con Whisper

Audio transcrito con Whisper

Explorador SFTP (servidor de demo)

Explorador SFTP (servidor de demo)

Detección de plataforma

Al pegar la URL reconoce YouTube, TikTok, Instagram, X, Twitch, Vimeo, SoundCloud, iVoox y más, y bloquea los formatos que esa web no ofrece.

Vídeo o MP3

Vídeo en MP4 desde 240p hasta la mejor calidad disponible, o solo el audio convertido a MP3 a 192 kbps con FFmpeg.

Transcripción local

Whisper convierte el MP3 descargado en un .txt con cabecera. Cinco modelos a elegir, de tiny (~39 MB) a large (~1,5 GB).

Destino SSH

Perfiles de servidor guardados, autenticación por clave o contraseña y comprobación de que la carpeta remota existe y admite escritura.

Explorador remoto

Un navegador de carpetas por SFTP para elegir el directorio de destino del servidor sin escribir la ruta a mano.

Progreso y cancelación

Porcentaje y velocidad en vivo, también durante la subida. Esc corta la descarga a mitad y Ctrl+D la lanza.

Cómo funciona por dentro

La ventana principal solo orquesta: cinco widgets (origen, opciones, pestaña local, pestaña SSH y progreso), con los estilos centralizados en un módulo, se hablan con señales de Qt. La descarga corre en un hilo aparte y devuelve el progreso a la interfaz por señales, así la ventana no se congela.

El vídeo se pide con selectores de formato de yt-dlp que prefieren pista MP4 más audio M4A y lo fusionan en MP4. El audio pasa por el postprocesador de FFmpeg a MP3. Para cancelar, el hook de progreso consulta un threading.Event en cada actualización y, si está activo, lanza una excepción que detiene yt-dlp en mitad de la descarga.

Una descarga con destino SSH

  1. Descargar el fichero a una carpeta temporal del sistema.
  2. Localizarlo comparando el contenido de la carpeta antes y después.
  3. Conectar con Paramiko: primero por clave y, si falla, por contraseña.
  4. Comprobar que la carpeta remota existe y admite escritura, o crearla.
  5. Subir por SFTP y comparar el tamaño remoto con el local.
  6. Borrar el temporal y recordar la última carpeta usada.

Transcripción con Whisper

Cuando el formato es audio y el destino es local, se activa la casilla de transcripción y un selector de modelo. Al terminar la descarga se carga el modelo elegido de Whisper y el resultado se guarda junto al MP3 como nombre_transcripcion.txt, con el archivo, el modelo y el idioma en la cabecera. La primera vez, Whisper descarga el modelo; después todo ocurre sin conexión.

El módulo tiene también una variante con marcas de tiempo por segmento, pero hoy la interfaz no la usa.

Historia del proyecto

La versión 1.0 (13 de enero de 2026) era un descargador de YouTube que ya sabía subir por SSH. Al día siguiente llegó la 2.0: lista de plataformas con sus capacidades de vídeo y audio, y transcripción con Whisper. De aquel origen quedan huellas en el código: la clase principal sigue llamándose YouTubeDownloaderApp y la configuración vive en ~/.youtube_downloader.

El 26 de febrero hice una auditoría completa. La ventana principal pasó de 1.430 a unas 700 líneas repartidas en widgets. La conexión SSH dejó de aceptar cualquier clave de host a ciegas (ahora avisa y usa known_hosts) y eliminé el plan B con sshpass y scp, que dejaba la contraseña a la vista en la lista de procesos. Los except desnudos se cambiaron por errores concretos y un log rotativo de 5 MB. La estética Matrix la comparte con DRAGO Model Runner.

Límites conocidos

Los perfiles SSH todavía no usan el llavero del sistema: mejor autenticar con clave privada. La transcripción solo funciona con descargas locales y el idioma está fijado en español. La lista de plataformas es la que declara la app; lo que se puede bajar de verdad depende de los extractores de yt-dlp. La instalación documentada es la de Ubuntu/Debian.

Tecnologías

[7]
  • Python 3.8+
  • PySide6 (Qt 6)
  • yt-dlp
  • FFmpeg
  • OpenAI Whisper
  • PyTorch
  • Paramiko (SSH/SFTP)

Materiales / Compra

Tienda: Construido sobre software libre: yt-dlp para la descarga, FFmpeg para la conversión, Whisper de OpenAI para la transcripción y Paramiko para SSH/SFTP.

Aprendizajes

La auditoría de febrero dejó dos lecciones: un fallback cómodo puede ser el agujero de seguridad más grande del proyecto, y una ventana de 1.400 líneas solo se deja tocar cuando se parte en piezas con una responsabilidad cada una.