]> kaliko git repositories - mpd-sima.git/blobdiff - sima/client.py
Enhanced queuing behavior in random mode (Closes #16)
[mpd-sima.git] / sima / client.py
index 499250fccd2d04c01ad96fab717a9b5a79b6c13d..c04f560aece84c749a839e0aade0823f47493af4 100644 (file)
@@ -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:
@@ -132,11 +132,10 @@ class PlayerClient(Player):
         """
         # TODO: ain't working for "sticker find" and "sticker list"
         tracks_listing = ["playlistfind", "playlistid", "playlistinfo",
-                "playlistsearch", "plchanges", "listplaylistinfo", "find",
-                "search", "sticker find",]
+                          "playlistsearch", "plchanges", "listplaylistinfo", "find",
+                          "search", "sticker find",]
         track_obj = ['currentsong']
         if self._comm in tracks_listing + track_obj:
-            #  pylint: disable=w0142
             if isinstance(ans, list):
                 return [Track(**track) for track in ans]
             elif isinstance(ans, dict):
@@ -145,8 +144,8 @@ class PlayerClient(Player):
 
     def __skipped_track(self, old_curr):
         if (self.state == 'stop'
-            or not hasattr(old_curr, 'id')
-            or not hasattr(self.current, 'id')):
+                or not hasattr(old_curr, 'id')
+                or not hasattr(self.current, 'id')):
             return False
         return self.current.id != old_curr.id  # pylint: disable=no-member
 
@@ -158,13 +157,11 @@ class PlayerClient(Player):
             self.log.info('Player: Flushing cache!')
         else:
             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(),
+                       'nombid_artists': frozenset(),}
+        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):
@@ -199,7 +196,7 @@ class PlayerClient(Player):
             # look for exact search w/ musicbrainz_artistid
             exact_m = self._execute('list', ['artist', 'musicbrainz_artistid', artist.mbid])
             if exact_m:
-                [artist.add_alias(name) for name in exact_m]
+                _ = [artist.add_alias(name) for name in exact_m]
                 found = True
         else:
             artist = Artist(name=artist.name)
@@ -214,8 +211,7 @@ class PlayerClient(Player):
         if not match and not found:
             return
         if len(match) > 1:
-            self.log.debug('found close match for "%s": %s' %
-                           (artist, '/'.join(match)))
+            self.log.debug('found close match for "%s": %s', artist, '/'.join(match))
         # Does not perform fuzzy matching on short and single word strings
         # Only lowercased comparison
         if ' ' not in artist.name and len(artist.name) < 8:
@@ -231,17 +227,17 @@ class PlayerClient(Player):
                 found = True
                 artist.add_alias(fuzz_art)
                 if artist.name != fuzz_art:
-                    self.log.debug('"%s" matches "%s".' % (fuzz_art, artist))
+                    self.log.debug('"%s" matches "%s".', fuzz_art, artist)
                 continue
             # SimaStr string __eq__ (not regular string comparison here)
             if fzartist == fuzz_art:
                 found = True
                 artist.add_alias(fuzz_art)
-                self.log.info('"%s" quite probably matches "%s" (SimaStr)' %
-                              (fuzz_art, artist))
+                self.log.info('"%s" quite probably matches "%s" (SimaStr)',
+                              fuzz_art, artist)
         if found:
             if artist.aliases:
-                self.log.debug('Found: {}'.format('/'.join(list(artist.names)[:4])))
+                self.log.debug('Found: %s', '/'.join(list(artist.names)[:4]))
             return artist
 
     def fuzzy_find_track(self, artist, title):
@@ -258,11 +254,11 @@ class PlayerClient(Player):
             if leven == 1:
                 pass
             elif leven >= 0.79:  # PARAM
-                self.log.debug('title: "%s" should match "%s" (lr=%1.3f)' %
-                               (title_, title, leven))
+                self.log.debug('title: "%s" should match "%s" (lr=%1.3f)',
+                               title_, title, leven)
             else:
-                self.log.debug('title: "%s" does not match "%s" (lr=%1.3f)' %
-                               (title_, title, leven))
+                self.log.debug('title: "%s" does not match "%s" (lr=%1.3f)',
+                               title_, title, leven)
                 return []
             return self.find('artist', artist, 'title', title_)
 
@@ -286,7 +282,7 @@ class PlayerClient(Player):
         albums = []
         for name in artist.names:
             if len(artist.names) > 1:
-                self.log.debug('Searching album for aliase: "{}"'.format(name))
+                self.log.debug('Searching album for aliase: "%s"', name)
             kwalbart = {'albumartist':name, 'artist':name}
             for album in self.list('album', 'albumartist', artist):
                 if album and album not in albums:
@@ -294,7 +290,7 @@ class PlayerClient(Player):
             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]:
-                    self.log.debug('Discarding {0} ("Various Artists" set)'.format(album))
+                    self.log.debug('Discarding %s ("Various Artists" set)', album)
                     continue
                 arts = set([trk.artist for trk in album_trks])
                 if len(set(arts)) < 2:  # TODO: better heuristic, use a ratio instead
@@ -302,7 +298,7 @@ class PlayerClient(Player):
                         albums.append(Album(name=album, **kwalbart))
                 elif album and album not in albums:
                     self.log.debug('"{0}" probably not an album of "{1}"'.format(
-                                   album, artist) + '({0})'.format('/'.join(arts)))
+                        album, artist) + '({0})'.format('/'.join(arts)))
         return albums
 
     def monitor(self):
@@ -325,7 +321,7 @@ class PlayerClient(Player):
         if 'idle' in self._client._pending:
             self._client.noidle()
         elif self._client._pending:
-            self.log.warning('pending commands: {}'.format(self._client._pending))
+            self.log.warning('pending commands: %s', self._client._pending)
 
     def remove(self, position=0):
         self.delete(position)
@@ -343,6 +339,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()
@@ -382,18 +390,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']
@@ -410,10 +408,12 @@ class PlayerClient(Player):
         if Artist.use_mbid:
             if 'MUSICBRAINZ_ARTISTID' not in self._client.tagtypes():
                 self.log.warning('Use of MusicBrainzIdentifier is set but MPD is '
-                        'not providing related metadata')
+                                 'not providing related metadata')
                 self.log.info(self._client.tagtypes())
                 self.log.warning('Disabling MusicBrainzIdentifier')
                 Artist.use_mbid = False
+            else:
+                self.log.trace('Available metadata: %s', self._client.tagtypes())  # pylint: disable=no-member
         else:
             self.log.warning('Use of MusicBrainzIdentifier disabled!')
             self.log.info('Consider using MusicBrainzIdentifier for your music library')