core: Check if library is browsable at startup

This commit is contained in:
Stein Magnus Jodal 2014-01-03 23:12:03 +01:00
parent 69836d2e16
commit 252f4792a0
3 changed files with 20 additions and 24 deletions

View File

@ -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

View File

@ -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<library>[^/]+)(?P<path>.*)', 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 []

View File

@ -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 = [