]> kaliko git repositories - mpd-sima.git/blobdiff - sima/lib/webserv.py
Add options for album mode (closes #28)
[mpd-sima.git] / sima / lib / webserv.py
index cd28128978a9f6981e40486789e8f898d1446750..9800b92f32beca530b79502d13f65f5d45fceef0 100644 (file)
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
-# Copyright (c) 2009-2015 Jack Kaliko <kaliko@azylum.org>
+# Copyright (c) 2009-2019 Jack Kaliko <kaliko@azylum.org>
+# Copyright (c) 2019 sacha <sachahony@gmail.com>
 #
 #  This file is part of sima
 #
@@ -112,6 +113,7 @@ class WebService(Plugin):
             * not blacklisted
         """
         artist = tracks[0].artist
+        # In random play mode use complete playlist to filter
         if self.player.playmode.get('random'):
             black_list = self.player.playlist + self.to_add
         else:
@@ -198,6 +200,7 @@ class WebService(Plugin):
         if not self.player.playlist:
             return
         history = list(self.history)
+        # In random play mode use complete playlist to filter
         if self.player.playmode.get('random'):
             history = self.player.playlist + history
         else:
@@ -272,6 +275,7 @@ class WebService(Plugin):
         if not ret:
             self.log.warning('Got nothing from music library.')
             return []
+        # In random play mode use complete playlist to filter
         if self.player.playmode.get('random'):
             queued_artists = MetaContainer([trk.Artist for trk in self.player.playlist])
         else:
@@ -326,16 +330,14 @@ class WebService(Plugin):
             album_to_queue = str()
             random.shuffle(albums_not_in_hist)
             for album in albums_not_in_hist:
-                tracks = self.player.find_album(artist, album)
-                # Look if one track of the album is already queued
-                # Good heuristic, at least enough to guess if the whole album is
-                # already queued.
-                if tracks[0] in self.player.queue:
-                    self.log.debug('"%s" already queued, skipping!', tracks[0].album)
+                # Controls the album found is not already queued
+                if album in {t.album for t in self.player.queue}:
+                    self.log.debug('"%s" already queued, skipping!', 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)
+                # In random play mode use complete playlist to filter
+                if self.player.playmode.get('random'):
+                    if album in {t.album for t in self.player.playlist}:
+                        self.log.debug('"%s" already in playlist, skipping!', album)
                         continue
                 album_to_queue = album
             if not album_to_queue:
@@ -343,7 +345,15 @@ class WebService(Plugin):
                 continue
             self.log.info('%s album candidate: %s - %s', self.ws.name, artist, album_to_queue)
             nb_album_add += 1
-            self.to_add.extend(self.player.find_album(artist, album_to_queue))
+            candidates = self.player.find_album(artist, album_to_queue)
+            if self.plugin_conf.getboolean('shuffle_album'):
+                random.shuffle(candidates)
+            # this allows to select a maximum number of track from the album
+            # a value of 0 (default) means keep all
+            nbtracks = self.plugin_conf.getint('track_to_add_from_album')
+            if nbtracks > 0:
+                candidates = candidates[0:nbtracks]
+            self.to_add.extend(candidates)
             if nb_album_add == target_album_to_add:
                 return True