Descargar videos y shorts en Python

Tiempo de lectura estimado: 3 minutos

Disclaimer
Esto es meramente con fines EDUCATIVOS. NO PARA USO COMERCIAL.
Que quede claro.
Es una manera de conocer un poco las funcionalidades y librerías que dispone Python.

Hola!.

Hoy, vamos a ver como descargar vídeos y reels de Youtube usando una interfaz amigable en Python. Cualqiuer plataforma que ofrezca vídeos, también nos servirá!

Edit: Ya me han avisado varias personas que al no disponer de FFMPEG en su sistema, el script da error. Así que, voy a fixear el problema para los que no dispongan de dicha herramienta.

 

import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
import yt_dlp
import requests
from io import BytesIO


def descargar_video():
    url = url_entry.get()  # Obtener la URL del campo de entrada
    if not url:
        messagebox.showerror("Error", "Por favor, introduce una URL válida.")
        return

    opciones = {
        'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]',  # Mejor calidad posible en MP4
        'outtmpl': '%(title)s.%(ext)s',  # Guardar con el título del video
        'merge_output_format': 'mp4',  # Asegurar salida en formato MP4
        'quiet': False,  # Mostrar información durante la descarga
        'postprocessors': [{  # Mezclar video y audio si están separados
            'key': 'FFmpegVideoConvertor',
            'preferedformat': 'mp4',
        }],
    }

    try:
        # Obtener la información del video (incluyendo miniatura)
        with yt_dlp.YoutubeDL() as ydl:
            info = ydl.extract_info(url, download=False)
            thumbnail_url = info.get('thumbnail', None)

        # Si se obtiene la miniatura, la mostramos
        if thumbnail_url:
            response = requests.get(thumbnail_url)
            img_data = response.content
            img = Image.open(BytesIO(img_data))
            img = img.resize((200, 200))  # Cambiar tamaño de la miniatura
            img_tk = ImageTk.PhotoImage(img)

            # Mostrar la miniatura en el label
            thumbnail_label.config(image=img_tk)
            thumbnail_label.image = img_tk
        else:
            messagebox.showwarning("Advertencia", "No se pudo obtener la miniatura del video.")

        # Descargar el video
        with yt_dlp.YoutubeDL(opciones) as ydl:
            ydl.download([url])

        messagebox.showinfo("Éxito", "✅ Descarga completada con éxito.")
    except Exception as e:
        messagebox.showerror("Error", f"❌ Error al descargar el video: {e}")


# Configuración de la ventana principal
root = tk.Tk()
root.title("Descargar videos y reels de YouTube")
root.geometry("600x600")

# Etiqueta
url_label = tk.Label(root, text="Introduce la URL de YouTube (Reel o Video):")
url_label.pack(pady=10)

# Campo de entrada para la URL
url_entry = tk.Entry(root, width=50)
url_entry.pack(pady=5)

# Label para mostrar la miniatura
thumbnail_label = tk.Label(root)
thumbnail_label.pack(pady=10)

# Botón de descarga
download_button = tk.Button(root, text="Descargar", command=descargar_video)
download_button.pack(pady=20)

# Ejecutar la aplicación
root.mainloop()

VERSIÓN SIN USAR FFMPEG:

import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
import yt_dlp
import requests
import subprocess
from io import BytesIO


# Función para verificar si ffmpeg está instalado
def verificar_ffmpeg():
try:
# Intentamos ejecutar el comando ffmpeg -version
subprocess.run(['ffmpeg', '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return True # Si no lanza error, ffmpeg está instalado
except FileNotFoundError:
return False # Si ocurre un error, ffmpeg no está instalado


def descargar_video():
# Verificar si ffmpeg está instalado
if not verificar_ffmpeg():
messagebox.showwarning("Advertencia", "⚠️ FFmpeg no está instalado. Descargaré el video sin combinar audio y video.")

url = url_entry.get() # Obtener la URL del campo de entrada
if not url:
messagebox.showerror("Error", "Por favor, introduce una URL válida.")
return

# Configuración de opciones si FFmpeg no está disponible
if verificar_ffmpeg():
opciones = {
'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]', # Mejor calidad posible en MP4
'outtmpl': '%(title)s.%(ext)s', # Guardar con el título del video
'merge_output_format': 'mp4', # Asegurar salida en formato MP4
'quiet': False, # Mostrar información durante la descarga
'postprocessors': [{ # Mezclar video y audio si están separados
'key': 'FFmpegVideoConvertor',
'preferedformat': 'mp4',
}],
}
else:
# Si FFmpeg no está disponible, solo descargamos el video y audio sin procesarlos
opciones = {
'format': 'bestvideo[ext=mp4]/best[ext=mp4]', # Solo descargamos video en formato MP4
'outtmpl': '%(title)s.%(ext)s', # Guardar con el título del video
'quiet': False, # Mostrar información durante la descarga
}

try:
# Obtener la información del video (incluyendo miniatura)
with yt_dlp.YoutubeDL() as ydl:
info = ydl.extract_info(url, download=False)
thumbnail_url = info.get('thumbnail', None)

# Si se obtiene la miniatura, la mostramos
if thumbnail_url:
response = requests.get(thumbnail_url)
img_data = response.content
img = Image.open(BytesIO(img_data))
img = img.resize((200, 200)) # Cambiar tamaño de la miniatura
img_tk = ImageTk.PhotoImage(img)

# Mostrar la miniatura en el label
thumbnail_label.config(image=img_tk)
thumbnail_label.image = img_tk
else:
messagebox.showwarning("Advertencia", "No se pudo obtener la miniatura del video.")

# Descargar el video
with yt_dlp.YoutubeDL(opciones) as ydl:
ydl.download([url])

messagebox.showinfo("Éxito", "✅ Descarga completada con éxito.")
except Exception as e:
messagebox.showerror("Error", f"❌ Error al descargar el video: {e}")


# Configuración de la ventana principal
root = tk.Tk()
root.title("Descargar videos y reels de YouTube")
root.geometry("600x600")

# Etiqueta
url_label = tk.Label(root, text="Introduce la URL de YouTube (Reel o Video):")
url_label.pack(pady=10)

# Campo de entrada para la URL
url_entry = tk.Entry(root, width=50)
url_entry.pack(pady=5)

# Label para mostrar la miniatura
thumbnail_label = tk.Label(root)
thumbnail_label.pack(pady=10)

# Botón de descarga
download_button = tk.Button(root, text="Descargar", command=descargar_video)
download_button.pack(pady=20)

# Ejecutar la aplicación
root.mainloop()

 

 

Deja un comentario

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar