X-Git-Url: http://git.kaliko.me/?a=blobdiff_plain;f=sima%2Fclient.py;h=d10a3fe24d844c327bab2848a1d35ef86ae86789;hb=88706f0a1a79e669068162d6a38d9820afacbe64;hp=8bb5de3192947d706e669651cdd38fb7a1f9d732;hpb=93ad5efaffc6e4fd9476513ee16386e21ea4049d;p=mpd-sima.git diff --git a/sima/client.py b/sima/client.py index 8bb5de3..d10a3fe 100644 --- a/sima/client.py +++ b/sima/client.py @@ -172,12 +172,11 @@ class PlayerClient(Player): 'title', title)) else: tracks |= set(self.find('musicbrainz_artistid', artist.mbid)) - else: - for name in artist.names: - if title: - tracks |= set(self.find('artist', name, 'title', title)) - else: - tracks |= set(self.find('artist', name)) + for name in artist.names: + if title: + tracks |= set(self.find('artist', name, 'title', title)) + else: + tracks |= set(self.find('artist', name)) return list(tracks) @bl_artist @@ -248,50 +247,54 @@ class PlayerClient(Player): match = get_close_matches(title, all_artist_titles, 50, 0.78) if not match: return [] - for title_ in match: - leven = levenshtein_ratio(title.lower(), title_.lower()) + for mtitle in match: + leven = levenshtein_ratio(title.lower(), mtitle.lower()) if leven == 1: pass elif leven >= 0.79: # PARAM self.log.debug('title: "%s" should match "%s" (lr=%1.3f)', - title_, title, leven) + mtitle, title, leven) else: self.log.debug('title: "%s" does not match "%s" (lr=%1.3f)', - title_, title, leven) + mtitle, title, leven) return [] - return self.find('artist', artist, 'title', title_) + return self.find('artist', artist, 'title', mtitle) def find_album(self, artist, album): """ Special wrapper around album search: Album lookup is made through AlbumArtist/Album instead of Artist/Album + MPD falls back to Artist if AlbumArtist is not found (cf. documentation) """ - alb_art_search = self.find('albumartist', artist, 'album', album) - if alb_art_search: - return alb_art_search - return self.find('artist', artist, 'album', album) + return self.find('albumartist', artist, 'album', album) @blacklist(album=True) def search_albums(self, 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 + Then look for albums for "artist" == artist and try to filters + multi-artists albums + + NB: Running "client.list('album', 'artist', name)" MPD returns any album + containing at least a track with "artist" == name + TODO: Use MusicBrainzID here cf. #30 @gitlab """ albums = [] for name in artist.names: - if len(artist.names) > 1: + if artist.aliases: self.log.debug('Searching album for aliase: "%s"', name) kwalbart = {'albumartist':name, 'artist':name} - for album in self.list('album', 'albumartist', artist): + for album in self.list('album', 'albumartist', name): if album and album not in albums: albums.append(Album(name=album, **kwalbart)) - for album in self.list('album', 'artist', artist): + for album in self.list('album', 'artist', name): album_trks = [trk for trk in self.find('album', album)] if 'Various Artists' in [tr.albumartist for tr in album_trks]: self.log.debug('Discarding %s ("Various Artists" set)', album) continue arts = set([trk.artist for trk in album_trks]) + # Avoid selecting album where artist is credited for a single + # track of the album if len(set(arts)) < 2: # TODO: better heuristic, use a ratio instead if album not in albums: albums.append(Album(name=album, **kwalbart))