From d4cf649735bfb2e1c226a93f9b0542e876dde23a Mon Sep 17 00:00:00 2001 From: Christoph Stahl Date: Thu, 10 Oct 2024 12:24:00 +0200 Subject: [PATCH] Skipping playback now works reliably --- syng/client.py | 49 +++++++++++++++++++++++++------------------ syng/player_libmpv.py | 21 ++++++++++++++----- typings/mpv.pyi | 1 + 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/syng/client.py b/syng/client.py index fb6e4ca..8d3d42d 100644 --- a/syng/client.py +++ b/syng/client.py @@ -119,15 +119,21 @@ class State: class Client: def __init__(self, config: dict[str, Any]): self.sio = socketio.AsyncClient(json=jsonencoder) - self.skipped = False - self.config = config + self.skipped = [] self.sources = configure_sources(config["sources"]) self.state = State() self.currentLock = asyncio.Semaphore(0) - print("blubb") - self.player = Player() + self.player = Player(f"{config['config']['server']}/{config['config']['room']}", self.quit) 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) @@ -166,11 +172,12 @@ class Client: :rtype: None """ logger.info("Skipping current") + self.skipped.append(data["uuid"]) + entry = Entry(**data) print("Skipping: ", entry.title) source = self.sources[entry.source] - self.skipped = True await source.skip_current(Entry(**data)) self.player.skip_current() # if self.state.current_source is not None: @@ -283,20 +290,20 @@ class Client: f"Playing: {entry.artist} - {entry.title} [{entry.album}] " f"({entry.source}) for {entry.performer}" ) - try: - # self.state.current_source = self.sources[entry.source] - if self.state.config["preview_duration"] > 0: - await self.preview(entry) - video, audio = await source.ensure_playable(entry) - await self.player.play(video, audio, source.extra_mpv_options) - # await self.sources[entry.source].play( - # entry, self.player, self.state.config["mpv_options"] - # ) - except Exception: # pylint: disable=broad-except - print_exc() - self.state.current_source = None + print(entry) + print(self.skipped) + if entry.uuid not in self.skipped: + try: + if self.state.config["preview_duration"] > 0: + await self.preview(entry) + video, audio = await source.ensure_playable(entry) + if entry.uuid not in self.skipped: + self.skipped = [] + await self.player.play(video, audio, source.extra_mpv_options) + except Exception: # pylint: disable=broad-except + print_exc() if self.skipped: - self.skipped = False + self.skipped.remove(entry.uuid) await self.sio.emit("get-first") else: await self.sio.emit("pop-then-get-next") @@ -353,14 +360,16 @@ class Client: """ if data["success"]: logger.info("Registered") - + qr_string = f"{self.state.config['server']}/{data['room']}" + self.player.update_qr(qr_string) # this is borked on windows if os.name != "nt": print(f"Join here: {self.state.config['server']}/{data['room']}") qr = QRCode(box_size=20, border=2) - qr.add_data(f"{self.state.config['server']}/{data['room']}") + qr.add_data(qr_string) qr.make() qr.print_ascii() + self.state.config["room"] = data["room"] await self.sio.emit("sources", {"sources": list(self.sources.keys())}) if self.state.current_source is None: # A possible race condition can occur here diff --git a/syng/player_libmpv.py b/syng/player_libmpv.py index da1c4da..b9364d4 100644 --- a/syng/player_libmpv.py +++ b/syng/player_libmpv.py @@ -13,15 +13,15 @@ __dirname__ = os.path.dirname(__file__) class Player: - def __init__(self) -> None: + def __init__(self, qr_string: str, quit_callback) -> None: locale.setlocale(locale.LC_ALL, "C") self.mpv = mpv.MPV(ytdl=True, input_default_bindings=True, input_vo_keyboard=True, osc=True) + self.mpv.title = "Syng - Player" self.mpv.keep_open = "yes" self.qr_overlay: Optional[mpv.ImageOverlay] = None - qr = QRCode(box_size=5, border=1) - qr.add_data("https://syng.rocks/") - qr.make() - self.qr = qr.make_image().convert("RGBA") + self.update_qr( + qr_string, + ) self.mpv.play( f"{__dirname__}/static/background.png", @@ -33,6 +33,17 @@ class Player: 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) + + def event_printer(self, *args): + print(args) + + def update_qr(self, qr_string: str) -> None: + qr = QRCode(box_size=5, border=1) + qr.add_data(qr_string) + qr.make() + self.qr = qr.make_image().convert("RGBA") def osd_size_handler(self, attribute: str, value: int) -> None: if self.qr_overlay: diff --git a/typings/mpv.pyi b/typings/mpv.pyi index 4e9ee4a..8bf4e56 100644 --- a/typings/mpv.pyi +++ b/typings/mpv.pyi @@ -16,6 +16,7 @@ class MPV: sub_pos: int osd_width: str osd_height: str + title: str def __init__( self, ytdl: bool, input_default_bindings: bool, input_vo_keyboard: bool, osc: bool