|
|
|
import json
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
|
|
|
from attrdict import AttrDict
|
|
|
|
|
|
|
|
config_path = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 'config.json')
|
|
|
|
base_config = {
|
|
|
|
'core': {
|
|
|
|
'debug': False
|
|
|
|
},
|
|
|
|
'trakt': {
|
|
|
|
'api_key': ''
|
|
|
|
},
|
|
|
|
'sonarr': {
|
|
|
|
'url': 'http://localhost:8989',
|
|
|
|
'api_key': '',
|
|
|
|
'profile': 'HD-1080p',
|
|
|
|
'root_folder': '/tv/',
|
|
|
|
'tags': {
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'radarr': {
|
|
|
|
'url': 'http://localhost:7878',
|
|
|
|
'api_key': '',
|
|
|
|
'profile': 'HD-1080p',
|
|
|
|
'root_folder': '/movies/'
|
|
|
|
},
|
|
|
|
'filters': {
|
|
|
|
'shows': {
|
|
|
|
'blacklisted_genres': ['animation', 'game-show', 'talk-show', 'home-and-garden', 'children', 'reality',
|
|
|
|
'anime', 'news', 'documentary', 'special-interest'],
|
|
|
|
'blacklisted_networks': ['twitch', 'youtube', 'nickelodeon', 'hallmark', 'reelzchannel', 'disney',
|
|
|
|
'cnn', 'cbbc', 'the movie network', 'teletoon', 'cartoon network', 'espn',
|
|
|
|
'yahoo!',
|
|
|
|
'fox sports'],
|
|
|
|
'allowed_countries': ['us', 'gb', 'ca'],
|
|
|
|
'blacklisted_min_runtime': 15,
|
|
|
|
'blacklisted_min_year': 2000,
|
|
|
|
'blacklisted_max_year': 2019,
|
|
|
|
'blacklisted_tvdb_ids': [],
|
|
|
|
},
|
|
|
|
'movies': {
|
|
|
|
'blacklisted_genres': ['documentary', 'music', 'animation'],
|
|
|
|
'blacklisted_min_runtime': 60,
|
|
|
|
'blacklisted_min_year': 2000,
|
|
|
|
'blacklisted_max_year': 2019,
|
|
|
|
'blacklist_title_keywords': ['untitled', 'barbie'],
|
|
|
|
'blacklisted_tmdb_ids': [],
|
|
|
|
'allowed_countries': ['us', 'gb', 'ca']
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'automatic': {
|
|
|
|
'movies': {
|
|
|
|
'interval': 24,
|
|
|
|
'anticipated': 10,
|
|
|
|
'trending': 2,
|
|
|
|
'popular': 3,
|
|
|
|
'boxoffice': 10
|
|
|
|
},
|
|
|
|
'shows': {
|
|
|
|
'interval': 72,
|
|
|
|
'anticipated': 10,
|
|
|
|
'trending': 2,
|
|
|
|
'popular': 1
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'notifications': {
|
|
|
|
'verbose': True
|
|
|
|
}
|
|
|
|
}
|
|
|
|
cfg = None
|
|
|
|
|
|
|
|
|
|
|
|
class AttrConfig(AttrDict):
|
|
|
|
"""
|
|
|
|
Simple AttrDict subclass to return None when requested attribute does not exist
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, config):
|
|
|
|
super().__init__(config)
|
|
|
|
|
|
|
|
def __getattr__(self, item):
|
|
|
|
try:
|
|
|
|
return super().__getattr__(item)
|
|
|
|
except AttributeError:
|
|
|
|
pass
|
|
|
|
# Default behaviour
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
def build_config():
|
|
|
|
if not os.path.exists(config_path):
|
|
|
|
print("Dumping default config to: %s" % config_path)
|
|
|
|
with open(config_path, 'w') as fp:
|
|
|
|
json.dump(base_config, fp, sort_keys=True, indent=2)
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def dump_config():
|
|
|
|
if os.path.exists(config_path):
|
|
|
|
with open(config_path, 'w') as fp:
|
|
|
|
json.dump(cfg, fp, sort_keys=True, indent=2)
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def load_config():
|
|
|
|
with open(config_path, 'r') as fp:
|
|
|
|
return AttrConfig(json.load(fp))
|
|
|
|
|
|
|
|
|
|
|
|
def upgrade_settings(defaults, current):
|
|
|
|
upgraded = False
|
|
|
|
res = current.copy()
|
|
|
|
for k, v in defaults.items():
|
|
|
|
if k not in current:
|
|
|
|
res[k] = v
|
|
|
|
upgraded = True
|
|
|
|
print("Added config option: %s" % k)
|
|
|
|
|
|
|
|
if hasattr(v, 'items'):
|
|
|
|
if k in current:
|
|
|
|
sub_upgrade, res[k] = upgrade_settings(v, current[k])
|
|
|
|
if sub_upgrade:
|
|
|
|
upgraded = True
|
|
|
|
else:
|
|
|
|
res[k] = v
|
|
|
|
upgraded = True
|
|
|
|
|
|
|
|
return upgraded, AttrConfig(res)
|
|
|
|
|
|
|
|
|
|
|
|
############################################################
|
|
|
|
# LOAD CFG
|
|
|
|
############################################################
|
|
|
|
|
|
|
|
# dump/load config
|
|
|
|
if build_config():
|
|
|
|
print("Please edit the default configuration before running again!")
|
|
|
|
sys.exit(0)
|
|
|
|
else:
|
|
|
|
tmp = load_config()
|
|
|
|
upgraded, cfg = upgrade_settings(base_config, tmp)
|
|
|
|
if upgraded:
|
|
|
|
dump_config()
|
|
|
|
print("New config options were added, adjust and restart!")
|
|
|
|
sys.exit(0)
|