dsh-boot-suite 2.13.19 → 2.13.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## [2.13.21] — 2026-10-31
2
+
3
+ - **第二幕新增 4K 版**:新增内置模板「鲸鱼娘扫描睁眼(4K)」(3840×2160,7 秒,AV1 MP4),由社区作者 **1catmint1** 的 8K 超分版下采样而来(8K 源仓库 BSD-3-Clause;原片 NativeDog1/dsh-boot-animation)。
4
+ - **第二幕 2K 改名**:原「鲸鱼娘扫描睁眼」显示名改为「鲸鱼娘扫描睁眼(2K)」,仍是默认第二幕;两版都可在「启动动画第二幕」下拉里选。
5
+ - **8K 不入包**:桌面版 DSH 播放 8K 有内存泄漏/渲染进程崩溃风险(8K 作者实测),插件只保留 8K 仓库地址与作者署名,需要的用户自行下载;桌面端建议 2K/4K。
6
+
7
+ ## [2.13.20] — 2026-10-30
8
+
9
+ - 修设置页旧文案:声音效果默认值标注修正(「无(原声)」/「机器人(默认)」)、开关改为「启用配音播报」、配音音色兜底从已删除的 builtin 改为 f。
10
+ - 无功能变化,仅文案与默认值标注,老配置不受影响。
11
+
1
12
  ## [2.13.19] — 2026-10-30
2
13
 
3
14
  ### 变更
package/README.md CHANGED
@@ -232,10 +232,12 @@ MIT(只覆盖作者原创代码与文案)。
232
232
  | # | 动画 | 原作者 | 地址 |
233
233
  |---|---|---|---|
234
234
  | 1 | **最早的启动动画**(第一幕参考,带空格/回车交互的那支) | **沈宏宏**(@6shenhonghong9) | https://github.com/6shenhonghong9/dsh-startup-screen |
235
- | 2 | **鲸鱼娘「DeepSeek娘扫描睁眼」**(可选模板 `whale-girl-scan`,素材随包) | NativeDog1/dsh-boot-animation 内置片库(BSD-3-Clause;原作者上游未标注,待确认) | https://github.com/NativeDog1/dsh-boot-animation |
235
+ | 2 | **鲸鱼娘「DeepSeek娘扫描睁眼」2K**(可选模板 `whale-girl-scan`,素材随包,默认第二幕) | NativeDog1/dsh-boot-animation 内置片库(BSD-3-Clause;原作者上游未标注,待确认) | https://github.com/NativeDog1/dsh-boot-animation |
236
236
  | 3 | **550C 启动动画**(学习复刻对象,对应 `550c-homage`) | @yannicksong0106 | https://github.com/yannicksong0106/dsh-550c-boot |
237
237
 
238
- 前两项只做**形式参考与工程复刻**;第 2 项「鲸鱼娘扫描睁眼」素材按上游 **BSD-3-Clause** 许可随可选模板提供。
238
+ 前两项只做**形式参考与工程复刻**;第 2 项「鲸鱼娘扫描睁眼」素材按上游 **BSD-3-Clause** 许可随可选模板提供(2K 版默认;4K 版 `whale-girl-scan-4k` 由社区作者 **1catmint1** 的 [8K 超分版](https://github.com/1catmint1/dsh-boot-animation-8k) 下采样而来,同样 BSD-3-Clause)。
239
+
240
+ > 8K 原版(10240×5760)请从 [1catmint1/dsh-boot-animation-8k](https://github.com/1catmint1/dsh-boot-animation-8k) 自行下载。作者实测桌面版 DSH 播放 8K 会内存泄漏、开机动完 2–7 分钟渲染进程可能崩溃,**桌面端请用 2K/4K 版**;8K 仅建议网页端或作静帧收藏。
239
241
  如果你喜欢这些动画,请去原仓库给作者点 star。
240
242
 
241
243
  以上作品版权归原作者所有。本项目只做**形式参考与工程复刻**,不复用其素材;
package/lib/client.js CHANGED
@@ -266,7 +266,7 @@ window.__ModuleLoader__.load({
266
266
  —— 桌面端走浏览器半侧自举时没有 1,就靠这一条
267
267
  3) 下面这个常量:两份都没拿到时的兜底,别让面板显示 undefined
268
268
  版本号本身只在 lib/index.js 里读一次,这里不重复维护。 */
269
- var FALLBACK_VERSION = '2.13.19'
269
+ var FALLBACK_VERSION = '2.13.21'
270
270
  /* 手动选包成功后置 true:让还在后台跑的“浏览器下载监听”不要再弹第二次更新器 */
271
271
  var __manualUpdateApplied = false
272
272
  function readInjectedVersion() {
@@ -927,8 +927,8 @@ window.__ModuleLoader__.load({
927
927
  h('div', { className: '__ss_group' },
928
928
  h('div', { className: '__ss_groupTitle' }, '语音与音效'),
929
929
  h(Check, {
930
- label: '女声播报(念每一行的英文)',
931
- hint: '每一行的英文都在文字出现的同一时刻念出来,动画等这句话念完再走下一步。',
930
+ label: '启用配音播报',
931
+ hint: '每一行的台词都在文字出现的同一时刻念出来,动画等这句话念完再走下一步。',
932
932
  checked: draft.voice,
933
933
  onChange: (v) => set('voice', v)
934
934
  }),
@@ -938,22 +938,22 @@ window.__ModuleLoader__.load({
938
938
  + '选完音色后,下面的「声音效果」可以再叠一层处理,或选「无」保留原声。'
939
939
  },
940
940
  h(Select, {
941
- value: draft.voicePack || 'builtin',
941
+ value: draft.voicePack || 'f',
942
942
  options: voiceOptions(),
943
943
  onChange: (v) => set('voicePack', v)
944
944
  })
945
945
  ) : null,
946
946
  draft.voice ? h(Field, {
947
947
  label: '声音效果',
948
- hint: '5 个音效都来自模板编辑器里的同一套参数,实时叠加在所选音色上;选「无(原声)」就是干净人声。'
949
- + '只影响全局配音素材,模板自带的配音不受影响。'
948
+ hint: '默认「机器人」;5 个音效都来自模板编辑器里的同一套参数,实时叠加在所选音色上。'
949
+ + '选「无(原声)」就是干净人声;只影响全局配音素材,模板自带的配音不受影响。'
950
950
  },
951
951
  h(Select, {
952
952
  value: draft.voiceFx || 'none',
953
953
  options: [
954
- ['none', '无(原声,默认)'],
954
+ ['none', '无(原声)'],
955
955
  ['ai-mech', 'AI 机械音'],
956
- ['robot', '机器人'],
956
+ ['robot', '机器人(默认)'],
957
957
  ['radio', '无线电'],
958
958
  ['oldtv', '老电视'],
959
959
  ['dark', '低沉']
@@ -1100,7 +1100,7 @@ window.__ModuleLoader__.load({
1100
1100
  '片头(档案暖白)参考:沈宏宏(@6shenhonghong9) · ',
1101
1101
  h('a', { className: '__ss_link', href: 'https://github.com/6shenhonghong9/dsh-startup-screen', target: '_blank', rel: 'noreferrer' }, 'dsh-startup-screen'),
1102
1102
  h('br'),
1103
- '鲸鱼娘素材:NativeDog1/dsh-boot-animation 内置片库「DeepSeek娘扫描睁眼」(BSD-3-Clause,原作者待上游确认);可选模板「鲸鱼娘扫描睁眼」随包提供 · ',
1103
+ '鲸鱼娘素材:NativeDog1/dsh-boot-animation 内置片库「DeepSeek娘扫描睁眼」(BSD-3-Clause);随包提供 2K/4K 两版可选;8K 版请自行下载(桌面端有内存崩溃风险,仅建议网页端/收藏):https://github.com/1catmint1/dsh-boot-animation-8k(8K 超分:1catmint1,BSD-3-Clause) · ',
1104
1104
  h('a', { className: '__ss_link', href: 'https://github.com/NativeDog1/dsh-boot-animation', target: '_blank', rel: 'noreferrer' }, 'dsh-boot-animation'),
1105
1105
  h('br'),
1106
1106
  '配音:DeepSeek · 语音包与台词由作者提供'
@@ -1600,7 +1600,7 @@ window.__ModuleLoader__.load({
1600
1600
  /* 每次改客户端就把这个号 +1。
1601
1601
  有了它在控制台一眼就能判断"浏览器里跑的是不是最新那份" ——
1602
1602
  排查问题时,分不清是代码问题还是旧包,会白猜一轮。 */
1603
- var BUILD = 'cw-42'
1603
+ var BUILD = 'cw-44'
1604
1604
 
1605
1605
  function log() {
1606
1606
  try {
@@ -107,7 +107,7 @@ const DEFAULTS = {
107
107
  glitchA: '#ff3b30',
108
108
  glitchB: '#2971b8',
109
109
  template: 'archive-warm', // 第一幕默认:档案暖白
110
- act2: 'whale-girl-scan', // 第二幕默认:鲸鱼娘扫描睁眼;'' = 不播
110
+ act2: 'whale-girl-scan', // 第二幕默认:鲸鱼娘扫描睁眼(2K);另有 whale-girl-scan-4k;'' = 不播
111
111
  /* v2.12.0 三段转场:第一幕入场 / 两幕衔接 / 第二幕退场。默认全部交叉叠化。 */
112
112
  transitionIn: 'dissolve',
113
113
  transitionJoin: 'dissolve',
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-boot-suite",
3
- "version": "2.13.19",
4
- "description": "DeepSeek Harness 启动动画与聊天背景插件:两幕开机动画、自定义动画导入、三段转场、6 套干音音色(英文 1 + 日文 5)+ 5 种声音效果、聊天背景图片/循环视频、更新前自动回滚;聊天背景新增黑白原版素材模式。",
3
+ "version": "2.13.21",
4
+ "description": "DeepSeek Harness 启动动画与聊天背景插件:两幕开机动画、自定义动画导入、三段转场、6 套干音音色(英文 1 + 日文 5)+ 5 种声音效果、聊天背景图片/循环视频、更新前自动回滚;聊天背景新增黑白原版素材模式。 第二幕提供 2K/4K 两档可选(4K 由社区 1catmint1 的 8K 超分版下采样,BSD-3-Clause)。",
5
5
  "keywords": [
6
6
  "dsh",
7
7
  "dsh-plugin",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "id": "whale-girl-scan",
4
- "name": "鲸鱼娘扫描睁眼",
4
+ "name": "鲸鱼娘扫描睁眼(2K)",
5
5
  "author": "素材:NativeDog1/dsh-boot-animation(BSD-3-Clause,原作者待上游确认);模板维护:LeeRolling",
6
6
  "homepage": "https://github.com/LeeRolling/dsh-boot-suite",
7
7
  "license": "BSD-3-Clause",
8
8
  "version": "1.0.3",
9
- "description": "鲸鱼娘「DeepSeek娘扫描睁眼」原片(2560×1440,7 秒),全屏播放 + 淡入淡出;底部保留素材署名。素材来源:NativeDog1/dsh-boot-animation 内置片库(BSD-3-Clause,原作者上游未标注)。",
9
+ "description": "鲸鱼娘「DeepSeek娘扫描睁眼」原片 2K 版(2560×1440,7 秒),全屏播放 + 淡入淡出;底部保留素材署名。素材来源:NativeDog1/dsh-boot-animation 内置片库(BSD-3-Clause,原作者上游未标注)。",
10
10
  "tags": [
11
11
  "anime",
12
12
  "whale",
@@ -0,0 +1,104 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "whale-girl-scan-4k",
4
+ "name": "鲸鱼娘扫描睁眼(4K)",
5
+ "author": "素材:NativeDog1/dsh-boot-animation(BSD-3-Clause);8K 超分:1catmint1/dsh-boot-animation-8k;模板维护:LeeRolling",
6
+ "homepage": "https://github.com/LeeRolling/dsh-boot-suite",
7
+ "license": "BSD-3-Clause",
8
+ "version": "1.0.0",
9
+ "description": "鲸鱼娘「DeepSeek娘扫描睁眼」4K 版(3840×2160,7 秒),全屏播放 + 淡入淡出。由社区作者 1catmint1 的 8K 超分版下采样而来(8K 源:https://github.com/1catmint1/dsh-boot-animation-8k ,BSD-3-Clause);原片:NativeDog1/dsh-boot-animation(BSD-3-Clause)。桌面版建议用本 4K 版或 2K 版,8K 版在桌面端有内存崩溃风险,仅建议网页端/收藏使用。",
10
+ "tags": [
11
+ "anime",
12
+ "whale",
13
+ "video",
14
+ "cinematic"
15
+ ],
16
+ "duration": 7200,
17
+ "theme": {
18
+ "accent": "#4d6bfe",
19
+ "glitchA": "#ff3b30",
20
+ "glitchB": "#2971b8"
21
+ },
22
+ "segments": [
23
+ {
24
+ "name": "扫描 · 睁眼",
25
+ "from": 0,
26
+ "to": 7200
27
+ }
28
+ ],
29
+ "layers": [
30
+ {
31
+ "id": "bg",
32
+ "type": "panel",
33
+ "pos": [
34
+ 640,
35
+ 360
36
+ ],
37
+ "panelW": 1280,
38
+ "panelH": 720,
39
+ "fill": "#000000",
40
+ "radius": 0,
41
+ "keyframes": [
42
+ {
43
+ "t": 0,
44
+ "opacity": 1
45
+ }
46
+ ]
47
+ },
48
+ {
49
+ "id": "whale",
50
+ "type": "video",
51
+ "pos": [
52
+ 640,
53
+ 360
54
+ ],
55
+ "videoW": 1280,
56
+ "videoH": 720,
57
+ "src": "whale-girl-scan-4k.mp4",
58
+ "keyframes": [
59
+ {
60
+ "t": 0,
61
+ "opacity": 1
62
+ },
63
+ {
64
+ "t": 7200,
65
+ "opacity": 1
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ "id": "credit",
71
+ "type": "text",
72
+ "text": "WHALE GIRL · NATIVEDOG1/DSH-BOOT-ANIMATION · 8K SOURCE: 1CATMINT1 · BSD-3-CLAUSE",
73
+ "pos": [
74
+ 640,
75
+ 360
76
+ ],
77
+ "align": "center",
78
+ "font": {
79
+ "size": 9,
80
+ "weight": 400,
81
+ "tracking": 0.18
82
+ },
83
+ "color": "rgba(139,232,255,.55)",
84
+ "keyframes": [
85
+ {
86
+ "t": 0,
87
+ "opacity": 0,
88
+ "offsetY": 318
89
+ },
90
+ {
91
+ "t": 600,
92
+ "opacity": 1,
93
+ "offsetY": 318
94
+ },
95
+ {
96
+ "t": 7200,
97
+ "opacity": 1,
98
+ "offsetY": 318
99
+ }
100
+ ]
101
+ }
102
+ ],
103
+ "effects": []
104
+ }
@@ -80,7 +80,7 @@ const CFG = {
80
80
  }
81
81
  /* v2.12.1 起模板列表;v2.12.4 内置模板删除 = 隐藏进 HIDDEN(可 unhide 恢复),本地模板才是真删除 */
82
82
  const BUILTIN_TPL = { id: 'archive-warm', name: '档案暖白', source: 'builtin' }
83
- const BUILTIN_TPL2 = { id: 'whale-girl-scan', name: '鲸鱼娘扫描睁眼', source: 'builtin' }
83
+ const BUILTIN_TPL2 = { id: 'whale-girl-scan', name: '鲸鱼娘扫描睁眼(2K)', source: 'builtin' }
84
84
  const USER_TPL_A = { id: 'custom-local-a', name: '我的开场动画', source: 'user' }
85
85
  const USER_TPL_B = { id: 'custom-local-b', name: '淡入过渡', source: 'user' }
86
86
  const ALL_TEMPLATES = [BUILTIN_TPL, BUILTIN_TPL2, USER_TPL_A, USER_TPL_B]
@@ -112,12 +112,12 @@ const fetchStub = (url, init) => {
112
112
  if (!HIDDEN.includes(id)) HIDDEN.push(id)
113
113
  return Promise.resolve({ json: () => Promise.resolve({ ok: true, id, removed: false, hidden: true }) })
114
114
  }
115
- if (u.includes('/dsh-startup/voices')) {
116
- return Promise.resolve({ json: () => Promise.resolve({ ok: true, packs: [
117
- { id: 'f', name: '英文音色F(默认)', lang: 'en' },
118
- { id: 'g', name: '日文音色1', lang: 'ja' },
119
- ], default: 'f' }) })
120
- }
115
+ if (u.includes('/dsh-startup/voices')) {
116
+ return Promise.resolve({ json: () => Promise.resolve({ ok: true, packs: [
117
+ { id: 'f', name: '英文音色F(默认)', lang: 'en' },
118
+ { id: 'g', name: '日文音色1', lang: 'ja' },
119
+ ], default: 'f' }) })
120
+ }
121
121
  if (u.includes('/dsh-startup/templates')) {
122
122
  return Promise.resolve({ json: () => Promise.resolve({ ok: true, templates: liveTemplates(), hidden: HIDDEN.slice() }) })
123
123
  }
@@ -216,11 +216,11 @@ check('渲染出「权限等级」字段', texts.includes('权限等级'))
216
216
  const idInput = find(tree, (n) => n.type === 'input' && n.props.type === 'text' && n.props.value === 'JOYCE MOORE')
217
217
  check('身份名称输入框回填了当前配置', !!idInput, idInput && idInput.props.value)
218
218
  check('渲染出「启动动画」开关', texts.includes('启用启动动画'))
219
- check('渲染出「女声播报」开关', texts.includes('女声播报(念每一行的英文)'))
219
+ check('渲染出「启用配音播报」开关', texts.includes('启用配音播报'))
220
220
  check('已删除旧 TTS「播报语言」字段', !texts.includes('播报语言'))
221
- check('渲染出「配音音色」字段', texts.includes('配音音色'))
222
- check('渲染出「声音效果」字段', texts.includes('声音效果'))
223
- check('渲染出「终幕语音延迟」字段', texts.includes('终幕语音延迟'))
221
+ check('渲染出「配音音色」字段', texts.includes('配音音色'))
222
+ check('渲染出「声音效果」字段', texts.includes('声音效果'))
223
+ check('渲染出「终幕语音延迟」字段', texts.includes('终幕语音延迟'))
224
224
  check('渲染出「界面音效」开关', texts.includes('界面音效'))
225
225
  check('已删除旧 TTS 音色选择', !texts.includes('试听所选音色') && !texts.includes('语音来源'))
226
226
  check('渲染出音量、不再有语速/音调', texts.includes('音量') && !texts.includes('语速') && !texts.includes('音调'))
@@ -499,20 +499,20 @@ const beforePreview = requests.length
499
499
  previewBtn.props.onClick()
500
500
  await flush(); await flush(); await flush()
501
501
  check('立即预览先重新拉配置', requests.length > beforePreview && requests.slice(beforePreview).some((r) => /\/dsh-startup\/config/.test(r.url || '')), '')
502
- check('立即预览调用 __DSH_STARTUP_API__.replay()', windowStub.__replayed === true)
503
- /* v2.13.15 回归:选完「配音音色」直接点预览(还没点保存)也必须按当前选择播 */
504
- tree = renderPanel()
505
- const voiceSel = walk(tree).filter((n) => n.type === 'select' && Array.isArray(n.props.children) && n.props.children.some((o) => o && o.props.value === 'g'))[0]
506
- check('配音音色下拉能从 /voices 拿到音色G', !!voiceSel, JSON.stringify(walk(tree).filter((n) => n.type === 'select').map((n) => (n.props.children || []).map((o) => o && o.props.value))))
507
- if (voiceSel) {
508
- voiceSel.props.onChange({ target: { value: 'g' } })
509
- await flush()
510
- tree = renderPanel()
511
- const previewBtn2 = find(tree, (n) => n.type === 'button' && n.props.children === '立即预览')
512
- previewBtn2.props.onClick()
513
- await flush(); await flush(); await flush()
514
- check('立即预览使用未保存的 draft(voicePack=g)', windowStub.__DSH_STARTUP__ && windowStub.__DSH_STARTUP__.voicePack === 'g', windowStub.__DSH_STARTUP__ && windowStub.__DSH_STARTUP__.voicePack)
515
- check('preview 合并 draft 的源码标记存在', code.includes('j.config, draft || {}'))
502
+ check('立即预览调用 __DSH_STARTUP_API__.replay()', windowStub.__replayed === true)
503
+ /* v2.13.15 回归:选完「配音音色」直接点预览(还没点保存)也必须按当前选择播 */
504
+ tree = renderPanel()
505
+ const voiceSel = walk(tree).filter((n) => n.type === 'select' && Array.isArray(n.props.children) && n.props.children.some((o) => o && o.props.value === 'g'))[0]
506
+ check('配音音色下拉能从 /voices 拿到音色G', !!voiceSel, JSON.stringify(walk(tree).filter((n) => n.type === 'select').map((n) => (n.props.children || []).map((o) => o && o.props.value))))
507
+ if (voiceSel) {
508
+ voiceSel.props.onChange({ target: { value: 'g' } })
509
+ await flush()
510
+ tree = renderPanel()
511
+ const previewBtn2 = find(tree, (n) => n.type === 'button' && n.props.children === '立即预览')
512
+ previewBtn2.props.onClick()
513
+ await flush(); await flush(); await flush()
514
+ check('立即预览使用未保存的 draft(voicePack=g)', windowStub.__DSH_STARTUP__ && windowStub.__DSH_STARTUP__.voicePack === 'g', windowStub.__DSH_STARTUP__ && windowStub.__DSH_STARTUP__.voicePack)
515
+ check('preview 合并 draft 的源码标记存在', code.includes('j.config, draft || {}'))
516
516
  }
517
517
  delete windowStub.__DSH_STARTUP_API__
518
518
  previewBtn.props.onClick()
@@ -463,7 +463,7 @@ ok(intervals.every((t) => t.cleared) || intervals.length === 0, '旧的 interval
463
463
  intervals.map((t) => (t.cleared ? 'cleared' : 'live')).join(','))
464
464
 
465
465
  console.log('\n=== ⑦ v2.13.0 测试钩子 / BUILD ===')
466
- ok(mod.__BUILD === 'cw-42', '__BUILD = cw-42(排查浏览器跑的是不是新包)', String(mod.__BUILD))
466
+ ok(mod.__BUILD === 'cw-44', '__BUILD = cw-44(排查浏览器跑的是不是新包)', String(mod.__BUILD))
467
467
  ok(mod.__VIDEO_ID === 'dsh-cw-video', '__VIDEO_ID = dsh-cw-video', String(mod.__VIDEO_ID))
468
468
  ok(typeof mod.__startShuffle === 'function', '__startShuffle 导出')
469
469
  ok(typeof mod.__stopShuffle === 'function', '__stopShuffle 导出')
@@ -7,7 +7,8 @@ const root = process.cwd();
7
7
  const stage = fs.mkdtempSync(path.join(os.tmpdir(), 'dsh-release-'));
8
8
  const out = path.join(root, '..', '03-发布包', 'dsh-boot-suite-win.zip');
9
9
  /* code-motion:另一条工作线(动效研究/验证)的文档与媒体,不属于插件本体,发布包不打包 */
10
- const skip = new Set(['.git', 'node_modules', '08-备份', 'code-motion']);
10
+ /* docs:主线(编辑器重制/风格库/演示素材)文档与媒体,体积可能非常大(GB 级),不属于插件运行必需,发布包不打包 */
11
+ const skip = new Set(['.git', 'node_modules', '08-备份', 'code-motion', 'docs']);
11
12
  function copy(src, dst) {
12
13
  fs.mkdirSync(dst, { recursive: true });
13
14
  for (const e of fs.readdirSync(src, { withFileTypes: true })) {