import threading import time import mido from mido import MidiFile from StoppableThread import StoppableThread from Requestor import Requestor class MediaPlayer: def __init__(self, host, port): self.requestor = Requestor(host, port) self.song_thread = None self.output = mido.open_output() def request_song(self, song_name): bytes_song = self.requestor.getSong(song_name) with open('received_song.mid', 'wb') as file: file.write(bytes_song) if self.song_thread is not None and self.song_thread.is_alive(): self.song_thread.stop() self.song_thread = StoppableThread(target=self.play_song, args=('received_song.mid',)) self.song_thread.start() def play_song(self, song_path): mid = MidiFile(song_path) try: for msg in mid.play(): if threading.current_thread().stopped(): break self.output.send(msg) except Exception as e: print(e) finally: self.output.reset() def stop_song(self): if self.song_thread is not None and self.song_thread.is_alive(): self.song_thread.stop()