dsh-course-notes:把视频课程自动变成 Word 笔记,再投递到新会话

前言

在 DSH 里做课程类知识沉淀,常见的做法是:先用一个插件把视频的简介、字幕、弹幕抓下来生成 Markdown,再手动把内容整理成 Word,手动建一个新会话,手动把文件拖进去,还得自己记哪个视频漏了。这条链每一步都是人工搬运。

下面介绍的插件 dsh-course-notes 就是把这段搬运接上自动化:监视 dsh-video-coursemap 的检测结果,发现新视频就生成独立 Word,并自动投递到一个新的 DSH 会话,同时写一条项目长期记忆。插件由 sony6490 维护,分类为「工作流」。

它是纯宿主插件,不发检测请求、不抓数据,也不修改 dsh-video-coursemap 与 dsh-memory-evolve 的任何代码,不新建客户端界面。

这是什么

一句话定位:读取 dsh-video-coursemap 的检测结果,为每个新视频生成独立 Word 知识笔记并自动投递到一个新的 DSH 会话(摘要 + Word 文件卡),同时写入 dsh-memory-evolve 的项目记忆。

它不负责检测视频,也不负责抓字幕;检测与抓取全部由上游 dsh-video-coursemap 完成。本插件只做「监视 → 转换 → 起会话 → 投递 → 记记忆」这一段。

核心功能

工作链路如下:

浏览器 B 站视频(前台窗口)
   │ dsh-video-coursemap 每 15s 观察前台窗口
   ▼
学科分类 + 抓取简介/字幕/弹幕/热评 → 学科 Markdown → 学习手册.docx
   │ 落盘:<输出目录>/.state/state.json、.state/manuals/<学科>.md
   ▼
dsh-course-notes
   ├─ 监视 state.json,发现台账里没有的 (学科, 视频)
   ├─ 从学科 Markdown 抽出该视频章节 → scripts/md2docx.py → <学科>/<视频标题>.docx
   ├─ ctx.agents.create 新建标准会话(默认 Agent 预设 + 默认模型 + cwd=输出目录)
   ├─ attachments.saveFile(docx) → session.append 用户消息(摘要 + Word 文件块)
   ├─ sessionTitle.rename(会话标题「📚 视频标题」)
   ├─ workspaceRegistry 挂到「课程知识地图」项目分组
   └─ memory 工具(dsh-memory-evolve,target=project)写一条课程笔记

几个直接和成本、可控性相关的点:

  1. 投递不触发模型回合,会话里直接出现摘要文字 + Word 文件卡,不额外消耗 token。
  2. 台账按「学科 + 标题」去重,已投递的视频不会重复生成和投递。
  3. 单个视频出错会自动重试,上限为 maxAttempts(默认 3)。
  4. coursemap 判定为非课程的内容(纯音乐、直播、新闻等)会被静默忽略,不建会话也不报错。

安装与启用

前置条件:DSH Desktop 已初始化 desktop profile,且已安装 dsh-video-coursemap 与 dsh-memory-evolve。

从代码目录安装:

cd path/to/dsh-course-notes
node scripts/install.mjs --dry-run   # 预览
node scripts/install.mjs             # 安装 / 更新

安装脚本做两件事:把插件复制到 C:/Users/<你>/.dsh/profiles/desktop/node_modules/dsh-course-notes(覆盖旧副本);幂等登记到 profile package.json 的 dsh.profile.bundles(首次会备份 package.json)。

从 GitHub 安装:

dsh plugin --profile desktop add github:sony6490/dsh-course-notes

dsh plugin add 只负责把包放进 profile。装完要确认 profile 的 package.json 里两处都在:

  • dependencies:"dsh-course-notes": "github:sony6490/dsh-course-notes"
  • dsh.profile.bundles:数组里有一项 "dsh-course-notes"

缺 dependencies 时,之后任何一次 pnpm install(例如用 dshmarket 装/卸别的插件)都会把这份副本当多余包删掉。README 提到本插件 2026-11 就踩过这个问题,安装脚本已改成同时写依赖与 bundles。

装完要完全退出并重启 DeepSeek Harness,宿主插件不热加载。重启后插件自动开始轮询,首次启动默认补投当前已有的视频。

典型用法:装完的验收

重启后在 DSH 里执行:

course_notes_status
course_notes_deliver { "title": "<某个已有视频标题>", "force": true }

期望结果:侧边栏「课程知识地图」分组下出现「📚 <视频标题>」会话,对话里是摘要文字 + Word 文件卡,点击可以打开或下载。

两个工具的分工:

  • course_notes_status:查看启用状态、输出目录、coursemap 状态、学科/视频数、已投递/待投递/失败、最近投递的会话与文档。
  • course_notes_deliver:立即投递某个已在 coursemap 状态里的视频;缺省取最近处理的视频,force: true 可重复投递。

配置

全部配置项可缺省。需要覆盖时在 profile 的 cordis.patch.yml 里按 id 覆盖:

- id: dsh-course-notes
  config:
    coursemapOutputDir: 'C:/Users/你的用户名/课程知识地图'
    writeMemory: true
    backfill: false

常用键与默认值:

键 默认 说明
enabled true 总开关
watchIntervalMs 15000 扫描间隔(毫秒)
initialDelayMs 20000 重启后首次扫描延迟
coursemapOutputDir C:/Users/<你>/课程知识地图 必须与 coursemap 的 outputDir 一致
sessionCwd null → 输出目录 新会话工作目录(决定项目记忆归属与左侧分组)
writeMemory true 是否写 dsh-memory-evolve 项目记忆
backfill true 首次启动是否补投历史视频
maxPerTick 2 每轮最多投递数
provider / model null 覆盖新会话模型;缺省跟 DSH 默认模型
sessionTitlePrefix 📚 会话标题前缀
stateDir C:/Users/<你>/.dsh/course-notes 台账、日志、临时 Markdown
md2docxScript <插件>/scripts/md2docx.py Word 转换脚本
python null → 自动探测 Python 解释器(需 python-docx)
maxAttempts 3 单个视频自动重试上限

coursemapOutputDir 是容易出错的一项:这个值必须与 coursemap 的 outputDir 保持一致,否则 course_notes_status 会显示「coursemap 状态:未找到」。

状态与产物

安装完后的落盘位置:

  • 台账:<stateDir>/delivered.json,按学科+标题去重,记录 sessionId 与 docx。
  • 日志:<stateDir>/course-notes.log,每次投递/失败一行。
  • 单视频 Word:<输出目录>/<学科>/<视频标题>.docx。
  • 学科学习手册:<输出目录>/<学科>/学习手册.docx,由 coursemap 维护,不是本插件生成的。

排障可以先看日志:工具没出现,看是否完全重启 DSH、node_modules 下是否有 dsh-course-notes、profile bundles 是否登记;会话只有文字没有文件,看日志里的「生成单视频 Word 失败」,确认 python / python-docx 是否可用;会话没出现在项目分组,看日志里的「挂接工作区失败」,这不影响会话本身。

适用场景与注意

适合已经在用 dsh-video-coursemap 做视频学习沉淀、希望每个视频都有一份可下载 Word、并且能在独立会话里继续追问的人。它把「新视频 → Word → 新会话 → 项目记忆」这段手工流程串起来,代价是依赖上游两个插件的输出目录与 Markdown 结构约定。

插件以当前 DSH 进程的权限运行:它会读取 coursemap 的 state.json、写输出目录、创建会话、挂接工作区分组、写项目记忆。安装前建议先读一遍仓库源码,重点看 scripts/install.mjs 的写盘与 package.json 改写行为,以及 scripts/md2docx.py 在做什么。许可证是 MIT,其中 md2docx.py 来自 dsh-video-coursemap(MIT),文件头保留了原始来源说明,本插件只改了调用方式。

实际使用上的限制:检测能力继承 coursemap,只覆盖前台浏览器/视频客户端窗口,后台播放检测不到;新会话初始只有一条归档消息 + Word 卡,不会自动跑模型,用户可以在该会话里继续提问;若 coursemap 未来修改 Markdown 结构,章节抽取失败会降级使用学科学习手册 Word;插件升级需要重新执行 node scripts/install.mjs 并重启 DSH。

生态背景:DSH 的理念是「一切皆插件」,本插件通过社区目录分发。目录页是独立站点,与 DeepSeek / 幻方无官方从属关系,不是官方应用商店。当前目录页星标为 0,README 与源码是主要信息来源。

结尾

它的价值不在检测或抓取能力——那部分交给了 dsh-video-coursemap——而是把课程知识从 Markdown 到 Word、到会话、到项目记忆这件事的手工步骤接成了自动流程,并保证投递不额外消耗 token。代价是强依赖上游的状态文件格式与输出目录约定,装之前值得先确认这两者已经稳定。

目录页:https://www.skillhub.cn/plugins/sony6490/dsh-course-notes

仓库:https://github.com/sony6490/dsh-course-notes

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜