youtube-to-pdf
将 YouTube 视频通过 NotebookLM 深度分析后,转换为结构化的 PDF 教程文档。 适用于将教程、播客、课程类视频转化为书面内容。 Triggers: "视频转PDF"、"生成教程"、"视频转文字教程"、"YouTube to PDF"、"video to tutorial PDF"
معلومات المصدر
- المستودع
- yang0/youtube-to-pdf
- آخر نشاط في المصدر
- ١١ مايو ٢٠٢٦ في ٢٢:٣٥
- لغة SKILL.md المكتشفة
- الصينية
- النجوم
- ٠
- التفرعات
- ٠
خيارات التثبيت
يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.
مراجعة ملفات المصدر
اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.
عرض SKILL.md
SKILL.md
تعليمات المصدر · معاينة للقراءة فقط- name
- youtube-to-pdf
- description
- 将 YouTube 视频通过 NotebookLM 深度分析后,转换为结构化的 PDF 教程文档。 适用于将教程、播客、课程类视频转化为书面内容。 Triggers: "视频转PDF"、"生成教程"、"视频转文字教程"、"YouTube to PDF"、"video to tutorial PDF"
# YouTube to PDF — 视频转PDF教程
将 YouTube 视频通过 NotebookLM 渐进式分析,提取为结构化 Markdown,最终输出 PDF 教程。
## 核心链路
```
YouTube URL → NotebookLM(创建notebook→添加source→渐进式ask)
→ 本地Markdown(分章节保存) → 合并 → md-to-pdf → PDF
```
## 前置环境
| 工具 | 用途 | 安装 |
|------|------|------|
| `notebooklm` CLI | NotebookLM 操作入口 | 已全局安装 |
| `notebooklm-py` + `curl_cffi` | NotebookLM 底层依赖 | `pip install curl_cffi` |
| Chrome CDP | NotebookLM 认证提取 | 预登录 YouTube/Google 的 Chrome profile |
| `cdp_login.py` | 一键刷新 NotebookLM 认证 | 位于 `use-notebooklm/scripts/` |
| `md-to-pdf` | Markdown → PDF 转换 | `npm install -g md-to-pdf` |
| Python 3 | 文件合并脚本 | 系统已有 |
## 四阶段工作流
### Phase 0: 认证检查
**每次操作 NotebookLM 前必须先确认认证有效。**
```bash
# 快速检查
notebooklm status
```
如果返回 `Authentication expired`:
```bash
# 1. 确认 Chrome CDP 在运行
Invoke-WebRequest -Uri "http://127.0.0.1:9223/json/version" -UseBasicParsing
# 2. 如果 Chrome 未启动,先启动 CDP
Get-Process chrome -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Sleep 2
& "C:\Program Files\Google\Chrome\Application\chrome.exe" `
--remote-debugging-port=9223 `
--user-data-dir="G:\chrome_data\remote_debug" `
--remote-allow-origins=* `
about:blank
# 3. 提取认证 cookies
python E:\projectHome\use-notebooklm\scripts\cdp_login.py --port 9223
# 4. 验证
notebooklm status
```
> **根因**: NotebookLM 认证通过 Chrome CDP 从预登录 Google 账号的 profile 提取 cookies。Chrome profile `G:\chrome_data\remote_debug` 必须已经登录 Google/NotebookLM。
---
### Phase 1: 创建 Notebook + 添加 Source
```bash
# 1. 创建新 notebook
notebooklm create --json "教程标题" 2>&1
# → 记录返回的 notebook.id (UUID)
# 2. 添加 YouTube 视频作为 source
notebooklm source add "https://www.youtube.com/watch?v=VIDEO_ID" -n <notebook-id>
# → 返回 source-id,等待处理完成(通常 30 秒内)
```
**重要约定**:
- 一个视频 = 一个 notebook,避免多 source 内容交叉污染
- Source 上限 30 条,单视频教程通常只需 1 条
- YouTube URL 直接作为 source 传入,NotebookLM 自动处理转写
---
### Phase 2: 渐进式内容提取
**核心原则: 反思驱动,非计划驱动。** 每一轮提问基于前一轮的返回结果决定下一轮要深入什么。
#### Round 1: 获取章节目录(索引)
```bash
notebooklm ask "把这个视频内容拆成一个详细的章节目录。对每一章列出: (1) 标题 (2) 核心概念 (3) 3-5个关键要点。" -n <notebook-id> 2>&1
```
**反思**: 哪些章节是核心?哪些只是过渡?根据返回决定接下来深入哪些章节。
#### Round 2-N: 逐章深挖
每轮只提取一章,英文提问更稳定(NotebookLM 中文编码偶有乱码):
```bash
notebooklm ask "Extract Chapter N on [主题] in complete tutorial detail. Cover: [3-5个具体要点]. Include examples and quotes. Write with markdown formatting." -n <notebook-id> 2>&1
```
**Round 模板**:
| 章类型 | 提问模板 |
|--------|---------|
| 概念章 | "Extract Chapter X on [概念] in detail. Cover: (1) definition and analogy, (2) core mechanism, (3) real-world example, (4) why it matters." |
| 工具章 | "Extract Chapter X on [工具/框架] in detail. Cover: (1) what it is, (2) key features, (3) comparison with alternatives, (4) setup steps, (5) best practices." |
| 实操章 | "Extract Chapter X on [实操主题] as a step-by-step tutorial. Cover: (1) prerequisites, (2) detailed steps with code/examples, (3) common pitfalls, (4) final result." |
**反思清单** (每轮必须回答):
- [ ] 这次返回覆盖了哪些内容?
- [ ] 哪些重要内容明显被省略了?
- [ ] 是否有概念需要前置解释?
- [ ] 下一步最值得深入的是哪个部分?
**每轮拿到结果后**,立即用 `write` 工具保存为本地文件:
- `tutorial/ch01-xxx.md`
- `tutorial/ch02-xxx.md`
- ...
> 不要等所有章节问完再统一保存。每轮问完立刻存,防止 NotebookLM 会话丢失。
---
### Phase 3: 翻译与打磨
NotebookLM 提取的内容是英文的(更稳定),需要翻译成中文。
**策略**: 用当前 LLM(你自身)翻译,而非 NotebookLM。
每章保存为 Markdown 后,由编排层逐章翻译:
1. 读取英文 Markdown
2. 翻译为中文(保持 Markdown 格式、术语一致、口语化)
3. 覆盖写入为中文 Markdown
**翻译规范**:
- 技术术语统一(参考视频配音阶段建立的 glossary)
- 口语化表达,适合阅读(非字幕的 4 字/秒限制,此处无字数限制)
- 保留原文中的引用块(`>`)和重点标记(`**`)
- 关键概念首次出现时保留英文原名,如"智能体(Agent)"
---
### Phase 4: 合并 → PDF
```bash
# 1. 用 Python 合并所有章节为单文件
python -c "
import os
base = r'<output-dir>'
chapters = ['ch01-xxx.md', 'ch02-xxx.md', ...]
titles = ['第一章 xxx', '第二章 xxx', ...]
lines = ['# <书名>', '## 来源: <YouTube URL>', '', '## 目录', '']
for i, t in enumerate(titles, 1):
lines.append(f'{i}. {t}')
lines.extend(['', '---', ''])
for fname, title in zip(chapters, titles):
with open(os.path.join(base, fname), 'r', encoding='utf-8') as f:
content = f.read()
lines.append(f'# {title}')
lines.append('')
clines = content.strip().split('\n')
if clines[0].startswith('# '):
clines = clines[1:]
lines.append('\n'.join(clines))
lines.append('\n---\n')
with open(os.path.join(base, '00-full-tutorial.md'), 'w', encoding='utf-8') as f:
f.write('\n'.join(lines))
"
# 2. md-to-pdf 转换
md-to-pdf "<output-dir>/00-full-tutorial.md" --basedir "<output-dir>"
```
**md-to-pdf 注意事项**:
- 默认使用 Chromium 渲染,中文支持良好
- 首次运行会下载 Chromium(约 280MB),等待即可
- 如需自定义样式,MD 文件同级放置 `00-full-tutorial.css`
---
## 实战案例(完整端到端)
以 Greg Isenberg 的 "Building AI Agents" (58分钟) 为例:
```bash
# Phase 0: Auth
python E:\projectHome\use-notebooklm\scripts\cdp_login.py --port 9223
# Phase 1: Setup
notebooklm create --json "AI Agents Tutorial Greg Isenberg"
# → id: 13f9dd68-5fe7-44c3-b2ae-74289a1e3532
notebooklm source add "https://www.youtube.com/watch?v=eA9Zf2-qYYM" -n 13f9dd68-...
# Phase 2: Extract (8 rounds)
# Round 1 - Index
notebooklm ask "把这个视频内容拆成一个详细的章节目录..." -n 13f9dd68-...
# → 8 chapters identified
# Rounds 2-7 - Deep dives
notebooklm ask "Extract Chapter 1 on AI Agents fundamentals..." -n 13f9dd68-...
# → saved as ch01-ai-agents-fundamentals.md
# ... repeat for all 8 chapters ...
# Phase 4: Merge + PDF
# → 合并为 00-full-tutorial.md → md-to-pdf → 693KB PDF
```
**产出**: 8 章结构化 Markdown + 1 个 693KB PDF,全程 ~30 分钟。
---
## 故障排查
| 症状 | 原因 | 解决 |
|------|------|------|
| `Authentication expired` | NotebookLM cookies 过期 (通常 24h) | `cdp_login.py --port 9223` |
| `Chrome CDP not reachable` | Chrome 未启动或端口冲突 | Kill Chrome → 重新 `--remote-debugging-port=9223` |
| `ask` 返回乱码(`????`) | NotebookLM 中文编码不稳定 | 改用英文提问,最后由 LLM 翻译 |
| `ask` 提问到错误的 notebook | CLI 自动 resumes 到之前的上下文 | **每个 ask 都显式加 `-n <notebook-id>`** |
| `md-to-pdf` 首次运行慢 | 正在下载 Chromium | 等待,仅首次需要 |
| 章节内容太简短 | 提问不够具体 | 用 Round 模板,明确列出 3-5 个要点 |
| 合并后 PDF 中文显示异常 | 缺少中文字体 | Windows 自带微软雅黑,一般无此问题 |
---
## 与子 Skill 的关系
本 skill 编排以下工具,自身不实现底层逻辑:
| 组件 | 职责 |
|------|------|
| `notebooklm` CLI | NotebookLM 操作(create, source add, ask) |
| `cdp_login.py` (use-notebooklm) | NotebookLM 认证刷新 |
| `md-to-pdf` (npm) | Markdown → PDF 渲染 |
| 编排层 LLM | 翻译、术语管理、质量把控 |
---
## 文件结构
```
<output-dir>/
├── tutorial/
│ ├── 00-full-tutorial.md # 合并版 Markdown
│ ├── 00-full-tutorial.pdf # 最终 PDF
│ ├── ch01-xxx.md # 分章节文件
│ ├── ch02-xxx.md
│ └── ...
└── video.mp4 # (可选) 原始视频
```
---
**版本**: v1.0
**最后更新**: 2026-05-12
**维护者**: Claude Code
عرض على GitHub