mpd: Add 'searchaddpl' command
This commit is contained in:
parent
9b1dfa6978
commit
b95c8032de
@ -21,6 +21,8 @@ v0.11.0 (in development)
|
||||
|
||||
- Add support for ``searchadd`` command added in MPD 0.17.
|
||||
|
||||
- Add support for ``searchaddpl`` command added in MPD 0.17.
|
||||
|
||||
|
||||
v0.10.0 (2012-12-12)
|
||||
====================
|
||||
|
||||
@ -402,6 +402,41 @@ def searchadd(context, mpd_query):
|
||||
context.core.tracklist.add(result)
|
||||
|
||||
|
||||
@handle_request(
|
||||
r'^searchaddpl '
|
||||
r'"(?P<playlist_name>[^"]+)" '
|
||||
r'(?P<mpd_query>("?([Aa]lbum|[Aa]rtist|[Dd]ate|[Ff]ile[name]*|'
|
||||
r'[Tt]itle|[Aa]ny)"? "[^"]*"\s?)+)$')
|
||||
def searchaddpl(context, playlist_name, mpd_query):
|
||||
"""
|
||||
*musicpd.org, music database section:*
|
||||
|
||||
``searchaddpl {NAME} {TYPE} {WHAT} [...]``
|
||||
|
||||
Searches for any song that contains ``WHAT`` in tag ``TYPE`` and adds
|
||||
them to the playlist named ``NAME``.
|
||||
|
||||
If a playlist by that name doesn't exist it is created.
|
||||
|
||||
Parameters have the same meaning as for ``find``, except that search is
|
||||
not case sensitive.
|
||||
"""
|
||||
try:
|
||||
query = _build_query(mpd_query)
|
||||
except ValueError:
|
||||
return
|
||||
result = context.core.library.search(**query).get()
|
||||
|
||||
playlists = context.core.playlists.filter(name=playlist_name).get()
|
||||
if playlists:
|
||||
playlist = playlists[0]
|
||||
else:
|
||||
playlist = context.core.playlists.create(playlist_name).get()
|
||||
tracks = list(playlist.tracks) + result
|
||||
playlist = playlist.copy(tracks=tracks)
|
||||
context.core.playlists.save(playlist)
|
||||
|
||||
|
||||
@handle_request(r'^update( "(?P<uri>[^"]+)")*$')
|
||||
def update(context, uri=None, rescan_unmodified_files=False):
|
||||
"""
|
||||
|
||||
@ -36,6 +36,44 @@ class MusicDatabaseHandlerTest(protocol.BaseTestCase):
|
||||
self.assertEqual(self.core.tracklist.tracks.get()[0].uri, 'dummy:a')
|
||||
self.assertInResponse('OK')
|
||||
|
||||
def test_searchaddpl_appends_to_existing_playlist(self):
|
||||
playlist = self.core.playlists.create('my favs').get()
|
||||
playlist = playlist.copy(tracks=[
|
||||
Track(uri='dummy:x', name='X'),
|
||||
Track(uri='dummy:y', name='y'),
|
||||
])
|
||||
self.core.playlists.save(playlist)
|
||||
self.backend.library.dummy_search_result = [
|
||||
Track(uri='dummy:a', name='A'),
|
||||
]
|
||||
playlists = self.core.playlists.filter(name='my favs').get()
|
||||
self.assertEqual(len(playlists), 1)
|
||||
self.assertEqual(len(playlists[0].tracks), 2)
|
||||
|
||||
self.sendRequest('searchaddpl "my favs" "title" "a"')
|
||||
|
||||
playlists = self.core.playlists.filter(name='my favs').get()
|
||||
self.assertEqual(len(playlists), 1)
|
||||
self.assertEqual(len(playlists[0].tracks), 3)
|
||||
self.assertEqual(playlists[0].tracks[0].uri, 'dummy:x')
|
||||
self.assertEqual(playlists[0].tracks[1].uri, 'dummy:y')
|
||||
self.assertEqual(playlists[0].tracks[2].uri, 'dummy:a')
|
||||
self.assertInResponse('OK')
|
||||
|
||||
def test_searchaddpl_creates_missing_playlist(self):
|
||||
self.backend.library.dummy_search_result = [
|
||||
Track(uri='dummy:a', name='A'),
|
||||
]
|
||||
self.assertEqual(
|
||||
len(self.core.playlists.filter(name='my favs').get()), 0)
|
||||
|
||||
self.sendRequest('searchaddpl "my favs" "title" "a"')
|
||||
|
||||
playlists = self.core.playlists.filter(name='my favs').get()
|
||||
self.assertEqual(len(playlists), 1)
|
||||
self.assertEqual(playlists[0].tracks[0].uri, 'dummy:a')
|
||||
self.assertInResponse('OK')
|
||||
|
||||
def test_listall(self):
|
||||
self.sendRequest('listall "file:///dev/urandom"')
|
||||
self.assertEqualResponse('ACK [0@0] {} Not implemented')
|
||||
|
||||
Loading…
Reference in New Issue
Block a user