diff --git a/mopidy/frontends/mpris.py b/mopidy/frontends/mpris.py index 8ec8c0a7..3ba6fcf8 100644 --- a/mopidy/frontends/mpris.py +++ b/mopidy/frontends/mpris.py @@ -381,6 +381,11 @@ class MprisObject(dbus.service.Object): self.backend.playback.single = False def set_Rate(self, value): + if not self.get_CanControl(): + # NOTE The spec does not explictly require this check, but it was + # added to be consistent with all the other property setters. + logger.debug(u'Setting %s.Rate not allowed', PLAYER_IFACE) + return # TODO Raise error if value == 0: self.Pause() diff --git a/tests/frontends/mpris/player_interface_test.py b/tests/frontends/mpris/player_interface_test.py index 76cfabec..03f04842 100644 --- a/tests/frontends/mpris/player_interface_test.py +++ b/tests/frontends/mpris/player_interface_test.py @@ -89,6 +89,14 @@ class PlayerInterfaceTest(unittest.TestCase): maximum_rate = self.mpris.Get(mpris.PLAYER_IFACE, 'MaximumRate') self.assert_(rate >= maximum_rate) + def test_set_rate_is_ignored_if_can_control_is_false(self): + self.mpris.get_CanControl = lambda *_: False + self.backend.current_playlist.append([Track(uri='a'), Track(uri='b')]) + self.backend.playback.play() + self.assertEquals(self.backend.playback.state.get(), PLAYING) + self.mpris.Set(mpris.PLAYER_IFACE, 'Rate', 0) + self.assertEquals(self.backend.playback.state.get(), PLAYING) + def test_set_rate_to_zero_pauses_playback(self): self.backend.current_playlist.append([Track(uri='a'), Track(uri='b')]) self.backend.playback.play()