mpd: Make mpd warnings safe with respect to tracklist.add(tracks=...)

This commit is contained in:
Thomas Adamcik 2015-03-29 22:53:52 +02:00
parent f7399c1849
commit c85689edad
6 changed files with 104 additions and 40 deletions

View File

@ -26,18 +26,17 @@ def add(context, uri):
return return
try: try:
tracks = [] uris = []
for path, lookup_future in context.browse(uri): for path, ref in context.browse(uri, lookup=False):
if lookup_future: if ref:
for result in lookup_future.get().values(): uris.append(ref.uri)
tracks.extend(result)
except exceptions.MpdNoExistError as e: except exceptions.MpdNoExistError as e:
e.message = 'directory or file not found' e.message = 'directory or file not found'
raise raise
if not tracks: if not uris:
raise exceptions.MpdNoExistError('directory or file not found') raise exceptions.MpdNoExistError('directory or file not found')
context.core.tracklist.add(tracks=tracks) context.core.tracklist.add(uris=uris).get()
@protocol.commands.add('addid', songpos=protocol.UINT) @protocol.commands.add('addid', songpos=protocol.UINT)
@ -351,8 +350,13 @@ def swap(context, songpos1, songpos2):
tracks.insert(songpos1, song2) tracks.insert(songpos1, song2)
del tracks[songpos2] del tracks[songpos2]
tracks.insert(songpos2, song1) tracks.insert(songpos2, song1)
# TODO: do we need a tracklist.replace()
context.core.tracklist.clear() context.core.tracklist.clear()
context.core.tracklist.add(tracks)
with warnings.catch_warnings():
warnings.filterwarnings('ignore', 'tracklist.add.*"tracks".*')
context.core.tracklist.add(tracks=tracks).get()
@protocol.commands.add('swapid', tlid1=protocol.UINT, tlid2=protocol.UINT) @protocol.commands.add('swapid', tlid1=protocol.UINT, tlid2=protocol.UINT)

View File

@ -2,6 +2,7 @@ from __future__ import absolute_import, unicode_literals
import functools import functools
import itertools import itertools
import warnings
from mopidy.models import Track from mopidy.models import Track
from mopidy.mpd import exceptions, protocol, translator from mopidy.mpd import exceptions, protocol, translator
@ -168,8 +169,14 @@ def findadd(context, *args):
query = _query_from_mpd_search_parameters(args, _SEARCH_MAPPING) query = _query_from_mpd_search_parameters(args, _SEARCH_MAPPING)
except ValueError: except ValueError:
return return
results = context.core.library.search(query=query, exact=True).get() results = context.core.library.search(query=query, exact=True).get()
context.core.tracklist.add(_get_tracks(results))
with warnings.catch_warnings():
# TODO: for now just use tracks as other wise we have to lookup the
# tracks we just got from the search.
warnings.filterwarnings('ignore', 'tracklist.add.*"tracks" argument.*')
context.core.tracklist.add(tracks=_get_tracks(results)).get()
@protocol.commands.add('list') @protocol.commands.add('list')
@ -437,8 +444,14 @@ def searchadd(context, *args):
query = _query_from_mpd_search_parameters(args, _SEARCH_MAPPING) query = _query_from_mpd_search_parameters(args, _SEARCH_MAPPING)
except ValueError: except ValueError:
return return
results = context.core.library.search(query).get() results = context.core.library.search(query).get()
context.core.tracklist.add(_get_tracks(results))
with warnings.catch_warnings():
# TODO: for now just use tracks as other wise we have to lookup the
# tracks we just got from the search.
warnings.filterwarnings('ignore', 'tracklist.add.*"tracks".*')
context.core.tracklist.add(_get_tracks(results)).get()
@protocol.commands.add('searchaddpl') @protocol.commands.add('searchaddpl')

View File

@ -1,6 +1,7 @@
from __future__ import absolute_import, division, unicode_literals from __future__ import absolute_import, division, unicode_literals
import datetime import datetime
import warnings
from mopidy.mpd import exceptions, protocol, translator from mopidy.mpd import exceptions, protocol, translator
@ -127,7 +128,10 @@ def load(context, name, playlist_slice=slice(0, None)):
playlist = uri is not None and context.core.playlists.lookup(uri).get() playlist = uri is not None and context.core.playlists.lookup(uri).get()
if not playlist: if not playlist:
raise exceptions.MpdNoExistError('No such playlist') raise exceptions.MpdNoExistError('No such playlist')
context.core.tracklist.add(playlist.tracks[playlist_slice])
with warnings.catch_warnings():
warnings.filterwarnings('ignore', 'tracklist.add.*"tracks".*')
context.core.tracklist.add(playlist.tracks[playlist_slice]).get()
@protocol.commands.add('playlistadd') @protocol.commands.add('playlistadd')

View File

@ -7,6 +7,8 @@ from mopidy.mpd.protocol import music_db
from tests.mpd import protocol from tests.mpd import protocol
# TODO: split into more modules for faster parallel tests?
class QueryFromMpdSearchFormatTest(unittest.TestCase): class QueryFromMpdSearchFormatTest(unittest.TestCase):
def test_dates_are_extracted(self): def test_dates_are_extracted(self):
@ -32,6 +34,8 @@ class QueryFromMpdListFormatTest(unittest.TestCase):
pass # TODO pass # TODO
# TODO: why isn't core.playlists.filter getting deprecation warnings?
class MusicDatabaseHandlerTest(protocol.BaseTestCase): class MusicDatabaseHandlerTest(protocol.BaseTestCase):
def test_count(self): def test_count(self):
self.send_request('count "artist" "needle"') self.send_request('count "artist" "needle"')

View File

@ -18,14 +18,17 @@ class IssueGH17RegressionTest(protocol.BaseTestCase):
- Press next until you get to the unplayable track - Press next until you get to the unplayable track
""" """
def test(self): def test(self):
self.core.tracklist.add([ tracks = [
Track(uri='dummy:a'), Track(uri='dummy:a'),
Track(uri='dummy:b'), Track(uri='dummy:b'),
Track(uri='dummy:error'), Track(uri='dummy:error'),
Track(uri='dummy:d'), Track(uri='dummy:d'),
Track(uri='dummy:e'), Track(uri='dummy:e'),
Track(uri='dummy:f'), Track(uri='dummy:f'),
]) ]
self.backend.library.dummy_library = tracks
self.core.tracklist.add(uris=[t.uri for t in tracks]).get()
random.seed(1) # Playlist order: abcfde random.seed(1) # Playlist order: abcfde
self.send_request('play') self.send_request('play')
@ -59,9 +62,13 @@ class IssueGH18RegressionTest(protocol.BaseTestCase):
""" """
def test(self): def test(self):
self.core.tracklist.add([ tracks = [
Track(uri='dummy:a'), Track(uri='dummy:b'), Track(uri='dummy:c'), Track(uri='dummy:a'), Track(uri='dummy:b'), Track(uri='dummy:c'),
Track(uri='dummy:d'), Track(uri='dummy:e'), Track(uri='dummy:f')]) Track(uri='dummy:d'), Track(uri='dummy:e'), Track(uri='dummy:f'),
]
self.backend.library.dummy_library = tracks
self.core.tracklist.add(uris=[t.uri for t in tracks]).get()
random.seed(1) random.seed(1)
self.send_request('play') self.send_request('play')
@ -95,9 +102,13 @@ class IssueGH22RegressionTest(protocol.BaseTestCase):
""" """
def test(self): def test(self):
self.core.tracklist.add([ tracks = [
Track(uri='dummy:a'), Track(uri='dummy:b'), Track(uri='dummy:c'), Track(uri='dummy:a'), Track(uri='dummy:b'), Track(uri='dummy:c'),
Track(uri='dummy:d'), Track(uri='dummy:e'), Track(uri='dummy:f')]) Track(uri='dummy:d'), Track(uri='dummy:e'), Track(uri='dummy:f'),
]
self.backend.library.dummy_library = tracks
self.core.tracklist.add(uris=[t.uri for t in tracks]).get()
random.seed(1) random.seed(1)
self.send_request('play') self.send_request('play')
@ -124,9 +135,13 @@ class IssueGH69RegressionTest(protocol.BaseTestCase):
def test(self): def test(self):
self.core.playlists.create('foo') self.core.playlists.create('foo')
self.core.tracklist.add([
tracks = [
Track(uri='dummy:a'), Track(uri='dummy:b'), Track(uri='dummy:c'), Track(uri='dummy:a'), Track(uri='dummy:b'), Track(uri='dummy:c'),
Track(uri='dummy:d'), Track(uri='dummy:e'), Track(uri='dummy:f')]) Track(uri='dummy:d'), Track(uri='dummy:e'), Track(uri='dummy:f'),
]
self.backend.library.dummy_library = tracks
self.core.tracklist.add(uris=[t.uri for t in tracks]).get()
self.send_request('play') self.send_request('play')
self.send_request('stop') self.send_request('stop')

View File

@ -130,54 +130,78 @@ class PlaylistsHandlerTest(protocol.BaseTestCase):
self.assertInResponse('OK') self.assertInResponse('OK')
def test_load_appends_to_tracklist(self): def test_load_appends_to_tracklist(self):
self.core.tracklist.add([Track(uri='a'), Track(uri='b')]) tracks = [
Track(uri='dummy:a'),
Track(uri='dummy:b'),
Track(uri='dummy:c'),
Track(uri='dummy:d'),
Track(uri='dummy:e'),
]
self.backend.library.dummy_library = tracks
self.core.tracklist.add(uris=['dummy:a', 'dummy:b']).get()
self.assertEqual(len(self.core.tracklist.tracks.get()), 2) self.assertEqual(len(self.core.tracklist.tracks.get()), 2)
self.backend.playlists.set_dummy_playlists([ self.backend.playlists.set_dummy_playlists([
Playlist(name='A-list', uri='dummy:A-list', tracks=[ Playlist(name='A-list', uri='dummy:A-list', tracks=tracks[2:])])
Track(uri='c'), Track(uri='d'), Track(uri='e')])])
self.send_request('load "A-list"') self.send_request('load "A-list"')
tracks = self.core.tracklist.tracks.get() tracks = self.core.tracklist.tracks.get()
self.assertEqual(5, len(tracks)) self.assertEqual(5, len(tracks))
self.assertEqual('a', tracks[0].uri) self.assertEqual('dummy:a', tracks[0].uri)
self.assertEqual('b', tracks[1].uri) self.assertEqual('dummy:b', tracks[1].uri)
self.assertEqual('c', tracks[2].uri) self.assertEqual('dummy:c', tracks[2].uri)
self.assertEqual('d', tracks[3].uri) self.assertEqual('dummy:d', tracks[3].uri)
self.assertEqual('e', tracks[4].uri) self.assertEqual('dummy:e', tracks[4].uri)
self.assertInResponse('OK') self.assertInResponse('OK')
def test_load_with_range_loads_part_of_playlist(self): def test_load_with_range_loads_part_of_playlist(self):
self.core.tracklist.add([Track(uri='a'), Track(uri='b')]) tracks = [
Track(uri='dummy:a'),
Track(uri='dummy:b'),
Track(uri='dummy:c'),
Track(uri='dummy:d'),
Track(uri='dummy:e'),
]
self.backend.library.dummy_library = tracks
self.core.tracklist.add(uris=['dummy:a', 'dummy:b']).get()
self.assertEqual(len(self.core.tracklist.tracks.get()), 2) self.assertEqual(len(self.core.tracklist.tracks.get()), 2)
self.backend.playlists.set_dummy_playlists([ self.backend.playlists.set_dummy_playlists([
Playlist(name='A-list', uri='dummy:A-list', tracks=[ Playlist(name='A-list', uri='dummy:A-list', tracks=tracks[2:])])
Track(uri='c'), Track(uri='d'), Track(uri='e')])])
self.send_request('load "A-list" "1:2"') self.send_request('load "A-list" "1:2"')
tracks = self.core.tracklist.tracks.get() tracks = self.core.tracklist.tracks.get()
self.assertEqual(3, len(tracks)) self.assertEqual(3, len(tracks))
self.assertEqual('a', tracks[0].uri) self.assertEqual('dummy:a', tracks[0].uri)
self.assertEqual('b', tracks[1].uri) self.assertEqual('dummy:b', tracks[1].uri)
self.assertEqual('d', tracks[2].uri) self.assertEqual('dummy:d', tracks[2].uri)
self.assertInResponse('OK') self.assertInResponse('OK')
def test_load_with_range_without_end_loads_rest_of_playlist(self): def test_load_with_range_without_end_loads_rest_of_playlist(self):
self.core.tracklist.add([Track(uri='a'), Track(uri='b')]) tracks = [
Track(uri='dummy:a'),
Track(uri='dummy:b'),
Track(uri='dummy:c'),
Track(uri='dummy:d'),
Track(uri='dummy:e'),
]
self.backend.library.dummy_library = tracks
self.core.tracklist.add(uris=['dummy:a', 'dummy:b']).get()
self.assertEqual(len(self.core.tracklist.tracks.get()), 2) self.assertEqual(len(self.core.tracklist.tracks.get()), 2)
self.backend.playlists.set_dummy_playlists([ self.backend.playlists.set_dummy_playlists([
Playlist(name='A-list', uri='dummy:A-list', tracks=[ Playlist(name='A-list', uri='dummy:A-list', tracks=tracks[2:])])
Track(uri='c'), Track(uri='d'), Track(uri='e')])])
self.send_request('load "A-list" "1:"') self.send_request('load "A-list" "1:"')
tracks = self.core.tracklist.tracks.get() tracks = self.core.tracklist.tracks.get()
self.assertEqual(4, len(tracks)) self.assertEqual(4, len(tracks))
self.assertEqual('a', tracks[0].uri) self.assertEqual('dummy:a', tracks[0].uri)
self.assertEqual('b', tracks[1].uri) self.assertEqual('dummy:b', tracks[1].uri)
self.assertEqual('d', tracks[2].uri) self.assertEqual('dummy:d', tracks[2].uri)
self.assertEqual('e', tracks[3].uri) self.assertEqual('dummy:e', tracks[3].uri)
self.assertInResponse('OK') self.assertInResponse('OK')
def test_load_unknown_playlist_acks(self): def test_load_unknown_playlist_acks(self):