Merge branch 'feature/multiple-bitrates-support' into develop
This commit is contained in:
commit
ee09365ccf
@ -11,6 +11,7 @@ from mopidy.gstreamer import GStreamer
|
|||||||
logger = logging.getLogger('mopidy.backends.spotify')
|
logger = logging.getLogger('mopidy.backends.spotify')
|
||||||
|
|
||||||
ENCODING = 'utf-8'
|
ENCODING = 'utf-8'
|
||||||
|
BITRATES = {96: 2, 160: 0, 320: 1}
|
||||||
|
|
||||||
class SpotifyBackend(ThreadingActor, Backend):
|
class SpotifyBackend(ThreadingActor, Backend):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -8,6 +8,7 @@ from pykka.registry import ActorRegistry
|
|||||||
|
|
||||||
from mopidy import get_version, settings
|
from mopidy import get_version, settings
|
||||||
from mopidy.backends.base import Backend
|
from mopidy.backends.base import Backend
|
||||||
|
from mopidy.backends.spotify import BITRATES
|
||||||
from mopidy.backends.spotify.translator import SpotifyTranslator
|
from mopidy.backends.spotify.translator import SpotifyTranslator
|
||||||
from mopidy.models import Playlist
|
from mopidy.models import Playlist
|
||||||
from mopidy.gstreamer import GStreamer
|
from mopidy.gstreamer import GStreamer
|
||||||
@ -58,12 +59,10 @@ class SpotifySessionManager(BaseThread, PyspotifySessionManager):
|
|||||||
return
|
return
|
||||||
logger.info(u'Connected to Spotify')
|
logger.info(u'Connected to Spotify')
|
||||||
self.session = session
|
self.session = session
|
||||||
if settings.SPOTIFY_HIGH_BITRATE:
|
|
||||||
logger.debug(u'Preferring high bitrate from Spotify')
|
logger.debug(u'Preferred Spotify bitrate is %s kbps.', settings.SPOTIFY_BITRATE)
|
||||||
self.session.set_preferred_bitrate(1)
|
self.session.set_preferred_bitrate(BITRATES[settings.SPOTIFY_BITRATE])
|
||||||
else:
|
|
||||||
logger.debug(u'Preferring normal bitrate from Spotify')
|
|
||||||
self.session.set_preferred_bitrate(0)
|
|
||||||
self.container_manager = SpotifyContainerManager(self)
|
self.container_manager = SpotifyContainerManager(self)
|
||||||
self.container_manager.watch(self.session.playlist_container())
|
self.container_manager.watch(self.session.playlist_container())
|
||||||
self.connected.set()
|
self.connected.set()
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import logging
|
|||||||
from spotify import Link, SpotifyError
|
from spotify import Link, SpotifyError
|
||||||
|
|
||||||
from mopidy import settings
|
from mopidy import settings
|
||||||
from mopidy.backends.spotify import ENCODING
|
from mopidy.backends.spotify import ENCODING, BITRATES
|
||||||
from mopidy.models import Artist, Album, Track, Playlist
|
from mopidy.models import Artist, Album, Track, Playlist
|
||||||
|
|
||||||
logger = logging.getLogger('mopidy.backends.spotify.translator')
|
logger = logging.getLogger('mopidy.backends.spotify.translator')
|
||||||
@ -44,7 +44,7 @@ class SpotifyTranslator(object):
|
|||||||
track_no=spotify_track.index(),
|
track_no=spotify_track.index(),
|
||||||
date=date,
|
date=date,
|
||||||
length=spotify_track.duration(),
|
length=spotify_track.duration(),
|
||||||
bitrate=(settings.SPOTIFY_HIGH_BITRATE and 320 or 160),
|
bitrate=BITRATES[settings.SPOTIFY_BITRATE],
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@ -248,11 +248,13 @@ SPOTIFY_USERNAME = u''
|
|||||||
#: Used by :mod:`mopidy.backends.spotify`.
|
#: Used by :mod:`mopidy.backends.spotify`.
|
||||||
SPOTIFY_PASSWORD = u''
|
SPOTIFY_PASSWORD = u''
|
||||||
|
|
||||||
#: Do you prefer high bitrate (320k)?
|
#: Spotify preferred bitrate.
|
||||||
|
#:
|
||||||
|
#: Available values are 96, 160, and 320.
|
||||||
#:
|
#:
|
||||||
#: Used by :mod:`mopidy.backends.spotify`.
|
#: Used by :mod:`mopidy.backends.spotify`.
|
||||||
#
|
#
|
||||||
#: Default::
|
#: Default::
|
||||||
#:
|
#:
|
||||||
#: SPOTIFY_HIGH_BITRATE = False # 160k
|
#: SPOTIFY_BITRATE = 160
|
||||||
SPOTIFY_HIGH_BITRATE = False
|
SPOTIFY_BITRATE = 160
|
||||||
|
|||||||
@ -107,6 +107,7 @@ def validate_settings(defaults, settings):
|
|||||||
'SERVER': None,
|
'SERVER': None,
|
||||||
'SERVER_HOSTNAME': 'MPD_SERVER_HOSTNAME',
|
'SERVER_HOSTNAME': 'MPD_SERVER_HOSTNAME',
|
||||||
'SERVER_PORT': 'MPD_SERVER_PORT',
|
'SERVER_PORT': 'MPD_SERVER_PORT',
|
||||||
|
'SPOTIFY_HIGH_BITRATE': 'SPOTIFY_BITRATE',
|
||||||
'SPOTIFY_LIB_APPKEY': None,
|
'SPOTIFY_LIB_APPKEY': None,
|
||||||
'SPOTIFY_LIB_CACHE': 'SPOTIFY_CACHE_PATH',
|
'SPOTIFY_LIB_CACHE': 'SPOTIFY_CACHE_PATH',
|
||||||
}
|
}
|
||||||
@ -127,6 +128,11 @@ def validate_settings(defaults, settings):
|
|||||||
'longer available.')
|
'longer available.')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if setting == 'SPOTIFY_BITRATE':
|
||||||
|
if value not in (96, 160, 320):
|
||||||
|
errors[setting] = (u'Unavailable Spotify bitrate. ' +
|
||||||
|
u'Available bitrates are 96, 160, and 320.')
|
||||||
|
|
||||||
if setting not in defaults:
|
if setting not in defaults:
|
||||||
errors[setting] = u'Unknown setting. Is it misspelled?'
|
errors[setting] = u'Unknown setting. Is it misspelled?'
|
||||||
continue
|
continue
|
||||||
|
|||||||
@ -10,6 +10,7 @@ class ValidateSettingsTest(unittest.TestCase):
|
|||||||
self.defaults = {
|
self.defaults = {
|
||||||
'MPD_SERVER_HOSTNAME': '::',
|
'MPD_SERVER_HOSTNAME': '::',
|
||||||
'MPD_SERVER_PORT': 6600,
|
'MPD_SERVER_PORT': 6600,
|
||||||
|
'SPOTIFY_BITRATE': 160,
|
||||||
}
|
}
|
||||||
|
|
||||||
def test_no_errors_yields_empty_dict(self):
|
def test_no_errors_yields_empty_dict(self):
|
||||||
@ -42,6 +43,13 @@ class ValidateSettingsTest(unittest.TestCase):
|
|||||||
'"mopidy.backends.despotify.DespotifyBackend" is no longer ' +
|
'"mopidy.backends.despotify.DespotifyBackend" is no longer ' +
|
||||||
'available.')
|
'available.')
|
||||||
|
|
||||||
|
def test_unavailable_bitrate_setting_returns_error(self):
|
||||||
|
result = validate_settings(self.defaults,
|
||||||
|
{'SPOTIFY_BITRATE': 50})
|
||||||
|
self.assertEqual(result['SPOTIFY_BITRATE'],
|
||||||
|
u'Unavailable Spotify bitrate. ' +
|
||||||
|
u'Available bitrates are 96, 160, and 320.')
|
||||||
|
|
||||||
def test_two_errors_are_both_reported(self):
|
def test_two_errors_are_both_reported(self):
|
||||||
result = validate_settings(self.defaults,
|
result = validate_settings(self.defaults,
|
||||||
{'FOO': '', 'BAR': ''})
|
{'FOO': '', 'BAR': ''})
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user