dsh-video-preview:給 DSH Web UI 側邊欄補上視頻預覽

前言

DSH Web UI 的內置文檔預覽註冊了 text、PDF、Excel 和圖片,但視頻不在其中。在文件樹裏點開一個 .mp4、.webm 或 .mov,看到的往往是一句 “preview is not available for this file type yet”,要麼就是被平臺 size 上限卡住、只能整段讀完再播放。

下面介紹的 lvxianchao/dsh-video-preview 補齊了這個渲染器:點擊視頻文件就地播放,走一條帶鑑權的 byte-range 路由,支持 seek 和大文件,無構建步驟、零運行時依賴。

這是什麼

@lvxianchao/dsh-video-preview,維護者 lvxianchao,MIT 許可證,當前版本 1.1.1,要求 Node.js >= 22.19。分類是客戶端插件。

一句話定位:給 DeepSeek Harness(DSH)Web UI 側邊欄加一個視頻預覽渲染器,覆蓋原來沒有的視頻文件類型。它在社區插件目錄 SkillHub 上單獨列頁,目錄站是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係。

核心功能

  • 後綴匹配渲染:mp4 / m4v / webm / ogv / ogg / mov,從文件樹、@ 引用或工作區變更列表點開都可以播放。
  • 真流式播放:<video> 直接請求 byte-range 路由(返回 206 Partial Content),seek 即時生效;沒有整文件讀取上限,看一個 5 GB 視頻只消耗實際播放的那些字節。
  • 靜音自動播放:瀏覽器不允許帶聲音自動播放,因此預覽默認靜音開始,用原生控件點一下即可解除靜音。
  • 元信息展示:文件名、容器格式、大小(來自 stat 路由)。
  • 失敗可讀:編解碼或容器不支持時明確提示,而不是留一個白屏播放器。
  • 零運行時依賴:React 來自宿主,其餘用標準 Node/瀏覽器 API;瀏覽器端是手工寫的 __ModuleLoader__ 模塊,不需要構建步驟。
  • 不與宿主耦合:瀏覽器端走公開的 documentPreviews / slots / locale 服務註冊,宿主端走 connection.fetch 路由,和其它 /api 路由處於同一瀏覽器鑑權圍欄內。

安裝與啓用

官方安裝命令,三種來源任選:

# npm
dsh plugin --profile web add @lvxianchao/dsh-video-preview

# from GitHub
dsh plugin --profile web add "github:lvxianchao/dsh-video-preview"

# from a local checkout
dsh plugin --profile web add /path/to/dsh-video-preview

main 分支只承載已發佈代碼,前兩種遠程形式安裝的都是最新穩定版。安裝後重啓 dsh,Web UI 會在啓動時重新加載前端模塊:

sudo systemctl restart dsh-web   # 按你的部署方式調整

包裏聲明瞭 dsh.bundle,所以安裝過程會把包追加到 profile 的 bundle 列表並自動掛載這一行,不需要手工改 cordis.patch.yml。

想先不動現有 profile,可以用 overlay 方式試:

dsh --profile web --patch ./dev.yml --host 127.0.0.1 --port 3099 --no-open
# dev.yml
- insert:
    - id: video-preview
      name: '/absolute/path/to/dsh-video-preview/lib/index.js'

典型用法

  1. 在輸入框裏輸入 @,選中一個視頻文件(也可以從工作區變更列表裏打開)。
  2. 點擊文件引用,右側邊欄打開播放器並開始靜音播放。
  3. 用原生控件拖動進度、解除靜音、全屏。拖動時只會請求新位置附近的字節。

配置

只有一個配置項 rangeBytes:

Key Default Meaning
rangeBytes 2097152 (2 MiB) 每次流請求返回的字節窗口。瀏覽器在播放過程中連續發起多個range,所以這是延遲/吞吐旋鈕,不是大小上限。
# ~/.dsh/profiles/web/cordis.patch.yml
- id: video-preview
  config:
    rangeBytes: 4194304   # 4 MiB windows

工作原理

插件拆成宿主端和瀏覽器端兩部分:

Half File Role
Host lib/index.js 註冊 GET/HEAD /api/video-preview.stream(通過 workspaceFiles.readBytes(range) 提供 byte range,返回 206 + Content-Range),以及 GET /api/video-preview.stat(大小/版本/類型),掛載在 connection.fetch 上
Browser lib/client.js 註冊渲染器元信息(loading: "renderer")和帶 key 的文檔主體;渲染 <video src=…> 指向流路由,並上報加載的版本

渲染器用 loading: "renderer",因此預覽框架永遠不會對視頻文件做整字節讀取——這正是把平臺 32 MB 整文件上限從視頻路徑上移除的原因。

瀏覽器端不需要構建步驟,它本身就是宿主 loader 直接認識的模塊格式:

window.__ModuleLoader__.load({ id: "@lvxianchao/dsh-video-preview", factory: (require) => { /* … */ } });

限制與適用場景

適合:已經在用 DSH Web UI、希望在側邊欄直接看視頻,或需要處理大視頻文件的用戶。安裝前應檢查源碼與許可證(MIT),並注意插件以當前 dsh 進程權限運行。

已知限制,README 已列明:

Limit Cause Workaround
不支持 mkv Chrome 無法解碼 Matroska 重封裝爲 mp4/webm
依賴編解碼器 瀏覽器只能播放平臺能解碼的內容,HEVC/AV1 表現不一 H.264/AAC 的 mp4 最穩
Session 必須可解析 流路由按文件地址中的 session 解析文件 來自活躍 session 的預覽總能解析;session 消失則 404
僅已鑑權瀏覽器可用 路由在其餘 /api 的同一鑑權圍欄內 這是設計意圖,不做未鑑權文件分發

如果要在公網暴露 Web UI,README 建議同一作者的 dsh-web-guard 加在前面。本插件只改文件如何預覽,不改誰能打開:如果 UI 的可達範圍超出 loopback,需要在前面放 dsh-web-guard。

結尾

這個插件的價值在於補齊 DSH 側邊欄的視頻渲染缺口,並把原始 Blob 方案裏 32 MB 整文件上限的問題改成 byte-range 流式讀取。零運行時依賴、無構建步驟,接入成本低;限制也清楚寫在README裏。

目錄頁:https://www.skillhub.cn/plugins/lvxianchao/dsh-video-preview
GitHub:https://github.com/lvxianchao/dsh-video-preview

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

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

小夜