비디오 영상 생성 요청시, 가사 전달 하는 항목 삭제, task_id로 직접 검색
parent
47da24a12e
commit
c6a2fa6808
|
|
@ -55,11 +55,11 @@ Creatomate API를 통해 영상 생성을 요청합니다.
|
||||||
## 요청 필드
|
## 요청 필드
|
||||||
- **orientation**: 영상 방향 (horizontal: 가로형, vertical: 세로형, 기본값: vertical) - 선택
|
- **orientation**: 영상 방향 (horizontal: 가로형, vertical: 세로형, 기본값: vertical) - 선택
|
||||||
- **image_urls**: 영상에 사용할 이미지 URL 목록 (필수)
|
- **image_urls**: 영상에 사용할 이미지 URL 목록 (필수)
|
||||||
- **lyrics**: 영상에 표시할 가사 (필수)
|
|
||||||
|
|
||||||
## 자동 조회 정보
|
## 자동 조회 정보 (Song 테이블에서 task_id 기준 가장 최근 생성된 노래 사용)
|
||||||
- **music_url**: Song 테이블에서 task_id 기준 가장 최근 생성된 노래의 song_result_url 사용
|
- **music_url**: song_result_url 사용
|
||||||
- **duration**: Song 테이블에서 task_id 기준 가장 최근 생성된 노래의 duration 사용
|
- **duration**: 노래의 duration 사용
|
||||||
|
- **lyrics**: song_prompt (가사) 사용
|
||||||
|
|
||||||
## 반환 정보
|
## 반환 정보
|
||||||
- **success**: 요청 성공 여부
|
- **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_192/1715688031798MbFDj_JPEG/8.jpg",
|
||||||
"https://naverbooking-phinf.pstatic.net/20240514_205/17156880318681JLwX_JPEG/9.jpg",
|
"https://naverbooking-phinf.pstatic.net/20240514_205/17156880318681JLwX_JPEG/9.jpg",
|
||||||
"https://naverbooking-phinf.pstatic.net/20240514_142/1715688031946hhxHz_JPEG/10.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
|
POST /video/generate/019123ab-cdef-7890-abcd-ef1234567890
|
||||||
{
|
{
|
||||||
"orientation": "horizontal",
|
"orientation": "horizontal",
|
||||||
"image_urls": [...],
|
"image_urls": [...]
|
||||||
"lyrics": "가사 내용..."
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## 참고
|
## 참고
|
||||||
- 배경 음악(music_url)과 영상 길이(duration)는 task_id로 Song 테이블을 조회하여 자동으로 가져옵니다.
|
- 배경 음악(music_url), 영상 길이(duration), 가사(lyrics)는 task_id로 Song 테이블을 조회하여 자동으로 가져옵니다.
|
||||||
- 같은 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} 엔드포인트에서 생성 상태를 확인할 수 있습니다.
|
- creatomate_render_id를 사용하여 /status/{creatomate_render_id} 엔드포인트에서 생성 상태를 확인할 수 있습니다.
|
||||||
- Video 테이블에 데이터가 저장되며, project_id, lyric_id, song_id가 자동으로 연결됩니다.
|
- Video 테이블에 데이터가 저장되며, project_id, lyric_id, song_id가 자동으로 연결됩니다.
|
||||||
""",
|
""",
|
||||||
response_model=GenerateVideoResponse,
|
response_model=GenerateVideoResponse,
|
||||||
responses={
|
responses={
|
||||||
200: {"description": "영상 생성 요청 성공"},
|
200: {"description": "영상 생성 요청 성공"},
|
||||||
400: {"description": "Song의 음악 URL이 없음 (노래 생성 미완료)"},
|
400: {"description": "Song의 음악 URL 또는 가사(song_prompt)가 없음"},
|
||||||
404: {"description": "Project, Lyric 또는 Song을 찾을 수 없음"},
|
404: {"description": "Project, Lyric 또는 Song을 찾을 수 없음"},
|
||||||
500: {"description": "영상 생성 요청 실패"},
|
500: {"description": "영상 생성 요청 실패"},
|
||||||
},
|
},
|
||||||
|
|
@ -179,8 +177,17 @@ async def generate_video(
|
||||||
detail=f"Song(id={song.id})의 음악 URL이 없습니다. 노래 생성이 완료되었는지 확인하세요.",
|
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] 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 테이블에 초기 데이터 저장
|
# 4. Video 테이블에 초기 데이터 저장
|
||||||
video = Video(
|
video = Video(
|
||||||
|
|
@ -208,11 +215,11 @@ async def generate_video(
|
||||||
template = await creatomate_service.get_one_template_data_async(creatomate_service.template_id)
|
template = await creatomate_service.get_one_template_data_async(creatomate_service.template_id)
|
||||||
print(f"[generate_video] Template fetched - task_id: {task_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(
|
modifications = creatomate_service.elements_connect_resource_blackbox(
|
||||||
elements=template["source"]["elements"],
|
elements=template["source"]["elements"],
|
||||||
image_url_list=request_body.image_urls,
|
image_url_list=request_body.image_urls,
|
||||||
lyric=request_body.lyrics,
|
lyric=lyrics,
|
||||||
music_url=music_url,
|
music_url=music_url,
|
||||||
)
|
)
|
||||||
print(f"[generate_video] Modifications created - task_id: {task_id}")
|
print(f"[generate_video] Modifications created - task_id: {task_id}")
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,13 @@ class GenerateVideoRequest(BaseModel):
|
||||||
Request body for generating a video via Creatomate API.
|
Request body for generating a video via Creatomate API.
|
||||||
|
|
||||||
Note:
|
Note:
|
||||||
- music_url과 duration은 task_id로 Song 테이블에서 자동 조회됩니다.
|
- music_url, duration, lyrics(song_prompt)는 task_id로 Song 테이블에서 자동 조회됩니다.
|
||||||
- 같은 task_id로 여러 Song이 있을 경우 가장 최근 생성된 것을 사용합니다.
|
- 같은 task_id로 여러 Song이 있을 경우 가장 최근 생성된 것을 사용합니다.
|
||||||
|
|
||||||
Example Request:
|
Example Request:
|
||||||
{
|
{
|
||||||
"orientation": "vertical",
|
"orientation": "vertical",
|
||||||
"image_urls": ["https://...", "https://..."],
|
"image_urls": ["https://...", "https://..."]
|
||||||
"lyrics": "가사 내용..."
|
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
@ -50,7 +49,6 @@ class GenerateVideoRequest(BaseModel):
|
||||||
"https://naverbooking-phinf.pstatic.net/20240514_205/17156880318681JLwX_JPEG/9.jpg",
|
"https://naverbooking-phinf.pstatic.net/20240514_205/17156880318681JLwX_JPEG/9.jpg",
|
||||||
"https://naverbooking-phinf.pstatic.net/20240514_142/1715688031946hhxHz_JPEG/10.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)",
|
description="영상 방향 (horizontal: 가로형, vertical: 세로형, 기본값: vertical)",
|
||||||
)
|
)
|
||||||
image_urls: List[str] = Field(..., description="영상에 사용할 이미지 URL 목록")
|
image_urls: List[str] = Field(..., description="영상에 사용할 이미지 URL 목록")
|
||||||
lyrics: str = Field(..., description="영상에 표시할 가사")
|
|
||||||
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue