import os import tkinter as tk from tkinter import filedialog import threading import pygame # Carpeta donde se almacenarán los archivos de música descargados DOWNLOAD_FOLDER = "musicplayer" class MusicPlayer: def __init__(self, parent): """Inicializa el reproductor de música con botones de control y lista de canciones.""" self.parent = parent self.is_playing = False # Inicializar el motor de audio pygame.mixer.init() # Crear la interfaz del reproductor self.frame = tk.Frame(self.parent, bg="lightgreen", width=200, height=100) self.frame.pack(side="bottom", padx=10, pady=10, fill="both", expand=False) # Etiqueta de título self.title_label = tk.Label(self.frame, text="Reproductor de Música", font=("Arial", 12, "bold"), bg="lightgreen") self.title_label.pack(pady=5) # Lista de canciones descargadas self.song_listbox = tk.Listbox(self.frame, width=50, height=10) self.song_listbox.pack(pady=5) self.load_songs() # Cargar canciones almacenadas # Botón para seleccionar archivo manualmente self.select_button = tk.Button(self.frame, text="Seleccionar Archivo", command=self.select_file, width=20) self.select_button.pack(pady=5) # Contenedor de botones de control self.controls_frame = tk.Frame(self.frame, bg="lightgreen") self.controls_frame.pack(pady=10) # Botón de reproducción self.play_button = tk.Button(self.controls_frame, text="▶ Reproducir", command=self.play_selected_music, width=12) self.play_button.grid(row=0, column=0, padx=5) # Botón para detener la reproducción self.stop_button = tk.Button(self.controls_frame, text="■ Detener", command=self.stop_music, state="disabled", width=12) self.stop_button.grid(row=0, column=1, padx=5) def load_songs(self): """Carga la lista de canciones almacenadas en la carpeta 'musicplayer/'.""" if not os.path.exists(DOWNLOAD_FOLDER): os.makedirs(DOWNLOAD_FOLDER) # Crear la carpeta si no existe self.song_listbox.delete(0, tk.END) # Limpiar lista antes de actualizar for file in os.listdir(DOWNLOAD_FOLDER): if file.endswith(".mp3"): # Filtrar solo archivos MP3 self.song_listbox.insert(tk.END, file) def select_file(self): """Permite al usuario seleccionar un archivo de audio manualmente.""" self.music_file = filedialog.askopenfilename(filetypes=[("Archivos de audio", "*.mp3 *.wav"), ("Todos los archivos", "*.*")]) if self.music_file: self.title_label.config(text=f"Archivo: {os.path.basename(self.music_file)}") # Mostrar el archivo seleccionado def play_selected_music(self): """Reproduce la canción seleccionada en la lista.""" selected_index = self.song_listbox.curselection() if not selected_index: return # Si no hay selección, no hacer nada selected_song = self.song_listbox.get(selected_index) self.music_file = os.path.join(DOWNLOAD_FOLDER, selected_song) self.is_playing = True self.play_button.config(state="disabled") # Deshabilitar botón de reproducción self.stop_button.config(state="normal") # Habilitar botón de detener threading.Thread(target=self._play_music_thread, daemon=True).start() # Iniciar hilo para reproducir def _play_music_thread(self): """Maneja la reproducción de la música en un hilo separado.""" pygame.mixer.music.load(self.music_file) pygame.mixer.music.play() while pygame.mixer.music.get_busy(): if not self.is_playing: pygame.mixer.music.stop() break # Salir del bucle si la música se detiene def stop_music(self): """Detiene la reproducción de música.""" self.is_playing = False self.play_button.config(state="normal") self.stop_button.config(state="disabled") pygame.mixer.music.stop()