From bc474c6005f3c4ee275ca5ef2342b1040f76d658 Mon Sep 17 00:00:00 2001 From: "FeRD (Frank Dana)" Date: Tue, 30 Nov 2021 21:53:15 -0500 Subject: [PATCH 1/4] Instantiate logger at top of module --- src/mpDris2.in.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mpDris2.in.py b/src/mpDris2.in.py index 4719dda..bf82d24 100755 --- a/src/mpDris2.in.py +++ b/src/mpDris2.in.py @@ -74,6 +74,9 @@ _ = gettext.gettext +logger = logging.getLogger('mpDris2') +logger.propagate = False + identity = "Music Player Daemon" params = { @@ -1367,8 +1370,6 @@ def usage(params): usage(params) sys.exit() - logger = logging.getLogger('mpDris2') - logger.propagate = False logger.setLevel(log_level) # Attempt to configure systemd journal logging, if enabled From ccd839457e106fe293ab35b068e15588315952df Mon Sep 17 00:00:00 2001 From: "FeRD (Frank Dana)" Date: Tue, 30 Nov 2021 21:54:21 -0500 Subject: [PATCH 2/4] Pass loop instance to NotifyWrapper --- src/mpDris2.in.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mpDris2.in.py b/src/mpDris2.in.py index bf82d24..99b4968 100755 --- a/src/mpDris2.in.py +++ b/src/mpDris2.in.py @@ -250,7 +250,7 @@ class MPDWrapper(object): errors and similar """ - def __init__(self, params): + def __init__(self, params, loop=None): self.client = mpd.MPDClient() self._dbus = dbus @@ -281,6 +281,7 @@ def __init__(self, params): if self._params['mmkeys']: self.setup_mediakeys() + self._loop = loop def run(self): """ Try to connect to MPD; retry every 5 seconds on failure. @@ -995,7 +996,8 @@ def _name_owner_changed_callback(self, name, old_owner, new_owner): except: pid = None logger.info("Replaced by %s (PID %s)" % (new_owner, pid or "unknown")) - loop.quit() + if self._loop: + self._loop.quit() def acquire_name(self): self._bus_name = dbus.service.BusName(self._name, @@ -1477,7 +1479,7 @@ def usage(params): notification = NotifyWrapper(params) # Create wrapper to handle connection failures with MPD more gracefully - mpd_wrapper = MPDWrapper(params) + mpd_wrapper = MPDWrapper(params, loop=loop) mpd_wrapper.run() # Run idle loop From 3f4d8c45516e84f64be047628eb261e19d0aba6f Mon Sep 17 00:00:00 2001 From: "FeRD (Frank Dana)" Date: Tue, 30 Nov 2021 21:56:08 -0500 Subject: [PATCH 3/4] Pass wrapper instance to MPRISInterface() --- src/mpDris2.in.py | 75 ++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/src/mpDris2.in.py b/src/mpDris2.in.py index 99b4968..e73fe29 100755 --- a/src/mpDris2.in.py +++ b/src/mpDris2.in.py @@ -333,7 +333,7 @@ def my_connect(self): self.client._sock.settimeout(5.0) # Export our DBUS service if not self._dbus_service: - self._dbus_service = MPRISInterface(self._params) + self._dbus_service = MPRISInterface(self._params, mpd_wrapper=self) else: # Add our service to the session bus #self._dbus_service.add_to_connection(dbus.SessionBus(), @@ -970,8 +970,9 @@ class MPRISInterface(dbus.service.Object): __path = "/org/mpris/MediaPlayer2" __introspect_interface = "org.freedesktop.DBus.Introspectable" __prop_interface = dbus.PROPERTIES_IFACE + __wrapper = None - def __init__(self, params): + def __init__(self, params, mpd_wrapper=None): dbus.service.Object.__init__(self, dbus.SessionBus(), MPRISInterface.__path) self._params = params or {} @@ -979,6 +980,8 @@ def __init__(self, params): if not self._name.startswith("org.mpris.MediaPlayer2."): logger.warn("Configured bus name %r is outside MPRIS2 namespace" % self._name) + MPRISInterface.__wrapper = mpd_wrapper + self._bus = dbus.SessionBus() self._uname = self._bus.get_unique_name() self._dbus_obj = self._bus.get_object("org.freedesktop.DBus", @@ -1021,29 +1024,29 @@ def release_name(self): } def __get_playback_status(): - status = mpd_wrapper.last_status() + status = MPRISInterface.__wrapper.last_status() return {'play': 'Playing', 'pause': 'Paused', 'stop': 'Stopped'}[status['state']] def __set_loop_status(value): if value == "Playlist": - mpd_wrapper.repeat(1) - if mpd_wrapper._can_single: - mpd_wrapper.single(0) + MPRISInterface.__wrapper.repeat(1) + if MPRISInterface.__wrapper._can_single: + MPRISInterface.__wrapper.single(0) elif value == "Track": - if mpd_wrapper._can_single: - mpd_wrapper.repeat(1) - mpd_wrapper.single(1) + if MPRISInterface.__wrapper._can_single: + MPRISInterface.__wrapper.repeat(1) + MPRISInterface.__wrapper.single(1) elif value == "None": - mpd_wrapper.repeat(0) - if mpd_wrapper._can_single: - mpd_wrapper.single(0) + MPRISInterface.__wrapper.repeat(0) + if MPRISInterface.__wrapper._can_single: + MPRISInterface.__wrapper.single(0) else: raise dbus.exceptions.DBusException("Loop mode %r not supported" % value) return def __get_loop_status(): - status = mpd_wrapper.last_status() + status = MPRISInterface.__wrapper.last_status() if int(status['repeat']) == 1: if int(status.get('single', 0)) == 1: return "Track" @@ -1053,20 +1056,20 @@ def __get_loop_status(): return "None" def __set_shuffle(value): - mpd_wrapper.random(value) + MPRISInterface.__wrapper.random(value) return def __get_shuffle(): - if int(mpd_wrapper.last_status()['random']) == 1: + if int(MPRISInterface.__wrapper.last_status()['random']) == 1: return True else: return False def __get_metadata(): - return dbus.Dictionary(mpd_wrapper.metadata, signature='sv') + return dbus.Dictionary(MPRISInterface.__wrapper.metadata, signature='sv') def __get_volume(): - vol = float(mpd_wrapper.last_status().get('volume', 0)) + vol = float(MPRISInterface.__wrapper.last_status().get('volume', 0)) if vol > 0: return vol / 100.0 else: @@ -1074,11 +1077,11 @@ def __get_volume(): def __set_volume(value): if value >= 0 and value <= 1: - mpd_wrapper.setvol(int(value * 100)) + MPRISInterface.__wrapper.setvol(int(value * 100)) return def __get_position(): - status = mpd_wrapper.last_status() + status = MPRISInterface.__wrapper.last_status() if 'time' in status: current, end = status['time'].split(':') return dbus.Int64((int(current) * 1000000)) @@ -1168,46 +1171,46 @@ def Quit(self): # Player methods @dbus.service.method(__player_interface, in_signature='', out_signature='') def Next(self): - mpd_wrapper.next() + MPRISInterface.__wrapper.next() return @dbus.service.method(__player_interface, in_signature='', out_signature='') def Previous(self): - mpd_wrapper.previous() + MPRISInterface.__wrapper.previous() return @dbus.service.method(__player_interface, in_signature='', out_signature='') def Pause(self): - mpd_wrapper.pause(1) - mpd_wrapper.notify_about_state('pause') + MPRISInterface.__wrapper.pause(1) + MPRISInterface.__wrapper.notify_about_state('pause') return @dbus.service.method(__player_interface, in_signature='', out_signature='') def PlayPause(self): - status = mpd_wrapper.status() + status = MPRISInterface.__wrapper.status() if status['state'] == 'play': - mpd_wrapper.pause(1) - mpd_wrapper.notify_about_state('pause') + MPRISInterface.__wrapper.pause(1) + MPRISInterface.__wrapper.notify_about_state('pause') else: - mpd_wrapper.play() - mpd_wrapper.notify_about_state('play') + MPRISInterface.__wrapper.play() + MPRISInterface.__wrapper.notify_about_state('play') return @dbus.service.method(__player_interface, in_signature='', out_signature='') def Stop(self): - mpd_wrapper.stop() - mpd_wrapper.notify_about_state('stop') + MPRISInterface.__wrapper.stop() + MPRISInterface.__wrapper.notify_about_state('stop') return @dbus.service.method(__player_interface, in_signature='', out_signature='') def Play(self): - mpd_wrapper.play() - mpd_wrapper.notify_about_state('play') + MPRISInterface.__wrapper.play() + MPRISInterface.__wrapper.notify_about_state('play') return @dbus.service.method(__player_interface, in_signature='x', out_signature='') def Seek(self, offset): - status = mpd_wrapper.status() + status = MPRISInterface.__wrapper.status() current, end = status['time'].split(':') current = int(current) end = int(end) @@ -1216,20 +1219,20 @@ def Seek(self, offset): position = current + offset if position < 0: position = 0 - mpd_wrapper.seekid(int(status['songid']), position) + MPRISInterface.__wrapper.seekid(int(status['songid']), position) self.Seeked(position * 1000000) return @dbus.service.method(__player_interface, in_signature='ox', out_signature='') def SetPosition(self, trackid, position): - song = mpd_wrapper.last_currentsong() + song = MPRISInterface.__wrapper.last_currentsong() # FIXME: use real dbus objects if str(trackid) != '/org/mpris/MediaPlayer2/Track/%s' % song['id']: return # Convert position to seconds position = int(position) / 1000000 if position <= int(song['time']): - mpd_wrapper.seekid(int(song['id']), position) + MPRISInterface.__wrapper.seekid(int(song['id']), position) self.Seeked(position * 1000000) return From 6e7196951a4517a780715f60a4fbc47ea77dd2b6 Mon Sep 17 00:00:00 2001 From: "FeRD (Frank Dana)" Date: Tue, 30 Nov 2021 21:57:51 -0500 Subject: [PATCH 4/4] Set up notifications from inside MPDWrapper() --- src/mpDris2.in.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/mpDris2.in.py b/src/mpDris2.in.py index e73fe29..9300fe0 100755 --- a/src/mpDris2.in.py +++ b/src/mpDris2.in.py @@ -105,8 +105,6 @@ 'cover_regex': r'^(album|cover|\.?folder|front).*\.(gif|jpeg|jpg|png)$', } -notification = None - # MPRIS allowed metadata tags allowed_tags = { 'mpris:trackid': dbus.ObjectPath, @@ -282,6 +280,9 @@ def __init__(self, params, loop=None): self.setup_mediakeys() self._loop = loop + # Wrapper to send notifications + self._notification = NotifyWrapper(self._params) + def run(self): """ Try to connect to MPD; retry every 5 seconds on failure. @@ -324,7 +325,7 @@ def my_connect(self): self._can_single = True if self._errors > 0: - notification.notify(identity, _('Reconnected')) + self._notification.notify(identity, _('Reconnected')) logger.info('Reconnected to MPD server.') else: logger.debug('Connected to MPD server.') @@ -375,7 +376,7 @@ def my_connect(self): def reconnect(self): logger.warning("Disconnected") - notification.notify(identity, _('Disconnected'), 'error') + self._notification.notify(identity, _('Disconnected'), 'error') # Release the DBus name and disconnect from bus if self._dbus_service is not None: @@ -608,11 +609,11 @@ def notify_about_track(self, meta, state='play'): uri = 'media-playback-pause-symbolic' body += ' (%s)' % _('Paused') - notification.notify(title, body, uri) + self._notification.notify(title, body, uri) def notify_about_state(self, state): if state == 'stop': - notification.notify(identity, _('Stopped'), 'media-playback-stop-symbolic') + self._notification.notify(identity, _('Stopped'), 'media-playback-stop-symbolic') else: self.notify_about_track(self.metadata, state) @@ -1478,9 +1479,6 @@ def usage(params): logger.debug('Using legacy pygobject2 main loop.') loop = GLib.MainLoop() - # Wrapper to send notifications - notification = NotifyWrapper(params) - # Create wrapper to handle connection failures with MPD more gracefully mpd_wrapper = MPDWrapper(params, loop=loop) mpd_wrapper.run()