diff --git a/app/video/api/routers/v1/video.py b/app/video/api/routers/v1/video.py index 4e004b3..f09e574 100644 --- a/app/video/api/routers/v1/video.py +++ b/app/video/api/routers/v1/video.py @@ -55,11 +55,11 @@ Creatomate API를 통해 영상 생성을 요청합니다. ## 요청 필드 - **orientation**: 영상 방향 (horizontal: 가로형, vertical: 세로형, 기본값: vertical) - 선택 - **image_urls**: 영상에 사용할 이미지 URL 목록 (필수) -- **lyrics**: 영상에 표시할 가사 (필수) -## 자동 조회 정보 -- **music_url**: Song 테이블에서 task_id 기준 가장 최근 생성된 노래의 song_result_url 사용 -- **duration**: Song 테이블에서 task_id 기준 가장 최근 생성된 노래의 duration 사용 +## 자동 조회 정보 (Song 테이블에서 task_id 기준 가장 최근 생성된 노래 사용) +- **music_url**: song_result_url 사용 +- **duration**: 노래의 duration 사용 +- **lyrics**: song_prompt (가사) 사용 ## 반환 정보 - **success**: 요청 성공 여부 @@ -82,8 +82,7 @@ POST /video/generate/019123ab-cdef-7890-abcd-ef1234567890 "https://naverbooking-phinf.pstatic.net/20240514_192/1715688031798MbFDj_JPEG/8.jpg", "https://naverbooking-phinf.pstatic.net/20240514_205/17156880318681JLwX_JPEG/9.jpg", "https://naverbooking-phinf.pstatic.net/20240514_142/1715688031946hhxHz_JPEG/10.jpg" - ], - "lyrics": "가사 내용..." + ] } ``` @@ -92,22 +91,21 @@ POST /video/generate/019123ab-cdef-7890-abcd-ef1234567890 POST /video/generate/019123ab-cdef-7890-abcd-ef1234567890 { "orientation": "horizontal", - "image_urls": [...], - "lyrics": "가사 내용..." + "image_urls": [...] } ``` ## 참고 -- 배경 음악(music_url)과 영상 길이(duration)는 task_id로 Song 테이블을 조회하여 자동으로 가져옵니다. +- 배경 음악(music_url), 영상 길이(duration), 가사(lyrics)는 task_id로 Song 테이블을 조회하여 자동으로 가져옵니다. - 같은 task_id로 여러 Song이 있을 경우 **가장 최근 생성된 노래**를 사용합니다. -- Song의 status가 completed이고 song_result_url이 있어야 영상 생성이 가능합니다. +- Song의 song_result_url과 song_prompt가 있어야 영상 생성이 가능합니다. - creatomate_render_id를 사용하여 /status/{creatomate_render_id} 엔드포인트에서 생성 상태를 확인할 수 있습니다. - Video 테이블에 데이터가 저장되며, project_id, lyric_id, song_id가 자동으로 연결됩니다. """, response_model=GenerateVideoResponse, responses={ 200: {"description": "영상 생성 요청 성공"}, - 400: {"description": "Song의 음악 URL이 없음 (노래 생성 미완료)"}, + 400: {"description": "Song의 음악 URL 또는 가사(song_prompt)가 없음"}, 404: {"description": "Project, Lyric 또는 Song을 찾을 수 없음"}, 500: {"description": "영상 생성 요청 실패"}, }, @@ -179,8 +177,17 @@ async def generate_video( detail=f"Song(id={song.id})의 음악 URL이 없습니다. 노래 생성이 완료되었는지 확인하세요.", ) + # Song에서 가사(song_prompt) 가져오기 + lyrics = song.song_prompt + if not lyrics: + print(f"[generate_video] Song has no lyrics (song_prompt) - task_id: {task_id}, song_id: {song.id}") + raise HTTPException( + status_code=400, + detail=f"Song(id={song.id})의 가사(song_prompt)가 없습니다.", + ) + print(f"[generate_video] Song found - song_id: {song.id}, task_id: {task_id}, duration: {song.duration}") - print(f"[generate_video] Music URL (from DB): {music_url}, Song duration: {song.duration}") + print(f"[generate_video] Music URL (from DB): {music_url}, Song duration: {song.duration}, Lyrics length: {len(lyrics)}") # 4. Video 테이블에 초기 데이터 저장 video = Video( @@ -208,11 +215,11 @@ async def generate_video( template = await creatomate_service.get_one_template_data_async(creatomate_service.template_id) print(f"[generate_video] Template fetched - task_id: {task_id}") - # 5-2. elements에서 리소스 매핑 생성 (music_url은 DB에서 조회한 값 사용) + # 5-2. elements에서 리소스 매핑 생성 (music_url, lyrics는 DB에서 조회한 값 사용) modifications = creatomate_service.elements_connect_resource_blackbox( elements=template["source"]["elements"], image_url_list=request_body.image_urls, - lyric=request_body.lyrics, + lyric=lyrics, music_url=music_url, ) print(f"[generate_video] Modifications created - task_id: {task_id}") diff --git a/app/video/schemas/video_schema.py b/app/video/schemas/video_schema.py index 3a862da..3d3dbc1 100644 --- a/app/video/schemas/video_schema.py +++ b/app/video/schemas/video_schema.py @@ -23,14 +23,13 @@ class GenerateVideoRequest(BaseModel): Request body for generating a video via Creatomate API. Note: - - music_url과 duration은 task_id로 Song 테이블에서 자동 조회됩니다. + - music_url, duration, lyrics(song_prompt)는 task_id로 Song 테이블에서 자동 조회됩니다. - 같은 task_id로 여러 Song이 있을 경우 가장 최근 생성된 것을 사용합니다. Example Request: { "orientation": "vertical", - "image_urls": ["https://...", "https://..."], - "lyrics": "가사 내용..." + "image_urls": ["https://...", "https://..."] } """ @@ -50,7 +49,6 @@ class GenerateVideoRequest(BaseModel): "https://naverbooking-phinf.pstatic.net/20240514_205/17156880318681JLwX_JPEG/9.jpg", "https://naverbooking-phinf.pstatic.net/20240514_142/1715688031946hhxHz_JPEG/10.jpg", ], - "lyrics": "인스타 감성의 스테이 머뭄, 머물러봐요\n군산 신흥동 말랭이 마을의 마음 힐링", } } } @@ -60,7 +58,6 @@ class GenerateVideoRequest(BaseModel): description="영상 방향 (horizontal: 가로형, vertical: 세로형, 기본값: vertical)", ) image_urls: List[str] = Field(..., description="영상에 사용할 이미지 URL 목록") - lyrics: str = Field(..., description="영상에 표시할 가사") # =============================================================================