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.
"""
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)
"""

View File

@ -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()

View File

@ -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())

View File

@ -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