# 캡컷 에이전트 · 구간합치기 (v2)

유튜브 영상 → **무음컷 · 자막 · 배경 템플릿**이 박힌 **편집 가능한 CapCut 드래프트**를 자동 생성하는 로컬 웹앱.
특히 **한 URL의 여러 구간을 이어붙이고**, LLM이 만든 편집안(컷+자막)을 **JSON 붙여넣기**로 한 번에 처리합니다.

---

## 1. 처음 실행 (이 PC)

1. `캡컷_에이전트_구간합치기.bat` 더블클릭
2. 잠시 후 브라우저가 http://127.0.0.1:8001 로 자동으로 열림
3. **이 검은 창은 켜두세요** (닫으면 서버가 꺼짐)

> 코드를 수정했으면 **반드시 창을 닫고 .bat 을 다시 실행**해야 반영됩니다.

---

## 2. 세 가지 입력 방법 (탭)

### 📋 붙여넣기 (기본 탭) — 추천
LLM이 만든 편집안 JSON을 붙여넣으면 컷·자막을 **그대로** 사용합니다.
**댓글 매칭 시작**을 누르면 컷 정밀 다운로드·병합 → 무음 제거 → 받아쓰기(Whisper) →
h-lab 댓글 수집 → 컷별 댓글 카드 추천까지 자동으로 돌고, 검토 화면에서 컷마다 카드를
확인·선택한 뒤 **선택한 카드로 드래프트 만들기**를 누르면 완성됩니다.
(⚠ 무음 제거·받아쓰기는 댓글 매칭 정확도를 위해 항상 켜져 있고 끌 수 없습니다 —
화면 자막은 그대로 JSON의 `bottom`을 쓸지, Whisper 자동 자막으로 바꿀지 따로 고를 수 있습니다.)

### ▶ 유튜브 구간
한 URL + 여러 구간(＋ 구간 추가) → 이어붙여 **무음컷(선택) + 자동 자막(Whisper)**.
무음 제거는 아래 **영상 옵션**의 체크박스로 켜고 끕니다(기본 켬).
📋 붙여넣기 탭과 같은 흐름 — 분석(다운로드·무음·받아쓰기)이 끝나면 h-lab 댓글을
구간별로 자동 추천해 검토 화면을 보여주고, 카드를 고른 뒤 드래프트를 만듭니다.

### 📁 파일
로컬 영상 파일 → **무음컷(선택) + 자동 자막**. (댓글 카드는 폴더 지정 방식만 — 검토 화면 없음)
무음 제거는 아래 **영상 옵션**의 체크박스로 켜고 끕니다(기본 켬).

세 방법 모두 아래 **영상 옵션**을 함께 적용합니다.

---

## 3. 붙여넣기 JSON 형식 (핵심)

아래 **JSON 하나**만 붙여넣으면 됩니다. 배치 시간·SRT 타임코드는 **넣지 마세요** — 앱이 컷을 순서대로 이어붙이며 자동 계산합니다.

```json
{
  "url": "https://www.youtube.com/watch?v=영상ID",
  "title_top": "서브제목",
  "title_main": "메인제목",
  "channel": "@채널명",
  "cuts": [
    {"start":"0:01.0","end":"0:03.5","bottom":"하단 자막 윗줄\n하단 자막 아랫줄","effect":"효과자막"},
    {"start":"2:33.5","end":"2:36.5","bottom":"다음 컷 자막","effect":"공포의통계"}
  ]
}
```

| 필드 | 설명 |
|------|------|
| `url` | **실제 영상 주소** (브라우저에서 열리는 것). LLM이 지어낸 가짜 ID 금지 |
| `cuts[].start` / `end` | 원본 영상 타임스탬프. `분:초.밀리` 또는 `시:분:초.밀리` (밀리초 생략 가능) |
| `cuts[].bottom` | 하단 자막. `\n` 이 있으면 **같은 자리에서 시간을 반씩 나눠** 윗줄→아랫줄 순서로 표시 |
| `cuts[].effect` | 중앙 효과 자막(녹색). 짧게 |
| `title_top` / `title_main` / `channel` | 선택. 비우면 안 들어감(채널은 유튜브에서 자동) |

### LLM 에게 요청할 때 (이대로 복사)

> 아래 스키마의 **JSON 하나로만** 출력해. 설명·마크다운 금지.
> - `url` 은 내가 준 이 주소를 **그대로** 써라(임의 생성 금지): `여기에_실제_URL`
> - `start`/`end` 는 원본 영상 타임스탬프(`분:초.밀리`).
> - **배치 시간은 계산하지 마라.** 앱이 순서대로 이어붙인다.
> - `bottom` 은 2줄(`\n`), `effect` 는 짧은 한 마디.
> - 모든 컷은 `start < end`.

> 💡 자막이 안 쪼개지고 `\n` 글자가 그대로 보여도 앱이 알아서 처리합니다(`\n`·`\\n` 모두 인식).

---

## 4. 영상 옵션 (공통)

- **영상 확대** — 기본 144%. 슬라이더로 조절(캡컷에서 다시 조정 가능)
- **좌우반전(미러)** — 영상만 좌우 뒤집기
- **장면분할** — 화면이 확 바뀌는 지점마다 컷 자동 분할(캡컷에서 개별 편집 가능). 시간이 더 걸림
- **완료되면 CapCut 자동 실행** — 체크 시 결과 후 캡컷 자동 오픈

자막 위치·색은 코드 기본값(하단자막 CapCut Y=-559, 효과자막 Y=866·녹색 `#0dff63`).

---

## 5. 다른 PC 에서 실행

이 `capcut2` 폴더를 통째로 복사한 뒤(`.downloads`·`.cache`·`.uploads` 캐시는 빼도 됨 — 자동 생성):

1. **Python 3.10+** 설치 — https://python.org (설치 시 **Add to PATH** 체크)
2. 이 폴더에서 패키지 설치:
   ```
   python -m pip install -r requirements.txt
   ```
3. **ffmpeg / ffprobe** 설치(PATH 필요) — `winget install Gyan.FFmpeg`
4. **Node.js** 설치 — https://nodejs.org (yt-dlp 유튜브 추출용 JS 런타임)
5. **CapCut** 설치
6. `캡컷_에이전트_구간합치기.bat` 실행

> **코트라 볼드체**(제목·출처) / **제주명조체**(하단 자막): 새 PC의 CapCut 에서 그 폰트를 한 번 사용하면 캐시가 생겨 자동 적용됩니다. 없으면 기본 폰트로 나옵니다(에러 아님).
> **드래프트 저장 위치**: 그 PC의 CapCut 프로젝트 폴더를 자동 인식합니다.
> **.gemini_key**: '파일'·'유튜브 구간' 탭 자막 교정용. 붙여넣기 탭만 쓰면 없어도 됩니다.

---

## 6. 문제 해결

| 증상 | 해결 |
|------|------|
| 수정한 게 반영 안 됨 | 검은 창 닫고 **.bat 재시작** |
| `python not found` | Python 재설치 시 PATH 체크 후 재부팅 |
| 유튜브 `Video unavailable` | 영상이 실제 공개인지 확인 → `python -m pip install -U yt-dlp` |
| 다운로드가 자꾸 깨짐 | `python -m pip install -U yt-dlp` (유튜브가 가끔 바뀜) |
| 자막이 밀림 | 붙여넣기 탭은 컷·자막을 그대로 쓰므로 안 밀림. 파일/유튜브 탭은 Whisper 타이밍 사용 |
| 자막 `\n` 이 글자로 박힘 | .bat 재시작하면 해결(앱이 `\n`·`\\n` 자동 분할) |
| 폰트가 다르게 나옴 | CapCut 에서 코트라 볼드체·제주명조체를 한 번씩 사용해 캐시 생성 |

---

## 7. 폴더 구조 (참고)

```
capcut2/
├─ 캡컷_에이전트_구간합치기.bat   실행 파일(포트 8001)
├─ 배경.png                      배경 템플릿(검정-흰-검정)
├─ requirements.txt              파이썬 패키지 목록
├─ .gemini_key                   (선택) Gemini 키
├─ server/
│  ├─ app.py                     FastAPI 서버 (/upload, /stream, 탭별 analyze→stream→build)
│  └─ static/index.html          웹 UI
└─ capcut_agent/
   ├─ pipeline.py                처리 파이프라인(다운로드→컷→자막→드래프트)
   ├─ youtube.py                 유튜브 구간/다중/정밀 다운로드·병합
   ├─ paste.py                   붙여넣기 JSON 파서
   ├─ draft.py                   CapCut 드래프트 생성(pycapcut)
   ├─ scene.py                   장면전환 감지·분할
   ├─ silence.py                 무음 감지
   ├─ transcribe.py              Whisper 받아쓰기(파일/유튜브 탭)
   ├─ correct.py                 Gemini 자막 교정(선택)
   ├─ highlight.py               자막 청킹
   ├─ media.py                   프레임/오디오 처리
   └─ probe.py                   영상 메타 조회
```
