95 lines
4.0 KiB
Python
95 lines
4.0 KiB
Python
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()
|