En este momento estás viendo Descargar videos y shorts en Python

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()

 

 

SernaStd

Desarrollador web y software. Amante del diseño gráfico, diseño 3D y la locura!. Café y manos, son cosas que han de ir unidas. ¡No pongas fronteras en tus proyectos!.

Deja una respuesta