前言¶
在 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