def _load(files, defaults, overrides): parser = configparser.RawConfigParser() # TODO: simply return path to config file for defaults so we can load it # all in the same way? logger.info('Loading config from builtin defaults') for default in defaults: if isinstance(default, compat.text_type): default = default.encode('utf-8') parser.readfp(io.BytesIO(default)) # Load config from a series of config files files = [path.expand_path(f) for f in files] for name in files: if os.path.isdir(name): for filename in os.listdir(name): filename = os.path.join(name, filename) if os.path.isfile(filename) and filename.endswith('.conf'): _load_file(parser, filename) else: _load_file(parser, name) # If there have been parse errors there is a python bug that causes the # values to be lists, this little trick coerces these into strings. parser.readfp(io.BytesIO()) raw_config = {} for section in parser.sections(): raw_config[section] = dict(parser.items(section)) logger.info('Loading config from command line options') for section, key, value in overrides: raw_config.setdefault(section, {})[key] = value return raw_config
def _get_user_dirs(xdg_config_dir): """Returns a dict of XDG dirs read from ``$XDG_CONFIG_HOME/user-dirs.dirs``. This is used at import time for most users of :mod:`mopidy`. By rolling our own implementation instead of using :meth:`glib.get_user_special_dir` we make it possible for many extensions to run their test suites, which are importing parts of :mod:`mopidy`, in a virtualenv with global site-packages disabled, and thus no :mod:`glib` available. """ dirs_file = os.path.join(xdg_config_dir, b'user-dirs.dirs') if not os.path.exists(dirs_file): return {} with open(dirs_file, 'rb') as fh: data = fh.read().decode('utf-8') data = '[XDG_USER_DIRS]\n' + data data = data.replace('$HOME', os.path.expanduser('~')) data = data.replace('"', '') config = configparser.RawConfigParser() config.readfp(io.StringIO(data)) return { k.upper(): os.path.abspath(v) for k, v in config.items('XDG_USER_DIRS') if v is not None }
def parse_pls(data): # TODO: convert non URIs to file URIs. try: cp = configparser.RawConfigParser() cp.readfp(data) except configparser.Error: return for section in cp.sections(): if section.lower() != 'playlist': continue for i in range(cp.getint(section, 'numberofentries')): yield cp.get(section, 'file%d' % (i + 1))