Implement PlaybackStatus property

This commit is contained in:
Stein Magnus Jodal 2011-06-05 02:15:16 +02:00
parent f038c338b1
commit f3cfa22c75
2 changed files with 52 additions and 17 deletions

View File

@ -13,6 +13,7 @@ from pykka.actor import ThreadingActor
from pykka.registry import ActorRegistry
from mopidy.backends.base import Backend
from mopidy.backends.base.playback import PlaybackController
from mopidy.frontends.base import BaseFrontend
logger = logging.getLogger('mopidy.frontends.mpris')
@ -85,8 +86,19 @@ class MprisFrontend(ThreadingActor, BaseFrontend):
class MprisObject(dbus.service.Object):
"""Implements http://www.mpris.org/2.0/spec/"""
properties = {
ROOT_IFACE: {
properties = None
def __init__(self):
self._backend = None
self.properties = {
ROOT_IFACE: self._get_root_iface_properties(),
PLAYER_IFACE: self._get_player_iface_properties(),
}
bus_name = self._connect_to_dbus()
super(MprisObject, self).__init__(bus_name, OBJECT_PATH)
def _get_root_iface_properties(self):
return {
'CanQuit': (True, None),
'CanRaise': (False, None),
# TODO Add track list support
@ -97,10 +109,11 @@ class MprisObject(dbus.service.Object):
'SupportedUriSchemes': (dbus.Array([], signature='s'), None),
# TODO Return MIME types supported by local backend if active
'SupportedMimeTypes': (dbus.Array([], signature='s'), None),
},
PLAYER_IFACE: {
# TODO Get backend.playback.state
'PlaybackStatus': ('Stopped', None),
}
def _get_player_iface_properties(self):
return {
'PlaybackStatus': (self.get_PlaybackStatus, None),
# TODO Get/set loop status
'LoopStatus': ('None', None),
'Rate': (1.0, None),
@ -128,13 +141,7 @@ class MprisObject(dbus.service.Object):
'CanSeek': (False, None),
# TODO Set to True when the rest is implemented
'CanControl': (False, None),
},
}
def __init__(self):
self._backend = None
bus_name = self._connect_to_dbus()
super(MprisObject, self).__init__(bus_name, OBJECT_PATH)
}
def _connect_to_dbus(self):
logger.debug(u'Connecting to D-Bus...')
@ -156,8 +163,9 @@ class MprisObject(dbus.service.Object):
@dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE,
in_signature='ss', out_signature='v')
def Get(self, interface, prop):
logger.debug(u'%s.Get called', dbus.PROPERTIES_IFACE)
getter, setter = self.properties[interface][prop]
logger.debug(u'%s.Get(%s, %s) called',
dbus.PROPERTIES_IFACE, repr(interface), repr(prop))
(getter, setter) = self.properties[interface][prop]
return getter() if callable(getter) else getter
@dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE,
@ -173,7 +181,8 @@ class MprisObject(dbus.service.Object):
props = player.GetAll('org.mpris.MediaPlayer2',
dbus_interface='org.freedesktop.DBus.Properties')
"""
logger.debug(u'%s.GetAll called', dbus.PROPERTIES_IFACE)
logger.debug(u'%s.GetAll(%s) called',
dbus.PROPERTIES_IFACE, repr(interface))
getters = {}
for key, (getter, setter) in self.properties[interface].iteritems():
getters[key] = getter() if callable(getter) else getter
@ -182,7 +191,8 @@ class MprisObject(dbus.service.Object):
@dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE,
in_signature='ssv', out_signature='')
def Set(self, interface, prop, value):
logger.debug(u'%s.Set called', dbus.PROPERTIES_IFACE)
logger.debug(u'%s.Set(%s, %s, %s) called',
dbus.PROPERTIES_IFACE, repr(interface), repr(prop), repr(value))
getter, setter = self.properties[interface][prop]
if setter is not None:
setter(value)
@ -221,6 +231,15 @@ class MprisObject(dbus.service.Object):
### Player interface
def get_PlaybackStatus(self):
state = self.backend.playback.state.get()
if state == PlaybackController.PLAYING:
return 'Playing'
elif state == PlaybackController.PAUSED:
return 'Paused'
elif state == PlaybackController.STOPPED:
return 'Stopped'
@dbus.service.method(dbus_interface=PLAYER_IFACE)
def Next(self):
logger.debug(u'%s.Next called', PLAYER_IFACE)

View File

@ -4,6 +4,7 @@ import unittest
from pykka.registry import ActorRegistry
from mopidy.backends.base import Backend
from mopidy.backends.base.playback import PlaybackController
from mopidy.frontends import mpris
class PlayerInterfaceTest(unittest.TestCase):
@ -14,6 +15,21 @@ class PlayerInterfaceTest(unittest.TestCase):
self.mpris_object = mpris.MprisObject()
self.mpris_object._backend = self.backend
def test_playback_status_is_playing_when_playing(self):
self.backend.playback.state.get.return_value = PlaybackController.PLAYING
result = self.mpris_object.Get(mpris.PLAYER_IFACE, 'PlaybackStatus')
self.assertEqual('Playing', result)
def test_playback_status_is_paused_when_paused(self):
self.backend.playback.state.get.return_value = PlaybackController.PAUSED
result = self.mpris_object.Get(mpris.PLAYER_IFACE, 'PlaybackStatus')
self.assertEqual('Paused', result)
def test_playback_status_is_stopped_when_stopped(self):
self.backend.playback.state.get.return_value = PlaybackController.STOPPED
result = self.mpris_object.Get(mpris.PLAYER_IFACE, 'PlaybackStatus')
self.assertEqual('Stopped', result)
def test_next_should_call_next_on_backend(self):
self.mpris_object.Next()
self.assert_(self.backend.playback.next.called)