From cf0986a3a0bf224069e2822e85f900e968147739 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 27 Apr 2010 15:27:58 +0200 Subject: [PATCH 1/4] Add test to ensure that the last track in a playlist also is consumed --- tests/backends/base.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/backends/base.py b/tests/backends/base.py index a03ea95d..7dae0a68 100644 --- a/tests/backends/base.py +++ b/tests/backends/base.py @@ -779,6 +779,14 @@ class BasePlaybackControllerTest(object): tracks = self.backend.current_playlist.playlist.tracks self.assert_(self.tracks[0] not in tracks) + @populate_playlist + def test_playlist_is_empty_after_all_tracks_are_played_with_consume(self): + self.playback.consume = True + self.playback.play() + for i in range(len(self.backend.current_playlist.playlist.tracks)): + self.playback.next() + self.assertEqual(len(self.backend.current_playlist.playlist.tracks), 0) + @populate_playlist def test_play_with_random(self): random.seed(1) From 441362028cfe71b5d198ac11cf2afcc8fc24454f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 28 Apr 2010 11:01:24 +0200 Subject: [PATCH 2/4] libspotify: Implement LibspotifyLibraryController.lookup(uri) so that I can use ncmpcpp to listen to music at work --- mopidy/backends/libspotify.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mopidy/backends/libspotify.py b/mopidy/backends/libspotify.py index 04ff4ffc..d89f9400 100644 --- a/mopidy/backends/libspotify.py +++ b/mopidy/backends/libspotify.py @@ -63,6 +63,10 @@ class LibspotifyCurrentPlaylistController(BaseCurrentPlaylistController): class LibspotifyLibraryController(BaseLibraryController): + def lookup(self, uri): + spotify_track = Link.from_string(uri).as_track() + return LibspotifyTranslator.to_mopidy_track(spotify_track) + def search(self, type, what): if type is u'any': query = what From ddc7e07ec62ca2190dc1ab3f80d042f7562cca6e Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 28 Apr 2010 12:24:07 +0200 Subject: [PATCH 3/4] libspotify: Handle SpotifyError (e.g. 'The track cannot be played') in _play() --- mopidy/backends/libspotify.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mopidy/backends/libspotify.py b/mopidy/backends/libspotify.py index d89f9400..edffa3af 100644 --- a/mopidy/backends/libspotify.py +++ b/mopidy/backends/libspotify.py @@ -4,7 +4,7 @@ import os import multiprocessing import threading -from spotify import Link +from spotify import Link, SpotifyError from spotify.manager import SpotifySessionManager from spotify.alsahelper import AlsaController @@ -94,10 +94,14 @@ class LibspotifyPlaybackController(BasePlaybackController): self.stop() if track.uri is None: return False - self.backend.spotify.session.load( - Link.from_string(track.uri).as_track()) - self.backend.spotify.session.play(1) - return True + try: + self.backend.spotify.session.load( + Link.from_string(track.uri).as_track()) + self.backend.spotify.session.play(1) + return True + except SpotifyError as e: + logger.warning('Play %s failed: %s', track.uri, e) + return False def _resume(self): # TODO From ac3bfc723e1e6b9eb5d4dfa34b601c5360104f22 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 28 Apr 2010 12:27:07 +0200 Subject: [PATCH 4/4] Add todo on taking some action when False is returned from _play() --- mopidy/backends/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mopidy/backends/__init__.py b/mopidy/backends/__init__.py index f7705f64..ff8c9eda 100644 --- a/mopidy/backends/__init__.py +++ b/mopidy/backends/__init__.py @@ -547,6 +547,10 @@ class BasePlaybackController(object): self.current_track = track self.state = self.PLAYING + # TODO Do something sensible when _play() returns False, like calling + # next(). Adding this todo instead of just implementing it as I want a + # test case first. + if self.random and self.current_track in self._shuffled: self._shuffled.remove(self.current_track)