Update MPRIS' PlaybackStatus on play/stop/pause/resume
This commit is contained in:
parent
ad246706c6
commit
2812e7ad45
@ -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
|
||||
|
||||
43
tests/frontends/mpris/events_test.py
Normal file
43
tests/frontends/mpris/events_test.py
Normal 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'}, [])
|
||||
Loading…
Reference in New Issue
Block a user