# local import
from .lib.player import Player
from .lib.track import Track
+from .lib.meta import Album
from .lib.simastr import SimaStr
return decorated
class PlayerClient(Player):
- """MPC Client
+ """MPD Client
From python-musicpd:
_fetch_nothing …
_fetch_item single str
_fetch_songs list of dict, especially tracks
_fetch_plugins,
TODO: handle exception in command not going through _client_wrapper() (ie.
- find_aa, remove…)
+ remove…)
"""
database = None # sima database (history, blaclist)
wrapper = self._execute
return lambda *args: wrapper(command, args)
- def __del__(self):
- """Avoid hanging sockets"""
- self.disconnect()
-
def _execute(self, command, args):
self._write_command(command, args)
return self._client_wrapper()
return alb_art_search
return self.find('artist', artist, 'album', album)
- #@blacklist(album=True)
+ @blacklist(album=True)
def find_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
"""
- albums = set()
- albums.update(self.list('album', 'albumartist', artist))
+ albums = []
+ kwalbart = {'albumartist':artist, 'artist':artist}
+ for album in self.list('album', 'albumartist', artist):
+ if album not in albums:
+ albums.append(Album(name=album, **kwalbart))
for album in self.list('album', 'artist', artist):
arts = set([trk.artist for trk in self.find('album', album)])
- if len(arts) < 2:
- albums.add(album)
- else:
+ if len(arts) < 2: # TODO: better heuristic, use a ratio instead
+ if album not in albums:
+ albums.append(Album(name=album, albumartist=artist))
+ elif (album and album not in albums):
self.log.debug('"{0}" probably not an album of "{1}"'.format(
- album, artist) + '({0})'.format('/'.join(arts)))
- if albums:
- self.log.debug('Albums candidate: {0}'.format('/'.join(albums)))
+ album, artist) + '({0})'.format('/'.join(arts)))
return albums
def monitor(self):
def disconnect(self):
# Try to tell MPD we're closing the connection first
try:
+ self._client.noidle()
self._client.close()
# If that fails, don't worry, just ignore it and disconnect
except (MPDError, IOError):