Pular para o conteúdo principal
F

dsh-boot-video-manager

firefly-theherta/dsh-boot-video-manager

A companion playlist panel for the dsh-boot-animation intro-video plugin: add clips without leaving the app, order them, and switch between sequential, random and single-clip playback. Sequential order is made deterministic by parking every clip except the one due to play in a disabled/ subdirectory of the same asset folder and rotating it back in on each boot, leaving the upstream plugin unpatched. Also supports recycling instead of deleting, pinning one clip for every launch, per-clip opt-out, and .mp4/.webm/.m4v/.mov files including non-ASCII names.

Instalar

dsh plugin --profile web add github:firefly-theherta/dsh-boot-video-manager

README

dsh-boot-video-manager

给 DSH 开屏动画插件(dsh-boot-animation)配的 开屏视频播放列表面板:装在 设置 → 插件管理 里,不用离开 app 就能排片。

上游插件自己的设置卡片只能开关、调淡入时长、勾选素材池, 没法把新视频放进去、也没法决定先后。这个插件补的就是这两块。

设置 → 插件管理里的「开屏视频播放列表」面板


前置要求

  • 装好 DSH(DeepSeek Harness),并已安装上游开屏插件 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

方式 A —— 从 npm 装(推荐)

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)自动挂载宿主入口,装完刷新页面即可。

方式 B —— 直接从 GitHub 仓库装

dsh plugin --profile <你的 profile 名> add github:Firefly-TheHerta/dsh-boot-video-manager

同样由 cordis.patch.yml 自动挂载,不需要手改配置文件。git 来源的包会走它自己的 prepare 脚本构建,本插件没有构建步骤(lib/client.js 是手写的成品),所以和方式 A 等价。

方式 C —— 桌面版(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 号只留「下一个」那支
随机播放每次启动在勾选参与的那些里随机抽一支参与播放的全部留着
单次播放每次都播同一支(用「固定播这支」选它),永远不换只留固定那支

顺序播放 = 「第一次启动播 1 号,第二次播 2 号」

上游插件每次启动都会在素材池里随机抽一支。为了不改上游一个字节还能做到确定性播放, 本插件用的是「池目录里只留该播的那一支」:

  • 顺序模式下,只有「下一个」那一支待在 assets\videos\,其余参与播放的都停在 assets\videos\disabled\ (这不是被停用,是在排队 —— 轮到自己时会被自动搬回池目录)
  • 每次 DSH 启动(插件 apply() 跑的时候)把游标往前推一格,于是下次启动就是下一支;播完最后一支回到 1 号
  • 单次播放用同一套机制,只是不推进游标,所以每次都是它
  • 因此:在资源管理器里看到 disabled\ 里堆着视频是正常现象,别手动去搬
  • 随机模式则相反:所有勾选参与的视频都待在池目录里,由上游随机抽

开屏声音(以及「开机启动为什么没声音」)

面板上的 「播放影片声音」、「点鼠标直接进入」 两个开关,改的不是本插件的配置,而是 上游 dsh-boot-animation 自己的设置(命名空间 boot-animation):客户端通过 DSH 的 configForms 服务直接读写它。所以:

  • 和上游插件设置页里的开关是同一个值,两边改都行,改完立刻生效,不用重启 DSH。
  • 这里只做搬运、不另存一份配置,也就不会出现「两处设置打架」。

开机第一次没声音的元凶是「开屏自己把自己静音了」,不是浏览器那条规矩。 上游 dsh-boot-animation 的启动逻辑是「先试着不静音播,播不动就退回静音」,但那个「播不动」的判定只有一个 1.2 秒的窗口:开机后第一次播放时音频管线还没起来,经常要两三秒才响应,窗口先到,它就把自己静音了 (第二次启动管线已经热了,所以从此都有声)。这正好解释「启动一次、退出、再启动才有声」,也解释了为什么 加启动参数没用 —— 参数让带声播放合法了,可它自己掐掉得更早。

已在 dsh-boot-animation 的 src/boot-screen.js 里修好(本机那份就是正在跑的那份):

  • 1.2 秒的窗口只用来把「点一下重试」架起来,不再静音元素;
  • 真正静音推迟到 5 秒的兜底窗口(给冷管线留出时间,同时仍在 6 秒无画面看门狗之内);
  • 已经在放静音片子时,最多再要三次声音,把声音在中途接回来;
  • 结论写进 .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(顺序、勾选、游标、单次固定哪支)

素材目录怎么找到的(运行时探测)

启动时按这个顺序找上游的素材池,找到了就用:

  1. 环境变量 DSH_BOOT_VIDEO_DIR(显式指定,最优先)
  2. 与本插件同级的 node_modules\dsh-boot-animation\assets\videos(npm 布局,也覆盖 「junction 到 D:\dsh-boot-animation」的桌面版旧装法)
  3. 老位置 D:\dsh-boot-animation\assets\videos

全都没有就在页面里提示,并附上当前探测到的目录和修复建议(装上游 / 设环境变量)。

状态文件放哪

  1. 环境变量 DSH_BOOT_VIDEO_STATE(显式指定,最优先)
  2. 插件目录下旧的 state\playlist.json(老版本升级自动沿用,不用重新配)
  3. 否则新建到 %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 排不掉它。)


排障

  • 导航里没有「插件管理」 → 先 F5;还不行就重启 DSH。
  • 改了 lib/index.js 后新功能报 405 / 404 → 必须重启 DSH。宿主半侧是 ESM, 已经在跑的进程握着旧模块(改 cordis.patch.yml 触发的热加载只会重建入口,不会重新 import 同一路径的模块)。客户端 lib/client.js 相反,是每次请求从磁盘读的,刷新页面即可。
  • disabled\ 里堆了一堆视频 → 顺序模式的正常排队,见上文。
  • 页面报「没有找到开屏动画插件」 → 没探测到上游 dsh-boot-animation; 按上面的探测顺序检查,或直接设 DSH_BOOT_VIDEO_DIR 指向它的 assets\videos。 页面会显示当前探测到的目录,照着它找。
  • 取消不了勾选 → 「下一个」(顺序模式)或「固定那支」(单次模式)不能取消参与(先换一个再取消); 也不允许一个都不留。
  • 中文文件名在面板里显示乱码 → 这是 PowerShell 5.1 把 UTF-8 当 ANSI 读导致的显示问题, 磁盘上的文件和状态文件本身是好的,刷新页面、用 node 读回都正常。
  • 声音开关点了没反应 / 卡片提示要装上游插件 → 那两个开关读写的是上游 dsh-boot-animation 的设置(boot-animation 命名空间);没装上游、或它的设置服务当前不可用。先 F5 刷新一下。
  • 开机启动没声音 → 浏览器的自动播放限制,不是配置问题。想连那一下点击都免掉,见上文 「冷启动直接出声」(tools\autoplay-on.ps1);想启动时彻底安静就把「播放影片声音」关掉。
  • 面板上「上次启动的音频状态」显示未知 → 那一行是启动画面留在浏览器里的采样;没装上游、 或这支 DSH 窗口没经过开屏(例如刷新过页面)都会显示未知,正常。

Plugins relacionados