From: kaliko Date: Wed, 16 May 2018 14:41:10 +0000 (+0200) Subject: Aggregates artist name and MusicBrainzID, simplified album search X-Git-Tag: 0.15.0~8 X-Git-Url: https://git.kaliko.me/?a=commitdiff_plain;h=7d13b99f3c51927b6f3f33686c3d2df77626e693;p=mpd-sima.git Aggregates artist name and MusicBrainzID, simplified album search --- diff --git a/doc/Changelog b/doc/Changelog index dcb72d9..b9fc7ad 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -6,6 +6,8 @@ MPD_sima v0.15.0 * Honor MPC password/host format on command line option 'host' * Fixed fuzzy search for short artist names * Client side hardcoded one month caching (ugly workaround for #7) + * Simplified album search + * Track search aggregates artist name and MusicBrainzID searches -- kaliko jack UNRELEASED diff --git a/sima/client.py b/sima/client.py index 8bb5de3..40842ba 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,28 +247,26 @@ 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): diff --git a/sima/lib/webserv.py b/sima/lib/webserv.py index cd28128..2ff88d2 100644 --- a/sima/lib/webserv.py +++ b/sima/lib/webserv.py @@ -112,6 +112,7 @@ class WebService(Plugin): * not blacklisted """ artist = tracks[0].artist + # In random play mode use complete playlist to filter if self.player.playmode.get('random'): black_list = self.player.playlist + self.to_add else: @@ -198,6 +199,7 @@ class WebService(Plugin): if not self.player.playlist: return history = list(self.history) + # In random play mode use complete playlist to filter if self.player.playmode.get('random'): history = self.player.playlist + history else: @@ -272,6 +274,7 @@ class WebService(Plugin): if not ret: self.log.warning('Got nothing from music library.') return [] + # In random play mode use complete playlist to filter if self.player.playmode.get('random'): queued_artists = MetaContainer([trk.Artist for trk in self.player.playlist]) else: @@ -326,16 +329,14 @@ class WebService(Plugin): album_to_queue = str() random.shuffle(albums_not_in_hist) for album in albums_not_in_hist: - tracks = self.player.find_album(artist, album) - # Look if one track of the album is already queued - # Good heuristic, at least enough to guess if the whole album is - # already queued. - if tracks[0] in self.player.queue: - self.log.debug('"%s" already queued, skipping!', tracks[0].album) + # Controls the album found is not already queued + if album in {t.album for t in self.player.queue}: + self.log.debug('"%s" already queued, skipping!', album) continue - if tracks[0] in self.player.playlist: - if self.player.playmode.get('random'): - self.log.debug('"%s" already in playlist, skipping!', tracks[0].album) + # In random play mode use complete playlist to filter + if self.player.playmode.get('random'): + if album in {t.album for t in self.player.playlist}: + self.log.debug('"%s" already in playlist, skipping!', album) continue album_to_queue = album if not album_to_queue: