From: kaliko 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): """