From 7060a75072089e35a908cbbe5224d3dce57e0826 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 1 Apr 2013 13:38:51 +0200 Subject: [PATCH 1/8] spotify: Define extension --- mopidy/backends/spotify/__init__.py | 76 ++++++++++++++++++++++++++--- setup.py | 4 +- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/mopidy/backends/spotify/__init__.py b/mopidy/backends/spotify/__init__.py index 507511f4..8c65817a 100644 --- a/mopidy/backends/spotify/__init__.py +++ b/mopidy/backends/spotify/__init__.py @@ -1,4 +1,39 @@ -"""A backend for playing music from Spotify +from __future__ import unicode_literals + +import mopidy +from mopidy import ext +from mopidy.exceptions import ExtensionError +from mopidy.utils.formatting import indent + + +config = """ +[spotify] + +# If the Spotify extension should be enabled or not +enabled = true + +# Your Spotify Premium username +username = + +# Your Spotify Premium password +password = + +# The preferred audio bitrate. Valid values are 96, 160, 320 +bitrate = 160 + +# Max number of seconds to wait for Spotify operations to complete +timeout = 10 + +# Path to the Spotify data cache. Cannot be shared with other Spotify apps +cache_path = $XDG_CACHE_DIR/mopidy/spotify + +# Connect to Spotify through a proxy +proxy_host = +proxy_username = +proxy_password = +""" + +__doc__ = """A backend for playing music from Spotify `Spotify `_ is a music streaming service. The backend uses the official `libspotify @@ -22,14 +57,39 @@ https://github.com/mopidy/mopidy/issues?labels=Spotify+backend .. literalinclude:: ../../../requirements/spotify.txt -**Settings:** +**Default config:** -- :attr:`mopidy.settings.SPOTIFY_CACHE_PATH` -- :attr:`mopidy.settings.SPOTIFY_USERNAME` -- :attr:`mopidy.settings.SPOTIFY_PASSWORD` -""" +.. code-block:: ini -from __future__ import unicode_literals +%(config)s +""" % {'config': indent(config)} -# flake8: noqa + +# TODO Move import into method when BACKENDS setting is removed from .actor import SpotifyBackend + + +class Extension(ext.Extension): + + name = 'Mopidy-Spotify' + version = mopidy.__version__ + + def get_default_config(self): + return config + + def validate_config(self, config): + if not config.getboolean('spotify', 'enabled'): + return + if not config.get('spotify', 'username'): + raise ExtensionError('Config spotify.username not set') + if not config.get('spotify', 'password'): + raise ExtensionError('Config spotify.password not set') + + def validate_environment(self): + try: + import spotify # noqa + except ImportError as e: + raise ExtensionError('pyspotify library not found', e) + + def get_backend_classes(self): + return [SpotifyBackend] diff --git a/setup.py b/setup.py index eeab24bd..ec84abd9 100644 --- a/setup.py +++ b/setup.py @@ -44,7 +44,9 @@ setup( 'mopidy = mopidy.__main__:main', 'mopidy-scan = mopidy.scanner:main', ], - b'mopidy.extension': [], + b'mopidy.extension': [ + 'spotify = mopidy.backends.spotify:Extension', + ], }, classifiers=[ 'Development Status :: 4 - Beta', From d8c7b876bed988d706daf33ffb6b3c0da5c28750 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 1 Apr 2013 14:50:22 +0200 Subject: [PATCH 2/8] local: Define extension --- mopidy/backends/local/__init__.py | 29 ++++++++++++++++++++++++++--- setup.py | 1 + 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/mopidy/backends/local/__init__.py b/mopidy/backends/local/__init__.py index 8ee58d3b..8f7f7be0 100644 --- a/mopidy/backends/local/__init__.py +++ b/mopidy/backends/local/__init__.py @@ -1,4 +1,10 @@ -"""A backend for playing music from a local music archive. +from __future__ import unicode_literals + +import mopidy +from mopidy import ext + + +__doc__ = """A backend for playing music from a local music archive. This backend handles URIs starting with ``file:``. @@ -20,7 +26,24 @@ https://github.com/mopidy/mopidy/issues?labels=Local+backend - :attr:`mopidy.settings.LOCAL_TAG_CACHE_FILE` """ -from __future__ import unicode_literals -# flake8: noqa +# TODO Move import into method when BACKENDS setting is removed from .actor import LocalBackend + + +class Extension(ext.Extension): + + name = 'Mopidy-Local' + version = mopidy.__version__ + + def get_default_config(self): + return '[local]' + + def validate_config(self, config): + pass + + def validate_environment(self): + pass + + def get_backend_classes(self): + return [LocalBackend] diff --git a/setup.py b/setup.py index ec84abd9..132e00a9 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,7 @@ setup( 'mopidy-scan = mopidy.scanner:main', ], b'mopidy.extension': [ + 'local = mopidy.backends.local:Extension', 'spotify = mopidy.backends.spotify:Extension', ], }, From d65a986a56c4b72ab0aa373ba51f4fa57203d643 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 1 Apr 2013 14:56:20 +0200 Subject: [PATCH 3/8] stream: Define extension --- mopidy/backends/stream/__init__.py | 29 ++++++++++++++++++++++++++--- setup.py | 1 + 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/mopidy/backends/stream/__init__.py b/mopidy/backends/stream/__init__.py index 82755540..8c856c10 100644 --- a/mopidy/backends/stream/__init__.py +++ b/mopidy/backends/stream/__init__.py @@ -1,4 +1,10 @@ -"""A backend for playing music for streaming music. +from __future__ import unicode_literals + +import mopidy +from mopidy import ext + + +__doc__ = """A backend for playing music for streaming music. This backend will handle streaming of URIs in :attr:`mopidy.settings.STREAM_PROTOCOLS` assuming the right plugins are @@ -17,7 +23,24 @@ https://github.com/mopidy/mopidy/issues?labels=Stream+backend - :attr:`mopidy.settings.STREAM_PROTOCOLS` """ -from __future__ import unicode_literals -# flake8: noqa +# TODO Move import into method when BACKENDS setting is removed from .actor import StreamBackend + + +class Extension(ext.Extension): + + name = 'Mopidy-Stream' + version = mopidy.__version__ + + def get_default_config(self): + return '[stream]' + + def validate_config(self, config): + pass + + def validate_environment(self): + pass + + def get_backend_classes(self): + return [StreamBackend] diff --git a/setup.py b/setup.py index 132e00a9..340d5058 100644 --- a/setup.py +++ b/setup.py @@ -47,6 +47,7 @@ setup( b'mopidy.extension': [ 'local = mopidy.backends.local:Extension', 'spotify = mopidy.backends.spotify:Extension', + 'stream = mopidy.backends.stream:Extension', ], }, classifiers=[ From a5f3bfc9c43481850da76275300bb83b510d3ea5 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 1 Apr 2013 15:01:28 +0200 Subject: [PATCH 4/8] mpd: Define extension --- mopidy/frontends/mpd/__init__.py | 29 ++++++++++++++++++++++++++--- setup.py | 1 + 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/mopidy/frontends/mpd/__init__.py b/mopidy/frontends/mpd/__init__.py index 6b4eacc8..e095da14 100644 --- a/mopidy/frontends/mpd/__init__.py +++ b/mopidy/frontends/mpd/__init__.py @@ -1,4 +1,10 @@ -"""The MPD server frontend. +from __future__ import unicode_literals + +import mopidy +from mopidy import ext + + +__doc__ = """The MPD server frontend. MPD stands for Music Player Daemon. MPD is an independent project and server. Mopidy implements the MPD protocol, and is thus compatible with clients for the @@ -44,7 +50,24 @@ near future: - Live update of the music database is not supported """ -from __future__ import unicode_literals -# flake8: noqa +# TODO Move import into method when FRONTENDS setting is removed from .actor import MpdFrontend + + +class Extension(ext.Extension): + + name = 'Mopidy-MPD' + version = mopidy.__version__ + + def get_default_config(self): + return '[mpd]' + + def validate_config(self, config): + pass + + def validate_environment(self): + pass + + def get_frontend_classes(self): + return [MpdFrontend] diff --git a/setup.py b/setup.py index 340d5058..eb46fe87 100644 --- a/setup.py +++ b/setup.py @@ -46,6 +46,7 @@ setup( ], b'mopidy.extension': [ 'local = mopidy.backends.local:Extension', + 'mpd = mopidy.frontends.mpd:Extension', 'spotify = mopidy.backends.spotify:Extension', 'stream = mopidy.backends.stream:Extension', ], From 5b6fc25cf843f29f99921818932a9fb380c9ea7b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 1 Apr 2013 15:04:25 +0200 Subject: [PATCH 5/8] mpris: Define extension --- mopidy/frontends/mpris/__init__.py | 33 +++++++++++++++++++++++++++--- setup.py | 1 + 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/mopidy/frontends/mpris/__init__.py b/mopidy/frontends/mpris/__init__.py index 2be6efea..acaff7ff 100644 --- a/mopidy/frontends/mpris/__init__.py +++ b/mopidy/frontends/mpris/__init__.py @@ -1,4 +1,11 @@ -""" +from __future__ import unicode_literals + +import mopidy +from mopidy import ext +from mopidy.exceptions import ExtensionError + + +__doc__ = """ Frontend which lets you control Mopidy through the Media Player Remote Interfacing Specification (`MPRIS `_) D-Bus interface. @@ -50,7 +57,27 @@ Now you can control Mopidy through the player object. Examples: player.Quit(dbus_interface='org.mpris.MediaPlayer2') """ -from __future__ import unicode_literals -# flake8: noqa +# TODO Move import into method when FRONTENDS setting is removed from .actor import MprisFrontend + + +class Extension(ext.Extension): + + name = 'Mopidy-MPRIS' + version = mopidy.__version__ + + def get_default_config(self): + return '[mpris]' + + def validate_config(self, config): + pass + + def validate_environment(self): + try: + import dbus # noqa + except ImportError as e: + raise ExtensionError('Library dbus not found', e) + + def get_frontend_classes(self): + return [MprisFrontend] diff --git a/setup.py b/setup.py index eb46fe87..3672e2f2 100644 --- a/setup.py +++ b/setup.py @@ -47,6 +47,7 @@ setup( b'mopidy.extension': [ 'local = mopidy.backends.local:Extension', 'mpd = mopidy.frontends.mpd:Extension', + 'mpris = mopidy.frontends.mpris:Extension', 'spotify = mopidy.backends.spotify:Extension', 'stream = mopidy.backends.stream:Extension', ], From 0f1c4c1dff1cd364285c6fcff6fec478e308418a Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 1 Apr 2013 15:06:14 +0200 Subject: [PATCH 6/8] http: Define extension --- mopidy/frontends/http/__init__.py | 38 +++++++++++++++++++++++++++++-- setup.py | 1 + 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/mopidy/frontends/http/__init__.py b/mopidy/frontends/http/__init__.py index e81ddf3f..fb354c09 100644 --- a/mopidy/frontends/http/__init__.py +++ b/mopidy/frontends/http/__init__.py @@ -1,4 +1,11 @@ -""" +from __future__ import unicode_literals + +import mopidy +from mopidy import ext +from mopidy.exceptions import ExtensionError + + +__doc__ = """ The HTTP frontends lets you control Mopidy through HTTP and WebSockets, e.g. from a web based client. @@ -477,5 +484,32 @@ Example to get started with and all events that are emitted. """ -# flake8: noqa + +# TODO Move import into method when FRONTENDS setting is removed from .actor import HttpFrontend + + +class Extension(ext.Extension): + + name = 'Mopidy-HTTP' + version = mopidy.__version__ + + def get_default_config(self): + return '[http]' + + def validate_config(self, config): + pass + + def validate_environment(self): + try: + import cherrypy # noqa + except ImportError as e: + raise ExtensionError('Library cherrypy not found', e) + + try: + import ws4py # noqa + except ImportError as e: + raise ExtensionError('Library ws4py not found', e) + + def get_frontend_classes(self): + return [HttpFrontend] diff --git a/setup.py b/setup.py index 3672e2f2..db2b1932 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,7 @@ setup( 'mopidy-scan = mopidy.scanner:main', ], b'mopidy.extension': [ + 'http = mopidy.frontends.http:Extension', 'local = mopidy.backends.local:Extension', 'mpd = mopidy.frontends.mpd:Extension', 'mpris = mopidy.frontends.mpris:Extension', From 2176ab3d98b2f004158df07649be15cbd0f83bb7 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 1 Apr 2013 15:11:35 +0200 Subject: [PATCH 7/8] lastfm: Define extension --- mopidy/frontends/lastfm/__init__.py | 55 +++++++++++++++++++ .../frontends/{lastfm.py => lastfm/actor.py} | 24 -------- setup.py | 1 + 3 files changed, 56 insertions(+), 24 deletions(-) create mode 100644 mopidy/frontends/lastfm/__init__.py rename mopidy/frontends/{lastfm.py => lastfm/actor.py} (87%) diff --git a/mopidy/frontends/lastfm/__init__.py b/mopidy/frontends/lastfm/__init__.py new file mode 100644 index 00000000..aac27848 --- /dev/null +++ b/mopidy/frontends/lastfm/__init__.py @@ -0,0 +1,55 @@ +from __future__ import unicode_literals + +import mopidy +from mopidy import ext +from mopidy.exceptions import ExtensionError + + +__doc__ = """ +Frontend which scrobbles the music you play to your `Last.fm +`_ profile. + +.. note:: + + This frontend requires a free user account at Last.fm. + +**Dependencies:** + +.. literalinclude:: ../../../requirements/lastfm.txt + +**Settings:** + +- :attr:`mopidy.settings.LASTFM_USERNAME` +- :attr:`mopidy.settings.LASTFM_PASSWORD` + +**Usage:** + +Make sure :attr:`mopidy.settings.FRONTENDS` includes +``mopidy.frontends.lastfm.LastfmFrontend``. By default, the setting includes +the Last.fm frontend. +""" + + +# TODO Move import into method when FRONTENDS setting is removed +from .actor import LastfmFrontend + + +class Extension(ext.Extension): + + name = 'Mopidy-Lastfm' + version = mopidy.__version__ + + def get_default_config(self): + return '[lastfm]' + + def validate_config(self, config): + pass + + def validate_environment(self): + try: + import pylast # noqa + except ImportError as e: + raise ExtensionError('pylast library not found', e) + + def get_frontend_classes(self): + return [LastfmFrontend] diff --git a/mopidy/frontends/lastfm.py b/mopidy/frontends/lastfm/actor.py similarity index 87% rename from mopidy/frontends/lastfm.py rename to mopidy/frontends/lastfm/actor.py index 61dc306c..60a909e0 100644 --- a/mopidy/frontends/lastfm.py +++ b/mopidy/frontends/lastfm/actor.py @@ -1,27 +1,3 @@ -""" -Frontend which scrobbles the music you play to your `Last.fm -`_ profile. - -.. note:: - - This frontend requires a free user account at Last.fm. - -**Dependencies:** - -.. literalinclude:: ../../../requirements/lastfm.txt - -**Settings:** - -- :attr:`mopidy.settings.LASTFM_USERNAME` -- :attr:`mopidy.settings.LASTFM_PASSWORD` - -**Usage:** - -Make sure :attr:`mopidy.settings.FRONTENDS` includes -``mopidy.frontends.lastfm.LastfmFrontend``. By default, the setting includes -the Last.fm frontend. -""" - from __future__ import unicode_literals import logging diff --git a/setup.py b/setup.py index db2b1932..cff6ce23 100644 --- a/setup.py +++ b/setup.py @@ -46,6 +46,7 @@ setup( ], b'mopidy.extension': [ 'http = mopidy.frontends.http:Extension', + 'lastfm = mopidy.frontends.lastfm:Extension', 'local = mopidy.backends.local:Extension', 'mpd = mopidy.frontends.mpd:Extension', 'mpris = mopidy.frontends.mpris:Extension', From ec7c172c2ec1dee35acad25c6b02692485910f6c Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 1 Apr 2013 16:14:34 +0200 Subject: [PATCH 8/8] Add ext prefix to config sections --- mopidy/backends/local/__init__.py | 2 +- mopidy/backends/spotify/__init__.py | 2 +- mopidy/backends/stream/__init__.py | 2 +- mopidy/frontends/http/__init__.py | 2 +- mopidy/frontends/lastfm/__init__.py | 2 +- mopidy/frontends/mpd/__init__.py | 2 +- mopidy/frontends/mpris/__init__.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mopidy/backends/local/__init__.py b/mopidy/backends/local/__init__.py index 8f7f7be0..99c50e1f 100644 --- a/mopidy/backends/local/__init__.py +++ b/mopidy/backends/local/__init__.py @@ -37,7 +37,7 @@ class Extension(ext.Extension): version = mopidy.__version__ def get_default_config(self): - return '[local]' + return '[ext.local]' def validate_config(self, config): pass diff --git a/mopidy/backends/spotify/__init__.py b/mopidy/backends/spotify/__init__.py index 8c65817a..efa5338b 100644 --- a/mopidy/backends/spotify/__init__.py +++ b/mopidy/backends/spotify/__init__.py @@ -7,7 +7,7 @@ from mopidy.utils.formatting import indent config = """ -[spotify] +[ext.spotify] # If the Spotify extension should be enabled or not enabled = true diff --git a/mopidy/backends/stream/__init__.py b/mopidy/backends/stream/__init__.py index 8c856c10..dbf3e6d5 100644 --- a/mopidy/backends/stream/__init__.py +++ b/mopidy/backends/stream/__init__.py @@ -34,7 +34,7 @@ class Extension(ext.Extension): version = mopidy.__version__ def get_default_config(self): - return '[stream]' + return '[ext.stream]' def validate_config(self, config): pass diff --git a/mopidy/frontends/http/__init__.py b/mopidy/frontends/http/__init__.py index fb354c09..25fe788f 100644 --- a/mopidy/frontends/http/__init__.py +++ b/mopidy/frontends/http/__init__.py @@ -495,7 +495,7 @@ class Extension(ext.Extension): version = mopidy.__version__ def get_default_config(self): - return '[http]' + return '[ext.http]' def validate_config(self, config): pass diff --git a/mopidy/frontends/lastfm/__init__.py b/mopidy/frontends/lastfm/__init__.py index aac27848..e3f1f5c6 100644 --- a/mopidy/frontends/lastfm/__init__.py +++ b/mopidy/frontends/lastfm/__init__.py @@ -40,7 +40,7 @@ class Extension(ext.Extension): version = mopidy.__version__ def get_default_config(self): - return '[lastfm]' + return '[ext.lastfm]' def validate_config(self, config): pass diff --git a/mopidy/frontends/mpd/__init__.py b/mopidy/frontends/mpd/__init__.py index e095da14..8d9d13e0 100644 --- a/mopidy/frontends/mpd/__init__.py +++ b/mopidy/frontends/mpd/__init__.py @@ -61,7 +61,7 @@ class Extension(ext.Extension): version = mopidy.__version__ def get_default_config(self): - return '[mpd]' + return '[ext.mpd]' def validate_config(self, config): pass diff --git a/mopidy/frontends/mpris/__init__.py b/mopidy/frontends/mpris/__init__.py index acaff7ff..b21dafff 100644 --- a/mopidy/frontends/mpris/__init__.py +++ b/mopidy/frontends/mpris/__init__.py @@ -68,7 +68,7 @@ class Extension(ext.Extension): version = mopidy.__version__ def get_default_config(self): - return '[mpris]' + return '[ext.mpris]' def validate_config(self, config): pass