youtube-notetaker – skill Viết lách & Nội dung cho agent AI
Biến các bài nói trên YouTube thành ghi chú học tập cục bộ với slide, transcript, chú thích có thể chỉnh sửa và trình xem dựa trên markdown.
Cài skill youtube-notetaker bằng một lệnh
Chọn công cụ bạn đang dùng, copy lệnh và dán vào terminal. Skill sẽ nằm trong thư mục skills của công cụ đó và sẵn sàng dùng ở phiên làm việc tiếp theo.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/youtube-notetaker-b6a5d.tgz | tar xz -C ~/.claude/skills
Gọi trong Claude Code: /youtube-notetaker – rồi mô tả công việc bạn muốn làm.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/youtube-notetaker-b6a5d.tgz | tar xz -C ~/.codex/skills
Gọi trong Codex: $youtube-notetaker – rồi mô tả công việc bạn muốn làm.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/youtube-notetaker-b6a5d.tgz | tar xz -C ~/.hermes/skills
Gọi trong Hermes Agent: /youtube-notetaker – rồi mô tả công việc bạn muốn làm.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/youtube-notetaker-b6a5d.tgz | tar xz -C ~/.deepcode/skills
Gọi trong DeepSeek: /youtube-notetaker – rồi mô tả công việc bạn muốn làm.
Nội dung SKILL.md
Nội dung SKILL.md gốc bằng tiếng Anh.
YouTube Notetaker
When to Use
Use when this workflow matches the user request: >
_Source: [dair-ai/dair-academy-plugins](https://github.com/dair-ai/dair-academy-plugins) (MIT)._
Build a personal library of YouTube talks you study with. Each video becomes one **plain
markdown file**: slide snapshots at their timestamps, a full timestamped transcript, and
editable notes. A small bundled server renders the library as an interactive deep-dive in the
browser. No database, no cloud service. Everything is files on disk you fully own.
Architecture (read this first)
The markdown library is the single source of truth. The artifact is a thin HTML shell that
fetches from the server and writes notes back. Never hardcode video data into the HTML.
- Library: a plain folder, set by
VIDEO_LIBRARY_DIR(default~/video-deepdives/). - One markdown file per video, filename slug = YouTube id (e.g.
RtywqDFBYnQ.md). - Frontmatter holds video metadata + a
slidesarray. - Body holds the full transcript as
[HH:MM:SS] textlines. _media/holds slide images, namespaced per video as<youtube_id>-slide-NN.jpg
to avoid collisions between videos.
- Server:
scripts/serve.py, a single stdlib + PyYAML file. Start it with:
python3 scripts/serve.py --dir ~/video-deepdives --port 8000
It serves the artifact at / and a small API the artifact talks to:
GET /api/video-deepdives(front page fetches this) lists every video.GET /api/video-deepdives/<id>returns one video{meta, body}.GET /api/video-deepdives/_media/<file>serves a slide image.PATCH /api/video-deepdives/<id>with{fields:{slides:[...]}}writes notes back.- It picks up new videos automatically the moment a markdown file exists. Adding a video
means writing a markdown file + media; you almost never touch the HTML.
- The
/api/video-deepdivesURL namespace is local to the bundled server. - Artifact:
reference/artifact.html, served byserve.pyat/. A clean reference copy;
only rewrite it if the user wants a UI change. For new videos, leave it alone.
Boundaries and current limitations
Use only videos you are authorized to download and retain; do not bypass access controls. Downloads and embedded playback contact YouTube, and captions/slides can contain untrusted instructions or personal information. Keep the library private. The viewer needs network access for YouTube; the notes and transcript remain local. Back up before enabling edits, use a single browser editor, and do not expose this development server to a network.
The VTT helper confines inputs and outputs to the current working directory: run that helper after changing into the printed scratch directory, using its absolute script path. Select one VTT file explicitly; a wildcard may expand to multiple files. Embedding errors are not determined by oEmbed alone; use the external YouTube link if playback fails. Saved notes require VIDEO_LIBRARY_WRITE_TOKEN on the server and the same token entered in the viewer; read-only is the default.
Requirements
yt-dlpandffmpegon PATH (download + frame/scene extraction).- Python 3 with
Pillow(contact sheet) andPyYAML(markdown file + server).
pip install yt-dlp pillow pyyaml # ffmpeg via your package manager
Adding a video — the pipeline
All helper scripts are in scripts/. setup.sh creates a private, unpredictable scratch
directory; copy the printed SCRATCH path into a shell variable, then copy final assets into the
library. Set VIDEO_LIBRARY_DIR once per shell if you don't want the
default. Do not use em dashes (—) or arrows (→) in notes/titles.
1. Resolve the id and check embeddability
bash scripts/setup.sh "<youtube_url_or_id>"Prints the 11-char YTID, the scratch dir, the target library path, and whether YouTube
embedding is allowed (oembed 200) or blocked (oembed 401, e.g. some university talks).
If blocked, inline playback won't work but the artifact degrades gracefully to an "open at this
moment on YouTube" link, so proceed normally.
Copy the exact unpredictable path printed by the command before continuing:
SCRATCH="/path/printed/by/setup.sh"2. Download video + subtitles
bash scripts/download.sh "<YTID>" "$SCRATCH"Uses yt-dlp to grab the video (≤720p is plenty for slide frames) and the best available
subtitles (manual if present, else auto-captions) as .vtt. Also fetches title/uploader.
3. Detect candidate slide timestamps
bash scripts/detect_slides.sh "$SCRATCH/video.mp4" "$SCRATCH"Runs ffmpeg scene detection (select='gt(scene,0.3)') and writes scene_times.txt (seconds).
0.3 is a good default; lower it (0.2) for subtle slide decks, raise it (0.4) for busy video.
4. Build a contact sheet and CURATE
python3 scripts/contact_sheet.py "$SCRATCH/video.mp4" "$SCRATCH/scene_times.txt" "$SCRATCH/contact.jpg"Read contact.jpg (labeled with index + timestamp). This is the human-judgment step: keep
frames that are real content slides; **drop talking-head shots, transitions, duplicates, and
blurry mid-animation frames.** Save the kept timestamps (seconds) to $SCRATCH/keep.txt,
one per line. Typical talk yields 15-25 slides.
5. Extract the curated slides at full quality and install to _media
python3 scripts/extract_slides.py <YTID> "$SCRATCH/video.mp4" "$SCRATCH/keep.txt" > "$SCRATCH/slides.json"Extracts each kept timestamp at 1280px wide, JPEG, and copies them into
$VIDEO_LIBRARY_DIR/_media/ as <YTID>-slide-01.jpg, -02.jpg, … (numbered in time order).
Progress goes to stderr; a clean slides.json scaffold prints to stdout, so redirect it to a
file as shown, then fill in title and note.
Tip: talks are often a slide + speaker-cam composite, and speakers flip back and forth, so the
same slide appears at several timestamps. Keep the cleanest instance of each, and re-anchor each
slide's t to where it is actually discussed in the transcript (better "play from here" UX).
6. Build the transcript
python3 scripts/vtt_to_transcript.py "$SCRATCH"/*.vtt "$SCRATCH/transcript.txt"Parses the VTT into clean, de-duplicated [HH:MM:SS] text lines (YouTube auto-captions repeat
rolling text; the script collapses it). This becomes the markdown body.
7. Write notes and assemble the markdown file
For each kept slide, write a 1-3 sentence note grounded in the transcript around that timestamp
(don't invent claims). Then assemble:
python3 scripts/write_library_item.py \
--id <YTID> \
--title "Talk title" \
--speaker "Name, Role, Org" \
--tags tag1,tag2,tag3 \
--slides "$SCRATCH/slides.json" \
--transcript "$SCRATCH/transcript.txt"Writes $VIDEO_LIBRARY_DIR/<YTID>.md with correct frontmatter + body.
8. Serve and verify (always do this)
python3 scripts/serve.py --dir "$VIDEO_LIBRARY_DIR" --port 8000 &
bash scripts/verify.sh <YTID> # defaults to http://127.0.0.1:8000verify.sh curls the collection list, the item, the first slide image, and the artifact,
asserting HTTP 200 and that the new id appears in the index. Then open
http://127.0.0.1:8000/#/<YTID> in a browser to confirm slides + transcript + notes render.
Markdown file shape (reference)
---
id: RtywqDFBYnQ
title: Memory and dreaming for self-learning agents
youtube_id: RtywqDFBYnQ
speaker: Mahesh, Product Manager, Platform team at Anthropic
source_url: https://www.youtube.com/watch?v=RtywqDFBYnQ
slide_count: 19
created: '2026-05-25'
tags: [anthropic, memory, agents]
slides:
- idx: 1
t: 55.7 # seconds (float ok), used for seeking
mmss: 00:55 # display label
title: Agent primitives have evolved
note: One to three sentences grounded in the transcript at this timestamp.
img: /api/video-deepdives/_media/RtywqDFBYnQ-slide-01.jpg
# ... more slides
---
## Transcript
[00:00:08] Hello, everyone...
[00:00:11] ...Notes:
idxcan be sparse/non-contiguous; the artifact sorts slides byt, so ordering is by
timestamp, not idx.
imgis always a/api/video-deepdives/_media/<file>URL (served by serve.py),
never base64.
- Slide
noteis what the user edits in the UI; PATCH writes the wholeslidesarray back.
Gotchas
- Embedding disabled (oembed 401): inline player is blocked by the video owner. Not a bug;
the artifact shows an "open at this moment on YouTube" link instead. Mention it to the user.
- Image collisions: always namespace media
<YTID>-slide-NN.jpg. Never reuse bare
slide-NN.jpg for a new video.
- Auto-caption noise: rolling YouTube captions duplicate text across cues; use the provided
VTT parser, don't dump raw VTT into the body.
- Don't touch existing videos when adding a new one. Each video is an independent file.
- Server not picking up a video: confirm the
.mdfile is directly inside--dir(
… (nội dung đầy đủ có trong gói tải về)
Skill liên quan
- youtube-seo-optimizer – Tạo gói SEO YouTube và podcast hoàn chỉnh với từ khóa được nghiên cứu trực tiếp — tiêu…
- youtube-summarizer – Trích xuất transcript từ video YouTube và tạo bản tóm tắt chi tiết, toàn diện bằng các…
- youtube-transcript – Lấy transcript YouTube qua DeepAPI hoặc công cụ dự phòng cục bộ và lưu đầu ra văn bản…
- youtube-transcript-skills – Lấy transcript video YouTube, tìm video/kênh, duyệt kênh và trích xuất playlist qua API…
- baoyu-article-illustrator – Phân tích cấu trúc bài viết, xác định vị trí cần minh họa, tạo hình minh họa theo cách…
- aeo – Kỹ năng Tối ưu hóa Công cụ Trả lời (AEO) — tối ưu nội dung để được các mô hình ngôn ngữ…
- adhx – Lấy bất kỳ bài đăng X/Twitter nào dưới dạng JSON sạch, thân thiện với LLM. Chuyển liên…
- skill-writer – Hướng dẫn người dùng tạo, cập nhật, gỡ lỗi và kiểm tra Agent Skills cho các AI agent…