diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index 4924cca2..2055340e 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -88,6 +88,7 @@ class Backends(list): super(Backends, self).__init__(backends) self.with_library = collections.OrderedDict() + self.with_browsable_library = collections.OrderedDict() self.with_playback = collections.OrderedDict() self.with_playlists = collections.OrderedDict() @@ -101,6 +102,13 @@ class Backends(list): self.add(self.with_playback, has_playback, scheme, backend) self.add(self.with_playlists, has_playlists, scheme, backend) + if has_library: + root_dir_name = backend.library.root_directory_name.get() + has_browsable_library = root_dir_name is not None + self.add( + self.with_browsable_library, has_browsable_library, + root_dir_name, backend) + def add(self, registry, supported, uri_scheme, backend): if not supported: return diff --git a/mopidy/core/library.py b/mopidy/core/library.py index 59993db4..6ea3041c 100644 --- a/mopidy/core/library.py +++ b/mopidy/core/library.py @@ -64,15 +64,10 @@ class LibraryController(object): if not path.startswith('/'): return [] - backends = { - backend.library.root_directory_name.get(): backend - for backend in self.backends.with_library.values() - if backend.library.browse('/').get()} - if path == '/': return [ Ref(uri='/%s' % name, name=name, type=Ref.DIRECTORY) - for name in backends.keys()] + for name in self.backends.with_browsable_library.keys()] groups = re.match('/(?P[^/]+)(?P.*)', path).groupdict() library_name = groups['library'] @@ -80,7 +75,7 @@ class LibraryController(object): if not backend_path.startswith('/'): backend_path = '/%s' % backend_path - backend = backends.get(library_name, None) + backend = self.backends.with_browsable_library.get(library_name, None) if not backend: return [] diff --git a/tests/core/library_test.py b/tests/core/library_test.py index dc7ab778..59f3faf7 100644 --- a/tests/core/library_test.py +++ b/tests/core/library_test.py @@ -30,22 +30,15 @@ class CoreLibraryTest(unittest.TestCase): self.core = Core(audio=None, backends=[ self.backend1, self.backend2, self.backend3]) - def test_browse_root_returns_dir_ref_for_each_library_with_content(self): - self.library1.browse().get.return_value = [ - Ref(uri='/foo/bar', name='bar', type=Ref.DIRECTORY), - Ref(uri='dummy1:/foo/baz.mp3', name='Baz', type=Ref.TRACK), - ] - self.library1.browse.reset_mock() - self.library2.browse().get.return_value = [] - self.library2.browse.reset_mock() - + def test_browse_root_returns_dir_ref_for_each_lib_with_root_dir_name(self): result = self.core.library.browse('/') self.assertEqual(result, [ Ref(uri='/dummy1', name='dummy1', type=Ref.DIRECTORY), + Ref(uri='/dummy2', name='dummy2', type=Ref.DIRECTORY), ]) - self.assertTrue(self.library1.browse.called) - self.assertTrue(self.library2.browse.called) + self.assertFalse(self.library1.browse.called) + self.assertFalse(self.library2.browse.called) self.assertFalse(self.backend3.library.browse.called) def test_browse_empty_string_returns_nothing(self): @@ -64,8 +57,8 @@ class CoreLibraryTest(unittest.TestCase): self.core.library.browse('/dummy1/foo') - self.assertEqual(self.library1.browse.call_count, 2) - self.assertEqual(self.library2.browse.call_count, 1) + self.assertEqual(self.library1.browse.call_count, 1) + self.assertEqual(self.library2.browse.call_count, 0) self.library1.browse.assert_called_with('/foo') def test_browse_dummy2_selects_dummy2_backend(self): @@ -77,16 +70,16 @@ class CoreLibraryTest(unittest.TestCase): self.core.library.browse('/dummy2/bar') - self.assertEqual(self.library1.browse.call_count, 1) - self.assertEqual(self.library2.browse.call_count, 2) + self.assertEqual(self.library1.browse.call_count, 0) + self.assertEqual(self.library2.browse.call_count, 1) self.library2.browse.assert_called_with('/bar') def test_browse_dummy3_returns_nothing(self): result = self.core.library.browse('/dummy3') self.assertEqual(result, []) - self.assertEqual(self.library1.browse.call_count, 1) - self.assertEqual(self.library2.browse.call_count, 1) + self.assertEqual(self.library1.browse.call_count, 0) + self.assertEqual(self.library2.browse.call_count, 0) def test_browse_dir_returns_subdirs_and_tracks(self): self.library1.browse().get.return_value = [