diff --git a/mopidy/backends/base.py b/mopidy/backends/base.py index dc8a87ad..ef6ca20f 100644 --- a/mopidy/backends/base.py +++ b/mopidy/backends/base.py @@ -1,5 +1,7 @@ import time +from mopidy.exceptions import MpdNotImplemented + class BaseBackend(object): PLAY = u'play' PAUSE = u'pause' @@ -65,36 +67,72 @@ class BaseBackend(object): # Control methods def next(self): - pass + 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 def pause(self): - self.state = self.PAUSE - self._play_time_accumulated += int(time.time()) - self._play_start + if self.state == self.PLAY and self._pause(): + self.state = self.PAUSE + self._play_time_accumulated += ( + int(time.time()) - self._play_start) - def play(self): - self.state = self.PLAY - self._play_time_accumulated = 0 - self._play_start = int(time.time()) + def _pause(self): + raise MpdNotImplemented - def play_pos(self, songpos): - self.state = self.PLAY - self._play_time_accumulated = 0 - self._play_start = int(time.time()) + def play(self, songpos=None, songid=None): + 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: + self.state = self.PLAY + self._play_time_accumulated = 0 + self._play_start = int(time.time()) - def play_id(self, songid): - self.state = self.PLAY - self._play_time_accumulated = 0 - self._play_start = int(time.time()) + def _play(self): + raise MpdNotImplemented + + def _play_id(self): + raise MpdNotImplemented + + def _play_pos(self): + raise MpdNotImplemented def previous(self): - pass + 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 def resume(self): - self.state = self.PLAY - self._play_start = int(time.time()) + if self.state == self.PAUSE and self._resume(): + self.state = self.PLAY + self._play_start = int(time.time()) + + def _resume(self): + raise MpdNotImplemented def stop(self): - self.state = self.STOP + if self.state != self.STOP and self._stop(): + self.state = self.STOP + + def _stop(self): + raise MpdNotImplemented # Current/single playlist methods def playlist_changes_since(self, version): diff --git a/mopidy/backends/spotify.py b/mopidy/backends/spotify.py index d5a0b312..e742f827 100644 --- a/mopidy/backends/spotify.py +++ b/mopidy/backends/spotify.py @@ -112,43 +112,44 @@ class SpotifyBackend(BaseBackend): # Control methods - def next(self): + def _next(self): self._current_song_pos += 1 - self.play() - - def pause(self): - super(SpotifyBackend, self).pause() - self.spotify.pause() - - def play(self): - if self.state == self.PAUSE: - return self.resume() - if self._current_track is not None: - super(SpotifyBackend, self).play() - self.spotify.play(self._current_track) - - def play_pos(self, songpos): - super(SpotifyBackend, self).play_pos(songpos) - self._current_song_pos = songpos self.spotify.play(self._current_track) + return True - def play_id(self, songid): - super(SpotifyBackend, self).play_id(songid) + def _pause(self): + self.spotify.pause() + return True + + def _play(self): + if self._current_track is not None: + self.spotify.play(self._current_track) + return True + else: + return False + + def _play_id(self, songid): self._current_song_pos = songid # XXX self.spotify.play(self._current_track) + return True - def previous(self): + def _play_pos(self, songpos): + self._current_song_pos = songpos + self.spotify.play(self._current_track) + return True + + def _previous(self): self._current_song_pos -= 1 - self.play() + self.spotify.play(self._current_track) + return True - def resume(self): - super(SpotifyBackend, self).resume() + def _resume(self): self.spotify.resume() + return True - def stop(self): - if self.state != self.STOP: - super(SpotifyBackend, self).stop() - self.spotify.stop() + def _stop(self): + self.spotify.stop() + return True # Unsorted diff --git a/mopidy/handler.py b/mopidy/handler.py index ad9bd527..706c537c 100644 --- a/mopidy/handler.py +++ b/mopidy/handler.py @@ -236,11 +236,11 @@ class MpdHandler(object): @register(r'^play "(?P\d+)"$') def _playpos(self, songpos): - return self.backend.play_pos(int(songpos)) + return self.backend.play(songpos=int(songpos)) @register(r'^playid "(?P\d+)"$') def _playid(self, songid): - return self.backend.play_id(int(songid)) + return self.backend.play(songid=int(songid)) @register(r'^playlist$') def _playlist(self):