馃帀 ¡Actualizaci贸n! Ahora tu descargador de YouTube en Python tambi茅n baja subt铆tulos

 

馃帀 ¡Actualizaci贸n! Ahora tu descargador de YouTube en Python tambi茅n baja subt铆tulos

¿Ya creaste tu app para descargar videos de YouTube con interfaz gr谩fica y arte ASCII? ¡Excelente! Ahora te traigo una mejora s煤per 煤til: descargar autom谩ticamente los subt铆tulos si est谩n disponibles. Aqu铆 te explico qu茅 cambi贸 y c贸mo funciona.


馃啎 ¿Qu茅 incluye esta actualizaci贸n?

  • ✅ Detecta si hay subt铆tulos disponibles (en espa帽ol o ingl茅s).
  • ✅ Los descarga en formato .srt.
  • ✅ Guarda los subt铆tulos en la misma carpeta que el video.
  • ✅ Notifica al usuario si no hay subt铆tulos disponibles.

馃敡 ¿C贸mo funciona?

Cuando pegas la URL del video y haces clic en “Descargar video”, la app ahora:

  1. Descarga el video como antes.
  2. Revisa si el video tiene subt铆tulos en espa帽ol (es) o ingl茅s (en).
  3. Si encuentra alguno, los convierte a .srt y los guarda.
  4. Muestra una notificaci贸n confirmando ambos archivos (video y subt铆tulos), o indica que no se encontraron subt铆tulos.

馃挕 Detalles t茅cnicos

  • Usa la biblioteca pytubefix para extraer subt铆tulos.
  • Detecta tanto subt铆tulos manuales como autom谩ticos (a.en).
  • El archivo de subt铆tulos se nombra con el t铆tulo del video, con extensi贸n .srt.

馃悕 ¿Necesito actualizar algo?

S铆. Aseg煤rate de tener la versi贸n m谩s reciente de pytubefix. Puedes instalarla o actualizarla con este comando:

pip install -U pytubefix

馃摲 Vista general de la app

La app conserva su dise帽o cl谩sico en consola con una ventana gr谩fica simple, amigable, y un toque especial con arte ASCII. Ahora adem谩s te avisa si los subt铆tulos est谩n disponibles:

Estado: Video descargado. Subt铆tulos encontrados y guardados.

O, si no hay subt铆tulos:

Estado: Video descargado. No se encontraron subt铆tulos.

馃И C贸digo completo del programa actualizado


import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from pytubefix import YouTube
import threading
import os

def descargar_video():
    url = entrada_url.get()
    carpeta = ruta_descarga.get()

    if not url:
        messagebox.showwarning("Advertencia", "Por favor, ingresa una URL de YouTube.")
        return

    try:
        boton_descargar.config(state=tk.DISABLED)
        estado.set("Descargando video...")

        yt = YouTube(url)
        video = yt.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()

        if not video:
            raise Exception("No se encontr贸 un stream compatible.")

        video_path = video.download(output_path=carpeta)
        estado.set("Video descargado. Buscando subt铆tulos...")

        # Descargar subt铆tulos si existen
        captions = yt.captions
        caption = None

        if 'es' in captions:
            caption = captions['es']
        elif 'a.en' in captions:
            caption = captions['a.en']
        elif 'en' in captions:
            caption = captions['en']

        if caption:
            srt = caption.generate_srt_captions()
            titulo_archivo = yt.title.replace(" ", "_").replace("/", "_") + ".srt"
            ruta_srt = os.path.join(carpeta, titulo_archivo)
            with open(ruta_srt, "w", encoding="utf-8") as f:
                f.write(srt)
            estado.set("Video y subt铆tulos descargados.")
            messagebox.showinfo("Completado", f"Video y subt铆tulos guardados:\n{video_path}\n{ruta_srt}")
        else:
            estado.set("Video descargado. No se encontraron subt铆tulos.")
            messagebox.showinfo("Completado", f"Video descargado:\n{video_path}\n(No se encontraron subt铆tulos)")

    except Exception as e:
        estado.set("Error en la descarga.")
        messagebox.showerror("Error", str(e))
    finally:
        boton_descargar.config(state=tk.NORMAL)

def elegir_carpeta():
    carpeta = filedialog.askdirectory()
    if carpeta:
        ruta_descarga.set(carpeta)

def iniciar_descarga():
    hilo = threading.Thread(target=descargar_video)
    hilo.start()

# Crear ventana
ventana = tk.Tk()
ventana.title("Descargador de YouTube con Subt铆tulos")
ventana.geometry("600x460")
ventana.resizable(False, False)
ventana.configure(bg="#ffffff")

# Variables
ruta_descarga = tk.StringVar()
estado = tk.StringVar(value="Esperando URL...")

# Arte ASCII
ascii_art = r"""
 __     __     ______     __         ______     __   __    
/\ \  _ \ \   /\  __ \   /\ \       /\  ___\   /\ "-.\ \   
\ \ \/ ".\ \  \ \ \/\ \  \ \ \____  \ \  __\   \ \ \-.  \  
 \ \__/".~\_\  \ \_____\  \ \_____\  \ \_____\  \ \_\\"\_\ 
  \/_/   \/_/   \/_____/   \/_____/   \/_____/   \/_/ \/_/ 
"""
etiqueta_ascii = tk.Label(
    ventana,
    text=ascii_art,
    font=("Courier", 10),
    bg="#ffffff",
    fg="#cc0000",
    justify="left"
)
etiqueta_ascii.pack(pady=(5, 0))

# Estilo
estilo = ttk.Style()
estilo.theme_use("clam")
estilo.configure("TButton", font=("Segoe UI", 10), padding=6)
estilo.configure("TLabel", font=("Segoe UI", 10), background="#ffffff")
estilo.configure("TEntry", font=("Segoe UI", 10))

# Widgets
ttk.Label(ventana, text="URL del video de YouTube:").pack(pady=10)
entrada_url = ttk.Entry(ventana, width=60)
entrada_url.pack(pady=5)

frame_carpeta = ttk.Frame(ventana)
frame_carpeta.pack(pady=10)

ttk.Entry(frame_carpeta, textvariable=ruta_descarga, width=45).pack(side=tk.LEFT, padx=(0, 10))
ttk.Button(frame_carpeta, text="Elegir carpeta", command=elegir_carpeta).pack(side=tk.LEFT)

boton_descargar = ttk.Button(ventana, text="Descargar Video", command=iniciar_descarga)
boton_descargar.pack(pady=15)

ttk.Label(ventana, textvariable=estado, foreground="blue").pack(pady=5)

ventana.mainloop()

馃殌 ¿Qu茅 sigue?

Pr贸ximas mejoras que puedes a帽adir:

  • Selecci贸n manual de idioma de subt铆tulos.
  • Conversi贸n autom谩tica a .txt.
  • Compatibilidad con listas de reproducci贸n.

¿Te gustar铆a que te ayude con alguna de estas mejoras? ¡D茅jamelo saber en los comentarios!

Comentarios

Entradas populares