¿Te gustaría descargar videos de YouTube con una herramienta creada por ti? En este tutorial, te guiaré paso a paso para hacerlo en Python y Node.js. Además de entender cómo funciona, te animaré a personalizar y mejorar tu herramienta. ¡Vamos allá! 🚀

Nota: La calidad de los vídeos puede que no sea la mas alta debido a que los videos de mayor calidad youtube los separa en audio y video para ahorrar ancho de banda, al final del articulo se explicara un metodo para que los videos se puedan descargar con mayor calidad fusionando los dos flujos(audio y video). No nos hacemos responsables del uso que el lector le pueda dar al código, el lector es responsable del uso que le de al codigo


Parte 1: Construyendo el descargador en Python

1. Instalando yt_dlp

La biblioteca yt_dlp es una herramienta versátil para descargar contenido multimedia. Para usarla, primero debes instalarla:

pip install yt-dlp

2. Paso a paso del código

Ahora, desglosaremos el script.

Importar la biblioteca:

 import yt_dlp 

Esto trae toda la funcionalidad de yt_dlp a tu script.

Definir la función de descarga:
Creamos una función para manejar la lógica:

def download_video(url): ydl_opts = { ... } 

Aquí pasamos las configuraciones necesarias para la descarga.

Configurar opciones para yt_dlp:

ydl_opts = {
    'format': 'best',  # Descarga la mejor calidad disponible.
    'merge_output_format': 'mp4',  # Combina el video y audio en un archivo MP4.
    'outtmpl': '%(title)s.%(ext)s',  # Usa el título del video como nombre de archivo.
    'http_headers': {  # Agrega un encabezado para evitar bloqueos.
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
    }
}

Estas configuraciones le dicen a yt_dlp cómo manejar la descarga.

Usar el descargador:

with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([url])

Aquí se llama al descargador con las opciones configuradas y la URL proporcionada.

Manejar errores:
Agregamos un bloque try-except para capturar problemas:

try: ... except Exception as e: print(f"Error al descargar el video: {e}")

Pedir la URL al usuario:

if __name__ == "__main__": url = input("Introduce la URL del video de YouTube: ") download_video(url)

Esto permite que el usuario ingrese la URL directamente desde la terminal.

Código completo en Python:

import yt_dlp

def download_video(url):
    ydl_opts = {
        'format': 'best',
        'merge_output_format': 'mp4',
        'outtmpl': '%(title)s.%(ext)s',
        'http_headers': {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
        }
    }

    try:
        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])
        print("🎉 Video descargado con éxito.")
    except Exception as e:
        print(f"❌ Error al descargar el video: {e}")

if __name__ == "__main__":
    url = input("Introduce la URL del video de YouTube: ")
    download_video(url)

Parte 2: Construyendo el descargador en Node.js

1. Configura tu proyecto

Crea un directorio para tu proyecto y configura Node.js:

mkdir youtube-downloader
cd youtube-downloader
npm init -y
npm install ytdl-core 

2. Paso a paso del código

Importar módulos:

import fs from 'fs'; // Maneja el sistema de archivos. import ytdl from 'ytdl-core'; // Biblioteca para descargar videos.

Definir la función de descarga:

async function downloadVideo(url) { const output = 'video.mp4'; // Nombre del archivo descargado.

Configurar y manejar el flujo de datos:

const videoStream = ytdl(url, { quality: 'highestvideo' }); videoStream.pipe(fs.createWriteStream(output)); Esto descarga el video y lo guarda como video.mp4.

Manejar eventos de finalización y errores:

videoStream.on('end', () => { console.log("🎉 Video descargado con éxito."); }); videoStream.on('error', (err) => { console.error(`❌ Error al descargar el video: ${err}`); });

Capturar la URL desde la terminal:

if (process.argv.length < 3) { console.log("❗ Proporciona la URL del video."); console.log("Uso: node index.js <URL>"); process.exit(1); } const url = process.argv[2]; downloadVideo(url);

Código completo en Node.js:

import fs from 'fs';
import ytdl from 'ytdl-core';

async function downloadVideo(url) {
    const output = 'video.mp4';

    try {
        console.log("⏳ Descargando video...");
        const videoStream = ytdl(url, { quality: 'highestvideo' });
        videoStream.pipe(fs.createWriteStream(output));

        videoStream.on('end', () => {
            console.log("🎉 Video descargado con éxito.");
        });

        videoStream.on('error', (err) => {
            console.error(`❌ Error al descargar el video: ${err}`);
        });
    } catch (error) {
        console.error(`❌ Algo salió mal: ${error}`);
    }
}

if (process.argv.length < 3) {
    console.log("❗ Por favor, proporciona la URL del video.");
    console.log("Uso: node index.js <URL>");
    process.exit(1);
}

const url = process.argv[2];
downloadVideo(url);

Limitaciones y mejoras

El script de Node.js utiliza la opción highestvideo de ytdl-core, pero es posible que no descargue la calidad máxima debido a cómo YouTube separa los videos de alta calidad (por ejemplo, 4K o 1080p) en flujos de video y audio separados, igual va para el script de python descargara en la maxima calidad que no tenga el audio separado.

Soluciones para descargar con mejor calidad:

  1. Combinar audio y video: Usa herramientas como FFmpeg para unir los flujos en ambos scripts.
  2. Usar bibliotecas avanzadas: Integra herramientas como yt-dlp en Node.js utilizando módulos como child_process para ejecutar scripts de Python desde Node.js.

Conclusión y reto para el lector

¡Felicidades! Ahora tienes dos herramientas para descargar videos de YouTube: una en Python y otra en Node.js.
Pero esto no termina aquí. Te reto a:

  1. Crear una interfaz web para el descargador.
  2. Agregar opciones para elegir la calidad del video.
  3. Permitir descargas masivas con una lista de URLs.

¿Listo para mejorar? ¡Pon manos a la obra y comparte tu experiencia en la caja de comentarios! 🚀

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *