From content-lab
Analyze a YouTube video to extract narrative structure, VAKOG sensory predicates, and reusable content creation recipes. Triggers: "video-recipe" | "analyze video" | "video recipe" | "content recipe" | "extract recipe".
npx claudepluginhub roxabi/roxabi-plugins --plugin content-labThis skill is limited to using the following tools:
Let:
Deconstructs YouTube video transcripts to extract viral hooks, retention mechanics, emotional triggers, and reusable content blueprints.
Analyzes media content like text, transcripts, video/audio for structure, themes, narrative flow, key moments, quotes with timestamps. Use before content-documenter.
Extracts YouTube transcripts using youtube-transcript-api with yt-dlp fallback, then generates structured analysis: multi-level summaries, key concepts, technical terms, and takeaways in Markdown.
Share bugs, ideas, or general feedback.
Let:
α := ~/.roxabi-vault/content-lab/analyses
Ω := analyzer JSON output
Analyze a YouTube video → extract narrative structure, VAKOG sensory predicates, content creation techniques, and a reusable recipe.
/video-recipe https://youtube.com/watch?v=...
/video-recipe https://youtube.com/watch?v=... --html
/video-recipe https://youtube.com/watch?v=... --compare
/video-recipe --list
URL ∄ ∧ flag ∄ → → DP(B)for YouTube URL.
| Flag | Action |
|---|---|
--html | After markdown output, generate visual HTML via visual-explainer, upload to gui.new |
--compare | After analysis, compare with stored analyses in vault |
--list | List all stored analyses (no URL needed) |
WEB_INTEL_ROOT=$(find ~/projects -maxdepth 4 -path "*/web-intel/pyproject.toml" -print -quit 2>/dev/null | xargs dirname)
CONTENT_LAB_ROOT=$(find ~/projects -maxdepth 4 -path "*/content-lab/pyproject.toml" -print -quit 2>/dev/null | xargs dirname)
if [ -z "$WEB_INTEL_ROOT" ] || [ -z "$CONTENT_LAB_ROOT" ]; then
echo "ERROR: Required plugins not found."
exit 1
fi
First invocation in session only:
cd "$CONTENT_LAB_ROOT" && uv run python scripts/doctor.py
Doctor exit 1 → show output and stop. Skip on subsequent invocations.
--list ∃ → read α/index.json → present table:
# | Date | Channel | Title | VAKOG Signature | Lang
1 | 2026-03-17 | Le SamourAI | -4800$/client: L'ardoise salée... | Ad42-K27-V19-A12| fr
Stop here.
cd "$WEB_INTEL_ROOT" && SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt uv run python scripts/scraper.py "$URL"
Save raw JSON to temp file. success: false ∨ no transcript → inform user and stop.
cd "$CONTENT_LAB_ROOT" && uv run python scripts/analyze.py /tmp/content-lab-scrape.json
Ω contains: metadata (title, author, duration, language, segment count) | vakog (distribution, temporal blocks, choreography, signature, examples) | techniques (detected patterns with confidence).
Parse Ω → present in markdown:
Table: title, channel, duration, language, segment count.
Ad42-K27-V19-A12)| Pair | Name |
|---|---|
| Ad+K | Analyste visceral |
| K+V | Conteur immersif |
| V+Ad | Vulgarisateur visuel |
| Ad+A | Pedagogue structure |
| K+A | Storyteller emotionnel |
Analyze transcript: Hook | Setup | Body | Relances | CTA | Close. Present as timing table + analysis.
∀ technique: Name (FR+EN) | Confidence | Location | Evidence | 1-sentence reusable takeaway. Add techniques identified via reasoning.
| Component | Pattern | When to use |
|-------------|-------------------------------|------------------------|
| Hook | K metaphor + stat-shock | First 10% of video |
| ... | ... | ... |
Include target VAKOG ratio for this content type.
mkdir -p αα/YYYY-MM-DD_<slug>.json (slug: lowercase channel+title, max 50 chars, hyphens)α/index.json — append {date, channel, title, url, signature, language, file}, create if ∄--compare ∃: read all entries from index.json → ∀ previous: compare VAKOG delta, shared vs unique techniques, choreography similarity → table: universal patterns | creator-specific | meta-recipe.
--html ∃: invoke visual-explainer with full analysis markdown → self-contained HTML (VAKOG charts + temporal heatmap, narrative timeline, technique cards) → upload to gui.new → share URL.
WebFetch fallback$ARGUMENTS