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