dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
给 DSH 开屏动画插件(dsh-boot-animation)配的
开屏视频播放列表面板:装在 设置 → 插件管理 里,不用离开 app 就能排片。
上游插件自己的设置卡片只能开关、调淡入时长、勾选素材池, 没法把新视频放进去、也没法决定先后。这个插件补的就是这两块。

dsh-boot-animation。.mp4 .webm .m4v .mov,单支上限 512 MB)。↑ ↓,或整列重排。顺序播放 / 随机播放 / 单次播放(见下)。recycle\,可随时找回)。三种方式,按需选一种。前两条命令里的 --profile <profile 名> 是必需参数 —— dsh plugin
少了它会直接报错 error: required option '--profile <name>' not specified。profile 名就是
%USERPROFILE%\.dsh\profiles\ 下的目录名,查一下:
Get-ChildItem "$env:USERPROFILE\.dsh\profiles" -Directory | Select-Object -ExpandProperty Name
dsh plugin --profile <profile 名> add dsh-boot-video-manager
包已发布在 npm:dsh-boot-video-manager
(npmjs.com/package/dsh-boot-video-manager)。
本仓库当前版本 1.2.1(音频自检 + 「冷启动直接出声」脚本),已同步发布到 npm
(npm view dsh-boot-video-manager version 会看到 1.2.1)。
通过 dsh.bundle.patch(cordis.patch.yml)自动挂载宿主入口,装完刷新页面即可。
dsh plugin --profile <你的 profile 名> add github:Firefly-TheHerta/dsh-boot-video-manager
同样由 cordis.patch.yml 自动挂载,不需要手改配置文件。git 来源的包会走它自己的 prepare
脚本构建,本插件没有构建步骤(lib/client.js 是手写的成品),所以和方式 A 等价。
desktop profile)junction 脚本desktop 这个 profile 由 Electron 应用独占管理,官方说法是先完全退出 DSH 再对它执行
dsh plugin --profile desktop ...(profile 的 package.json 被应用锁着)。不想退出、或者只是拿
本地这份代码调试,就走脚本建 junction:
# 安装(profile 默认 desktop)
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\install.ps1 -ProfileName desktop
# 卸载(只摘插件,不动视频文件)
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\uninstall.ps1 -ProfileName desktop
install.ps1 只做三件事:在 profile 的 node_modules 里建一个指向本目录的
junction、备份 cordis.patch.yml、往里追加一段 - insert: 挂载项(id: boot-video-manager)。
不改 package.json、不跑 pnpm —— 所以它不会出现在 dsh plugin --profile desktop list 的输出里,
这是正常的(pnpm 只认 package.json 里记过的依赖)。
设置(齿轮)→ 左侧导航多出一条 「插件管理」:
| 区域 | 说明 |
|---|---|
| 顶部一行 | 素材总体积、参与播放条数 / 总条数 |
| 添加视频… | 打开系统文件选择框,可多选;第 1 个加进来的就是 1 号,排在最上面(有进度条) |
| 刷新 | 重新读一遍磁盘与播放列表 |
| 打开素材文件夹 | 在资源管理器里打开素材目录 |
| 播放方式 | 顺序播放 / 随机播放 / 单次播放 三选一 |
| 播放影片声音 / 点鼠标直接进入 | 直接改上游插件的设置(见下「开屏声音」),改完立刻生效 |
| 播放列表每一行 | 1. 编号 · 勾选框(是否参与播放)· 文件名 · 体积 · ↑ ↓(调顺序)· 设为下一个(顺序模式)/ 固定播这支(单次模式)· 回收 |
| 徽章 | 下一个 = 下次启动播它;每次播 = 单次模式下固定播它;在池中 = 此刻就在素材池里;上次启动播了 = 已经播过 |
| 已回收 | 回收掉的素材(只列出来,不参与播放) |
| 底部说明 | 提醒改动刷新页面即生效 |
| 方式 | 行为 | 池目录里留什么 |
|---|---|---|
| 顺序播放 | 第一次启动播 1 号、第二次 2 号……播完最后一支回到 1 号 | 只留「下一个」那支 |
| 随机播放 | 每次启动在勾选参与的那些里随机抽一支 | 参与播放的全部留着 |
| 单次播放 | 每次都播同一支(用「固定播这支」选它),永远不换 | 只留固定那支 |
上游插件每次启动都会在素材池里随机抽一支。为了不改上游一个字节还能做到确定性播放, 本插件用的是「池目录里只留该播的那一支」:
assets\videos\,其余参与播放的都停在 assets\videos\disabled\
(这不是被停用,是在排队 —— 轮到自己时会被自动搬回池目录)apply() 跑的时候)把游标往前推一格,于是下次启动就是下一支;播完最后一支回到 1 号disabled\ 里堆着视频是正常现象,别手动去搬面板上的 「播放影片声音」、「点鼠标直接进入」 两个开关,改的不是本插件的配置,而是
上游 dsh-boot-animation 自己的设置(命名空间 boot-animation):客户端通过 DSH 的
configForms 服务直接读写它。所以:
开机第一次没声音的元凶是「开屏自己把自己静音了」,不是浏览器那条规矩。 上游
dsh-boot-animation 的启动逻辑是「先试着不静音播,播不动就退回静音」,但那个「播不动」的判定只有一个
1.2 秒的窗口:开机后第一次播放时音频管线还没起来,经常要两三秒才响应,窗口先到,它就把自己静音了
(第二次启动管线已经热了,所以从此都有声)。这正好解释「启动一次、退出、再启动才有声」,也解释了为什么
加启动参数没用 —— 参数让带声播放合法了,可它自己掐掉得更早。
已在 dsh-boot-animation 的 src/boot-screen.js 里修好(本机那份就是正在跑的那份):
.dshba 根元素的 data-sound(on: / late: / muted: + 毫秒数),面板上的自检能看出
这次到底是哪一种。浏览器那道 autoplay 规矩依然存在,只是在这台机器上不是主因:页面在用户交互过之前不许自动播放带声音 的视频,右下角的「开声音」按钮就是为它准备的;点一下画面(或那个按钮),这一支才会带上声音(第一次点 先开声音,再点一下才进界面)。
| 开关 | 开 | 关 |
|---|---|---|
| 播放影片声音 | 尝试带声音播,右下角显示「开声音」按钮(默认) | 彻底不尝试,连按钮都不出现 |
| 点鼠标直接进入 | 点一下画面就直接进界面,不再拿第一下去开声音 | 第一下先开声音、第二下才进界面(默认) |
素材池里这两支都有音轨(maid-splash.mp4 8.06 s / 1280x720 / 带音频,绝区零蕾米埃尔.webm
是 VP9 + Opus 立体声),所以「没声音」不是文件的问题。
真正的修复在 dsh-boot-animation 里(就是上面那段 1.2 秒抢跑)。这一段是保险:万一某台机器上
autoplay 策略真的是拦路的那一道,浏览器只认启动参数 —— DSH 的 Electron 没有开 autoplayPolicy,
插件本身也改不了它(宿主半侧跑在没有 Electron API 的子进程里),所以只能从快捷方式的参数上加:
--autoplay-policy=no-user-gesture-required
tools\autoplay-on.ps1 帮你把它加到 DSH 的快捷方式上(开始菜单 / 桌面 / 任务栏固定项挨个扫),
原始参数备份在同目录的 .autoplay-backup.json:
# 先看一眼会改哪个(不改动任何东西)
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\autoplay-on.ps1 -DryRun
# 加上参数
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\autoplay-on.ps1
# 想回到默认策略
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\autoplay-on.ps1 -Revert
加完要完全退出 DSH 再启动(启动参数只在进程启动时读一次),之后开屏就直接带声音。
tools\uninstall.ps1 卸载时会自动调一次 -Revert,把它摘干净。
这条只对「从被改过的快捷方式启动」有效:直接双击
DeepSeek Harness.exe、或换别的启动器, 还是默认策略。它不写任何注册表键,随时可以还原。
声音卡片底下多一行采样结果,说明上次启动到底有没有出声——取的是启动画面里那个 <video> 的
真实状态:当时是否被静音、Chromium 的 autoplay 策略、页面有没有拿到用户手势、以及上游「开声音」
按钮的提示文案(浏览器为什么拒)。上次是「先静音」的话这一行会直接说出来;配完上面的启动参数、
重启 DSH,看它变成「出声了」就知道生效了。没装上游时这一行显示「上次启动的音频状态未知」。
如果页面提示「没找到上游开屏插件」、或开关不出现,说明 dsh-boot-animation 没装,
或者它的设置服务还没就绪(先刷新一下页面)。
| 内容 | 位置 |
|---|---|
| 视频文件(池) | <dsh-boot-animation>\assets\videos\ |
| 排队中的(顺序模式) | …\videos\disabled\ |
| 回收的 | …\videos\recycle\<时间戳>-原文件名 |
| 播放列表状态 | %USERPROFILE%\.dsh\boot-video-manager\playlist.json(顺序、勾选、游标、单次固定哪支) |
启动时按这个顺序找上游的素材池,找到了就用:
DSH_BOOT_VIDEO_DIR(显式指定,最优先)node_modules\dsh-boot-animation\assets\videos(npm 布局,也覆盖
「junction 到 D:\dsh-boot-animation」的桌面版旧装法)D:\dsh-boot-animation\assets\videos全都没有就在页面里提示,并附上当前探测到的目录和修复建议(装上游 / 设环境变量)。
DSH_BOOT_VIDEO_STATE(显式指定,最优先)state\playlist.json(老版本升级自动沿用,不用重新配)%USERPROFILE%\.dsh\boot-video-manager\playlist.json支持格式:.mp4 .webm .m4v .mov(上游不认 .mkv)。上传上限 512 MB。
文件名支持中文等非 ASCII 字符(走 URL 百分号编码)。
/plugins/dsh-boot-video-manager 下:
GET /state 读播放列表、播放方式、下一个播哪支
POST /upload?name= 上传一支(原始字节体)
POST /order { names: [...] } 重排(必须正好是当前所有项)
POST /include { name, included } 勾选 / 取消参与
POST /mode { mode: 'sequence' | 'random' | 'single' } 切播放方式
POST /next { name? } 指定下一次播哪支(顺序改游标 / 单次改固定,不传 name 就往后挪一位)
POST /recycle { name } 移出播放列表(挪进 recycle/)
POST /reveal 打开素材目录
文件名一律走白名单校验(不能带路径分隔符、不能以点开头、扩展名必须在支持列表里),
所有业务错误回 4xx 并把中文原因原样放在 error 字段里。
lib/index.js 宿主半侧:8 条路由 + 播放列表状态机(place / enforceAtStartup / 目录探测)
lib/client.js 客户端半侧:注册 settings.section 导航条目「插件管理」+ 搬运上游声音设置 + 启动音频自检(手写,无需构建)
cordis.patch.yml bundle 层补丁:被 `dsh plugin --profile <name> add` 装进来时自动挂载宿主入口
tools/install.ps1 桌面版(desktop profile)junction 安装脚本
tools/uninstall.ps1 对应卸载脚本(顺便还原启动参数)
tools/autoplay-on.ps1 给 DSH 快捷方式加「冷启动直接出声」的启动参数(-Revert 还原)
test/test-bvm-host.cjs 宿主半侧行为测试(临时目录,无需 DSH 在跑)
test/test-bvm-client.cjs 客户端半侧渲染测试(假 __ModuleLoader__ + 假 react)
客户端半侧没有任何构建步骤——lib/client.js 就是手写的、可直接被
window.__ModuleLoader__ 加载的产物,只 require("react")(平台静态基座)。
# 宿主半侧:临时目录里跑完整播放列表状态机(含 3 次「启动」验证顺序推进)
node test\test-bvm-host.cjs
# 客户端半侧:假 __ModuleLoader__ + 假 react,渲染并检查 UI 结构
node test\test-bvm-client.cjs
用任意 Node ≥ 20 即可,不需要 DSH 在跑;两个脚本都跑完会打印一行「…测试通过」并以 0 退出。
宿主测试用的临时素材目录是 test\tmp-bvm\(已 gitignore,随手删掉没关系)。
test\ 只跟着仓库走,不进 npm 包 —— package.json 的 files 白名单写的是具体文件:
lib\、cordis.patch.yml、README.md,以及 tools\install.ps1、tools\uninstall.ps1、
tools\autoplay-on.ps1。(写死文件名而不是整个 tools\,就是为了别把 autoplay-on.ps1 在
本机生成的 tools\.autoplay-backup.json 一起发出去 —— npm 的 files 属于「一定会包含」,
.npmignore 排不掉它。)
lib/index.js 后新功能报 405 / 404 → 必须重启 DSH。宿主半侧是 ESM,
已经在跑的进程握着旧模块(改 cordis.patch.yml 触发的热加载只会重建入口,不会重新 import
同一路径的模块)。客户端 lib/client.js 相反,是每次请求从磁盘读的,刷新页面即可。disabled\ 里堆了一堆视频 → 顺序模式的正常排队,见上文。dsh-boot-animation;
按上面的探测顺序检查,或直接设 DSH_BOOT_VIDEO_DIR 指向它的 assets\videos。
页面会显示当前探测到的目录,照着它找。dsh-boot-animation
的设置(boot-animation 命名空间);没装上游、或它的设置服务当前不可用。先 F5 刷新一下。tools\autoplay-on.ps1);想启动时彻底安静就把「播放影片声音」关掉。