DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

YiLouwdkwxcy /

YiLouwdkwxcy/dsh-shutdown-screen

Verified

DSH closing-animation plugin: a companion to dsh-startup-screen that plays a video and end card when you exit the web UI

★ 1 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@2e13204b

dsh-shutdown-screen · 关闭动画

给 DeepSeek Harness(DSH)Web 界面加一段 退出动画:点侧栏底部的电源按钮(或按快捷键)时, 全屏播放你指定的视频,播完尝试关闭标签页。它是 dsh-startup-screen 的伴生插件——开启动画归它管,关闭动画归本插件管,两者各有独立设置页,可同时启用。

发布状态(0.2.1) GitHub Release 已发布,附件提供 dsh-shutdown-screen-0.2.1.tgz;npm 版本发布后, 可用 dsh plugin --profile web add dsh-shutdown-screen 安装,并在 DSH 插件管理器里接收更新。 具体安装、下载与更新方式见下面「安装」一节。

关于这个插件 本插件由 AI 编写,源自我的一个小想法:给 DSH 的「开启动画」补上对应的「关闭动画」。 它更像一次尝试和玩票,不是长期维护的项目,后面可能就会废弃。如果你只是觉得有意思, 可以随意取用、修改;不建议把它当作可靠的长期依赖。


这是什么

DSH 启动时会播「开启动画」;这个插件补上另一半:退出时播放一段视频。

  • 触发方式一:侧栏底部、设置按钮上方的 电源按钮。
  • 触发方式二:快捷键,默认 Alt + Shift + Q(可在设置页改,组合键或单键都行)。
  • 播放内容:~/.dsh/dsh-shutdown/closing.mp4(也可换成同目录下任意 mp4 / webm / m4v,中文 / 英文文件名均可)。
  • 播放结束:默认先显示结束画面并播放结束语,然后静默关闭浏览器窗口(window.close() 被拒时, 由本机模拟「点一下窗口的关闭按钮」),不弹任何确认框、不出现黑幕 / 白幕;详见下文。
  • 设置页新增两项:「关闭动画」整页设置 + 侧栏退出按钮;「启动动画」仍是原插件自己的页面。

为什么不能用标签页右上角的 × 触发? 浏览器安全模型不允许网页在标签页被关闭时执行动画:beforeunload 只能弹原生确认框, pagehide / unload 阶段已经无法渲染新内容。所以「退出动画」必须由一个应用内入口触发。

关闭是怎么做到的?window.close() 对用户手动打开的标签页无效,浏览器会静默拒绝。 所以在它失败后,插件会请求本机 Host 用 Windows 窗口消息 WM_SYSCOMMAND / SC_CLOSE 关闭浏览器窗口——等价于用虚拟鼠标点一下窗口右上角的 ×。全程不弹确认框,也没有 空白页黑幕 / 白幕。该能力仅 Windows 生效;其它平台会停在结束画面并提示按 Ctrl+W。


功能

  • 视频即动画:直接播放原始视频,不做重编码;服务端实现了 HTTP Range(206),拖进度条、分段加载都正常。
  • 可换视频:媒体目录里的任意 mp4 / webm / m4v 都能在设置页下拉选择;支持中文 / 英文文件名, 设置页有「打开媒体目录」按钮,把视频拖进去再「刷新列表」即可。
  • 播放区间:可从第 N 秒开始、播到第 M 秒结束;倍速 0.35×–3×。
  • 触发控制:侧栏按钮可关;快捷键可改,支持组合键(Alt+Shift+Q)或单键(F8 / Delete 等)。
  • 播放时机:每次 / 每个浏览器会话一次 / 每天一次。
  • 结束动作:播完 / 跳过都先显示结束画面并播放结束语,再静默自动退出(默认,不弹确认框)/ 停在结束页 / 重新进入 DSH。
  • 音量增益:视频音量之外还能在 100%–300% 之间继续放大(WebAudio 增益)。
  • 无蒙板:不显示「点击播放」遮罩,也没有暗角 / 扫描线,播的就是视频原画面。
  • 音画与文案:视频音量、结束语 TTS(中文 / 英文 / 中英各一遍,可选系统音色、语速、音高、音量、 提示音、延后毫秒)、合成器关机音效、主题(深/浅)、强调色与故障色、身份资料、品牌与文案、页脚。
  • 不干扰开启动画:启动动画正在播放时不会触发;关闭动画的层级(z-index: 2147483600)高于开启动画, 退出时一定盖在最上面。
  • 更新安全:不修改 dsh-startup-screen 的任何文件,原插件可以照常更新。

安装

需要 DSH 0.2.x(Web profile)。三种方式任选其一。

方式一:Release 附件(推荐,无需 npm 账号)

  1. 在 Releases 下载 dsh-shutdown-screen-0.2.1.tgz(0.2.1 及以后版本同名规则)。

  2. 安装到 web profile:

    node "$(npm root -g)/@deepseek-ai/dsh/lib/bin.js" plugin --profile web add ./dsh-shutdown-screen-0.2.1.tgz
    
  3. 重启 DSH Web(Host 半侧改动需要重载进程,只刷新页面不够),再打开 http://127.0.0.1:3080。

方式二:npm(发布后,可接收更新)

dsh plugin --profile web add dsh-shutdown-screen@0.2.1

DSH 插件管理器的「检查更新」只识别 npm registry 安装的包;本地 tgz / 目录 / git 安装 没有更新入口。想以后能一键更新,就用方式二。

方式三:源码目录(开发调试)

在插件源码目录里 npm pack 后按方式一安装;也可以直接从目录安装(改完文件刷新页面就生效):

dsh plugin --profile web add /path/to/dsh-shutdown-screen

装好后重启 DSH Web(或按你的启动方式刷新),刷新 http://127.0.0.1:3080:

  • 设置页左侧多出 关闭动画;
  • 侧栏底部、设置按钮上方多出 电源按钮;
  • 全局快捷键 Alt + Shift + Q 可用(页面刚打开也能一次触发,不用刷新;启动动画期间按下会排队)。

更新

  • npm 安装(可一键更新):在 DSH 插件管理器里点「检查更新」,或重新执行 dsh plugin --profile web add dsh-shutdown-screen@<新版本>;Host 半侧有改动时重启 DSH Web。
  • Release / tgz 安装:下载新版本 tgz,用方式一覆盖安装同一个 profile;配置 ~/.dsh/dsh-shutdown.json 会自动复用。
  • 源码目录安装:git pull 后重新 dsh plugin --profile web add /path/to/dsh-shutdown-screen, 或直接改文件后刷新页面。
  • 每个版本的变化见 CHANGELOG.md,版本说明 / 兼容性 / 下载使用方法见 Releases。

放视频

Windows: C:\Users\<你>\.dsh\dsh-shutdown\closing.mp4
macOS / Linux: ~/.dsh/dsh-shutdown/closing.mp4
  • 设置页「视频」组里有「打开媒体目录」「复制路径」「刷新列表」按钮;点「打开媒体目录」会直接弹出 系统文件管理器,把视频拖进去,再点「刷新列表」选中即可。中文、英文文件名都支持。
  • 视频文件不会进 Git(仓库 .gitignore 忽略媒体文件),也不会上传到任何服务器——只由本机的 DSH Web 服务读取。
  • 仓库不附带示例视频;请使用你有权使用的内容。

使用

  1. 点侧栏底部电源按钮,或按 Alt + Shift + Q(可改单键)。
  2. 全屏播放视频;可点右上角 SKIP 或按 Esc 跳过(若允许跳过)。
  3. 播完(或跳过)后先显示结束画面、播放结束语,再静默关闭浏览器窗口:不弹确认框, 也没有黑幕 / 白幕。关闭动作 = window.close() + 本机模拟点击窗口 ×(仅 Windows)。 若两种方式都被系统拒绝,结束画面会保留并提示按 Ctrl + W。
  4. 若把「播放结束后」改成「停留在结束页 / 重新进入 DSH」,则按对应行为执行。
  5. 想先看效果:设置页「立即预览」——预览不会真的关页。

设置页

「关闭动画」页面共 8 组,其中 6 组与原「启动动画」的 33 项一一对应(字段名、含义、默认值都相同), 另外新增视频与触发两组:

组 内容
播放 启用、播放时机、倍速
视频(新增) 视频文件(中英文文件名)、画面适配(contain/cover)、开始秒、结束秒、打开媒体目录、刷新列表、立即预览
触发与结束(新增) 侧栏退出按钮、退出快捷键(组合键或单键)、播放结束后动作(默认:结束画面 + 结束语 → 静默关闭窗口)
交互 允许跳过
声音 / 语音 / 音效 视频声音、视频音量、音量增益(100%–300%)、TTS 开关/语言/音色/语速/音高/音量/提示音、音效、TTS 延后
视觉 主题、角标与进度条、强调色、故障色 A/B
身份资料 身份名称、身份编号、权限等级
品牌与文案 品牌 3 行、机构名中英、副标题、结束框文案、页脚

配置保存在 ~/.dsh/dsh-shutdown.json(原子写入,损坏时自动回落默认值)。


它是怎么实现的

DSH Web 进程(Host 半侧,lib/index.js)
  ├─ register 7 条路由:
  │    /dsh-shutdown/config          GET 读配置 / POST 写配置(归一化、reset)
  │    /dsh-shutdown/closing.js      关闭动画运行时(IIFE,按 mtime 缓存)
  │    /dsh-shutdown/closing.css     样式(按 mtime 缓存)
  │    /dsh-shutdown/media           媒体目录列表
  │    /dsh-shutdown/open-media-dir  打开系统文件管理器到媒体目录(仅 POST)
  │    /dsh-shutdown/close-window    模拟点击浏览器窗口 ×(仅 POST,Windows)
  │    /dsh-shutdown/video           视频流,支持 Range 206 / HEAD
  ├─ tapIndex:往 index.html 注入 <link> + critical CSS + 内联配置 + <script defer closing.js>
  └─ 所有路由先过 connection.requestRejection(DNS 重绑定防护,和原插件一致)

浏览器(Client 半侧,lib/client.js)
  ├─ settings.section  → 设置页「关闭动画」(order 27,原插件是 26)
  ├─ settings.section.icon → 电源图标
  └─ sidebar.footer.action → 侧栏底部电源按钮(order 55)

关闭动画运行时(lib/closing.js)
  ├─ 触发:按钮 / 快捷键(组合键或单键)/ window 事件 / window.__DSH_SHUTDOWN_API__
  ├─ 播放:<video>(静音兜底自动播放 + WebAudio 音量增益)+ 自定义 chrome(品牌、ID、进度条、SKIP)
  ├─ 结束:结束画面 + TTS 结束语 → 静默 closeTab(window.close → 本机 close-window 模拟点 ×),
  │        全程无确认框、无空白页;preview / card / reload 模式停在结束画面
  └─ 清理:移除节点、解锁滚动、恢复焦点、复位 __DSH_SHUTDOWN_RUNNING__

为什么不做成「直接监听关页」:见上文浏览器限制。桌面端(Electron)理论上可以拦截窗口关闭, 但本插件按纯 Web 形态实现,桌面端需要另加 IPC 通道,暂未适配。

安全边界:

  • 媒体文件名白名单 + 目录固定,配置里的路径穿越会被归一化回默认值;
  • 内联配置对 < 做 \u003c 转义,避免 </script> 逃逸;
  • 配置里有 shortcut 字符串,但只在运行时比较 KeyboardEvent,不 eval;
  • 视频只从本机 ~/.dsh/dsh-shutdown/ 读取,不代理远程 URL。

测试

node test/smoke-host.mjs   # 102 项断言:导出形状 / 路由 / 信任栅栏 / 配置归一化 / Range 206 / 中文文件名 / 打开目录 / 关闭窗口 dry-run / 注入 / XSS
node --check lib/index.js && node --check lib/closing.js && node --check lib/client.js

更新记录见 CHANGELOG.md。

兼容性

  • DSH Web profile(dsh.client.platform: "web"),DSH 0.2.x;依赖公开的 webServer、 connection.requestRejection、ctx.slots 接口,不碰 DSH 内部私有实现。
  • 与 dsh-startup-screen 1.2.0 并存验证;两个插件互不改文件。
  • 0.2.1 与 0.2.0 / 0.1.0 配置完全兼容(无新增字段),升级后重启 / 刷新页面即可;见 CHANGELOG.md。
  • DSH 桌面端:本机未安装,未实测。桌面端(Next)挂载自己的 webServer,插件注册类路由 预计可用;但 tapIndex 的 HTML 注入在桌面端不生效,动画依赖客户端自举加载,自动关窗行为不确定。 详见 DESKTOP.md。
  • 安装渠道:GitHub Release 附件(tgz)或 npm registry(发布后);DSH 插件管理器的「检查更新」 只识别 npm 版本。

致谢

本插件是 dsh-startup-screen 的伴生插件, 在结构、接口约定和不少实现细节上参考了它。原项目作者 沈宏宏,MIT License,仓库: https://github.com/6shenhonghong9/dsh-startup-screen。

如果你喜欢这种「启动 / 关闭」仪式感,请先去原项目点个 Star。

License

MIT © 2026 YiLouwdkwxcy。详见 LICENSE。

—/ 5

No ratings yet

Verified DSH bundle

Commit 2e13204b073f

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout