- slightly modified config, api keys now have the value "CHANGEME" - requirements.txt has new dependency, flask apscheduler - ythdd.py has been reworked, support for argument parsing has been added, code is now split into functions - ythdd_api_v1.py features real uptime as well - ythdd_db.py is no longer dependent on ythdd_globals.py - ythdd_globals.py has a method for setting config and getting it from configfile variable
58 lines
3.0 KiB
Python
58 lines
3.0 KiB
Python
#!/usr/bin/python3
|
|
import time, toml, os
|
|
|
|
global starttime, apiRequests, apiFailedRequests, outsideApiHits, config, version, apiVersion, colors, realUptime
|
|
|
|
class colors:
|
|
HEADER = '\033[95m'
|
|
OKBLUE = '\033[94m'
|
|
OKCYAN = '\033[96m'
|
|
OKGREEN = '\033[92m'
|
|
WARNING = '\033[93m'
|
|
FAIL = '\033[91m'
|
|
ENDC = '\033[0m'
|
|
BOLD = '\033[1m'
|
|
UNDERLINE = '\033[4m'
|
|
ENDL = '\n'
|
|
|
|
def notImplemented(name):
|
|
return 501, f"not recognised/implemented: {name}", []
|
|
|
|
configfile = "config.toml"
|
|
version = "0.0.1"
|
|
apiVersion = "1"
|
|
randomly_generated_passcode = 0
|
|
|
|
def getConfig(configfile):
|
|
|
|
# this function is responsible for an unwanted warning when using --help without config.toml
|
|
# for now it's not worth it to account for that edge case.
|
|
global randomly_generated_passcode
|
|
|
|
if not os.path.exists(configfile):
|
|
dummy_config = {'general': {'db_file_path': 'ythdd_db.sqlite', 'video_storage_directory_path': 'videos/', 'is_proxied': False}, 'api': {'api_key': 'CHANGEME'}, 'extractor': {'user-agent': '', 'cookies_path': ''}, 'admin': {'admins': ['admin']}, 'yt_dlp': {}, 'postprocessing': {'presets': [{'name': 'recommended: [N][<=720p] best V+A', 'format': 'bv[height<=720]+ba', 'reencode': ''}, {'name': '[N][1080p] best V+A', 'format': 'bv[height=1080]+ba', 'reencode': ''}, {'name': '[R][1080p] webm', 'format': 'bv[height=1080]+ba', 'reencode': 'webm'}, {'name': '[N][720p] best V+A', 'format': 'bv[height=720]+ba', 'reencode': ''}, {'name': '[R][720p] webm', 'format': 'bv[height=720]+ba', 'reencode': 'webm'}, {'name': '[N][480p] best V+A', 'format': 'bv[height=480]+ba', 'reencode': ''}, {'name': '[480p] VP9 webm/reencode', 'format': 'bv*[height=480][ext=webm]+ba/bv[height=480]+ba', 'reencode': 'webm'}, {'name': '[N][1080p] best video only', 'format': 'bv[height=1080]', 'reencode': ''}, {'name': '[N][opus] best audio only', 'format': 'ba', 'reencode': 'opus'}]}}
|
|
# if a passcode has not been provided by the user (config file doesn't exist, and user didn't specify it using an argument)
|
|
print(f"{colors.WARNING}WARNING{colors.ENDC}: Using default, baked in config data. {colors.ENDL}"
|
|
f"Consider copying and editing the provided example file ({colors.OKCYAN}config.default.toml{colors.ENDC}).")
|
|
if randomly_generated_passcode == 0:
|
|
# generate a pseudorandom one and use it in the temporary config
|
|
randomly_generated_passcode = str(int(time.time() * 1337 % 899_999 + 100_000))
|
|
|
|
print(f"{colors.WARNING}WARNING{colors.ENDC}: Default config populated with one-time, insecure pseudorandom admin API key: {colors.OKCYAN}{randomly_generated_passcode}{colors.ENDC}."
|
|
f" {colors.ENDL}The admin API key is not the Flask debugger PIN. You need to provide a config file for persistence!{colors.ENDL}")
|
|
|
|
dummy_config['api']['api_key_admin'] = randomly_generated_passcode
|
|
return dummy_config
|
|
|
|
else:
|
|
return toml.load(configfile)
|
|
|
|
def setConfig(configfile):
|
|
global config
|
|
config = getConfig(configfile)
|
|
|
|
#setConfig(configfile)
|
|
config = {}
|
|
|
|
def getUptime():
|
|
return int(time.time()) - starttime |