From 2812e7ad4543700bd97ae27793ceac93c60e093f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 29 Jun 2011 17:06:10 +0300 Subject: [PATCH] Update MPRIS' PlaybackStatus on play/stop/pause/resume --- mopidy/frontends/mpris.py | 52 ++++++++++++++++++++++------ tests/frontends/mpris/events_test.py | 43 +++++++++++++++++++++++ 2 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 tests/frontends/mpris/events_test.py diff --git a/mopidy/frontends/mpris.py b/mopidy/frontends/mpris.py index 017016c7..e99360a0 100644 --- a/mopidy/frontends/mpris.py +++ b/mopidy/frontends/mpris.py @@ -73,18 +73,17 @@ class MprisFrontend(ThreadingActor, BackendListener): def __init__(self): self.indicate_server = None - self.dbus_objects = [] + self.mpris_object = None def on_start(self): - self.dbus_objects.append(MprisObject()) + self.mpris_object = MprisObject() self.send_startup_notification() def on_stop(self): - for dbus_object in self.dbus_objects: - logger.debug(u'Removing %s from connection...', dbus_object) - dbus_object.remove_from_connection() - self.dbus_objects = [] - logger.debug(u'Removed all D-Bus objects from connection') + logger.debug(u'Removing MPRIS object from D-Bus connection...') + self.mpris_object.remove_from_connection() + self.mpris_object = None + logger.debug(u'Removed MPRIS object from D-Bus connection') def send_startup_notification(self): """ @@ -108,6 +107,38 @@ class MprisFrontend(ThreadingActor, BackendListener): except ImportError as e: logger.debug(u'Startup notification was not sent (%s)', e) + def paused_playing(self, track, time_position): + if self.mpris_object is None: + return + self.mpris_object.PropertiesChanged(PLAYER_IFACE, { + 'PlaybackStatus': + self.mpris_object.Get(PLAYER_IFACE, 'PlaybackStatus'), + }, []) + + def resumed_playing(self, track, time_position): + if self.mpris_object is None: + return + self.mpris_object.PropertiesChanged(PLAYER_IFACE, { + 'PlaybackStatus': + self.mpris_object.Get(PLAYER_IFACE, 'PlaybackStatus'), + }, []) + + def started_playing(self, track): + if self.mpris_object is None: + return + self.mpris_object.PropertiesChanged(PLAYER_IFACE, { + 'PlaybackStatus': + self.mpris_object.Get(PLAYER_IFACE, 'PlaybackStatus'), + }, []) + + def stopped_playing(self, track, time_position): + if self.mpris_object is None: + return + self.mpris_object.PropertiesChanged(PLAYER_IFACE, { + 'PlaybackStatus': + self.mpris_object.Get(PLAYER_IFACE, 'PlaybackStatus'), + }, []) + class MprisObject(dbus.service.Object): """Implements http://www.mpris.org/2.1/spec/""" @@ -219,9 +250,10 @@ class MprisObject(dbus.service.Object): @dbus.service.signal(dbus_interface=dbus.PROPERTIES_IFACE, signature='sa{sv}as') def PropertiesChanged(self, interface, changed_properties, - invalidated_properties): - logger.debug(u'%s.PropertiesChanged signaled', dbus.PROPERTIES_IFACE) - pass + invalidated_properties): + logger.debug(u'%s.PropertiesChanged(%s, %s, %s) signaled', + dbus.PROPERTIES_IFACE, interface, changed_properties, + invalidated_properties) ### Root interface methods diff --git a/tests/frontends/mpris/events_test.py b/tests/frontends/mpris/events_test.py new file mode 100644 index 00000000..9abca16c --- /dev/null +++ b/tests/frontends/mpris/events_test.py @@ -0,0 +1,43 @@ +import mock +import unittest + +from mopidy.frontends.mpris import MprisFrontend, MprisObject, PLAYER_IFACE +from mopidy.models import Track + +class BackendEventsTest(unittest.TestCase): + def setUp(self): + self.mpris_frontend = MprisFrontend() # As a plain class, not an actor + self.mpris_object = mock.Mock(spec=MprisObject) + self.mpris_frontend.mpris_object = self.mpris_object + + def test_paused_playing_event_changes_playback_status(self): + self.mpris_object.Get.return_value = 'Paused' + self.mpris_frontend.paused_playing(Track(), 0) + self.mpris_object.Get.assert_called_with( + PLAYER_IFACE, 'PlaybackStatus') + self.mpris_object.PropertiesChanged.assert_called_with( + PLAYER_IFACE, {'PlaybackStatus': 'Paused'}, []) + + def test_resumed_playing_event_changes_playback_status(self): + self.mpris_object.Get.return_value = 'Playing' + self.mpris_frontend.resumed_playing(Track(), 0) + self.mpris_object.Get.assert_called_with( + PLAYER_IFACE, 'PlaybackStatus') + self.mpris_object.PropertiesChanged.assert_called_with( + PLAYER_IFACE, {'PlaybackStatus': 'Playing'}, []) + + def test_started_playing_event_changes_playback_status(self): + self.mpris_object.Get.return_value = 'Playing' + self.mpris_frontend.started_playing(Track()) + self.mpris_object.Get.assert_called_with( + PLAYER_IFACE, 'PlaybackStatus') + self.mpris_object.PropertiesChanged.assert_called_with( + PLAYER_IFACE, {'PlaybackStatus': 'Playing'}, []) + + def test_stopped_playing_event_changes_playback_status(self): + self.mpris_object.Get.return_value = 'Stopped' + self.mpris_frontend.stopped_playing(Track(), 0) + self.mpris_object.Get.assert_called_with( + PLAYER_IFACE, 'PlaybackStatus') + self.mpris_object.PropertiesChanged.assert_called_with( + PLAYER_IFACE, {'PlaybackStatus': 'Stopped'}, [])