mpd: Add range support to 'load' command
This commit is contained in:
parent
49d585a97c
commit
50cbe5f384
@ -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)
|
||||
====================
|
||||
|
||||
@ -92,23 +92,36 @@ def listplaylists(context):
|
||||
return result
|
||||
|
||||
|
||||
@handle_request(r'^load "(?P<name>[^"]+)"$')
|
||||
def load(context, name):
|
||||
@handle_request(r'^load "(?P<name>[^"]+)"( "(?P<start>\d+):(?P<end>\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<name>[^"]+)" "(?P<uri>[^"]+)"$')
|
||||
|
||||
@ -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()))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user