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

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

小夜