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.
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()
Desarrollador web • Desarrollador de software· • Amante del diseño gráfico, diseño 2D/3D
🐙 Creando nuevo tema Wordpress en GitHub
🧪 Experimentos y pruebas varias en Serna Studio Lab