feat: 타임라인 에디터 및 비디오 스튜디오 컴포넌트 추가

- TimelineEditor, VideoStudio 컴포넌트 신규 추가
- 백엔드 transcriber, video_processor 서비스 개선
- 프론트엔드 HomePage 리팩토링 및 스타일 업데이트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kihong.kim
2026-01-06 21:21:58 +09:00
parent ad14c4ea8c
commit 5c57f33903
10 changed files with 3186 additions and 1040 deletions

View File

@@ -32,18 +32,20 @@ class DownloadResponse(BaseModel):
class SubtitleStyle(BaseModel):
font_size: int = 28
font_color: str = "white"
outline_color: str = "black"
outline_width: int = 2
position: str = "bottom" # top, center, bottom
font_size: int = 70
font_color: str = "FFFFFF" # hex color code (white)
outline_color: str = "000000" # hex color code (black)
outline_width: int = 4 # 아웃라인 두께 (가독성을 위해 4로 증가)
position: str = "center" # top, center, bottom
margin_v: int = 50 # 수직 위치 (0=가장자리, 100=화면 중심쪽) - 화면 높이의 %
font_name: str = "Pretendard"
# Enhanced styling options
bold: bool = True # 굵은 글씨 (가독성 향상)
shadow: int = 1 # 그림자 깊이 (0=없음, 1-4)
background_box: bool = True # 불투명 배경 박스로 원본 자막 덮기
background_opacity: str = "E0" # 배경 불투명도 (00=투명, FF=완전불투명, E0=권장)
animation: str = "none" # none, fade, pop (자막 애니메이션)
shadow: int = 2 # 그림자 깊이 (0=없음, 1-4)
background_box: bool = False # False=아웃라인 스타일 (깔끔함), True=배경 박스
background_opacity: str = "80" # 배경 불투명도 (00=투명, FF=완전불투명, 80=반투명)
animation: str = "fade" # none, fade, pop (자막 애니메이션)
max_chars_per_line: int = 0 # 줄당 최대 글자 수 (0=비활성화, 15~20 권장)
class TranslationModeEnum(str, Enum):
@@ -68,11 +70,18 @@ class ProcessResponse(BaseModel):
message: str
class ExcludeRegion(BaseModel):
"""A region to exclude (cut out) from the video."""
start: float # Start time in seconds
end: float # End time in seconds
class TrimRequest(BaseModel):
"""Request to trim a video to a specific time range."""
start_time: float # Start time in seconds
end_time: float # End time in seconds
reprocess: bool = False # Whether to automatically reprocess after trimming (default: False for manual workflow)
exclude_regions: List[ExcludeRegion] = [] # Regions to cut out from the middle of the video
class TranscribeRequest(BaseModel):
@@ -91,6 +100,7 @@ class RenderRequest(BaseModel):
intro_text: Optional[str] = None # Max 20 characters recommended
intro_duration: float = 0.7 # Duration of frozen frame with intro text (seconds)
intro_font_size: int = 100 # Font size
intro_position: str = "center" # top, center, bottom
class TrimResponse(BaseModel):