]> kaliko git repositories - mpd-sima.git/blobdiff - sima/plugins/lastfm.py
blacklisting decorator
[mpd-sima.git] / sima / plugins / lastfm.py
index 0bbddbd33f0e8ae8b767692877a1cdc0fb8e1715..ec612eed10edf10cc90804aca45565fa9afb1253 100644 (file)
@@ -7,6 +7,7 @@ Fetching similar artists from last.fm web services
 import random
 
 from collections import deque
+from itertools import dropwhile
 from hashlib import md5
 
 # third parties componants
@@ -34,6 +35,26 @@ def cache(func):
         return results
     return wrapper
 
+def blacklist(artist=False, album=False, track=False):
+    field = (bl for bl in (artist, album, track))
+    def decorated(func):
+        def wrapper(*args, **kwargs):
+            cls = args[0]
+            bl_fun = (cls._Plugin__daemon.sdb.get_bl_artist,
+                      cls._Plugin__daemon.sdb.get_bl_album,
+                      cls._Plugin__daemon.sdb.get_bl_track,)
+            #bl_getter = next(fn for fn, bl in zip(bl_fun, field) if bl is True)
+            bl_getter = next(dropwhile(lambda _: not next(field), bl_fun))
+            results = func(*args, **kwargs)
+            cls.log.debug('using {0} as bl filter'.format(bl_getter.__name__))
+            for elem in results:
+                if bl_getter(elem, add_not=True):
+                    cls.log.info('Blacklisted: {0}'.format(elem))
+                    results.remove(elem)
+            return results
+        return wrapper
+    return decorated
+
 
 class Lastfm(Plugin):
     """last.fm similar artists
@@ -73,7 +94,6 @@ class Lastfm(Plugin):
     def _cleanup_cache(self):
         """Avoid bloated cache
         """
-        # TODO: call cleanup once its dict instance are used somewhere XXX
         for _ , val in self._cache.items():
             if isinstance(val, dict):
                 while len(val) > 150:
@@ -128,6 +148,7 @@ class Lastfm(Plugin):
                        ' / '.join(art_not_in_hist)))
         return art_not_in_hist
 
+    @blacklist(artist=True)
     @cache
     def get_artists_from_player(self, similarities):
         """
@@ -238,7 +259,7 @@ class Lastfm(Plugin):
             self.log.debug('Trying to find titles to add for "{}"'.format(
                            artist))
             found = self.player.find_track(artist)
-            # find tracks not in history
+            # find tracks not in history for artist
             self.filter_track(found)
             if len(self.to_add) == nbtracks_target:
                 break