Merge pull request #1523 from ismailof/fix/1133-mpd-nextsongid

mpd: Add nextsong and nextsongid to mpd status command (Fixes #1133)
This commit is contained in:
Thomas Adamcik 2016-06-26 11:52:24 +02:00 committed by GitHub
commit 068800c699
3 changed files with 41 additions and 12 deletions

View File

@ -41,6 +41,8 @@ Bug fix release.
- MPD: Fix MPD protocol for ``replay_gain_status`` command. The actual command
remains unimplemented. (PR: :issue:`1520`)
- MPD: Add ``nextsong`` and ``nextsongid`` to the response of MPD ``status`` command.
(Fixes: :issue:`1133` :issue:`1516`, PR: :issue:`1523`)
v2.0.0 (2016-02-15)
===================

View File

@ -173,6 +173,7 @@ def status(context):
decimal places for millisecond precision.
"""
tl_track = context.core.playback.get_current_tl_track()
next_tlid = context.core.tracklist.get_next_tlid()
futures = {
'tracklist.length': context.core.tracklist.get_length(),
@ -185,6 +186,9 @@ def status(context):
'playback.state': context.core.playback.get_state(),
'playback.current_tl_track': tl_track,
'tracklist.index': context.core.tracklist.index(tl_track.get()),
'tracklist.next_tlid': next_tlid,
'tracklist.next_index': context.core.tracklist.index(
tlid=next_tlid.get()),
'playback.time_position': context.core.playback.get_time_position(),
}
pykka.get_all(futures.values())
@ -199,10 +203,12 @@ def status(context):
('xfade', _status_xfade(futures)),
('state', _status_state(futures)),
]
# TODO: add nextsong and nextsongid
if futures['playback.current_tl_track'].get() is not None:
result.append(('song', _status_songpos(futures)))
result.append(('songid', _status_songid(futures)))
if futures['tracklist.next_tlid'].get() is not None:
result.append(('nextsong', _status_nextsongpos(futures)))
result.append(('nextsongid', _status_nextsongid(futures)))
if futures['playback.state'].get() in (
PlaybackState.PLAYING, PlaybackState.PAUSED):
result.append(('time', _status_time(futures)))
@ -259,6 +265,14 @@ def _status_songpos(futures):
return futures['tracklist.index'].get()
def _status_nextsongid(futures):
return futures['tracklist.next_tlid'].get()
def _status_nextsongpos(futures):
return futures['tracklist.next_index'].get()
def _status_state(futures):
state = futures['playback.state'].get()
if state == PlaybackState.PLAYING:

View File

@ -48,9 +48,9 @@ class StatusHandlerTest(unittest.TestCase):
def tearDown(self): # noqa: N802
pykka.ActorRegistry.stop_all()
def set_tracklist(self, track):
self.backend.library.dummy_library = [track]
self.core.tracklist.add(uris=[track.uri]).get()
def set_tracklist(self, tracks):
self.backend.library.dummy_library = tracks
self.core.tracklist.add(uris=[track.uri for track in tracks]).get()
def test_stats_method(self):
result = status.stats(self.context)
@ -154,22 +154,35 @@ class StatusHandlerTest(unittest.TestCase):
self.assertEqual(result['state'], 'pause')
def test_status_method_when_playlist_loaded_contains_song(self):
self.set_tracklist(Track(uri='dummy:/a'))
self.set_tracklist([Track(uri='dummy:/a')])
self.core.playback.play().get()
result = dict(status.status(self.context))
self.assertIn('song', result)
self.assertGreaterEqual(int(result['song']), 0)
def test_status_method_when_playlist_loaded_contains_tlid_as_songid(self):
self.set_tracklist(Track(uri='dummy:/a'))
self.set_tracklist([Track(uri='dummy:/a')])
self.core.playback.play().get()
result = dict(status.status(self.context))
self.assertIn('songid', result)
self.assertEqual(int(result['songid']), 1)
def test_status_method_when_playlist_loaded_contains_nextsong(self):
self.set_tracklist([Track(uri='dummy:/a'), Track(uri='dummy:/b')])
self.core.playback.play().get()
result = dict(status.status(self.context))
self.assertIn('nextsong', result)
self.assertGreaterEqual(int(result['nextsong']), 0)
def test_status_method_when_playlist_loaded_contains_nextsongid(self):
self.set_tracklist([Track(uri='dummy:/a'), Track(uri='dummy:/b')])
self.core.playback.play().get()
result = dict(status.status(self.context))
self.assertIn('nextsongid', result)
self.assertEqual(int(result['nextsongid']), 2)
def test_status_method_when_playing_contains_time_with_no_length(self):
self.set_tracklist(Track(uri='dummy:/a', length=None))
self.set_tracklist([Track(uri='dummy:/a', length=None)])
self.core.playback.play().get()
result = dict(status.status(self.context))
self.assertIn('time', result)
@ -179,7 +192,7 @@ class StatusHandlerTest(unittest.TestCase):
self.assertLessEqual(position, total)
def test_status_method_when_playing_contains_time_with_length(self):
self.set_tracklist(Track(uri='dummy:/a', length=10000))
self.set_tracklist([Track(uri='dummy:/a', length=10000)])
self.core.playback.play()
result = dict(status.status(self.context))
self.assertIn('time', result)
@ -189,7 +202,7 @@ class StatusHandlerTest(unittest.TestCase):
self.assertLessEqual(position, total)
def test_status_method_when_playing_contains_elapsed(self):
self.set_tracklist(Track(uri='dummy:/a', length=60000))
self.set_tracklist([Track(uri='dummy:/a', length=60000)])
self.core.playback.play().get()
self.core.playback.pause()
self.core.playback.seek(59123)
@ -198,7 +211,7 @@ class StatusHandlerTest(unittest.TestCase):
self.assertEqual(result['elapsed'], '59.123')
def test_status_method_when_starting_playing_contains_elapsed_zero(self):
self.set_tracklist(Track(uri='dummy:/a', length=10000))
self.set_tracklist([Track(uri='dummy:/a', length=10000)])
self.core.playback.play().get()
self.core.playback.pause()
result = dict(status.status(self.context))
@ -206,7 +219,7 @@ class StatusHandlerTest(unittest.TestCase):
self.assertEqual(result['elapsed'], '0.000')
def test_status_method_when_playing_contains_bitrate(self):
self.set_tracklist(Track(uri='dummy:/a', bitrate=3200))
self.set_tracklist([Track(uri='dummy:/a', bitrate=3200)])
self.core.playback.play().get()
result = dict(status.status(self.context))
self.assertIn('bitrate', result)