From 859e16d1e310b6cc8bdafb3f8fd591df8f36b908 Mon Sep 17 00:00:00 2001 From: Carl Suster Date: Sun, 31 Mar 2019 01:01:45 +1100 Subject: [PATCH] bpd: support consume command --- beetsplug/bpd/__init__.py | 11 +++++++++++ test/test_player.py | 23 ++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/beetsplug/bpd/__init__.py b/beetsplug/bpd/__init__.py index d5e4489f4..a0d6d6254 100644 --- a/beetsplug/bpd/__init__.py +++ b/beetsplug/bpd/__init__.py @@ -173,6 +173,7 @@ class BaseServer(object): # Default server values. self.random = False self.repeat = False + self.consume = False self.volume = VOLUME_MAX self.crossfade = 0 self.mixrampdb = 0.0 @@ -309,6 +310,7 @@ class BaseServer(object): u'volume: ' + six.text_type(self.volume), u'repeat: ' + six.text_type(int(self.repeat)), u'random: ' + six.text_type(int(self.random)), + u'consume: ' + six.text_type(int(self.consume)), u'playlist: ' + six.text_type(self.playlist_version), u'playlistlength: ' + six.text_type(len(self.playlist)), u'mixrampdb: ' + six.text_type(self.mixrampdb), @@ -350,6 +352,10 @@ class BaseServer(object): """Set or unset repeat mode.""" self.repeat = cast_arg('intbool', state) + def cmd_consume(self, conn, state): + """Set or unset consume mode.""" + self.consume = cast_arg('intbool', state) + def cmd_setvol(self, conn, vol): """Set the player's volume level (0-100).""" vol = cast_arg(int, vol) @@ -519,7 +525,12 @@ class BaseServer(object): def cmd_next(self, conn): """Advance to the next song in the playlist.""" + old_index = self.current_index self.current_index = self._succ_idx() + if self.consume: + self.playlist.pop(old_index) + if self.current_index > old_index: + self.current_index -= 1 if self.current_index >= len(self.playlist): # Fallen off the end. Just move to stopped state. return self.cmd_stop(conn) diff --git a/test/test_player.py b/test/test_player.py index 44572c3a6..b9544769c 100644 --- a/test/test_player.py +++ b/test/test_player.py @@ -361,10 +361,31 @@ class BPDQueryTest(BPDTestHelper): class BPDPlaybackTest(BPDTestHelper): test_implements_playback = implements({ - 'consume', 'random', + 'random', 'repeat', 'single', }, expectedFailure=True) + def test_cmd_consume(self): + with self.run_bpd() as client: + self._bpd_add(client, self.item1, self.item2) + responses = client.send_commands( + ('consume', '0'), + ('playlistinfo',), + ('next',), + ('playlistinfo',), + ('consume', '1'), + ('playlistinfo',), + ('play', '0'), + ('next',), + ('playlistinfo',), + ('status',)) + self._assert_ok(*responses) + self.assertEqual(responses[1].data['Id'], responses[3].data['Id']) + self.assertEqual(['1', '2'], responses[5].data['Id']) + self.assertEqual('2', responses[8].data['Id']) + self.assertEqual('1', responses[9].data['consume']) + self.assertEqual('play', responses[9].data['state']) + def test_cmd_crossfade(self): with self.run_bpd() as client: responses = client.send_commands(