Guía completa para implementar un YouTube Downloader con GUI en Linux
Esta guía paso a paso te enseñará cómo instalar y utilizar un script Bash que permite descargar videos de YouTube en Linux usando una interfaz gráfica simple. El script combina yt-dlp para la descarga de videos, Zenity para los formularios gráficos y FFmpeg para la gestión de fragmentos y audio.
1. Requisitos previos
Antes de ejecutar el script, asegúrate de tener instaladas las siguientes herramientas:
- yt-dlp: un programa de línea de comandos para descargar videos desde YouTube y otros sitios. Es más rápido y actualizado que youtube-dl.
- Zenity: permite crear formularios y diálogos gráficos desde Bash.
- FFmpeg: se usa para cortar fragmentos de video y extraer audio en distintos formatos.
Si alguno de estos programas no está instalado, la ejecución del script no funcionará correctamente.
2. Instalación de dependencias
Abre la terminal y ejecuta los comandos adecuados según tu distribución de Linux:
Distribuciones basadas en Debian/Ubuntu:
sudo apt update
sudo apt install -y yt-dlp zenity ffmpeg
Distribuciones basadas en Fedora:
sudo dnf install -y yt-dlp zenity ffmpeg
Distribuciones basadas en Arch Linux:
sudo pacman -S yt-dlp zenity ffmpeg
Con esto tendrás todas las herramientas necesarias para ejecutar el script de manera segura.
3. Creación del script Bash
Ahora crearemos el archivo del script. Puedes guardarlo en tu carpeta personal con el nombre youtube-tool-gui.sh.
nano ~/youtube-tool-gui.sh
Dentro del archivo, copia el siguiente contenido completo del script:
#!/bin/bash
export NO_AT_BRIDGE=1
############################################
# CONFIGURACIÓN
############################################
BASE_DIR="$HOME/Vídeos/YouTube"
mkdir -p "$BASE_DIR"
############################################
# FORMULARIO PRINCIPAL
############################################
FORM_RESULT=$(zenity --forms \
--title="YouTube Downloader - GUI" \
--text="Rellena los campos y presiona Descargar" \
--width=650 --height=500 \
--add-entry="URL del video" \
--add-combo="Tipo de descarga" \
--combo-values="Video completo|Fragmento|Solo audio" \
--add-combo="Calidad" \
--combo-values="Alta (1080p)|Media (720p)|Baja (360p)" \
--add-entry="Inicio (hh:mm:ss) — sólo si Fragmento" \
--add-entry="Fin (hh:mm:ss) — sólo si Fragmento" \
--add-entry="Nombre del archivo (sin extensión)" \
--add-entry="Nombre de la carpeta dentro de: $BASE_DIR" \
--separator="||")
# Si el usuario cierra
[[ $? -ne 0 ]] && exit 0
############################################
# PARSING ROBUSTO DE RESULTADO (CORREGIDO)
############################################
DELIM=$'\x1F'
TMP="${FORM_RESULT//||/$DELIM}"
while [[ "$TMP" == *"$DELIM" ]]; do
TMP="${TMP%$DELIM}"
done
IFS="$DELIM" read -r -a PARTS <<< "$TMP"
for i in {0..6}; do
if [[ -z "${PARTS[i]+x}" ]]; then
PARTS[i]=""
fi
done
trim() {
local var="$*"
var="${var#"${var%%[![:space:]]*}"}"
var="${var%"${var##*[![:space:]]}"}"
printf '%s' "$var"
}
URL="$(trim "${PARTS[0]}")"
TYPE="$(trim "${PARTS[1]}")"
QUALITY="$(trim "${PARTS[2]}")"
START="$(trim "${PARTS[3]}")"
END="$(trim "${PARTS[4]}")"
NAME="$(trim "${PARTS[5]}")"
SUBFOLDER="$(trim "${PARTS[6]}")"
############################################
# VALORES POR DEFECTO
############################################
[[ -z "$TYPE" ]] && TYPE="Video completo"
[[ -z "$QUALITY" ]] && QUALITY="Alta (1080p)"
if [[ -z "$URL" ]]; then
zenity --error --text="Debes ingresar una URL válida."
exit 1
fi
[[ -z "$NAME" ]] && NAME="yt_$(date +%s)"
[[ -z "$SUBFOLDER" ]] && SUBFOLDER="descargas"
DEST="$BASE_DIR/$SUBFOLDER"
mkdir -p "$DEST"
############################################
# ARCHIVO DE SALIDA
############################################
if [[ "$TYPE" == "Solo audio" ]]; then
OUTPUT_FILE="$DEST/${NAME}.%(ext)s"
else
OUTPUT_FILE="$DEST/${NAME}.mp4"
fi
############################################
# FORMATO DE CALIDAD
############################################
case "$QUALITY" in
"Alta (1080p)") FORMAT_OPT="bestvideo[height<=1080]+bestaudio/best" ;;
"Media (720p)") FORMAT_OPT="best[height<=720]+bestaudio/best" ;;
"Baja (360p)") FORMAT_OPT="best[height<=360]+bestaudio/best" ;;
*) FORMAT_OPT="bestvideo+bestaudio" ;;
esac
############################################
# CONSTRUCCIÓN DEL COMANDO
############################################
CMD=(yt-dlp)
if [[ "$TYPE" == "Solo audio" ]]; then
CMD+=(
-x
--audio-format mp3
--audio-quality 0
-o "$OUTPUT_FILE"
"$URL"
)
else
CMD+=(
-f "$FORMAT_OPT"
-o "$OUTPUT_FILE"
"$URL"
)
if [[ "$TYPE" == "Fragmento" ]]; then
CMD+=( --external-downloader ffmpeg --external-downloader-args "-ss $START -to $END" )
fi
fi
############################################
# CONFIRMACIÓN
############################################
SUMMARY="URL: $URL
Tipo: $TYPE
Calidad: $QUALITY
Inicio: $START
Fin: $END
Nombre archivo: $NAME
Carpeta final: $DEST"
zenity --question --title="Confirmar" --text="$SUMMARY" \
--ok-label="Descargar" --cancel-label="Cancelar"
[[ $? -ne 0 ]] && exit 0
############################################
# PROGRESO REAL
############################################
(
echo "0"
echo "# Iniciando descarga..."
"${CMD[@]}" 2>&1 | while IFS= read -r line; do
if [[ "$line" =~ ([0-9]{1,3})% ]]; then
PCT="${BASH_REMATCH[1]}"
echo "$PCT"
echo "# Descargando... $PCT%"
else
echo "# $line"
fi
done
echo "100"
echo "# Finalizado"
) | zenity --progress \
--title="Descargando: $NAME" \
--text="Preparando..." \
--width=550 \
--height=150 \
--percentage=0 \
--auto-close \
--auto-kill
############################################
# RESULTADO FINAL
############################################
if [[ $? -eq 0 ]]; then
zenity --info --text="✅ Descarga finalizada con éxito en:\n$DEST/$NAME"
else
zenity --error --text="❌ Ocurrió un error durante la descarga."
fi
exit 0
4. Dar permisos de ejecución al script
Ejecuta el siguiente comando para permitir que Bash ejecute el archivo:
chmod +x ~/youtube-tool-gui.sh
5. Ejecución del descargador
Para abrir el GUI y comenzar a descargar, ejecuta:
~/youtube-tool-gui.sh
Se abrirá un formulario gráfico donde podrás rellenar todos los campos necesarios para la descarga:
- URL del video: pega la URL de YouTube.
- Tipo de descarga: Video completo, Fragmento o Solo audio.
- Calidad: Alta, Media o Baja.
- Inicio y Fin: solo si seleccionaste Fragmento.
- Nombre del archivo: cómo quieres que se guarde.
- Nombre de la carpeta: dentro de la carpeta base.
6. Confirmación y barra de progreso
Antes de iniciar, el script mostrará un resumen de todos los datos ingresados. Al confirmar, comenzará la descarga mostrando el progreso en tiempo real mediante una barra de Zenity.
7. Archivos de salida
Al finalizar, los archivos se guardarán en la ruta:
$HOME/Vídeos/YouTube/NOMBRE_DE_CARPETA
Si descargaste solo audio, el script asignará automáticamente la extensión adecuada (.mp3).
8. Personalización del script
Puedes modificarlo para adaptarlo a tus necesidades:
- Cambiar la carpeta base de descargas.
- Agregar más opciones de calidad o formato de audio.
- Integrar notificaciones del sistema para informar sobre descargas finalizadas.
- Añadir validaciones más estrictas para el tiempo de inicio y fin.
9. Consideraciones finales
Este script es una herramienta práctica y flexible para descargar videos de YouTube en Linux usando Bash y una interfaz gráfica. Funciona en cualquier distribución siempre que yt-dlp, Zenity y FFmpeg estén instalados.
Mantener yt-dlp actualizado es importante para garantizar la compatibilidad con los últimos cambios de YouTube:
yt-dlp -U
Con esta guía, cualquier usuario podrá instalar, configurar y ejecutar un descargador de YouTube con interfaz gráfica de manera segura y eficiente.