# task-666.1 완료 보고서: 영상 엔진 MoviePy 복원 + TTS 세팅 + Threads 업로드

**작업자**: 헤르메스 (개발1팀장)
**팀원**: 불칸(백엔드), 아르고스(테스터)
**일시**: 2026-03-18

---

## SCQA

**S**: ThreadAuto 숏폼 영상 생성 파이프라인이 Remotion 엔진 기반으로 구현되어 있으나, Remotion이 컨트롤 불가 상태다.

**C**: 기존 MoviePy 기반 `evan_dynamic.py`가 DEPRECATED 처리되어 있어, 파이프라인이 영상을 생성할 수 없는 상태다. TTS 설정과 Threads 업로드도 검증이 필요하다.

**Q**: MoviePy 엔진으로 복원하여 파이프라인 slides → TTS → MoviePy 렌더링 → Threads 업로드 전체 흐름을 정상화할 수 있는가?

**A**: MoviePy 기반 렌더링 파이프라인 복원 완료. `generate_scenes_from_slides()` 신규 함수로 파이프라인 slides를 직접 MoviePy scene으로 변환하여 영상 생성 성공 (1080x1920, 30fps, 42초, 0.84MB). TTS 3명 랜덤 음성 + 속도 +25% 적용 확인. Threads 업로드 성공 (post_id: 18221567380311208). pytest 33건 전체 통과, pyright 에러 0건.

---

## 수정/생성 파일 목록

### 수정 (4건)
1. `/home/jay/projects/ThreadAuto/video/evan_dynamic.py` — DEPRECATED 제거, `generate_scenes_from_slides()` 함수 추가 (~170줄)
2. `/home/jay/projects/ThreadAuto/video/pipeline_orchestrator.py` — Remotion 제거, MoviePy 9단계 파이프라인으로 전면 재작성
3. `/home/jay/projects/ThreadAuto/video/tests/test_evan_dynamic.py` — `TestGenerateScenesFromSlides` 클래스 8개 테스트 추가
4. `/home/jay/projects/ThreadAuto/video/tests/test_pipeline_orchestrator.py` — compose_scenes_with_durations 테스트 제거, 새 시그니처 테스트 4건 추가
5. `/home/jay/projects/ThreadAuto/video/tests/test_tts_sync.py` — pitch 기대값 "+50Hz" → "+0Hz" 수정 (작업 지시 기준에 맞춤)

### 생성 (2건)
1. `/home/jay/projects/ThreadAuto/output/test_moviepy_pipeline.py` — 영상 생성 테스트 스크립트
2. `/home/jay/projects/ThreadAuto/output/test_threads_upload.py` — Threads 업로드 테스트 스크립트

### 생성 산출물
- `/home/jay/projects/ThreadAuto/output/videos/moviepy_test_final.mp4` — 테스트 영상 (삭제 금지)

---

## 테스트 결과

### pytest 결과
- `video/tests/test_evan_dynamic.py`: 13 passed (기존 5 + 신규 8)
- `video/tests/test_pipeline_orchestrator.py`: 15 passed (compose_scenes_with_durations 10건 제거, 새 시그니처 4건 추가)
- `video/tests/test_tts_sync.py`: 5 passed
- **전체 video/ 모듈**: 433 passed, 0 failed

### pyright 타입 체크
- evan_dynamic.py: 0 errors, 0 warnings
- pipeline_orchestrator.py: 0 errors, 0 warnings

### 영상 검증 결과
- 해상도: 1080 x 1920 ✅
- FPS: 30 ✅
- 코덱: H.264 (libx264) ✅
- 오디오: AAC-LC, 24kHz ✅
- 영상 길이: 42.07초
- 파일 크기: 0.84 MB

### TTS 검증
- VOICES: 3명 (InJoon, Hyunsu, SunHi) ✅
- VOICE: random.choice(VOICES) ✅
- RATE: "+25%" ✅
- PITCH: "+0Hz" ✅

### Threads 업로드
- 결과: **성공**
- Post ID: 18221567380311208
- 에러: 없음

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **test_tts_sync.py pitch 기대값 불일치** — 테스트가 pitch="+50Hz"를 기대했으나 코드는 "+0Hz". 작업 지시서 기준("+0Hz")에 맞게 테스트 수정
   - 수정: `video/tests/test_tts_sync.py:67-69` — "+50Hz" → "+0Hz"
2. **compose_scenes_with_durations 테스트 잔존** — pipeline_orchestrator에서 함수 삭제 후 관련 테스트 10건도 정리
   - 수정: `video/tests/test_pipeline_orchestrator.py` — 2개 클래스 제거
3. **Threads uploader 경로 불일치** — 작업 지시서의 `uploader/threads_uploader.py` 경로가 실제로는 `publisher/threads_publisher.py`로 존재. 실제 경로로 업로드 수행

---

## 에반 6원칙 적용 확인

1. **검정 배경**: bg_color=(12, 12, 18) ✅ (EvanDynamicRenderer 기본값)
2. **테마 색상**: accent, secondary 활용 ✅ (generate_scenes_from_slides에서 _hex_to_rgb 적용)
3. **레이아웃 변주**: slide_type별 다른 배치 ✅ (cover=중앙, card_list=카드, detail=key-value, body=좌측, cta=중앙)
4. **타이핑 효과**: animation="typing", chars_per_second=15 ✅
5. **시간차 등장**: 요소별 delay 값 증가 ✅ (테스트로 검증)
6. **다이나믹**: fade_in, pill_badge, rounded_rect ✅

---

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: evan_dynamic.py, pipeline_orchestrator.py, 관련 테스트 3개 파일
- [x] 2. 엣지 케이스: 빈 slides, unknown type fallback, badge 없는 cover, voice=None 처리
- [x] 3. 작업 지시와 정확히 일치: Remotion 제거(import만, 디렉토리 보존), MoviePy 렌더, TTS 3명 랜덤, Threads 업로드
- [x] 4. 에러 처리: duration 0.0 → 최소 2초, voice None → tts_sync 기본값 사용
- [x] 5. 테스트 커버리지: 33건 통과 (신규 12건 추가)
- [x] 6. 발견 이슈 3건 모두 자체 해결
