Skip to content

Commit

Permalink
fix(MprisPlayer): close player gracefully
Browse files Browse the repository at this point in the history
  • Loading branch information
linkfrg committed Feb 22, 2025
1 parent 07bd3dc commit 3676513
Showing 1 changed file with 19 additions and 8 deletions.
27 changes: 19 additions & 8 deletions ignis/services/mpris/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from gi.repository import GObject, GLib # type: ignore
from ignis.gobject import IgnisGObject
from ignis.utils import Utils
from ignis.connection_manager import ConnectionManager
from collections.abc import Callable
from .constants import ART_URL_CACHE_DIR
from .util import uri_to_unix_path
Expand All @@ -17,6 +18,8 @@ class MprisPlayer(IgnisGObject):
def __init__(self, name: str):
super().__init__()

self._conn_mgr = ConnectionManager()

self._can_control: bool = False
self._can_go_next: bool = False
self._can_go_previous: bool = False
Expand Down Expand Up @@ -60,24 +63,32 @@ async def __init_proxy(self, name: str) -> None:
info=Utils.load_interface_xml("org.mpris.MediaPlayer2.Player"),
)

self.__mpris_proxy.watch_name(
on_name_vanished=lambda *args: self.emit("closed")
)
self.__mpris_proxy.watch_name(on_name_vanished=lambda *_: self.__close())

asyncio.create_task(self.__sync_position())
self._sync_pos_task = asyncio.create_task(self.__sync_position())
await self.__sync_all()
await self.__sync_metadata()
await self.__update_position()

self.__player_proxy.gproxy.connect(
"g-properties-changed", lambda *_: asyncio.create_task(self.__sync_all())
self._conn_mgr.connect(
self.__player_proxy.gproxy,
"g-properties-changed",
lambda *_: asyncio.create_task(self.__sync_all()),
)
self.connect(
"notify::metadata", lambda *_: asyncio.create_task(self.__sync_metadata())
self._conn_mgr.connect(
self,
"notify::metadata",
lambda *_: asyncio.create_task(self.__sync_metadata()),
)

self.emit("ready")

def __close(self) -> None:
self.__mpris_proxy.unwatch_name()
self._conn_mgr.disconnect_all()
self._sync_pos_task.cancel()
self.emit("closed")

async def __sync_property(self, proxy: DBusProxy, py_name: str) -> None:
try:
value = await proxy.get_dbus_property_async(Utils.snake_to_pascal(py_name))
Expand Down

0 comments on commit 3676513

Please sign in to comment.