diff --git a/mopidy/mpd/handler.py b/mopidy/mpd/handler.py index 6141d651..c3f2b220 100644 --- a/mopidy/mpd/handler.py +++ b/mopidy/mpd/handler.py @@ -248,9 +248,8 @@ class MpdHandler(object): self.backend.current_playlist.add(track, at_position=songpos) return ('Id', track.id) - @handle_pattern(r'^delete "(?P\d+)"$') @handle_pattern(r'^delete "(?P\d+):(?P\d+)*"$') - def _current_playlist_delete(self, songpos=None, start=None, end=None): + def _current_playlist_delete_range(self, start, end=None): """ *musicpd.org, current playlist section:* @@ -258,22 +257,24 @@ class MpdHandler(object): Deletes a song from the playlist. """ + start = int(start) + if end is not None: + end = int(end) + else: + end = self.backend.current_playlist.playlist.length + tracks = self.backend.current_playlist.playlist.tracks[start:end] + if not tracks: + raise MpdAckError(u'Position out of bounds') + for track in tracks: + self.backend.current_playlist.remove(track) + + @handle_pattern(r'^delete "(?P\d+)"$') + def _current_playlist_delete_songpos(self, songpos): + """See :meth:`_current_playlist_delete_range`""" try: - tracks = [] - if songpos is not None: - songpos = int(songpos) - tracks = [ - self.backend.current_playlist.playlist.tracks[songpos]] - elif start is not None: - start = int(start) - if end is not None: - end = int(end) - else: - end = self.backend.current_playlist.playlist.length - tracks = self.backend.current_playlist.playlist.tracks[ - start:end] - for track in tracks: - self.backend.current_playlist.remove(track) + songpos = int(songpos) + track = self.backend.current_playlist.playlist.tracks[songpos] + self.backend.current_playlist.remove(track) except IndexError, e: raise MpdAckError(u'Position out of bounds') diff --git a/tests/mpd/handlertest.py b/tests/mpd/handlertest.py index 7a453216..42d2b1e0 100644 --- a/tests/mpd/handlertest.py +++ b/tests/mpd/handlertest.py @@ -544,6 +544,14 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): self.assertEquals(self.b.current_playlist.playlist.length, 4) self.assert_(u'OK' in result) + def test_delete_songpos_out_of_bounds(self): + self.b.current_playlist.playlist = Playlist( + tracks=[Track(), Track(), Track(), Track(), Track()]) + self.assertEquals(self.b.current_playlist.playlist.length, 5) + result = self.h.handle_request(u'delete "5"') + self.assertEquals(self.b.current_playlist.playlist.length, 5) + self.assert_(u'ACK Position out of bounds' in result) + def test_delete_open_range(self): self.b.current_playlist.playlist = Playlist( tracks=[Track(), Track(), Track(), Track(), Track()]) @@ -560,11 +568,11 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): self.assertEquals(self.b.current_playlist.playlist.length, 3) self.assert_(u'OK' in result) - def test_delete_out_of_range(self): + def test_delete_range_out_of_bounds(self): self.b.current_playlist.playlist = Playlist( tracks=[Track(), Track(), Track(), Track(), Track()]) self.assertEquals(self.b.current_playlist.playlist.length, 5) - result = self.h.handle_request(u'delete "5"') + result = self.h.handle_request(u'delete "5:7"') self.assertEquals(self.b.current_playlist.playlist.length, 5) self.assert_(u'ACK Position out of bounds' in result)