From: kaliko <efrim@azylum.org>
Date: Sun, 15 Dec 2013 11:52:37 +0000 (+0100)
Subject: Move artist blacklist filter in player client
X-Git-Tag: mpd-sima/0.12.0pr2~8
X-Git-Url: https://git.kaliko.me/?a=commitdiff_plain;h=57621c64288a742232b379b53bfe5fce34959535;p=mpd-sima.git

Move artist blacklist filter in player client
---

diff --git a/sima/client.py b/sima/client.py
index 9724357..8122fdc 100644
--- a/sima/client.py
+++ b/sima/client.py
@@ -7,6 +7,7 @@ This client is built above python-musicpd a fork of python-mpd
 
 # standard library import
 from difflib import get_close_matches
+from itertools import dropwhile
 from select import select
 
 # third parties components
@@ -32,6 +33,28 @@ class PlayerCommandError(PlayerError):
 PlayerUnHandledError = MPDError  # pylint: disable=C0103
 
 
+def blacklist(artist=False, album=False, track=False):
+    #pylint: disable=C0111,W0212
+    field = (artist, album, track)
+    def decorated(func):
+        def wrapper(*args, **kwargs):
+            cls = args[0]
+            boolgen = (bl for bl in field)
+            bl_fun = (cls.database.get_bl_artist,
+                      cls.database.get_bl_album,
+                      cls.database.get_bl_track,)
+            #bl_getter = next(fn for fn, bl in zip(bl_fun, boolgen) if bl is True)
+            bl_getter = next(dropwhile(lambda _: not next(boolgen), bl_fun))
+            #cls.log.debug('using {0} as bl filter'.format(bl_getter.__name__))
+            results = func(*args, **kwargs)
+            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 PlayerClient(Player):
     """MPC Client
     From python-musicpd:
@@ -47,6 +70,8 @@ class PlayerClient(Player):
     TODO: handle exception in command not going through _client_wrapper() (ie.
           find_aa, remove…)
     """
+    database = None  # sima database (history, blaclist)
+
     def __init__(self, host="localhost", port="6600", password=None):
         super().__init__()
         self._comm = self._args = None
@@ -129,6 +154,7 @@ class PlayerClient(Player):
             return self.find('artist', artist, 'title', title)
         return self.find('artist', artist)
 
+    @blacklist(artist=True)
     def fuzzy_find_artist(self, art):
         """
         Controls presence of artist in music library.
@@ -187,9 +213,10 @@ class PlayerClient(Player):
             return alb_art_search
         return self.find('artist', artist, 'album', album)
 
+    #@blacklist(album=True)
     def find_albums(self, artist):
         """
-        Fetch all albums for "AlbumArtist" == artist
+        Fetch all albums for "AlbumArtist"  == artist
         Filter albums returned for "artist" == artist since MPD returns any
                album containing at least a single track for artist
         """
@@ -202,6 +229,8 @@ class PlayerClient(Player):
             else:
                 self.log.debug('"{0}" probably not an album of "{1}"'.format(
                              album, artist) + '({0})'.format('/'.join(arts)))
+        if albums:
+            self.log.debug('Albums candidate: {0}'.format('/'.join(albums)))
         return albums
 
     def monitor(self):
diff --git a/sima/core.py b/sima/core.py
index d705a62..f535a33 100644
--- a/sima/core.py
+++ b/sima/core.py
@@ -27,6 +27,7 @@ class Sima(Daemon):
         self.enabled = True
         self.config = conf
         self.sdb = SimaDB(db_path=conf.get('sima', 'db_file'))
+        PlayerClient.database = self.sdb
         self.log = getLogger('sima')
         self.plugins = list()
         self.player = self.__get_player()  # Player client
diff --git a/sima/lib/simadb.py b/sima/lib/simadb.py
index a3d9518..284f115 100644
--- a/sima/lib/simadb.py
+++ b/sima/lib/simadb.py
@@ -272,7 +272,7 @@ class SimaDB(object):
 
     def get_bl_album(self, track,
             with_connection=None, add_not=None):
-        """get blacklisted track information from the database."""
+        """get blacklisted album information from the database."""
         if with_connection:
             connection = with_connection
         else:
diff --git a/sima/plugins/internal/lastfm.py b/sima/plugins/internal/lastfm.py
index 1b9ae41..c0904b0 100644
--- a/sima/plugins/internal/lastfm.py
+++ b/sima/plugins/internal/lastfm.py
@@ -7,7 +7,6 @@ Fetching similar artists from last.fm web services
 import random
 
 from collections import deque
-from itertools import dropwhile
 from hashlib import md5
 
 # third parties components
@@ -37,36 +36,6 @@ def cache(func):
     return wrapper
 
 
-def blacklist(artist=False, album=False, track=False):
-    #pylint: disable=C0111,W0212
-    field = (artist, album, track)
-    def decorated(func):
-        def wrapper(*args, **kwargs):
-            cls = args[0]
-            boolgen = (bl for bl in field)
-            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, boolgen) if bl is True)
-            bl_getter = next(dropwhile(lambda _: not next(boolgen), bl_fun))
-            cls.log.debug('using {0} as bl filter'.format(bl_getter.__name__))
-            if artist:
-                results = func(*args, **kwargs)
-                for elem in results:
-                    if bl_getter(elem, add_not=True):
-                        cls.log.info('Blacklisted: {0}'.format(elem))
-                        results.remove(elem)
-                return results
-            if track:
-                for elem in args[1]:
-                    if bl_getter(elem, add_not=True):
-                        cls.log.info('Blacklisted: {0}'.format(elem))
-                        args[1].remove(elem)
-                return func(*args, **kwargs)
-        return wrapper
-    return decorated
-
-
 class Lastfm(Plugin):
     """last.fm similar artists
     """
@@ -175,7 +144,6 @@ class Lastfm(Plugin):
                        ' / '.join(art_not_in_hist)))
         return art_not_in_hist
 
-    @blacklist(artist=True)
     @cache
     def get_artists_from_player(self, similarities):
         """