added a default, file, and session dict to config

This commit is contained in:
nathom 2021-03-22 22:26:51 -07:00
parent ccb6bb8052
commit c79cbbd6f4

View file

@ -1,10 +1,12 @@
import copy
import logging import logging
import os import os
from pathlib import Path
from pprint import pformat from pprint import pformat
from ruamel.yaml import YAML from ruamel.yaml import YAML
from .constants import CONFIG_PATH, FOLDER_FORMAT, TRACK_FORMAT from .constants import CONFIG_PATH, DOWNLOADS_DIR, FOLDER_FORMAT, TRACK_FORMAT
from .exceptions import InvalidSourceError from .exceptions import InvalidSourceError
yaml = YAML() yaml = YAML()
@ -28,70 +30,65 @@ class Config:
This will update the config values based on command line args. This will update the config values based on command line args.
""" """
def __init__(self, path: str): defaults = {
"qobuz": {
# DEFAULTS
folder = "Downloads"
quality = 6
folder_format = FOLDER_FORMAT
track_format = TRACK_FORMAT
self.qobuz = {
"enabled": True, "enabled": True,
"email": None, "email": None,
"password": None, "password": None,
"app_id": "", # Avoid NoneType error "app_id": "", # Avoid NoneType error
"secrets": [], "secrets": [],
} },
self.tidal = {"enabled": True, "email": None, "password": None} "tidal": {"enabled": True, "email": None, "password": None},
self.deezer = {"enabled": True} "deezer": {"enabled": True},
self.downloads_database = None "downloads_database": None,
self.conversion = {"codec": None, "sampling_rate": None, "bit_depth": None} "conversion": {"codec": None, "sampling_rate": None, "bit_depth": None},
self.filters = { "filters": {
"no_extras": False, "no_extras": False,
"albums_only": False, "albums_only": False,
"no_features": False, "no_features": False,
"studio_albums": False, "studio_albums": False,
"remaster_only": False, "remaster_only": False,
} },
self.downloads = {"folder": folder, "quality": quality} "downloads": {"folder": DOWNLOADS_DIR, "quality": 7},
self.metadata = { "metadata": {
"embed_cover": True, "embed_cover": True,
"large_cover": False, "large_cover": False,
"default_comment": None, "default_comment": None,
"remove_extra_tags": False, "remove_extra_tags": False,
} },
self.path_format = {"folder": folder_format, "track": track_format} "path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT},
}
def __init__(self, path: str = None):
# to access settings loaded from yaml file
self.file = copy.deepcopy(self.defaults)
self.session = copy.deepcopy(self.defaults)
if path is None: if path is None:
self._path = CONFIG_PATH self._path = CONFIG_PATH
else: else:
self._path = path self._path = path
if not os.path.exists(self._path): if not os.path.isfile(self._path):
logger.debug(f"Creating yaml config file at {self._path}") logger.debug(f"Creating yaml config file at '{self._path}'")
self.dump(self.info) self.dump(self.defaults)
else: else:
# sometimes the file gets erased, this will reset it self.load_file()
with open(self._path) as f:
if f.read().strip() == "":
logger.debug(f"Config file {self._path} corrupted, resetting.")
self.dump(self.info)
else:
self.load()
def save(self): def save_file(self):
self.dump(self.info) self.dump(self.file)
def reset(self): def reset_file(self):
os.remove(self._path) self.dump(self.defaults)
# re initialize with default info
self.__init__(self._path)
def load(self): def load_file(self):
with open(self._path) as cfg: with open(self._path) as cfg:
for k, v in yaml.load(cfg).items(): for k, v in yaml.load(cfg).items():
setattr(self, k, v) self.file[k] = v
if hasattr(v, "copy"):
self.session[k] = v.copy()
else:
self.session[k] = v
logger.debug("Config loaded") logger.debug("Config loaded")
self.__loaded = True self.__loaded = True
@ -118,17 +115,17 @@ class Config:
@property @property
def tidal_creds(self): def tidal_creds(self):
return { return {
"email": self.tidal["email"], "email": self.file["tidal"]["email"],
"pwd": self.tidal["password"], "pwd": self.file["tidal"]["password"],
} }
@property @property
def qobuz_creds(self): def qobuz_creds(self):
return { return {
"email": self.qobuz["email"], "email": self.file["qobuz"]["email"],
"pwd": self.qobuz["password"], "pwd": self.file["qobuz"]["password"],
"app_id": self.qobuz["app_id"], "app_id": self.file["qobuz"]["app_id"],
"secrets": self.qobuz["secrets"], "secrets": self.file["qobuz"]["secrets"],
} }
def creds(self, source: str): def creds(self, source: str):
@ -141,20 +138,13 @@ class Config:
else: else:
raise InvalidSourceError(source) raise InvalidSourceError(source)
@property
def info(self):
return {k: v for k, v in self.__dict__.items() if not k.startswith("_")}
@info.setter
def info(self, val):
for k, v in val.items():
setattr(self, k, v)
def __getitem__(self, key): def __getitem__(self, key):
assert key in ("file", "defaults", "session")
return getattr(self, key) return getattr(self, key)
def __setitem__(self, key, val): def __setitem__(self, key, val):
assert key in ("file", "session")
setattr(self, key, val) setattr(self, key, val)
def __repr__(self): def __repr__(self):
return f"Config({pformat(self.info)})" return f"Config({pformat(self.session)})"