55import asyncio
66import logging
77from collections .abc import Callable
8- from typing import TYPE_CHECKING , final , override
8+ from typing import TYPE_CHECKING
99
1010from .adapter import (
1111 MPRIS_AVAILABLE ,
1212 MprisState ,
1313 SendspinMprisAdapterPlayer ,
14+ SendspinMprisAdapterPlaylists ,
1415 SendspinMprisAdapterRoot ,
1516 SendspinMprisAdapterTrackList ,
1617)
2223 from mpris_api .MprisService import MprisService
2324 from mpris_api .MprisUpdateNotifier import MprisUpdateNotifier
2425
25- _LOGGER = logging .getLogger (__name__ )
26-
27- if MPRIS_AVAILABLE :
28- from mpris_api .MprisService import MprisService
29-
30-
31- @final
32- class _MprisErrorFilter (logging .Filter ):
33- """Filter to suppress expected MPRIS interface errors.
34-
35- Some MPRIS clients query for optional interfaces (like Playlists) which is not
36- properly supported by the mpris-api lib. This filter suppresses the
37- resulting D-Bus errors to avoid cluttering the output.
38- """
3926
40- _SUPPRESSED_INTERFACES = ("org.mpris.MediaPlayer2.Playlists" ,)
41-
42- @override
43- def filter (self , record : logging .LogRecord ) -> bool :
44- """Return False to suppress the log record, True to allow it."""
45- if record .levelno != logging .ERROR :
46- return True
47-
48- msg = record .getMessage ()
49- if "could not find an interface" not in msg :
50- return True
51-
52- return not any (iface in msg for iface in self ._SUPPRESSED_INTERFACES )
27+ _LOGGER = logging .getLogger (__name__ )
5328
5429
5530class SendspinMpris :
@@ -83,11 +58,11 @@ class SendspinMpris:
8358 _adapter_root : SendspinMprisAdapterRoot | None
8459 _adapter_player : SendspinMprisAdapterPlayer | None
8560 _adapter_tracklist : SendspinMprisAdapterTrackList | None
61+ _adapter_playlists : SendspinMprisAdapterPlaylists | None
8662 _service : MprisService | None
8763 _update_notifier : MprisUpdateNotifier | None
8864 _running : bool
8965 _listener_removers : list [Callable [[], None ]]
90- _error_filter : _MprisErrorFilter | None
9166
9267 def __init__ (
9368 self , client : SendspinClient , name : str = "Sendspin" , desktop_entry : str | None = None
@@ -110,11 +85,11 @@ def __init__(
11085 self ._adapter_root = None
11186 self ._adapter_player = None
11287 self ._adapter_tracklist = None
88+ self ._adapter_playlists = None
11389 self ._service = None
11490 self ._update_notifier = None
11591 self ._running = False
11692 self ._listener_removers = []
117- self ._error_filter = None
11893
11994 def start (self ) -> None :
12095 """Start the MPRIS D-Bus service and attach listeners to the client.
@@ -130,6 +105,8 @@ def start(self) -> None:
130105 _LOGGER .debug ("MPRIS not available: mpris_api package not installed or not on Linux" )
131106 return
132107
108+ from .mpris_service import PatchedMprisService
109+
133110 if self ._running :
134111 _LOGGER .debug ("MPRIS interface already running" )
135112 return
@@ -139,21 +116,19 @@ def start(self) -> None:
139116 except RuntimeError as err :
140117 raise RuntimeError ("MPRIS must be started from within a running event loop" ) from err
141118
142- # Add filter to suppress expected D-Bus errors for unimplemented interfaces
143- self ._error_filter = _MprisErrorFilter ()
144- logging .getLogger ().addFilter (self ._error_filter )
145-
146119 self ._adapter_root = SendspinMprisAdapterRoot (
147120 identity = self ._name , desktop_entry = self ._desktop_entry
148121 )
149122 self ._adapter_player = SendspinMprisAdapterPlayer (self ._client , self ._loop , self ._state )
150123 self ._adapter_tracklist = SendspinMprisAdapterTrackList ()
124+ self ._adapter_playlists = SendspinMprisAdapterPlaylists ()
151125
152- self ._service = MprisService (
126+ self ._service = PatchedMprisService (
153127 name = self ._name ,
154128 adapterRoot = self ._adapter_root ,
155129 adapterPlayer = self ._adapter_player ,
156130 adapterTrackList = self ._adapter_tracklist ,
131+ adapterPlayLists = self ._adapter_playlists ,
157132 )
158133 self ._service .start ()
159134 self ._update_notifier = self ._service .updateNotifier
@@ -189,10 +164,7 @@ def stop(self) -> None:
189164 self ._adapter_root = None
190165 self ._adapter_player = None
191166 self ._adapter_tracklist = None
192-
193- if self ._error_filter is not None :
194- logging .getLogger ().removeFilter (self ._error_filter )
195- self ._error_filter = None
167+ self ._adapter_playlists = None
196168
197169 _LOGGER .info ("MPRIS interface stopped" )
198170
0 commit comments