gacha-calendar-core 0.11.0 → 0.11.2

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.
Files changed (2) hide show
  1. package/core.mjs +32 -12
  2. package/package.json +1 -1
package/core.mjs CHANGED
@@ -4,7 +4,7 @@
4
4
  // 用途:缓存里记录"这份数据是哪版插件产出的"。更新插件后首次启动,据此**强制**刷新一次
5
5
  // (不看自动刷新开关)——因为有些改动(悬停格式、来源地址、样式、解析器)不刷新就看不到效果。
6
6
  // 写入时机见 engine-api.js 的 refresh();判定见 60-helpers.js 的 autoRefreshPlan()。
7
- const PLUGIN_VERSION = "0.11.0";
7
+ const PLUGIN_VERSION = "0.11.2";
8
8
  //#endregion
9
9
 
10
10
  //#region config
@@ -3971,14 +3971,23 @@ EVENT_FETCHERS["wuwa"] = {
3971
3971
  }
3972
3972
 
3973
3973
 
3974
- // 从 fz.wiki 页面(Next.js App Router)内联 RSC flight payload 中抽取 contentJson 的 JSON 字符串。
3975
- // 数据被序列化为 self.__next_f.push([1,"..."]);拼接后按引号转义还原,再按大括号平衡取 contentJson 对象。
3974
+ // 从 fz.wiki 的数据里抽出 contentJson 的 JSON 对象。两种输入都要支持:
3975
+ // ① 活动页 HTML(Next.js App Router):数据在 `self.__next_f.push([1,"..."])` 的 RSC 流里;
3976
+ // ② REST API 响应(`api.fz.wiki`):**直接就是 JSON**,没有 `__next_f` 外壳。
3977
+ // 2026-10-04:fz.wiki 的活动页已不再在 HTML/RSC 里输出卡片数据(页面只剩导航外壳,
3978
+ // 实测 `endfieldCardActivityIndex` / `wikiCardItem` 在页面里 **0 处**),数据改由 API 提供
3979
+ // (`revision.contentJson`,结构与原来的 RSC payload 一致)。所以 fetcher 改走 API,
3980
+ // 这里补一条"输入本来就是 JSON"的分支;旧格式分支保留,页面若改回来也照样能用。
3976
3981
  function extractFzContentJson(html) {
3977
- const re = /self\.__next_f\.push\(\[1,"((?:[^"\\]|\\.)*)"\]\)/g;
3978
3982
  let full = "";
3979
- let m;
3980
- while ((m = re.exec(html))) {
3981
- try { full += JSON.parse('"' + m[1] + '"'); } catch { full += m[1]; }
3983
+ if (html.includes("self.__next_f.push")) {
3984
+ const re = /self\.__next_f\.push\(\[1,"((?:[^"\\]|\\.)*)"\]\)/g;
3985
+ let m;
3986
+ while ((m = re.exec(html))) {
3987
+ try { full += JSON.parse('"' + m[1] + '"'); } catch { full += m[1]; }
3988
+ }
3989
+ } else {
3990
+ full = html;
3982
3991
  }
3983
3992
  if (!full.includes('"contentJson"')) return null;
3984
3993
  const ci = full.indexOf('"contentJson"');
@@ -4003,7 +4012,8 @@ EVENT_FETCHERS["wuwa"] = {
4003
4012
  // ③ endfieldCardActivityIndex.content[] → wikiCardItem.attrs.data(当前线上结构)
4004
4013
  // 只收"有明确起止"的活动(timeRanges 末段的 open+close 都非空),
4005
4014
  // 与旧行为一致——无 close 的是新手/每周/引导等常驻活动,不当作当期活动。
4006
- // 时间格式 "2026/9/2 7:00:00";外显=排序第一条(结束最早的),悬停按同序逐行。
4015
+ // 时间格式 "2026/9/2 7:00:00";悬停按**结束时间升序**逐行,外显另由 `pickEventPrimary`
4016
+ // 挑选(叙事/挑战类优先于签到/减耗类),不是简单的"第一条"。
4007
4017
  function parseFzWikiActivities(html, now, tz) {
4008
4018
  const obj = extractFzContentJson(html);
4009
4019
  if (!obj) return null;
@@ -4064,12 +4074,22 @@ EVENT_FETCHERS["wuwa"] = {
4064
4074
  }
4065
4075
 
4066
4076
 
4067
- // 终末地(FZ Wiki 经 host 代理,无 CORS):活动排期页。
4077
+ // 终末地(FZ Wiki 经 host 代理,无 CORS):活动排期。
4068
4078
  // 三态口径:有当期活动 → 数据;解析到活动但没有当期 → null(nomatch);
4069
- // 页面结构变了/一条都解析不出 → parseFzWikiActivities 抛错(down)。
4079
+ // 结构变了/一条都解析不出 → parseFzWikiActivities 抛错(down)。
4080
+ // 2026-10-04:fz.wiki 把活动数据从页面 HTML/RSC 移到了 REST API(页面只剩外壳)→
4081
+ // 改为请求 `api.fz.wiki/api/v1/articles/by-title?ns=0&title=<页面名>&withRevision=1`。
4082
+ // 条目里的 `eventUrl` 仍是**给人看的页面地址**(设置页显示它);标题由该地址的路径推出,
4083
+ // 所以用户把 eventUrl 换成别的 wiki 页也能用。若直接把 eventUrl 配成 API 地址,则原样使用。
4070
4084
  async function fetchFzWikiEndfield(pageUrl, _signal, tz, now = nowMs()) {
4071
- const html = await proxyFetchText(pageUrl, "https://fz.wiki/");
4072
- return parseFzWikiActivities(html, now, tz);
4085
+ let url = pageUrl;
4086
+ if (!/api\.fz\.wiki/.test(pageUrl)) {
4087
+ const m = /\/wiki\/([^/?#]+)/.exec(pageUrl);
4088
+ const title = m ? decodeURIComponent(m[1]) : "活动";
4089
+ url = "https://api.fz.wiki/api/v1/articles/by-title?ns=0&title=" + encodeURIComponent(title) + "&withRevision=1";
4090
+ }
4091
+ const text = await proxyFetchText(url, "https://fz.wiki/");
4092
+ return parseFzWikiActivities(text, now, tz);
4073
4093
  }
4074
4094
 
4075
4095
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gacha-calendar-core",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
4
4
  "description": "二游活动/卡池排期抓取核心:11 款游戏的来源注册表 + 解析器 + 刷新编排 + 缓存降级。零依赖、零宿主环境依赖,任何 JS 运行时(浏览器扩展 background / Tauri / JavaScriptCore / ArkTS 嵌入式引擎)都能跑。",
5
5
  "type": "module",
6
6
  "main": "./core.mjs",