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.
This commit is contained in:
Javier Domingo Cansino 2013-08-07 17:30:46 +02:00
parent 4db3999371
commit 68ea483c7b
4 changed files with 54 additions and 37 deletions

View File

@ -133,25 +133,25 @@ class TracklistController(object):
Playback continues after current song. Playback continues after current song.
""" """
def get_tracklist_position(self): def tracklist_position(self, tl_track):
if self.core.playback.current_tl_track is None: """
The position of the current track in the tracklist.
Read-only.
"""
if tl_track is None:
return None return None
try: 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: except ValueError:
return None 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): def get_tl_track_at_eot(self):
# pylint: disable = R0911 # pylint: disable = R0911
# Too many return statements # Too many return statements
current_tl_track = self.core.playback.current_tl_track
tl_tracks = self.core.tracklist.tl_tracks tl_tracks = self.core.tracklist.tl_tracks
if not tl_tracks: if not tl_tracks:
@ -167,17 +167,18 @@ class TracklistController(object):
if self.random and self._shuffled: if self.random and self._shuffled:
return self._shuffled[0] return self._shuffled[0]
if self.core.playback.current_tl_track is None: if current_tl_track is None:
return tl_tracks[0] return tl_tracks[0]
position = self.tracklist_position(current_tl_track)
if self.repeat and self.single: if self.repeat and self.single:
return tl_tracks[self.tracklist_position] return tl_tracks[position]
if self.repeat and not self.single: 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: try:
return tl_tracks[self.tracklist_position + 1] return tl_tracks[position + 1]
except IndexError: except IndexError:
return None return None
@ -192,6 +193,7 @@ class TracklistController(object):
def get_tl_track_at_next(self): def get_tl_track_at_next(self):
tl_tracks = self.core.tracklist.tl_tracks tl_tracks = self.core.tracklist.tl_tracks
current_tl_track = self.core.playback.current_tl_track
if not tl_tracks: if not tl_tracks:
return None return None
@ -206,14 +208,15 @@ class TracklistController(object):
if self.random and self._shuffled: if self.random and self._shuffled:
return self._shuffled[0] return self._shuffled[0]
if self.core.playback.current_tl_track is None: if current_tl_track is None:
return tl_tracks[0] return tl_tracks[0]
position = self.tracklist_position(current_tl_track)
if self.repeat: if self.repeat:
return tl_tracks[(self.tracklist_position + 1) % len(tl_tracks)] return tl_tracks[(position + 1) % len(tl_tracks)]
try: try:
return tl_tracks[self.tracklist_position + 1] return tl_tracks[position + 1]
except IndexError: except IndexError:
return None return None
@ -230,13 +233,15 @@ class TracklistController(object):
""" """
def get_tl_track_at_previous(self): 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: 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 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) tl_track_at_previous = property(get_tl_track_at_previous)
""" """

View File

@ -329,7 +329,8 @@ def seek(context, songpos, seconds):
- issues ``seek 1 120`` without quotes around the arguments. - 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) playpos(context, songpos)
context.core.playback.seek(int(seconds) * 1000).get() context.core.playback.seek(int(seconds) * 1000).get()

View File

@ -36,10 +36,10 @@ def currentsong(context):
Displays the song info of the current song (same song that is Displays the song info of the current song (same song that is
identified in status). identified in status).
""" """
current_tl_track = context.core.playback.current_tl_track.get() tl_track = context.core.playback.current_tl_track.get()
if current_tl_track is not None: if tl_track is not None:
position = context.core.tracklist.tracklist_position.get() position = context.core.tracklist.tracklist_position(tl_track).get()
return track_to_mpd_format(current_tl_track, position=position) return track_to_mpd_format(tl_track, position=position)
@handle_request(r'^idle$') @handle_request(r'^idle$')
@ -185,7 +185,8 @@ def status(context):
'playback.state': context.core.playback.state, 'playback.state': context.core.playback.state,
'playback.current_tl_track': context.core.playback.current_tl_track, 'playback.current_tl_track': context.core.playback.current_tl_track,
'tracklist.tracklist_position': ( '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, 'playback.time_position': context.core.playback.time_position,
} }
pykka.get_all(futures.values()) pykka.get_all(futures.values())

View File

@ -179,13 +179,15 @@ class PlaybackControllerTest(object):
def test_next(self): def test_next(self):
self.playback.play() self.playback.play()
old_position = self.tracklist.tracklist_position tl_track = self.playback.current_tl_track
old_uri = self.playback.current_track.uri old_position = self.tracklist.tracklist_position(tl_track)
old_uri = tl_track.track.uri
self.playback.next() self.playback.next()
tl_track = self.playback.current_tl_track
self.assertEqual( 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) self.assertNotEqual(self.playback.current_track.uri, old_uri)
@populate_tracklist @populate_tracklist
@ -205,7 +207,8 @@ class PlaybackControllerTest(object):
for i, track in enumerate(self.tracks): for i, track in enumerate(self.tracks):
self.assertEqual(self.playback.state, PlaybackState.PLAYING) self.assertEqual(self.playback.state, PlaybackState.PLAYING)
self.assertEqual(self.playback.current_track, track) 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() self.playback.next()
@ -315,13 +318,15 @@ class PlaybackControllerTest(object):
def test_end_of_track(self): def test_end_of_track(self):
self.playback.play() self.playback.play()
old_position = self.tracklist.tracklist_position tl_track = self.playback.current_tl_track
old_uri = self.playback.current_track.uri old_position = self.tracklist.tracklist_position(tl_track)
old_uri = tl_track.track.uri
self.playback.on_end_of_track() self.playback.on_end_of_track()
tl_track = self.playback.current_tl_track
self.assertEqual( 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) self.assertNotEqual(self.playback.current_track.uri, old_uri)
@populate_tracklist @populate_tracklist
@ -341,7 +346,8 @@ class PlaybackControllerTest(object):
for i, track in enumerate(self.tracks): for i, track in enumerate(self.tracks):
self.assertEqual(self.playback.state, PlaybackState.PLAYING) self.assertEqual(self.playback.state, PlaybackState.PLAYING)
self.assertEqual(self.playback.current_track, track) 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() self.playback.on_end_of_track()
@ -500,24 +506,28 @@ class PlaybackControllerTest(object):
@populate_tracklist @populate_tracklist
def test_initial_tracklist_position(self): 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 @populate_tracklist
def test_tracklist_position_during_play(self): def test_tracklist_position_during_play(self):
self.playback.play() 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 @populate_tracklist
def test_tracklist_position_after_next(self): def test_tracklist_position_after_next(self):
self.playback.play() self.playback.play()
self.playback.next() 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 @populate_tracklist
def test_tracklist_position_at_end_of_playlist(self): def test_tracklist_position_at_end_of_playlist(self):
self.playback.play(self.tracklist.tl_tracks[-1]) self.playback.play(self.tracklist.tl_tracks[-1])
self.playback.on_end_of_track() 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): def test_on_tracklist_change_gets_called(self):
callback = self.playback.on_tracklist_change callback = self.playback.on_tracklist_change