Update MPRIS' PlaybackStatus on play/stop/pause/resume

This commit is contained in:
Stein Magnus Jodal 2011-06-29 17:06:10 +03:00
parent ad246706c6
commit 2812e7ad45
2 changed files with 85 additions and 10 deletions

View File

@ -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

View File

@ -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'}, [])