diff --git a/syng/client.py b/syng/client.py index 8d3d42d..97ee360 100644 --- a/syng/client.py +++ b/syng/client.py @@ -119,21 +119,16 @@ class State: class Client: def __init__(self, config: dict[str, Any]): self.sio = socketio.AsyncClient(json=jsonencoder) + self.loop: Optional[asyncio.AbstractEventLoop] = None self.skipped = [] self.sources = configure_sources(config["sources"]) self.state = State() self.currentLock = asyncio.Semaphore(0) - self.player = Player(f"{config['config']['server']}/{config['config']['room']}", self.quit) + self.player = Player( + f"{config['config']['server']}/{config['config']['room']}", self.quit_callback + ) self.register_handlers() - def quit(self, event): - e = event.as_dict() - if e["event"] == b"shutdown": - quit() - # if value is None: - # return - # print(value) - def register_handlers(self) -> None: self.sio.on("update_config", self.handle_update_config) self.sio.on("skip-current", self.handle_skip_current) @@ -445,6 +440,10 @@ class Client: if self.player is not None: self.player.mpv.terminate() + def quit_callback(self): + if self.loop is not None: + asyncio.run_coroutine_threadsafe(self.sio.disconnect(), self.loop) + async def start_client(self, config: dict[str, Any]) -> None: """ Initialize the client and connect to the server. @@ -454,6 +453,8 @@ class Client: :rtype: None """ + self.loop = asyncio.get_running_loop() + self.sources.update(configure_sources(config["sources"])) if "config" in config: diff --git a/syng/player_libmpv.py b/syng/player_libmpv.py index b9364d4..379ecad 100644 --- a/syng/player_libmpv.py +++ b/syng/player_libmpv.py @@ -30,14 +30,16 @@ class Player: self.default_options = { "scale": "bilinear", } + self.quit_callback = quit_callback self.mpv.observe_property("osd-width", self.osd_size_handler) self.mpv.observe_property("osd-height", self.osd_size_handler) - # self.mpv.register_event_callback(quit_callback) - # self.mpv.observe_property("exit-handler", quit_callback) + self.mpv.register_event_callback(self.event_callback) - def event_printer(self, *args): - print(args) + def event_callback(self, event): + e = event.as_dict() + if e["event"] == b"shutdown": + self.quit_callback() def update_qr(self, qr_string: str) -> None: qr = QRCode(box_size=5, border=1) diff --git a/typings/mpv.pyi b/typings/mpv.pyi index 8bf4e56..2d724cc 100644 --- a/typings/mpv.pyi +++ b/typings/mpv.pyi @@ -38,5 +38,6 @@ class MPV: def loadfile( self, file: str, audio_file: Optional[str] = None, sub_file: Optional[str] = None ) -> None: ... + def register_event_callback(self, callback: Callable[..., Any]) -> None: ... def __setitem__(self, key: str, value: str) -> None: ... def __getitem__(self, key: str) -> str: ...