diff --git a/app/song/api/routers/v1/song.py b/app/song/api/routers/v1/song.py index deee8c1..9bc2154 100644 --- a/app/song/api/routers/v1/song.py +++ b/app/song/api/routers/v1/song.py @@ -32,8 +32,18 @@ from app.utils.suno import SunoService from config import prj_settings -def _parse_suno_status_response(result: dict) -> PollingSongResponse: +def _parse_suno_status_response(result: dict | None) -> PollingSongResponse: """Suno API 상태 응답을 파싱하여 PollingSongResponse로 변환합니다.""" + if result is None: + return PollingSongResponse( + success=False, + status="error", + message="Suno API 응답이 비어있습니다.", + clips=None, + raw_response=None, + error_message="Suno API returned None response", + ) + code = result.get("code", 0) data = result.get("data", {}) @@ -50,8 +60,9 @@ def _parse_suno_status_response(result: dict) -> PollingSongResponse: status = data.get("status", "unknown") # 클립 데이터는 data.response.sunoData에 있음 (camelCase) - response_data = data.get("response", {}) - clips_data = response_data.get("sunoData", []) + # data.get()이 None을 반환할 수 있으므로 or {}로 처리 + response_data = data.get("response") or {} + clips_data = response_data.get("sunoData") or [] # 상태별 메시지 (Suno API는 다양한 상태값 반환) status_messages = { @@ -200,13 +211,15 @@ async def get_song_status( result = await suno_service.get_task_status(task_id) return _parse_suno_status_response(result) except Exception as e: + import traceback + return PollingSongResponse( success=False, status="error", message="상태 조회에 실패했습니다.", clips=None, raw_response=None, - error_message=str(e), + error_message=f"{type(e).__name__}: {e}\n{traceback.format_exc()}", ) @@ -271,8 +284,9 @@ async def download_song( ) # 클립 데이터는 data.response.sunoData에 있음 (camelCase) - response_data = data.get("response", {}) - clips_data = response_data.get("sunoData", []) + # data.get()이 None을 반환할 수 있으므로 or {}로 처리 + response_data = data.get("response") or {} + clips_data = response_data.get("sunoData") or [] if not clips_data: return DownloadSongResponse( success=False, diff --git a/app/utils/suno.py b/app/utils/suno.py index 8b9c42f..7db79b8 100644 --- a/app/utils/suno.py +++ b/app/utils/suno.py @@ -169,4 +169,9 @@ class SunoService: timeout=30.0, ) response.raise_for_status() - return response.json() + data = response.json() + + if data is None: + raise ValueError("Suno API returned empty response for task status") + + return data