youtube-transcript
Use whenever the user needs the transcript of a YouTube video — fetching, extracting, downloading, or pulling captions/subtitles/transcript text from a…
Skill by attentiondotnet
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/attentiondotnet-youtube-transcript
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: backend, research
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/youtube-transcript
What's inside
- Skill name
youtube-transcript- Description
- Use whenever the user needs the transcript of a YouTube video — fetching, extracting, downloading, or pulling captions/subtitles/transcript text from a YouTube URL. Triggers on "get the transcript", "transcript of this video", "pull the captions", "download subtitles", "what does this YouTube video say". Primary path is DeepAPI (go to deepapi.co to get an API key); yt-dlp is the local fallback.
- License
- MIT
- Instructions
- 95 lines in SKILL.md · view on GitHub
Before installing
- Instructions call the network
Files (1)
- SKILL.md
SKILL.md (first lines)
# YouTube Transcript (via DeepAPI, yt-dlp fallback)
Fetch a YouTube video's transcript and save a clean raw `.txt` file. Primary path is DeepAPI `POST /v1/scrape/youtube/transcript`. It runs server-side, so it avoids the local-IP bot flagging that plagues yt-dlp.
## Save location
- If the user is in a real project/working dir → save there.
- Otherwise (no dir given, or cwd makes no sense) → save to `~/Downloads`.
- **Always name the file `Channel_Title` with spaces replaced by `_`** (e.g. `David_Ondrej_title_of_video.txt`). If metadata is unavailable, fall back to the video ID.
## Primary path — DeepAPI
Key lives in `~/.zshrc` as `DEEPAPI_API_KEY`. Do NOT `source ~/.zshrc` (breaks the shell, exit 126):
```bash
KEY=${DEEPAPI_API_KEY:-$(rg -o 'DEEPAPI_API_KEY=\S+' ~/.zshrc | head -1 | cut -d= -f2)}
BASE=${DEEPAPI_API_BASE_URL:-https://deepapi.co}
```
Run the scrape (keep the Idempotency-Key; retries must reuse the SAME one):
```bash
IDK=$(uuidgen)
curl -s --max-time 120 "$BASE/v1/scrape/youtube/transcript" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $IDK" \
-d '{"url": "VIDEO_URL", "maxCostUsd": "0.05", "waitForFinishSecs": 60}' \
> /tmp/yt_transcript.json
```
- Non-English videos: add `"language": "de"` (etc.) to the body.
- `status: running` → wait `next.afterSecs`, then `curl "$BASE$(jq -r '.next.path' /tmp/yt_transcript.json)" -H "Authorization: Bearer $KEY"` until `succeeded` or `failed`.
Extract the text and save it:
```bash
jq -r '.status' /tmp/yt_transcript.json # succeeded | running | failed
jq -r '.output[0].text' /tmp/yt_transcript.json > "$OUT/$NAME.txt"
jq -r '.debitMicrousd' /tmp/yt_transcript.json # cost (50000 = $0.05)
```
`.output[0].segments` also has timed segments (`startSecs`, `durationSecs`, `text`) if the user wants timestamps. Empty `output` = video has no captions; report it, don't retry.
For the `Channel_Title` filename, get metadata with a quick `yt-dlp --print "%(channel)s|%(title)s" --skip-download "URL"`; if that fails, use the video ID.
## When to fall back to yt-dlp
- `DEEPAPI_API_KEY` missing from `~/.zshrc`.
- HTTP 402 `insufficient_credits` (tell the user to top up at deepapi.co/credits first; fall back only if they're unavailable).
- DeepAPI request `failed` twice.
Tell the user whenever you fall back — a fallback means DeepAPI missed a real use case.
## Fallback path — yt-dlp (local)
```bash
OUT="$(pwd)" # or ~/Downloads if cwd makes no sense
META=$(yt-dlp --print "%(channel)s|%(title)s" --skip-download "URL")
NAME=$(echo "$META" | tr '| ' '__' | tr -cd '[:alnum:]_.-') # "Channel_Title", spaces -> _, strip unsafe chars
yt-dlp --skip-download --write-subs --write-auto-subs \
--sub-langs "en.*" --sub-format json3 \
-o "$OUT/$NAME.%(ext)s" "URL"
```
- Fall back `channel` → `uploader` → `uploader_id` if `channel` is null.
- `--skip-download` = captions only. `--write-subs` + `--write-auto-subs` = manual first, auto as fallback.
- **Always use `json3`, never VTT/SRT** — auto VTT repeats every line twice (rolling captions).
Flatten json3 → raw text:
```bash
python3 - "$OUT" <<'PY'
import json, html, re, glob, sys, pathlib
f = glob.glob(sys.argv[1] + "/*.json3")
if not f: sys.exit("no json3 file")
data = json.load(open(f[0], encoding="utf-8"))
parts = ["".join(s.get("utf8","") for s in e.get("segs") or []) for e in data.get("events", [])]
txt = re.sub(r"\s+", " ", html.unescape(" ".join(p.strip() for p in parts if p.strip()))).strip()
out = pathlib.Path(f[0]).with_suffix(".txt")
out.write_text(txt, encoding="utf-8"); print(out)
PY
```
### yt-dlp failure handling
- Non-English / unknown language: run `yt-dlp --list-subs "URL"` first, then set `--sub-langs`.
- Newer yt-dlp may need `deno` on PATH for YouTube extraction.
- On first failure: run `yt-dlp -U` once, retry once, then stop.
- **429 / "Sign in to confirm you're not a bot"** = IP flagged. STOP — do NOT retry in a loop (makes it worse).
- Never fall back to downloading audio for Whisper unless the user explicitly asks.
## Output
Report the saved path; print the text if short. If DeepAPI was used, also report the cost in dollars.From attentiondotnet/davidondrej-skills, MIT.
More from attentiondotnet/davidondrej-skills
- 0.542score
folder-specific-claude-and-agents-md
attentiondotnet
Create a specialized CLAUDE.md (+ AGENTS.md symlink) inside a specific folder to give future agents folder-scoped context.
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
brain-to-docs
attentiondotnet
Use when the user wants to extract project vision, decisions, and preferences from his head into clear documentation (README + ADRs) through a back-and-forth…
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
pi-custom-model
attentiondotnet
Register a custom or variant model (e.g.
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
setup-help
attentiondotnet
Walk the user through setting up anything step by step.
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
research-prompt
attentiondotnet
Write a single-paragraph Deep Research prompt to hand to a human researcher (or a deep-research AI).
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
distribute-skill-to-all-agents
attentiondotnet
Distribute a skill across the 4 agent skill folders (Codex, Claude Code, Pi, Hermes) so all agents see it.
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
push-skill-to-github
attentiondotnet
Commit and push agent-skill changes to the user's private skills GitHub repo (your-org/private-skills, rooted at ~/.agents).
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
fable-safe-prompt
attentiondotnet
Rewrite a user's prompt to reduce the chance it trips Claude Fable 5's server-side safety classifiers (cyber/bio guardrails that force-route to Opus 4.8 or…
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
goal-loop
attentiondotnet
Explain and write effective instructions for the `/goal` feature — the persistent self-checking agent loop (plan → act → test → review → iterate), available…
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
markdown-rendering
attentiondotnet
How to reliably open a markdown file in a cmux right pane without it rendering blank.
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
run-deep-swe
attentiondotnet
Score any AI model on the DeepSWE coding-agent benchmark via the OpenRouter API.
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
anti-sleep
attentiondotnet
Keep the user's MacBook awake with macOS caffeinate — prevent sleep, screen dimming, or both, for a set duration or while a process runs.
SkillCFreshness: C★ 11Claude Code +9
Signals
- Stars
- 11
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Jul 7, 2026 (3 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from attentiondotnet
- 0.542score
anti-sleep
attentiondotnet
Keep the user's MacBook awake with macOS caffeinate — prevent sleep, screen dimming, or both, for a set duration or while a process runs.
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
fable-safe-prompt
attentiondotnet
Rewrite a user's prompt to reduce the chance it trips Claude Fable 5's server-side safety classifiers (cyber/bio guardrails that force-route to Opus 4.8 or…
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
goal-loop
attentiondotnet
Explain and write effective instructions for the `/goal` feature — the persistent self-checking agent loop (plan → act → test → review → iterate), available…
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
run-deep-swe
attentiondotnet
Score any AI model on the DeepSWE coding-agent benchmark via the OpenRouter API.
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
markdown-rendering
attentiondotnet
How to reliably open a markdown file in a cmux right pane without it rendering blank.
SkillCFreshness: C★ 11Claude Code +9 - 0.542score
pi-custom-model
attentiondotnet
Register a custom or variant model (e.g.
SkillCFreshness: C★ 11Claude Code +9
Cite this page
youtube-transcript skill. Agent Mart. https://agentmart.dev/skills/attentiondotnet-youtube-transcript (last updated 2026-10-24)