在 DSH 右側邊欄預覽音頻和視頻

前言

DeepSeek Harness 的文檔預覽目前支持文本、Markdown、代碼、圖片、PDF、HTML 以及 Office 文檔和表格,但不支持音頻和視頻。打開 mp4、mp3、wav 等文件時,預覽區會提示 “Preview is not available for this file type yet”,只能通過頂部的 Open 按鈕在宿主機上用原生應用打開。在宿主機上沒問題,但在遠程瀏覽器(例如手機、另一臺電腦或 Tailscale 對等節點)上打開,就會在用戶看不到的屏幕上彈出窗口。

dsh-media-web-preview 爲 DSH 右側邊欄添加了原生播放器,支持音頻和視頻的即時預覽與跳轉。

插件介紹

dsh-media-web-preview 是一個 DSH 插件,由維護者 wilsonchengassistant 開發,分類屬於「聯網工具」。它註冊了 video 和 audio 兩種文檔渲染器,在右側邊欄的文檔預覽區嵌入瀏覽器原生播放器。插件通過一個帶認證的 HTTP Range 路由 /api/media 流式傳輸文件,使得遠程瀏覽器可以播放和跳轉大文件,而無需在宿主機上打開本地應用。

核心功能

  • 原生播放器控制:支持播放/暫停、跳轉、音量、全屏(視頻),以及瀏覽器的畫中畫功能。
  • 按需流式讀取:利用 HTTP Range 請求(206 Partial Content 和 Content-Range),播放器按需請求字節片段,大視頻無需將整個文件讀入內存或對話上下文。
  • 遠程瀏覽器可用:URL 爲文檔相對路徑,支持 http://127.0.0.1:3080、局域網地址、Tailscale MagicDNS 名稱或 tailscale serve 端口 80,無需額外配置。
  • 下載與新標籤打開:播放器下方提供下載和在新標籤頁打開的操作。
  • 本地化界面:提供英文和簡體中文字典。
  • 零運行時依賴:僅包含一個宿主機模塊和一個瀏覽器打包文件。

支持的格式:

類型 後綴
視頻 mp4, m4v, webm, ogv, mov, mkv, avi, mpg, mpeg, 3gp, 3g2, ts, m2ts
音頻 mp3, m4a, m4b, aac, wav, flac, ogg, oga, opus, weba, aiff, aif, wma, mid, midi

安裝與啓用

從 npm 安裝:

dsh plugin --profile web add dsh-media-web-preview

從本地目錄安裝:

dsh plugin --profile web add file:/absolute/path/to/dsh-media-web-preview

dsh plugin add 會記錄依賴並將包追加到 dsh.profile.bundles。插件自帶 dsh.bundle.patch,無需在 cordis.patch.yml 中手動添加 insert: 行。

宿主機端會熱掛載插件到正在運行的 dsh web,刷新頁面一次讓瀏覽器包進入模塊圖;如果構建只在啓動時組合插件,則重啓 dsh web。

在右側邊欄的 Files 標籤頁打開任意支持格式的文件,播放器即可出現。頂部的原生 Open 菜單仍然可用。

爲什麼需要一個獨立的媒體路由

DSH 已有 GET /api/file 路由,用於圖片和 Markdown 預覽。該路由總是返回完整 200 響應,忽略 Range 請求,且默認限制響應體大小約 20 MB。這對圖片和文本預覽是合適的,但對視頻毫無用處:無法跳轉,大文件會直接返回 413 Payload Too Large。爲了避免改動共享路由,本插件新增了一個支持 Range 的兄弟路由 /api/media:

特性 /api/file /api/media
完整響應 200 200
Range 請求 忽略,返回完整 200 206 + Content-Range
跳轉 必須下載整個文件 即時
響應體大小限制 ~20 MB 受文件系統限制
讀取方式 整個文件緩衝 通過 ctx.fs.readByteRange 每次讀取 1 MiB 塊

兩個路由都位於 /api 下,因此共享同樣的 Host/Origin 檢查和瀏覽器 Cookie 認證。

技術實現

宿主機端:

  • 通過 ctx.connection.fetch.register({ path: '/api/media', methods: ['GET', 'HEAD'] }) 註冊路由。
  • 請求通過 ctx.fs 解析,解析 Range 頭部爲閉區間。
  • 416 錯誤攜帶 bytes */<size>,HEAD 請求僅返回頭部,download=1 參數添加 Content-Disposition: attachment。
  • 響應攜帶 Cache-Control: private, no-store 和 X-Content-Type-Options: nosniff。

瀏覽器端:

  • 通過 ctx.documentPreviews 註冊渲染器,設置 loading: 'renderer',將文件後綴聲明爲二進制,避免回退到文本預覽。
  • 播放器從資源地址讀取絕對路徑,構建文檔相對路徑的 api/media?path=… URL,調用 content.loaded(version) 結束加載狀態。

安全說明

  • 路由位於 /api 下,繼承 DSH API 的認證和 Host/Origin 檢查,未認證請求返回 401,不受信 Host 返回 403。
  • 僅接受絕對路徑,不提供目錄列表,不會繞過文件系統提供者的解析和訪問策略。
  • 響應頭包含 Cache-Control: private, no-store 和 X-Content-Type-Options: nosniff。
  • 無遙測、無出站網絡請求、無運行時依賴。

兼容性與使用範圍

  • DSH 0.2.0-rc.2 及之後版本,需提供 ctx.documentPreviews、sidebar.right.tab.document、ctx.connection.fetch 和 ctx.fs.readByteRange。
  • Node.js 22+。
  • 也可在 DSH 桌面應用中使用,此時媒體路由爲文檔相對路徑。

本插件聚焦於默認右側邊欄和遠程瀏覽器播放,不提供播放列表、字幕軌道、播放速度控制和對話中的內聯媒體卡片,這些由其他社區插件覆蓋。

結尾

dsh-media-web-preview 解決了 DSH 在遠程場景下無法預覽和跳轉音視頻的問題,通過 HTTP Range 路由實現流式讀取,適合需要在遠程瀏覽器中處理媒體文件的智能體開發者。

  • 插件目錄頁:https://www.skillhub.cn/plugins/wilsonchengassistant/dsh-media-web-preview
  • GitHub:https://github.com/wilsonchengassistant/dsh-media-web-preview
羽毛球分组比赛记分
小程序二维码

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

小夜