From 7700666843bb3d39a78a3fb9f68b0c2b40987f7a Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 28 Nov 2025 21:17:23 +0000 Subject: [PATCH] Fix JSON parsing errors for empty API responses Added proper error handling for API endpoints that return empty or invalid JSON responses. This prevents JSONDecodeError exceptions when the StreamMaster API returns empty content. Changes: - Added empty response checking before JSON parsing in _get_api_data, _patch_api_data, and _post_api_data methods - Added try-except blocks to catch json.JSONDecodeError with helpful error messages - Return appropriate empty values ([] for GET, {} for PATCH/POST) when response is empty - Added debug logging to show response content when JSON parsing fails Fixes errors like: "Expecting value: line 1 column 1 (char 0)" when calling /api/channels/stream-groups/ and /api/channels/m3us/ endpoints --- Stream-Mapparr/plugin.py | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/Stream-Mapparr/plugin.py b/Stream-Mapparr/plugin.py index a5b4e5c..036f429 100644 --- a/Stream-Mapparr/plugin.py +++ b/Stream-Mapparr/plugin.py @@ -864,7 +864,18 @@ class Plugin: raise Exception(f"API endpoint not found: {endpoint}") response.raise_for_status() - json_data = response.json() + + # Check if response has content before trying to parse JSON + if not response.text or response.text.strip() == '': + logger.warning(f"[Stream-Mapparr] API returned empty response for {endpoint}") + return [] + + try: + json_data = response.json() + except json.JSONDecodeError as e: + logger.error(f"[Stream-Mapparr] Invalid JSON response for {endpoint}: {e}") + logger.debug(f"[Stream-Mapparr] Response content: {response.text[:200]}") + raise Exception(f"API returned invalid JSON: {e}") if isinstance(json_data, dict): return json_data.get('results', json_data) @@ -919,7 +930,18 @@ class Plugin: raise Exception(f"API endpoint not found: {endpoint}") response.raise_for_status() - return response.json() + + # Check if response has content before trying to parse JSON + if not response.text or response.text.strip() == '': + logger.warning(f"[Stream-Mapparr] API returned empty response for {endpoint}") + return {} + + try: + return response.json() + except json.JSONDecodeError as e: + logger.error(f"[Stream-Mapparr] Invalid JSON response for {endpoint}: {e}") + logger.debug(f"[Stream-Mapparr] Response content: {response.text[:200]}") + raise Exception(f"API returned invalid JSON: {e}") except requests.exceptions.RequestException as e: logger.error(f"[Stream-Mapparr] API PATCH request failed for {endpoint}: {e}") @@ -955,7 +977,18 @@ class Plugin: raise Exception(f"API endpoint not found: {endpoint}") response.raise_for_status() - return response.json() + + # Check if response has content before trying to parse JSON + if not response.text or response.text.strip() == '': + logger.warning(f"[Stream-Mapparr] API returned empty response for {endpoint}") + return {} + + try: + return response.json() + except json.JSONDecodeError as e: + logger.error(f"[Stream-Mapparr] Invalid JSON response for {endpoint}: {e}") + logger.debug(f"[Stream-Mapparr] Response content: {response.text[:200]}") + raise Exception(f"API returned invalid JSON: {e}") except requests.exceptions.RequestException as e: logger.error(f"[Stream-Mapparr] API POST request failed for {endpoint}: {e}")