diff --git a/MainController.py b/MainController.py index 7e56f3d..215f59a 100644 --- a/MainController.py +++ b/MainController.py @@ -3,6 +3,7 @@ from models.SystemStats import SystemStats from MainView import MainView from models.NetworkingScanner import NetworkScanner from models.Sniffer import packet_callback, sniff +from models.MusicPlayer import MusicPlayerModel import tkinter as tk import time import datetime @@ -15,6 +16,7 @@ class MainController: self.sniffer_running = False self.connect_events() self.start_system_updates() + self.music_model = MusicPlayerModel() def connect_events(self): """Conecta los eventos de la vista con las funciones del controlador.""" @@ -23,6 +25,10 @@ class MainController: self.view.button_start_sniffer.config(command=self.start_sniffer_thread) self.view.button_stop_sniffer.config(command=self.stop_sniffer) + self.view.button_play_music.config(command=self.play_song) + self.view.button_stop_music.config(command=self.stop_song) + self.view.button_refresh_music.config(command=self.refresh_songs) + def start_sniffer_thread(self): """Inicia el sniffer en un hilo separado.""" @@ -142,5 +148,28 @@ class MainController: time.sleep(1) # Esperar 1 segundo antes de actualizar nuevamente + def load_songs(self): + """Carga las canciones desde el modelo y las envía a la vista.""" + self.songs, self.message = self.music_model.load_songs() + self.view.populate_music_player(self.songs) + def play_song(self): + """Reproduce la canción seleccionada.""" + selected = self.view.music_listbox.curselection() + if not selected: + self.view.root.bell() + return + song_name = self.view.music_listbox.get(selected) + message = self.music_model.play_song(song_name) + print(f"Reproduciendo: {message}") + + def stop_song(self): + """Detiene la reproducción de la canción.""" + message = self.music_model.stop_song() + print(f"Detenido: {message}") + + def refresh_songs(self): + """Actualiza la lista de canciones disponibles.""" + self.load_songs() + print(self.message) diff --git a/MainView.py b/MainView.py index 519c544..8b146b8 100644 --- a/MainView.py +++ b/MainView.py @@ -36,6 +36,8 @@ class MainView: # Crear barra de estado en el frame inferior self.create_status_bar() + + self.create_music_player() def create_tabs(self): """Crea las solapas dentro del notebook.""" @@ -121,3 +123,31 @@ class MainView: self.label_bytes_sent.pack(side="left", fill="x", expand=True) self.label_uso_memoria.pack(side="left", fill="x", expand=True) self.label_fecha_hora.pack(side="right", fill="x", expand=True) + + + def create_music_player(self): + """Crea el reproductor de música en el frame derecho.""" + label = tk.Label(self.frame_right, text="Reproductor de Música", bg="red", fg="white", font=("Arial", 12)) + label.pack(pady=10) + + # Lista de canciones + self.music_listbox = tk.Listbox(self.frame_right, height=15, width=25) + self.music_listbox.pack(pady=5) + + # Botones de control organizados verticalmente + self.button_play_music = ttk.Button(self.frame_right, text="Reproducir") + self.button_play_music.pack(pady=5, fill="x") + + self.button_stop_music = ttk.Button(self.frame_right, text="Detener") + self.button_stop_music.pack(pady=5, fill="x") + + self.button_refresh_music = ttk.Button(self.frame_right, text="Actualizar") + self.button_refresh_music.pack(pady=5, fill="x") + + + def populate_music_player(self, songs): + """Llena la lista de canciones en el reproductor.""" + self.music_listbox.delete(0, tk.END) + if songs: + for song in songs: + self.music_listbox.insert(tk.END, song) \ No newline at end of file diff --git a/__pycache__/MainController.cpython-313.pyc b/__pycache__/MainController.cpython-313.pyc index 34b5ca9..1e0f00f 100644 Binary files a/__pycache__/MainController.cpython-313.pyc and b/__pycache__/MainController.cpython-313.pyc differ diff --git a/__pycache__/MainView.cpython-313.pyc b/__pycache__/MainView.cpython-313.pyc index 8fcd564..96fdb35 100644 Binary files a/__pycache__/MainView.cpython-313.pyc and b/__pycache__/MainView.cpython-313.pyc differ diff --git a/models/MusicPlayer.py b/models/MusicPlayer.py new file mode 100644 index 0000000..eb61b90 --- /dev/null +++ b/models/MusicPlayer.py @@ -0,0 +1,37 @@ +import os +from pygame import mixer + +class MusicPlayerModel: + def __init__(self): + self.music_folder = "resources" + self.current_song = None + mixer.init() + + def load_songs(self): + """Carga las canciones desde la carpeta de recursos.""" + if not os.path.exists(self.music_folder): + os.makedirs(self.music_folder) + return [], "Carpeta 'resources' creada. Agrega canciones." + + songs = [f for f in os.listdir(self.music_folder) if f.endswith(".mp3")] + if not songs: + return [], "No se encontraron archivos MP3 en 'resources'." + + return songs, "Canciones cargadas con éxito." + + def play_song(self, song_name): + """Reproduce una canción por su nombre.""" + song_path = os.path.join(self.music_folder, song_name) + try: + mixer.music.load(song_path) + mixer.music.play() + self.current_song = song_name + return f"Reproduciendo: {song_name}" + except Exception as e: + return f"Error al reproducir: {e}" + + def stop_song(self): + """Detiene la reproducción de música.""" + mixer.music.stop() + self.current_song = None + return "Reproducción detenida." diff --git a/models/__pycache__/MusicPlayer.cpython-313.pyc b/models/__pycache__/MusicPlayer.cpython-313.pyc new file mode 100644 index 0000000..1ef4311 Binary files /dev/null and b/models/__pycache__/MusicPlayer.cpython-313.pyc differ diff --git a/models/__pycache__/NetworkingScanner.cpython-313.pyc b/models/__pycache__/NetworkingScanner.cpython-313.pyc index f2dcf5f..c4c4bc2 100644 Binary files a/models/__pycache__/NetworkingScanner.cpython-313.pyc and b/models/__pycache__/NetworkingScanner.cpython-313.pyc differ diff --git a/models/__pycache__/Sniffer.cpython-313.pyc b/models/__pycache__/Sniffer.cpython-313.pyc index ff55515..29ec3a0 100644 Binary files a/models/__pycache__/Sniffer.cpython-313.pyc and b/models/__pycache__/Sniffer.cpython-313.pyc differ diff --git a/models/__pycache__/SystemStats.cpython-313.pyc b/models/__pycache__/SystemStats.cpython-313.pyc index 3f52d13..abbc1fc 100644 Binary files a/models/__pycache__/SystemStats.cpython-313.pyc and b/models/__pycache__/SystemStats.cpython-313.pyc differ diff --git a/pruebas.py b/pruebas.py index 4486515..cb667d9 100644 --- a/pruebas.py +++ b/pruebas.py @@ -1,46 +1,60 @@ -from scapy.all import sniff -from scapy.layers.inet import IP, TCP, UDP, ICMP -from scapy.packet import Raw -import os -import datetime +import tkinter as tk +from tkinter import messagebox, Listbox +from models.MusicPlayer import MusicPlayerModel -def save_packet_to_file(packet): - """Guarda el paquete en un archivo de registro para análisis posterior.""" - with open("packet_log.txt", "a") as log_file: - log_file.write(f"{datetime.datetime.now()} - {packet.summary()}\n") - log_file.write(f"{packet.show(dump=True)}\n\n") +class MusicPlayerApp: + def __init__(self, root): + self.root = root + self.root.title("Reproductor de Música") + self.root.geometry("400x300") + + self.player = MusicPlayerModel() + self.songs, self.message = self.player.load_songs() + + # Lista de canciones + self.song_listbox = Listbox(self.root, bg="white", fg="black", font=("Arial", 12)) + self.song_listbox.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) + self.refresh_song_list() + + # Botones + self.button_frame = tk.Frame(self.root) + self.button_frame.pack(pady=10) + + self.play_button = tk.Button(self.button_frame, text="Reproducir", command=self.play_song, width=12) + self.play_button.grid(row=0, column=0, padx=5) + + self.stop_button = tk.Button(self.button_frame, text="Detener", command=self.stop_song, width=12) + self.stop_button.grid(row=0, column=1, padx=5) + + self.refresh_button = tk.Button(self.button_frame, text="Actualizar", command=self.refresh_song_list, width=12) + self.refresh_button.grid(row=0, column=2, padx=5) -def packet_callback(packet): - """Procesa y retorna información del paquete capturado.""" - packet_info = [] - if IP in packet: - ip_layer = packet[IP] - packet_info.append(f"[+] Capturado un paquete:") - packet_info.append(f" Origen: {ip_layer.src}") - packet_info.append(f" Destino: {ip_layer.dst}") - packet_info.append(f" Protocolo: {ip_layer.proto}") + def refresh_song_list(self): + """Carga las canciones en el Listbox desde la carpeta resources.""" + self.songs, self.message = self.player.load_songs() + self.song_listbox.delete(0, tk.END) + if self.songs: + for song in self.songs: + self.song_listbox.insert(tk.END, song) + else: + messagebox.showinfo("Información", self.message) - if TCP in packet: - tcp_layer = packet[TCP] - packet_info.append(f" Puerto origen: {tcp_layer.sport}") - packet_info.append(f" Puerto destino: {tcp_layer.dport}") - elif UDP in packet: - udp_layer = packet[UDP] - packet_info.append(f" Puerto origen: {udp_layer.sport}") - packet_info.append(f" Puerto destino: {udp_layer.dport}") - elif ICMP in packet: - packet_info.append(" Tipo de ICMP detectado.") + def play_song(self): + """Reproduce la canción seleccionada.""" + selected = self.song_listbox.curselection() + if not selected: + messagebox.showwarning("Advertencia", "Selecciona una canción para reproducir.") + return + song_name = self.song_listbox.get(selected) + message = self.player.play_song(song_name) + messagebox.showinfo("Reproduciendo", message) + + def stop_song(self): + """Detiene la reproducción.""" + message = self.player.stop_song() + messagebox.showinfo("Detenido", message) - if Raw in packet: - payload = packet[Raw].load.decode(errors="ignore") - packet_info.append(f" Datos (Raw): {payload}") - if "youtube.com" in payload or "YouTube" in payload: - packet_info.append(f"\n[!!!] Posible enlace de YouTube detectado:") - packet_info.append(payload) - - packet_info.append(f"[Paquete completo]: {packet.summary()}") - - # Guardar el paquete en un archivo - save_packet_to_file(packet) - - return "\n".join(packet_info) +if __name__ == "__main__": + root = tk.Tk() + app = MusicPlayerApp(root) + root.mainloop() diff --git a/resources/musica1.mp3 b/resources/musica1.mp3 new file mode 100644 index 0000000..5102a10 Binary files /dev/null and b/resources/musica1.mp3 differ