]> kaliko git repositories - mpd-sima.git/blobdiff - sima/plugins/internal/tags.py
Add randomness in Tags plugin artist selection
[mpd-sima.git] / sima / plugins / internal / tags.py
index 0af81ef3f0b7699dfc408b9e931d1203359e1848..3b7ffb06a6a41422d5783aa2128864329f01f927 100644 (file)
@@ -29,7 +29,7 @@ from musicpd import CommandError
 
 # local import
 from ...lib.plugin import AdvancedPlugin
-from ...lib.meta import Artist
+from ...lib.meta import Artist, MetaContainer
 from ...utils.utils import PluginException
 
 
@@ -48,8 +48,8 @@ def forge_filter(cfg):
         else:
             mpd_filter.append(f"({tag} == '{cfg[tag].strip()}')")
     mpd_filter = ' AND '.join(mpd_filter)
-    if 'AND' in mpd_filter:
-        mpd_filter = f'({mpd_filter})'
+    # Ensure there is at least an artist name
+    mpd_filter = f"({mpd_filter} AND (artist != ''))"
     return mpd_filter
 
 
@@ -110,54 +110,26 @@ class Tags(AdvancedPlugin):
             raise PluginException('Badly formated filter in tags plugin configuration: "%s"'
                                   % self.plugin_conf['filter'])
 
-    def callback_need_track_(self):
-        candidates = []
-        queue_mode = self.plugin_conf.get('queue_mode', 'track')
-        target = self.plugin_conf.getint(f'{queue_mode}_to_add')
-        tracks = self.player.find(self.mpd_filter)
-        random.shuffle(tracks)
-        history = self.get_history()
-        while tracks:
-            trk = tracks.pop()
-            if trk in self.player.queue or \
-               trk in candidates:
-                self.log.debug('%s already queued', trk)
-                continue
-            if trk in history:
-                self.log.debug('%s in history', trk)
-                continue
-            candidates.append(trk)
-            self.log.info('Tags candidate: {}'.format(trk))
-            if len(candidates) >= target:
-                break
-        if queue_mode == 'track':
-            return candidates
-        if queue_mode == 'album':
-            for trk in candidates:
-                self.log.info(trk.Artist)
-                _ = self.album_candidate(trk.Artist)
-        if not candidates:
-            self.log.info('Tags plugin failed to find some tracks')
-        return candidates
-
     def callback_need_track(self):
         candidates = []
         queue_mode = self.plugin_conf.get('queue_mode', 'track')
         target = self.plugin_conf.getint(f'{queue_mode}_to_add')
         # look for artists acording to filter
-        artists = self.player.list('artist', self.mpd_filter)
+        artists = MetaContainer([Artist(name=a) for a in self.player.list('artist', self.mpd_filter)])
         random.shuffle(artists)
+        if not artists:
+            self.log.info('Tags plugin found nothing to queue')
+            return candidates
         artists = self.get_reorg_artists_list(artists)
-        self.log.debug('Tags candidates: %s', ' / '.join(artists))
+        self.log.debug('Tags plugin found: %s', ' / '.join(map(str, artists)))
         for artist in artists:
-            if artist in {t.Artist for t in self.player.queue}:
-                continue
             self.log.debug('looking for %s', artist)
-            trk = self.filter_track(self.player.find_tracks(Artist(name=artist)))
+            tracks = self.player.find_tracks(artist)
+            trk = self.filter_track(tracks)
             if not trk:
                 continue
             if queue_mode == 'track':
-                self.log.info('Tags candidate: {}'.format(trk))
+                self.log.info('Tags plugin chose: {}'.format(trk))
                 candidates.append(trk)
                 if len(candidates) == target:
                     break