From cc82e68a5804f404ba76f370643221ec45cf212e Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 14 Feb 2016 15:22:25 +0100 Subject: [PATCH] core: Remove unplayable track in consume mode Fixes #1418 This was previously fixed in 1.1.2, but the fix was skipped in when release-1.1 was merged into develop in #1400, thus no changelog entry. --- mopidy/core/playback.py | 1 - mopidy/core/tracklist.py | 2 ++ tests/core/test_playback.py | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 63259f7d..e0eab403 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -346,7 +346,6 @@ class PlaybackController(object): pending = tl_track or current or self.core.tracklist.next_track(None) while pending: - # TODO: should we consume unplayable tracks in this loop? if self._change(pending, PlaybackState.PLAYING): break else: diff --git a/mopidy/core/tracklist.py b/mopidy/core/tracklist.py index 2a4ec8b6..6d7ceeb7 100644 --- a/mopidy/core/tracklist.py +++ b/mopidy/core/tracklist.py @@ -621,6 +621,8 @@ class TracklistController(object): def _mark_unplayable(self, tl_track): """Internal method for :class:`mopidy.core.PlaybackController`.""" logger.warning('Track is not playable: %s', tl_track.track.uri) + if self.get_consume() and tl_track is not None: + self.remove({'tlid': [tl_track.tlid]}) if self.get_random() and tl_track in self._shuffled: self._shuffled.remove(tl_track) diff --git a/tests/core/test_playback.py b/tests/core/test_playback.py index 4f20830e..1def8431 100644 --- a/tests/core/test_playback.py +++ b/tests/core/test_playback.py @@ -256,6 +256,20 @@ class TestConsumeHandling(BaseTest): self.assertNotIn(tl_track, self.core.tracklist.get_tl_tracks()) + def test_next_in_consume_mode_removes_unplayable_track(self): + last_playable_tl_track = self.core.tracklist.get_tl_tracks()[-2] + unplayable_tl_track = self.core.tracklist.get_tl_tracks()[-1] + self.audio.trigger_fake_playback_failure(unplayable_tl_track.track.uri) + + self.core.playback.play(last_playable_tl_track) + self.core.tracklist.set_consume(True) + + self.core.playback.next() + self.replay_events() + + self.assertNotIn( + unplayable_tl_track, self.core.tracklist.get_tl_tracks()) + def test_on_about_to_finish_in_consume_mode_removes_finished_track(self): tl_track = self.core.tracklist.get_tl_tracks()[0]