
Proyecto python · desktopaiMedia 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.
- 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.

La aplicación
Pestaña Local: plataforma, formato, calidad, transcripción y carpeta de destino
Pestaña SSH: perfiles guardados y conexión al servidor de destino
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
- Descargar el fichero a una carpeta temporal del sistema.
- Localizarlo comparando el contenido de la carpeta antes y después.
- Conectar con Paramiko: primero por clave y, si falla, por contraseña.
- Comprobar que la carpeta remota existe y admite escritura, o crearla.
- Subir por SFTP y comparar el tamaño remoto con el local.
- 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
- 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.
Publicaciones relacionadas

DRAGO Model Runner
GUI de escritorio estilo Matrix para chatear con LLMs locales vía Ollama y crearlos desde GGUF.

Drago Mail Sender
Campañas de email desde el escritorio con tu SMTP: HTML o imagen, pie legal y envío programado.

DragoTerminal: 34 herramientas y 59 juegos en una terminal Matrix
Navaja suiza Android: SSH, bases de datos, red, IA y un arcade de 59 juegos, estilo Matrix.
Comentarios
0 comentarios






