dsh-video-skin
把一段循环短片铺成聊天背景(可调透明度),启动时再播放一段有声片头动画。首次启动若为浅色主题,会一次性切到深色(附撤销提示)。
安装
dsh plugin --profile web add dsh-video-skin
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | — |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-video-skin

DSH 的视频皮肤:把一段短片铺成整个 Web 界面的聊天背景,并在启动时用另一段短片做开机动画——
有声播放、完整放完再渐变淡出进界面、点击画面随时跳过。
- 开机动画:全窗短片(带声音)+ 真实启动进度条 + 常驻的「点击画面跳过」提醒;片子先完整放完
(ended),再用固定时长 fadeMs 渐变淡出,音量也跟着一起淡、不会被硬切。
> 早先的版本是"从片尾往前 fadeMs 开始交叉溶解、片子放完那一刻正好淡完",而且**淡出时长用的是
> 当时的真实剩余时间 —— 界面就绪得晚时剩余可能只剩 100~200ms,那次退场看起来就是硬切**
> (用户报的"有时候还没放完就切掉了"正是它)。现在默认 exitMode: 'end':先放完,再淡;
> 想要片尾交叉溶解可以设成 'tail',淡出时长同样固定。
- 聊天背景:无声、循环、
object-fit: cover铺满视口,画布与侧栏半透明,画面明显看得见、文字照样读得清。 - 和别的壁纸插件共存:检测到 dsh-wallpaper-engine 这类插件在管桌面时,自动让路
(不建背景层、不抢 --dsw-alias-* token),开机动画照常保留;也可以一键切「始终接管」(见 §3.7)。
- DSH 设置里也有一页:设置 → 视频皮肤,状态摘要 + 背景归属 + 三个透明度滑块 + 素材开关
(和 Token Monitor、刷B站 那些插件并列,见 §3.8)。
- 素材自己说了算:面板顶部两行开关 —— 只想要背景不要开场动画?关掉就行。
「更换…」选自己的 mp4/webm 上传即可,随时「默认」退回包内素材(见 §3.6)。
- 界面上就能调透明度:右下角一个小圆钮 → 三个滑块 + 三个预设 + 实时文字对比度读数;
改完就生效、刷新还在,不必碰 JSON、不必重启 DSH(见 §3.1)。
- 浅色主题的用户会被自动切到深色(这条素材偏暗,浅色下视频会被冲得几乎看不见):
只做一次,切完给一条可撤销的提示,点「恢复浅色」就按原值改回去,之后永远不再动(见 §3.3)。
- 一个依赖都没有:宿主半边只用
node:内建,页面侧是一段内联脚本,产物里没有任何 import。
英文说明见 [README.md](README.md)。
安装(一行)
设置 → 插件 → 添加插件,贴进这一行,点「安装」,然后 完全退出并重新打开 DSH:
dsh-video-skin@0.1.6
- npm 上有预构建产物(当前最新
0.1.5,包内已含素材与产物,不需要构建)。国内装 npm 比装 GitHub 快得多;
只想跟随最新版也可以不写版本号:dsh-video-skin。
- 走 GitHub 源码也行(内容一致,但国内可能要代理):
github:Something11235/dsh-video-skin#main - 桌面版(Electron)的索引注入表是宿主启动时收集一次的快照 ⇒ 装完必须完全重启 DSH(刷新页面不够)。
- 仓库里已经提交了运行所需的一切(
index.js/lib/runtime/assets的 mp4),
而且没有 prepare 脚本 —— 这不是省事,是必须:pnpm 会拦 git 依赖的构建脚本,
带 prepare 的仓库会让 dsh plugin add "github:..." 直接失败(ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED),
即使产物已经提交。
- 卸载:
dsh plugin --profile <你的 profile> remove dsh-video-skin,或用仓库里的scripts/uninstall.ps1。 - 国内网络直连 github 可能慢:装不上时可以加代理,或先用 npm 那条。
0. 它长什么样(本机实测截图)
 · 
开机动画:短片铺满视口(有声)+ 真实启动进度条 + 右下角常驻的「点击画面跳过」 · 亮色主题:视频铺满,画布半透明,正文对比度 5% 分位 7.90
 · 
暗色主题:视频清晰可见,正文对比度 5% 分位 6.86、中位 16.06(正文要求 4.5) · 右下角圆钮展开的调节面板:两个滑块、三个预设、实时对比度 7.9(很充裕)
设置页 / 弹层永远是实心的(画布半透明、表面不透明,见 §3.2):
 · 
亮色主题的设置页:不透明面板,背后正文不透进来 · 暗色主题的设置页(原来这一层只有 0.36 alpha,透得最厉害)
前四张是 scripts/verify-browser.mjs 在真 Chromium里跑出来的(见 §6.1),
后两张是同一个实例里点开设置页截的。
1. 它长什么样
启动 → 覆盖层立刻占住视口(同步,先于任何网络请求)
├─ 短片全窗播放(有声——桌面版默认就允许;被浏览器拦下时自动退回静音)
├─ 底部细进度条 = 内核真实的插件激活进度
└─ 右下角常驻胶囊:「▶ 点击画面跳过」
→ 片子放完(ended)且界面已就绪 → 整体渐变淡出 fadeMs(底色/短片/UI/**音量**一起淡)
→ 淡完节点从 DOM 移除,背景层这时才建(避免和开机抢带宽)
exitMode: 'tail' 时第 4 步换成"片子剩余 ≤ fadeMs 且界面已就绪就开始淡"(片尾交叉溶解)。
两种模式淡出时长都是固定的 fadeMs,不会随"当时还剩多少"缩水成硬切。
参数:fadeMs(默认 1000)· holdMs 18000 / holdGraceMs 4000 · noFrameMs 12000 · endlessMs 20000。
任何时候都可以进入:点一下画面、按 Esc / 空格 / 回车。
关于声音:桌面版(Electron)没有设置 webPreferences.autoplayPolicy,于是用 Electron 的默认值
no-user-gesture-required —— 未静音的 play() 直接成功,开机动画一起就是有声的。普通浏览器
(dsh web 用 Chrome 打开)默认策略会拒掉未静音自动播放;那时运行时自动退回静音继续播
(不扣住用户),并在左下角多出一个独立的声音开关 —— 点它只开声音、不跳过,两个意图不互相踩。
如果只想要安静的开机,把 boot.sound 设成 false。
2. 装进桌面版 DSH(当前正在用的这个)
DSH 桌面版(Electron)的 index.html 来自安装包里的静态 dist,tapIndex 之类的函数式变换永远不生效;
唯一的注入通道是 Host 侧 webserver/index-inject 贡献的结构化行,而且那张表是**宿主启动时收集一次、
之后没有任何刷新路径**。所以:
装完必须完全退出并重新打开 DSH。 只刷新页面不够——注入表是开机快照。
而且第一次装完之后,"开机动画"本来也只在下次启动时才看得到。
一条命令安装(不用重启就能写进 profile,但注入行要等下次启动):
powershell -ExecutionPolicy Bypass -File "D:\Projects\DSH工作台\插件制作\dsh-video-skin\scripts\install.ps1" # 可选参数:-Profile <名字>(默认 desktop)、-DshHome <DSH_HOME>(默认 $env:DSH_HOME) # —— 参数名是 -DshHome,不是 -Home:`$HOME` 是 PowerShell 的只读自动变量,赋值会让脚本直接中止。
它会:备份该 profile 的 package.json / pnpm-lock.yaml / cordis.patch.yml
→ 写 dependencies(link: 指向本包)→ 把包名加进 dsh.profile.bundles
→ 在 profile 的 node_modules 里建目录链接(junction,不需要管理员)→ 打印"请重启 DSH"。
先看一眼当前状态(不改任何东西):
node "D:\Projects\DSH工作台\插件制作\dsh-video-skin\scripts\profile-link.mjs" status --profile desktop
卸载 / 回滚(同样不用重装 DSH,但注入行仍是下次启动才消失):
powershell -ExecutionPolicy Bypass -File "D:\Projects\DSH工作台\插件制作\dsh-video-skin\scripts\uninstall.ps1"
不要动desktop以外的 profile 来验证:仓库里的plugindev是干净的开发 profile,
拿它试装不会影响你正在用的界面(见 §7)。
3. 调参:改一个 JSON,刷新页面
所有可调项都有默认值,不改也能用。要改,写这两个文件之一(后者覆盖前者):
文件 · 用途
<插件目录>/video-skin.config.json · 部署期默认值(跟着插件走)
%USERPROFILE%\.dsh\dsh-video-skin.json · 你自己的覆盖(推荐改这个)
改完刷新页面即生效(配置由一条 no-store 的路由在页面加载时读取)。
桌面版例外:注入行里的那份是开机快照,所以开机动画的参数要等下次启动。
包根目录的 [video-skin.config.example.json](video-skin.config.example.json) 是一份逐项带默认值的模板,
改个名字放进上面两个位置之一即可。
{
"boot": {
"enabled": true,
"file": "assets/boot.mp4",
"fadeMs": 1000,
"exitMode": "end",
"skipFadeMs": 320,
"holdMs": 18000,
"holdGraceMs": 4000,
"noFrameMs": 12000,
"endlessMs": 20000,
"hint": "正在启动…",
"skipLabel": "点击画面跳过",
"sound": true,
"volume": 1,
"soundLabel": "开启声音"
},
"background": {
"enabled": true,
"file": "assets/background.mp4",
"veil": 0.14,
"surface": 0.2,
"surfaceLight": 0.6,
"veilLight": 0.1,
"delayMs": 1200,
"playbackRate": 1
}
}
开机动画
项 · 默认 · 作用
enabled · true · 关掉就是完全不注入那一行覆盖层,回到 DSH 原生启动页
file · assets/boot.mp4 · 片子在包内的相对路径,可以换成你自己的
fadeMs · 1000 · 淡出时长(固定值)。退场永远用这个时长,不会随"当时还剩多少"缩水
exitMode · end · end = 片子放完再淡(默认,动画一定看全);tail = 片尾交叉溶解(从"剩余 ≤ fadeMs"开始淡,片子最后 fadeMs 会盖在溶解里)
skipFadeMs · 320 · 点击跳过时的淡出时长(要短,用户已经决定不等了)
holdMs · 18000 · 界面迟迟不就绪时的上界。到点只把状态转成"启动较慢",不截断动画
`holdGraceMs
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:6,最后更新 2026-11-03