]> kaliko git repositories - mpd-sima.git/commitdiff
Move artist blacklist filter in player client
authorkaliko <efrim@azylum.org>
Sun, 15 Dec 2013 11:52:37 +0000 (12:52 +0100)
committerkaliko <efrim@azylum.org>
Sun, 15 Dec 2013 12:00:37 +0000 (13:00 +0100)
sima/client.py
sima/core.py
sima/lib/simadb.py
sima/plugins/internal/lastfm.py

index 9724357c3c521acc87689a6143e91910903f33d9..8122fdcd0f49a8a258dc096ef3c3b74a902e8cca 100644 (file)
@@ -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):
index d705a6257841455058e599df2d364a2a764e0cf8..f535a33d486e6e11e577cfffac75877b3ff37144 100644 (file)
@@ -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
index a3d9518ac5df5534063cb8c11feb6cda0b6d8bc2..284f11562cbed58801eef6816d24d768e801c255 100644 (file)
@@ -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:
index 1b9ae41798cd39c46efc940f16eb77d99340a2f6..c0904b0ffb95f0cb5adbac4bb5f93b55226f89a8 100644 (file)
@@ -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):
         """