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
This commit is contained in:
Claude
2025-11-28 21:17:23 +00:00
parent 6ba734fd5c
commit 7700666843

View File

@@ -864,7 +864,18 @@ class Plugin:
raise Exception(f"API endpoint not found: {endpoint}") raise Exception(f"API endpoint not found: {endpoint}")
response.raise_for_status() response.raise_for_status()
# 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() 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): if isinstance(json_data, dict):
return json_data.get('results', json_data) return json_data.get('results', json_data)
@@ -919,7 +930,18 @@ class Plugin:
raise Exception(f"API endpoint not found: {endpoint}") raise Exception(f"API endpoint not found: {endpoint}")
response.raise_for_status() response.raise_for_status()
# 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() 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: except requests.exceptions.RequestException as e:
logger.error(f"[Stream-Mapparr] API PATCH request failed for {endpoint}: {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}") raise Exception(f"API endpoint not found: {endpoint}")
response.raise_for_status() response.raise_for_status()
# 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() 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: except requests.exceptions.RequestException as e:
logger.error(f"[Stream-Mapparr] API POST request failed for {endpoint}: {e}") logger.error(f"[Stream-Mapparr] API POST request failed for {endpoint}: {e}")