🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

视频开机片头 xufu5438-netizen/dsh-boot-video

DeepSeek Harness
xufu5438-netizen25 天前有提交已提供中文文档扫描:含敏感能力

启动时全屏播放自定义视频,点击或按 Esc 跳过

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/10 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xufu5438-netizen/dsh-boot-video
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
L4 · 真实安装等级说明 →
数据截至 2026/11/03·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 25 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 58 处,展示前 40 条)
  • 读取本地文件
    lib/index.js:83
    const PROVIDED_ASSETS = ASSETS.filter((id) => existsSync(join(ASSET_DIR, `${id}.mp4`))).filter(
  • 读取本地文件
    lib/index.js:194
    return JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8')).version ?? null
  • 执行外部命令来自配置/变量
    lib/index.js:215
    const child = spawn(binary, ['-hide_banner', '-i', filePath], { stdio: ['ignore', 'ignore', 'pipe'] })
  • 读取本地文件
    lib/index.js:334
    stat = statSync(filePath)
  • 读取本地文件
    lib/index.js:395
    const stream = createReadStream(filePath, partial ? { start, end } : undefined)
  • 读取本地文件
    lib/index.js:431
    return existsSync(path) ? path : null
  • 读取本地文件
    lib/index.js:460
    const parsed = JSON.parse(readFileSync(USER_LABELS_FILE, 'utf8'))
  • 写入本地文件
    lib/index.js:478
    mkdirSync(USER_ASSET_DIR, { recursive: true })
  • 写入本地文件
    lib/index.js:480
    writeFileSync(temp, `${JSON.stringify(kept, null, 2)}\n`, 'utf8')
  • 写入本地文件
    lib/index.js:482
    renameSync(temp, USER_LABELS_FILE)
  • 写入本地文件
    lib/index.js:553
    mkdirSync(USER_ASSET_DIR, { recursive: true })
  • 写入本地文件
    lib/index.js:563
    const writer = createWriteStream(target, { flags: 'wx' })
  • 删除本地文件
    lib/index.js:578
    rmSync(target, { force: true })
  • 删除本地文件
    lib/index.js:623
    rmSync(filePath, { force: true })
  • 写入本地文件
    lib/index.js:696
    mkdirSync(USER_ASSET_DIR, { recursive: true })
  • 删除本地文件
    lib/index.js:701
    rmSync(target, { force: true })
  • 删除本地文件
    lib/index.js:766
    rmSync(staged, { force: true })
  • 删除本地文件
    lib/index.js:767
    rmSync(file, { force: true })
  • 删除本地文件
    lib/index.js:782
    rmSync(staged, { force: true })
  • 发起网络请求
    lib/client.js:246
    const response = await fetch(LIST_PATH, { headers: { accept: 'application/json' } })
  • 发起网络请求
    lib/client.js:325
    response = await fetch(FROM_PATH, {
  • 发起网络请求
    lib/client.js:435
    const response = await fetch(DELETE_PATH, {
  • 发起网络请求
    lib/client.js:455
    const response = await fetch(RENAME_PATH, {
  • 发起网络请求
    lib/client.js:476
    response = await fetch(FFMPEG_SETUP_PATH, { method: 'POST' })
  • 发起网络请求
    lib/client.js:499
    const response = await fetch(CONVERT_STATUS_PATH, { headers: { accept: 'application/json' } })
  • 读取本地文件
    lib/transcode.js:35
    if (existsSync(DEV_FFMPEG)) return DEV_FFMPEG
  • 读取本地文件
    lib/transcode.js:36
    if (existsSync(LOCAL_FFMPEG)) return LOCAL_FFMPEG
  • 执行外部命令来自配置/变量
    lib/transcode.js:42
    const result = spawnSync(path, ['-version'], { encoding: 'utf8' })
  • 写入本地文件
    lib/transcode.js:57
    mkdirSync(dirname(LOCAL_FFMPEG), { recursive: true })
  • 发起网络请求
    lib/transcode.js:63
    const response = await fetch(url, { signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS) })
  • 写入本地文件
    lib/transcode.js:73
    const sink = createWriteStream(gzPath)
  • 写入本地文件
    lib/transcode.js:93
    await pipeline(createReadStream(gzPath), createGunzip(), createWriteStream(LOCAL_FFMPEG))
  • 删除本地文件递归
    lib/transcode.js:95
    rmSync(tempDir, { recursive: true, force: true })
  • 删除本地文件
    lib/transcode.js:98
    rmSync(LOCAL_FFMPEG, { force: true })
  • 执行外部命令来自配置/变量
    lib/transcode.js:120
    const result = spawnSync(ffmpeg, ['-hide_banner', '-i', filePath], { encoding: 'utf8', timeout: 20000 })
  • 执行外部命令来自配置/变量
    lib/transcode.js:157
    const child = spawn(ffmpeg, args, { stdio: ['ignore', 'ignore', 'pipe'] })
  • 读取本地文件
    lib/transcode.js:188
    return statSync(output).size
  • 执行外部命令来自配置/变量
    lib/transcode.js:195
    const result = spawnSync(ffmpeg, ['-hide_banner', '-i', filePath], { encoding: 'utf8', timeout: 20000 })
  • 删除本地文件递归
    lib/transcode.js:204
    rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    lib/transcode.js:213
    return readdirSync(tmpdir()).filter((name) => name.startsWith('dshbv-'))
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 启动全屏播放视频
  • 点击或Esc跳过
  • 导入自定义视频

给 DeepSeek Harness(DSH)加一段视频开机片头:启动时全屏播放 mp4、点击或 Esc 跳过、可导入自己的视频(解不了的编码自动转码成 H.264)

README

由 DeepSeek 最新模型翻译生成
dsh-boot-video 给 DeepSeek Harness(DSH)加一段视频开机片头。 启动客户端时全屏播放你的 mp4,播完淡出、露出真正的界面;点击画面或按 Esc 随时跳过。 Full-screen video boot splash for DSH. 桌面版实机预览:视频铺满窗口,左下角「打开声音」、右下角「点击画面跳过」 特性 - 🎬 一段 mp4 = 一次开机片头:全屏播放,播完淡出进界面,不是"加载完成就切走" - ⏭️ 随时跳过:点击画面或按 Esc - 🔊 桌面版直接带着声音播出(Electron 默认允许未静音自动播放);网页版会被浏览器拦下,于是自动降级成静音并亮出「打开声音」按钮(点它只开声、不跳过) - 🖥️ 盖住 DSH 自己的开机卡片:首帧由宿主半边在文档解析阶段注入,HARNESS / Loading plugins…
展开完整文档(README 剩余 1 节)
dsh-boot-video

给 DeepSeek Harness(DSH)加一段视频开机片头。 启动客户端时全屏播放你的 mp4,播完淡出、露出真正的界面;点击画面或按 Esc 随时跳过。

Full-screen video boot splash for DSH.

桌面版实机预览:视频铺满窗口,左下角「打开声音」、右下角「点击画面跳过」

特性

- 🎬 一段 mp4 = 一次开机片头:全屏播放,播完淡出进界面,不是"加载完成就切走"
- ⏭️ 随时跳过:点击画面或按 Esc
- 🔊 桌面版直接带着声音播出(Electron 默认允许未静音自动播放);网页版会被浏览器拦下,于是自动降级成静音并亮出「打开声音」按钮(点它只开声、不跳过)
- 🖥️ 盖住 DSH 自己的开机卡片:首帧由宿主半边在文档解析阶段注入,HARNESS / Loading plugins… 不会露脸
- 🔀 不跟别的片头插件打架:各写自己的 localStorage 键,同时装也不会互相干扰
- 🖼️ 不裁画面:始终按完整比例居中显示;片源自带的那圈黑边在压制素材时就裁掉了
- 📦 零运行时依赖:宿主半边只用 node: 内建模块,浏览器半边只有一条
- ⚙️ 设置单开一页:设置侧边栏里的「开机动画」,开关 / 素材 / 预览都在那儿,不挤在「通用设置」里
- 🩺 自检行:设置页底部写着"客户端半边是什么时候加载的、上次开机到底播成功没有"——改了没生效 / 视频打不开,看一眼就知道
- 🔄 导入的视频会自动转码:解不了的编码(典型是 HEVC / H.265)不用你自己动手转——插件自己下 ffmpeg(国内镜像)转成 H.264 再收下,转完先验一遍能不能播

安装

从 npm 安装(推荐)
dsh plugin --profile web add dsh-boot-video

从 GitHub 安装(仓库带构建产物,没有安装期脚本,不触发构建授权)
dsh plugin --profile web add github:xufu5438-netizen/dsh-boot-video

或从本地目录安装(把路径换成你解压出来的目录)
dsh plugin --profile web add <本目录绝对路径>

装完必须重启一次 DSH(bundle 在启动时装配),然后 Ctrl+Shift+R 硬刷新—— DSH 的客户端 bundle 带 max-age=31536000, immutable,普通 F5 会一直用第一次抓到的副本。

桌面版(Electron):也可以在应用里走「设置 → 插件 → 添加插件」贴本目录路径(插件管理器原生支持本地路径 / registry / git / tarball 四种 spec)。桌面版的 index 注入表在宿主启动时收集一次,所以那里装完必须完全退出并重新打开,刷新页面不够。

卸载

命令行装的
dsh plugin --profile web remove dsh-boot-video

桌面版在「设置 → 插件」里点卸载即可。卸载后开机会恢复成 DSH 自己的启动画面——本插件不留下任何全局改动(只写自己那几个 localStorage 键;想彻底还原则在控制台删掉 dsh-boot-video:source / dsh-boot-video:asset / dsh-boot-video:last-boot 三个键)。

自己打"发布包"(只带已授权的那段)

npm run pack:release

它会临时把「月读世界」那段从包内容里排除、打完立刻还原清单,并核对包里到底有什么 (一旦混进没授权的素材,它会删掉包并以非零码退出)。当前结果:11.37 MB,只含 assets/hdd.mp4 + 代码 + 一张预览图。

使用

设置 → 侧边栏「开机动画」(0.3.0 起是独立一页,不再挂在「通用设置」里):

| 控件 | 档位 | 效果 |
| 启动时播放 | 我的视频(默认) | 启动时全屏播一短片头,播完淡出进界面 |
| | 不播放 | 启动直通界面(想恢复:设置页里点回「我的视频」,或在控制台删掉 localStorage['dsh-boot-video:source']) |
| 片头素材 | HDD(默认) | assets/hdd.mp4,10.47 MB |
| | 月读世界 | assets/yuedu.mp4,29.01 MB,4K/60fps 重压(CRF 24、PSNR 46.2 dB,肉眼无差) |
| 导入自己的视频 | ⬆ 导入视频 | 挑一段你自己的 mp4(上限 512 MB),存进插件的 assets/user/,以后随时能选、能删 |
| 预览 | ▶ 播放一遍 | 不重启就看看效果;正在播时点它会从头重播 |

换素材会立刻用新素材重播一遍——不用为了确认换了没有去重启。

导入自己的视频(0.8.0 起默认开启)

点「⬆ 导入视频」挑一段 mp4,它会被原样存进插件的 assets/user/(不转码、不重封装——导进去什么样,播出来什么样),然后自动选上、播一遍,并弹出起名窗口。这是本插件的主功能之一;不想让插件能写盘的话,跑 DSH 时设 DSHBV_IMPORT=0 就能把它关掉(客户端那侧对应 IMPORT_ENABLED)。

- 素材带里点它 = 换成它;旁边的小「×」= 从插件里删掉这一份(你自己的原片不受影响)
- 下面的「我导入的视频」列表负责「改名」与「删除」;改名只改显示名(磁盘文件名不动),留空 = 回到原始文件名
- 网页版与桌面版都能导,插件内部走的是两条路:
- 网页版:文件本体流式传给 DSH(带进度条),宿主边收边写盘
- 桌面版:Electron 能把「你刚选的那个文件」翻成绝对路径,于是宿主直接复制,几百 MB 也很快;这条路不通(旧版 Electron / 跨盘 / 没权限)会自动回退到上传那条
- 想手动清也可以:直接删掉 assets/user/ 里那几个 u-*.mp4(清单是按目录推导的,不会留残影);自定义名字在同目录的 labels.json 里,删掉它就全回到原始文件名
- 导入的内容只在你机器上:发布包里没有别人的视频,别人导入的也不会传到你这儿

⚠️ 只收 mp4;编码不支持的会自动转码

导入只认 .mp4(不是 mp4 会在选择器与本地校验那里就拦住)。至于「里面是什么编码」—— 不用你操心:

| 你手上的文件 | 会发生什么 |
| .mp4 + H.264(剪映/手机导出、B 站下载的常见形态) | ✅ 直接导入 |
| .mp4 + HEVC(不少「4K 片源」) | 🔄 导入时会问一句「要不要自动转换」,点一下插件自己把 ffmpeg 下下来(约 28MB,国内镜像)转成 H.264,转完自动收进素材列表 |
| 其它容器(.mkv / .webm / .mov) | ❌ 被拒;先剪成 mp4(剪映导出选 mp4 + H.264 最省事) |
| 不是视频的文件 | ❌ 被拒(「没找到视频轨」) |

转码用的是 libx264 -crf 20、保持原分辨率与帧率、音频 AAC 192k、+faststart;转完插件自己先验一遍能不能播才收下。命令行等价物(不想用界面时):

node scripts/import-hevc.mjs "D:\视频素材\你的母带.mkv"

⚠️ 导入的视频就在插件文件夹里,所以重装/升级插件时可能被覆盖——重装前先把 assets/user/ 里那几个文件挪出去,装完再放回来。

画面不做裁切:始终按完整比例居中显示。窗口比例与片子比例不一致时上下(或左右)会留黑边——这是「保留全部画面」的代价。片源自带的那圈黑边已经在压制素材时裁掉了,剩下的黑边只是比例差。

曾经做过「铺满 / 完整」两档,看过两档之后决定删掉「铺满」:16:9 窗口播一条 2.35:1 的片子,铺满要裁掉左右各约 12%,那是画面少了一块,不是更饱满。

- 桌面版(Electron)自动带声音播放;网页版浏览器会拦未静音自动播放,于是自动降级静音、左下角亮出「打开声音」按钮(点它只开声,不跳过)。同一份代码,两边各得其所。

想让网页版也自动带声音?

做不到由插件说了算——网页里的 JS 绕不过浏览器的自动播放策略,只有 Electron 这种「自己就是浏览器」的宿主能设 no-user-gesture-required。但可以手动给这个站点开声音白名单,开完插件一个字都不用改(它本来就是「先试带声、被拒才降级」):

| 浏览器 | 操作 |
| Chrome / Edge(推荐,不用手输网址) | 在 DSH 页面上点地址栏左边的站点图标 → 「网站设置」→ 找到「声音」→ 改成允许 → 硬刷新 |
| Chrome | chrome://settings/content/sound → 「允许播放声音」→ 添加 http://127.0.0.1:3080 |
| Edge | edge://settings/content/sound → 「允许播放声音」→ 添加;或在 edge://settings/content/mediaAutoplay 里把「媒体自动播放」设为允许(这一条是全局放宽,所有网站都会自动放声,不如前两个精准) |

生效后硬刷新页面,播放时左下角的「🔊 打开声音」按钮不再出现,就是已经在自动带声播了(地址要写全,别漏端口)。
- 点击画面 / 按 Esc 跳过,跳过后仍然走同一段淡出,不会硬切
- 每次客户端加载都会播(刷新页面也算)
- 播放期不会等待 DSH 的加载状态:播完就淡出,无论应用早就绪还是在加载

换成你自己的视频

node scripts/make-asset.mjs <你的母带.mp4> --height 1440 --crf 22

片源自带的黑边要在这一步裁掉,播放器再怎么 object-fit 也去不掉「画出来的黑边」。
先用 ffmpeg -vf cropdetect=24:16:0 -f null - 看出黑边高度,再传给 --crop:

node scripts/make-asset.mjs <你的母带.mp4> --crop 2560:1086:0:177 --crf 22

脚本用 devDependency @ffmpeg-installer/ffmpeg(纯 npm 包,国内镜像可装,不需要访问 GitHub)把母带转成 H.264 + AAC + yuv420p + faststart 的 mp4:浏览器与 Electron 都能直接播,体积通常压到 5–10 MB。

也可以直接手工替换 assets/hdd.mp4,只要满足:

| 项 | 要求 |
| 容器/编码 | .mp4,H.264 视频 + AAC 音频(H.265/HEVC 在 Chromium 里多半放不出) |
| 体积 | 建议 ≤ 15 MB(这个文件要随包分发,别人下载的是它) |
| 时长 | 建议 ≤ 20 秒,且一定要能跳过 |
| 分辨率 | 1080p/1440p 都行,播放时按 object-fit: contain 等比铺满 |

兼容与限制

- 要求 DSH >= 0.2.0-rc.1(package.json#dsh.engines):宿主半边依赖 webserver/index-inject 的行渲染行为与 webServer.register 的原始 (req, res) 契约
- 只能在 Web UI 加载之后覆盖全屏,做不到早于 Electron 窗口首帧(窗口本身仍有一瞬间空白)
- 首帧是一块纯色(#000000),不是视频的第一帧画面——它只负责在插件求值前占住屏幕
- 网页版不可能自动播放还带声音:浏览器拦未静音自动播放,只能静音起步、点一下开声
- 视频文件随包走(不是内联 base64),由宿主路由流式返回,支持 Range / 206 / 304

素材与许可

代码 MIT。

内置素材分两段,授权状态不同,发布包只带第一段:

| 素材 | 来源 | 状态 |
| assets/hdd.mp4(HDD 开机动画) | B 站 UP 主 @露霁luki_yo 的《Hollow Deep Dive System》(HDD) | ✅ 已获作者授权,可随包分发 |
| assets/yuedu.mp4(欢迎来到月读世界) | 从电影片段剪出的几秒 | ⛔ 未获授权——只在本机自用,不进发布包 |

所以对外发布的那份只有 HDD 一段(用 npm run pack:release 打,见下)。
yuedu.mp4 不在仓库里,你自己那份请保留在 assets/,本地两段都能用。

文档

| 文档 | 内容 |
| 视频开屏方案.md | 立项方案:路线对比、素材实测、限制清单(本机文档,不在仓库内) |
| CHANGELOG.md | 版本记录 |

致谢

- HDD 开机动画素材由 B 站 UP 主 @露霁luki_yo 授权提供——《Hollow Deep Dive System》(HDD) 是他的作品,插件内置的那段片头就是它(压缩与裁边见 scripts/make-asset.mjs)。
- 首帧抢屏与"盖住开机卡片"的做法,最初由 dsh-550c-boot (Ziyang Song / Voidpoket)验证并记录;本插件沿用同一套宿主契约。

MIT
预览分享卡片长什么样 ↓xufu5438-netizen/dsh-boot-video
分享 · DeepSeek Harness Hub
xufu5438-netizen/dsh-boot-video

启动时全屏播放自定义视频,点击或按 Esc 跳过

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部