diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index 05c085fd..0af8c3b2 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -30,25 +30,44 @@ class Core(pykka.ThreadingActor, AudioListener): def __init__(self, audio=None, backends=None): super(Core, self).__init__() - self._backends = backends + self.backends = Backends(backends) self.current_playlist = CurrentPlaylistController(core=self) - self.library = LibraryController(backends=backends, core=self) + self.library = LibraryController(backends=self.backends, core=self) self.playback = PlaybackController( - audio=audio, backends=backends, core=self) + audio=audio, backends=self.backends, core=self) self.stored_playlists = StoredPlaylistsController( - backends=backends, core=self) + backends=self.backends, core=self) @property def uri_schemes(self): """List of URI schemes we can handle""" - futures = [backend.uri_schemes for backend in self._backends] + futures = [b.uri_schemes for b in self.backends] results = pykka.get_all(futures) uri_schemes = itertools.chain(*results) return sorted(uri_schemes) def reached_end_of_stream(self): self.playback.on_end_of_track() + + +class Backends(object): + def __init__(self, backends): + self._backends = backends + + uri_schemes_by_backend = { + backend: backend.uri_schemes.get() + for backend in backends} + self.by_uri_scheme = { + uri_scheme: backend + for backend, uri_schemes in uri_schemes_by_backend.items() + for uri_scheme in uri_schemes} + + def __len__(self): + return len(self._backends) + + def __getitem__(self, key): + return self._backends[key] diff --git a/mopidy/core/library.py b/mopidy/core/library.py index e0df8928..bf14f5d3 100644 --- a/mopidy/core/library.py +++ b/mopidy/core/library.py @@ -11,19 +11,11 @@ class LibraryController(object): def __init__(self, backends, core): self.backends = backends - uri_schemes_by_backend = { - backend: backend.uri_schemes.get() - for backend in backends} - self.backends_by_uri_scheme = { - uri_scheme: backend - for backend, uri_schemes in uri_schemes_by_backend.items() - for uri_scheme in uri_schemes} - self.core = core def _get_backend(self, uri): uri_scheme = urlparse.urlparse(uri).scheme - return self.backends_by_uri_scheme.get(uri_scheme) + return self.backends.by_uri_scheme.get(uri_scheme) def find_exact(self, **query): """ diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 721bc2a8..74f4bebd 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -77,16 +77,7 @@ class PlaybackController(object): def __init__(self, audio, backends, core): self.audio = audio - self.backends = backends - uri_schemes_by_backend = { - backend: backend.uri_schemes.get() - for backend in backends} - self.backends_by_uri_scheme = { - uri_scheme: backend - for backend, uri_schemes in uri_schemes_by_backend.items() - for uri_scheme in uri_schemes} - self.core = core self._state = PlaybackState.STOPPED @@ -99,7 +90,7 @@ class PlaybackController(object): return None uri = self.current_cp_track.track.uri uri_scheme = urlparse.urlparse(uri).scheme - return self.backends_by_uri_scheme[uri_scheme] + return self.backends.by_uri_scheme[uri_scheme] def _get_cpid(self, cp_track): if cp_track is None: