← 관리 페이지로
# 🍳 레시피 관리 가이드

## 🚀 서버 실행

```bash
cd ~/wiki/recipes && python3 recipe_manager.py
```

| 접속 | URL |
|---|---|
| 로컬 브라우저 | http://localhost:8766 |
| 외부 접속 | https://recipes.gleeze.com |
| 관리 페이지 | https://recipes.gleeze.com/ui |

서버 재시작:
```bash
lsof -ti:8766 | xargs kill -9 && python3 ~/wiki/recipes/recipe_manager.py &
```

---

## 📁 파이프라인 구조

웹 추가와 배치 파이프라인이 동일한 흐름으로 통일되어 있음.

```
YouTube URL 입력
  → yt-dlp로 VTT 자막 다운로드 → subs2/ 저장
  → MiniMax AI 파싱 (카테고리 자동감지 + 단계별 타임스탬프 추출)
  → parsed2/{카테고리}/ 저장

[레시피 등록 버튼]
  → subs2/* → subs/* 병합
  → parsed2/* → parsed/* 병합
  → recipe_browser.html 재빌드
```

---

## ▶️ YouTube로 레시피 추가

1. 단일 또는 플레이리스트 URL 붙여넣기 → **불러오기** 클릭
2. 플레이리스트: 목록에서 원하는 영상 체크/해제
3. **선택 추가** 클릭 — 백그라운드에서 자동 처리:
   - VTT 자막 다운로드 → `subs2/` 저장
   - MiniMax AI로 재료·과정 파싱
   - 카테고리 자동감지 (제목 키워드 기반)
   - 요리과정 각 단계에 타임스탬프 `[MM:SS-MM:SS]` 추가
4. 진행 상황 실시간 표시 (페이지 이탈 후 돌아와도 자동 재개)
5. 완료 후 **레시피 등록** 버튼으로 병합 + 브라우저 재빌드

> ⚠️ 필요 조건: `yt-dlp` 설치 (`pip install yt-dlp`), `~/.env`에 `MINIMAX_API_KEY=...`  
> ⚠️ 제목에 요리 키워드가 없으면 경고 표시 — 직접 확인 후 추가

---

## 🗂️ 파일로 레시피 추가

1. **📥 템플릿** 다운로드 → 아래 형식으로 작성
2. 파일 드래그 또는 클릭 업로드 (여러 파일 동시 가능)
3. **레시피 등록** 버튼으로 반영

---

## 📄 레시피 파일 형식 (.md)

```
---
title: 레시피 제목
youtuber: 채널명
category: 한식
servings: 2
time: 30분
heat: 중불
yt_url: https://www.youtube.com/watch?v=xxxxx
---

## 주재료
🥬 재료명 | 양

## 부재료
🧅 재료명 | 양

## 양념
🌶️ 재료명 | 양

## 물/기름
💧 물 | 200ml

## 요리과정
1. 단계 제목 [10:21-12:40] | 🍳 | 설명
2. 다음 단계 [12:40-15:00] | 🔥 | 설명

## 맛의 포인트
핵심 팁 한 문장
```

타임스탬프 형식: `[MM:SS-MM:SS]` 또는 `[HH:MM:SS-HH:MM:SS]`

---

## ⏱️ 타임스탬프 일괄 추가 (기존 레시피)

기존 레시피에 유튜브 타임스탬프를 소급 적용:

```bash
# 미리보기 (API 호출 없음, 빠름)
python3 ~/wiki/recipes/add_timestamps.py --dry-run

# 실제 적용
python3 ~/wiki/recipes/add_timestamps.py

# 완료 후 브라우저 재빌드
# → 관리 페이지에서 레시피 등록 버튼 클릭
```

- `subs/` 폴더의 기존 VTT를 우선 사용 (재다운로드 최소화)
- VTT 없는 경우 yt-dlp로 자동 다운로드 (실제 실행 시에만)
- MiniMax API 비용: 약 $0.6 / 400개 기준

---

## 🔄 빈 레시피 재파싱

단계(요리과정)가 없는 레시피를 다시 파싱:  
관리 페이지 하단 **📚 전체 레시피 개수** 패널 → **🔄 빈 레시피 재파싱** 버튼

> 진행률 폴링은 페이지 이탈 후 돌아와도 자동 재개됨.

---

## 📺 레시피 브라우저 기능

- **카테고리별 탐색** — 카테고리 클릭 시 해당 개수 표시
- **전체 검색** — 제목, 재료, 태그 검색
- **인분 조절** — 재료 양 자동 계산 (재료 양 토글로 숨기기 가능)

### ▶️ YouTube 연동

레시피 카드 우측 상단 **유튜브** 버튼 클릭으로 화면 하단에 영상 고정.  
재료·단계는 위쪽에서 그대로 스크롤 가능.

| 동작 | 방법 |
|---|---|
| 재생 / 정지 | 영상 클릭 또는 `Space` |
| 배속 낮추기 / 높이기 | `←` / `→` (0.25 ~ 2x) |
| 볼륨 낮추기 / 높이기 | `↓` / `↑` (10%씩) |
| 특정 단계로 이동 | 타임스탬프 있는 단계 클릭 |
| 볼륨 · 배속 현재 값 확인 | 영상 위에 마우스 올리면 YouTube 컨트롤바 표시 |

- 최초 열기 시 첫 번째 타임스탬프 위치에서 **일시정지** 상태로 로드
- 타임스탬프 없는 레시피는 영상 처음부터 일시정지

### 재빌드 (레시피 등록 버튼)

새 레시피 추가 또는 브라우저 HTML 변경 후 반드시 실행:

```bash
# gen.py 직접 실행 (빠름)
cd ~/wiki/recipes && python3 recipe_browser_gen.py

# 또는 관리 페이지 → 레시피 등록 버튼 (staged 파일도 함께 병합)
```

---

## 🌐 외부 접속 구성

| 항목 | 설정 |
|---|---|
| 도메인 | `recipes.gleeze.com` (Dynu DDNS) |
| DNS | A레코드 → 집 외부 IP |
| 프록시 | Nginx Proxy Manager → Mac IP:8766 |
| SSL | 기존 wildcard 인증서 적용 |
| macOS 방화벽 | python3 들어오는 연결 허용 |

> 포트 8765 (`python3 -m http.server`)는 더 이상 사용하지 않음.

---

## 📂 디렉토리 구조

```
~/wiki/recipes/
├── recipe_manager.py       # 메인 서버 (포트 8766)
├── recipe_browser_gen.py   # 브라우저 HTML 생성기
├── recipe_browser.html     # 생성된 브라우저 (자동생성)
├── add_timestamps.py       # 타임스탬프 일괄 추가 스크립트
├── GUIDE.md                # 이 파일
├── parsed/                 # 최종 레시피 (.md)
│   ├── 한식/
│   ├── 계란/
│   └── ...
├── parsed2/                # 스테이징 (레시피 등록 전)
├── subs/                   # 전체 VTT 자막 아카이브
└── subs2/                  # 스테이징 VTT (레시피 등록 전)
```