# standard library import
from difflib import get_close_matches
+from itertools import dropwhile
from select import select
# third parties components
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:
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
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.
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
"""
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):
import random
from collections import deque
-from itertools import dropwhile
from hashlib import md5
# third parties components
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
"""
' / '.join(art_not_in_hist)))
return art_not_in_hist
- @blacklist(artist=True)
@cache
def get_artists_from_player(self, similarities):
"""