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.
This commit is contained in:
parent
66ae1b8eee
commit
40754bb2e0
@ -21,7 +21,6 @@ class TracklistController(object):
|
|||||||
self._version = 0
|
self._version = 0
|
||||||
|
|
||||||
self._shuffled = []
|
self._shuffled = []
|
||||||
self._first_shuffle = True
|
|
||||||
|
|
||||||
### Properties
|
### Properties
|
||||||
|
|
||||||
@ -89,6 +88,9 @@ class TracklistController(object):
|
|||||||
def set_random(self, value):
|
def set_random(self, value):
|
||||||
if self.get_random() != value:
|
if self.get_random() != value:
|
||||||
self._trigger_options_changed()
|
self._trigger_options_changed()
|
||||||
|
if value:
|
||||||
|
self._shuffled = self.tl_tracks
|
||||||
|
random.shuffle(self._shuffled)
|
||||||
return setattr(self, '_random', value)
|
return setattr(self, '_random', value)
|
||||||
|
|
||||||
random = property(get_random, set_random)
|
random = property(get_random, set_random)
|
||||||
@ -162,14 +164,16 @@ class TracklistController(object):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
if self.random and not self._shuffled:
|
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')
|
logger.debug('Shuffling tracks')
|
||||||
self._shuffled = self.tl_tracks
|
self._shuffled = self.tl_tracks
|
||||||
random.shuffle(self._shuffled)
|
random.shuffle(self._shuffled)
|
||||||
self._first_shuffle = False
|
|
||||||
|
|
||||||
if self.random and self._shuffled:
|
if self.random:
|
||||||
return self._shuffled[0]
|
try:
|
||||||
|
return self._shuffled[0]
|
||||||
|
except IndexError:
|
||||||
|
return None
|
||||||
|
|
||||||
if tl_track is None:
|
if tl_track is None:
|
||||||
return self.tl_tracks[0]
|
return self.tl_tracks[0]
|
||||||
@ -206,14 +210,16 @@ class TracklistController(object):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
if self.random and not self._shuffled:
|
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')
|
logger.debug('Shuffling tracks')
|
||||||
self._shuffled = self.tl_tracks
|
self._shuffled = self.tl_tracks
|
||||||
random.shuffle(self._shuffled)
|
random.shuffle(self._shuffled)
|
||||||
self._first_shuffle = False
|
|
||||||
|
|
||||||
if self.random and self._shuffled:
|
if self.random:
|
||||||
return self._shuffled[0]
|
try:
|
||||||
|
return self._shuffled[0]
|
||||||
|
except IndexError:
|
||||||
|
return None
|
||||||
|
|
||||||
if tl_track is None:
|
if tl_track is None:
|
||||||
return self.tl_tracks[0]
|
return self.tl_tracks[0]
|
||||||
@ -455,8 +461,11 @@ class TracklistController(object):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def _trigger_tracklist_changed(self):
|
def _trigger_tracklist_changed(self):
|
||||||
self._first_shuffle = True
|
if self.random:
|
||||||
self._shuffled = []
|
self._shuffled = self.tl_tracks
|
||||||
|
random.shuffle(self._shuffled)
|
||||||
|
else:
|
||||||
|
self._shuffled = []
|
||||||
|
|
||||||
logger.debug('Triggering event: tracklist_changed()')
|
logger.debug('Triggering event: tracklist_changed()')
|
||||||
listener.CoreListener.send('tracklist_changed')
|
listener.CoreListener.send('tracklist_changed')
|
||||||
|
|||||||
@ -1024,15 +1024,14 @@ class LocalPlaybackProviderTest(unittest.TestCase):
|
|||||||
# Covers underlying issue IssueGH17RegressionTest tests for.
|
# Covers underlying issue IssueGH17RegressionTest tests for.
|
||||||
shuffle_mock.side_effect = lambda tracks: tracks.reverse()
|
shuffle_mock.side_effect = lambda tracks: tracks.reverse()
|
||||||
|
|
||||||
expected = self.tl_tracks[1::-1]
|
expected = self.tl_tracks[::-1] + [None]
|
||||||
actual = []
|
actual = []
|
||||||
|
|
||||||
self.playback.play()
|
self.playback.play()
|
||||||
self.tracklist.random = True
|
self.tracklist.random = True
|
||||||
for _ in self.tracks[1:]:
|
while self.playback.state != PlaybackState.STOPPED:
|
||||||
self.playback.next()
|
self.playback.next()
|
||||||
actual.append(self.playback.current_tl_track)
|
actual.append(self.playback.current_tl_track)
|
||||||
|
|
||||||
self.assertEqual(actual, expected)
|
self.assertEqual(actual, expected)
|
||||||
|
|
||||||
@populate_tracklist
|
@populate_tracklist
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user