import requests, requests_cache from flask import Flask, Blueprint, request, Response from flask_login import current_user frontend = Blueprint('proxy', __name__) def app(): app = Flask(__name__) app.register_blueprint(frontend) return app # https://github.com/psf/requests/issues/5612 def silence_errors(generator): try: yield from generator except requests.exceptions.RequestException: return None @frontend.route("/videoplayback") def videoplayback(): fvip = request.args.get("fvip", "3") mn = request.args.get("mn", "").split(",")[-1] host = f"r{fvip}---{mn}.googlevideo.com" REQUEST_HEADERS_WHITELIST = { "accept", "accept-encoding", "cache-control", "range", } RESPONSE_HEADERS_WHITELIST = { "accept-ranges", "cache-control", "content-length", "content-range", "content-type", "expires", "x-content-type-options", } req_headers = { k:v for k,v in request.headers if k.lower() in REQUEST_HEADERS_WHITELIST } with requests_cache.disabled(): r = requests.get(f"https://{host}/videoplayback", request.args.to_dict(), headers=req_headers, stream=True) resp_headers = { k:v for k,v in r.headers.items() if k.lower() in RESPONSE_HEADERS_WHITELIST } response = Response(silence_errors(r.iter_content(chunk_size=8192)), status=r.status_code, headers=resp_headers) response.call_on_close(lambda: r.close()) return response if __name__ == '__main__': app().run(debug=True)