From 40754bb2e05d8e05a28b050010efe6affd727d67 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 20 Oct 2013 19:28:13 +0200 Subject: [PATCH] core: Fix handling of shuffle (fixes #453) - Shuffle internal list when random is enabled - Use presence of tl_track to determine if this is first run to trigger subsequent shuffles. --- mopidy/core/tracklist.py | 31 +++++++++++++++++---------- tests/backends/local/playback_test.py | 5 ++--- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/mopidy/core/tracklist.py b/mopidy/core/tracklist.py index 5d85e190..a2fbb61a 100644 --- a/mopidy/core/tracklist.py +++ b/mopidy/core/tracklist.py @@ -21,7 +21,6 @@ class TracklistController(object): self._version = 0 self._shuffled = [] - self._first_shuffle = True ### Properties @@ -89,6 +88,9 @@ class TracklistController(object): def set_random(self, value): if self.get_random() != value: self._trigger_options_changed() + if value: + self._shuffled = self.tl_tracks + random.shuffle(self._shuffled) return setattr(self, '_random', value) random = property(get_random, set_random) @@ -162,14 +164,16 @@ class TracklistController(object): return None if self.random and not self._shuffled: - if self.repeat or self._first_shuffle: + if self.repeat or not tl_track: logger.debug('Shuffling tracks') self._shuffled = self.tl_tracks random.shuffle(self._shuffled) - self._first_shuffle = False - if self.random and self._shuffled: - return self._shuffled[0] + if self.random: + try: + return self._shuffled[0] + except IndexError: + return None if tl_track is None: return self.tl_tracks[0] @@ -206,14 +210,16 @@ class TracklistController(object): return None if self.random and not self._shuffled: - if self.repeat or self._first_shuffle: + if self.repeat or not tl_track: logger.debug('Shuffling tracks') self._shuffled = self.tl_tracks random.shuffle(self._shuffled) - self._first_shuffle = False - if self.random and self._shuffled: - return self._shuffled[0] + if self.random: + try: + return self._shuffled[0] + except IndexError: + return None if tl_track is None: return self.tl_tracks[0] @@ -455,8 +461,11 @@ class TracklistController(object): return True def _trigger_tracklist_changed(self): - self._first_shuffle = True - self._shuffled = [] + if self.random: + self._shuffled = self.tl_tracks + random.shuffle(self._shuffled) + else: + self._shuffled = [] logger.debug('Triggering event: tracklist_changed()') listener.CoreListener.send('tracklist_changed') diff --git a/tests/backends/local/playback_test.py b/tests/backends/local/playback_test.py index eb34826e..af7962f0 100644 --- a/tests/backends/local/playback_test.py +++ b/tests/backends/local/playback_test.py @@ -1024,15 +1024,14 @@ class LocalPlaybackProviderTest(unittest.TestCase): # Covers underlying issue IssueGH17RegressionTest tests for. shuffle_mock.side_effect = lambda tracks: tracks.reverse() - expected = self.tl_tracks[1::-1] + expected = self.tl_tracks[::-1] + [None] actual = [] self.playback.play() self.tracklist.random = True - for _ in self.tracks[1:]: + while self.playback.state != PlaybackState.STOPPED: self.playback.next() actual.append(self.playback.current_tl_track) - self.assertEqual(actual, expected) @populate_tracklist