-# -* coding: utf-8 -*-
+# -*- coding: utf-8 -*-
+# Copyright (c) 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+#
+# This file is part of sima
+#
+# sima is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# sima is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with sima. If not, see <http://www.gnu.org/licenses/>.
+#
+#
"""MPD client for Sima
This client is built above python-musicpd a fork of python-mpd
# 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):