dsh-quicktime-player:給 DSH 側邊欄加一個可以拖進度的視頻播放器

前言

在 DSH 裏看視頻,通常有兩條路:從右側欄的文件系統、聊天文件引用或別的插件的文件樹裏點開一個 .mp4,落到瀏覽器默認播放器;或者把文件複製出去,交給專門的播放器。這兩種做法在處理篩查 Agent 生成的錄屏、逐幀看動畫時都不太順手:瀏覽器默認播放器裏拖動進度條會回彈到上一個關鍵幀,框住畫面時縮放基本沒用,逐幀也做不了。

下面介紹的 dsh-quicktime-player 就是把這兩件事收進右側欄:註冊一個自定義 tab 類型,視頻無論從哪裏被打開都落到同一個播放器裏,支持 Range 流式拖動、滾輪縮放、拖動平移、逐幀步進,以及截幀和按標記導出片段。

這是什麼

dsh-quicktime-player 是社區維護的 DSH 插件,維護者 rUrU516,分類爲客戶端。它聲明在當前倉庫的 package.json 裏,版本 0.4.0,許可證 MIT。

一句話定位:DSH 右側欄裏的視頻播放器,解決的是“視頻在 DSH 裏怎麼好好看”的問題——能拖進度、能縮放平移、能逐幀、能截取,而不是簡單地把 <video> 塞進一個 tab。

核心功能

視頻來自哪裏都能播

插件註冊了自己的右側欄 tab 類型,通過 ctx.sidebarRightTabs.register 認領視頻地址。視頻可以來自 DSH 文件 tab、聊天文件引用、其他插件的文件樹,或者 sidebar_open;無論哪種來源都會落到這個播放器裏,不需要額外安裝或改造別的插件。

進度可以拖,字節不進內存

Host 側用一條路由以 HTTP Range 頭返回 206,所以進度條是真正的拖動,而不是跳回最近的關鍵幀。大文件也不會被整個讀進內存:字節留在磁盤上,按 Range 一段段取。

桌面端也支持拖動

Electron 殼裏頁面從 dsh-app:// 提供,Chromium 在跨 scheme 時無法對 <video> 做 seek。插件因此改爲從帶 token 的 127.0.0.1 端口拉流;當該端口不可用時,退化回同源路由。

縮放與平移

滾輪在指針位置縮放,範圍 1×–8×;縮放狀態下拖動可以平移。平移會停在畫面邊緣,不會出現把視頻拖出畫框外的情況。雙擊切換全屏。

自帶的控制條

播放/暫停、時間與幀號切換、速度滑塊(0.2×–5×,0.2 爲步長)、循環、垂直音量彈窗、靜音、畫中畫、全屏,都由播放器自己提供。鼠標靜止時控制條會淡出。

逐幀步進

← / → 每次走一幀,幀率由實際送出的幀測量得到,不是寫死的常量。

記住上次播放位置

按文件的絕對路徑記錄位置、速度、循環、音量和靜音,最多保留最後 50 個文件,30 天后失效。切換會話再回來,會回到同一個位置。如果文件被重新渲染、時長變了,舊記錄會被丟棄,而不是跳到一個無關的位置。

截幀、剪片段、檢查更新

? 旁邊的相機按鈕把當前播放頭的畫面以 PNG 寫入剪貼板,失敗時退化爲下載,完成時彈出提示。

剪刀按鈕在播放頭處打一個標記;同時最多保留兩個標記,中間用虛線連接,懸停剪刀按鈕會出現保存/清除。保存會調用 Host 的 ffmpeg 做流複製(stream copy),因此片段與源字節一致,不重新編碼,切在最近的關鍵幀上。如果 Host 沒有 ffmpeg,按鈕會直接說明,而不是靜默失敗。

? 旁邊的雲按鈕向 Host 查詢當前安裝版本和 registry 上的最新版本,在對話框裏報告結果。只支持手動檢查,沒有輪詢、角標和自動安裝。

跟隨 DSH 主題

控制條(標題欄、引導卡、對話框、通知)使用 DSH 的 --dsw-alias-* 變量繪製,所以在淺色主題下播放器是淺色的;視頻畫面區域保持深色。如果變量不存在,會退化回一直使用的深色配色。

內置引導

角落裏的 ? 會蓋一層可點擊的引導卡,每個功能一行,圖標與工具欄一致。它是純文本,不需要額外維護箭頭對齊。

鍵盤不被搶佔

只要焦點在播放器內部,即使焦點落在滑塊上,Space 和方向鍵都留給播放器本身。

安裝與啓用

先確認宿主 DSH 使用 profile bundles(插件聲明瞭 dsh.bundle.patch),然後執行:

dsh plugin --profile <profile> add dsh-quicktime-player

安裝後需要重開一次窗口,讓客戶端 bundle 被重新加載。

前置要求

  • DSH 支持 profile bundles。
  • 只有在導出片段時才需要 Host 上有 ffmpeg。查找順序爲 /opt/homebrew/bin/ffmpeg、/usr/local/bin/ffmpeg,最後是 PATH 上的 ffmpeg。沒有它的前提下,播放、截幀等其他功能正常,保存按鈕會提示 Host 上沒有 ffmpeg。

插件不需要任何配置項:路由前綴、4 GiB 上限、迴環媒體服務端口以及工作目錄限制都是寫死的。

典型用法

用快捷鍵操作

鍵盤操作一覽:

輸入 動作
Space / K 播放 / 暫停
← → 後退 / 前進一幀
Shift + ← → 後退 / 前進 1 秒
↑ ↓ 音量
M 靜音
F / Enter 全屏
0 重置縮放
+ / − 放大 / 縮小
點擊時鐘 切換時間與幀號
剪刀按鈕 在播放頭打標記(保留最後兩個)
懸停剪刀按鈕 顯示標記區間的保存 / 清除
相機按鈕 複製當前幀到剪貼板(PNG)
雲按鈕 向 registry 檢查新版本

導出一段片段

1、把播放頭移到片段起點,點擊剪刀按鈕,打第一個標記。
2、把播放頭移到終點,再點一次剪刀按鈕,打第二個標記;兩點之間會出現虛線。
3、懸停剪刀按鈕,選擇保存。Host 會執行類似下面的邏輯:用 ffmpeg 以 -ss、-t、-c copy 處理,音頻和視頻流直接複製,不重新編碼;臨時文件在發送完成後刪除。

沒有 ffmpeg 時,保存按鈕會提示“宿主上沒有 ffmpeg”,這時可以從 ~/.dsh/quicktime-player.log 裏確認解碼和導出過程中的報錯。該日誌文件按播放器事件逐行寫入 JSON,包含 source 解析、元數據和解碼錯誤。

確認客戶端 bundle 是否已加載

如果改完窗口發現還是舊界面,可以發一個請求看客戶端 bundle 是否進入了模塊圖:

GET /quicktime/_graph

這是一個開發期探針,返回模塊圖的檢查結果。

適用場景與注意

適合需要在 DSH 裏審查視頻的開發者,尤其是 Agent 生成錄屏後想直接逐幀看、想截取某一幀或剪一小段的情況。由於它把視頻播放和導出能力掛到 DSH 進程上,安裝前應先打開源碼和 LICENSE 看過:插件以當前 DSH 進程的權限運行,路由路徑被限制在會話工作目錄內,4 GiB 以上的文件走的是固定的 Range 上限。

環境與依賴

  • 播放、縮放、逐幀、截幀都不依賴 ffmpeg,只有導出片段會調用。
  • .mkv、.avi、.wmv、.flv 會被接受,但 Chromium 無法解碼,播放器會如實報告,而不是假裝在播放。
  • 更新檢查依賴 Host 能訪問 registry.npmjs.org;離線、代理或 DNS 問題時,對話框會顯示“檢查失敗”。
  • 社區目錄頁顯示該插件 0 星,但功能自足,不依賴其他插件,核心就是“一個 tab 類型加一條路由”。

結尾

dsh-quicktime-player 的定位很簡單:把視頻播放收進 DSH 右側欄,並保證拖動、縮放、逐幀和導出的幾個關鍵動作都可用。如果你的痛點是瀏覽器默認播放器拖不動進度、無法對着幀看,它是目前結構上比較對路的方案。

  • 目錄頁:https://www.skillhub.cn/plugins/rUrU516/dsh-quicktime-player
  • 倉庫:https://github.com/rUrU516/dsh-quicktime-player
羽毛球分组比赛记分
小程序二维码

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

小夜