X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Fmpdclient.py;h=ed2fbcdb37ec31bf93f3b9f497ad4612096bb2fa;hb=45e8a0624444617ee9e86fe4576d9bb4aedfbb8a;hp=97be9dabf0c3dddbb1e4e9bf8b743896b37c6cb1;hpb=54849baefbe39c4c0a09bd8ad27bde7743dac5ef;p=mpd-sima.git diff --git a/sima/mpdclient.py b/sima/mpdclient.py index 97be9da..ed2fbcd 100644 --- a/sima/mpdclient.py +++ b/sima/mpdclient.py @@ -44,7 +44,7 @@ def bl_artist(func): return func(*args, **kwargs) result = func(*args, **kwargs) if not result: - return + return None names = list() for art in result.names: if cls.database.get_bl_artist(art, add_not=True): @@ -52,27 +52,32 @@ def bl_artist(func): continue names.append(art) if not names: - return + return None resp = Artist(name=names.pop(), mbid=result.mbid) for name in names: resp.add_alias(name) return resp return wrapper + def tracks_wrapper(func): + """Convert plain track mapping as returned by MPDClient into :py:obj:Track + objects. This decorator accepts single track or list of tracks as input. + """ @wraps(func) def wrapper(*args, **kwargs): ret = func(*args, **kwargs) if isinstance(ret, dict): return Track(**ret) - elif isinstance(ret, list): - return [Track(**t) for t in ret] + return [Track(**t) for t in ret] return wrapper # / decorators + def blacklist(artist=False, album=False, track=False): - #pylint: disable=C0111,W0212 + # pylint: disable=C0111,W0212 field = (album, track) + def decorated(func): def wrapper(*args, **kwargs): if not args[0].database: @@ -110,7 +115,8 @@ class MPD(MPDClient): .. note:: - * find methods are looking for exact match of the object provided attributes in MPD music library + * find methods are looking for exact match of the object provided + attributes in MPD music library * search methods are looking for exact match + fuzzy match. """ needed_cmds = ['status', 'stats', 'add', 'find', @@ -132,11 +138,7 @@ class MPD(MPDClient): # ######### Overriding MPDClient ########### def __getattr__(self, cmd): """Wrapper around MPDClient calls for abstract overriding""" - track_wrapped = { - 'currentsong', - 'find', - 'playlistinfo', - } + track_wrapped = {'currentsong', 'find', 'playlistinfo', } if cmd in track_wrapped: return tracks_wrapper(super().__getattr__(cmd)) return super().__getattr__(cmd) @@ -170,7 +172,7 @@ class MPD(MPDClient): try: self.password(password) except (MPDError, IOError) as err: - raise PlayerError("Could not connect to '%s': %s", (host, err)) + raise PlayerError("Could not connect to '%s': %s" % (host, err)) # Controls we have sufficient rights available_cmd = self.commands() for cmd in MPD.needed_cmds: @@ -259,8 +261,7 @@ class MPD(MPDClient): super().__getattr__('add')(payload.file) elif isinstance(payload, list): self.command_list_ok_begin() - for tr in payload: - self.add(tr) + map(self.add, payload) self.command_list_end() else: self.log.error('Cannot add %s', payload) @@ -311,10 +312,11 @@ class MPD(MPDClient): """ if isinstance(what, Artist): return self._find_art(what) - elif isinstance(what, Album): + if isinstance(what, Album): return self._find_alb(what) - elif isinstance(what, str): + if isinstance(what, str): return self.find_tracks(Artist(name=what)) + raise PlayerError('Bad input argument') def _find_art(self, artist): tracks = set() @@ -329,15 +331,16 @@ class MPD(MPDClient): raise PlayerError('Album object have no artist attribute') albums = [] if self.use_mbid and album.mbid: - filt = f'(MUSICBRAINZ_ALBUMID == {album.mbid})' + filt = f"(MUSICBRAINZ_ALBUMID == '{album.mbid}')" albums = self.find(filt) # Now look for album with no MusicBrainzIdentifier 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.name_sz}'))" albums = self.find(filt) if not albums: # Falls back to (album)?artist/album name - filt = f"((albumartist == '{album.artist!s}') AND (album == '{album.name_sz}'))" - albums = self.find(filt) + for artist in album.artist.names_sz: + filt = f"((albumartist == '{artist}') AND (album == '{album.name_sz}'))" + albums.extend(self.find(filt)) return albums # #### / find_tracks ## @@ -347,7 +350,7 @@ class MPD(MPDClient): """ Search artists based on a fuzzy search in the media library >>> art = Artist(name='the beatles', mbid=) # mbid optional - >>> bea = player.search_artist(art)c + >>> bea = player.search_artist(art) >>> print(bea.names) >>> ['The Beatles', 'Beatles', 'the beatles']