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