From learning-tools
Analyze YouTube or local videos for private learning notes: transcript-first summarization, timestamped evidence, authorized keyframe extraction with yt-dlp/ffmpeg, adversarial viewpoint analysis, and original local hand-drawn explainer visuals. Trigger when user asks to summarize, study, extract notes, capture key frames, critique viewpoints, or create visual learning reports from a video.
How this skill is triggered — by the user, by Claude, or both
Slash command
/learning-tools:youtube-study-noteThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Treat a video as a time-indexed evidence source, not just a blob of media.
Treat a video as a time-indexed evidence source, not just a blob of media.
[FACT]: explicitly stated or shown in the video.[AUTHOR_VIEW]: the creator's claim, opinion, framework, or recommendation.[MODEL_INFERENCE]: inferred by the agent from transcript/frames.[COUNTERPOINT]: adversarial or alternative explanation.[JUDGMENT]: final synthesis with confidence.Default note packages are written under ~/Documents/video-note unless the user passes --out. Each video gets one self-contained folder named from the video title:
~/Documents/video-note/<video-title-slug>/
Treat that folder as the video learning package. Keep the transcript, JSON artifacts, Markdown report, HTML preview, screenshots, source transcript copies, and logs inside it so the package can be reopened or moved as one unit. For human browsing, also write chapter-level notes under:
~/Documents/video-note/<video-title-slug>/chapters/<chapter-title-slug>/
Each chapter folder should include chapter.md, chapter.json, and any selected frames for that chapter.
Default to private-note safe mode:
Before running tools, check local dependencies:
node "<skill-dir>/scripts/check-deps.mjs"
Required:
Optional:
imagegen skill/tool for raster learning illustrations.Use run for the default private-note workflow. It prepares evidence, generates deterministic first-pass analysis files, renders the report, and writes run-review artifacts under ~/Documents/video-note/<video-title-slug> when --out is omitted. YouTube URLs may use the v= video id only as a temporary bootstrap path before metadata is known; the final package should be rehomed to the title folder.
python3 "<skill-dir>/scripts/video_tool.py" run \
--input "https://www.youtube.com/watch?v=VIDEO_ID"
If YouTube asks for bot/sign-in confirmation during metadata or subtitle extraction, retry with a local browser cookie source only for private local processing:
python3 "<skill-dir>/scripts/video_tool.py" run \
--input "https://www.youtube.com/watch?v=VIDEO_ID" \
--cookies-from-browser chrome
Or use an exported Netscape-format cookies file:
python3 "<skill-dir>/scripts/video_tool.py" run \
--input "https://www.youtube.com/watch?v=VIDEO_ID" \
--cookies "/path/to/youtube-cookies.txt"
The helper passes --js-runtimes node to yt-dlp by default because modern YouTube extraction may require a JavaScript runtime.
Use --tool-timeout 120 or lower when diagnosing a browser-cookie or network stall.
For an existing transcript file, avoid media access entirely:
python3 "<skill-dir>/scripts/video_tool.py" run \
--input "https://www.youtube.com/watch?v=VIDEO_ID" \
--transcript "/path/to/transcript.json" \
--title "Original video title"
When YouTube has no caption track but a reviewed external transcript is available, pass both --input and --transcript. The note package keeps the YouTube URL/ID for timestamp links while avoiding media download.
The one-shot safe-mode output includes:
metadata.jsontranscript.jsontranscript.mdsummary.jsondebate.jsonframe_plan.jsonlesson_units.jsonvisual_storyboard.jsonassessment.jsonasset_health.jsonreplacement_review.jsonimage_prompts.jsongenerated_images.jsongenerated/ after running the image stepchapters/ with one folder per chapter titlerun_review.jsonnotes_for_next_run.mdreport.mdreport.htmlindex.htmlframes/source_transcripts/logs/Safe mode does not save public-video frames. Use timestamp links in frame_plan.json and report.md unless the user explicitly authorizes local frame extraction.
Use prepare to collect metadata and transcript.
python3 "<skill-dir>/scripts/video_tool.py" prepare \
--input "https://www.youtube.com/watch?v=VIDEO_ID" \
--languages "zh.*,en.*" \
--whisper-model "mlx-community/whisper-large-v3-turbo"
The tool writes:
metadata.jsontranscript.jsontranscript.mdagent_packet.jsonlogs/prepare.logRun the deterministic first-pass analyzer, or have the agent read agent_packet.json and transcript.md for deeper model-assisted analysis.
python3 "<skill-dir>/scripts/video_tool.py" analyze \
--out "~/Documents/video-note/VIDEO_ID"
summary.jsondebate.jsonframe_plan.jsonimage_prompts.jsonFollow the schemas in references/schemas.md.
Frame plan rules:
reason, topic, evidence_quote, and need_frame.need_frame: false.Only run this when user allows local frame extraction.
python3 "<skill-dir>/scripts/video_tool.py" frames \
--input "https://www.youtube.com/watch?v=VIDEO_ID" \
--out "~/Documents/video-note/VIDEO_ID" \
--frame-plan "~/Documents/video-note/VIDEO_ID/frame_plan.json" \
--mode authorized
The tool extracts candidates at t-2, t, t+2, then creates frames/index.json for agent review.
For each candidate group, choose the best frame or discard all. Write:
frames/selected_frames.jsonKeep only frames that improve the core content. Discard frames for intros, self-promotion, creator biography, and transition filler unless they contain an essential concept.
The analyzer creates image_prompts.json, including overall viewpoint maps and concept-level illustrations for extracted jargon. Use the built-in imagegen skill/tool to generate each prompt as a real bitmap image. Built-in imagegen saves under $CODEX_HOME/generated_images/...; copy or register those final images into the video package before rendering.
After built-in imagegen returns image files, register them:
python3 "<skill-dir>/scripts/video_tool.py" image \
--out "~/Documents/video-note/VIDEO_ID" \
--image-prompts "~/Documents/video-note/VIDEO_ID/image_prompts.json" \
--asset sketch_map_01="~/.codex/generated_images/.../first.png" \
--asset review_card_01="~/.codex/generated_images/.../second.png" \
--render
The image step writes:
generated/sketch_map_01.pnggenerated/review_card_01.pnggenerated_images.jsonThese are real raster image files rendered in index.html and report.md, not prompts for the user to copy.
Keep these visuals as built-in imagegen drawings rather than SVG approximations. The default style should feel like a 小黑 hand-drawn explainer: pure white background, 16:9 landscape, lots of whitespace, and legible short labels. Concept images must teach one term at a time; viewpoint maps should expose the video's core argument, objections, and practical takeaway. Do not make abstract machinery if it hides the meaning.
python3 "<skill-dir>/scripts/video_tool.py" render \
--out "~/Documents/video-note/VIDEO_ID"
Output:
report.mdreport.htmlindex.htmlOpen index.html first for the interactive study view. The HTML is a standalone local page that uses only files from the same video folder. It should include:
frames/selected_frames.json, aligned to the chapter they supportreplacement_review.json; below 85 means the package is useful but should not be described as a complete replacement for the videoAlways run four passes, even if implemented by one model:
Summarizer: explain the author fairly.Skeptic: identify missing evidence, ambiguity, bias, weak causality, survivorship bias, or overclaiming.Counter-Analyst: reconstruct the strongest alternative interpretation.Judge: synthesize what is useful, what is questionable, what needs verification, and how confident the agent is.Use timestamp evidence for every major claim.
After each successful run, update local experience only with verified observations:
python3 "<skill-dir>/scripts/video_tool.py" remember \
--out "./video_notes/VIDEO_ID" \
--source "youtube.com" \
--note "Auto captions for this channel were noisy; mlx-whisper large-v3-turbo performed better for mixed Chinese/English audio."
Write experience under references/video-patterns/. Do not store private transcript excerpts there unless the user explicitly wants that.
references/boundaries.md: legal/safety/product boundaries for private notes.references/schemas.md: JSON schemas for summary, debate, frame plan, image prompts.references/prompts.md: reusable prompts for summarization, critique, frame selection, and image generation.references/video-patterns/: local verified experience, updated incrementally.npx claudepluginhub wangjs-jacky/jacky-skills --plugin learning-toolsAnalyzes YouTube videos using both transcript and visual frame extraction for step-by-step guides, especially useful for tutorials, demos, and how-to videos.
Transcribes and analyzes any video (YouTube, Loom, Vimeo, Zoom, local files) with three depth modes: transcript, visual (with frame extraction and Claude vision), and multimodal (Gemini native video).
Extracts scene-change frames, pacing metrics, and transcript from video URLs or local paths; produces structured report for editorial analysis.