More function for config value core.restore_state

- New values for core.restore_state : "volume", "last"
- Update changelog
- Adjust logger output
This commit is contained in:
Jens Luetjen 2016-01-05 07:41:02 +01:00
parent e56c39ee78
commit 6746dd0196
5 changed files with 26 additions and 9 deletions

View File

@ -16,6 +16,9 @@ Core API
- Start ``tlid`` counting at 1 instead of 0 to keep in sync with MPD's - Start ``tlid`` counting at 1 instead of 0 to keep in sync with MPD's
``songid``. ``songid``.
- Persist state between runs. The amount of data to persist can be
controlled by config value :confval:`core/restore_state`
Local backend Local backend
-------------- --------------

View File

@ -118,8 +118,11 @@ Core configuration
Allowed values: Allowed values:
- ``off``: restore nothing - ``off``: restore nothing
- ``volume``: restore volume
- ``load``: restore settings, volume and play queue - ``load``: restore settings, volume and play queue
- ``play``: restore settings, volume, play queue and start playback - ``last``: like ``load``, additional start playback if last state was
'playing'
- ``play``: like ``load``, additional start playback
Audio configuration Audio configuration
------------------- -------------------

View File

@ -143,10 +143,15 @@ class Core(
amount = self._config['core']['restore_state'] amount = self._config['core']['restore_state']
if not amount or 'off' == amount: if not amount or 'off' == amount:
pass pass
elif 'volume' == amount:
coverage = ['volume']
elif 'load' == amount: elif 'load' == amount:
coverage = ['tracklist', 'mode', 'volume', 'history'] coverage = ['tracklist', 'mode', 'volume', 'history']
elif 'last' == amount:
coverage = ['tracklist', 'mode', 'play-last', 'volume',
'history']
elif 'play' == amount: elif 'play' == amount:
coverage = ['tracklist', 'mode', 'autoplay', 'volume', coverage = ['tracklist', 'mode', 'play-always', 'volume',
'history'] 'history']
else: else:
logger.warn('Unknown value for config ' logger.warn('Unknown value for config '
@ -175,14 +180,13 @@ class Core(
:param name: a name (for later use with :meth:`load_state`) :param name: a name (for later use with :meth:`load_state`)
:type name: str :type name: str
""" """
logger.info('Save state: "%s"', name)
if not name: if not name:
raise TypeError('missing file name') raise TypeError('missing file name')
file_name = os.path.join( file_name = os.path.join(
self._config['core']['data_dir'], name) self._config['core']['data_dir'], name)
file_name += '.state' file_name += '.state'
logger.info('Save state to "%s"', file_name) logger.info('Save state to %s', file_name)
data = {} data = {}
data['tracklist'] = self.tracklist._export_state() data['tracklist'] = self.tracklist._export_state()
@ -190,6 +194,7 @@ class Core(
data['playback'] = self.playback._export_state() data['playback'] = self.playback._export_state()
data['mixer'] = self.mixer._export_state() data['mixer'] = self.mixer._export_state()
storage.save(file_name, data) storage.save(file_name, data)
logger.debug('Save state done')
def load_state(self, name, coverage): def load_state(self, name, coverage):
""" """
@ -210,13 +215,13 @@ class Core(
:param coverage: amount of data to restore :param coverage: amount of data to restore
:type coverage: list of string (see above) :type coverage: list of string (see above)
""" """
logger.info('Load state: "%s"', name)
if not name: if not name:
raise TypeError('missing file name') raise TypeError('missing file name')
file_name = os.path.join( file_name = os.path.join(
self._config['core']['data_dir'], name) self._config['core']['data_dir'], name)
file_name += '.state' file_name += '.state'
logger.info('Load state from %s', file_name)
data = storage.load(file_name) data = storage.load(file_name)
if 'history' in data: if 'history' in data:
@ -224,10 +229,11 @@ class Core(
if 'tracklist' in data: if 'tracklist' in data:
self.tracklist._restore_state(data['tracklist'], coverage) self.tracklist._restore_state(data['tracklist'], coverage)
if 'playback' in data: if 'playback' in data:
# playback after tracklist
self.playback._restore_state(data['playback'], coverage) self.playback._restore_state(data['playback'], coverage)
if 'mixer' in data: if 'mixer' in data:
self.mixer._restore_state(data['mixer'], coverage) self.mixer._restore_state(data['mixer'], coverage)
logger.debug('Load state done. file_name="%s"', file_name) logger.debug('Load state done.')
class Backends(list): class Backends(list):

View File

@ -536,7 +536,12 @@ class PlaybackController(object):
if state: if state:
if not isinstance(state, models.PlaybackState): if not isinstance(state, models.PlaybackState):
raise TypeError('Expect an argument of type "PlaybackState"') raise TypeError('Expect an argument of type "PlaybackState"')
if 'autoplay' in coverage: new_state = ''
if 'play-always' in coverage:
new_state = PlaybackState.PLAYING
if 'play-last' in coverage:
new_state = state.state
if state.tl_track is not None: if state.tl_track is not None:
if PlaybackState.PLAYING == new_state:
self.play(tl_track=state.tl_track) self.play(tl_track=state.tl_track)
# TODO: seek to state.position? # TODO: seek to state.position?

View File

@ -417,7 +417,7 @@ class PlaybackState(ValidatedImmutableObject):
:param position: play position :param position: play position
:type position: int :type position: int
:param state: playback state :param state: playback state
:type state: :class:`TlTrack` :type state: :class:`validation.PLAYBACK_STATES`
""" """
# The current playing track. Read-only. # The current playing track. Read-only.