import random
from collections import deque
+from itertools import dropwhile
from hashlib import md5
# third parties componants
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
"""
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:
file=tr[3]) for tr in tracks_from_db]
return played_tracks
+ #@blacklist(track=True)
def filter_track(self, tracks):
"""
Extract one unplayed track from a Track object list.
* not in history
* not already in the queue
+ * not blacklisted
"""
artist = tracks[0].artist
black_list = self.player.queue + self.to_add
if not not_in_hist:
self.log.debug('All tracks already played for "{}"'.format(artist))
random.shuffle(not_in_hist)
- candidate = [ trk for trk in not_in_hist if trk not in black_list ]
+ #candidate = [ trk for trk in not_in_hist if trk not in black_list
+ #if not self.sdb.get_bl_track(trk, add_not=True)]
+ candidate = []
+ for trk in [_ for _ in not_in_hist if _ not in black_list]:
+ if self.sdb.get_bl_track(trk, add_not=True):
+ self.log.info('Blacklisted: {0}: '.format(trk))
+ continue
+ if self.sdb.get_bl_album(trk, add_not=True):
+ self.log.info('Blacklisted album: {0}: '.format(trk))
+ continue
+ candidate.append(trk)
if not candidate:
self.log.debug('Unable to find title to add' +
- ' for "%s".' % artist)
+ ' for "%s".' % artist)
return None
+ #@blacklist(track=True)
+ #def deco(self, args):
+ #return args
+ #candidate = deco(self, candidate)
self.to_add.append(random.choice(candidate))
+ return self.to_add
def _get_artists_list_reorg(self, alist):
"""
' / '.join(art_not_in_hist)))
return art_not_in_hist
+ @blacklist(artist=True)
@cache
def get_artists_from_player(self, similarities):
"""
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