diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index e365e4b7..93cb814e 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -90,6 +90,9 @@ class Core( def stream_changed(self, uri): self.playback._on_stream_changed(uri) + def position_changed(self, position): + self.playback._on_position_changed(position) + def state_changed(self, old_state, new_state, target_state): # XXX: This is a temporary fix for issue #232 while we wait for a more # permanent solution with the implementation of issue #234. When the diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 96fac4d9..ea725004 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -26,6 +26,7 @@ class PlaybackController(object): self._current_tl_track = None self._pending_tl_track = None + self._pending_position = None self._last_position = None self._previous = False @@ -220,6 +221,11 @@ class PlaybackController(object): self.set_state(PlaybackState.PLAYING) self._trigger_track_playback_started() + def _on_position_changed(self, position): + if self._pending_position == position: + self._trigger_seeked(position) + self._pending_position = None + def _on_about_to_finish_callback(self): """Callback that performs a blocking actor call to the real callback. @@ -455,14 +461,12 @@ class PlaybackController(object): self.next() return True + self._pending_position = time_position backend = self._get_backend(self.get_current_tl_track()) if not backend: return False - success = backend.playback.seek(time_position).get() - if success: - self._trigger_seeked(time_position) - return success + return backend.playback.seek(time_position).get() def stop(self): """Stop playing.""" diff --git a/tests/core/test_playback.py b/tests/core/test_playback.py index 6ea5313f..8ff37861 100644 --- a/tests/core/test_playback.py +++ b/tests/core/test_playback.py @@ -434,6 +434,7 @@ class EventEmissionTest(BaseTest): self.core.playback.play(tl_tracks[0]) self.replay_events() self.core.playback.seek(1000) + self.replay_events() listener_mock.reset_mock() self.core.playback.stop() @@ -456,6 +457,7 @@ class EventEmissionTest(BaseTest): self.core.playback.play(tl_tracks[0]) self.replay_events() self.core.playback.seek(1000) + self.replay_events() listener_mock.reset_mock() self.core.playback.next() @@ -504,6 +506,7 @@ class EventEmissionTest(BaseTest): listener_mock.reset_mock() self.core.playback.seek(1000) + self.replay_events() listener_mock.send.assert_called_once_with( 'seeked', time_position=1000)