X-Git-Url: http://git.kaliko.me/?a=blobdiff_plain;f=sima%2Fplugins%2Finternal%2Flastfm.py;h=1b9ae41798cd39c46efc940f16eb77d99340a2f6;hb=8ce90ac30d1daa9bcf2ced0aa06c8c59302f71ca;hp=bff015b5550d151b855c533e541ee73e0aecf682;hpb=cd78ebfec21926f231f7b5f1430d31baee4b60c4;p=mpd-sima.git diff --git a/sima/plugins/internal/lastfm.py b/sima/plugins/internal/lastfm.py index bff015b..1b9ae41 100644 --- a/sima/plugins/internal/lastfm.py +++ b/sima/plugins/internal/lastfm.py @@ -3,14 +3,14 @@ Fetching similar artists from last.fm web services """ -# standart library import +# standard library import import random from collections import deque from itertools import dropwhile from hashlib import md5 -# third parties componants +# third parties components # local import from ...lib.plugin import Plugin @@ -30,6 +30,7 @@ def cache(func): results = cls._cache.get('asearch').get(hashedlst) else: results = func(*args, **kwargs) + cls.log.debug('caching request') cls._cache.get('asearch').update({hashedlst:list(results)}) random.shuffle(results) return results @@ -95,11 +96,9 @@ class Lastfm(Plugin): else: self.log.info('Lastfm: Initialising cache!') self._cache = { - 'artists': None, 'asearch': dict(), 'tsearch': dict(), } - self._cache['artists'] = frozenset(self.player.list('artist')) def _cleanup_cache(self): """Avoid bloated cache @@ -142,6 +141,13 @@ class Lastfm(Plugin): if self.sdb.get_bl_album(trk, add_not=True): self.log.info('Blacklisted album: {0}: '.format(trk)) continue + # Should use albumartist heuristic as well + if self.plugin_conf.getboolean('single_album'): + if (trk.album == self.player.current.album or + trk.album in [tr.album for tr in self.to_add]): + self.log.debug('Found unplayed track ' + + 'but from an album already queued: %s' % (trk)) + continue candidate.append(trk) if not candidate: self.log.debug('Unable to find title to add' + @@ -176,10 +182,10 @@ class Lastfm(Plugin): Look in player library for availability of similar artists in similarities """ - dynamic = int(self.plugin_conf.get('dynamic')) + dynamic = self.plugin_conf.getint('dynamic') if dynamic <= 0: dynamic = 100 - similarity = int(self.plugin_conf.get('similarity')) + similarity = self.plugin_conf.getint('similarity') results = list() similarities.reverse() while (len(results) < dynamic @@ -187,7 +193,7 @@ class Lastfm(Plugin): art_pop, match = similarities.pop() if match < similarity: break - results.extend(self.player.fuzzy_find(art_pop)) + results.extend(self.player.fuzzy_find_artist(art_pop)) results and self.log.debug('Similarity: %d%%' % match) # pylint: disable=w0106 return results @@ -223,7 +229,7 @@ class Lastfm(Plugin): depth = 0 current = self.player.current extra_arts = list() - while depth < int(self.plugin_conf.get('depth')): + while depth < self.plugin_conf.getint('depth'): if len(history) == 0: break trk = history.popleft() @@ -237,6 +243,8 @@ class Lastfm(Plugin): for artist in extra_arts: self.log.debug('Looking for artist similar to "{0.artist}" as well'.format(artist)) similar = self.lfm_similar_artists(artist=artist) + if not similar: + return ret_extra similar = sorted(similar, key=lambda sim: sim[1], reverse=True) ret_extra.extend(self.get_artists_from_player(similar)) if current.artist in ret_extra: @@ -272,29 +280,6 @@ class Lastfm(Plugin): # artist first. return self._get_artists_list_reorg(ret) - def _detects_var_artists_album(self, album, artist): - """Detects either an album is a "Various Artists" or a - single artist release.""" - art_first_track = None - for track in self.player.find_album(artist, album): - if not art_first_track: # set artist for the first track - art_first_track = track.artist - alb_art = track.albumartist - # Special heuristic used when AlbumArtist is available - if (alb_art): - if artist == alb_art: - # When album artist field is similar to the artist we're - # looking an album for, the album is considered good to - # queue - return False - else: - self.log.debug(track) - self.log.debug('album art says "%s", looking for "%s",' - ' not queueing this album' % - (alb_art, artist)) - return True - return False - def _get_album_history(self, artist=None): """Retrieve album history""" duration = self.daemon_conf.getint('sima', 'history_duration') @@ -308,10 +293,10 @@ class Lastfm(Plugin): """ self.to_add = list() nb_album_add = 0 - target_album_to_add = int(self.plugin_conf.get('album_to_add')) + target_album_to_add = self.plugin_conf.getint('album_to_add') for artist in artists: self.log.info('Looking for an album to add for "%s"...' % artist) - albums = set(self.player.find_albums(artist)) + albums = self.player.find_albums(artist) # albums yet in history for this artist albums_yet_in_hist = albums & self._get_album_history(artist=artist) albums_not_in_hist = list(albums - albums_yet_in_hist) @@ -322,9 +307,7 @@ class Lastfm(Plugin): album_to_queue = str() random.shuffle(albums_not_in_hist) for album in albums_not_in_hist: - tracks = self.player.find('album', album) - if self._detects_var_artists_album(album, artist): - continue + 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]) @@ -351,7 +334,7 @@ class Lastfm(Plugin): """Get some tracks for track queue mode """ artists = self.get_local_similar_artists() - nbtracks_target = int(self.plugin_conf.get('track_to_add')) + nbtracks_target = self.plugin_conf.getint('track_to_add') for artist in artists: self.log.debug('Trying to find titles to add for "{}"'.format( artist))