agentsclimarketplace

Broll pick

Skill jperrello/C0BALT_CUT/.claude/skills/broll-pick

Investigation on using Claude Code to automatically generate profitable YouTube videos.

Install
npx -y skills add jperrello/C0BALT_CUT --skill broll-pick

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Claude picks CONTEXTUAL/scene-level anchors from a clip transcript (literal objects, establishing shots, evocative concept footage matched to the story's tone — not just keyword nouns) and sources full-bleed B-roll cutaways via keyless yt-dlp YouTube search + mcptube frame-sampling + Claude vision verify. The verify step gets the spoken context and rejects literal-but-wrong matches (e.g. a cat laser toy for a tense "red dot" beat). Aims dense (8-12 windows, targeting cutaway footage on ~60%+ of the runtime; emits cutaway_coverage in the plan and WARNs below BROLL_MIN_COVER, default 0.6). Emits broll_plan.json with per-cutaway placement [t0,t1] and source metadata; clip files are namespaced per-clip. Windows snap to whole chunk-captions boundaries; vision calls capped by BROLL_VISION_CAP (default 16).

SKILL.md

3.3 KB, as published. Nobody here has run it

broll-pick

Selects B-roll cutaways for one short. Claude reads the clip transcript + chunks.json (from chunk-captions) + the source ingest.json, picks the 3-5 strongest visualizable nouns/topics (NOUN/VERB/EMOTION/PIVOT), and spawns multiple short cutaway windows per topic — each intercut with the speaker, each preferring distinct footage. Windows are expressed as whole chunk-index ranges so no cut lands mid-word.

Per window: keyless YouTube discovery via the mcptube-bundled yt-dlp (ytsearchN:<query>mcptube discover is NOT used, it requires an LLM API key the stack doesn't have), then mcptube add the candidate, sample 3 frames via mcptube frame, and show Claude the frame grid (claude -p vision) to pick the best on-subject shot or reject. On reject, the query is rewritten once (literal↔metaphorical) and retried; a second miss drops the window — no fallback footage. Chosen segments download via yt-dlp --download-sections into work/<id>/broll/broll_NN.mp4.

Invoke

.claude/skills/broll-pick/broll-pick.sh <clip_transcript.json> <chunks.json> <ingest.json> <out_broll_plan.json>
  • clip_transcript: per-clip transcript with words[] (clip-local times)
  • chunks: chunk-captions output (chunks[] with t0/t1/text)
  • ingest: work/<id>/ingest.json (title + source url)
  • out: path for broll_plan.json; b-roll clips land in <ingest_dir>/broll/

Env

  • BROLL_VISION_CAP (default 10) — max Claude vision calls per clip.
  • BROLL_PICK=0 — disable; emits an empty plan.
  • MCPTUBE_BIN, MCPTUBE_YTDLP — override binary paths.

Output (broll_plan.json)

{
  "picks": [
    {"t0": 4.31, "t1": 6.02, "topic": "hippopotamus", "anchor_word": "hippo",
     "query": "hippo swimming underwater", "clip_path": "/abs/work/<id>/broll/broll_03.mp4",
     "source": {"video_id": "abc123XYZ", "title": "...", "url": "https://youtu.be/abc123XYZ",
                "t0_src": 12.4, "t1_src": 14.1},
     "verified": true}
  ],
  "ingested_video_ids": ["abc123XYZ"],
  "vision_calls_used": 4,
  "vision_cap": 10,
  "chunks_mtime": 1746000000.0
}

No anchors / all queries miss → {"picks": [], "ingested_video_ids": []}, exit 0.

Idempotency

Caches on transcript+chunks+ingest mtimes via <out>.pickmeta.

Notes

  • Records every mcptube add-ed video_id in ingested_video_ids for broll-cleanup. Never the podcast source (filtered by ingest url id).
  • CPU: 3 frames per candidate, reuses _lib/encode.sh thread caps downstream.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.