diff --git a/docs/changes.rst b/docs/changes.rst index 6f15ff20..300af3d3 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -14,6 +14,9 @@ v0.11.0 (in development) - Add support for ``config`` command added in MPD 0.17. +- Add support for loading a range of tracks from a playlist to the ``load`` + command, as added in MPD 0.17. + v0.10.0 (2012-12-12) ==================== diff --git a/mopidy/frontends/mpd/protocol/stored_playlists.py b/mopidy/frontends/mpd/protocol/stored_playlists.py index eef1f3d1..034403ec 100644 --- a/mopidy/frontends/mpd/protocol/stored_playlists.py +++ b/mopidy/frontends/mpd/protocol/stored_playlists.py @@ -92,23 +92,36 @@ def listplaylists(context): return result -@handle_request(r'^load "(?P[^"]+)"$') -def load(context, name): +@handle_request(r'^load "(?P[^"]+)"( "(?P\d+):(?P\d+)*")*$') +def load(context, name, start=None, end=None): """ *musicpd.org, stored playlists section:* - ``load {NAME}`` + ``load {NAME} [START:END]`` - Loads the playlist ``NAME.m3u`` from the playlist directory. + Loads the playlist into the current queue. Playlist plugins are + supported. A range may be specified to load only a part of the + playlist. *Clarifications:* - ``load`` appends the given playlist to the current playlist. + + - MPD 0.17.1 does not support open-ended ranges, i.e. without end + specified, for the ``load`` command, even though MPD's general range docs + allows open-ended ranges. + + - MPD 0.17.1 does not fail if the specified range is outside the playlist, + in either or both ends. """ playlists = context.core.playlists.filter(name=name).get() if not playlists: raise MpdNoExistError('No such playlist', command='load') - context.core.tracklist.add(playlists[0].tracks) + if start is not None: + start = int(start) + if end is not None: + end = int(end) + context.core.tracklist.add(playlists[0].tracks[start:end]) @handle_request(r'^playlistadd "(?P[^"]+)" "(?P[^"]+)"$') diff --git a/tests/frontends/mpd/protocol/stored_playlists_test.py b/tests/frontends/mpd/protocol/stored_playlists_test.py index be2afd4c..49da5d0b 100644 --- a/tests/frontends/mpd/protocol/stored_playlists_test.py +++ b/tests/frontends/mpd/protocol/stored_playlists_test.py @@ -73,7 +73,7 @@ class PlaylistsHandlerTest(protocol.BaseTestCase): self.assertNotInResponse('playlist: ') self.assertInResponse('OK') - def test_load_known_playlist_appends_to_tracklist(self): + def test_load_appends_to_tracklist(self): self.core.tracklist.add([Track(uri='a'), Track(uri='b')]) self.assertEqual(len(self.core.tracklist.tracks.get()), 2) self.backend.playlists.playlists = [ @@ -81,6 +81,7 @@ class PlaylistsHandlerTest(protocol.BaseTestCase): Track(uri='c'), Track(uri='d'), Track(uri='e')])] self.sendRequest('load "A-list"') + tracks = self.core.tracklist.tracks.get() self.assertEqual(5, len(tracks)) self.assertEqual('a', tracks[0].uri) @@ -90,6 +91,39 @@ class PlaylistsHandlerTest(protocol.BaseTestCase): self.assertEqual('e', tracks[4].uri) self.assertInResponse('OK') + def test_load_with_range_loads_part_of_playlist(self): + self.core.tracklist.add([Track(uri='a'), Track(uri='b')]) + self.assertEqual(len(self.core.tracklist.tracks.get()), 2) + self.backend.playlists.playlists = [ + Playlist(name='A-list', tracks=[ + Track(uri='c'), Track(uri='d'), Track(uri='e')])] + + self.sendRequest('load "A-list" "1:2"') + + tracks = self.core.tracklist.tracks.get() + self.assertEqual(3, len(tracks)) + self.assertEqual('a', tracks[0].uri) + self.assertEqual('b', tracks[1].uri) + self.assertEqual('d', tracks[2].uri) + self.assertInResponse('OK') + + def test_load_with_range_without_end_loads_rest_of_playlist(self): + self.core.tracklist.add([Track(uri='a'), Track(uri='b')]) + self.assertEqual(len(self.core.tracklist.tracks.get()), 2) + self.backend.playlists.playlists = [ + Playlist(name='A-list', tracks=[ + Track(uri='c'), Track(uri='d'), Track(uri='e')])] + + self.sendRequest('load "A-list" "1:"') + + tracks = self.core.tracklist.tracks.get() + self.assertEqual(4, len(tracks)) + self.assertEqual('a', tracks[0].uri) + self.assertEqual('b', tracks[1].uri) + self.assertEqual('d', tracks[2].uri) + self.assertEqual('e', tracks[3].uri) + self.assertInResponse('OK') + def test_load_unknown_playlist_acks(self): self.sendRequest('load "unknown playlist"') self.assertEqual(0, len(self.core.tracklist.tracks.get()))