186 lines
6.1 KiB
Python
186 lines
6.1 KiB
Python
#!/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"]]
|
|
|
|
valid_keys = [x for x in file_path_env_list if x in os.environ]
|
|
if not len(valid_keys):
|
|
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.\n" % x)
|
|
sys.exit(1)
|
|
|
|
env_paths = []
|
|
for env_path_key in valid_keys:
|
|
env_path = os.environ[env_path_key]
|
|
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()
|