]> kaliko git repositories - mpd-sima.git/commitdiff
Enhanced queuing behavior in random mode (Closes #16)
authorkaliko <kaliko@azylum.org>
Tue, 21 Nov 2017 14:12:33 +0000 (15:12 +0100)
committerkaliko <kaliko@azylum.org>
Tue, 21 Nov 2017 14:12:33 +0000 (15:12 +0100)
doc/Changelog
sima/client.py
sima/core.py
sima/lib/player.py
sima/lib/webserv.py
sima/plugins/core/mpdoptions.py

index 4b8e8aed15e00e7e296cb6077e4c4d51ef804af4..4d9b23de85a01776ec772a5309f23e96822eaa45 100644 (file)
@@ -1,6 +1,6 @@
-MPD_sima v0.14.5
+MPD_sima v0.15.0
 
- * 
+ * Enhanced queuing behavior in random mode (Closes #16)
 
 -- kaliko jack <kaliko@azylum.org> UNRELEASED
 
index 525f268d0c5b5c02ee067388145d1fe357a496d8..c04f560aece84c749a839e0aade0823f47493af4 100644 (file)
@@ -339,6 +339,18 @@ class PlayerClient(Player):
     def state(self):
         return str(self.status().get('state'))
 
+    @property
+    def playmode(self):
+        plm = {'repeat': None,
+               'single': None,
+               'random': None,
+               'consume': None,
+              }
+        for key, val in self.status().items():
+            if key in plm.keys():
+                plm.update({key:bool(int(val))})
+        return plm
+
     @property
     def current(self):
         return self.currentsong()
index eea108d3a078eb15ecc88913b8bd98a532b21abc..ce1b0782ef0e682e0c30a99dcbe2a6d3542877dc 100644 (file)
@@ -93,9 +93,13 @@ class Sima(Daemon):
         if not self.enabled:
             self.log.debug('Queueing disabled!')
             return False
-        queue = self.player.queue
         queue_trigger = self.config.getint('sima', 'queue_length')
-        self.log.debug('Currently %s track(s) ahead. (target %s)', len(queue), queue_trigger)
+        if self.player.playmode.get('random'):
+            queue = self.player.playlist
+            self.log.debug('Currently %s track(s) in the playlist. (target %s)', len(queue), queue_trigger)
+        else:
+            queue = self.player.queue
+            self.log.debug('Currently %s track(s) ahead. (target %s)', len(queue), queue_trigger)
         if len(queue) < queue_trigger:
             return True
         return False
index 721d9a67e017e2cae2ad040a795669609efeaac4..1d1f69315301e681933ea73a376118cacfd3876c 100644 (file)
@@ -152,6 +152,21 @@ class Player(object):
 
     @property
     def state(self):
+        """Returns (play|stop|pause)"""
+        #pylint: disable=C0111
+        raise NotImplementedError
+
+    @property
+    def playmode(self):
+        """Returns a mapping
+        {
+            'repeat': boolean,
+            'random': boolean,
+            'single': boolean,
+            'consume': boolean,
+            …
+            }
+        """
         #pylint: disable=C0111
         raise NotImplementedError
 
index 50d2b81f632072f966526de7a5bde33d56dd537a..cd28128978a9f6981e40486789e8f898d1446750 100644 (file)
@@ -112,7 +112,10 @@ class WebService(Plugin):
             * not blacklisted
         """
         artist = tracks[0].artist
-        black_list = self.player.queue + self.to_add
+        if self.player.playmode.get('random'):
+            black_list = self.player.playlist + self.to_add
+        else:
+            black_list = self.player.queue + self.to_add
         not_in_hist = list(set(tracks) - set(self.get_history(artist=artist)))
         if self.plugin_conf.get('queue_mode') != 'top' and not not_in_hist:
             self.log.debug('All tracks already played for "%s"', artist)
@@ -195,7 +198,10 @@ class WebService(Plugin):
         if not self.player.playlist:
             return
         history = list(self.history)
-        history = self.player.queue + history
+        if self.player.playmode.get('random'):
+            history = self.player.playlist + history
+        else:
+            history = self.player.queue + history
         history = deque(history)
         last_trk = history.popleft() # remove
         extra_arts = list()
@@ -266,7 +272,10 @@ class WebService(Plugin):
         if not ret:
             self.log.warning('Got nothing from music library.')
             return []
-        queued_artists = MetaContainer([trk.Artist for trk in self.player.queue])
+        if self.player.playmode.get('random'):
+            queued_artists = MetaContainer([trk.Artist for trk in self.player.playlist])
+        else:
+            queued_artists = MetaContainer([trk.Artist for trk in self.player.queue])
         self.log.trace('Already queued: {}'.format(queued_artists))
         self.log.trace('Candidate: {}'.format(ret))
         if ret & queued_artists:
@@ -324,6 +333,10 @@ class WebService(Plugin):
                 if tracks[0] in self.player.queue:
                     self.log.debug('"%s" already queued, skipping!', tracks[0].album)
                     continue
+                if tracks[0] in self.player.playlist:
+                    if self.player.playmode.get('random'):
+                        self.log.debug('"%s" already in playlist, skipping!', tracks[0].album)
+                        continue
                 album_to_queue = album
             if not album_to_queue:
                 self.log.info('No album found for "%s"', artist)
index ab5a4cb458f2b6368c8a28ca528a06a4071dec31..fe368bd1e01766f4ae810c8d7cdc430ab624b818 100644 (file)
@@ -43,10 +43,10 @@ class MpdOptions(Plugin):
         Called on player changes
         """
         player = self.daemon.player
-        if player.status().get('single') == str(1):
+        if player.playmode.get('single'):
             self.log.info('MPD "single" mode activated.')
             self.daemon.enabled = False
-        elif player.status().get('repeat') == str(1):
+        elif player.playmode.get('repeat'):
             self.log.info('MPD "repeat" mode activated.')
             self.daemon.enabled = False
         else: