#!/usr/bin/python3 import os import sys import requests SCRIPT_PATH = os.path.realpath(__file__) SCRIPT_DIR = os.path.dirname(SCRIPT_PATH) """Edit here""" script_settings = { "tdarr": { "url": "http://tdarr-server1.ipa.dbb:8265", }, "logging": { "log_file": True, "log_file_path": os.path.join(SCRIPT_DIR, "debug.log"), "output_level": 1 } } """Dont't edit below""" expected_paths_env_variables = { "sonarr": { "Download": ["sonarr_episodefile_path", "sonarr_deletedpaths"] }, "radarr": { "Download": ["radarr_moviefile_path", "radarr_deletedpaths"] }, } def loggit(logtext, force_err=False): if script_settings["logging"]["log_file"]: with open(script_settings["logging"]["log_file_path"], 'a') as logwrite: logwrite.write(logtext) if script_settings["logging"]["output_level"] or force_err: sys.stderr.write(logtext) else: sys.stdout.write(logtext) def do_tdarr_inform(dbID, file_paths): # headers = {"content-type": "application/json"} payload = { "data": { "scanConfig": { "dbID": dbID, "arrayOrPath": file_paths, "mode": "scanFolderWatcher" } } } # response = requests.post("%s/api/v2/scan-files" % script_settings["tdarr"]["url"], json=payload, headers=headers) # loggit("Tdarr response: %s\n" % response.text) print(payload) def do_file_search(arr_file_path): payload = { "data": { "string": arr_file_path, "lessThanGB": 9999, "greaterThanGB": 0 } } headers = {"content-type": "application/json"} response = requests.post("%s/api/v2/search-db" % script_settings["tdarr"]["url"], json=payload, headers=headers) try: response_json = response.json() except Exception: return None if not len(response_json): return None dbIDs = [x["DB"] for x in response_json if "DB" in list(x.keys())] dbIDs = list(set(dbIDs)) if len(dbIDs) > 1: return None return dbIDs[0] def do_reverse_recursive_directory_search(arr_file_path): dbID = None arr_dir_path = os.path.dirname(arr_file_path) while arr_dir_path != os.path.abspath(os.sep) and not arr_dir_path.endswith(":\\"): arr_dir_path = os.path.dirname(arr_dir_path) dbID = do_file_search(arr_dir_path) if dbID: break return dbID def get_file_path_list(arr): file_path_env_list = expected_paths_env_variables[arr["type"]][arr["event_type"]] invalid_keys = [x for x in file_path_env_list if x not in os.environ] if len(invalid_keys): for x in invalid_keys: loggit("%s Environment variable was missing." % x, True) valid_keys = [x for x in file_path_env_list if x in os.environ] if not len(valid_keys): sys.exit(1) env_paths = [] for env_path_key in valid_keys: env_path = os.environ[x] if "|" in env_path: env_paths.extend(env_path.split("|")) else: env_paths.append(env_path) if not len(env_paths): loggit("No File paths retrieved fron Environment variables", True) sys.exit(1) arr["file_paths"] = env_paths return arr def main(): arr = {"type": None, "event_type": None, "file_paths": []} # Determine if called from Sonarr or Radarr # Else, exit if "sonarr_eventtype" in os.environ: arr["type"] = "sonarr" elif "radarr_eventtype" in os.environ: arr["type"] = "radarr" else: loggit("Could not Detect Radarr or Sonarr", True) sys.exit(0) # What event_type was recieved arr["event_type"] = os.environ["%s_eventtype" % arr["type"]] loggit("tdarr_inform Recieved %s Event from %s\n" % (arr["event_type"], arr["type"])) # Gracefuilly exit a Test Event if arr["event_type"] == "Test": loggit("Success!") sys.exit(0) # Only support certain event types with this script supported_event_types = list(expected_paths_env_variables[arr["type"]].keys()) if arr["event_type"] not in supported_event_types: loggit("%s %s is not a supported tdarr_inform Event." % (arr["type"], arr["event_type"]), True) sys.exit(1) # Obtain file_path list arr = get_file_path_list(arr) inform_dict = {} for file_path in arr["file_paths"]: loggit("Event Item: %s\n" % file_path) loggit("Searching tdarr API for item's library ID\n") dbID = do_file_search(file_path) if not dbID: loggit("No exact match found, searching for library ID from Reverse Recursive Directory matching\n") dbID = do_reverse_recursive_directory_search(file_path) if not dbID: loggit("No match found\n") else: if dbID not in list(inform_dict.keys()): inform_dict[dbID] = [] if file_path not in inform_dict[dbID]: inform_dict[dbID].append(file_path) if not len(inform_dict.keys()): loggit("No matches found, Exiting\n") sys.exit(1) loggit("Preparing payload to POST to tdarr API\n") for dbID in list(inform_dict.keys()): do_tdarr_inform(dbID, inform_dict[dbID]) if __name__ == "__main__": testdict = { "sonarr_eventtype": "Download", "sonarr_episodefile_path": "/Drivepool/Media/TV/Cartoons/Ben 10 (2016)/Season 2/Ben 10 (2016) - S02E31 - Chicken Nuggets of Wisdom.mkv" } for testkey in list(testdict.keys()): os.environ[testkey] = testdict[testkey] main()