Update stored playlists controller to support backends without playlists
This commit is contained in:
parent
d748c07daf
commit
92bd599ecf
@ -18,7 +18,8 @@ class StoredPlaylistsController(object):
|
||||
|
||||
Read-only. List of :class:`mopidy.models.Playlist`.
|
||||
"""
|
||||
futures = [b.stored_playlists.playlists for b in self.backends]
|
||||
futures = [b.stored_playlists.playlists
|
||||
for b in self.backends.with_stored_playlists]
|
||||
results = pykka.get_all(futures)
|
||||
return list(itertools.chain(*results))
|
||||
|
||||
@ -40,10 +41,10 @@ class StoredPlaylistsController(object):
|
||||
:type uri_scheme: string
|
||||
:rtype: :class:`mopidy.models.Playlist`
|
||||
"""
|
||||
if uri_scheme in self.backends.by_uri_scheme:
|
||||
if uri_scheme in self.backends.with_stored_playlists_by_uri_scheme:
|
||||
backend = self.backends.by_uri_scheme[uri_scheme]
|
||||
else:
|
||||
backend = self.backends[0]
|
||||
backend = self.backends.with_stored_playlists[0]
|
||||
return backend.stored_playlists.create(name).get()
|
||||
|
||||
def delete(self, uri):
|
||||
@ -57,8 +58,9 @@ class StoredPlaylistsController(object):
|
||||
:type uri: string
|
||||
"""
|
||||
uri_scheme = urlparse.urlparse(uri).scheme
|
||||
if uri_scheme in self.backends.by_uri_scheme:
|
||||
backend = self.backends.by_uri_scheme[uri_scheme]
|
||||
backend = self.backends.with_stored_playlists_by_uri_scheme.get(
|
||||
uri_scheme, None)
|
||||
if backend:
|
||||
backend.stored_playlists.delete(uri).get()
|
||||
|
||||
def get(self, **criteria):
|
||||
@ -101,7 +103,8 @@ class StoredPlaylistsController(object):
|
||||
:rtype: :class:`mopidy.models.Playlist` or :class:`None`
|
||||
"""
|
||||
uri_scheme = urlparse.urlparse(uri).scheme
|
||||
backend = self.backends.by_uri_scheme.get(uri_scheme, None)
|
||||
backend = self.backends.with_stored_playlists_by_uri_scheme.get(
|
||||
uri_scheme, None)
|
||||
if backend:
|
||||
return backend.stored_playlists.lookup(uri).get()
|
||||
else:
|
||||
@ -120,11 +123,13 @@ class StoredPlaylistsController(object):
|
||||
:type uri_scheme: string
|
||||
"""
|
||||
if uri_scheme is None:
|
||||
futures = [b.stored_playlists.refresh() for b in self.backends]
|
||||
futures = [b.stored_playlists.refresh()
|
||||
for b in self.backends.with_stored_playlists]
|
||||
pykka.get_all(futures)
|
||||
else:
|
||||
if uri_scheme in self.backends.by_uri_scheme:
|
||||
backend = self.backends.by_uri_scheme[uri_scheme]
|
||||
backend = self.backends.with_stored_playlists_by_uri_scheme.get(
|
||||
uri_scheme, None)
|
||||
if backend:
|
||||
backend.stored_playlists.refresh().get()
|
||||
|
||||
def save(self, playlist):
|
||||
@ -152,7 +157,7 @@ class StoredPlaylistsController(object):
|
||||
if playlist.uri is None:
|
||||
return
|
||||
uri_scheme = urlparse.urlparse(playlist.uri).scheme
|
||||
if uri_scheme not in self.backends.by_uri_scheme:
|
||||
return
|
||||
backend = self.backends.by_uri_scheme[uri_scheme]
|
||||
return backend.stored_playlists.save(playlist).get()
|
||||
backend = self.backends.with_stored_playlists_by_uri_scheme.get(
|
||||
uri_scheme, None)
|
||||
if backend:
|
||||
return backend.stored_playlists.save(playlist).get()
|
||||
|
||||
@ -19,6 +19,12 @@ class StoredPlaylistsTest(unittest.TestCase):
|
||||
self.sp2 = mock.Mock(spec=base.BaseStoredPlaylistsProvider)
|
||||
self.backend2.stored_playlists = self.sp2
|
||||
|
||||
# A backend without the optional stored playlists provider
|
||||
self.backend3 = mock.Mock()
|
||||
self.backend3.uri_schemes.get.return_value = ['dummy3']
|
||||
self.backend3.has_stored_playlists().get.return_value = False
|
||||
self.backend3.stored_playlists = None
|
||||
|
||||
self.pl1a = Playlist(tracks=[Track(uri='dummy1:a')])
|
||||
self.pl1b = Playlist(tracks=[Track(uri='dummy1:b')])
|
||||
self.sp1.playlists.get.return_value = [self.pl1a, self.pl1b]
|
||||
@ -27,7 +33,8 @@ class StoredPlaylistsTest(unittest.TestCase):
|
||||
self.pl2b = Playlist(tracks=[Track(uri='dummy2:b')])
|
||||
self.sp2.playlists.get.return_value = [self.pl2a, self.pl2b]
|
||||
|
||||
self.core = Core(audio=None, backends=[self.backend1, self.backend2])
|
||||
self.core = Core(audio=None, backends=[
|
||||
self.backend3, self.backend1, self.backend2])
|
||||
|
||||
def test_get_playlists_combines_result_from_backends(self):
|
||||
result = self.core.stored_playlists.playlists
|
||||
@ -59,6 +66,17 @@ class StoredPlaylistsTest(unittest.TestCase):
|
||||
self.assertFalse(self.sp1.create.called)
|
||||
self.sp2.create.assert_called_once_with('foo')
|
||||
|
||||
def test_create_with_unsupported_uri_scheme_uses_first_backend(self):
|
||||
playlist = Playlist()
|
||||
self.sp1.create().get.return_value = playlist
|
||||
self.sp1.reset_mock()
|
||||
|
||||
result = self.core.stored_playlists.create('foo', uri_scheme='dummy3')
|
||||
|
||||
self.assertEqual(playlist, result)
|
||||
self.sp1.create.assert_called_once_with('foo')
|
||||
self.assertFalse(self.sp2.create.called)
|
||||
|
||||
def test_delete_selects_the_dummy1_backend(self):
|
||||
self.core.stored_playlists.delete('dummy1:a')
|
||||
|
||||
@ -77,6 +95,12 @@ class StoredPlaylistsTest(unittest.TestCase):
|
||||
self.assertFalse(self.sp1.delete.called)
|
||||
self.assertFalse(self.sp2.delete.called)
|
||||
|
||||
def test_delete_ignores_backend_without_playlist_support(self):
|
||||
self.core.stored_playlists.delete('dummy3:a')
|
||||
|
||||
self.assertFalse(self.sp1.delete.called)
|
||||
self.assertFalse(self.sp2.delete.called)
|
||||
|
||||
def test_lookup_selects_the_dummy1_backend(self):
|
||||
self.core.stored_playlists.lookup('dummy1:a')
|
||||
|
||||
@ -89,6 +113,13 @@ class StoredPlaylistsTest(unittest.TestCase):
|
||||
self.assertFalse(self.sp1.lookup.called)
|
||||
self.sp2.lookup.assert_called_once_with('dummy2:a')
|
||||
|
||||
def test_lookup_track_in_backend_without_playlists_fails(self):
|
||||
result = self.core.stored_playlists.lookup('dummy3:a')
|
||||
|
||||
self.assertIsNone(result)
|
||||
self.assertFalse(self.sp1.lookup.called)
|
||||
self.assertFalse(self.sp2.lookup.called)
|
||||
|
||||
def test_refresh_without_uri_scheme_refreshes_all_backends(self):
|
||||
self.core.stored_playlists.refresh()
|
||||
|
||||
@ -107,6 +138,12 @@ class StoredPlaylistsTest(unittest.TestCase):
|
||||
self.assertFalse(self.sp1.refresh.called)
|
||||
self.assertFalse(self.sp2.refresh.called)
|
||||
|
||||
def test_refresh_ignores_backend_without_playlist_support(self):
|
||||
self.core.stored_playlists.refresh(uri_scheme='dummy3')
|
||||
|
||||
self.assertFalse(self.sp1.refresh.called)
|
||||
self.assertFalse(self.sp2.refresh.called)
|
||||
|
||||
def test_save_selects_the_dummy1_backend(self):
|
||||
playlist = Playlist(uri='dummy1:a')
|
||||
self.sp1.save().get.return_value = playlist
|
||||
@ -142,3 +179,10 @@ class StoredPlaylistsTest(unittest.TestCase):
|
||||
self.assertIsNone(result)
|
||||
self.assertFalse(self.sp1.save.called)
|
||||
self.assertFalse(self.sp2.save.called)
|
||||
|
||||
def test_save_ignores_backend_without_playlist_support(self):
|
||||
result = self.core.stored_playlists.save(Playlist(uri='dummy3:a'))
|
||||
|
||||
self.assertIsNone(result)
|
||||
self.assertFalse(self.sp1.save.called)
|
||||
self.assertFalse(self.sp2.save.called)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user