insta
bluebamus 2025-12-22 18:53:26 +09:00
parent caf7b1ab60
commit c65a1dac74
2 changed files with 26 additions and 7 deletions

View File

@ -32,8 +32,18 @@ from app.utils.suno import SunoService
from config import prj_settings 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로 변환합니다.""" """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) code = result.get("code", 0)
data = result.get("data", {}) data = result.get("data", {})
@ -50,8 +60,9 @@ def _parse_suno_status_response(result: dict) -> PollingSongResponse:
status = data.get("status", "unknown") status = data.get("status", "unknown")
# 클립 데이터는 data.response.sunoData에 있음 (camelCase) # 클립 데이터는 data.response.sunoData에 있음 (camelCase)
response_data = data.get("response", {}) # data.get()이 None을 반환할 수 있으므로 or {}로 처리
clips_data = response_data.get("sunoData", []) response_data = data.get("response") or {}
clips_data = response_data.get("sunoData") or []
# 상태별 메시지 (Suno API는 다양한 상태값 반환) # 상태별 메시지 (Suno API는 다양한 상태값 반환)
status_messages = { status_messages = {
@ -200,13 +211,15 @@ async def get_song_status(
result = await suno_service.get_task_status(task_id) result = await suno_service.get_task_status(task_id)
return _parse_suno_status_response(result) return _parse_suno_status_response(result)
except Exception as e: except Exception as e:
import traceback
return PollingSongResponse( return PollingSongResponse(
success=False, success=False,
status="error", status="error",
message="상태 조회에 실패했습니다.", message="상태 조회에 실패했습니다.",
clips=None, clips=None,
raw_response=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) # 클립 데이터는 data.response.sunoData에 있음 (camelCase)
response_data = data.get("response", {}) # data.get()이 None을 반환할 수 있으므로 or {}로 처리
clips_data = response_data.get("sunoData", []) response_data = data.get("response") or {}
clips_data = response_data.get("sunoData") or []
if not clips_data: if not clips_data:
return DownloadSongResponse( return DownloadSongResponse(
success=False, success=False,

View File

@ -169,4 +169,9 @@ class SunoService:
timeout=30.0, timeout=30.0,
) )
response.raise_for_status() 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