From cbe727d2bd202a4d000d2acb518a2b9b8d399f9b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 20 Mar 2011 00:19:30 +0100 Subject: [PATCH] Update MPD/playback --- mopidy/frontends/mpd/protocol/playback.py | 43 +++--- tests/frontends/mpd/playback_test.py | 175 ++++++++++++---------- 2 files changed, 117 insertions(+), 101 deletions(-) diff --git a/mopidy/frontends/mpd/protocol/playback.py b/mopidy/frontends/mpd/protocol/playback.py index d009969d..65282f42 100644 --- a/mopidy/frontends/mpd/protocol/playback.py +++ b/mopidy/frontends/mpd/protocol/playback.py @@ -1,3 +1,4 @@ +from mopidy.backends.base import PlaybackController from mopidy.frontends.mpd.protocol import handle_pattern from mopidy.frontends.mpd.exceptions import (MpdArgError, MpdNoExistError, MpdNotImplemented) @@ -86,7 +87,7 @@ def next_(frontend): order as the first time. """ - return frontend.backend.playback.next() + return frontend.backend.playback.next().get() @handle_pattern(r'^pause$') @handle_pattern(r'^pause "(?P[01])"$') @@ -103,11 +104,11 @@ def pause(frontend, state=None): - Calls ``pause`` without any arguments to toogle pause. """ if state is None: - if (frontend.backend.playback.state == - frontend.backend.playback.PLAYING): + if (frontend.backend.playback.state.get() == + PlaybackController.PLAYING): frontend.backend.playback.pause() - elif (frontend.backend.playback.state == - frontend.backend.playback.PAUSED): + elif (frontend.backend.playback.state.get() == + PlaybackController.PAUSED): frontend.backend.playback.resume() elif int(state): frontend.backend.playback.pause() @@ -120,7 +121,7 @@ def play(frontend): The original MPD server resumes from the paused state on ``play`` without arguments. """ - return frontend.backend.playback.play() + return frontend.backend.playback.play().get() @handle_pattern(r'^playid "(?P\d+)"$') @handle_pattern(r'^playid "(?P-1)"$') @@ -145,8 +146,8 @@ def playid(frontend, cpid): if cpid == -1: return _play_minus_one(frontend) try: - cp_track = frontend.backend.current_playlist.get(cpid=cpid) - return frontend.backend.playback.play(cp_track) + cp_track = frontend.backend.current_playlist.get(cpid=cpid).get() + return frontend.backend.playback.play(cp_track).get() except LookupError: raise MpdNoExistError(u'No such song', command=u'playid') @@ -177,22 +178,22 @@ def playpos(frontend, songpos): if songpos == -1: return _play_minus_one(frontend) try: - cp_track = frontend.backend.current_playlist.cp_tracks[songpos] - return frontend.backend.playback.play(cp_track) + cp_track = frontend.backend.current_playlist.cp_tracks.get()[songpos] + return frontend.backend.playback.play(cp_track).get() except IndexError: raise MpdArgError(u'Bad song index', command=u'play') def _play_minus_one(frontend): - if (frontend.backend.playback.state == frontend.backend.playback.PLAYING): + if (frontend.backend.playback.state.get() == PlaybackController.PLAYING): return # Nothing to do - elif (frontend.backend.playback.state == frontend.backend.playback.PAUSED): - return frontend.backend.playback.resume() - elif frontend.backend.playback.current_cp_track is not None: - cp_track = frontend.backend.playback.current_cp_track - return frontend.backend.playback.play(cp_track) - elif frontend.backend.current_playlist.cp_tracks: - cp_track = frontend.backend.current_playlist.cp_tracks[0] - return frontend.backend.playback.play(cp_track) + elif (frontend.backend.playback.state.get() == PlaybackController.PAUSED): + return frontend.backend.playback.resume().get() + elif frontend.backend.playback.current_cp_track.get() is not None: + cp_track = frontend.backend.playback.current_cp_track.get() + return frontend.backend.playback.play(cp_track).get() + elif frontend.backend.current_playlist.cp_tracks.get(): + cp_track = frontend.backend.current_playlist.cp_tracks.get()[0] + return frontend.backend.playback.play(cp_track).get() else: return # Fail silently @@ -240,7 +241,7 @@ def previous(frontend): ``previous`` should do a seek to time position 0. """ - return frontend.backend.playback.previous() + return frontend.backend.playback.previous().get() @handle_pattern(r'^random (?P[01])$') @handle_pattern(r'^random "(?P[01])"$') @@ -351,7 +352,7 @@ def setvol(frontend, volume): volume = 0 if volume > 100: volume = 100 - frontend.backend.mixer.volume = volume + frontend.mixer.volume = volume @handle_pattern(r'^single (?P[01])$') @handle_pattern(r'^single "(?P[01])"$') diff --git a/tests/frontends/mpd/playback_test.py b/tests/frontends/mpd/playback_test.py index 8f0560c7..8601aa9c 100644 --- a/tests/frontends/mpd/playback_test.py +++ b/tests/frontends/mpd/playback_test.py @@ -1,5 +1,6 @@ import unittest +from mopidy.backends.base import PlaybackController from mopidy.backends.dummy import DummyBackend from mopidy.frontends.mpd import dispatcher from mopidy.mixers.dummy import DummyMixer @@ -7,29 +8,38 @@ from mopidy.models import Track from tests import SkipTest +PAUSED = PlaybackController.PAUSED +PLAYING = PlaybackController.PLAYING +STOPPED = PlaybackController.STOPPED + class PlaybackOptionsHandlerTest(unittest.TestCase): def setUp(self): - self.b = DummyBackend(mixer_class=DummyMixer) - self.h = dispatcher.MpdDispatcher(backend=self.b) + self.b = DummyBackend.start().proxy() + self.mixer = DummyMixer.start().proxy() + self.h = dispatcher.MpdDispatcher() + + def tearDown(self): + self.b.stop().get() + self.mixer.stop().get() def test_consume_off(self): result = self.h.handle_request(u'consume "0"') - self.assertFalse(self.b.playback.consume) + self.assertFalse(self.b.playback.consume.get()) self.assert_(u'OK' in result) def test_consume_off_without_quotes(self): result = self.h.handle_request(u'consume 0') - self.assertFalse(self.b.playback.consume) + self.assertFalse(self.b.playback.consume.get()) self.assert_(u'OK' in result) def test_consume_on(self): result = self.h.handle_request(u'consume "1"') - self.assertTrue(self.b.playback.consume) + self.assertTrue(self.b.playback.consume.get()) self.assert_(u'OK' in result) def test_consume_on_without_quotes(self): result = self.h.handle_request(u'consume 1') - self.assertTrue(self.b.playback.consume) + self.assertTrue(self.b.playback.consume.get()) self.assert_(u'OK' in result) def test_crossfade(self): @@ -38,97 +48,97 @@ class PlaybackOptionsHandlerTest(unittest.TestCase): def test_random_off(self): result = self.h.handle_request(u'random "0"') - self.assertFalse(self.b.playback.random) + self.assertFalse(self.b.playback.random.get()) self.assert_(u'OK' in result) def test_random_off_without_quotes(self): result = self.h.handle_request(u'random 0') - self.assertFalse(self.b.playback.random) + self.assertFalse(self.b.playback.random.get()) self.assert_(u'OK' in result) def test_random_on(self): result = self.h.handle_request(u'random "1"') - self.assertTrue(self.b.playback.random) + self.assertTrue(self.b.playback.random.get()) self.assert_(u'OK' in result) def test_random_on_without_quotes(self): result = self.h.handle_request(u'random 1') - self.assertTrue(self.b.playback.random) + self.assertTrue(self.b.playback.random.get()) self.assert_(u'OK' in result) def test_repeat_off(self): result = self.h.handle_request(u'repeat "0"') - self.assertFalse(self.b.playback.repeat) + self.assertFalse(self.b.playback.repeat.get()) self.assert_(u'OK' in result) def test_repeat_off_without_quotes(self): result = self.h.handle_request(u'repeat 0') - self.assertFalse(self.b.playback.repeat) + self.assertFalse(self.b.playback.repeat.get()) self.assert_(u'OK' in result) def test_repeat_on(self): result = self.h.handle_request(u'repeat "1"') - self.assertTrue(self.b.playback.repeat) + self.assertTrue(self.b.playback.repeat.get()) self.assert_(u'OK' in result) def test_repeat_on_without_quotes(self): result = self.h.handle_request(u'repeat 1') - self.assertTrue(self.b.playback.repeat) + self.assertTrue(self.b.playback.repeat.get()) self.assert_(u'OK' in result) def test_setvol_below_min(self): result = self.h.handle_request(u'setvol "-10"') self.assert_(u'OK' in result) - self.assertEqual(0, self.b.mixer.volume) + self.assertEqual(0, self.mixer.volume.get()) def test_setvol_min(self): result = self.h.handle_request(u'setvol "0"') self.assert_(u'OK' in result) - self.assertEqual(0, self.b.mixer.volume) + self.assertEqual(0, self.mixer.volume.get()) def test_setvol_middle(self): result = self.h.handle_request(u'setvol "50"') self.assert_(u'OK' in result) - self.assertEqual(50, self.b.mixer.volume) + self.assertEqual(50, self.mixer.volume.get()) def test_setvol_max(self): result = self.h.handle_request(u'setvol "100"') self.assert_(u'OK' in result) - self.assertEqual(100, self.b.mixer.volume) + self.assertEqual(100, self.mixer.volume.get()) def test_setvol_above_max(self): result = self.h.handle_request(u'setvol "110"') self.assert_(u'OK' in result) - self.assertEqual(100, self.b.mixer.volume) + self.assertEqual(100, self.mixer.volume.get()) def test_setvol_plus_is_ignored(self): result = self.h.handle_request(u'setvol "+10"') self.assert_(u'OK' in result) - self.assertEqual(10, self.b.mixer.volume) + self.assertEqual(10, self.mixer.volume.get()) def test_setvol_without_quotes(self): result = self.h.handle_request(u'setvol 50') self.assert_(u'OK' in result) - self.assertEqual(50, self.b.mixer.volume) + self.assertEqual(50, self.mixer.volume.get()) def test_single_off(self): result = self.h.handle_request(u'single "0"') - self.assertFalse(self.b.playback.single) + self.assertFalse(self.b.playback.single.get()) self.assert_(u'OK' in result) def test_single_off_without_quotes(self): result = self.h.handle_request(u'single 0') - self.assertFalse(self.b.playback.single) + self.assertFalse(self.b.playback.single.get()) self.assert_(u'OK' in result) def test_single_on(self): result = self.h.handle_request(u'single "1"') - self.assertTrue(self.b.playback.single) + self.assertTrue(self.b.playback.single.get()) self.assert_(u'OK' in result) def test_single_on_without_quotes(self): result = self.h.handle_request(u'single 1') - self.assertTrue(self.b.playback.single) + self.assertTrue(self.b.playback.single.get()) self.assert_(u'OK' in result) def test_replay_gain_mode_off(self): @@ -176,8 +186,13 @@ class PlaybackOptionsHandlerTest(unittest.TestCase): class PlaybackControlHandlerTest(unittest.TestCase): def setUp(self): - self.b = DummyBackend(mixer_class=DummyMixer) - self.h = dispatcher.MpdDispatcher(backend=self.b) + self.b = DummyBackend.start().proxy() + self.mixer = DummyMixer.start().proxy() + self.h = dispatcher.MpdDispatcher() + + def tearDown(self): + self.b.stop().get() + self.mixer.stop().get() def test_next(self): result = self.h.handle_request(u'next') @@ -189,155 +204,155 @@ class PlaybackControlHandlerTest(unittest.TestCase): self.h.handle_request(u'pause "1"') result = self.h.handle_request(u'pause "0"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) + self.assertEqual(PLAYING, self.b.playback.state.get()) def test_pause_on(self): self.b.current_playlist.append([Track()]) self.h.handle_request(u'play "0"') result = self.h.handle_request(u'pause "1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PAUSED, self.b.playback.state) + self.assertEqual(PAUSED, self.b.playback.state.get()) def test_pause_toggle(self): self.b.current_playlist.append([Track()]) result = self.h.handle_request(u'play "0"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) + self.assertEqual(PLAYING, self.b.playback.state.get()) result = self.h.handle_request(u'pause') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PAUSED, self.b.playback.state) + self.assertEqual(PAUSED, self.b.playback.state.get()) result = self.h.handle_request(u'pause') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) + self.assertEqual(PLAYING, self.b.playback.state.get()) def test_play_without_pos(self): self.b.current_playlist.append([Track()]) - self.b.playback.state = self.b.playback.PAUSED + self.b.playback.state = PAUSED result = self.h.handle_request(u'play') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) + self.assertEqual(PLAYING, self.b.playback.state.get()) def test_play_with_pos(self): self.b.current_playlist.append([Track()]) result = self.h.handle_request(u'play "0"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) + self.assertEqual(PLAYING, self.b.playback.state.get()) def test_play_with_pos_without_quotes(self): self.b.current_playlist.append([Track()]) result = self.h.handle_request(u'play 0') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) + self.assertEqual(PLAYING, self.b.playback.state.get()) def test_play_with_pos_out_of_bounds(self): self.b.current_playlist.append([]) result = self.h.handle_request(u'play "0"') self.assertEqual(result[0], u'ACK [2@0] {play} Bad song index') - self.assertEqual(self.b.playback.STOPPED, self.b.playback.state) + self.assertEqual(STOPPED, self.b.playback.state.get()) def test_play_minus_one_plays_first_in_playlist_if_no_current_track(self): - self.assertEqual(self.b.playback.current_track, None) + self.assertEqual(self.b.playback.current_track.get(), None) self.b.current_playlist.append([Track(uri='a'), Track(uri='b')]) result = self.h.handle_request(u'play "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) - self.assertEqual(self.b.playback.current_track.uri, 'a') + self.assertEqual(PLAYING, self.b.playback.state.get()) + self.assertEqual(self.b.playback.current_track.get().uri, 'a') def test_play_minus_one_plays_current_track_if_current_track_is_set(self): self.b.current_playlist.append([Track(uri='a'), Track(uri='b')]) - self.assertEqual(self.b.playback.current_track, None) + self.assertEqual(self.b.playback.current_track.get(), None) self.b.playback.play() self.b.playback.next() self.b.playback.stop() - self.assertNotEqual(self.b.playback.current_track, None) + self.assertNotEqual(self.b.playback.current_track.get(), None) result = self.h.handle_request(u'play "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) - self.assertEqual(self.b.playback.current_track.uri, 'b') + self.assertEqual(PLAYING, self.b.playback.state.get()) + self.assertEqual(self.b.playback.current_track.get().uri, 'b') def test_play_minus_one_on_empty_playlist_does_not_ack(self): self.b.current_playlist.clear() result = self.h.handle_request(u'play "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.STOPPED, self.b.playback.state) - self.assertEqual(self.b.playback.current_track, None) + self.assertEqual(STOPPED, self.b.playback.state.get()) + self.assertEqual(self.b.playback.current_track.get(), None) def test_play_minus_is_ignored_if_playing(self): self.b.current_playlist.append([Track(length=40000)]) self.b.playback.seek(30000) - self.assert_(self.b.playback.time_position >= 30000) - self.assertEquals(self.b.playback.PLAYING, self.b.playback.state) + self.assert_(self.b.playback.time_position.get() >= 30000) + self.assertEquals(PLAYING, self.b.playback.state.get()) result = self.h.handle_request(u'play "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) - self.assert_(self.b.playback.time_position >= 30000) + self.assertEqual(PLAYING, self.b.playback.state.get()) + self.assert_(self.b.playback.time_position.get() >= 30000) def test_play_minus_one_resumes_if_paused(self): self.b.current_playlist.append([Track(length=40000)]) self.b.playback.seek(30000) - self.assert_(self.b.playback.time_position >= 30000) - self.assertEquals(self.b.playback.PLAYING, self.b.playback.state) + self.assert_(self.b.playback.time_position.get() >= 30000) + self.assertEquals(PLAYING, self.b.playback.state.get()) self.b.playback.pause() - self.assertEquals(self.b.playback.PAUSED, self.b.playback.state) + self.assertEquals(PAUSED, self.b.playback.state.get()) result = self.h.handle_request(u'play "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) - self.assert_(self.b.playback.time_position >= 30000) + self.assertEqual(PLAYING, self.b.playback.state.get()) + self.assert_(self.b.playback.time_position.get() >= 30000) def test_playid(self): self.b.current_playlist.append([Track()]) result = self.h.handle_request(u'playid "0"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) + self.assertEqual(PLAYING, self.b.playback.state.get()) def test_playid_minus_one_plays_first_in_playlist_if_no_current_track(self): - self.assertEqual(self.b.playback.current_track, None) + self.assertEqual(self.b.playback.current_track.get(), None) self.b.current_playlist.append([Track(uri='a'), Track(uri='b')]) result = self.h.handle_request(u'playid "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) - self.assertEqual(self.b.playback.current_track.uri, 'a') + self.assertEqual(PLAYING, self.b.playback.state.get()) + self.assertEqual(self.b.playback.current_track.get().uri, 'a') def test_playid_minus_one_plays_current_track_if_current_track_is_set(self): self.b.current_playlist.append([Track(uri='a'), Track(uri='b')]) - self.assertEqual(self.b.playback.current_track, None) + self.assertEqual(self.b.playback.current_track.get(), None) self.b.playback.play() self.b.playback.next() self.b.playback.stop() - self.assertNotEqual(self.b.playback.current_track, None) + self.assertNotEqual(self.b.playback.current_track.get(), None) result = self.h.handle_request(u'playid "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) - self.assertEqual(self.b.playback.current_track.uri, 'b') + self.assertEqual(PLAYING, self.b.playback.state.get()) + self.assertEqual(self.b.playback.current_track.get().uri, 'b') def test_playid_minus_one_on_empty_playlist_does_not_ack(self): self.b.current_playlist.clear() result = self.h.handle_request(u'playid "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.STOPPED, self.b.playback.state) - self.assertEqual(self.b.playback.current_track, None) + self.assertEqual(STOPPED, self.b.playback.state.get()) + self.assertEqual(self.b.playback.current_track.get(), None) def test_playid_minus_is_ignored_if_playing(self): self.b.current_playlist.append([Track(length=40000)]) self.b.playback.seek(30000) - self.assert_(self.b.playback.time_position >= 30000) - self.assertEquals(self.b.playback.PLAYING, self.b.playback.state) + self.assert_(self.b.playback.time_position.get() >= 30000) + self.assertEquals(PLAYING, self.b.playback.state.get()) result = self.h.handle_request(u'playid "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) - self.assert_(self.b.playback.time_position >= 30000) + self.assertEqual(PLAYING, self.b.playback.state.get()) + self.assert_(self.b.playback.time_position.get() >= 30000) def test_playid_minus_one_resumes_if_paused(self): self.b.current_playlist.append([Track(length=40000)]) self.b.playback.seek(30000) - self.assert_(self.b.playback.time_position >= 30000) - self.assertEquals(self.b.playback.PLAYING, self.b.playback.state) + self.assert_(self.b.playback.time_position.get() >= 30000) + self.assertEquals(PLAYING, self.b.playback.state.get()) self.b.playback.pause() - self.assertEquals(self.b.playback.PAUSED, self.b.playback.state) + self.assertEquals(PAUSED, self.b.playback.state.get()) result = self.h.handle_request(u'playid "-1"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.PLAYING, self.b.playback.state) - self.assert_(self.b.playback.time_position >= 30000) + self.assertEqual(PLAYING, self.b.playback.state.get()) + self.assert_(self.b.playback.time_position.get() >= 30000) def test_playid_which_does_not_exist(self): self.b.current_playlist.append([Track()]) @@ -361,20 +376,20 @@ class PlaybackControlHandlerTest(unittest.TestCase): [Track(uri='1', length=40000), seek_track]) result = self.h.handle_request(u'seek "1" "30"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.current_track, seek_track) + self.assertEqual(self.b.playback.current_track.get(), seek_track) def test_seek_without_quotes(self): self.b.current_playlist.append([Track(length=40000)]) self.h.handle_request(u'seek 0') result = self.h.handle_request(u'seek 0 30') self.assert_(u'OK' in result) - self.assert_(self.b.playback.time_position >= 30000) + self.assert_(self.b.playback.time_position.get() >= 30000) def test_seekid(self): self.b.current_playlist.append([Track(length=40000)]) result = self.h.handle_request(u'seekid "0" "30"') self.assert_(u'OK' in result) - self.assert_(self.b.playback.time_position >= 30000) + self.assert_(self.b.playback.time_position.get() >= 30000) def test_seekid_with_cpid(self): seek_track = Track(uri='2', length=40000) @@ -382,10 +397,10 @@ class PlaybackControlHandlerTest(unittest.TestCase): [Track(length=40000), seek_track]) result = self.h.handle_request(u'seekid "1" "30"') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.current_cpid, 1) - self.assertEqual(self.b.playback.current_track, seek_track) + self.assertEqual(self.b.playback.current_cpid.get(), 1) + self.assertEqual(self.b.playback.current_track.get(), seek_track) def test_stop(self): result = self.h.handle_request(u'stop') self.assert_(u'OK' in result) - self.assertEqual(self.b.playback.STOPPED, self.b.playback.state) + self.assertEqual(STOPPED, self.b.playback.state.get())