From 65c64b4a8abc2cb74419c277f50d54cdc472e4e7 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 8 Mar 2011 20:39:50 +0100 Subject: [PATCH] Actorify backends --- mopidy/backends/base/current_playlist.py | 2 ++ mopidy/backends/base/library.py | 2 ++ mopidy/backends/base/playback.py | 4 ++++ mopidy/backends/dummy/__init__.py | 14 +++----------- mopidy/backends/local/__init__.py | 4 +++- mopidy/backends/spotify/__init__.py | 5 ++++- mopidy/core.py | 3 +-- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/mopidy/backends/base/current_playlist.py b/mopidy/backends/base/current_playlist.py index bd424a2d..ffdce176 100644 --- a/mopidy/backends/base/current_playlist.py +++ b/mopidy/backends/base/current_playlist.py @@ -10,6 +10,8 @@ class CurrentPlaylistController(object): :type backend: :class:`mopidy.backends.base.Backend` """ + pykka_traversable = True + def __init__(self, backend): self.backend = backend self._cp_tracks = [] diff --git a/mopidy/backends/base/library.py b/mopidy/backends/base/library.py index fd018b5f..9ca103c0 100644 --- a/mopidy/backends/base/library.py +++ b/mopidy/backends/base/library.py @@ -10,6 +10,8 @@ class LibraryController(object): :type provider: instance of :class:`BaseLibraryProvider` """ + pykka_traversable = True + def __init__(self, backend, provider): self.backend = backend self.provider = provider diff --git a/mopidy/backends/base/playback.py b/mopidy/backends/base/playback.py index 8a3eeee5..e4ffa075 100644 --- a/mopidy/backends/base/playback.py +++ b/mopidy/backends/base/playback.py @@ -15,6 +15,8 @@ class PlaybackController(object): # pylint: disable = R0902 # Too many instance attributes + pykka_traversable = True + #: Constant representing the paused state. PAUSED = u'paused' @@ -461,6 +463,7 @@ class PlaybackController(object): For internal use only. Should be called by the backend directly after a track has started playing. """ + return # TODO-PYKKA Send started_playing event to interested parties if self.current_track is not None: self.backend.core_queue.put({ 'to': 'frontend', @@ -476,6 +479,7 @@ class PlaybackController(object): is stopped playing, e.g. at the next, previous, and stop actions and at end-of-track. """ + return # TODO-PYKKA Send stopped_playing event to interested parties if self.current_track is not None: self.backend.core_queue.put({ 'to': 'frontend', diff --git a/mopidy/backends/dummy/__init__.py b/mopidy/backends/dummy/__init__.py index 9c6885bc..82051188 100644 --- a/mopidy/backends/dummy/__init__.py +++ b/mopidy/backends/dummy/__init__.py @@ -1,3 +1,5 @@ +from pykka.actor import ThreadingActor + from mopidy.backends.base import (Backend, CurrentPlaylistController, PlaybackController, BasePlaybackProvider, LibraryController, BaseLibraryProvider, StoredPlaylistsController, @@ -5,15 +7,7 @@ from mopidy.backends.base import (Backend, CurrentPlaylistController, from mopidy.models import Playlist -class DummyQueue(object): - def __init__(self): - self.received_messages = [] - - def put(self, message): - self.received_messages.append(message) - - -class DummyBackend(Backend): +class DummyBackend(ThreadingActor, Backend): """ A backend which implements the backend API in the simplest way possible. Used in tests of the frontends. @@ -24,8 +18,6 @@ class DummyBackend(Backend): def __init__(self, *args, **kwargs): super(DummyBackend, self).__init__(*args, **kwargs) - self.core_queue = DummyQueue() - self.current_playlist = CurrentPlaylistController(backend=self) library_provider = DummyLibraryProvider(backend=self) diff --git a/mopidy/backends/local/__init__.py b/mopidy/backends/local/__init__.py index e3e1d5dc..c5b42b74 100644 --- a/mopidy/backends/local/__init__.py +++ b/mopidy/backends/local/__init__.py @@ -4,6 +4,8 @@ import multiprocessing import os import shutil +from pykka.actor import ThreadingActor + from mopidy import settings from mopidy.backends.base import (Backend, CurrentPlaylistController, LibraryController, BaseLibraryProvider, PlaybackController, @@ -16,7 +18,7 @@ from .translator import parse_m3u, parse_mpd_tag_cache logger = logging.getLogger(u'mopidy.backends.local') -class LocalBackend(Backend): +class LocalBackend(ThreadingActor, Backend): """ A backend for playing music from a local music archive. diff --git a/mopidy/backends/spotify/__init__.py b/mopidy/backends/spotify/__init__.py index ad3dd7ea..d85e91b2 100644 --- a/mopidy/backends/spotify/__init__.py +++ b/mopidy/backends/spotify/__init__.py @@ -1,5 +1,7 @@ import logging +from pykka.actor import ThreadingActor + from mopidy import settings from mopidy.backends.base import (Backend, CurrentPlaylistController, LibraryController, PlaybackController, StoredPlaylistsController) @@ -8,7 +10,7 @@ logger = logging.getLogger('mopidy.backends.spotify') ENCODING = 'utf-8' -class SpotifyBackend(Backend): +class SpotifyBackend(ThreadingActor, Backend): """ A backend for playing music from the `Spotify `_ music streaming service. The backend uses the official `libspotify @@ -59,6 +61,7 @@ class SpotifyBackend(Backend): self.uri_handlers = [u'spotify:', u'http://open.spotify.com/'] + # TODO-PYKKA: Do setup after actor starts? self.spotify = self._connect() def _connect(self): diff --git a/mopidy/core.py b/mopidy/core.py index 747ef5fb..a82ec2d1 100644 --- a/mopidy/core.py +++ b/mopidy/core.py @@ -57,8 +57,7 @@ def setup_mixer(): return get_class(settings.MIXER).start_proxy() def setup_backend(): - # TODO-PYKKA: Convert backend to one or more actors? - return get_class(settings.BACKENDS[0])() + return get_class(settings.BACKENDS[0]).start_proxy() def setup_frontends(): frontends = []