Add 'play -1' support when playing

This commit is contained in:
Stein Magnus Jodal 2011-02-12 02:03:18 +01:00
parent 15c992e06a
commit 163ead53da
3 changed files with 43 additions and 23 deletions

View File

@ -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:

View File

@ -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):

View File

@ -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)