diff --git a/mopidy/backends/__init__.py b/mopidy/backends/__init__.py index e800f6b2..f8eb8845 100644 --- a/mopidy/backends/__init__.py +++ b/mopidy/backends/__init__.py @@ -249,6 +249,12 @@ class BasePlaybackController(object): #: The current track is played once. repeat = False + #: :class:`True` + #: Playback is stopped after current song, unless in repeat mode. + #: :class:`False` + #: Playback continues after current song. + single = False + def __init__(self, backend, mixer=alsaaudio.Mixer): self.backend = backend self._state = self.STOPPED diff --git a/mopidy/mpd/handler.py b/mopidy/mpd/handler.py index ef5e55d4..885aeb18 100644 --- a/mopidy/mpd/handler.py +++ b/mopidy/mpd/handler.py @@ -888,11 +888,10 @@ class MpdHandler(object): single is activated, playback is stopped after current song, or song is repeated if the ``repeat`` mode is enabled. """ - state = int(state) - if state: - raise MpdNotImplemented # TODO + if int(state): + self.backend.playback.single = True else: - raise MpdNotImplemented # TODO + self.backend.playback.single = False @handle_pattern(r'^stop$') def _playback_stop(self): diff --git a/tests/mpd/handlertest.py b/tests/mpd/handlertest.py index 6f3c7bf2..27a57c90 100644 --- a/tests/mpd/handlertest.py +++ b/tests/mpd/handlertest.py @@ -371,11 +371,13 @@ class PlaybackOptionsHandlerTest(unittest.TestCase): def test_single_off(self): result = self.h.handle_request(u'single "0"') - self.assert_(u'ACK Not implemented' in result) + self.assertFalse(self.b.playback.single) + self.assert_(u'OK' in result) def test_single_on(self): result = self.h.handle_request(u'single "1"') - self.assert_(u'ACK Not implemented' in result) + self.assertTrue(self.b.playback.single) + self.assert_(u'OK' in result) def test_replay_gain_mode_off(self): result = self.h.handle_request(u'replay_gain_mode "off"')