82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
import os
|
|
import tkinter as tk
|
|
from tkinter import ttk
|
|
import threading
|
|
import yt_dlp
|
|
|
|
# Definir la carpeta donde se guardarán los archivos descargados
|
|
DOWNLOAD_FOLDER = "musicplayer"
|
|
|
|
class MusicDownloader:
|
|
def __init__(self, parent):
|
|
"""
|
|
Inicializa la interfaz gráfica para descargar música de YouTube en formato MP3.
|
|
"""
|
|
self.parent = parent
|
|
|
|
# Crear carpeta de descargas si no existe
|
|
if not os.path.exists(DOWNLOAD_FOLDER):
|
|
os.makedirs(DOWNLOAD_FOLDER)
|
|
|
|
# Etiqueta de título
|
|
title = tk.Label(self.parent, text="Descargar Música MP3", font=("Helvetica", 14, "bold"))
|
|
title.pack(pady=10)
|
|
|
|
# Campo de entrada para la URL de YouTube
|
|
self.url_label = tk.Label(self.parent, text="URL de YouTube:")
|
|
self.url_label.pack(pady=5)
|
|
self.url_entry = tk.Entry(self.parent, width=50)
|
|
self.url_entry.pack(pady=5)
|
|
|
|
# Botón para iniciar la descarga
|
|
self.download_button = tk.Button(self.parent, text="Descargar MP3", command=self.start_download, bg="lightblue")
|
|
self.download_button.pack(pady=10)
|
|
|
|
# Barra de progreso de la descarga
|
|
self.progress = ttk.Progressbar(self.parent, orient="horizontal", length=300, mode="determinate")
|
|
self.progress.pack(pady=10)
|
|
|
|
# Etiqueta de estado para mostrar mensajes
|
|
self.status_label = tk.Label(self.parent, text="", font=("Helvetica", 10))
|
|
self.status_label.pack(pady=5)
|
|
|
|
def start_download(self):
|
|
"""Inicia la descarga en un hilo separado para no bloquear la interfaz."""
|
|
url = self.url_entry.get()
|
|
if not url:
|
|
self.status_label.config(text="Por favor, ingrese una URL válida.", fg="red")
|
|
return
|
|
self.status_label.config(text="Iniciando descarga...", fg="blue")
|
|
threading.Thread(target=self.download_music, args=(url,), daemon=True).start()
|
|
|
|
def download_music(self, url):
|
|
"""Descarga el audio de YouTube en formato MP3 usando `yt-dlp`."""
|
|
try:
|
|
self.status_label.config(text="Descargando...", fg="blue")
|
|
output_template = os.path.join(DOWNLOAD_FOLDER, "%(title)s.%(ext)s")
|
|
|
|
# Opciones para descargar solo el audio y convertirlo a MP3
|
|
ydl_opts = {
|
|
'format': 'bestaudio/best',
|
|
'outtmpl': output_template,
|
|
'postprocessors': [{
|
|
'key': 'FFmpegExtractAudio',
|
|
'preferredcodec': 'mp3',
|
|
'preferredquality': '192',
|
|
}],
|
|
}
|
|
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
ydl.download([url])
|
|
|
|
self.status_label.config(text="¡Descarga completada!", fg="green")
|
|
except Exception as e:
|
|
self.status_label.config(text=f"Error: {str(e)}", fg="red")
|
|
|
|
def update_progress(self, stream, chunk, bytes_remaining):
|
|
"""Actualiza la barra de progreso durante la descarga."""
|
|
total_size = stream.filesize
|
|
bytes_downloaded = total_size - bytes_remaining
|
|
percentage = (bytes_downloaded / total_size) * 100
|
|
self.progress["value"] = percentage
|