X-Git-Url: http://git.kaliko.me/?a=blobdiff_plain;f=sima%2Futils%2Fconfig.py;h=20356a153492d8675531d1cd814f97ff90ebaf14;hb=e703692c1f6f2cbac143c19dac2fb5800be8b6ea;hp=d3bcbe293a1c529f10cf7fd3af04ea910cfa6eeb;hpb=23309f235879380a5ef7db3a51bda4d12e31902e;p=mpd-sima.git diff --git a/sima/utils/config.py b/sima/utils/config.py index d3bcbe2..20356a1 100644 --- a/sima/utils/config.py +++ b/sima/utils/config.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2009, 2010, 2011, 2013, 2014, 2015 Jack Kaliko +# Copyright (c) 2009-2015, 2019-2020 kaliko +# Copyright (c) 2019 sacha # # This file is part of sima # @@ -16,7 +17,7 @@ # You should have received a copy of the GNU General Public License # along with sima. If not, see . # -# +# pylint: disable=bad-continuation """ Deal with configuration and data files. @@ -29,7 +30,7 @@ import logging import sys from configparser import Error -from os import (access, makedirs, environ, stat, chmod, W_OK, R_OK) +from os import (access, makedirs, environ, stat, chmod, W_OK) from os.path import (join, isdir, isfile, dirname, exists) from stat import (S_IMODE, ST_MODE, S_IRWXO, S_IRWXG) @@ -46,15 +47,18 @@ DEFAULT_CONF = { 'port': 6600, }, 'sima': { - 'internal': "Crop, Lastfm, RandomFallBack", + 'internal': "Crop, Lastfm, Random", 'contrib': "", 'user_db': "false", 'history_duration': 8, 'queue_length': 2, 'var_dir': 'empty', 'musicbrainzid': "true", + 'repeat_disable_queue': "true", + 'single_disable_queue': "true", + 'mopidy_compat': "false", }, - 'daemon':{ + 'daemon': { 'daemon': False, 'pidfile': "", }, @@ -64,36 +68,38 @@ DEFAULT_CONF = { }, 'crop': { 'consume': 10, - }, - 'echonest': { - 'queue_mode': "track", #TODO control values - 'max_art': 15, - 'single_album': "false", - 'track_to_add': 1, - 'album_to_add': 1, - 'depth': 1, - 'priority': 100, + 'priority': 0, }, 'lastfm': { - 'queue_mode': "track", #TODO control values + 'queue_mode': "track", # TODO control values 'max_art': 10, 'single_album': "false", 'track_to_add': 1, 'album_to_add': 1, + 'shuffle_album': False, + 'track_to_add_from_album': 0, # <=0 means keep all 'depth': 1, 'cache': True, 'priority': 100, }, 'random': { - 'flavour': "sensible", # in pure, sensible + 'flavour': "sensible", # in pure, sensible 'track_to_add': 1, 'priority': 50, }, + 'tags': { + 'comment': "", + 'date': "", + 'genre': "", + 'label': "", + 'originaldate': "", + 'priority': 80, + } } # -class ConfMan(object): # CONFIG MANAGER CLASS +class ConfMan: # CONFIG MANAGER CLASS """ Configuration manager. Default configuration is stored in DEFAULT_CONF dictionnary. @@ -126,9 +132,16 @@ class ConfMan(object): # CONFIG MANAGER CLASS self.supersedes_config_with_cmd_line_options() # Controls files access self.control_facc() - # generate dbfile + # set dbfile self.config['sima']['db_file'] = join(self.config['sima']['var_dir'], 'sima.db') + # Create directories + data_dir = self.config['sima']['var_dir'] + if not isdir(data_dir): + self.log.trace('Creating "%s"', data_dir) + makedirs(data_dir) + chmod(data_dir, 0o700) + def control_facc(self): """Controls file access. This is relevant only for file provided through the configuration file @@ -136,26 +149,26 @@ class ConfMan(object): # CONFIG MANAGER CLASS argparse. """ ok = True - for op, ftochk in [('log', self.config['log']['logfile']), - ('pidfile', self.config['daemon']['pidfile']),]: + for op, ftochk in [('logfile', self.config.get('log', 'logfile')), + ('pidfile', self.config.get('daemon', 'pidfile')),]: if not ftochk: continue if isdir(ftochk): - self.log.critical('Need a file not a directory: "{}"'.format(ftochk)) + self.log.critical('Need a file not a directory: "%s"', ftochk) ok = False if not exists(ftochk): # Is parent directory writable then filedir = dirname(ftochk) if not access(filedir, W_OK): - self.log.critical('no write access to "{0}" ({1})'.format(filedir, op)) + self.log.critical('no write access to "%s" (%s)', filedir, op) ok = False else: if not access(ftochk, W_OK): - self.log.critical('no write access to "{0}" ({1})'.format(ftochk, op)) + self.log.critical('no write access to "%s" (%s)', ftochk, op) ok = False if not ok: if exists(self.conf_file): - self.log.warning('Try to check the configuration file: {}'.format(self.conf_file)) + self.log.warning('Try to check the configuration file: %s', self.conf_file) sys.exit(2) def control_mod(self): @@ -163,7 +176,7 @@ class ConfMan(object): # CONFIG MANAGER CLASS Controls conf file permissions. """ mode = S_IMODE(stat(self.conf_file)[ST_MODE]) - self.log.debug('file permission is: %o' % mode) + self.log.debug('file permission is: %o', mode) if mode & S_IRWXO or mode & S_IRWXG: self.log.warning('File is readable by "other" and/or' + ' "group" (actual permission %o octal).' % @@ -177,18 +190,24 @@ class ConfMan(object): # CONFIG MANAGER CLASS for opt in self.config.options(sec): if opt in list(self.startopt.keys()): self.config.set(sec, opt, str(self.startopt.get(opt))) + # honor MPD_HOST format as in mpc(1) for command line option --host + if self.startopt.get('host'): + if '@' in self.startopt.get('host'): + passwd, host = self.startopt.get('host').split('@') + self.config.set('MPD', 'password', passwd) + self.config.set('MPD', 'host', host) def use_envar(self): """Use MPD en.var. to set defaults""" mpd_host, mpd_port, passwd = utils.get_mpd_environ() if mpd_host: - self.log.info('Env. variable MPD_HOST set to "%s"' % mpd_host) + self.log.info('Env. variable MPD_HOST set to "%s"', mpd_host) self.config['MPD'].update(host=mpd_host) if passwd: self.log.info('Env. variable MPD_HOST contains password.') self.config['MPD'].update(password=passwd) if mpd_port: - self.log.info('Env. variable MPD_PORT set to "%s".' % mpd_port) + self.log.info('Env. variable MPD_PORT set to "%s".', mpd_port) self.config['MPD'].update(port=mpd_port) def init_config(self): @@ -205,14 +224,10 @@ class ConfMan(object): # CONFIG MANAGER CLASS elif homedir and isdir(homedir) and homedir not in ['/']: data_dir = join(homedir, '.local', 'share', DIRNAME) else: - self.log.error('Can\'t find a suitable location for data folder (XDG_DATA_HOME)') - self.log.error('Please use "--var_dir" to set a proper location') + self.log.critical('Can\'t find a suitable location for data folder (XDG_DATA_HOME)') + self.log.critical('Please use "--var-dir" to set a proper location') sys.exit(1) - if not isdir(data_dir): - makedirs(data_dir) - chmod(data_dir, 0o700) - if self.startopt.get('conf_file'): # No need to handle conf file location pass @@ -220,10 +235,6 @@ class ConfMan(object): # CONFIG MANAGER CLASS conf_dir = join(environ.get('XDG_CONFIG_HOME'), DIRNAME) elif homedir and isdir(homedir) and homedir not in ['/']: conf_dir = join(homedir, '.config', DIRNAME) - # Create conf_dir if necessary - if not isdir(conf_dir): - makedirs(conf_dir) - chmod(conf_dir, 0o700) self.conf_file = join(conf_dir, CONF_FILE) else: self.log.critical('Can\'t find a suitable location for config folder (XDG_CONFIG_HOME)') @@ -237,7 +248,7 @@ class ConfMan(object): # CONFIG MANAGER CLASS if not isfile(self.conf_file): return - self.log.info('Loading configuration from: %s' % self.conf_file) + self.log.info('Loading configuration from: %s', self.conf_file) self.control_mod() try: