]> kaliko git repositories - mpd-sima.git/commitdiff
Mainly use literal for list/dict and f-strings when possible
authorkaliko <kaliko@azylum.org>
Sat, 2 Oct 2021 13:23:04 +0000 (15:23 +0200)
committerkaliko <kaliko@azylum.org>
Sat, 2 Oct 2021 13:23:04 +0000 (15:23 +0200)
19 files changed:
sima/core.py
sima/launch.py
sima/lib/http.py
sima/lib/logger.py
sima/lib/meta.py
sima/lib/plugin.py
sima/lib/simadb.py
sima/lib/simafm.py
sima/lib/simastr.py
sima/lib/track.py
sima/lib/webserv.py
sima/mpdclient.py
sima/plugins/core/uniq.py
sima/plugins/internal/genre.py
sima/plugins/internal/tags.py
sima/utils/configtest.py
sima/utils/filelock.py
sima/utils/startopt.py
sima/utils/utils.py

index 50c9ff972306bd87b344e75ad9b17494577be462..badc7b20240701412d86ddeb92d1eb1eeebac6b3 100644 (file)
@@ -44,8 +44,8 @@ class Sima(Daemon):
         self.sdb = SimaDB(db_path=conf.get('sima', 'db_file'))
         PlayerClient.database = self.sdb
         self.log = getLogger('sima')
-        self._plugins = list()
-        self._core_plugins = list()
+        self._plugins = []
+        self._core_plugins = []
         self.player = PlayerClient(conf)  # MPD client
         self.short_history = deque(maxlen=60)
         self.changed = None
@@ -102,7 +102,7 @@ class Sima(Daemon):
         return False
 
     def queue(self):
-        to_add = list()
+        to_add = []
         for plugin in self.plugins:
             self.log.debug('callback_need_track: %s', plugin)
             pl_candidates = getattr(plugin, 'callback_need_track')()
index 7117f09f733c4f4acbb2c51634391af77266d47c..784d23784d480fd3323a210aa44ca93974b99641 100644 (file)
@@ -58,12 +58,12 @@ def load_plugins(sima, source):
     # TODO: Sanity check for "sima.config.get('sima', source)" ?
     for plugin in sima.config.get('sima', source).split(','):
         plugin = plugin.strip(' \n')
-        module = 'sima.plugins.{0}.{1}'.format(source, plugin.lower())
+        module = f'sima.plugins.{source}.{plugin.lower()}'
         try:
             mod_obj = sima_import(module, fromlist=[plugin])
         except ImportError as err:
-            logger.error('Failed to load "{}" plugin\'s module: '.format(plugin) +
-                         '{0} ({1})'.format(module, err))
+            logger.error(f'Failed to load "{plugin}" plugin\'s module: ' +
+                         f'{module} ({err})')
             sima.shutdown()
             sys.exit(1)
         try:
index a87398b5d46ed991911260c3f528dd0d192db79b..5014516e82cc228b06b421d2372a6f04eeb95f62 100644 (file)
@@ -58,7 +58,7 @@ class CacheController:
         """Normalize the URL to create a safe key for the cache"""
         (scheme, authority, path, query, _) = parse_uri(uri)
         if not scheme or not authority:
-            raise Exception("Only absolute URIs are allowed. uri = %s" % uri)
+            raise Exception(f'Only absolute URIs are allowed. uri = {uri}')
         authority = authority.lower()
         scheme = scheme.lower()
         if not path:
@@ -294,8 +294,7 @@ class HttpClient:
         try:
             return self.fetch_ws(req)
         except Timeout as err:
-            raise WSTimeout('Failed to reach server within {0}s'.format(
-                SOCKET_TIMEOUT)) from err
+            raise WSTimeout(f'Failed to reach server within {SOCKET_TIMEOUT}s') from err
         except HTTPConnectionError as err:
             raise WSError(err) from err
 
@@ -308,7 +307,7 @@ class HttpClient:
             self.stats.update(etag=self.stats.get('etag')+1)
             resp = self.controller.update_cached_response(prepreq, resp)
         elif resp.status_code != 200:
-            raise WSHTTPError('{0.status_code}: {0.reason}'.format(resp))
+            raise WSHTTPError(f'{resp.status_code}: {resp.reason}')
         self.controller.cache_response(resp.request, resp)
         return resp
 
index 75a8f65441fbed9c4fdc57a3baf9fad507a9a5ac..c2579260801a5b2fdf6ace16223b3f62498a4ee4 100644 (file)
@@ -78,7 +78,7 @@ def set_logger(level='info', logfile=None):
         if filehdl:
             logger.handlers = []
         # Add timestamp for file handler
-        log_format = '{0} {1}'.format('{asctime}', log_format)
+        log_format = f'{{asctime}} {log_format}'
         formatter = logging.Formatter(log_format, DATE_FMT, '{')
         # create file handler
         fileh = logging.FileHandler(logfile)
index af3e19c14e781622480de208954d1952f745ac08..ac5948ab82e1a5aef1cdf247578ee84dca3e2133 100644 (file)
@@ -147,7 +147,7 @@ class Meta:
             if callable(other.__str__) and other.__str__() != self.name:
                 self.__aliases |= {other.__str__()}
         else:
-            raise MetaException('No __str__ method found in {!r}'.format(other))
+            raise MetaException(f'No __str__ method found in {other!r}')
 
     @property
     def name(self):
index 2cc284ff1eb043e1a6a0e58b74bb940ffee14d88..86b755767dbf4b4d8505d542e81bcb739037a0aa 100644 (file)
@@ -41,7 +41,7 @@ class Plugin:
     def info(cls):
         """self documenting class method
         """
-        doc = 'Undocumented plugin! Fill "{}" docstring'.format(cls.__name__)
+        doc = f'Undocumented plugin! Fill "{cls.__name__}" docstring'
         if cls.__doc__:
             doc = cls.__doc__.strip(' \n').splitlines()[0]
         return {'name': cls.__name__,
@@ -166,7 +166,7 @@ class AdvancedPlugin(Plugin):
         :param Artist artist: Artist to fetch an album for
         :param bool unplayed: Fetch only unplayed album
         """
-        self.log.info('Searching an album for "%s"...' % artist)
+        self.log.info('Searching an album for "%s"...', artist)
         albums = self.player.search_albums(artist)
         if not albums:
             return None
@@ -176,7 +176,7 @@ class AdvancedPlugin(Plugin):
         albums_not_in_hist = [a for a in albums if a.name not in albums_hist]
         # Get to next artist if there are no unplayed albums
         if not albums_not_in_hist:
-            self.log.info('No unplayed album found for "%s"' % artist)
+            self.log.info('No unplayed album found for "%s"', artist)
             if unplayed:
                 return None
         random.shuffle(albums_not_in_hist)
index 7d92c6c7953d261ab3a6e11ca4e3a54f3b0869f4..dddf4eb430564019db2d8c41195d658554417c8b 100644 (file)
@@ -373,7 +373,7 @@ class SimaDB:
         :param sima.lib.track.Track track: track to use
         :param bool add: add non existing track to database"""
         if not track.file:
-            raise SimaDBError('Got a track with no file attribute: %r' % track)
+            raise SimaDBError(f'Got a track with no file attribute: {track}')
         if with_connection:
             connection = with_connection
         else:
@@ -489,7 +489,7 @@ class SimaDB:
                 LEFT OUTER JOIN albumartists ON tracks.albumartist = albumartists.id
                 WHERE history.last_play > ? AND albums.name NOT NULL AND artists.name NOT NULL
                 ORDER BY history.last_play DESC""", (date.isoformat(' '),))
-        hist = list()
+        hist = []
         for row in rows:
             vals = dict(row)
             if needle:  # Here use artist instead of albumartist
@@ -530,7 +530,7 @@ class SimaDB:
                 WHERE history.last_play > ? AND artists.name NOT NULL
                 ORDER BY history.last_play DESC""", (date.isoformat(' '),))
         last = deque(maxlen=1)
-        hist = list()
+        hist = []
         for row in rows:
             artist = Artist(**row)
             if last and last[0] == artist:  # remove consecutive dupes
@@ -567,7 +567,7 @@ class SimaDB:
                 WHERE history.last_play > ? AND genres.name NOT NULL
                 ORDER BY history.last_play DESC
                 """, (date.isoformat(' '),))
-        genres = list()
+        genres = []
         for row in rows:
             genres.append(row)
             if len({g[0] for g in genres}) >= limit:
@@ -612,7 +612,7 @@ class SimaDB:
         else:
             rows = connection.execute(sql+'ORDER BY history.last_play DESC',
                                       (date.isoformat(' '),))
-        hist = list()
+        hist = []
         for row in rows:
             hist.append(Track(**row))
         connection.close()
index bdfd02d0c3f50e5c866d727066521977d0b7650d..5103aceac9455a9ac5d8a39e8fc10f5812151b3f 100644 (file)
@@ -61,7 +61,7 @@ class SimaFM:
             code = ans.get('error')
             mess = ans.get('message')
             if code == 6:
-                raise WSNotFound('{0}: "{1}"'.format(mess, self.artist))
+                raise WSNotFound(f'{mess}: "{self.artist}"')
             raise WSError(mess)
         return True
 
@@ -76,10 +76,10 @@ class SimaFM:
         payload = payloads.get(method)
         payload.update(api_key=LFM.get('apikey'), format='json')
         if not isinstance(artist, Artist):
-            raise TypeError('"{0!r}" not an Artist object'.format(artist))
+            raise TypeError(f'"{artist!r}" not an Artist object')
         self.artist = artist
         if artist.mbid:
-            payload.update(mbid='{0}'.format(artist.mbid))
+            payload.update(mbid=f'{artist.mbid}')
         else:
             payload.update(artist=artist.name,
                            autocorrect=1)
index f3e77ee0a34d89f4dc6519ef250b2cb8b0a05c2f..ec82d91510bd57c724e829ff968ff34bb9e27e3e 100644 (file)
@@ -81,7 +81,7 @@ class SimaStr(str):
     """
     diafilter = True
     leven_ratio = 0.82
-    regexp_dict = dict()
+    regexp_dict = {}
 
     # Leading patterns: The Le Les
     # case-insensitive matching for this RE
index a9003dabbe1ef2599d947cb9480d308a95460c7d..2df220cc849811e48ac95e342302f4a7257cbdf5 100644 (file)
@@ -54,7 +54,7 @@ class Track:
                                  'musicbrainz_artistid',
                                  'musicbrainz_albumartistid']
         # Which tags have been collapsed?
-        self.collapsed_tags = list()
+        self.collapsed_tags = []
         # Needed for multiple tags which returns a list instead of a string
         self._collapse_tags()
 
index 10ed2b95bbc8cbbd672f38386f38fa3631b2279b..18414e7d2fd06d8edf7876e065b9c3c6bdf20b41 100644 (file)
@@ -81,8 +81,8 @@ class WebService(AdvancedPlugin):
             self.log.info('%s: Flushing cache!', name)
         else:
             self.log.info('%s: Initialising cache!', name)
-        self._cache = {'asearch': dict(),
-                       'tsearch': dict()}
+        self._cache = {'asearch': {},
+                       'tsearch': {}}
 
     def _cleanup_cache(self):
         """Avoid bloated cache
@@ -101,7 +101,7 @@ class WebService(AdvancedPlugin):
         dynamic = self.plugin_conf.getint('max_art')
         if dynamic <= 0:
             dynamic = 100
-        results = list()
+        results = []
         similarities.reverse()
         while (len(results) < dynamic and similarities):
             art_pop = similarities.pop()
@@ -156,8 +156,8 @@ class WebService(AdvancedPlugin):
             history = self.player.queue + history
         history = deque(history)
         last_trk = history.popleft()  # remove
-        extra_arts = list()
-        ret_extra = list()
+        extra_arts = []
+        ret_extra = []
         depth = 0
         while depth < self.plugin_conf.getint('depth'):
             if not history:
@@ -250,7 +250,7 @@ class WebService(AdvancedPlugin):
     def find_album(self, artists):
         """Find albums to queue.
         """
-        to_add = list()
+        to_add = []
         nb_album_add = 0
         target_album_to_add = self.plugin_conf.getint('album_to_add')
         for artist in artists:
@@ -277,7 +277,7 @@ class WebService(AdvancedPlugin):
         """
         find top tracks for artists in artists list.
         """
-        to_add = list()
+        to_add = []
         nbtracks_target = self.plugin_conf.getint('track_to_add')
         for artist in artists:
             if len(to_add) == nbtracks_target:
@@ -285,7 +285,7 @@ class WebService(AdvancedPlugin):
             self.log.info('Looking for a top track for %s', artist)
             titles = deque()
             try:
-                titles = [t for t in self.ws.get_toptrack(artist)]
+                titles = list(self.ws.get_toptrack(artist))
             except WSError as err:
                 self.log.warning('%s: %s', self.ws.name, err)
                 continue
@@ -353,7 +353,7 @@ class WebService(AdvancedPlugin):
             self.log.debug(repr(self.player.current))
             return None
         candidates = self.queue_mode()
-        msg = ' '.join(['{0}: {1:>3d}'.format(k, v) for
+        msg = ' '.join([f'{k}: {v:>3d}' for
                         k, v in sorted(self.ws.stats.items())])
         self.log.debug('http stats: ' + msg)
         if not candidates:
index c2daae361b6ad20e96e42d4104b7faa60614bb24..e2f0e2c4566f19055ebab35da270381a930cdd7c 100644 (file)
@@ -148,28 +148,25 @@ class MPD(MPDClient):
             super().connect(host, port)
         # Catch socket errors
         except OSError as err:
-            raise PlayerError('Could not connect to "%s:%s": %s' %
-                              (host, port, err.strerror)) from err
+            raise PlayerError(f'Could not connect to "{host}:{port}": {err.strerror}'
+                             ) from err
         # Catch all other possible errors
         # ConnectionError and ProtocolError are always fatal.  Others may not
         # be, but we don't know how to handle them here, so treat them as if
         # they are instead of ignoring them.
         except MPDError as err:
-            raise PlayerError('Could not connect to "%s:%s": %s' %
-                              (host, port, err)) from err
+            raise PlayerError(f'Could not connect to "{host}:{port}": {err}') from err
         if password:
             try:
                 self.password(password)
             except (MPDError, OSError) as err:
-                raise PlayerError("Could not connect to '%s': %s" % (host, err)) from err
+                raise PlayerError(f"Could not connect to '{host}': {err}") from err
         # Controls we have sufficient rights
         available_cmd = self.commands()
         for cmd in MPD.needed_cmds:
             if cmd not in available_cmd:
                 self.disconnect()
-                raise PlayerError('Could connect to "%s", '
-                                  'but command "%s" not available' %
-                                  (host, cmd))
+                raise PlayerError(f'Could connect to "{host}", but command "{cmd}" not available')
         self.tagtypes('clear')
         for tag in MPD.needed_tags:
             self.tagtypes('enable', tag)
@@ -294,7 +291,7 @@ class MPD(MPDClient):
         plm = {'repeat': None, 'single': None,
                'random': None, 'consume': None, }
         for key, val in self.status().items():
-            if key in plm.keys():
+            if key in plm:
                 plm.update({key: bool(int(val))})
         return plm
 
index 1ad50f7d889781afbf691dbb35f38a66b6ee79d0..a46d7fc7e736f79b3fb5888d8bb2e8eb890c9c4b 100644 (file)
@@ -70,7 +70,7 @@ class Uniq(Plugin):
             self.log.warning(' '.join(channels))
 
     def sub_chan(self):
-        self.chan = 'mpd_sima:{0}.{1}'.format(getfqdn(), getpid())
+        self.chan = f'mpd_sima:{getfqdn()}.{getpid()}'
         self.log.debug('Registering as %s', self.chan)
         try:
             self.player.subscribe(self.chan)
index 713ee35eaa37fee3210e71704345149b9f3c111f..1202f89716ca7e064289e1e796f8236c7bae8d7f 100644 (file)
@@ -106,7 +106,7 @@ class Genre(AdvancedPlugin):
             if not trk:
                 continue
             if queue_mode == 'track':
-                self.log.info('Genre plugin chose: {}'.format(trk))
+                self.log.info('Genre plugin chose: %s', trk)
                 candidates.append(trk)
                 if len(candidates) == target:
                     break
index c891b779893f50f232d3d3b2bfab7f6d8e151b37..32021a1c7526efa50613e999cb8b493fe465fe33 100644 (file)
@@ -143,7 +143,7 @@ class Tags(AdvancedPlugin):
             if not trk:
                 continue
             if queue_mode == 'track':
-                self.log.info('Tags plugin chose: {}'.format(trk))
+                self.log.info('Tags plugin chose: %s', trk)
                 candidates.append(trk)
                 if len(candidates) == target:
                     break
index ef91241b86a357b1165966224408b14ad1f50123..a726d170fc4bb7a75cae2396cd018302d9149893 100644 (file)
@@ -24,7 +24,7 @@ def tags_config_test(cli, config):
         res = cli.find(filt, 'window', (0, 300))
     except PlayerError as err:
         cli.disconnect()
-        print('filter error: %s' % err, file=sys.stderr)
+        print(f'filter error: {err}', file=sys.stderr)
         sys.exit(1)
     artists = list({trk.albumartist for trk in res if trk.albumartist})
     if not artists:
index 81f9d3c5c14b81988168eb02c0edc9ff024c6359..b5c51b6765f17d2f247693529157e07c09bc7aab 100644 (file)
@@ -47,7 +47,7 @@ class FileLock:
         self.filedsc = None
         self.is_locked = False
         dirname = os.path.dirname(file_name)
-        self.lockfile = os.path.join(dirname, '{0}.lock'.format(file_name))
+        self.lockfile = os.path.join(dirname, 'f{file_name}.lock')
         self.file_name = file_name
         self.timeout = timeout
         self.delay = delay
index f3499d13590348ce15b724a65268d3033510ee1b..bfee3f124876f39a379abfad069af7db72958860 100644 (file)
@@ -124,7 +124,7 @@ class StartOpt:
     def __init__(self, script_info,):
         self.parser = None
         self.info = dict(script_info)
-        self.options = dict()
+        self.options = {}
         self.main()
 
     def declare_opts(self):
@@ -143,14 +143,14 @@ class StartOpt:
             opt_names = opt.pop('sw')
             self.parser.add_argument(*opt_names, **opt)
         # Add sub commands
-        sp = self.parser.add_subparsers(
+        spa = self.parser.add_subparsers(
                 title=f'{self.info["prog"]} commands as positional arguments',
                 description=f"""Use them after optionnal arguments.\n"{self.info["prog"]} command -h" for more info.""",
                 metavar='', dest='command')
         for cmd in CMDS:
             helpmsg = cmd.pop('help')
             cmd, args = cmd.popitem()
-            _ = sp.add_parser(cmd, description=helpmsg, help=helpmsg)
+            _ = spa.add_parser(cmd, description=helpmsg, help=helpmsg)
             for arg in args:
                 name = arg.pop('name', None)
                 if name:
index cc81f61643153ffec7d9c56b325fb74c2f27bd2f..c148892d5276d7a4e684b795a28ac50b1bbbe971 100644 (file)
@@ -131,16 +131,16 @@ class Wfile(FileAction):
     """
     def checks(self):
         if isdir(self._file):
-            self.parser.error('need a file not a directory: {}'.format(self._file))
+            self.parser.error(f'need a file not a directory: {self._file}')
         if not exists(self._dir):
-            self.parser.error('directory does not exist: {0}'.format(self._dir))
+            self.parser.error(f'directory does not exist: {self._dir}')
         if not exists(self._file):
             # Is parent directory writable then
             if not access(self._dir, W_OK):
-                self.parser.error('no write access to "{0}"'.format(self._dir))
+                self.parser.error(f'no write access to "{self._dir}"')
         else:
             if not access(self._file, W_OK):
-                self.parser.error('no write access to "{0}"'.format(self._file))
+                self.parser.error(f'no write access to "{self._file}"')
 
 
 class Rfile(FileAction):
@@ -149,11 +149,11 @@ class Rfile(FileAction):
     """
     def checks(self):
         if not exists(self._file):
-            self.parser.error('file does not exist: {0}'.format(self._file))
+            self.parser.error(f'file does not exist: {self._file}')
         if not isfile(self._file):
-            self.parser.error('not a file: {0}'.format(self._file))
+            self.parser.error(f'not a file: {self._file}')
         if not access(self._file, R_OK):
-            self.parser.error('no read access to "{0}"'.format(self._file))
+            self.parser.error(f'no read access to "{self._file}"')
 
 
 class Wdir(FileAction):
@@ -162,11 +162,11 @@ class Wdir(FileAction):
     """
     def checks(self):
         if not exists(self._file):
-            self.parser.error('directory does not exist: {0}'.format(self._file))
+            self.parser.error(f'directory does not exist: {self._file}')
         if not isdir(self._file):
-            self.parser.error('not a directory: {0}'.format(self._file))
+            self.parser.error(f'not a directory: {self._file}')
         if not access(self._file, W_OK):
-            self.parser.error('no write access to "{0}"'.format(self._file))
+            self.parser.error(f'no write access to "{self._file}"')
 
 
 class Throttle: