suno task id -> song id 상태확인 변경 .

main
hbyang 2026-01-19 17:05:57 +09:00
parent 9a7c55de49
commit 2acf4e2cb6
3 changed files with 17 additions and 17 deletions

View File

@ -22,7 +22,7 @@ type GenerationStatus = 'idle' | 'generating_lyric' | 'generating_song' | 'polli
interface SavedGenerationState { interface SavedGenerationState {
taskId: string; taskId: string;
sunoTaskId: string; songId: string;
lyrics: string; lyrics: string;
status: GenerationStatus; status: GenerationStatus;
timestamp: number; timestamp: number;
@ -71,10 +71,10 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
const audioRef = useRef<HTMLAudioElement>(null); const audioRef = useRef<HTMLAudioElement>(null);
const languageDropdownRef = useRef<HTMLDivElement>(null); const languageDropdownRef = useRef<HTMLDivElement>(null);
const saveToStorage = (taskId: string, sunoTaskId: string, currentLyrics: string, currentStatus: GenerationStatus) => { const saveToStorage = (taskId: string, songId: string, currentLyrics: string, currentStatus: GenerationStatus) => {
const data: SavedGenerationState = { const data: SavedGenerationState = {
taskId, taskId,
sunoTaskId, songId,
lyrics: currentLyrics, lyrics: currentLyrics,
status: currentStatus, status: currentStatus,
timestamp: Date.now(), timestamp: Date.now(),
@ -114,7 +114,7 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
} }
setStatus('polling'); setStatus('polling');
setStatusMessage('노래를 생성하고 있습니다... (새로고침 후 복구됨)'); setStatusMessage('노래를 생성하고 있습니다... (새로고침 후 복구됨)');
resumePolling(savedState.taskId, savedState.sunoTaskId, savedState.lyrics, 0); resumePolling(savedState.taskId, savedState.songId, savedState.lyrics, 0);
} }
}, []); }, []);
@ -146,11 +146,11 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
} }
}, [videoGenerationStatus, songTaskId, onNext]); }, [videoGenerationStatus, songTaskId, onNext]);
const resumePolling = async (taskId: string, sunoTaskId: string, currentLyrics: string, currentRetryCount: number = 0) => { const resumePolling = async (taskId: string, songId: string, currentLyrics: string, currentRetryCount: number = 0) => {
try { try {
const downloadResponse = await waitForSongComplete( const downloadResponse = await waitForSongComplete(
taskId, taskId,
sunoTaskId, songId,
(pollStatus: string) => { (pollStatus: string) => {
if (pollStatus === 'pending') { if (pollStatus === 'pending') {
setStatusMessage('노래를 생성하고 있습니다...'); setStatusMessage('노래를 생성하고 있습니다...');
@ -221,8 +221,8 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
throw new Error(songResponse.error_message || '음악 생성 요청에 실패했습니다.'); throw new Error(songResponse.error_message || '음악 생성 요청에 실패했습니다.');
} }
saveToStorage(songResponse.task_id, songResponse.suno_task_id, currentLyrics, 'polling'); saveToStorage(songResponse.task_id, songResponse.song_id, currentLyrics, 'polling');
await resumePolling(songResponse.task_id, songResponse.suno_task_id, currentLyrics, currentRetryCount); await resumePolling(songResponse.task_id, songResponse.song_id, currentLyrics, currentRetryCount);
} catch (error) { } catch (error) {
console.error('Song regeneration failed:', error); console.error('Song regeneration failed:', error);
@ -396,9 +396,9 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
setStatus('polling'); setStatus('polling');
setStatusMessage('노래를 생성하고 있습니다...'); setStatusMessage('노래를 생성하고 있습니다...');
saveToStorage(songResponse.task_id, songResponse.suno_task_id, lyricDetailResponse.lyric_result, 'polling'); saveToStorage(songResponse.task_id, songResponse.song_id, lyricDetailResponse.lyric_result, 'polling');
await resumePolling(songResponse.task_id, songResponse.suno_task_id, lyricDetailResponse.lyric_result, 0); await resumePolling(songResponse.task_id, songResponse.song_id, lyricDetailResponse.lyric_result, 0);
} catch (error) { } catch (error) {
console.error('Music generation failed:', error); console.error('Music generation failed:', error);

View File

@ -78,7 +78,7 @@ export interface SongGenerateRequest {
export interface SongGenerateResponse { export interface SongGenerateResponse {
success: boolean; success: boolean;
task_id: string; task_id: string;
suno_task_id: string; song_id: string;
message: string; message: string;
error_message: string | null; error_message: string | null;
} }

View File

@ -150,9 +150,9 @@ export async function generateSong(taskId: string, request: SongGenerateRequest)
return response.json(); return response.json();
} }
// 노래 상태 확인 API (suno_task_id 사용) // 노래 상태 확인 API (song_id 사용)
export async function getSongStatus(sunoTaskId: string): Promise<SongStatusResponse> { export async function getSongStatus(songId: string): Promise<SongStatusResponse> {
const response = await fetch(`${API_URL}/song/status/${sunoTaskId}`, { const response = await fetch(`${API_URL}/song/status/${songId}`, {
method: 'GET', method: 'GET',
}); });
@ -182,7 +182,7 @@ const POLL_INTERVAL = 5000; // 5초
export async function waitForSongComplete( export async function waitForSongComplete(
taskId: string, taskId: string,
sunoTaskId: string, songId: string,
onStatusChange?: (status: string) => void onStatusChange?: (status: string) => void
): Promise<SongDownloadResponse> { ): Promise<SongDownloadResponse> {
const startTime = Date.now(); const startTime = Date.now();
@ -195,8 +195,8 @@ export async function waitForSongComplete(
} }
try { try {
// 상태 확인은 suno_task_id 사용 // 상태 확인은 song_id 사용
const statusResponse = await getSongStatus(sunoTaskId); const statusResponse = await getSongStatus(songId);
onStatusChange?.(statusResponse.status); onStatusChange?.(statusResponse.status);
// status가 "SUCCESS" (대문자)인 경우 완료 // status가 "SUCCESS" (대문자)인 경우 완료