前言¶
在 DeepSeek Harness(DSH)中,侧边栏「自动任务」下的页面通常用于 Agent 或定时任务,直播类内容难以自然嵌入。要在一个页面管理多个 B 站直播间,传统做法是打开多个浏览器窗口或使用第三方工具,维护成本高且布局不统一。
DSH 插件 dsh-bilibili-multiview 在侧边栏新增一个「bilibili 直播」入口,用 Niri 风格的水平滚动窗口来管理多个直播间。它由 Xinrea 维护,适合需要在 DSH 内部统一管理多路直播、弹幕和音量的场景。
这是什么¶
这是一个 DSH 客户端插件,为 DSH 侧边栏增加一个「bilibili 直播」页面。它把直播间按列组织,列内可上下堆叠窗口,支持 Solo 独奏、焦点音量闪避、实时弹幕和封面代理,所有账号 Cookie 只保存在 Host 本机。
核心功能¶
- Niri 风格窗口布局:水平方向是列,列内可垂直堆叠多个窗口。窗口可通过滚轮、方向键、底部滚动条或窗口圆点切换焦点。
- 列内上下分屏:把窗口拖入相邻列会自动上下堆叠;支持列内上下移动、拆分独立列、整列移动。标题旁会显示
1/2这样的窗口数标记。 - Solo 独奏与焦点音量闪避:焦点窗口按
+/-调整音量(每次 5%);按Shift+S开启 Solo,焦点边框变红;切换焦点时,非 Solo 窗口音量自动降至 20%。 - 直播列表折叠与避让:切换窗口或移动窗口时自动收起直播列表;折叠 DSH 侧边栏时,直播列表会避让窗口左上角的系统控制按钮;直播列表折叠时,顶部工具条也会右移避让。
- 实时弹幕:支持 DANMU_MSG / 礼物 / SC / 舰长,可全局开关。
- Cookie 与隐私:账号 Cookie 只保存在
$DSH_HOME/bili/cookies.json,Host 通过同源/bilibili-multiview/api/*代理访问 B 站接口,浏览器和其它插件无法直接获取 Cookie 内容。未设置 Cookie 时仍可匿名观看和接收弹幕。 - 封面代理:封面、关键帧、头像通过 Host 的同源图片代理加载,避免 B 站图片 CDN 对浏览器热链的拒绝。
安装与启用¶
从 npm 安装¶
在 DSH 插件管理器中安装 npm 包 dsh-bilibili-multiview;如果使用 Agent 工具:
plugin_manager install_bundle dsh-bilibili-multiview
从源码安装¶
git clone git@github.com:Xinrea/dsh-bilibili-multiview.git
然后让 DSH Agent 安装本目录(或使用插件管理器):
plugin_manager install_bundle /absolute/path/to/dsh-bilibili-multiview
安装后刷新 Web 页面即可在侧边栏看到「bilibili 直播」入口。
Niri 窗口操作¶
水平方向是列,列内可以垂直堆叠多个窗口。每个窗口标题栏右侧的移动按钮(四向箭头)打开操作菜单,也可以直接用键盘:
| 操作 | 快捷键 |
|---|---|
| 切换列 | ← / →、滚轮、底部滚动条 |
| 切换焦点窗口的 Solo | Shift+S |
| 调整焦点窗口音量 | + / -(每次 5%,范围 0–100) |
| 列内切换窗口 | ↑ / ↓ |
| 窗口移入左/右列(自动上下分屏) | Shift + ← / → |
| 列内上移/下移窗口 | Shift + ↑ / ↓ |
| 拆为左侧/右侧独立列 | [ / ] |
| 整列左移/右移 | Alt + Shift + ← / → |
移动窗口后焦点跟随被移动的窗口;当前列窗口数会显示为标题旁的 1/2 标记。Solo 开启后焦点边框变红;切换到另一个窗口时 Solo 自动跟随,关闭当前 Solo 窗口时 Solo 也会转移到新的焦点窗口。任何焦点/移动快捷键都会自动收起直播列表;焦点之外的窗口音量按 20% 播放(降低 80%),标题栏音量滑杆也会以变暗提示。
Cookie 与隐私¶
账号 Cookie 只保存在 Host 本机:
$DSH_HOME/bili/cookies.json
页面、客户端插件、其它插件都拿不到 Cookie 内容;浏览器只调用同源的 /bilibili-multiview/api/* 代理。已有的同名文件会被直接复用。
登录 Cookie 用于账号信息、更高画质和弹幕身份;未设置 Cookie 时仍可匿名观看和接收弹幕。
路由与实现说明¶
Host 在 DSH Web 服务上注册了一个前缀路由:
| 路由 | 作用 |
|---|---|
GET /bilibili-multiview/vendor/mpegts.js |
本地 mpegts.js 运行时 |
GET /bilibili-multiview/api/session |
账号概要 |
POST /bilibili-multiview/api/session |
校验并保存 Cookie |
DELETE /bilibili-multiview/api/session |
清除 Cookie |
POST /bilibili-multiview/api/room |
添加 / 查询单个直播间 |
POST /bilibili-multiview/api/rooms |
批量刷新 |
POST /bilibili-multiview/api/play |
获取 FLV 播放地址 |
POST /bilibili-multiview/api/danmu |
获取弹幕 WS 主机与 token(诊断用) |
GET /bilibili-multiview/api/danmu/events?room=… |
SSE 弹幕流(页面实际使用) |
GET /bilibili-multiview/api/image?u=… |
封面/关键帧/头像同源代理 |
GET /bilibili-multiview/api/stream?u=… |
CDN 拒绝页面 Origin 时的同源回退 |
实现上,账号、直播流、弹幕接口参考了 bili-shadowreplay 的 Rust 实现,并移植为 Node。B 站 comet WebSocket 会校验 Origin,从 127.0.0.1 直连会被 1006 关闭,因此由 Host 持有上游 WebSocket(Origin 为 https://live.bilibili.com),解析后通过同源 SSE 推送给页面。播放器使用 mpegts.js 1.8.0(Apache-2.0),弹幕上游连接使用 ws 8.17.1(MIT),均 vendored 在 vendor/ 目录。样式全部使用 --dsw-alias-* 主题 token,跟随明暗主题。
开发校验¶
node --check index.js
node --check client.js
node scripts/host-smoke.mjs # 真实调用 Bilibili 接口与流代理
node scripts/client-smoke.mjs # 校验 Client 模块与 Slot 注册
scripts/ 不包含在发布文件列表中,仅供本地调试。
适用场景与注意¶
- 适合需要在 DSH 内部统一管理多路 B 站直播、弹幕和音量的场景。
- 插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。
- Cookie 只保存在 Host 本机,页面与其它插件无法直接访问。
小结¶
dsh-bilibili-multiview 在 DSH 侧边栏提供了一个基于 Niri 风格的多窗口 B 站直播管理入口,支持列内上下分屏、Solo 独奏、焦点音量闪避、实时弹幕和封面代理。所有账号 Cookie 仅保存在 Host 本机,浏览器通过同源代理访问 B 站接口,兼顾了功能与隐私。
- 插件目录:https://www.skillhub.cn/plugins/Xinrea/dsh-bilibili-multiview
- 源码仓库:https://github.com/Xinrea/dsh-bilibili-multiview