70 lines
3.4 KiB
Python
70 lines
3.4 KiB
Python
#!/usr/bin/python3
|
|
from flask import Response, request
|
|
from markupsafe import escape
|
|
from ythdd_globals import colors as c
|
|
import requests, time, json
|
|
import ythdd_globals
|
|
import ythdd_api_v1, ythdd_inv_tl
|
|
import traceback
|
|
|
|
def api_greeting():
|
|
string = {'status': 200, 'msg': f"ok (ythdd {ythdd_globals.version})", 'latest_api': f"v{ythdd_globals.apiVersion}"}
|
|
string = json.dumps(string)
|
|
return Response(string, mimetype='application/json')
|
|
|
|
def api_global_catchall(received_request):
|
|
ythdd_globals.apiRequests += 1
|
|
if request.environ['REMOTE_ADDR'] != "127.0.0.1" or (ythdd_globals.isProxied and request.environ['X-Forwarded-For'] != "127.0.0.1"):
|
|
ythdd_globals.outsideApiHits += 1
|
|
|
|
request_list = received_request.split('/')
|
|
api_version = request_list[0]
|
|
if request_list[0] == 'v1':
|
|
# use v1 api
|
|
del request_list[0]
|
|
# if list is empty, aka /api/v1/, or /api/v1
|
|
if request_list == [''] or request_list == []:
|
|
#return api_greeting()
|
|
resp = api_greeting()
|
|
try:
|
|
status, received, data = ythdd_api_v1.lookup(request_list, request)
|
|
except Exception as e:
|
|
ythdd_globals.apiFailedRequests += 1
|
|
stripped_filename = __file__[max(__file__.rfind("/"), __file__.rfind("\\")) + 1:]
|
|
print(f"\n{c.FAIL}Error! /api/{received_request} -> {stripped_filename}:L{e.__traceback__.tb_lineno} -> {type(e).__name__}{c.ENDC}:"
|
|
+ f"{traceback.format_exc()}")
|
|
status, received, data = 500, f"internal server error: call ended in failure: {e}", []
|
|
if ythdd_globals.config["general"]["debug"]:
|
|
status, received, data = 500, f"internal server error: call ended in failure: {e} ({stripped_filename}:L{e.__traceback__.tb_lineno})", []
|
|
resp = Response(json.dumps({'status': status, 'msg': received, 'data': data}), mimetype='application/json', status=status)
|
|
elif request_list[0] == 'invidious':
|
|
# drop 'invidious' from the list
|
|
del request_list[0]
|
|
# for /api/invidious/ and /api/invidious
|
|
# show greeting from Invidious TL
|
|
#print(request_list) # for debugging purposes
|
|
if request_list == [''] or request_list == []:
|
|
#resp = ythdd_inv_tl.greeting()
|
|
status, response = ythdd_inv_tl.greeting()
|
|
return Response(response, status=status)
|
|
# if a path has been supplied try to get appropriate data
|
|
try:
|
|
# lookup and construct a response
|
|
resp = ythdd_inv_tl.lookup(request_list, request)
|
|
#print(resp) # for debugging purposes
|
|
# unless an error occurs
|
|
except Exception as e:
|
|
ythdd_globals.apiFailedRequests += 1
|
|
stripped_filename = __file__[max(__file__.rfind("/"), __file__.rfind("\\")) + 1:]
|
|
print(f"\n{c.FAIL}Error! /api/{received_request} -> {stripped_filename}:L{e.__traceback__.tb_lineno} -> {type(e).__name__}{c.ENDC}:"
|
|
+ f"{traceback.format_exc()}")
|
|
status, received, data = 500, f"internal server error: invidious translation call ended in failure: {e}", []
|
|
if ythdd_globals.config["general"]["debug"]:
|
|
status, received, data = 500, f"internal server error: invidious translation call ended in failure: {e} ({stripped_filename}:L{e.__traceback__.tb_lineno})", []
|
|
resp = Response(json.dumps({'status': status, 'msg': received, 'data': data}), mimetype='application/json', status=status)
|
|
else:
|
|
ythdd_globals.apiFailedRequests += 1
|
|
status, received, data = 405, f'error: unsupported api version: "{request_list[0]}". try: "v{ythdd_globals.apiVersion}".', []
|
|
resp = Response(json.dumps({'status': status, 'msg': received, 'data': data}), mimetype='application/json', status=status)
|
|
|
|
return resp |