# task: 영상 엔진 MoviePy 복원 + TTS 세팅 + Threads 업로드

## 배경
Remotion 엔진이 컨트롤 불가로 제이회장님이 포기 결정. 기존 MoviePy 기반 evan_dynamic.py로 복원한다.

## 수정 대상 파일

### 1. `/home/jay/projects/ThreadAuto/video/pipeline_orchestrator.py`
- **Remotion 렌더 제거** → MoviePy 렌더로 교체
- 현재 Step 6에서 `render_bridge`(Remotion) 호출 → `EvanDynamicRenderer` + `ImageSequenceClip`으로 교체
- **TTS voice 기본값 수정**: `voice: str = "ko-KR-InJoonNeural"` → `voice: str | None = None` (None이면 tts_sync.py의 VOICE 랜덤 사용)
- Remotion 관련 import 제거 (render_bridge 등)
- 핵심 흐름:
  1. slides → extract_narration_texts
  2. generate_narration (tts_sync.py 활용, voice=None이면 3명 랜덤)
  3. measure_durations
  4. **generate_scenes_from_slides(slides, theme)** → MoviePy scene dicts 생성 (신규 함수)
  5. scene별 duration = audio_duration + gap으로 조정
  6. **EvanDynamicRenderer().render_all_scenes(scenes)** → numpy frames
  7. **ImageSequenceClip(frames, fps=30).write_videofile()** → silent.mp4
  8. concat_audio → combined.mp3
  9. mux_audio_video → final.mp4

### 2. `/home/jay/projects/ThreadAuto/video/evan_dynamic.py`
- **DEPRECATED 주석 제거** (다시 메인으로 사용)
- **`generate_scenes_from_slides(slides, theme)` 함수 추가**:
  - 파이프라인 출력 slides 배열을 받아 MoviePy용 scene dicts로 변환
  - slide_type별 레이아웃 매핑:
    - `cover` → 대형 제목 중앙 + 부제 (hook 레이아웃)
    - `card_list` → 제목 + items 목록 (label+description, 스태거드 등장)
    - `detail` → 제목 + key-value 쌍 (label+value)
    - `body` → 제목 + 본문 텍스트
    - `cta` → CTA 문구 중앙 배치 + 하단 안내
  - theme 색상 적용: `_hex_to_rgb(theme.accent)` 등
  - 애니메이션: 모든 요소에 typing/fade_in + delay 적용
  - **기존 `generate_insurance_scenes()`는 테스트용으로 보존**

### 3. `/home/jay/projects/ThreadAuto/video/tts_sync.py`
- 현재 세팅 확인 (이미 맞아야 함):
  - `VOICES = ["ko-KR-InJoonNeural", "ko-KR-HyunsuMultilingualNeural", "ko-KR-SunHiNeural"]`
  - `VOICE = random.choice(VOICES)` ← 3명 랜덤
  - `RATE = "+25%"` ← 속도 고정
  - `PITCH = "+0Hz"`
- 만약 다르면 위 값으로 수정

## 에반 6원칙 (필수 유지)
1. **검정 배경**: bg_color=(12, 12, 18)
2. **테마 색상**: accent, secondary 활용
3. **레이아웃 변주**: slide_type별 다른 배치
4. **타이핑 효과**: animation="typing", chars_per_second=15
5. **시간차 등장**: 요소별 delay 값 증가
6. **다이나믹**: fade_in, easeOutCubic, pill badge 등

## Threads 업로드
- 코드 수정 완료 후 영상 1건 생성하여 Threads에 업로드
- 토픽: 자유 선택 (보험/연금 도메인)
- 5단계 파이프라인 → MoviePy 영상 → TTS 합성 → Threads 게시
- 업로드 모듈: `/home/jay/projects/ThreadAuto/uploader/threads_uploader.py`

## 테스트
- 영상 파일 생성 확인 (MP4, 1080x1920, 30fps)
- TTS 음성 3명 중 랜덤 선택 확인
- 속도 +25% 적용 확인
- 에반 6원칙 시각적 확인 (최소 3개 scene 레이아웃 다름)

## 주의사항
- Remotion 관련 코드/디렉토리는 삭제하지 말 것 (히스토리 보존)
- MoviePy import: `from moviepy import ImageSequenceClip`
- ffmpeg 경로: `/home/jay/.local/bin/ffmpeg`
- 폰트: `/home/jay/.local/share/fonts/NotoSansCJKkr-Bold.otf`, `NotoSansCJKkr-Regular.otf`