dsh-mpkg-wallpaper 3.13.4 → 3.13.5
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/lib/index.js +13 -2
- package/lib/pkg-extract.js +8 -0
- package/lib/web-wallpaper.js +24 -5
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -16,7 +16,7 @@ import { execFileSync, spawn } from 'node:child_process';
|
|
|
16
16
|
// ①(2026-09-21 音频格式补全) 后三个导出是**唯一的**扩展名→MIME 表与嗅探入口,见 docs/AUDIO-TRACK-SPEC.md §1.2/§3:
|
|
17
17
|
// 路由侧原先各自内联一份扩展名三元链 + 一份魔数嗅探,已与渲染器支持的后缀漂移(.oga/.m4a/.aac 缺失、ftyp 偏移写错)。
|
|
18
18
|
// ⚠ 这条 import 必须**保持单行**:tools/bundle-equivalence-test.mjs 的具名导入解析器按行读(注释进括号会解析失败)。
|
|
19
|
-
import { extractSceneMainImage, extractSceneMainImageFromDir, extractSceneManifest, extractSceneLayer, extractTexVideoMp4, collectSceneVideoFiles, parsePkg, readPkgEntry, scanSceneAudio, scanSceneVideo, clearSceneVideoScanCache, suffixAudioMime, audioMimeFor, AUDIO_SUFFIX_MIME } from './pkg-extract.js';
|
|
19
|
+
import { extractSceneMainImage, extractSceneMainImageFromDir, extractSceneManifest, extractSceneLayer, extractTexVideoMp4, collectSceneVideoFiles, parsePkg, readPkgEntry, scanSceneAudio, scanSceneVideo, clearSceneVideoScanCache, suffixAudioMime, audioMimeFor, AUDIO_SUFFIX_MIME, mpwParseWeJson, mpwWeJsonSwallowed } from './pkg-extract.js';
|
|
20
20
|
// ①(新 2026-09-16 I 项) 网页(web)类壁纸:内容优先的类型判定 + WE API shim 注入 + 跨源策略
|
|
21
21
|
// (MIT,本仓库自写;API 名单参考 oneincase/webwallgl,未复制其代码,见 ../docs/COPYING-RULES.md §4)
|
|
22
22
|
// ①(WP-1 2026-09-19) 追加:帧内存储 facade 的持久化路由(/web-store)、宿主媒体音频控制
|
|
@@ -3830,7 +3830,18 @@ function apply(ctx) {
|
|
|
3830
3830
|
const proj = join(p, 'project.json');
|
|
3831
3831
|
if (!existsSync(proj)) continue;
|
|
3832
3832
|
try {
|
|
3833
|
-
|
|
3833
|
+
/* ①(2026-09-24 包内/包旁 JSON 收口线) **包旁** JSON:Steam 库里 `<壁纸目录>/project.json`
|
|
3834
|
+
(与 scene.pkg 同级,官方工坊布局)⇒ 走**宿主侧同一份**宽容解析(尾逗号/注释/BOM;
|
|
3835
|
+
官方 `assets/effects/fluidsimulation/effect.json` 第 402 行自己就带尾逗号)。
|
|
3836
|
+
语义与改动前一致:读不到/真坏 JSON ⇒ 仍然抛(下面的既有 catch 照旧跳过该壁纸并 console.warn)。
|
|
3837
|
+
多出来的是**记账**:解析器计数(`mpwWeJsonStats().failed`)+ 下面 catch 里的
|
|
3838
|
+
`mpwWeJsonSwallowed`(计数 + 一行诊断;同 where+原因只吵一次)—— 原来只有一句 warn,
|
|
3839
|
+
"坏在哪一步/坏了几次"看不出来。**注意只在解析这一段**调用记账:`readdirSync`/探测
|
|
3840
|
+
失败不该被记成"JSON 坏"(归因不能糊)。 */
|
|
3841
|
+
const meta = (() => {
|
|
3842
|
+
try { return mpwParseWeJson(readFileSync(proj, 'utf8')); }
|
|
3843
|
+
catch (e) { mpwWeJsonSwallowed('[steam-inventory] ' + proj, e); throw e; }
|
|
3844
|
+
})();
|
|
3834
3845
|
const type = (meta.type || 'scene').toLowerCase();
|
|
3835
3846
|
// ④(安全) 排除 application / exe 壁纸:这类已弃用的 .exe 格式可能被注入病毒,
|
|
3836
3847
|
// 本插件绝不读取/执行任何 .exe。scene 只给预览图(无法渲染)。
|
package/lib/pkg-extract.js
CHANGED
|
@@ -154,6 +154,14 @@ function mpwWeJsonSwallowed(where, e) {
|
|
|
154
154
|
}
|
|
155
155
|
/* ═══ MPW-WEJSON-END ═══ */
|
|
156
156
|
|
|
157
|
+
/* ①(2026-09-24 包内/包旁 JSON 收口线) **宿主侧复用出口**:`lib/web-wallpaper.js`(WE 目录的 `project.json`)
|
|
158
|
+
与 `lib/index.js`(Steam 库壁纸目录的 `project.json`)都要用**同一份**宽容解析与记账 —— 导出面只加名字,
|
|
159
|
+
解析逻辑、计数口径、`swallowed` 语义**一字未动**("包内 JSON 解析点都要记账"这条纪律由
|
|
160
|
+
tools/we-json-tolerance-test.mjs 的静态反查看住)。客户端侧 `lib/client.js` 的同名块是**浏览器产物**的
|
|
161
|
+
内联副本(页面没有模块图),两边一致性由同一条门禁的切片对拍看着 —— 所以这里不是"第三份实现",
|
|
162
|
+
而是把宿主这一份**接出来给宿主模块共用**。 */
|
|
163
|
+
export { mpwParseWeJson, mpwWeJsonStats, mpwWeJsonSwallowed };
|
|
164
|
+
|
|
157
165
|
/** Wallpaper Engine texture format ids (TEXI0001 header), per RePKG/lwe. */
|
|
158
166
|
const TexFormat = {
|
|
159
167
|
RGBA8888: 0,
|
package/lib/web-wallpaper.js
CHANGED
|
@@ -31,6 +31,13 @@ import { createHash } from 'node:crypto';
|
|
|
31
31
|
// 为什么要 import 而不是复制一份:触摸的协议形状(`op:'touch'` 的字段表)与父页整形体同在
|
|
32
32
|
// lib/web-interaction.js,**唯一源**不能有两份(tools/web-interaction-test.mjs 会断言两侧一致)。
|
|
33
33
|
import { WEB_TOUCH_FRAME_SOURCE } from './web-interaction.js';
|
|
34
|
+
// ①(2026-09-24 包内/包旁 JSON 收口线) 官方随包 JSON 的**宽容解析**:**复用宿主侧那一份**
|
|
35
|
+
// (`lib/pkg-extract.js` 的 MPW-WEJSON 块,P-177 同口径:先 JSON.parse → 字符串外尾逗号 → 再不行剥注释;
|
|
36
|
+
// BOM 吃掉;真坏 JSON 仍然抛)。为什么必须共享而不是在本文件再写一遍:本仓已有两份同语义实现
|
|
37
|
+
// (`lib/client.js` 浏览器内联副本 + `lib/pkg-extract.js` 宿主侧),tools/we-json-tolerance-test.mjs
|
|
38
|
+
// 把两处切片逐夹具对拍防漂移 —— 再加第三份就是三处漂移面。
|
|
39
|
+
// ⚠ 本模块是**宿主侧** ESM(Node),与 `lib/index.js` 同一个模块图(bundle 的模块表因此不变)。
|
|
40
|
+
import { mpwParseWeJson, mpwWeJsonSwallowed } from './pkg-extract.js';
|
|
34
41
|
|
|
35
42
|
/** 类型判定结果(四态 + 排除态) */
|
|
36
43
|
export const WEB_KIND = { WEB: 'web', SCENE: 'scene', VIDEO: 'video', UNKNOWN: 'unknown' };
|
|
@@ -316,15 +323,27 @@ export function listWallpaperFiles(root, opts = {}) {
|
|
|
316
323
|
return out;
|
|
317
324
|
}
|
|
318
325
|
|
|
319
|
-
/** 读并解析目录里的 project.json
|
|
326
|
+
/** 读并解析目录里的 project.json(缺失 → null;损坏 → 记账后 null,交给启发式兜底)。
|
|
327
|
+
* ①(2026-09-24 包内/包旁 JSON 收口线) 读的是 **WE 目录的 `project.json`**(**包旁**:官方工坊布局里与
|
|
328
|
+
* `scene.pkg` 同级;本模块的 `detectWallpaperDir` → `detectWebWallpaperKind` 用它做**内容优先**判定,
|
|
329
|
+
* `general.file` 是网页壁纸入口的第一顺位证据)⇒ 必须容忍官方允许的尾逗号/注释:官方随包发布的
|
|
330
|
+
* `assets/effects/fluidsimulation/effect.json` 第 402 行自己就带尾逗号(WE 用 jsoncpp 照用),
|
|
331
|
+
* 严格 `JSON.parse` 会把这份**包旁属性表/入口声明**整份丢掉 ⇒ 类型判定只剩文件名启发式、属性推不下去,
|
|
332
|
+
* 而且**日志一行都没有**(改前的 `catch { return null }` 就是这类静默)。
|
|
333
|
+
* 语义保持"读不到就是 null"(缺失 ⇒ null / 真坏 JSON ⇒ 记账后 null,照旧不抛 —— 调用方按启发式兜底);
|
|
334
|
+
* `mpwWeJsonSwallowed` 给计数 + 一行诊断(同 where+原因只吵一次)。 */
|
|
320
335
|
export function readProjectJson(dir) {
|
|
336
|
+
const p = join(dir, 'project.json');
|
|
337
|
+
let text = null;
|
|
321
338
|
try {
|
|
322
|
-
const p = join(dir, 'project.json');
|
|
323
339
|
if (!statSync(p).isFile()) return null;
|
|
324
|
-
|
|
340
|
+
text = readFileSync(p, 'utf8');
|
|
341
|
+
} catch { return null; } // 缺失/损坏的路径/IO 读不到 ⇒ null(原语义;**不是** JSON 问题,不记账成 JSON 坏)
|
|
342
|
+
try {
|
|
343
|
+
const obj = mpwParseWeJson(text);
|
|
325
344
|
return obj && typeof obj === 'object' ? obj : null;
|
|
326
|
-
} catch {
|
|
327
|
-
return
|
|
345
|
+
} catch (e) {
|
|
346
|
+
return mpwWeJsonSwallowed('web-wallpaper:readProjectJson(' + p + ')', e);
|
|
328
347
|
}
|
|
329
348
|
}
|
|
330
349
|
|
package/package.json
CHANGED