Overseerr-request-manager/app.py
2024-06-10 19:30:41 +01:00

95 lines
2.7 KiB
Python

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)))