Video Study Batch — 视频批量学习
Overview
把任意在线课程视频(政务网课 / 商业 LMS / Bilibili / 直链)批量转化为三样可学习成品:
① 原音 MP3(磨耳朵/复听)② 原文字幕(中英文自动识别,中文输出简体)③ 中文学习报告(要点+金句+行动项)。
不保留视频文件(版权与磁盘考量),视频仅作中间产物用完即删。
本技能已实测三个平台:重庆干部网络学院(localStorage 登录态 + 直链 mp4)、
luminaedu(cookie 登录态 + 腾讯云 VOD SimpleAES DRM 加密流)、Bilibili(免登录原生下载)。
工作流总览
用户给链接/课程
│
├─ 单视频:run_one.py --url <链接>
├─ 整门课:collect_course_items.py → run_batch.py --list <清单>
│
▼
① 下载视频(临时 _tmp/,按平台自动选引擎)
② 提取 原音 MP3 + ASR wav(extract_media.py)
③ Whisper 离线转写 → 原文字幕(transcribe.py)
④ 删除视频 + ASR wav(只留 MP3/字幕)
⑤ AI 读字幕提炼要点 → keypoints json
⑥ build_report.py → 中文报告(md + html)
快速开始
场景 0:陌生平台先用探测脚本(智能体自我弥补的关键)
遇到不在已知列表里的平台时,先运行探测脚本,它会输出结构化诊断报告
(视频源类型 / DRM / 播放器 / 抓到的媒体请求 / 缺口判断 / 适配建议):
python scripts/probe_video.py --url "<播放页URL>" [--profile edge-profile] [--cookies xxx.txt] [--json]
智能体自我弥补工作流(本技能的设计哲学):
1. 运行 probe_video.py → 读诊断报告
2. adapter_gap == "无缺口" → 用现有引擎直接处理
3. adapter_gap == "缺口" → 根据报告的 media_requests 分析视频源模式,
参照 references/platform-guide.md 的方法论自行编写适配器(参考 vod_download.py
的腾讯云 VOD 三级结构 + XHR 取 key 技巧),把新引擎接入 run_one.py 的引擎分流逻辑
4. 用真实视频验证 → 若平台常见,可将新指纹/引擎回写进技能(持续进化)
场景 1:单个视频 → 三样成品
# Bilibili / 直链 / 需登录平台
python scripts/run_one.py --url "https://www.bilibili.com/video/BVxxxx" --title "视频名"
# 本地视频文件
python scripts/run_one.py --video "/path/to/video.mp4" --title "视频名"
场景 2:整门课程 → 批量
# ① 采集课程视频清单(luminaedu 等有 module/list API 的平台)
python scripts/collect_course_items.py --course <课程ID> --out jobs.txt --uid <用户uid>
# ② 批量处理(断点续跑,失败不阻塞)
python scripts/run_batch.py --list jobs.txt --title "课程名"
# ③ AI 提炼要点(主进程/AI 读字幕 → 写 keypoints json)
# ④ 汇总报告
python scripts/build_report.py --keypoints kp1.json,kp2.json --out report.md --title "课程名" --html
场景 3:需登录平台首次配置
# cookie 型平台(如 luminaedu):用户日常浏览器登录后提取 cookie
python scripts/extract_cookies.py --name <平台> --domain-filter .example.com
# localStorage 型平台(如重庆干部学院):搬运登录态到专用 profile
# 见 references/platform-guide.md 第二节
核心脚本说明
| 脚本 | 职责 | 何时使用 |
|---|---|---|
run_one.py |
单视频端到端(自动选下载引擎) | 单视频主入口 |
run_batch.py |
批量调度(断点续跑) | 整门课程 |
collect_course_items.py |
课程视频清单采集 | 有课程 API 的平台 |
probe_video.py |
通用平台探测诊断(输出适配报告) | 新平台先用它 |
extract_media.py |
提取 原音MP3 + ASR wav | 被 run_one 调用 |
transcribe.py |
Whisper/Vosk 离线转写 | 被 run_one 调用 |
build_report.py |
keypoints → 中文报告 | AI 提炼后汇总 |
vod_download.py |
腾讯云 VOD DRM 解密下载 | luminaedu 等平台 |
download_video.py |
直链视频下载 | 通用直链 |
extract_cookies.py |
cookie 提取 | 需登录平台 |
login_helper.py |
登录辅助/登录态导出 | 首次配置 |
qcloud_vod_download.py |
腾讯云 VOD 下载(API 模式) | 备用 |
职责边界(重要)
- 脚本只做机械活:下载 / 提音 / 转写(确定性操作)
- AI 做智能活:读字幕 → 提炼要点(keypoints json)→ 生成报告
- 脚本不生成占位 keypoints(会导致批量调度误判"已完成")
- 提炼要点时,AI 应:读完整字幕 → 按视频内容提炼 8-15 条要点(headline+detail+timestamp)
→ 提取金句 → 写 keypoints json(结构见build_report.py支持的字段)
转写引擎与语言
# 自动检测语言(推荐,中英文通吃,中文输出简体)
python scripts/transcribe.py --audio a.mp3 --out sub.md --lang auto --engine auto
# 强制中文
python scripts/transcribe.py --audio a.mp3 --out sub.md --lang zh --engine auto
# 强制 Vosk(更快但中文碎片化,不推荐)
python scripts/transcribe.py --audio a.mp3 --out sub.md --lang zh --engine vosk
引擎策略:默认 Whisper(句子级输出、连贯、多语言);Vosk 仅显式指定时用。
简体引导:Whisper base 默认倾向繁体/口语,--lang zh 已内置简体 initial_prompt。
平台适配
详细方法论见 references/platform-guide.md(平台类型矩阵、登录态两通道、腾讯云 VOD 三级结构、
DRM key 获取的 XHR 技巧、沙箱环境注意)。
核心结论(上架价值):
- 平台差异 = 登录态类型(cookie/localStorage)× 视频源引擎(直链/VOD-DRM/免登录)
- 腾讯云 VOD 加密流:psign 直调 getplayinfo 拿 master → 页面内 XHR(非 fetch)请求
getlicense 拿 DRM key → AES-128-CBC 解密分片 → 拼接转码
- 登录态搬运:localStorage 平台复制 leveldb 到专用 profile(删 LOCK 文件)
产物目录
workspace/
├── raw/audios/*.mp3 ① 原音(保留)
├── raw/subtitles/*.md ② 原文字幕(保留)
├── raw/keypoints/*.json ③ AI 要点(保留)
├── reports/*.md + .html 中文报告(保留)
├── _tmp/ 临时(视频+ASR wav,用完即删)
└── edge-profile/ 登录态 profile(仅需登录平台)
沙箱环境注意事项
- 沙箱会拦截
os.remove(SAFE_DELETE_FAIL_CLOSED)→ 脚本内 try/except 忽略;
定期用 PowerShellRemove-Item清理_tmp/和raw/videos/ - Playwright headful 在部分环境秒杀窗口 → 用 headless + profile 搬运
- 首次运行 Whisper 会下载模型到
~/.cache/whisper/(base.pt 约 142MB)
依赖
- Python 3.10+:playwright / yt-dlp / whisper(openai-whisper)/ vosk / cryptography
- ffmpeg(建议用
~/.workbuddy/tools/ffmpeg/...或系统 PATH) - 浏览器:Edge(Playwright channel=msedge)