From 91a37b2f1856141c4df92e66c5c0cec9c12ab3ff Mon Sep 17 00:00:00 2001 From: renjue Date: Sat, 9 May 2026 17:44:43 +0800 Subject: [PATCH] Fail fast when HDHive API returns business errors. Treat success=false responses from HDHive search/unlock endpoints as explicit service errors so missing API keys or auth issues are surfaced instead of silently returning empty resources. Co-authored-by: Cursor --- backend/adapters/hdhive_adapter.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/backend/adapters/hdhive_adapter.py b/backend/adapters/hdhive_adapter.py index e2386f2..2e2e603 100644 --- a/backend/adapters/hdhive_adapter.py +++ b/backend/adapters/hdhive_adapter.py @@ -1,5 +1,6 @@ from config import Config from http_client import request_json +from error_handling import AppServiceError, classify_http_error def _headers(): @@ -12,20 +13,42 @@ def _headers(): return headers +def _ensure_hdhive_success(response_data): + if not isinstance(response_data, dict): + return + success = response_data.get("success") + if success is not False: + return + + code = str(response_data.get("code") or "HDHIVE_API_ERROR") + message = response_data.get("message") or response_data.get("description") or "HDHIVE request failed" + category = classify_http_error(400, code) + raise AppServiceError( + message, + category=category, + code=code, + status=400, + provider="hdhive", + detail=response_data, + ) + + def search_resource(media_type, tmdb_id): url = f"{Config.HDHIVE_BASE_URL}/api/open/resources/{media_type}/{tmdb_id}" - return request_json( + result = request_json( url, headers=_headers(), max_retry=Config.MAX_RETRY, retry_delay_ms=Config.RETRY_DELAY_MS, provider="hdhive", ) + _ensure_hdhive_success(result.get("data")) + return result def unlock_link(slug): url = f"{Config.HDHIVE_BASE_URL}/api/open/resources/unlock" - return request_json( + result = request_json( url, method="POST", payload={"slug": slug}, @@ -34,6 +57,8 @@ def unlock_link(slug): retry_delay_ms=Config.RETRY_DELAY_MS, provider="hdhive", ) + _ensure_hdhive_success(result.get("data")) + return result def normalize_resource(search_data, unlock_data):