{/* Logo */}
-

+
{/* Loading Spinner and Text */}
diff --git a/src/pages/Dashboard/SoundStudioContent.tsx b/src/pages/Dashboard/SoundStudioContent.tsx
index ac26b96..5740bed 100755
--- a/src/pages/Dashboard/SoundStudioContent.tsx
+++ b/src/pages/Dashboard/SoundStudioContent.tsx
@@ -1,6 +1,6 @@
import React, { useState, useRef, useEffect } from 'react';
-import { generateLyric, waitForLyricComplete, generateSong, waitForSongComplete } from '../../utils/api';
+import { generateLyric, waitForLyricComplete, generateSong, waitForSongComplete, getSongsList } from '../../utils/api';
import { LANGUAGE_MAP } from '../../types/api';
interface BusinessInfo {
@@ -105,8 +105,19 @@ const SoundStudioContent: React.FC
= ({
throw new Error(statusResponse.error_message || '음악 생성에 실패했습니다.');
}
- setAudioUrl(statusResponse.song_url);
- setSongTaskId(taskId);
+ // 노래 생성 완료 후 songs 목록에서 최신 task_id와 song_result_url 가져오기
+ const songsResponse = await getSongsList(1, 1);
+ if (songsResponse.items && songsResponse.items.length > 0) {
+ const latestSong = songsResponse.items[0];
+ setSongTaskId(latestSong.task_id);
+ // song_result_url을 사용하여 재생
+ setAudioUrl(latestSong.song_result_url);
+ } else {
+ // fallback: 기존 데이터 사용
+ setSongTaskId(taskId);
+ setAudioUrl(statusResponse.song_url);
+ }
+
setStatus('complete');
setStatusMessage('');
setRetryCount(0);
@@ -329,6 +340,15 @@ const SoundStudioContent: React.FC = ({
throw new Error(songResponse.error_message || '음악 생성 요청에 실패했습니다.');
}
+ // 디버깅: songResponse 확인
+ console.log('songResponse:', songResponse);
+ console.log('song_id:', songResponse.song_id);
+ console.log('task_id:', songResponse.task_id);
+
+ if (!songResponse.song_id) {
+ throw new Error('서버에서 song_id를 받지 못했습니다.');
+ }
+
setStatus('polling');
setStatusMessage('노래를 생성하고 있습니다...');
diff --git a/src/pages/Landing/WelcomeSection.tsx b/src/pages/Landing/WelcomeSection.tsx
index 9efe40c..a68b438 100755
--- a/src/pages/Landing/WelcomeSection.tsx
+++ b/src/pages/Landing/WelcomeSection.tsx
@@ -41,7 +41,7 @@ const WelcomeSection: React.FC = () => {
{/* Header */}
-
CASTAD에 오신 것을 환영합니다.
+
ADO2.AI에 오신 것을 환영합니다.
분석, 제작, 배포까지 콘텐츠 마케팅의 전과정을 자동화
diff --git a/src/pages/Login/LoginSection.tsx b/src/pages/Login/LoginSection.tsx
index ae259f2..d6acdd9 100755
--- a/src/pages/Login/LoginSection.tsx
+++ b/src/pages/Login/LoginSection.tsx
@@ -75,7 +75,7 @@ const LoginSection: React.FC = ({ onBack, onLogin }) => {
{/* Logo */}
-

+
{/* Error Message */}
diff --git a/src/types/api.ts b/src/types/api.ts
index f510014..1381215 100644
--- a/src/types/api.ts
+++ b/src/types/api.ts
@@ -213,3 +213,24 @@ export interface UserMeResponse {
profile_image: string | null;
created_at: string;
}
+
+// 노래 목록 아이템
+export interface SongListItem {
+ store_name: string;
+ region: string;
+ task_id: string;
+ language: string;
+ song_result_url: string;
+ created_at: string;
+}
+
+// 노래 목록 응답
+export interface SongsListResponse {
+ items: SongListItem[];
+ total: number;
+ page: number;
+ page_size: number;
+ total_pages: number;
+ has_next: boolean;
+ has_prev: boolean;
+}
diff --git a/src/utils/api.ts b/src/utils/api.ts
index 0cce6da..eb52f0b 100644
--- a/src/utils/api.ts
+++ b/src/utils/api.ts
@@ -8,6 +8,7 @@ import {
SongGenerateResponse,
SongStatusResponse,
SongDownloadResponse,
+ SongsListResponse,
VideoGenerateResponse,
VideoStatusResponse,
VideoDownloadResponse,
@@ -180,6 +181,19 @@ export async function downloadSong(taskId: string): Promise
{
+ const response = await fetch(`${API_URL}/songs/?page=${page}&page_size=${pageSize}`, {
+ method: 'GET',
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ return response.json();
+}
+
// 노래 생성 완료까지 폴링 (5분 타임아웃, 3초 간격)
// Suno API 상태: PENDING, processing, SUCCESS, TEXT_SUCCESS, failed, error
const SONG_POLL_TIMEOUT = 5 * 60 * 1000; // 5분