X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Fclient.py;h=40842ba3fa4a46d1a2ecc22b4653420fe35d95a5;hb=7d13b99f3c51927b6f3f33686c3d2df77626e693;hp=c509109d05f1393b4e2296aecafefb4ecf713211;hpb=75611a590e62f82a6f2651ac176ff619052eaa89;p=mpd-sima.git diff --git a/sima/client.py b/sima/client.py index c509109..40842ba 100644 --- a/sima/client.py +++ b/sima/client.py @@ -62,7 +62,7 @@ def bl_artist(func): names = list() for art in result.names: if cls.database.get_bl_artist(art, add_not=True): - cls.log.debug('Blacklisted "{0}"'.format(art)) + cls.log.debug('Blacklisted "%s"', art) continue names.append(art) if not names: @@ -136,7 +136,6 @@ class PlayerClient(Player): "search", "sticker find",] track_obj = ['currentsong'] if self._comm in tracks_listing + track_obj: - # pylint: disable=star-args if isinstance(ans, list): return [Track(**track) for track in ans] elif isinstance(ans, dict): @@ -160,9 +159,9 @@ class PlayerClient(Player): self.log.info('Player: Initialising cache!') self._cache = {'artists': frozenset(), 'nombid_artists': frozenset(),} - self._cache['artists'] = frozenset(self._execute('list', ['artist'])) + self._cache['artists'] = frozenset(filter(None, self._execute('list', ['artist']))) if Artist.use_mbid: - self._cache['nombid_artists'] = frozenset(self._execute('list', ['artist', 'musicbrainz_artistid', ''])) + self._cache['nombid_artists'] = frozenset(filter(None, self._execute('list', ['artist', 'musicbrainz_artistid', '']))) @blacklist(track=True) def find_track(self, artist, title=None): @@ -173,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 @@ -199,8 +197,6 @@ class PlayerClient(Player): if exact_m: _ = [artist.add_alias(name) for name in exact_m] found = True - else: - artist = Artist(name=artist.name) # then complete with fuzzy search on artist with no musicbrainz_artistid if artist.mbid: # we already performed a lookup on artists with mbid set @@ -216,12 +212,13 @@ class PlayerClient(Player): # Does not perform fuzzy matching on short and single word strings # Only lowercased comparison if ' ' not in artist.name and len(artist.name) < 8: - for fuzz_art in match: + for close_art in match: # Regular lowered string comparison - if artist.name.lower() == fuzz_art.lower(): - artist.add_alias(fuzz_art) + if artist.name.lower() == close_art.lower(): + artist.add_alias(close_art) return artist - fzartist = SimaStr(artist.name) + else: + return for fuzz_art in match: # Regular lowered string comparison if artist.name.lower() == fuzz_art.lower(): @@ -231,7 +228,7 @@ class PlayerClient(Player): self.log.debug('"%s" matches "%s".', fuzz_art, artist) continue # SimaStr string __eq__ (not regular string comparison here) - if fzartist == fuzz_art: + if SimaStr(artist.name) == fuzz_art: found = True artist.add_alias(fuzz_art) self.log.info('"%s" quite probably matches "%s" (SimaStr)', @@ -250,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): @@ -287,7 +282,7 @@ class PlayerClient(Player): kwalbart = {'albumartist':name, 'artist':name} for album in self.list('album', 'albumartist', artist): if album and album not in albums: - albums.append(Album(name=album, **kwalbart)) #pylint: disable=star-args + albums.append(Album(name=album, **kwalbart)) for album in self.list('album', 'artist', artist): album_trks = [trk for trk in self.find('album', album)] if 'Various Artists' in [tr.albumartist for tr in album_trks]: @@ -340,6 +335,18 @@ class PlayerClient(Player): def state(self): return str(self.status().get('state')) + @property + def playmode(self): + plm = {'repeat': None, + 'single': None, + 'random': None, + 'consume': None, + } + for key, val in self.status().items(): + if key in plm.keys(): + plm.update({key:bool(int(val))}) + return plm + @property def current(self): return self.currentsong() @@ -379,18 +386,8 @@ class PlayerClient(Player): if password: try: self._client.password(password) - - # Catch errors with the password command (e.g., wrong password) - except CommandError as err: - raise PlayerError("Could not connect to '%s': " - "password command failed: %s" % - (host, err)) - - # Catch all other possible errors except (MPDError, IOError) as err: - raise PlayerError("Could not connect to '%s': " - "error with password command: %s" % - (host, err)) + raise PlayerError("Could not connect to '%s': %s", (host, err)) # Controls we have sufficient rights needed_cmds = ['status', 'stats', 'add', 'find', \ 'search', 'currentsong', 'ping']