diff --git a/mopidy/core/library.py b/mopidy/core/library.py index f7514fd8..5c34e269 100644 --- a/mopidy/core/library.py +++ b/mopidy/core/library.py @@ -15,7 +15,7 @@ class LibraryController(object): def _get_backend(self, uri): uri_scheme = urlparse.urlparse(uri).scheme - return self.backends.by_uri_scheme.get(uri_scheme, None) + return self.backends.with_library_by_uri_scheme.get(uri_scheme, None) def find_exact(self, **query): """ @@ -34,7 +34,8 @@ class LibraryController(object): :type query: dict :rtype: :class:`mopidy.models.Playlist` """ - futures = [b.library.find_exact(**query) for b in self.backends] + futures = [b.library.find_exact(**query) + for b in self.backends.with_library] results = pykka.get_all(futures) return Playlist(tracks=[ track for playlist in results for track in playlist.tracks]) @@ -65,7 +66,8 @@ class LibraryController(object): if backend: backend.library.refresh(uri).get() else: - futures = [b.library.refresh(uri) for b in self.backends] + futures = [b.library.refresh(uri) + for b in self.backends.with_library] pykka.get_all(futures) def search(self, **query): @@ -85,7 +87,8 @@ class LibraryController(object): :type query: dict :rtype: :class:`mopidy.models.Playlist` """ - futures = [b.library.search(**query) for b in self.backends] + futures = [b.library.search(**query) + for b in self.backends.with_library] results = pykka.get_all(futures) track_lists = [playlist.tracks for playlist in results] tracks = list(itertools.chain(*track_lists)) diff --git a/tests/core/library_test.py b/tests/core/library_test.py index 04f19909..8a714588 100644 --- a/tests/core/library_test.py +++ b/tests/core/library_test.py @@ -19,7 +19,13 @@ class CoreLibraryTest(unittest.TestCase): self.library2 = mock.Mock(spec=base.BaseLibraryProvider) self.backend2.library = self.library2 - self.core = Core(audio=None, backends=[self.backend1, self.backend2]) + # A backend without the optional library provider + self.backend3 = mock.Mock() + self.backend3.uri_schemes.get.return_value = ['dummy3'] + self.backend3.has_library().get.return_value = False + + self.core = Core(audio=None, backends=[ + self.backend1, self.backend2, self.backend3]) def test_lookup_selects_dummy1_backend(self): self.core.library.lookup('dummy1:a') @@ -33,6 +39,13 @@ class CoreLibraryTest(unittest.TestCase): self.assertFalse(self.library1.lookup.called) self.library2.lookup.assert_called_once_with('dummy2:a') + def test_lookup_fails_for_dummy3_track(self): + result = self.core.library.lookup('dummy3:a') + + self.assertIsNone(result) + self.assertFalse(self.library1.lookup.called) + self.assertFalse(self.library2.lookup.called) + def test_refresh_with_uri_selects_dummy1_backend(self): self.core.library.refresh('dummy1:a') @@ -45,6 +58,12 @@ class CoreLibraryTest(unittest.TestCase): self.assertFalse(self.library1.refresh.called) self.library2.refresh.assert_called_once_with('dummy2:a') + def test_refresh_with_uri_fails_silently_for_dummy3_uri(self): + self.core.library.refresh('dummy3:a') + + self.assertFalse(self.library1.refresh.called) + self.assertFalse(self.library2.refresh.called) + def test_refresh_without_uri_calls_all_backends(self): self.core.library.refresh()