X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Fplugins%2Finternal%2Flastfm.py;h=0cb3532477b7c59ec0b97d851e9f79dd1598993c;hb=cdb998d12265ec4e1f64c87cff22a8657e2a93ea;hp=c0904b0ffb95f0cb5adbac4bb5f93b55226f89a8;hpb=57621c64288a742232b379b53bfe5fce34959535;p=mpd-sima.git diff --git a/sima/plugins/internal/lastfm.py b/sima/plugins/internal/lastfm.py index c0904b0..0cb3532 100644 --- a/sima/plugins/internal/lastfm.py +++ b/sima/plugins/internal/lastfm.py @@ -13,8 +13,9 @@ from hashlib import md5 # local import from ...lib.plugin import Plugin -from ...lib.simafm import SimaFM, XmlFMHTTPError, XmlFMNotFound, XmlFMError +from ...lib.simafm import SimaFM, WSHTTPError, WSNotFound, WSError from ...lib.track import Track +from ...lib.meta import Artist def cache(func): @@ -22,7 +23,7 @@ def cache(func): def wrapper(*args, **kwargs): #pylint: disable=W0212,C0111 cls = args[0] - similarities = [art + str(match) for art, match in args[1]] + similarities = [art for art, _ in args[1]] hashedlst = md5(''.join(similarities).encode('utf-8')).hexdigest() if hashedlst in cls._cache.get('asearch'): cls.log.debug('cached request') @@ -60,10 +61,11 @@ class Lastfm(Plugin): """ Both flushes and instanciates _cache """ + name = self.__class__.__name__ if isinstance(self._cache, dict): - self.log.info('Lastfm: Flushing cache!') + self.log.info('{0}: Flushing cache!'.format(name)) else: - self.log.info('Lastfm: Initialising cache!') + self.log.info('{0}: Initialising cache!'.format(name)) self._cache = { 'asearch': dict(), 'tsearch': dict(), @@ -170,21 +172,25 @@ class Lastfm(Plugin): Retrieve similar artists on last.fm server. """ if artist is None: - current = self.player.current + curr = self.player.current.__dict__ + name = curr.get('artist') + mbid = curr.get('musicbrainz_artistid', None) + current = Artist(name=name, mbid=mbid) else: current = artist simafm = SimaFM() # initialize artists deque list to construct from DB as_art = deque() - as_artists = simafm.get_similar(artist=current.artist) - self.log.debug('Requesting last.fm for "{0.artist}"'.format(current)) + as_artists = simafm.get_similar(artist=current) + self.log.debug('Requesting last.fm for "{0}"'.format(current)) try: - [as_art.append((a, m)) for a, m in as_artists] - except XmlFMHTTPError as err: + # TODO: let's propagate Artist type + [as_art.append((str(a), m)) for a, m in as_artists] + except WSHTTPError as err: self.log.warning('last.fm http error: %s' % err) - except XmlFMNotFound as err: + except WSNotFound as err: self.log.warning("last.fm: %s" % err) - except XmlFMError as err: + except WSError as err: self.log.warning('last.fm module error: %s' % err) if as_art: self.log.debug('Fetched %d artist(s) from last.fm' % len(as_art)) @@ -230,18 +236,19 @@ class Lastfm(Plugin): return [] similar = sorted(similar, key=lambda sim: sim[1], reverse=True) self.log.info('First five similar artist(s): {}...'.format( - ' / '.join([a for a, m in similar[0:5]]))) + ' / '.join([a for a, _ in similar[0:5]]))) self.log.info('Looking availability in music library') ret = self.get_artists_from_player(similar) ret_extra = None if len(self.history) >= 2: - ret_extra = self.get_recursive_similar_artist() + if self.plugin_conf.getint('depth') > 1: + ret_extra = self.get_recursive_similar_artist() + if ret_extra: + ret = list(set(ret) | set(ret_extra)) if not ret: self.log.warning('Got nothing from music library.') self.log.warning('Try running in debug mode to guess why...') return [] - if ret_extra: - ret = list(set(ret) | set(ret_extra)) self.log.info('Got {} artists in library'.format(len(ret))) self.log.info(' / '.join(ret)) # Move around similars items to get in unplayed|not recently played @@ -265,7 +272,13 @@ class Lastfm(Plugin): for artist in artists: self.log.info('Looking for an album to add for "%s"...' % artist) albums = self.player.find_albums(artist) + # str conversion while Album type is not propagated + albums = [ str(album) for album in albums] + if albums: + self.log.debug('Albums candidate: {0:s}'.format(' / '.join(albums))) + else: continue # albums yet in history for this artist + albums = set(albums) albums_yet_in_hist = albums & self._get_album_history(artist=artist) albums_not_in_hist = list(albums - albums_yet_in_hist) # Get to next artist if there are no unplayed albums @@ -276,10 +289,6 @@ class Lastfm(Plugin): random.shuffle(albums_not_in_hist) for album in albums_not_in_hist: tracks = self.player.find_album(artist, album) - if tracks and self.sdb.get_bl_album(tracks[0], add_not=True): - self.log.info('Blacklisted album: "%s"' % album) - self.log.debug('using track: "%s"' % tracks[0]) - continue # Look if one track of the album is already queued # Good heuristic, at least enough to guess if the whole album is # already queued. @@ -316,7 +325,7 @@ class Lastfm(Plugin): 'history getting too large?') return None for track in self.to_add: - self.log.info('last.fm candidate: {0!s}'.format(track)) + self.log.info('last.fm candidates: {0!s}'.format(track)) def _album(self): """Get albums for album queue mode @@ -333,7 +342,11 @@ class Lastfm(Plugin): def callback_need_track(self): self._cleanup_cache() if not self.player.current: - self.log.info('Not currently playing track, cannot queue') + self.log.info('No current track, cannot queue') + return None + if not self.player.current.artist: + self.log.warning('No artist set for the current track') + self.log.debug(repr(self.player.current)) return None self.queue_mode() candidates = self.to_add