diff --git a/mopidy/frontends/mpris.py b/mopidy/frontends/mpris.py index afd8a234..7f085410 100644 --- a/mopidy/frontends/mpris.py +++ b/mopidy/frontends/mpris.py @@ -147,8 +147,7 @@ class MprisObject(dbus.service.Object): 'Position': (self.get_Position, None), 'MinimumRate': (1.0, None), 'MaximumRate': (1.0, None), - # TODO True if CanControl and backend.playback.track_at_next - 'CanGoNext': (False, None), + 'CanGoNext': (self.get_CanGoNext, None), 'CanGoPrevious': (self.get_CanGoPrevious, None), 'CanPlay': (self.get_CanPlay, None), 'CanPause': (self.get_CanPause, None), @@ -412,6 +411,12 @@ class MprisObject(dbus.service.Object): def get_Position(self): return self.backend.playback.time_position.get() * 1000 + def get_CanGoNext(self): + if not self.get_CanControl(): + return False + return (self.backend.playback.cp_track_at_next.get() != + self.backend.playback.current_cp_track.get()) + def get_CanGoPrevious(self): if not self.get_CanControl(): return False diff --git a/tests/frontends/mpris/player_interface_test.py b/tests/frontends/mpris/player_interface_test.py index 84946030..4f475728 100644 --- a/tests/frontends/mpris/player_interface_test.py +++ b/tests/frontends/mpris/player_interface_test.py @@ -177,6 +177,28 @@ class PlayerInterfaceTest(unittest.TestCase): result = self.mpris.Get(mpris.PLAYER_IFACE, 'MaximumRate') self.assert_(result >= 1.0) + def test_can_go_next_is_true_if_can_control_and_other_next_track(self): + self.mpris.get_CanControl = lambda *_: True + self.backend.current_playlist.append([Track(uri='a'), Track(uri='b')]) + self.backend.playback.play() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'CanGoNext') + self.assertTrue(result) + + def test_can_go_next_is_false_if_next_track_is_the_same(self): + self.mpris.get_CanControl = lambda *_: True + self.backend.current_playlist.append([Track(uri='a')]) + self.backend.playback.repeat = True + self.backend.playback.play() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'CanGoNext') + self.assertFalse(result) + + def test_can_go_next_is_false_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() + result = self.mpris.Get(mpris.PLAYER_IFACE, 'CanGoNext') + self.assertFalse(result) + def test_can_go_previous_is_true_if_can_control_and_other_previous_track(self): self.mpris.get_CanControl = lambda *_: True self.backend.current_playlist.append([Track(uri='a'), Track(uri='b')])