Auto-Updater Skill
一个面向 Other 场景的 Agent 技能。原始说明:Automatically update Clawdbot and all installed skills once daily. Runs via cron, checks for updates, applies them, and messages the user with a summary of what changed.
name: video-notes
slug: video-notes
version: 1.1.0
author: 2992638402-art
description: 把 YouTube / 哔哩哔哩视频变成一份精美的结构化笔记。自动提取字幕、识别关键时刻并截图、生成核心论点总结和 SVG 图表,输出带侧边导航和全文搜索的单文件 HTML 文档。适用于技术演讲、公开课、播客、产品发布会等场景。This skill should be used when a user provides a YouTube or Bilibili URL and asks to take notes, summarize a video, or create a study document from video content.
Convert any YouTube / Bilibili video into a polished, self-contained HTML notes document with:
python3 ~/.claude/skills/video-notes/scripts/extract_subtitles.py <url> --output /tmp/subs.json
语言参数:
--lang--lang zh 或 --lang zh-HansYouTube 认证问题(常见!):
若直接运行报错 Sign in to confirm you're not a bot 或 No subtitles found,需要传入浏览器 cookies:
# 使用 Chrome cookies(推荐)
python3 ~/.claude/skills/video-notes/scripts/extract_subtitles.py <url> \
--output /tmp/subs.json \
--cookies-from-browser chrome
# 或使用已导出的 cookies 文件
python3 ~/.claude/skills/video-notes/scripts/extract_subtitles.py <url> \
--output /tmp/subs.json \
--cookies /tmp/yt-cookies.txt
脚本内置降级策略(自动执行,无需手动干预):
--skip-download 直接获取字幕(速度最快)-f sb3(storyboard 格式,YouTube 始终可用)触发字幕下载,解析 VTT 格式哔哩哔哩支持:
B站视频直接传 URL,yt-dlp 原生支持:
# B站视频(中文字幕)
python3 ~/.claude/skills/video-notes/scripts/extract_subtitles.py \
"https://www.bilibili.com/video/BVxxxxxxxx" \
--lang zh --output /tmp/subs.json
# 需要登录的 B站视频(会员内容等)
python3 ~/.claude/skills/video-notes/scripts/extract_subtitles.py \
"https://www.bilibili.com/video/BVxxxxxxxx" \
--lang zh --cookies-from-browser chrome --output /tmp/subs.json
注意:B站部分视频有人工上传字幕(非 AI 生成),脚本已同时尝试
--write-subs和--write-auto-subs,两种都能获取。没有任何字幕的视频(纯口播无字幕)会返回错误,此时需告知用户。
Output: [{"t": "mm:ss", "s": 123.4, "text": "..."}]
Run the keyframe script. It scores subtitles using heuristics, selects the most important moments (spaced ≥60s apart), downloads only those short video sections, and extracts frames:
python3 ~/.claude/skills/video-notes/scripts/capture_keyframes.py \
<youtube_url> /tmp/subs.json \
--max-frames 8 \
--output-json /tmp/keyframes.json
Output: [{"t": "mm:ss", "s": 123.4, "text": "...", "score": 0.5, "image_b64": "..."}]
{{KEYFRAMES_JSON}} to [] in the template — the gallery section will auto-hide.--max-frames is 8; reduce for faster generation or increase for longer videos.Read the subtitle text to understand:
Use assets/note-template.html as the foundation. Fill in each placeholder:
| Placeholder | Content |
|---|---|
| {{TITLE}} | Page <title> tag |
| {{SIDEBAR_NAV}} | .sb-logo block + .nav-a links for each section |
| {{SUMMARY}} | Executive summary HTML (see below) |
| {{MAIN_CONTENT}} | Hero block + all note sections |
| {{SUBTITLE_SEC_NUM}} | Section number for the subtitle panel (e.g. 6) |
| {{VIDEO_URL}} | Full YouTube URL |
| {{VIDEO_ID}} | YouTube video ID (e.g. dQw4w9WgXcQ) |
| {{SUBTITLE_JSON}} | Full JSON array from Step 1 |
| {{KEYFRAMES_JSON}} | Full JSON array from Step 2 (or [] if skipped) |
| {{SECTION_IDS}} | JS array: ['hero','summary','s1','s2','keyframes','subtitles'] |
{{SUMMARY}})Write ~300 words of HTML paragraphs inside <p> tags. Structure:
Use <strong style="color:var(--text)"> for emphasis. Keep line-height loose (line-height:2).
Always include a hero section (id="hero") with:
.hero-badge: speaker name + event/source<h1>: video title (concise, impactful).hero-sub: speaker · role · note type.chips: 3–5 topic tags.hero-quote: the single most memorable quoteFor each major topic area, create <div class="sec" id="sN"> with:
.sec-hd header (numbered .sec-n + .sec-title).card, .g2/.g3 grids, .diag SVG diagrams, .tl timelines, .ql quotes.diag blocks)Generate SVGs for comparisons, progressions, and architectures:
Background: rgba(R,G,B,.4) fill + rgba(R,G,B,.3) stroke
Labels: fill="#fff" font-weight="700"; sublabels: fill="#aaa" font-size="9-10"
Arrows: › in <text>, colored to match the row
Connectors: stroke="rgba(255,255,255,.12)" stroke-dasharray="3,3"
Color palette:
#5b8dee → #9b7cf4 | Green flow: #3ecf8e → #5b8deergba(244,63,94,.4) | Mid: rgba(240,169,70,.4) | New: rgba(62,207,142,.4)<div class="sb-logo">
<div class="sb-logo-icon">🎬</div>
<h2>{{Short Title}}</h2>
<p>{{Speaker}} · {{Source}}</p>
</div>
<a class="nav-a active" href="#hero"><span class="nav-icon">🏠</span>概览</a>
<a class="nav-a" href="#summary"><span class="nav-icon">✦</span>核心总结</a>
<!-- one .nav-a per note section -->
<div class="nav-sep"></div>
<a class="nav-a" href="#keyframes"><span class="nav-icon">🎬</span>关键画面</a>
<a class="nav-a" href="#subtitles"><span class="nav-icon">📄</span>原始字幕</a>
open /tmp/<video-id>-notes.html # macOS
Tell the user: save path, subtitle entry count, keyframe count, sections covered.