diff --git a/mopidy/backends/__init__.py b/mopidy/backends/__init__.py index 2bd076b3..43bc4dc0 100644 --- a/mopidy/backends/__init__.py +++ b/mopidy/backends/__init__.py @@ -51,9 +51,14 @@ class BaseCurrentPlaylistController(object): def shuffle(self, start=None, end=None): tracks = self.playlist.tracks - random.shuffle(tracks) - self.playlist = Playlist(tracks=tracks) + before = tracks[:start or 0] + shuffled = tracks[start:end] + after = tracks[end or len(tracks):] + + random.shuffle(shuffled) + + self.playlist = Playlist(tracks=before+shuffled+after) class BasePlaybackController(object): PAUSED = 'paused' diff --git a/tests/backends/__init__.py b/tests/backends/__init__.py index f14c5351..7d66789d 100644 --- a/tests/backends/__init__.py +++ b/tests/backends/__init__.py @@ -99,6 +99,18 @@ class BaseCurrentPlaylistControllerTest(object): self.assertNotEqual(tracks, shuffled_tracks) self.assertEqual(set(tracks), set(shuffled_tracks)) + @populate_playlist + def test_shuffle_subset(self): + tracks = self.controller.playlist.tracks + random.seed(1) + self.controller.shuffle(1, 3) + + shuffled_tracks = self.controller.playlist.tracks + + self.assertNotEqual(tracks, shuffled_tracks) + self.assertEqual(tracks[0], shuffled_tracks[0]) + self.assertEqual(set(tracks), set(shuffled_tracks)) + class BasePlaybackControllerTest(object): uris = [] backend_class = None