]> kaliko git repositories - mpd-sima.git/blobdiff - sima/mpdclient.py
Fixing again MPD client album search
[mpd-sima.git] / sima / mpdclient.py
index 13aa0b01c3cca749c922d8cfc0f6ba61309b2e85..c2560ae9dc28c7b446f07ac0bde7d217983c4d92 100644 (file)
@@ -249,8 +249,10 @@ class MPD(MPDClient):
         if isinstance(payload, Track):
             super().__getattr__('add')(payload.file)
         elif isinstance(payload, list):
+            self.command_list_ok_begin()
             for tr in payload:  # TODO: use send command here
                 self.add(tr)
+            results = client.command_list_end()
         else:
             self.log.error('Cannot add %s', payload)
 
@@ -307,29 +309,28 @@ class MPD(MPDClient):
 
     def _find_art(self, artist):
         tracks = set()
-        if self.use_mbid and artist.mbid:
+        if artist.mbid:
             tracks |= set(self.find('musicbrainz_artistid', artist.mbid))
         for name in artist.names:
             tracks |= set(self.find('artist', name))
         return list(tracks)
 
     def _find_alb(self, album):
-        if album.mbid and self.use_mbid:
+        albums = []
+        if self.use_mbid and album.mbid:
             filt = f'(MUSICBRAINZ_ALBUMID == {album.mbid})'
-            return self.find(filt)
+            albums = self.find(filt)
         # Now look for album with no MusicBrainzIdentifier
-        if album.artist.mbid and self.use_mbid:  # Use album artist MBID if possible
+        if not albums and album.artist.mbid and self.use_mbid:  # Use album artist MBID if possible
             filt = f"((MUSICBRAINZ_ALBUMARTISTID == '{album.artist.mbid}') AND (album == '{album!s}'))"
-            return self.find(filt)
-        tracks = []
-        # Falls back to albumartist/album name
-        filt = f"((albumartist == '{album.artist!s}') AND (album == '{album!s}'))"
-        tracks = self.find(filt)
-        # Falls back to artist/album name
-        if not tracks:
+            albums = self.find(filt)
+        if not albums:  # Falls back to albumartist/album name
+            filt = f"((albumartist == '{album.artist!s}') AND (album == '{album!s}'))"
+            albums = self.find(filt)
+        if not albums:  # Falls back to artist/album name
             filt = f"((artist == '{album.artist!s}') AND (album == '{album!s}'))"
-            tracks = self.find(filt)
-        return tracks
+            albums = self.find(filt)
+        return albums
 # #### / find_tracks ##
 
 # #### Search Methods #####
@@ -344,13 +345,16 @@ class MPD(MPDClient):
 
         Returns an Artist object
         """
+        self.log.trace('Looking for "%r" in library', artist)
         found = False
         if self.use_mbid and artist.mbid:
             # look for exact search w/ musicbrainz_artistid
             exact_m = self.list('artist', f"(MUSICBRAINZ_ARTISTID == '{artist.mbid}')")
             if exact_m:
-                _ = [artist.add_alias(name) for name in exact_m]
                 found = True
+                # Looking for "Esthero" adds "DJ Krush feat. Esthero" to aliases
+                # This seems wrong, disables it for now
+                #_ = [artist.add_alias(name) for name in exact_m]
         # then complete with fuzzy search on artist with no musicbrainz_artistid
         if artist.mbid:
             # we already performed a lookup on artists with mbid set
@@ -437,10 +441,16 @@ class MPD(MPDClient):
                 if album and album not in albums:
                     albums.append(Album(name=album, **kwalbart))
             for album in self.list('album', 'artist', name):
+                if not album:  # list can return "" as an album
+                    continue
                 album_trks = self.find_tracks(Album(name=album, artist=Artist(name=name)))
+                album_artists = [tr.albumartist for tr in album_trks if tr.albumartist]
                 if 'Various Artists' in [tr.albumartist for tr in album_trks]:
                     self.log.debug('Discarding %s ("Various Artists" set)', album)
                     continue
+                if name not in album_artists:
+                    self.log.debug('Discarding "%s", "%s" not set as albumartist', album, name)
+                    continue
                 arts = {trk.artist for trk in album_trks}
                 # Avoid selecting album where artist is credited for a single
                 # track of the album