From 0fcdd3cddb4f5e52968c10e627a14e0b44906a59 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 26 Dec 2009 15:50:59 +0100 Subject: [PATCH] Track elapsed play time behind the scenes when play state is changed --- mopidy/backends/base.py | 82 ++++++++++++++++++++++++-------------- mopidy/backends/spotify.py | 1 - 2 files changed, 51 insertions(+), 32 deletions(-) diff --git a/mopidy/backends/base.py b/mopidy/backends/base.py index ef6ca20f..ac48a428 100644 --- a/mopidy/backends/base.py +++ b/mopidy/backends/base.py @@ -1,21 +1,58 @@ +import logging import time from mopidy.exceptions import MpdNotImplemented +logger = logging.getLogger('backends.base') + class BaseBackend(object): PLAY = u'play' PAUSE = u'pause' STOP = u'stop' - def __init__(self): - self.state = self.STOP + @property + def state(self): + if not hasattr(self, '_state'): + self._state = self.STOP + return self._state + + @state.setter + def state(self, new_state): + (old_state, self._state) = (self._state, new_state) + logger.debug(u'Changing state: %s -> %s', old_state, new_state) + if old_state in (self.PLAY, self.STOP) and new_state == self.PLAY: + self._play_time_start() + elif old_state == self.PLAY and new_state == self.PAUSE: + self._play_time_pause() + elif old_state == self.PAUSE and new_state == self.PLAY: + self._play_time_resume() + + @property + def _play_time_elapsed(self): + if self.state == self.PLAY: + time_since_started = int(time.time()) - self._play_time_started + return self._play_time_accumulated + time_since_started + elif self.state == self.PAUSE: + return self._play_time_accumulated + elif self.state == self.STOP: + return 0 + + def _play_time_start(self): self._play_time_accumulated = 0 - self._play_start = False + self._play_time_started = int(time.time()) + + def _play_time_pause(self): + time_since_started = int(time.time()) - self._play_time_started + self._play_time_accumulated += time_since_started + + def _play_time_resume(self): + self._play_time_started = int(time.time()) + +# Status methods def current_song(self): return None -# Status methods def status_bitrate(self): return 0 @@ -47,17 +84,7 @@ class BaseBackend(object): return self.state def status_time(self): - return u'%s:%s' % ( - self.status_time_position(), self.status_time_total()) - - def status_time_position(self): - if self.state == self.PAUSE: - return self._play_time_accumulated - elif self.state == self.PLAY and self._play_start: - return self._play_time_accumulated + ( - int(time.time()) - self._play_start) - else: - return 0 + return u'%s:%s' % (self._play_time_elapsed, self.status_time_total()) def status_time_total(self): return 0 @@ -66,12 +93,11 @@ class BaseBackend(object): return 0 # Control methods + def next(self): self.stop() if self._next(): self.state = self.PLAY - self._play_time_accumulated = 0 - self._play_start = int(time.time()) def _next(self): raise MpdNotImplemented @@ -79,8 +105,6 @@ class BaseBackend(object): def pause(self): if self.state == self.PLAY and self._pause(): self.state = self.PAUSE - self._play_time_accumulated += ( - int(time.time()) - self._play_start) def _pause(self): raise MpdNotImplemented @@ -89,16 +113,12 @@ class BaseBackend(object): if self.state == self.PAUSE and songpos is None and songid is None: return self.resume() self.stop() - if songpos is not None: - result = self._play_pos(songpos) - elif songid is not None: - result = self._play_id(songid) - else: - result = self._play() - if result: + if songpos is not None and self._play_pos(songpos): + self.state = self.PLAY + elif songid is not None and self._play_id(songid): + self.state = self.PLAY + elif self._play(): self.state = self.PLAY - self._play_time_accumulated = 0 - self._play_start = int(time.time()) def _play(self): raise MpdNotImplemented @@ -113,8 +133,6 @@ class BaseBackend(object): self.stop() if self._previous(): self.state = self.PLAY - self._play_time_accumulated = 0 - self._play_start = int(time.time()) def _previous(self): raise MpdNotImplemented @@ -122,7 +140,6 @@ class BaseBackend(object): def resume(self): if self.state == self.PAUSE and self._resume(): self.state = self.PLAY - self._play_start = int(time.time()) def _resume(self): raise MpdNotImplemented @@ -135,6 +152,7 @@ class BaseBackend(object): raise MpdNotImplemented # Current/single playlist methods + def playlist_changes_since(self, version): return None @@ -145,9 +163,11 @@ class BaseBackend(object): return None # Stored playlist methods + def playlists_list(self): return None # Music database methods + def search(self, type, what): return None diff --git a/mopidy/backends/spotify.py b/mopidy/backends/spotify.py index e742f827..d268fb75 100644 --- a/mopidy/backends/spotify.py +++ b/mopidy/backends/spotify.py @@ -16,7 +16,6 @@ def decode(string): class SpotifyBackend(BaseBackend): def __init__(self, *args, **kwargs): - super(SpotifyBackend, self).__init__(*args, **kwargs) logger.info(u'Connecting to Spotify') self.spotify = spytify.Spytify(self._username, self._password) logger.info(u'Preloading data')