Collect YouTube Transcript By ID data and return results
Coding
YouTube Transcript Native Node
Try itGet clean plain-text YouTube transcripts from existing captions, with no npm dependencies and no API keys.
What it does
Wraps the `yt-dlp` binary to fetch YouTube captions, parses .vtt subtitle files, and strips timestamps and HTML tags to produce readable plain text or structured JSON. Native Node.js implementation with zero npm dependencies, but requires `yt-dlp` on PATH. Accepts YouTube URLs only (youtube.com, www.youtube.com, m.youtube.com, youtu.be), supports language selection, optional timestamps, and auto-caption deduplication. Bounded by a 120-second subprocess timeout and a 2,000,000-character output cap.
When to use it
- Pull clean transcript text from a YouTube video for summarization or note-taking
- Extract time-anchored captions as JSON for downstream research tooling
- Quote specific lines using timestamps for traceability
- Strip VTT timestamps and HTML tags from auto-generated captions
The skill document
YouTube Transcript (Native Node)
Version: 1.1.5 / public ClawHub utility candidate with external binary and YouTube access.
Minimal YouTube caption extractor. Native Node.js, zero npm dependencies, wraps the external yt-dlp binary.
Risk / invocation class
Risk class: external binary wrapper / YouTube network access / third-party content.
Use deliberately. This skill does not call a web API directly, but yt-dlp talks to YouTube and the local environment owns the yt-dlp PATH/binary supply-chain trust boundary.
Input packet
Required:
url: full YouTube URL from the user.goal: raw transcript, summary input, quote extraction, timestamped notes, or JSON handoff.privacy_sensitivity: normal, private/client, or unknown.language: defaultenunless another language is requested.
Optional:
timestamps: needed or not.json: needed for downstream tool use.dedup_preference: default auto-caption rolling-window dedup, or--no-dedupto preserve rolling-window/repeated-phrase artifacts as much as possible. Exact consecutive duplicate cue text may still be collapsed during VTT parsing.output_destination: chat summary, saved file, downstream summarizer, etc.
Stop or ask before use if the video/context is private or client-sensitive and sending access to YouTube via yt-dlp is not appropriate.
Output packet
Return compactly:
- source YouTube URL
- language requested and whether timestamps/JSON were used
- transcript status: success, no captions, dependency missing, private/blocked/rate-limited, or failed
- whether captions appear auto-generated when known
- saved path if the transcript was separately written to a file
- concise transcript summary or excerpt, unless the user requested raw text
- caveats and next safe step
Security behavior
- Accepts only
http(s)YouTube URLs onyoutube.com,www.youtube.com,m.youtube.com, oryoutu.be. - Validates
--langas a simple subtitle language code beginning with an alphanumeric before invokingyt-dlp. - Spawns
yt-dlpwith an argv array and no shell; it does not execute user-provided commands. - Bounds the subprocess with a 120-second timeout.
- Creates and removes a temporary subtitle directory under the OS temp path.
- Refuses to print transcripts larger than 2,000,000 characters.
- Reads no API keys, env secrets, or credential/config files. Offline regression hooks are inert unless
YOUTUBE_TRANSCRIPT_SELFTEST=1is set byscripts/self-test.mjs; do not set self-test hooks for normal transcript extraction. - Passes
--ignore-configso user-levelyt-dlpconfig does not silently alter wrapper behavior. - Static-analysis
child_processwarnings are expected because this skill intentionally wraps trustedyt-dlp.
When to use
Use this when:
- the user provides a YouTube URL and wants spoken text/captions;
- clean plain text is needed for summarization, search, or quoting;
- the video has creator-uploaded subtitles or auto-generated captions.
Do not use this when:
- the user expects actual audio transcription; this extracts existing captions only;
- the platform is not YouTube;
- the video is a live stream that has not ended;
- the video/content is privacy-sensitive and should not be accessed via YouTube/yt-dlp;
yt-dlpis not installed/on PATH and installing it has not been approved.
Commands
Script: scripts/fetch.mjs
node "\scripts\fetch.mjs" --url "https://www.youtube.com/watch?v=VIDEO_ID"
node "\scripts\fetch.mjs" --url "https://www.youtube.com/watch?v=VIDEO_ID" --lang es
node "\scripts\fetch.mjs" --url "https://www.youtube.com/watch?v=VIDEO_ID" --timestamps
node "\scripts\fetch.mjs" --url "https://www.youtube.com/watch?v=VIDEO_ID" --json
node "\scripts\fetch.mjs" --help
POSIX shell examples:
node "/scripts/fetch.mjs" --url "https://www.youtube.com/watch?v=VIDEO_ID"
node "/scripts/fetch.mjs" --url "https://www.youtube.com/watch?v=VIDEO_ID" --json
For all flags, dedup details, output formats, dependency notes, and troubleshooting, load references/youtube-transcript-contract.md.
Operating guidance
- Pass the full user-provided YouTube URL; do not invent/transform URL forms unnecessarily.
- Default to
--lang enunless another language is clear. - Use default plain text for direct human reading and summaries.
- Use
--jsonas the default structured handoff for research triage, summarization, and downstream tooling. - Use
--timestampsonly when timestamped notes, quote traceability, or debugging are needed; it is an advanced/evidence mode, not the recommended default for reading. - Use
--json --timestampsonly for machine traceability workflows that need timestamp anchors inside JSON; it is not intended as a human-readable inspection format. - Save long transcripts to a file when useful; do not paste giant transcripts unless requested.
- Summarize first and quote sparingly by default.
- Respect copyright and platform terms; do not republish long/full transcripts unless the user has rights or permission.
- Note that captions may be auto-generated and imperfect.
Required checks before publishing/updating
Minimum no-video/no-network checks:
node --check skills\youtube-transcript-native-node\scripts\fetch.mjs
node skills\youtube-transcript-native-node\scripts\self-test.mjs
node skills\youtube-transcript-native-node\scripts\fetch.mjs --help
node skills\youtube-transcript-native-node\scripts\fetch.mjs --url "https://example.com/watch?v=not-youtube" --json
The invalid-host smoke should fail before invoking yt-dlp.
Optional environment check:
yt-dlp --version
Do not install/update yt-dlp as part of this skill without explicit approval.
Public registry exposure
Classification: public ClawHub utility candidate with external binary + YouTube access.
Before public update, run sanitizer/static checks and ensure docs clearly disclose:
yt-dlpdependency and PATH/binary trust boundary;- YouTube-only URL allowlist;
- no API keys/env secrets/config reads;
- temp-directory behavior and stderr temp-path scrubbing;
- no audio/video download and no audio transcription;
- expected
child_processstatic-analysis warning. - best-effort scrub of temp- and home-directory paths from the last lines of
yt-dlpstderr; unrelated absolute paths emitted byyt-dlpitself may remain.
Respect copyright and platform terms in examples, docs, and outputs: prefer summaries and brief quotes; do not publish long/full third-party transcripts unless rights or permission are clear.
Do not include private/internal/client strategy, operator-specific operational notes, or full third-party transcript samples in a public release.
Changelog
1.1.5: Input/docs polish: require--langto begin with an alphanumeric, add POSIX command examples, sync reference changelog, and neutralize process wording. No categories, topics, topic tags, tags, keywords, or ClawHub catalog metadata added to source.1.1.4: Version refresh; no runtime behavior change.1.1.3: Add stubbed offline yt-dlp fixture tests for dependency-missing, nonzero-exit-with-VTT, 429 hint, temp/home path scrubbing, output-size guard, timeout, and output modes; gate self-test hooks behindYOUTUBE_TRANSCRIPT_SELFTEST=1; continue when usable VTT subtitles are produced despite nonzero yt-dlp exit; kill active yt-dlp child on SIGINT/SIGTERM; broaden local-path scrubbing and scrub unexpected/read-error paths.1.1.2: Add offline self-test fixtures, export parser/allowlist helpers for tests, pass--ignore-config, remove subtitle conversion postprocessor to avoid ffmpeg ambiguity, scrub temp path from yt-dlp error tails, and surface 429 retry guidance.1.1.1: Docs cleanup: normalized input/output packet wording, structured handoff wording, and changelog language; no runtime behavior change.
Questions people ask
- Does it transcribe audio?
- No. It only extracts existing YouTube captions (creator-uploaded or auto-generated). It does not download or transcribe audio.
- What does it need installed?
- No npm packages. The skill requires the `yt-dlp` binary on PATH, and you should not install or update it without explicit approval.
- Which sites and videos are supported?
- YouTube only, on the youtube.com/www.youtube.com/m.youtube.com/youtu.be hosts. Live streams that have not ended are not supported.
- Does it use API keys or read any secrets?
- No. It reads no API keys, environment secrets, or credential/config files, and passes `--ignore-config` so user-level yt-dlp config does not alter wrapper behavior.
Related skills
Summarize YouTube videos into Markdown notes with chapter breakdowns, timestamped transcripts, and key takeaways.
YouTube transcript extraction and content reformatting: given a YouTube video URL, opens the video's transcript panel, extracts all timestamped segments, and...
Reach for this whenever a task touches YouTube, said or unsaid: pasted video/channel/playlist links, IDs and @handles, summaries, quotes, translations, topic research through talks and tutorials, creator monitoring. The full TranscriptOut surface: transcripts in five formats, search, channels, playlists and batch jobs. Skip it for uploads and account chores.
Pulls structured YouTube data — video and channel details, transcripts/captions, comments, playlists, and search — via the Crawlora API as clean JSON, with no yt-dlp or HTML scraping. Use when the user provides a YouTube URL or asks for a transcript, comments, channel/video metadata, or video search results.
Fetch YouTube video transcripts, search YouTube, list channel or playlist videos, and track new uploads via the BulkTranscripts API. Use when the user shares a YouTube link, asks to summarize/analyze/quote a video, wants transcripts for a whole channel or playlist, needs YouTube research, or asks what a channel posted recently. Works immediately with no API key (free tier); set BULKTRANSCRIPTS_API_KEY for purchased credits.