diff --git a/docs/changelog.rst b/docs/changelog.rst index e47ba9af..1411d347 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -41,6 +41,8 @@ Bug fix release. - MPD: Fix MPD protocol for ``replay_gain_status`` command. The actual command remains unimplemented. (PR: :issue:`1520`) +- MPD: Add ``nextsong`` and ``nextsongid`` to the response of MPD ``status`` command. + (Fixes: :issue:`1133` :issue:`1516`, PR: :issue:`1523`) v2.0.0 (2016-02-15) =================== diff --git a/mopidy/mpd/protocol/status.py b/mopidy/mpd/protocol/status.py index 16e9d013..3d76d35f 100644 --- a/mopidy/mpd/protocol/status.py +++ b/mopidy/mpd/protocol/status.py @@ -173,6 +173,7 @@ def status(context): decimal places for millisecond precision. """ tl_track = context.core.playback.get_current_tl_track() + next_tlid = context.core.tracklist.get_next_tlid() futures = { 'tracklist.length': context.core.tracklist.get_length(), @@ -185,6 +186,9 @@ def status(context): 'playback.state': context.core.playback.get_state(), 'playback.current_tl_track': tl_track, 'tracklist.index': context.core.tracklist.index(tl_track.get()), + 'tracklist.next_tlid': next_tlid, + 'tracklist.next_index': context.core.tracklist.index( + tlid=next_tlid.get()), 'playback.time_position': context.core.playback.get_time_position(), } pykka.get_all(futures.values()) @@ -199,10 +203,12 @@ def status(context): ('xfade', _status_xfade(futures)), ('state', _status_state(futures)), ] - # TODO: add nextsong and nextsongid if futures['playback.current_tl_track'].get() is not None: result.append(('song', _status_songpos(futures))) result.append(('songid', _status_songid(futures))) + if futures['tracklist.next_tlid'].get() is not None: + result.append(('nextsong', _status_nextsongpos(futures))) + result.append(('nextsongid', _status_nextsongid(futures))) if futures['playback.state'].get() in ( PlaybackState.PLAYING, PlaybackState.PAUSED): result.append(('time', _status_time(futures))) @@ -259,6 +265,14 @@ def _status_songpos(futures): return futures['tracklist.index'].get() +def _status_nextsongid(futures): + return futures['tracklist.next_tlid'].get() + + +def _status_nextsongpos(futures): + return futures['tracklist.next_index'].get() + + def _status_state(futures): state = futures['playback.state'].get() if state == PlaybackState.PLAYING: diff --git a/tests/mpd/test_status.py b/tests/mpd/test_status.py index 25b8dd72..9450808c 100644 --- a/tests/mpd/test_status.py +++ b/tests/mpd/test_status.py @@ -48,9 +48,9 @@ class StatusHandlerTest(unittest.TestCase): def tearDown(self): # noqa: N802 pykka.ActorRegistry.stop_all() - def set_tracklist(self, track): - self.backend.library.dummy_library = [track] - self.core.tracklist.add(uris=[track.uri]).get() + def set_tracklist(self, tracks): + self.backend.library.dummy_library = tracks + self.core.tracklist.add(uris=[track.uri for track in tracks]).get() def test_stats_method(self): result = status.stats(self.context) @@ -154,22 +154,35 @@ class StatusHandlerTest(unittest.TestCase): self.assertEqual(result['state'], 'pause') def test_status_method_when_playlist_loaded_contains_song(self): - self.set_tracklist(Track(uri='dummy:/a')) - + self.set_tracklist([Track(uri='dummy:/a')]) self.core.playback.play().get() result = dict(status.status(self.context)) self.assertIn('song', result) self.assertGreaterEqual(int(result['song']), 0) def test_status_method_when_playlist_loaded_contains_tlid_as_songid(self): - self.set_tracklist(Track(uri='dummy:/a')) + self.set_tracklist([Track(uri='dummy:/a')]) self.core.playback.play().get() result = dict(status.status(self.context)) self.assertIn('songid', result) self.assertEqual(int(result['songid']), 1) + def test_status_method_when_playlist_loaded_contains_nextsong(self): + self.set_tracklist([Track(uri='dummy:/a'), Track(uri='dummy:/b')]) + self.core.playback.play().get() + result = dict(status.status(self.context)) + self.assertIn('nextsong', result) + self.assertGreaterEqual(int(result['nextsong']), 0) + + def test_status_method_when_playlist_loaded_contains_nextsongid(self): + self.set_tracklist([Track(uri='dummy:/a'), Track(uri='dummy:/b')]) + self.core.playback.play().get() + result = dict(status.status(self.context)) + self.assertIn('nextsongid', result) + self.assertEqual(int(result['nextsongid']), 2) + def test_status_method_when_playing_contains_time_with_no_length(self): - self.set_tracklist(Track(uri='dummy:/a', length=None)) + self.set_tracklist([Track(uri='dummy:/a', length=None)]) self.core.playback.play().get() result = dict(status.status(self.context)) self.assertIn('time', result) @@ -179,7 +192,7 @@ class StatusHandlerTest(unittest.TestCase): self.assertLessEqual(position, total) def test_status_method_when_playing_contains_time_with_length(self): - self.set_tracklist(Track(uri='dummy:/a', length=10000)) + self.set_tracklist([Track(uri='dummy:/a', length=10000)]) self.core.playback.play() result = dict(status.status(self.context)) self.assertIn('time', result) @@ -189,7 +202,7 @@ class StatusHandlerTest(unittest.TestCase): self.assertLessEqual(position, total) def test_status_method_when_playing_contains_elapsed(self): - self.set_tracklist(Track(uri='dummy:/a', length=60000)) + self.set_tracklist([Track(uri='dummy:/a', length=60000)]) self.core.playback.play().get() self.core.playback.pause() self.core.playback.seek(59123) @@ -198,7 +211,7 @@ class StatusHandlerTest(unittest.TestCase): self.assertEqual(result['elapsed'], '59.123') def test_status_method_when_starting_playing_contains_elapsed_zero(self): - self.set_tracklist(Track(uri='dummy:/a', length=10000)) + self.set_tracklist([Track(uri='dummy:/a', length=10000)]) self.core.playback.play().get() self.core.playback.pause() result = dict(status.status(self.context)) @@ -206,7 +219,7 @@ class StatusHandlerTest(unittest.TestCase): self.assertEqual(result['elapsed'], '0.000') def test_status_method_when_playing_contains_bitrate(self): - self.set_tracklist(Track(uri='dummy:/a', bitrate=3200)) + self.set_tracklist([Track(uri='dummy:/a', bitrate=3200)]) self.core.playback.play().get() result = dict(status.status(self.context)) self.assertIn('bitrate', result)