From 3647df61c86276e5b959a536d690a7ba1ab93582 Mon Sep 17 00:00:00 2001 From: Jens Luetjen Date: Sun, 24 Jan 2016 17:58:44 +0100 Subject: [PATCH] More stability if a backend rejects tracks - Catch exceptions raised by backend inside 'PlaybackProvider.change_track' - Avoid endless loop if 'repeat' is 'true' and not a single track is playable --- mopidy/core/playback.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index cb89658a..81eed172 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -259,7 +259,10 @@ class PlaybackController(object): backend = self._get_backend(next_tl_track) if backend: - backend.playback.change_track(next_tl_track.track).get() + try: + backend.playback.change_track(next_tl_track.track).get() + except Exception as e: + logger.error('Change track failed: %s', e) def _on_tracklist_change(self): """ @@ -343,6 +346,8 @@ class PlaybackController(object): current = self._pending_tl_track or self._current_tl_track pending = tl_track or current or self.core.tracklist.next_track(None) + # avoid endless loop if 'repeat' is 'true' and no track is playable + count = self.core.tracklist.get_length() while pending: # TODO: should we consume unplayable tracks in this loop? @@ -352,6 +357,10 @@ class PlaybackController(object): self.core.tracklist._mark_unplayable(pending) current = pending pending = self.core.tracklist.next_track(current) + count -= 1 + if not count: + logger.info('No playable track in the list.') + break # TODO return result? @@ -368,8 +377,12 @@ class PlaybackController(object): return False backend.playback.prepare_change() - if not backend.playback.change_track(pending_tl_track.track).get(): - return False # TODO: test for this path + try: + if not backend.playback.change_track(pending_tl_track.track).get(): + return False # TODO: test for this path + except Exception as e: + logger.error('Change track failed: %s', e) + return False if state == PlaybackState.PLAYING: try: