diff --git a/docs/changes.rst b/docs/changes.rst index 63c0c22b..bd102ef7 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -19,7 +19,9 @@ No description yet. commands. This makes media library browsing in ncmpcpp work, though very slow due to all the meta data requests to Spotify. - - Add support for ``play "-1"``, which fixes resume in MPoD. + - Add support for ``play "-1"`` when in playing or paused state, which fixes + resume and addition of tracks to the current playlist while playing for the + MPoD client. - Settings: diff --git a/mopidy/frontends/mpd/protocol/playback.py b/mopidy/frontends/mpd/protocol/playback.py index 3f0421dc..d009969d 100644 --- a/mopidy/frontends/mpd/protocol/playback.py +++ b/mopidy/frontends/mpd/protocol/playback.py @@ -134,6 +134,7 @@ def playid(frontend, cpid): *Clarifications:* + - ``playid "-1"`` when playing is ignored. - ``playid "-1"`` when paused resumes playback. - ``playid "-1"`` when stopped with a current track starts playback at the current track. @@ -141,15 +142,10 @@ def playid(frontend, cpid): replacement, starts playback at the first track. """ cpid = int(cpid) - paused = (frontend.backend.playback.state == - frontend.backend.playback.PAUSED) - if cpid == -1 and paused: - return frontend.backend.playback.resume() + if cpid == -1: + return _play_minus_one(frontend) try: - if cpid == -1: - cp_track = _get_cp_track_for_play_minus_one(frontend) - else: - cp_track = frontend.backend.current_playlist.get(cpid=cpid) + cp_track = frontend.backend.current_playlist.get(cpid=cpid) return frontend.backend.playback.play(cp_track) except LookupError: raise MpdNoExistError(u'No such song', command=u'playid') @@ -166,6 +162,7 @@ def playpos(frontend, songpos): *Clarifications:* + - ``playid "-1"`` when playing is ignored. - ``playid "-1"`` when paused resumes playback. - ``playid "-1"`` when stopped with a current track starts playback at the current track. @@ -177,26 +174,27 @@ def playpos(frontend, songpos): - issues ``play 6`` without quotes around the argument. """ songpos = int(songpos) - paused = (frontend.backend.playback.state == - frontend.backend.playback.PAUSED) - if songpos == -1 and paused: - return frontend.backend.playback.resume() + if songpos == -1: + return _play_minus_one(frontend) try: - if songpos == -1: - cp_track = _get_cp_track_for_play_minus_one(frontend) - else: - cp_track = frontend.backend.current_playlist.cp_tracks[songpos] + cp_track = frontend.backend.current_playlist.cp_tracks[songpos] return frontend.backend.playback.play(cp_track) except IndexError: raise MpdArgError(u'Bad song index', command=u'play') -def _get_cp_track_for_play_minus_one(frontend): - if not frontend.backend.current_playlist.cp_tracks: - return # Fail silently - cp_track = frontend.backend.playback.current_cp_track - if cp_track is None: +def _play_minus_one(frontend): + if (frontend.backend.playback.state == frontend.backend.playback.PLAYING): + return # Nothing to do + elif (frontend.backend.playback.state == frontend.backend.playback.PAUSED): + return frontend.backend.playback.resume() + elif frontend.backend.playback.current_cp_track is not None: + cp_track = frontend.backend.playback.current_cp_track + return frontend.backend.playback.play(cp_track) + elif frontend.backend.current_playlist.cp_tracks: cp_track = frontend.backend.current_playlist.cp_tracks[0] - return cp_track + return frontend.backend.playback.play(cp_track) + else: + return # Fail silently @handle_pattern(r'^previous$') def previous(frontend): diff --git a/tests/frontends/mpd/playback_test.py b/tests/frontends/mpd/playback_test.py index face0318..83355aea 100644 --- a/tests/frontends/mpd/playback_test.py +++ b/tests/frontends/mpd/playback_test.py @@ -257,6 +257,16 @@ class PlaybackControlHandlerTest(unittest.TestCase): self.assertEqual(self.b.playback.STOPPED, self.b.playback.state) self.assertEqual(self.b.playback.current_track, None) + def test_play_minus_is_ignored_if_playing(self): + self.b.current_playlist.append([Track(length=40000)]) + self.b.playback.seek(30000) + self.assert_(self.b.playback.time_position >= 30000) + self.assertEquals(self.b.playback.PLAYING, self.b.playback.state) + result = self.h.handle_request(u'play "-1"') + self.assert_(u'OK' in result) + self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) + self.assert_(self.b.playback.time_position >= 30000) + def test_play_minus_one_resumes_if_paused(self): self.b.current_playlist.append([Track(length=40000)]) self.b.playback.seek(30000) @@ -302,6 +312,16 @@ class PlaybackControlHandlerTest(unittest.TestCase): self.assertEqual(self.b.playback.STOPPED, self.b.playback.state) self.assertEqual(self.b.playback.current_track, None) + def test_playid_minus_is_ignored_if_playing(self): + self.b.current_playlist.append([Track(length=40000)]) + self.b.playback.seek(30000) + self.assert_(self.b.playback.time_position >= 30000) + self.assertEquals(self.b.playback.PLAYING, self.b.playback.state) + result = self.h.handle_request(u'playid "-1"') + self.assert_(u'OK' in result) + self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) + self.assert_(self.b.playback.time_position >= 30000) + def test_playid_minus_one_resumes_if_paused(self): self.b.current_playlist.append([Track(length=40000)]) self.b.playback.seek(30000)