Track elapsed play time behind the scenes when play state is changed
This commit is contained in:
parent
fbbac0c635
commit
0fcdd3cddb
@ -1,21 +1,58 @@
|
|||||||
|
import logging
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from mopidy.exceptions import MpdNotImplemented
|
from mopidy.exceptions import MpdNotImplemented
|
||||||
|
|
||||||
|
logger = logging.getLogger('backends.base')
|
||||||
|
|
||||||
class BaseBackend(object):
|
class BaseBackend(object):
|
||||||
PLAY = u'play'
|
PLAY = u'play'
|
||||||
PAUSE = u'pause'
|
PAUSE = u'pause'
|
||||||
STOP = u'stop'
|
STOP = u'stop'
|
||||||
|
|
||||||
def __init__(self):
|
@property
|
||||||
self.state = self.STOP
|
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_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):
|
def current_song(self):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Status methods
|
|
||||||
def status_bitrate(self):
|
def status_bitrate(self):
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@ -47,17 +84,7 @@ class BaseBackend(object):
|
|||||||
return self.state
|
return self.state
|
||||||
|
|
||||||
def status_time(self):
|
def status_time(self):
|
||||||
return u'%s:%s' % (
|
return u'%s:%s' % (self._play_time_elapsed, self.status_time_total())
|
||||||
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
|
|
||||||
|
|
||||||
def status_time_total(self):
|
def status_time_total(self):
|
||||||
return 0
|
return 0
|
||||||
@ -66,12 +93,11 @@ class BaseBackend(object):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
# Control methods
|
# Control methods
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
self.stop()
|
self.stop()
|
||||||
if self._next():
|
if self._next():
|
||||||
self.state = self.PLAY
|
self.state = self.PLAY
|
||||||
self._play_time_accumulated = 0
|
|
||||||
self._play_start = int(time.time())
|
|
||||||
|
|
||||||
def _next(self):
|
def _next(self):
|
||||||
raise MpdNotImplemented
|
raise MpdNotImplemented
|
||||||
@ -79,8 +105,6 @@ class BaseBackend(object):
|
|||||||
def pause(self):
|
def pause(self):
|
||||||
if self.state == self.PLAY and self._pause():
|
if self.state == self.PLAY and self._pause():
|
||||||
self.state = self.PAUSE
|
self.state = self.PAUSE
|
||||||
self._play_time_accumulated += (
|
|
||||||
int(time.time()) - self._play_start)
|
|
||||||
|
|
||||||
def _pause(self):
|
def _pause(self):
|
||||||
raise MpdNotImplemented
|
raise MpdNotImplemented
|
||||||
@ -89,16 +113,12 @@ class BaseBackend(object):
|
|||||||
if self.state == self.PAUSE and songpos is None and songid is None:
|
if self.state == self.PAUSE and songpos is None and songid is None:
|
||||||
return self.resume()
|
return self.resume()
|
||||||
self.stop()
|
self.stop()
|
||||||
if songpos is not None:
|
if songpos is not None and self._play_pos(songpos):
|
||||||
result = self._play_pos(songpos)
|
self.state = self.PLAY
|
||||||
elif songid is not None:
|
elif songid is not None and self._play_id(songid):
|
||||||
result = self._play_id(songid)
|
self.state = self.PLAY
|
||||||
else:
|
elif self._play():
|
||||||
result = self._play()
|
|
||||||
if result:
|
|
||||||
self.state = self.PLAY
|
self.state = self.PLAY
|
||||||
self._play_time_accumulated = 0
|
|
||||||
self._play_start = int(time.time())
|
|
||||||
|
|
||||||
def _play(self):
|
def _play(self):
|
||||||
raise MpdNotImplemented
|
raise MpdNotImplemented
|
||||||
@ -113,8 +133,6 @@ class BaseBackend(object):
|
|||||||
self.stop()
|
self.stop()
|
||||||
if self._previous():
|
if self._previous():
|
||||||
self.state = self.PLAY
|
self.state = self.PLAY
|
||||||
self._play_time_accumulated = 0
|
|
||||||
self._play_start = int(time.time())
|
|
||||||
|
|
||||||
def _previous(self):
|
def _previous(self):
|
||||||
raise MpdNotImplemented
|
raise MpdNotImplemented
|
||||||
@ -122,7 +140,6 @@ class BaseBackend(object):
|
|||||||
def resume(self):
|
def resume(self):
|
||||||
if self.state == self.PAUSE and self._resume():
|
if self.state == self.PAUSE and self._resume():
|
||||||
self.state = self.PLAY
|
self.state = self.PLAY
|
||||||
self._play_start = int(time.time())
|
|
||||||
|
|
||||||
def _resume(self):
|
def _resume(self):
|
||||||
raise MpdNotImplemented
|
raise MpdNotImplemented
|
||||||
@ -135,6 +152,7 @@ class BaseBackend(object):
|
|||||||
raise MpdNotImplemented
|
raise MpdNotImplemented
|
||||||
|
|
||||||
# Current/single playlist methods
|
# Current/single playlist methods
|
||||||
|
|
||||||
def playlist_changes_since(self, version):
|
def playlist_changes_since(self, version):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -145,9 +163,11 @@ class BaseBackend(object):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
# Stored playlist methods
|
# Stored playlist methods
|
||||||
|
|
||||||
def playlists_list(self):
|
def playlists_list(self):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Music database methods
|
# Music database methods
|
||||||
|
|
||||||
def search(self, type, what):
|
def search(self, type, what):
|
||||||
return None
|
return None
|
||||||
|
|||||||
@ -16,7 +16,6 @@ def decode(string):
|
|||||||
|
|
||||||
class SpotifyBackend(BaseBackend):
|
class SpotifyBackend(BaseBackend):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(SpotifyBackend, self).__init__(*args, **kwargs)
|
|
||||||
logger.info(u'Connecting to Spotify')
|
logger.info(u'Connecting to Spotify')
|
||||||
self.spotify = spytify.Spytify(self._username, self._password)
|
self.spotify = spytify.Spytify(self._username, self._password)
|
||||||
logger.info(u'Preloading data')
|
logger.info(u'Preloading data')
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user