From 318e29da85240da4c8631ddba98eced8160fc7a8 Mon Sep 17 00:00:00 2001 From: hygienic-books Date: Wed, 23 Mar 2022 13:13:14 +0100 Subject: [PATCH] Trigger a library update in Kodi --- kodi-nfo-feeder.py | 65 ++++++++++++++++++++++++++++++++++++++++++++++ requirements.in | 3 ++- requirements.txt | 12 ++++++++- 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/kodi-nfo-feeder.py b/kodi-nfo-feeder.py index 1f06061..572ba53 100644 --- a/kodi-nfo-feeder.py +++ b/kodi-nfo-feeder.py @@ -11,6 +11,8 @@ import inflect from inotify_simple import INotify, flags import lxml.etree import lxml.builder +import requests +from requests.auth import HTTPBasicAuth # TODO Create season subdir if it doesn't exist @@ -64,6 +66,7 @@ logging.basicConfig( log = logging.getLogger("rich") # Our own code logs with this level log.setLevel(logging.DEBUG) +logging.getLogger("urllib3.connectionpool").setLevel(logging.WARNING) install(show_locals=True) @@ -325,6 +328,68 @@ def write_nfo_to_disk( return True +def kodi_library_update( + csection_name: str, + config_obj: configparser.ConfigParser()) -> bool: + + kodi_jsonrpc_address = config_obj.get(csection_name, "kodi_jsonrpc_address") + kodi_jsonrpc_username = config_obj.get(csection_name, "kodi_jsonrpc_username") if \ + config.has_option(csection_name, "kodi_jsonrpc_username") else None + kodi_jsonrpc_password = config_obj.get(csection_name, "kodi_jsonrpc_password") if \ + config.has_option(csection_name, "kodi_jsonrpc_password") else None + + require_auth = False + if (kodi_jsonrpc_username and not kodi_jsonrpc_password) or \ + (not kodi_jsonrpc_username and kodi_jsonrpc_password): + log.warning(f"Please make sure that both a Kodi username /and/ and password are set via " + f"the 'kodi_jsonrpc_username' and 'kodi_jsonrpc_password' config options, respectively. " + f"If Kodi's web interface is configured to not require authentication please set " + f"both 'kodi_jsonrpc_username' and 'kodi_jsonrpc_password' to empty values (or simply remove " + f"both lines from the config file).\n" + f"Skipping Kodi video library reload ...") + return False + elif kodi_jsonrpc_username and kodi_jsonrpc_password: + require_auth = True + + json_payload_str = { + "jsonrpc": "2.0", + "method": "VideoLibrary.Scan", + "id": f"""{config_obj.get(csection_name, "self_name")}_trigger-vid-lib-scan""" + } + json_payload = json.dumps(json_payload_str) + req_header = {"content-type": "application/json"} + s = requests.Session() + req = requests.Request( + "POST", + kodi_jsonrpc_address, + data=json_payload, + auth=requests.auth.HTTPBasicAuth( + kodi_jsonrpc_username, + kodi_jsonrpc_password + ) if require_auth else None, + headers=req_header) + prepped = req.prepare() + newline = "\n" + log.debug(f"Triggering Kodi library update ...") + log.debug(f"Request method: {req.method}\n" + f"URL: {req.url}\n" + f"""{newline.join(f"Header '{header}': '{value}'" for header, value in list(req.headers.items()))}\n""" + f"Payload: {json_payload}") + try: + with s.send(prepped) as s: + got_json_response = s.content + if s.status_code == requests.codes.ok: + log.debug(f"Kodi library update successful") + return True + else: + log.error(f"Request failed, response code was {s.status_code}:\n" + f"{json.loads(got_json_response)}") + return False + except requests.exceptions.ConnectionError: + log.info(f"Kodi JSON-RPC endpoint {kodi_jsonrpc_address} is not currently connectable.") + return False + + if __name__ == '__main__': validate_default_section(config) if config_has_valid_section(config): diff --git a/requirements.in b/requirements.in index 331fe2c..c144a8d 100644 --- a/requirements.in +++ b/requirements.in @@ -1,4 +1,5 @@ rich inflect inotify_simple -lxml \ No newline at end of file +lxml +requests \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index fabb7ac..e71b497 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,8 +4,14 @@ # # pip-compile # +certifi==2021.10.8 + # via requests +charset-normalizer==2.0.12 + # via requests commonmark==0.9.1 # via rich +idna==3.3 + # via requests inflect==5.4.0 # via -r requirements.in inotify-simple==1.3.5 @@ -14,5 +20,9 @@ lxml==4.8.0 # via -r requirements.in pygments==2.11.2 # via rich -rich==12.0.0 +requests==2.27.1 # via -r requirements.in +rich==12.0.1 + # via -r requirements.in +urllib3==1.26.9 + # via requests