From 68ea483c7ba2dcf8e8254a8a2f9fb40f0536136a Mon Sep 17 00:00:00 2001 From: Javier Domingo Cansino Date: Wed, 7 Aug 2013 17:30:46 +0200 Subject: [PATCH] Converted tracklist_position() to be called with the track one wants to have information of, /mopidy/frontends/mpd/protocol/status.py@189 should be checked for gathering a value before the rest. --- mopidy/core/tracklist.py | 43 +++++++++++++---------- mopidy/frontends/mpd/protocol/playback.py | 3 +- mopidy/frontends/mpd/protocol/status.py | 11 +++--- tests/backends/base/playback.py | 34 +++++++++++------- 4 files changed, 54 insertions(+), 37 deletions(-) diff --git a/mopidy/core/tracklist.py b/mopidy/core/tracklist.py index 33bebdee..ded8a3c4 100644 --- a/mopidy/core/tracklist.py +++ b/mopidy/core/tracklist.py @@ -133,25 +133,25 @@ class TracklistController(object): Playback continues after current song. """ - def get_tracklist_position(self): - if self.core.playback.current_tl_track is None: + def tracklist_position(self, tl_track): + """ + The position of the current track in the tracklist. + + Read-only. + """ + if tl_track is None: return None try: - return self.core.tracklist.tl_tracks.index(self.core.playback.current_tl_track) + return self.core.tracklist.tl_tracks.index(tl_track) except ValueError: return None - tracklist_position = property(get_tracklist_position) - """ - The position of the current track in the tracklist. - - Read-only. - """ def get_tl_track_at_eot(self): # pylint: disable = R0911 # Too many return statements + current_tl_track = self.core.playback.current_tl_track tl_tracks = self.core.tracklist.tl_tracks if not tl_tracks: @@ -167,17 +167,18 @@ class TracklistController(object): if self.random and self._shuffled: return self._shuffled[0] - if self.core.playback.current_tl_track is None: + if current_tl_track is None: return tl_tracks[0] + position = self.tracklist_position(current_tl_track) if self.repeat and self.single: - return tl_tracks[self.tracklist_position] + return tl_tracks[position] if self.repeat and not self.single: - return tl_tracks[(self.tracklist_position + 1) % len(tl_tracks)] + return tl_tracks[(position + 1) % len(tl_tracks)] try: - return tl_tracks[self.tracklist_position + 1] + return tl_tracks[position + 1] except IndexError: return None @@ -192,6 +193,7 @@ class TracklistController(object): def get_tl_track_at_next(self): tl_tracks = self.core.tracklist.tl_tracks + current_tl_track = self.core.playback.current_tl_track if not tl_tracks: return None @@ -206,14 +208,15 @@ class TracklistController(object): if self.random and self._shuffled: return self._shuffled[0] - if self.core.playback.current_tl_track is None: + if current_tl_track is None: return tl_tracks[0] + position = self.tracklist_position(current_tl_track) if self.repeat: - return tl_tracks[(self.tracklist_position + 1) % len(tl_tracks)] + return tl_tracks[(position + 1) % len(tl_tracks)] try: - return tl_tracks[self.tracklist_position + 1] + return tl_tracks[position + 1] except IndexError: return None @@ -230,13 +233,15 @@ class TracklistController(object): """ def get_tl_track_at_previous(self): + current_tl_track = self.core.playback.current_tl_track if self.repeat or self.core.tracklist.consume or self.random: - return self.core.playback.current_tl_track + return current_tl_track - if self.tracklist_position in (None, 0): + position = self.tracklist_position(current_tl_track) + if position in (None, 0): return None - return self.core.tracklist.tl_tracks[self.tracklist_position - 1] + return self.core.tracklist.tl_tracks[position - 1] tl_track_at_previous = property(get_tl_track_at_previous) """ diff --git a/mopidy/frontends/mpd/protocol/playback.py b/mopidy/frontends/mpd/protocol/playback.py index fcc465aa..06a456d9 100644 --- a/mopidy/frontends/mpd/protocol/playback.py +++ b/mopidy/frontends/mpd/protocol/playback.py @@ -329,7 +329,8 @@ def seek(context, songpos, seconds): - issues ``seek 1 120`` without quotes around the arguments. """ - if context.core.tracklist.tracklist_position.get() != int(songpos): + tl_track = context.core.playback.current_tl_track.get() + if context.core.tracklist.tracklist_position(tl_track).get() != int(songpos): playpos(context, songpos) context.core.playback.seek(int(seconds) * 1000).get() diff --git a/mopidy/frontends/mpd/protocol/status.py b/mopidy/frontends/mpd/protocol/status.py index f42b3531..8f2207f6 100644 --- a/mopidy/frontends/mpd/protocol/status.py +++ b/mopidy/frontends/mpd/protocol/status.py @@ -36,10 +36,10 @@ def currentsong(context): Displays the song info of the current song (same song that is identified in status). """ - current_tl_track = context.core.playback.current_tl_track.get() - if current_tl_track is not None: - position = context.core.tracklist.tracklist_position.get() - return track_to_mpd_format(current_tl_track, position=position) + tl_track = context.core.playback.current_tl_track.get() + if tl_track is not None: + position = context.core.tracklist.tracklist_position(tl_track).get() + return track_to_mpd_format(tl_track, position=position) @handle_request(r'^idle$') @@ -185,7 +185,8 @@ def status(context): 'playback.state': context.core.playback.state, 'playback.current_tl_track': context.core.playback.current_tl_track, 'tracklist.tracklist_position': ( - context.core.tracklist.tracklist_position), + context.core.tracklist.tracklist_position( + context.core.playback.current_tl_track.get())), 'playback.time_position': context.core.playback.time_position, } pykka.get_all(futures.values()) diff --git a/tests/backends/base/playback.py b/tests/backends/base/playback.py index 11e21628..32c0abf7 100644 --- a/tests/backends/base/playback.py +++ b/tests/backends/base/playback.py @@ -179,13 +179,15 @@ class PlaybackControllerTest(object): def test_next(self): self.playback.play() - old_position = self.tracklist.tracklist_position - old_uri = self.playback.current_track.uri + tl_track = self.playback.current_tl_track + old_position = self.tracklist.tracklist_position(tl_track) + old_uri = tl_track.track.uri self.playback.next() + tl_track = self.playback.current_tl_track self.assertEqual( - self.tracklist.tracklist_position, old_position + 1) + self.tracklist.tracklist_position(tl_track), old_position + 1) self.assertNotEqual(self.playback.current_track.uri, old_uri) @populate_tracklist @@ -205,7 +207,8 @@ class PlaybackControllerTest(object): for i, track in enumerate(self.tracks): self.assertEqual(self.playback.state, PlaybackState.PLAYING) self.assertEqual(self.playback.current_track, track) - self.assertEqual(self.tracklist.tracklist_position, i) + tl_track = self.playback.current_tl_track + self.assertEqual(self.tracklist.tracklist_position(tl_track), i) self.playback.next() @@ -315,13 +318,15 @@ class PlaybackControllerTest(object): def test_end_of_track(self): self.playback.play() - old_position = self.tracklist.tracklist_position - old_uri = self.playback.current_track.uri + tl_track = self.playback.current_tl_track + old_position = self.tracklist.tracklist_position(tl_track) + old_uri = tl_track.track.uri self.playback.on_end_of_track() + tl_track = self.playback.current_tl_track self.assertEqual( - self.tracklist.tracklist_position, old_position + 1) + self.tracklist.tracklist_position(tl_track), old_position + 1) self.assertNotEqual(self.playback.current_track.uri, old_uri) @populate_tracklist @@ -341,7 +346,8 @@ class PlaybackControllerTest(object): for i, track in enumerate(self.tracks): self.assertEqual(self.playback.state, PlaybackState.PLAYING) self.assertEqual(self.playback.current_track, track) - self.assertEqual(self.tracklist.tracklist_position, i) + tl_track = self.playback.current_tl_track + self.assertEqual(self.tracklist.tracklist_position(tl_track), i) self.playback.on_end_of_track() @@ -500,24 +506,28 @@ class PlaybackControllerTest(object): @populate_tracklist def test_initial_tracklist_position(self): - self.assertEqual(self.tracklist.tracklist_position, None) + tl_track = self.playback.current_tl_track + self.assertEqual(self.tracklist.tracklist_position(tl_track), None) @populate_tracklist def test_tracklist_position_during_play(self): self.playback.play() - self.assertEqual(self.tracklist.tracklist_position, 0) + tl_track = self.playback.current_tl_track + self.assertEqual(self.tracklist.tracklist_position(tl_track), 0) @populate_tracklist def test_tracklist_position_after_next(self): self.playback.play() self.playback.next() - self.assertEqual(self.tracklist.tracklist_position, 1) + tl_track = self.playback.current_tl_track + self.assertEqual(self.tracklist.tracklist_position(tl_track), 1) @populate_tracklist def test_tracklist_position_at_end_of_playlist(self): self.playback.play(self.tracklist.tl_tracks[-1]) self.playback.on_end_of_track() - self.assertEqual(self.tracklist.tracklist_position, None) + tl_track = self.playback.current_tl_track + self.assertEqual(self.tracklist.tracklist_position(tl_track), None) def test_on_tracklist_change_gets_called(self): callback = self.playback.on_tracklist_change