---
name: video-factory
description: >-
  Video Factory — batch produkce video kreativ z YAML šablon.
  Generuje N variant (hook × délka × aspect ratio) jedním příkazem.
  FFmpeg pipeline: Ken Burns efekty, PiP overlay, titulky, voiceover,
  greenscreen removal, SRT generování. Použij pro batch rendering,
  Meta Ad kreativy, social media varianty, video editing.
  Trigger: "video factory", "udělej varianty", "nastříhej video",
  "batch video", "video editing", "/video-factory"
allowed-tools:
  - Bash
  - Read
  - Write
  - Edit
  - Glob
  - Grep
---

# Video Factory — batch video production z YAML šablon

## Kdy použít
- Potřebuješ vyrobit varianty videa (různé hooky, délky, aspect ratios)
- Meta Ad / TikTok / Reels kreativy ve velkém
- Editace existujícího videa (Ken Burns, titulky, PiP, voiceover)
- Generování SRT titulků z audio/video
- Background removal z videa
- Jakákoliv batch operace nad video soubory

## Filozofie

Ruční střih jednoho videa = hodiny. Video Factory to obrací — definuješ **šablonu** (co, jak, kolik variant) a FFmpeg pipeline vyrobí všechno najednou. 3 hooky × 3 délky × 3 formáty = 27 videí jedním příkazem.

## Architektura

Video Factory má 3 vrstvy:

```
1. YAML šablona        — deklarativní popis videa + variant matrix
2. Template engine     — parsuje YAML, generuje kombinace
3. FFmpeg pipeline     — renderuje jednotlivé varianty
```

### Potřebné soubory

Vytvoř si tuto strukturu:

```
scripts/video/
├── video_factory.py      — CLI entry point
├── templates/            — YAML šablony
│   └── example.yaml
tools/
├── video_engine.py       — core FFmpeg wrappery
└── video_templates.py    — YAML template engine + batch renderer
```

## YAML Template formát

```yaml
name: "Template Name"
media_dir: "path/to/media"         # base dir pro relativní cesty
output_dir: "path/to/outputs"

width: 1080
height: 1920
fps: 30

# Base segments (body videa)
segments:
  - type: photo              # photo | video
    source: "IMG_001.JPG"    # relativní k media_dir
    duration: 5              # sekundy
    effect: zoom_in          # zoom_in | zoom_out | pan_right | pan_left | hold
  - type: video
    source: "clip.mp4"
    duration: 3
    trim_start: 5            # odkud stříhat (sekundy)

# Audio overlay (voiceover / hudba)
audio: "voiceover.m4a"

# PiP overlay (talking head)
pip_source: "talking_head.mp4"
pip_position: bottom-left    # bottom-left | bottom-right | top-left | top-right
pip_size: 0.26               # % šířky

# Titulky
srt_file: "subs.srt"         # NEBO inline:
srt_text: |
  1
  00:00:01,000 --> 00:00:05,000
  Text...

# === VARIANT MATRIX (hlavní síla) ===

hooks:
  - name: hook-a
    segments:
      - type: photo
        source: "hook_a.jpg"
        duration: 3
        effect: zoom_in
  - name: hook-b
    segments:
      - type: video
        source: "hook_b.mp4"
        duration: 4

durations:
  - name: "15s"
    max_duration: 15
  - name: "30s"
    max_duration: 30
  - name: "60s"
    max_duration: 60

aspect_ratios:
  - "9:16"    # Reels, TikTok, Stories
  - "4:5"     # FB Feed
  - "1:1"     # Square
```

Výsledek: `hooks × durations × aspect_ratios` = všechny varianty automaticky.

## Ken Burns efekty

| Efekt | Popis | Kdy použít |
|-------|-------|------------|
| `zoom_in` | Pomalý zoom dovnitř (center) | Hero shoty, důraz |
| `zoom_out` | Zoom ven z blízka | Reveal, kontext |
| `pan_right` | Horizontální pan zleva doprava | Panorama, prostor |
| `pan_left` | Horizontální pan zprava doleva | Alternativa |
| `hold` | Statický záběr (žádný pohyb) | Text overlay, logo |

### FFmpeg implementace Ken Burns

```bash
# zoom_in efekt (5s, 1080x1920)
ffmpeg -loop 1 -i photo.jpg -t 5 -vf "
  scale=8000:-1,
  zoompan=z='min(zoom+0.001,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=150:s=1080x1920:fps=30
" -c:v libx264 -pix_fmt yuv420p output.mp4

# pan_right efekt
ffmpeg -loop 1 -i photo.jpg -t 5 -vf "
  scale=8000:-1,
  zoompan=z='1.2':x='iw*0.1+on*(iw*0.3/150)':y='ih/2-(ih/zoom/2)':d=150:s=1080x1920:fps=30
" -c:v libx264 -pix_fmt yuv420p output.mp4
```

## Aspect ratio presets

| Ratio | Rozlišení | Použití |
|-------|-----------|---------|
| 9:16 | 1080×1920 | Reels, TikTok, Stories |
| 4:5 | 1080×1350 | FB Feed (optimal engagement) |
| 1:1 | 1080×1080 | Square (universal) |
| 16:9 | 1920×1080 | YouTube, landscape |

## Operace z příkazové řádky

### Batch render ze šablony
```bash
# Dry-run (ukáže co se vyrobí, nic nerenderuje)
python scripts/video/video_factory.py templates/my_template.yaml --dry-run

# Plný render
python scripts/video/video_factory.py templates/my_template.yaml

# Custom output složka
python scripts/video/video_factory.py templates/my_template.yaml --output outputs/campaign/
```

### Jednotlivé operace
```bash
# Probe — info o video souboru
ffprobe -v quiet -print_format json -show_format -show_streams video.mp4

# Trim video
ffmpeg -ss 00:00:05 -i input.mp4 -t 15 -c copy trimmed.mp4

# Concat segmentů
ffmpeg -f concat -safe 0 -i segments.txt -c copy output.mp4

# PiP overlay (talking head v rohu)
ffmpeg -i main.mp4 -i pip.mp4 -filter_complex "
  [1:v]scale=280:-1[pip];
  [0:v][pip]overlay=20:H-h-20
" -c:a copy output.mp4

# Přidání SRT titulků (burned-in)
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=24,PrimaryColour=&HFFFFFF&'" output.mp4

# Background removal + compositing
# Vyžaduje rembg: pip install rembg[gpu]
rembg v -m u2net input.mp4 alpha.mp4
ffmpeg -i alpha.mp4 -i background.mp4 -filter_complex "[0:v]colorkey=0x000000:0.3:0.1[fg];[1:v][fg]overlay" output.mp4
```

## SRT titulky z audio

### Přes Whisper (lokální, nejlepší kvalita)
```bash
# Install: pip install faster-whisper
python -c "
from faster_whisper import WhisperModel
model = WhisperModel('large-v3', device='cpu')  # nebo 'cuda'
segments, info = model.transcribe('audio.m4a', language='cs')
with open('subs.srt', 'w') as f:
    for i, seg in enumerate(segments, 1):
        start = f'{int(seg.start//3600):02d}:{int(seg.start%3600//60):02d}:{seg.start%60:06.3f}'.replace('.', ',')
        end = f'{int(seg.end//3600):02d}:{int(seg.end%3600//60):02d}:{seg.end%60:06.3f}'.replace('.', ',')
        f.write(f'{i}\n{start} --> {end}\n{seg.text.strip()}\n\n')
"
```

### Přes API (když nemáš GPU)
```bash
curl https://api.openai.com/v1/audio/transcriptions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F file=@audio.m4a \
  -F model=whisper-1 \
  -F response_format=srt \
  -F language=cs > subs.srt
```

## Pokročilé FFmpeg recepty

### Greenscreen removal
```bash
ffmpeg -i greenscreen.mp4 -i background.mp4 -filter_complex "
  [0:v]colorkey=0x00FF00:0.3:0.15[fg];
  [1:v][fg]overlay=shortest=1
" output.mp4
```

### Speed ramp (zpomalení/zrychlení)
```bash
# 0.5x slow motion
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" -filter:a "atempo=0.5" slow.mp4

# 2x speed up
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -filter:a "atempo=2.0" fast.mp4
```

### Crossfade mezi segmenty
```bash
ffmpeg -i clip1.mp4 -i clip2.mp4 -filter_complex "
  [0:v][1:v]xfade=transition=fade:duration=1:offset=4[v];
  [0:a][1:a]acrossfade=d=1[a]
" -map "[v]" -map "[a]" output.mp4
```

### Přidání watermarku/loga
```bash
ffmpeg -i input.mp4 -i logo.png -filter_complex "
  [1:v]scale=100:-1,format=rgba,colorchannelmixer=aa=0.5[logo];
  [0:v][logo]overlay=W-w-20:20
" output.mp4
```

### Audio ducking (ztlumení hudby pod voiceoverem)
```bash
ffmpeg -i video_with_music.mp4 -i voiceover.m4a -filter_complex "
  [0:a]volume=0.2[music];
  [music][1:a]amix=inputs=2:duration=first
" -c:v copy output.mp4
```

### Color grading presets
```bash
# Warm cinematic
ffmpeg -i input.mp4 -vf "eq=contrast=1.1:brightness=0.02:saturation=1.2,curves=preset=lighter" warm.mp4

# Moody dark
ffmpeg -i input.mp4 -vf "eq=contrast=1.3:brightness=-0.05:saturation=0.9,curves=preset=darker" moody.mp4

# Desaturated documentary
ffmpeg -i input.mp4 -vf "eq=saturation=0.6:contrast=1.1,unsharp=5:5:0.8" docu.mp4
```

## Závislosti

- **FFmpeg** 7+ (system) — musí být v PATH
- **Python** 3.11+: PyYAML, Pillow
- **Volitelné:** faster-whisper (SRT), rembg (background removal), torch (GPU)

```bash
# Minimální instalace
pip install pyyaml pillow

# Plná instalace
pip install pyyaml pillow faster-whisper rembg[gpu]

# FFmpeg (macOS)
brew install ffmpeg

# FFmpeg (Ubuntu)
sudo apt install ffmpeg

# FFmpeg (Windows)
winget install ffmpeg
```

## Pravidla

1. Vždy `--dry-run` před plným renderem — ověř počet variant a cesty
2. Výstupní složku specifikuj explicitně — nerendruj do zdrojového adresáře
3. Media soubory (videa, fotky) necommituj do gitu — gitignore
4. YAML šablony do gitu ANO — jsou deklarativní a malé
5. Při chybě nejdřív `ffprobe` — zkontroluj formát, rozlišení, kodeky zdrojových souborů
6. Pojmenování výstupů: `{template}_{hook}_{duration}_{ratio}.mp4`
