# task-458.1: ThreadAuto 영상(VIDEO) 타입 Threads 테스트 업로드

## 레벨: Lv.2

## 목표
ThreadAuto에 영상(VIDEO) 타입 게시 기능을 구현하고, 실제 Threads에 테스트 업로드까지 수행한다.

## 현재 상태
- ThreadAuto는 TEXT, IMAGE, CAROUSEL 게시만 지원
- VIDEO MediaType, post_video(), publish_video() 모두 미구현
- 영상 생성 인프라(video/, pipeline/video_composer.py)는 이미 존재
- Threads Graph API v1.0 사용 중 (`https://graph.threads.net/v1.0`)
- OAuth scope에 `threads_content_publish` 이미 포함 → 영상 게시 권한 있음

## 프로젝트 경로
- `/home/jay/projects/ThreadAuto/`

## 수정 파일 및 구현 내용

### 1. api/models.py — VIDEO MediaType 추가
```python
class MediaType(str, Enum):
    TEXT = "TEXT"
    IMAGE = "IMAGE"
    CAROUSEL = "CAROUSEL"
    VIDEO = "VIDEO"  # 추가
```

### 2. api/client.py — post_video() 메서드 추가
- 기존 `post_image()` 패턴을 참고하여 구현
- `_create_container(media_type="VIDEO", video_url=..., text=...)` 호출
- Threads API 영상 처리는 이미지보다 오래 걸림 → **컨테이너 상태 폴링** 필요
  - `GET /{container_id}?fields=status,error_message` 로 상태 확인
  - status가 `FINISHED`가 될 때까지 폴링 (최대 60초, 5초 간격)
  - status가 `ERROR`면 에러 메시지와 함께 실패 처리
- 단순 `asyncio.sleep(30)` 대신 상태 폴링 방식 권장

### 3. publisher/threads_publisher.py — publish_video() 메서드 추가
- 영상 파일을 공개 URL로 서빙해야 함 (Threads API는 공개 URL 필요)
- 기존 `image_server.py`를 확인하여 영상 파일도 서빙 가능한지 체크
  - 가능하면 그대로 활용, 불가능하면 video 파일 서빙 지원 추가
- publish() 메서드에서 `video_path` 키도 처리하도록 분기 추가

### 4. cli.py — post-video 커맨드 추가
- `threadauto post-video <video_url> <caption>` 형태
- 또는 로컬 파일 경로를 받아서 image_server로 서빙 후 업로드

## 테스트 업로드 절차

### 테스트 영상 준비
- `/home/jay/projects/ThreadAuto/output/videos/` 에 기존 생성된 영상이 있는지 확인
- 없으면 간단한 테스트 영상 생성 (5초짜리 등)
- 또는 `samples/` 디렉토리에서 샘플 영상 확인

### 실제 Threads 업로드 테스트
1. 영상 파일을 공개 URL로 서빙
2. Threads API로 VIDEO 컨테이너 생성
3. 상태 폴링으로 처리 완료 대기
4. 게시(publish) 실행
5. 결과 확인 (threads_post_id 반환)

### 테스트 캡션
```
[테스트] ThreadAuto 영상 자동 게시 테스트 🎬
#test #threadauto
```

## 주의사항
- Threads API 영상 규격: MP4, H.264, 최대 500MB, 0~5분
- 세로형(1080x1920) 권장
- 영상 URL은 반드시 공개 접근 가능해야 함 (localhost X, Tailscale IP 가능 여부 확인)
- 인증 토큰: 기존 auth/ 모듈의 토큰 관리 방식 그대로 사용
- `.env` 파일의 환경변수 활용 (키 하드코딩 금지)

## 검증 기준
- [ ] Threads에 영상이 실제 게시되었는지 확인
- [ ] 게시된 영상의 threads_post_id 반환
- [ ] 에러 발생 시 명확한 에러 메시지 출력
- [ ] 기존 TEXT/IMAGE/CAROUSEL 게시 기능에 영향 없음
