diff --git a/mopidy/core/library.py b/mopidy/core/library.py index b226a378..35ed02c1 100644 --- a/mopidy/core/library.py +++ b/mopidy/core/library.py @@ -68,23 +68,30 @@ class LibraryController(object): .. versionadded:: 0.18 """ - if uri is None: - directories = set() - backends = self.backends.with_library_browse.values() - futures = {b: b.library.root_directory for b in backends} - for backend, future in futures.items(): - try: - directories.add(future.get()) - except Exception: - logger.exception('%s backend caused an exception.', - backend.actor_ref.actor_class.__name__) - return sorted(directories, key=operator.attrgetter('name')) + return self._roots() if uri is None else self._browse(uri) + def _roots(self): + directories = set() + backends = self.backends.with_library_browse.values() + futures = {b: b.library.root_directory for b in backends} + for backend, future in futures.items(): + try: + directories.add(future.get()) + except Exception: + logger.exception('%s backend caused an exception.', + backend.actor_ref.actor_class.__name__) + return sorted(directories, key=operator.attrgetter('name')) + + def _browse(self, uri): scheme = urlparse.urlparse(uri).scheme backend = self.backends.with_library_browse.get(scheme) - if not backend: - return [] - return backend.library.browse(uri).get() + try: + if backend: + return backend.library.browse(uri).get() # TODO: sort? + except Exception: + logger.exception('%s backend caused an exception.', + backend.actor_ref.actor_class.__name__) + return [] def get_distinct(self, field, query=None): """ diff --git a/tests/core/test_library.py b/tests/core/test_library.py index ba6b859e..6cbb00b3 100644 --- a/tests/core/test_library.py +++ b/tests/core/test_library.py @@ -444,10 +444,9 @@ class BackendFailuresCoreLibraryTest(unittest.TestCase): logger.exception.assert_called_with(mock.ANY, 'DummyBackend') def test_browse_backend_browse_uri_exception_gets_through(self, logger): - # TODO: is this behavior desired? self.library.browse.return_value.get.side_effect = Exception - with self.assertRaises(Exception): - self.core.library.browse('dummy:directory') + self.assertEqual([], self.core.library.browse('dummy:directory')) + logger.exception.assert_called_with(mock.ANY, 'DummyBackend') def test_get_distinct_backend_exception_gets_ignored(self, logger): self.library.get_distinct.return_value.get.side_effect = Exception