diff --git a/mopidy/backends/__init__.py b/mopidy/backends/__init__.py index 636f6aa1..27c58c9c 100644 --- a/mopidy/backends/__init__.py +++ b/mopidy/backends/__init__.py @@ -101,6 +101,7 @@ class BasePlaybackController(object): def __init__(self, backend): self.backend = backend self.current_track = None + self._shuffled = [] def play(self, id=None, position=None): raise NotImplementedError @@ -147,6 +148,13 @@ class BasePlaybackController(object): if not playlist.tracks: return None + if self.random and not self._shuffled: + self._shuffled = playlist.tracks + random.shuffle(self._shuffled) + + if self._shuffled: + return self._shuffled[0] + if self.current_track is None: return playlist.tracks[0] diff --git a/mopidy/backends/gstreamer.py b/mopidy/backends/gstreamer.py index 2a57a534..01316d97 100644 --- a/mopidy/backends/gstreamer.py +++ b/mopidy/backends/gstreamer.py @@ -77,6 +77,9 @@ class GStreamerPlaybackController(BasePlaybackController): if not self.current_track: return + if self.random: + self._shuffled.pop(0) + self._bin.set_state(gst.STATE_READY) self._bin.set_property('uri', self.current_track.uri) self._set_state(gst.STATE_PLAYING) diff --git a/tests/backends/basetests.py b/tests/backends/basetests.py index cddc24f3..c7f5ed4c 100644 --- a/tests/backends/basetests.py +++ b/tests/backends/basetests.py @@ -700,12 +700,14 @@ class BasePlaybackControllerTest(object): @populate_playlist def test_play_with_random(self): random.seed(1) + self.playback.random = True self.playback.play() self.assertEqual(self.playback.current_track, self.tracks[2]) @populate_playlist def test_next_with_random(self): random.seed(1) + self.playback.random = True self.playback.play() self.playback.next() self.assertEqual(self.playback.current_track, self.tracks[1]) @@ -713,6 +715,7 @@ class BasePlaybackControllerTest(object): @populate_playlist def test_previous_with_random(self): random.seed(1) + self.playback.random = True self.playback.play() self.playback.next() self.playback.previous()