Generate multiple educational videos from a single batch manifest (batch.json). Phase-batched execution with 4 review gates, cost tracking, and resume support. Uses all existing edu-vid-gen scripts — no new generation tools.
Generate multiple educational videos from a single JSON manifest. Reuses every script from edu-vid-gen — this skill only orchestrates the batch flow.
All scripts at __PLUGIN_DIR__/scripts/. Batch-specific:
| Script | Purpose |
|---|---|
validate-manifest.py | Pre-flight schema check + cost estimate |
batch-checkpoint.py | Read/write batch-status.json state tracking |
checkpoint.py | Per-video phase gate (supports --json-output) |
validate-sync.py | Subtitle overlay + Gemini 2.5 Pro sync analysis (Phase 5 self-healing) |
composite-video-first.py | Video-first fallback compositor (Phase 5 attempt 3) |
All generation scripts from edu-vid-gen are used as-is.
The user provides a batch.json file. For schema details: read references/batch-mode.md.
Step 0a — Validate manifest:
python3 __PLUGIN_DIR__/scripts/validate-manifest.py --manifest "{MANIFEST_PATH}"
If errors: show them and stop.
Step 0b — Present cost estimate. Wait for approval.
Step 0c — Initialize batch state:
python3 __PLUGIN_DIR__/scripts/batch-checkpoint.py \
--init --manifest "{MANIFEST_PATH}" \
--output-dir "{BATCH_OUTPUT_DIR}"
Step 0d — Create all video output directories.
For each video, merge defaults + overrides to compute all variables.
python3 __PLUGIN_DIR__/scripts/batch-checkpoint.py \
--update --video "{VIDEO_ID}" --state SCRIPTING --status-file "{STATUS_FILE}"
Follow edu-vid-gen Phase 2 rules exactly. After ALL scripts written:
Present all scripts. Wait for approval.
Generate character sheets for each entry in shared_characters. Wait 35s between calls.
ELEVENLABS_API_KEY="$ELEVENLABS_API_KEY" node __PLUGIN_DIR__/scripts/generate-audio-timeline.mjs \
--text "{FULL_NARRATION}" \
--output-dir "{OUTPUT_DIR}/audio" \
--voice "{VOICE_ID}" --model "{VOICE_MODEL}" \
--stability 0.5 --speed 0.98 --language hi \
--min-clip 5 --max-clip 8
After each: run rebuild-timeline.mjs and slice-audio.mjs.
After approval:
python3 __PLUGIN_DIR__/scripts/checkpoint.py --phase 2.5 --output-dir "{OUTPUT_DIR}"
python3 __PLUGIN_DIR__/scripts/batch-checkpoint.py \
--complete-phase --video "{VIDEO_ID}" --phase "2.5" --status-file "{STATUS_FILE}"
Choose ac_tc or extend from manifest or ask user.
Rate limit: 35s global between Gemini calls. Round-robin across videos.
After all images for a video: compress for Veo.
Rate limit: 60-90s global between Veo calls.
For each clip: generate, validate with validate-clip.py, queue retries if score < 7.
Auto-approve scores >= 7. Present only flagged clips.
Each video runs max 3 composite attempts:
composite.py (VO-first)composite-video-first.py (video-first fallback)After each: run validate-sync.py for Gemini Pro sync analysis.
If score >= 7: PASS. If < 7 after 3 attempts: ESCALATE.
python3 __PLUGIN_DIR__/scripts/batch-checkpoint.py \
--summary --status-file "{STATUS_FILE}"
/batch-gen --resume {path-to-batch-status.json}
| Error | Strategy |
|---|---|
| One video fails | Mark FAILED, continue others |
| Gemini 429 | Wait 60s, retry |
| Veo face-blocking | Switch to text-to-video |
| Auth errors | Pause entire batch |
| Self-healing exhausted | Escalate to user |
Load references as needed:
edu-vid-gen/references/prompting.mdedu-vid-gen/references/validation.mdedu-vid-gen/references/audio-tags.mdedu-vid-gen/references/transitions.mdedu-vid-gen/references/api-errors.md