前言¶
给 DSH(DeepSeek Harness)写东西的人,多半有一台常开的宿主、一个浏览器会话,耳朵里还放着歌。问题在于:想确认当前这句歌词是什么,就得把网易云音乐切出来看一眼。切窗口这个动作本身,比你读一句歌词更显眼。
dsh-plugin-netease-lyrics 就是为这个场景做的:它不弹窗、不加面板,而是把当前那句歌词贴在 DSH 状态行「深度求索中,用时 X 秒 …」的右侧,字体、字号、颜色全部沿用宿主那行小字。旁人看过去,只当你这句状态话有点长。下面介绍这个插件能做什么、怎么装、要注意什么。
这是什么¶
一个 DSH 插件,维护者是 YardonYan,仓库为 YardonYan/dsh-plugin-netease-lyrics,当前版本 1.0.7,许可证 MIT。
它解决的问题很单一:读取桌面版网易云音乐当前正在播放的曲目,拿到歌词,再显示在 DSH 状态行的右侧。目前只支持 Windows 10 / 11 宿主和桌面版网易云音乐,其他系统和其他音乐平台都没有实现。
核心功能¶
读取播放信息的方式是 Windows 的系统媒体传输控件 SMTC。插件的 Host 端在宿主进程内常驻一个 PowerShell worker,每秒读一次 SMTC,拿到歌名、歌手、播放状态。
网易云 PC 客户端不会通过 SMTC 上报播放位置,所以插件自己跑秒表推算进度:切歌归零、暂停停表、恢复续走。这一步的成因和可选方案写在仓库的 docs/playback-position.md。
歌词按歌曲搜索拿原始 LRC,中文、英文、韩文、日文都直接显示,不做语言挑选。带官方翻译的歌,鼠标悬停歌词时显示翻译。网易云公开搜索接口有 IP 限流,返回 code: 405 操作频繁 时,1.0.5 起插件会自动切换到限流计数独立的备用搜索端点,歌词最坏延迟到下一首换歌时。
显示层在 Client 端完成:每秒轮询,把当前歌词行以 fixed 定位贴在状态行右边,并用 computed style 现场克隆状态行的字体、字号、颜色。浮层不拦截点击,下方控件照常可用。
安装与启用¶
三个前提,缺一条都跑不起来:dsh 在 PATH 上;桌面版网易云音乐已开启 SMTC;PATH 上能找到 pnpm(dsh plugin 本身不装包,它把参数转发给 pnpm,找不到会以 dsh: pnpm was not found 退出)。
网易云这边的开关在 设置 → 常规 → 系统 → 勾选「开启SMTC」。不开的话系统层面读不到播放状态,插件拿不到任何数据。
安装用一条命令,不用克隆仓库:
dsh plugin --profile web add github:YardonYan/dsh-plugin-netease-lyrics
这条命令把仓库当 npm 包装进 web profile 的依赖,并在同一份 package.json 的 dsh.profile.bundles 里登记。装完重启 dsh web,否则 Host 进程不会加载新插件,再刷新页面。
装完必须单独确认,add 返回 0 不代表装对了:
dsh --profile web --dump-config
输出里应当出现这样一段:
# == dsh-plugin-netease-lyrics
- id: netease-lyrics
name: dsh-plugin-netease-lyrics
config: {}
没有这一段就是没装上。出现这种情况的常见原因是包名或路径指错,pnpm 可能装成一个空壳依赖再正常退出。可以用下面的命令看实际装进去的是什么:
dsh plugin --profile web why dsh-plugin-netease-lyrics
典型用法¶
装好之后,让插件跑起来只需要四步:
- 打开桌面版网易云音乐,播放一首歌。
- 在 DSH 里随便发一条消息,让 AI 转起来,状态行出现。
- 状态行右侧出现同样式的歌词,跟着演唱进度换行。
- 鼠标悬停歌词,可看到完整句和翻译(如果有)。
真正干活的位置是插件源码里的 index.js(Host 端)和 client.js(Client 端)。要调试或改插件本身,用本地克隆方式安装:
$dir = "$env:USERPROFILE\dsh-plugins\dsh-plugin-netease-lyrics"
git clone https://github.com/YardonYan/dsh-plugin-netease-lyrics.git $dir
dsh plugin --profile web add $dir
本地目录会被 pnpm 记成 link: 依赖,克隆目录就是插件实体:删了、挪了、换盘符了,插件立刻失效,别放在临时目录或下载目录。改完源码不用重装:index.js 改动后重启 dsh web,只改 client.js 刷新页面即可。
README 建议用本地克隆方式安装,因为插件需要跟着宿主和网易云客户端的更新走,clone 方式的更新只是 git pull 的网络增量。仓库里还给了一条更新提示词,插件失灵时可以整段发给 DSH 会话,让 AI 自动完成「拉新版 → 判断是否需要重启 → 给结论」。
更新和卸载走 dsh plugin:
dsh plugin --profile web update dsh-plugin-netease-lyrics
dsh plugin --profile web remove dsh-plugin-netease-lyrics
两条都要重启 dsh web 生效。
配置¶
默认锚点是「深度求索中,用时」。如果换了界面语言,可以在 profile 的 cordis.patch.yml 顶层数组里追加一条按 id 命中的补丁。参数项:
- id: netease-lyrics
config:
anchorText: "深度求索中,用时" # 换成你的宿主状态行文案
注意不要写成 insert,那会新增一行插件而不是改这一行。anchorText 只认这一个键,用途是在页面里定位宿主状态行,不是替换歌词内容。未配置、非字符串或空字符串时,回退到内置默认值 深度求索中,用时。文案要选状态行里稳定出现的一小段,太短容易误匹配聊天正文,太长在状态行拆分文本节点时会匹配不到。改完刷新页面,改 index.js 才需要重启 dsh web。
适用场景与注意¶
适合 Windows 10 / 11 宿主、用桌面版网易云音乐、希望歌词低调可见的 DSH 用户。只验证了这一组组合:macOS、Linux 以及 QQ 音乐、酷狗、Spotify、Apple Music 等客户端都没有做。这不是配置开关,而是实现层面的绑定——播放状态来自 Windows 独占的 SMTC,macOS 和 Linux 要另找系统级正在播放接口;歌词检索走网易云公开接口,换平台就得另接歌词源并重写曲目 ID 匹配。
运行侧的已知限制:
| 限制 | 原因 | 缓解办法 |
|---|---|---|
| 拖动网易云进度条后歌词漂移 | SMTC 不上报 seek | 换一首歌再换回来,重新对齐 |
| 单曲循环时秒表走出歌尾 | 秒表不知道歌曲总长 | 同上 |
| 中文界面之外不准 | 锚点按「深度求索中,用时」匹配 | 在配置里改 anchorText |
| AI 空闲时歌词不显示 | 设计行为:状态行不在则歌词隐藏 | 想常显需自行改 client.js 的 stealth 判断 |
| 仅本机访问 | 路由只响应 loopback 并校验 Origin | 安全特性,不开放外露 |
| 歌词取不到 | 曲目无版权,或第一个候选没有歌词 | 无法绕过;候选只试第一条 |
| 歌词小时级空白 | 网易云搜索接口 IP 限流 | 1.0.5 起自动切备用端点 |
歌词不显示时,第一检查项永远是网易云的「开启SMTC」开关,勾完切一次歌生效。更细的排障见 README 的「排障速查」一节。
这个插件以当前 dsh 进程的权限运行,只监听 loopback,安装前仍应先读一遍源码、确认 MIT 许可证符合你的要求。DSH 生态的目录页与 DeepSeek / 幻方没有官方从属关系,这里给出的只是社区目录入口。
结语¶
它把「看一眼歌词」这个动作藏进了你已经开着的 DSH 窗口里,成本是一个常驻 worker 和一条本地 HTTP 路由。对确实需要边听边干活的人,这是比切窗口更顺手的答案。
目录页:https://www.skillhub.cn/plugins/YardonYan/dsh-plugin-netease-lyrics
仓库:https://github.com/YardonYan/dsh-plugin-netease-lyrics