import os from flask import Flask, request import json import urllib.parse from yaml import load, dump from overseerrpy import Overseerr try: from yaml import CLoader as Loader, CDumper as Dumper except ImportError: from yaml import Loader, Dumper config = {} if os.path.exists("config.yaml"): config = load(open('config.yaml'), Loader=Loader) def get_config(key, default=None, ctor: callable = str, data=None): if data is None: global config data = config if key in data: return ctor(data[key]) subkeys = key.split('.') subkey = subkeys[0] if subkey in data: return get_config(".".join(subkeys[1:]), default=default, ctor=ctor, data=data[subkey]) return default app = Flask(__name__) overseerr = Overseerr(ssl=get_config("overseerr.ssl", False, bool), host=get_config("overseerr.host"), port=get_config("overseerr.port", 80, int), api_key=get_config('overseerr.api_key')) try: print(overseerr.test_connection()) except Exception as e: print(e) exit(1) @app.route('/') def hello_world(): # put application's code here return 'Hello World!' def get_providers(provider_list): distinct_providers = {} for provider in provider_list: if provider["iso_3166_1"] != "GB": continue for flatrate in provider["flatrate"]: distinct_providers[flatrate["id"]] = flatrate["name"] return distinct_providers @app.route("/overseerr", methods=['POST']) def overseerr_api(): data = request.json print(data) if data['notification_type'] != "MEDIA_PENDING": return "Notification type not supported" media = data['media'] media_type = media['media_type'] show_data = None show_id = int(media["tmdbId"]) if media_type == "tv": show_data = overseerr.get_tv_show(show_id) elif media_type == "movie": show_data = overseerr.get_movie(show_id) if show_data: providers = get_providers(show_data["watchProviders"]) media_request = data["request"] if len(providers) > 0: overseerr.update_request_status(int(media_request["request_id"]), "decline") msg = f"Request declined, \"{data['subject']}\" is available for streaming on the following providers:\n" for provider in providers.values(): msg += f"\t{provider}\n" print(msg) else: print(f"Request for \"{data['subject']}\" approved.") overseerr.update_request_status(int(media_request["request_id"]), "approve") return "Hello Overseerr!" if __name__ == '__main__': app.run(host=os.environ.get("SERVER_IP", "0.0.0.0"), port=int(os.environ.get("SERVER_PORT", 5000)))