From 9eb6726e3b52dcdca5acffc30c74bd1f47969a36 Mon Sep 17 00:00:00 2001 From: David Huss <dh@atoav.com> Date: Tue, 5 Nov 2024 16:23:46 +0100 Subject: [PATCH] Fix error in projector_connection decorator --- src/mediactl/devices/projector.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/mediactl/devices/projector.py b/src/mediactl/devices/projector.py index e38f424..d3a3de2 100644 --- a/src/mediactl/devices/projector.py +++ b/src/mediactl/devices/projector.py @@ -69,6 +69,8 @@ def projector_connection(endpoint: str, purpose: str, method: str = "post"): @wraps(func) async def async_wrapper(*args, **kwargs): self = args[0] + g = func.__globals__ + g.update(data=None) try: if method == "post": request_func = requests.post @@ -90,21 +92,28 @@ def projector_connection(endpoint: str, purpose: str, method: str = "post"): except requests.exceptions.ConnectionError: self.status["connection"] = ConnectionState.disconnected return Err(f"Request to {purpose} projector: Max tries exceeded") - data = response.json() + try: + d = response.json() + except requests.exceptions.JSONDecodeError as e: + print(f"When sending a {method}-request to {self.addr}/{endpoint} error just happened:") + print(f" {e}") + print(f" status: {response.status_code}") + print(repr(response)) + d = {} if method == "post": - if "result" not in data: + if "result" not in d: return Err( - f"Requested to {purpose} projector: No result in response: {data}" + f"Requested to {purpose} projector: No result in response: {d}" ) - elif data["result"] != "ok": + elif d["result"] != "ok": return Err( - f"Requested to {purpose} projector: projctl responded with Error: {data}" + f"Requested to {purpose} projector: projctl responded with Error: {d}" ) self.log_info( - f"Got a response, when {purpose} projector: {response.status_code}: {data}" + f"Got a response, when {purpose} projector: {response.status_code}: {d}" ) g = func.__globals__ - g.update(response=response) + g.update(data=d) return await func(*args, **kwargs) return async_wrapper @@ -121,7 +130,8 @@ class Projector(mediactl.WithLogger): @projector_connection(endpoint="status", purpose="get status", method="get") async def update_status(self) -> Result[dict, str]: - data = response.json() # noqa: F821 variable "response" set by decorator + global data + data = data # noqa: F821 variable "data" set by decorator self.status["connection"] = ConnectionState.connected self.status["power"] = PowerState(data["power"]["state"]) self.status["shutter"] = ShutterState(data["shutter"]["state"]) @@ -143,10 +153,10 @@ class Projector(mediactl.WithLogger): response = await self.update_status() if response.is_err(): self.log_error(response.err_value) + # Return previous status on error return self.status else: return response.unwrap() - return self.status @projector_connection(endpoint="power-on", purpose="power on") async def power_on(self) -> Result[None, str]: -- GitLab