DSH 插件:Niri 風格多窗口 B 站直播頁

前言

在 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 只保存在 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
羽毛球分组比赛记分
小程序二维码

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

小夜