From ac537a63c75145ee3bf60d35c74b6d3e3dda1895 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 14 Dec 2012 11:51:55 +0100 Subject: [PATCH] mpd: Add 'seekcur' command --- docs/changes.rst | 4 ++- mopidy/frontends/mpd/protocol/playback.py | 20 ++++++++++++ tests/frontends/mpd/protocol/playback_test.py | 31 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/docs/changes.rst b/docs/changes.rst index 3720ccf4..8de66e45 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -8,7 +8,9 @@ This change log is used to track all major changes to Mopidy. v0.11.0 (in development) ======================== -- No changes yet. +**MPD frontend** + +- Add support for ``seekcur`` command added in MPD 0.17. v0.10.0 (2012-12-12) diff --git a/mopidy/frontends/mpd/protocol/playback.py b/mopidy/frontends/mpd/protocol/playback.py index 5a4569e1..68c49ca0 100644 --- a/mopidy/frontends/mpd/protocol/playback.py +++ b/mopidy/frontends/mpd/protocol/playback.py @@ -349,6 +349,26 @@ def seekid(context, tlid, seconds): context.core.playback.seek(int(seconds) * 1000).get() +@handle_request(r'^seekcur "(?P\d+)"$') +@handle_request(r'^seekcur "(?P[-+]\d+)"$') +def seekcur(context, position=None, diff=None): + """ + *musicpd.org, playback section:* + + ``seekcur {TIME}`` + + Seeks to the position ``TIME`` within the current song. If prefixed by + '+' or '-', then the time is relative to the current playing position. + """ + if position is not None: + position = int(position) * 1000 + context.core.playback.seek(position).get() + elif diff is not None: + position = context.core.playback.time_position.get() + position += int(diff) * 1000 + context.core.playback.seek(position).get() + + @handle_request(r'^setvol (?P[-+]*\d+)$') @handle_request(r'^setvol "(?P[-+]*\d+)"$') def setvol(context, volume): diff --git a/tests/frontends/mpd/protocol/playback_test.py b/tests/frontends/mpd/protocol/playback_test.py index 14168a35..063493ec 100644 --- a/tests/frontends/mpd/protocol/playback_test.py +++ b/tests/frontends/mpd/protocol/playback_test.py @@ -414,6 +414,37 @@ class PlaybackControlHandlerTest(protocol.BaseTestCase): self.assertEqual(seek_track, self.core.playback.current_track.get()) self.assertInResponse('OK') + def test_seekcur_absolute_value(self): + self.core.tracklist.add([Track(uri='dummy:a', length=40000)]) + self.core.playback.play() + + self.sendRequest('seekcur "30"') + + self.assertGreaterEqual(self.core.playback.time_position.get(), 30000) + self.assertInResponse('OK') + + def test_seekcur_positive_diff(self): + self.core.tracklist.add([Track(uri='dummy:a', length=40000)]) + self.core.playback.play() + self.core.playback.seek(10000) + self.assertGreaterEqual(self.core.playback.time_position.get(), 10000) + + self.sendRequest('seekcur "+20"') + + self.assertGreaterEqual(self.core.playback.time_position.get(), 30000) + self.assertInResponse('OK') + + def test_seekcur_negative_diff(self): + self.core.tracklist.add([Track(uri='dummy:a', length=40000)]) + self.core.playback.play() + self.core.playback.seek(30000) + self.assertGreaterEqual(self.core.playback.time_position.get(), 30000) + + self.sendRequest('seekcur "-20"') + + self.assertLessEqual(self.core.playback.time_position.get(), 15000) + self.assertInResponse('OK') + def test_stop(self): self.sendRequest('stop') self.assertEqual(STOPPED, self.core.playback.state.get())