major rework of ythdd.py, new method for setting config in ythdd_globals.py
- 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
This commit is contained in:
120
ythdd.py
120
ythdd.py
@@ -2,29 +2,56 @@
|
||||
from flask import Flask, render_template
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from markupsafe import escape
|
||||
#from argparse import ArgumentParser
|
||||
from ythdd_globals import config, colors
|
||||
from argparse import ArgumentParser
|
||||
from ythdd_globals import colors
|
||||
import requests, json, toml, time
|
||||
import views, downloader, ythdd_api, ythdd_globals, ythdd_db
|
||||
|
||||
ythdd_globals.starttime = int(time.time())
|
||||
ythdd_globals.apiRequests = 0
|
||||
ythdd_globals.apiFailedRequests = 0
|
||||
ythdd_globals.isProxied = config['general']['is_proxied']
|
||||
ythdd_globals.outsideApiHits = 0
|
||||
from flask_apscheduler import APScheduler
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{config['general']['db_file_path']}"
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||
app.add_url_rule('/', view_func=views.index)
|
||||
app.add_url_rule('/index.html', view_func=views.index)
|
||||
app.add_url_rule('/home', view_func=views.home)
|
||||
app.add_url_rule('/api/', view_func=ythdd_api.api_greeting)
|
||||
app.add_url_rule('/api/<path:received_request>', view_func=ythdd_api.api_global_catchall)
|
||||
db = ythdd_db.initDB(app)
|
||||
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
def setup():
|
||||
|
||||
# sanity check: make sure config is set
|
||||
# required to make `flask --app ythdd run --debug` work
|
||||
global config
|
||||
try:
|
||||
if not config['general']:
|
||||
ythdd_globals.setConfig(ythdd_globals.configfile)
|
||||
config = ythdd_globals.config
|
||||
except:
|
||||
ythdd_globals.setConfig(ythdd_globals.configfile)
|
||||
config = ythdd_globals.config
|
||||
|
||||
# setting all the variables
|
||||
ythdd_globals.starttime = int(time.time())
|
||||
ythdd_globals.realUptime = 0
|
||||
ythdd_globals.apiRequests = 0
|
||||
ythdd_globals.apiFailedRequests = 0
|
||||
ythdd_globals.isProxied = config['general']['is_proxied']
|
||||
ythdd_globals.outsideApiHits = 0
|
||||
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{config['general']['db_file_path']}"
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||
app.add_url_rule('/', view_func=views.index)
|
||||
app.add_url_rule('/index.html', view_func=views.index)
|
||||
app.add_url_rule('/home', view_func=views.home)
|
||||
app.add_url_rule('/api/', view_func=ythdd_api.api_greeting)
|
||||
app.add_url_rule('/api/<path:received_request>', view_func=ythdd_api.api_global_catchall)
|
||||
db = ythdd_db.initDB(app, config)
|
||||
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
|
||||
# job scheduler for repetetive tasks
|
||||
scheduler = APScheduler()
|
||||
scheduler.add_job(func=every5seconds, trigger='interval', id='job', seconds=5)
|
||||
scheduler.start()
|
||||
|
||||
# gets called every 5 seconds
|
||||
def every5seconds():
|
||||
# update the "real" uptime counter
|
||||
ythdd_globals.realUptime += 5
|
||||
|
||||
@app.route('/<string:val>', methods=['GET'])
|
||||
def blank(val):
|
||||
@@ -32,23 +59,60 @@ def blank(val):
|
||||
#users = db.session.query(LocalUsers).all()
|
||||
#return users
|
||||
|
||||
def main():
|
||||
def main(args):
|
||||
print(f"{colors.BOLD + colors.HEADER}Welcome to ythdd ({ythdd_globals.version})!{colors.ENDC}")
|
||||
print(f"To run in development mode (to see changes updated live), use: {colors.OKCYAN}flask --app ythdd run --debug{colors.ENDC}.")
|
||||
print("To run locally, use IP 127.0.0.1. To run on all interfaces, use 0.0.0.0.\n")
|
||||
print("Enter hostname:port to run Flask app on [127.0.0.1:5000]:")
|
||||
try:
|
||||
host_port = input('> ').split(':')
|
||||
if host_port == ['']:
|
||||
host_port = ['127.0.0.1', '5000'] # defaults
|
||||
host = args.ip
|
||||
port = args.port
|
||||
if not host or not port:
|
||||
raise Exception
|
||||
except:
|
||||
print("Enter hostname:port to run Flask app on [127.0.0.1:5000]:")
|
||||
try:
|
||||
host_port = input('> ').split(':')
|
||||
if host_port == ['']:
|
||||
host_port = ['127.0.0.1', '5000'] # defaults
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print(" ...exiting gracefully."), quit() # handle Ctrl+C
|
||||
except KeyboardInterrupt:
|
||||
print(" ...exiting gracefully."), quit() # handle Ctrl+C
|
||||
|
||||
app.run(host=host_port[0], port=int(host_port[1]))
|
||||
host = host_port[0]
|
||||
port = host_port[1]
|
||||
|
||||
global config
|
||||
try:
|
||||
# if specified, use custom config file
|
||||
ythdd_globals.configfile = args.config
|
||||
ythdd_globals.setConfig(ythdd_globals.configfile)
|
||||
|
||||
except:
|
||||
# if not, use dummy file
|
||||
ythdd_globals.configfile = ""
|
||||
# but try to set the API secret if provided by the user
|
||||
if args.secret:
|
||||
ythdd_globals.randomly_generated_passcode = args.secret
|
||||
ythdd_globals.setConfig(ythdd_globals.configfile)
|
||||
|
||||
config = ythdd_globals.config
|
||||
|
||||
setup()
|
||||
app.run(host=host, port=int(port))
|
||||
|
||||
if __name__ == "__main__":
|
||||
#app.run(host="127.0.0.1", port=5000)
|
||||
#app.run(host="0.0.0.0", port=5000)
|
||||
# TODO: add argument parser to load config files, etc.
|
||||
main()
|
||||
parser = ArgumentParser(description='A basic yt_dlp-based script for video download.')
|
||||
|
||||
parser.add_argument("-i", "--ip", dest="ip", help="ip address/interface to bind to")
|
||||
parser.add_argument("-p", "--port", dest="port", help="port on which the flask web backend should be ran")
|
||||
parser.add_argument("-c", "--config", dest="config", help="path to TOML config file")
|
||||
parser.add_argument("-s", "--secret", dest="secret", help="admin's secret passcode for sensitive API access")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
main(args)
|
||||
|
||||
else:
|
||||
setup()
|
||||
Reference in New Issue
Block a user