Commit Graph
397 Commits
Author SHA1 Message Date
huangxd- 089530f7ed chore: 移除 package.json 中的 devEngines 配置
不再强制指定 pnpm 版本,以简化项目管理并避免版本锁定带来的不必要约束。
2026-07-26 21:08:34 +08:00
Elegy233 d4d4c9fffa fix: 完善跨季匹配与平台过滤逻辑,修复备用匹配状态及集标题解析 (#392)
* fix: 跨季扩展阻塞与备用匹配 isMatched 状态修复

checkEpisodeSatisfied 指定平台无匹配数据时返回 false:
指定目标平台(如 qiyi)但搜索结果均不匹配该平台时,不再误判为满足。
新增 anyPlatformHadData 标记,无匹配平台时返回 false 以触发跨季扩展。

备用匹配成功后设置 isMatched:
fallbackMatchAniAndEp 成功匹配剧集后 isMatched 未正确置为 true,
导致客户端收到匹配结果但标记为未匹配。

* fix: checkEpisodeSatisfied 优选平台无匹配时回退到不区分平台重查而非直接返回false

当 PLATFORM_ORDER 指定的平台与搜索结果源不匹配时(例如 PLATFORM_ORDER=qiyi 但搜索结果来自 renren),
anyPlatformHadData 为 false,原先直接返回 false 会错误触发跨季扩展(S5~S10)和 spillover 匹配,
造成大量无谓 API 请求。

修复:anyPlatformHadData 为 false 且有 targetPlatform 时,以 targetPlatform=null 递归调用自身,
回退到 _any_ 模式重新查验全部可用数据,再依据集数是否满足决定是否触发扩展。
这同时正确覆盖两种场景:
- 当前季集数不足(如 S1E31 仅 11 集)→ 正确触发扩展
- 当前季集数充足但平台不匹配(如 S4E3 在 renren 有 24 集且含 E3)→ 正确抑制扩展

* fix: matchAniAndEp与findCrossSeasonEpisodeMap中平台不匹配源时回退到无平台过滤

当PLATFORM_ORDER与搜索结果源不匹配时(例如PLATFORM_ORDER=renren但搜到iqiyi结果):
1. matchAniAndEp: findEpisodeByNumber因平台过滤丢弃所有集数返回null后,
   新增回退:检查候选源是否匹配指定平台,不匹配则以platform=null重试。
   这避免了bestRes为空而错误触发findCrossSeasonEpisodeMap spillover。
2. findCrossSeasonEpisodeMap: 平台不匹配时以currentSeason++ + continue
   替代break,允许跨季映射在后续匹配季中继续查找而非直接退出。

保护措施:isPreferredAnime的原有回退逻辑保留作为最后一层兜底。

* fix: extractEpisodeNumberFromTitle 支持第X话和第X回格式

此前仅识别 /第(\d+)集/,导致 dandan 等源使用第31话格式的集标题
无法被提取集号,进而 findEpisodeByNumber 对所有分季 dandan 条目返回 null。
跨季扩展虽然正确拉取了 S3 dandan 条目的 E31(第31话 决裂),但
extractEpisodeNumberFromTitle 无法提取数字 31,导致匹配被跳过,
最终落在能识别第31集的 bahamut 不分季条目上。

修复将正则扩展为 /第(\d+)[集话回]/,同时覆盖:
- 集:标准中文格式(如第31集)
- 话:日式动画格式(如第31话)
- 回:旧式分回格式(如第12回)
不匹配 期/章/卷,避免错配综艺/漫画/OVA分卷格式。

* fix: titleMatches 对无季号标题放宽季数守卫,避免不分季长剧被全部拦截

titleMatches 在 querySeason>1 时原先对无季号标题作 (null||1)!=querySeason
拦截,导致 iqiyi 搜索航海王 S2E62 时全部 16 个结果因标题中无季号被过滤,
searchData 为空,匹配链路崩溃。

修复:仅当源标题明确含季号且与目标季不一致时才拦截,无季号的不分季长剧
交由上游源处理器(如 iqiyi 季数预过滤)决定是否保留。

影响分析:
- 不分季长剧(querySeason>1):修复前被拦截 → 修复后通过 → 正确
- 分季剧S1标题(querySeason=2):修复前拦截 → 修复后仍拦截 → 不变
- 分季剧S2标题(querySeason=2):修复前通过 → 修复后仍通过 → 不变
- 分季剧S3标题(querySeason=2):修复前拦截 → 修复后仍拦截 → 不变
- querySeason=1或null:不受此分支影响,原有行为完全保持
2026-07-26 21:04:12 +08:00
Elegy233 f4d6e5781b feat: 合并工具支持标题年份一致时豁免类型标签差异 (#391)
标题与年份完全一致时跳过媒体类型(电视剧/动漫)冲突检测。
RegexStore.Clean 新增 YEAR_DIGITS,用于匹配捕获四位数年份。
年份不同、N/A 或无年份不触发豁免。
2026-07-26 21:03:56 +08:00
Elegy233andhuangxd- 2b34bae417 feat: renren 全阶段超时调整与云环境两两接口并行,搜索连通性优化详情 (#390)
超时调整:
- 搜索接口超时 3000ms
- 详情接口超时 3000ms
- 弹幕接口超时 5000ms
- renrenRequest 与 renrenHttpGet 新增可选 timeout、signal 参数

云环境两两并行 + 首成即止(搜索和详情):
- 搜索:WIN 和 TV 并行,MAC 和 WEB 并行。TV 优先于 WIN,MAC 优先于 WEB。
- 详情:WEB 和 TV 并行,MAC 和 WIN 并行。WEB 优先于 TV,MAC 优先于 WIN。
- 主级成功时通过 AbortController 中止次级请求,无数据不触发中止。
- 本地环境保持串行降级逻辑不变。

搜索连通性优化详情:
- 搜索阶段记录各 tier 连通性(ok / timeout / unknown)。
- 详情阶段跳过搜索中已超时的 tier,优先使用已验证工作的 tier。
- 连通性仅在单次搜索到详情的链路内有效,每次搜索入口清零。
- 主级被跳过时,次级工作则采纳,失败时回退主级。

详情优先级调整为 WEB,TV,MAC,WIN。

Co-authored-by: huangxd- <649924757@qq.com>
2026-07-26 21:03:40 +08:00
Elegy233 a4256c2885 fix: 严格匹配支持剧名杂音清理,改用正则补全数字与英中季号允许关键词 (#389)
strictTitleMatch 入口处先执行 titleNoiseFilter 再 normalizeSpaces,
标题与查询词双端清理后比较,与宽松模式行为一致。
移除 normalizeSpaces 已剥离的无用符号分隔词(空格、括号、冒号等)。

允许关键词检测改用正则 seasonPattern,覆盖阿拉伯数字(新闻女王2)、
罗马数字(无职转生Ⅱ)、英文季号(S1/Season1/Part1)、
中文季号(第一季/第三部)及关键词(年番/合集/部/篇/部分/剧场/完结/最终)。
裸 S/第/Season 无数字后缀不再匹配,部(?!分) 防止裸"部"吞掉"部分"。
2026-07-26 21:00:58 +08:00
Elegy233 4c3321ee51 fix: 同平台的不同链接弹幕请求串行延迟 1 秒,防止风控 (#388)
当同平台存在多个不同链接时(链接合并的多 URL、合并源
的多配音版本等),改为串行执行,每个之间间隔 1 秒,
防止短时间内对同一平台发起多次并发请求触发风控。
不同平台仍保持并行执行,互不影响。

仅影响 fetchMergedComments 中的多链接分支,
常规单源流程不受任何影响。
2026-07-26 21:00:45 +08:00
Elegy233 ad60e299bd fix: iqiyi 搜索风控重试间隔从 1.5 秒延长至 3 秒,并优化年份提取 (#387)
* fix: 爱奇艺搜索风控重试间隔从 1.5 秒延长至 3 秒

用户反馈遇到风控时当前 1.5 秒间隔不足以通过,等待一会后又可正常访问。
推测爱奇艺风控冷却窗口约 3-5 秒,延长至 3 秒以覆盖更多场景。

* fix: 爱奇艺搜索意图聚合卡片支持从 superscript 角标获取年份

搜索接口 homePageV3 返回的意图聚合卡片(template 112)不含 year 字段,
年份实际存放在角标字段 superscript(如 "1999"),导致航海王等内容年份恒为 null。
在原有 year.value || year.name 回退链末尾追加 superscript 兜底,使其在普通结果卡片
与意图聚合卡片下均能正确提取 4 位年份。
2026-07-26 21:00:20 +08:00
Elegy233 a18a7b5174 fix: 合并合集探测分离 3D/2D 维度,防止误判断合并 (#386)
getContentCategory 对 2D 动漫和 3D 动漫均返回 ANIME,
导致同 baseTitle 的 3D 番进入与 2D 番同一合集探测组。
如 tencent 择天记(2020)【动漫】(2D,61集) 与 iqiyi
择天记(2026)【3D动漫】(3D,26集) 被误分到同一组而产生错误合并。

合集探测分组 key 中加入维度标记(3D/2D/-),使 3D 与 2D
番剧互不进入同一探测组,合集探测各查各的。
2026-07-26 21:00:07 +08:00
Elegy233 d3d15567a1 fix: 修复集连播场景可能导致集偏移记录错误 (#383)
* fix: 集偏移记录加 3 分钟 TTL 防止 lastSearch.episode 过期

lastSearch 仅在 Match/Search 时更新。用户顺播下一集时不刷新,
导致 Comment 记录错误偏移(如 E21 时搜索,20 分钟后顺播 E24
仍以 E21 为基准记录 "21:第24集")。

加 3 分钟时间窗口:Match 后 3 分钟内的 Comment 才记录偏移。
- 手动纠正:Match 后立即纠正,3 分钟内生效
- 顺播过期:超过 3 分钟自动跳过,不产生错误偏移
3 分钟与默认搜索结果缓存时间一致。

* Refine comments on lastSearch handling and TTL

Updated comments for clarity regarding lastSearch behavior and TTL handling.
2026-07-26 20:59:51 +08:00
Rinne 57e693f3d5 feat: 支持更多类型的弹幕输出 (#382)
* feat: 添加基于 @dan-uni/dan-any 的多弹幕格式输出支持,并优化弹幕数据格式化响应

* feat: 更新 README 关于支持多种弹幕格式输出的内容,并添加环境变量配置选项
2026-07-26 20:59:36 +08:00
Elegy233andhuangxd- a8147a9811 fix: 日志标签分层、UI渲染性能优化、全项目标签统一小写 (#380)
标签分层: [Utils] 全项目归入 [system],减少不必要分类层级
性能优化: getLogCategory 预计算为 _category 字段,
  renderLogs/updateFilterUI 直接读取,5k行场景正则在10000+→0次
裸标签补全: [Path Check]/[Path Fix] → [system] [Path ...];
  Bangumi-Data 直调 fetch 的 [请求模拟] 补 [system] 前缀
标签统一: 源文件 log() 中的大写标签([Server]/[Animeko]/
  [Bilibili]/[Bilibili-Proxy]/[Tencent] 等40+种)统一为小写

Co-authored-by: huangxd- <649924757@qq.com>
2026-07-26 20:59:19 +08:00
huangxd- 3a6b5340a0 改用opencc-js处理繁简转换 (#395)
* refactor: 优化构建脚本并改用opencc-js处理繁简转换

- 重构 `build-forward-widget.js` 中的行删除逻辑,改用 split/filter 按片段匹配,避免单行大字典导致正则回溯或内存问题
- 增加 `esbuild.stop()` 确保构建进程正常退出,将 `process.exit(1)` 改为 `process.exitCode = 1` 以允许清理
- 将 `zh-util.js` 中硬编码的繁简映射替换为 `opencc-js` 库,大幅精简代码并提高转换准确性和可维护性

* refactor(utils): 更新 opencc-js 转换器初始化方式

改用 ConverterFactory 并显式导入字典文件,避免使用已弃用的 Converter 构造函数,确保与最新 opencc-js API 兼容。
2026-07-26 20:56:45 +08:00
huangxd- c4d2951eb5 新增红果短剧源 (#394)
* feat: 新增红果短剧源支持

- 在 README 和配置示例中添加红果短剧(hongguo)源,扩展弹幕获取来源
- 更新 SOURCE_ORDER、PLATFORM_ORDER、MERGE_SOURCE_PAIRS 等配置项的可选值
- 新增 hongguo.js 源文件,完善项目文档和目录结构说明

* fix: 支持通过红果播放链接获取弹幕

* feat: 添加红果短剧全集合并选项,支持按集号顺序合并所有集弹幕

- 新增环境变量 `HONGGUO_MERGE_ALL_EPISODES`,默认为 false,启用后将红果短剧所有集的弹幕按剧集顺序合并为一集返回,每集弹幕时间累加前面各集时长,剧集列表显示为“全集”
- 修改缓存键生成逻辑,当启用合并时在缓存键后追加标识,避免与未合并缓存冲突
- 新增 `parseHongguoSeriesId`、`isHongguoSeriesId` 等工具函数用于识别红果系列 ID
- 更新 README 和 `.env.example` 文档说明新配置项

* test: 增强 forward-widget 测试流程的健壮性与剧集匹配逻辑

- 注释掉 storage 模拟中的调试日志,减少测试输出干扰
- 增加进程退出码设置,测试失败时正确返回非零状态
- 新增搜索结果为空时的异常抛出,避免后续空引用
- 优化剧集选择:优先按集数精确匹配,回退到数组索引,增加匹配失败提示
- 新增弹幕分片选择:优先选择包含 450 秒左右的分片,否则取中间时间点
- 增加对分片列表和弹幕列表为空时的异常检查,确保链路完整性
- 调整输出日志,明确显示所选剧集、分片和请求时间点,便于调试

* test: 更新 forward-widget 测试用例参数

- 调整测试数据中的 episode、sourceOrder 和 title 值
- 新增 hongguoMergeAllEpisodes 配置项用于测试
- 更新测试场景以覆盖新逻辑

* feat(forward): 支持debug构建并添加真机远程日志回传

- 新增 `--debug` 构建参数,生成 `logvar-danmu.debug.js` 供真机调试使用
- debug 版本将 `httpGet/httpPost` 替换为带日志回传的调试实现
- 实时回传 handler 执行、请求详情、耗时、异常及 console 输出到服务端终端和 `/api/logs`
- 敏感信息(Cookie、token、API key)在回传前自动脱敏,且回传失败不影响主流程
- 更新 README,补充 Forward 真机调试步骤和使用说明
2026-07-26 20:56:32 +08:00
huangxd- 1bb163e77d feat: 添加环境变量配置导入导出功能以及管理界面主题配置UI_THEME (#393)
* feat: 添加环境变量配置导入导出功能

- 新增 exportSystemConfig 函数,支持将当前环境变量配置导出为 JSON 文件
- 新增 import 相关函数,支持选择并导入配置文件,自动校验键名格式与值类型
- 导入时按优先级排序(TOKEN、ADMIN_TOKEN 等),避免权限提前失效
- 处理脱敏值(全星号)跳过导入并给出明确提示

* feat: 添加管理界面主题配置UI_THEME

增加UI_THEME环境变量,支持ocean、forest、graphite、berry、monochrome、sunset、aurora、lavender、mist、terminal共10种主题,默认值为ocean。在系统API中解析并应用该配置,使管理界面可根据用户偏好切换视觉风格,提升使用体验。

* 更换导入导出配置的图标

* chore: bump version to 1.20.0

* feat(ui): 支持浏览器本地保存主题偏好,优化主题切换错误处理

- 新增 localStorage 存储用户主题选择,优先于环境变量 UI_THEME 与部署默认值
- 主题切换时同时保存本地偏好,云端保存失败时降级为本地生效并给出友好提示
- 更新 README 中 UI_THEME 说明,明确浏览器本地主题优先于环境变量
- 重构主题相关函数,提升可维护性
2026-07-26 20:56:09 +08:00
huangxd- ce8b3cbddf feat: 为ForwardWidget构建添加运行时兼容插件,并重构解压工具函数 (#376)
- 新增 forwardRuntimeCompatPlugin 插件,处理 node:async_hooks 的浏览器兼容实现,并重定向 brotli 字典文件至浏览器版本,确保 ForwardWidget 在浏览器类运行时环境中正常运行
- 将 iQiyi 源中的 Brotli 解压逻辑迁移至 codec-util 的 decompressBrotli 通用函数,统一使用 utf8BytesToString 替代 TextDecoder,提升代码复用性和可维护性
- 此举旨在减少构建产物中的 Node.js 内置模块依赖,并集中管理解码工具,便于后续扩展
2026-07-18 08:08:12 +08:00
lilixu3 64f885c98d fix: 芒果TV搜索API改用新版v2接口+seqId签名 (#374)
* fix: 芒果TV搜索API改用新版v2接口+seqId签名

旧版 /msite/search/v2 已返回403,改用 /aphone/search/rebirth/v2
新增 seqId=md5(deviceId + "." + timestamp) 签名
适配新版响应格式 mediaRebirthV2

* 使用纯JS md5替代Node crypto模块以兼容fw播放器
2026-07-17 07:27:47 +08:00
Elegy233 50e84818e3 feat: 链接解析支持空格分隔多链接合并弹幕、时间偏移、Bahamut/Animeko 链接解析 (#373)
* feat: 链接解析支持空格多链接合并弹幕、时间偏移、Bahamut/Animeko 链接解析

多链接合并: 空格分隔 → MERGE_DELIMITER → fetchMergedComments
时间偏移: 尾缀 @-50/@100(秒数) @%30/@%-11(百分比)
B站短链: 合并与单链接均 resolve b23.tv
b23.tv: 搜索平台识别补充
Bahamut: ani.gamer.com.tw/animeVideo.php?sn=49943
Animeko: bgm.tv/ep/1701422,复用健康度节点路由
多链接标题: 逐链接获取后以全角 & 拼接

* feat: Animeko 链接解析支持 Bangumi 全域名及反代

bgm.tv / bangumi.tv / chii.in / bangumi.lol 四域名
域名检测用单行 .test(),ID 提取用单捕获组内联正则
2026-07-17 07:27:19 +08:00
Elegy233 bcb80ffa66 fix: 爱奇艺电影 share_url 短链接时回退 entity_id,decode 无效时原始 tvid 重试 (#372)
share_url 部分已变为 qy.net 短链接,旧正则 v_(\w+)\.html 无法
匹配。share_url/page_url 提取失败时使用 qipuId(entity_id) 作为
视频ID。decode API 将 entity_id 错误转换为无效 tvid 时,
用原始 tvid 直接请求 baseinfo。
2026-07-17 07:26:44 +08:00
huangxd- 28873bdb2a chore: bump version to 1.19.16 2026-07-17 07:25:49 +08:00
huangxd- 0c2063b008 修复query可能是null的问题 2026-07-14 23:54:26 +08:00
Elegy233 a40fd61671 fix: DANMU_OFFSET 解析与匹配含 / 剧名的两个问题 (#371)
1. parseOffsetRules 无条件按 / 分割,含 / 剧名解析错误
2. resolveOffsetRule 严格相等比较,normalizeSpaces 抹掉斜杠
   导致规则 anime 与实际 baseTitle 无法匹配

修复: 正则解析 /,对决两边做 normalizeSpaces 归一比较
2026-07-14 22:29:52 +08:00
Elegy233 3345ed190a feat: 增加剧名杂音清理规则配置项,清理搜索与匹配阶段的剧名杂音词 (#368)
* feat: 增加剧名杂音清理规则配置项,清理搜索与匹配阶段的剧名杂音词

括号内画质/配音/版本等杂音词(如臻彩、高清、国配)阻塞
搜索和标题匹配。清洗分两层:
1. 搜索输入阶段:searchAnime 获取用户关键词后即清理再提交源站
2. 标题匹配阶段:titleMatches 对源标题和查询词双端清理后再比较

新增 TITLE_NOISE_FILTER 环境变量,值为正则表达式。
默认规则使用字符类 [((]...[))] 同时匹配中英文括号。
不设置时使用默认规则,设为空可禁用。

* fix: 限制剧集匹配中直播一词正则,避免误伤正常标题

EPISODE_TITLE_FILTER 中直播(陪看|回顾)? 匹配裸"直播"
导致"昭演女高 直播欺师"被误过滤。去掉了 ? 和裸直播
匹配分支,仅保留直播陪看、直播回顾等明确杂音后缀。
同时更新 .env.example 与 README 默认值。

* fix: matchAnime 标题未做杂音清理,导致含杂音词文件名匹配失败

matchAnime 提取标题后未清理画质/配音等杂音词,直接传入
matchAniAndEp 和 matchSeason 做 includes 匹配。
杂音词经 normalizeSpaces 去括号后内容残留,阻塞匹配。

在 TITLE_MAPPING_TABLE 和繁转简之后插入噪音清理,
所有下游函数自动受益。searchAnime 保持独立的搜索词清理。
2026-07-14 22:29:15 +08:00
Elegy233 2163d7b5f4 fix(merge): 零偏移奖励门槛从 4 对降为 1 对,修复新番"炒翻天"合并错误 (#364)
ZERO_DIFF_BONUS 原需 >3 对零差才能触发 100 分奖励,
导致单集断层场景仅 E1 一对零差无法拿到加成,
被无断层惩罚的批量偏移对以数量优势压制,选错偏移方向。

任意零差对集出现即表明集号一致,门槛降为 >0。
2026-07-14 22:26:56 +08:00
Wo254992 6ad5a2d5bb Fix(hanjutv): 修复韩剧TV搜索候选错配并提升结果稳定性 (#367)
* 优化韩剧TV暖身恢复与结果顺序

暖身仅在成功后记录身份,失败后允许下一次搜索重试,并保持并发请求共享同一暖身任务。

详情请求继续全部并行,完成后按候选顺序写入结果与缓存,同时保留单候选异常隔离;最小回归测试并入worker.test.js,版本升级至1.19.15。

* 修复韩剧TV搜索候选跨季错配

S5与极速版候选仅在NFKC与首尾空白规范化后的剧名完全一致时合并,删除双向模糊标题和季号叠加判断。

同名多条目使用播放模式、发布年份、集数和分类唯一消歧;仍有歧义时保持独立,最小回归测试并入worker.test.js。

* 修复韩剧TV同名候选配对与年份解析

将S5与TV同名候选改为双向唯一最佳匹配,保留无年份一对一合并并消除返回顺序导致的错配。

修正秒、毫秒、字符串时间戳和紧凑日期的年份解析,补充歧义、顺序不变与旧年份回归测试。
2026-07-14 22:26:01 +08:00
Elegy233 617ae3b230 fix(iqiyi): 搜索接口风控时延迟重试,并输出原始响应辅助排障 (#360)
爱奇艺搜索接口在快速连续请求时可能返回 code=-1 的
风控响应,此前被直接判为无结果并返回空列表。

将 HTTP 请求封装为 doSearch 闭包,风控时等待 1.5 秒
后重试,最多重试两次。搜索无结果及风控失败时输出
原始响应数据,便于人工识别风控 vs 真实无结果。
2026-07-04 22:06:39 +08:00
Elegy233 0bcb0aace6 fix(titleMatches): 查询词含季号时追加去季变体,防止无季标题被误过滤 (#359)
查询词含季号(如"间谍过家家 第一季")时,源返回的标题
可能不含季标记(如"间谍过家家(N/A)【动漫】"),策略2
包含匹配因"第一季"三字不存在而失败,退至策略3相似度又
因季后缀降低匹配率,最终被误过滤。

将去季后的干净查询词(使用 merge-util INFO_STRONG 标准
季正则)加入候选池,季校验前提作为闸门防止跨季误匹配。
2026-07-04 22:06:00 +08:00
Elegy233 8eccc3dfbc chore: 消除与已有工具函数重复的内联实现 (#358)
dandan-api.js:
- getComment 中手动 match / replace【】提取平台标识,
  改为使用已导入的 extractEpisodeTitle

iqiyi.js:
- 删除私有 _base64ToUint8Array 方法,
  改为使用 codec-util.js 的 base64ToBytes
2026-07-04 22:05:27 +08:00
Elegy233 6c236dcb71 fix(merge): 中文数字季号正则支持超过十的数字 (#357)
RegexStore.Season.CN 字符类缺少 + 量词,导致 第十三季
等超过十的中文季号只匹配首字 十,与 第十五季 等一同
被误规范为 第10季,引发错误合并。

正则追加 + 量词支持多字符中文数字,
cnNums 查表替换为 convertChineseNumber 处理任意长度。
2026-07-04 22:03:07 +08:00
huangxd- 6a90bc015b 更新小版本号 2026-07-04 22:02:30 +08:00
Elegy233 b5123c25c1 fix(animeko): 更新内置镜像站域名 (#354)
原镜像站域名遭遇 TLS 阻断导致请求失败,更换为新域名。
bangumi.one → bangumi.lol
详见:https://bgm.tv/group/topic/462456
2026-06-28 08:14:18 +08:00
Elegy233 808db83cf4 fix(renren): 请求超时设为 5 秒并移除重试 (#347)
各端 HTTP 请求均显式传入 timeout: 5000 替代全局 VOD_REQUEST_TIMEOUT,
确保被屏蔽的非大陆 IP 在 Netlify/Vercel 等平台快速失败而非累积超时。
renrenHttpGet / renrenRequest 移除 retries: 1,
被 ban 的 IP 重试无意义反而倍乘等待时间。
2026-06-28 08:13:31 +08:00
huangxd- f4cb1d1664 Merge branch 'main' of github.com:huangxd-/danmu_api 2026-06-28 08:12:38 +08:00
huangxd- 869ac36948 非admin token下,请求记录从「只脱敏 IP」扩展到「同时脱敏接口查询值和请求体值」 2026-06-28 08:12:29 +08:00
Elegy233 69fe600cfa fix(bilibili): 搜索结果分集优先按 index_title 排序,无法提取时退回 ep_id (#352)
部分番剧的 ep_id 为倒序排列,导致集号错乱。
改为优先从 index_title 提取集号升序排列,
任一集无法提取时整组退回 ep_id 排序。
2026-06-20 13:35:06 +08:00
Elegy233 1d98d3fcea fix: 修复跨季集数顺延映射污染偏好记录 (#350)
fallbackMatchAniAndEp 通过 isSpillover 标记区分跨季顺延
结果,matchAnime 据此跳过 setLastSearch,避免 spillover
匹配的无关番剧经过 getComment 路径污染 lastSelectMap 偏好。
2026-06-20 13:34:18 +08:00
Elegy233 2230a9dcc3 feat: Bangumi-Data 命中日志追加检索词 (#348)
在 Bahamut/Animeko/Bilibili/Dandan/TMDB 的 Bangumi-Data
本地命中日志末尾追加(检索词:xxx),方便排查时
关联搜索关键词与命中结果。
2026-06-20 13:33:33 +08:00
Elegy233 d02e84f71f fix: searchCache/commentCache 写入时清扫过期条目并限制大小上限 (#345)
cache-util.js:
- 新增 sweepExpiredCache(),写入前按 TTL 遍历删除过期条目
- setSearchCache / setCommentCache 写入后检查 Map.size,超过 500 则移除最早条目
  作为 TTL 清扫后的安全兜底

globals.js:
- getConfig() Proxy 实例懒初始化后缓存复用,不再每次新建

cookie-util.js:
- handleQRCheck 增加 finally 块,检查完成后清理 qrLoginSessions
2026-06-20 13:33:10 +08:00
huangxd- 91e563ab5c chore: bump version to 1.19.12 2026-06-20 13:31:37 +08:00
Elegy233 6cd68ebf78 feat(renren): 搜索接口收集 original_name 到别名列表 (#344)
将各端搜索接口的 highlights 字段采集统一到同一条件块内,
alias 与 original_name 作为 highlights 的同级子字段处理。
original_name 去除 HTML 标签后加入别名列表,
解决搜索原名无法匹配的问题。
original_name 可能为空或 null,与 alias 处理一致。
2026-06-13 13:44:59 +08:00
lilixu3 53e2294d98 优化弹幕测试热力图、筛选与统计卡片 (#343)
* 增强弹幕测试结果页调用链路体验

变动内容:
- 在弹幕测试结果页增加调用链路展示,覆盖自动匹配、手动搜索、番剧详情和弹幕拉取过程。
- 将统计卡文案调整为链路耗时,并按当前请求链路汇总耗时。
- 优化热力图滑动提示、边缘防溢出、筛选标签数量显示和横向滚动体验。
- 修复切换番剧/剧集时旧调用链路追加、旧请求返回覆盖新结果、失败和空结果缺少链路信息的问题。

* 修复弹幕测试调用链路串线

变动内容:
- 为自动匹配、手动搜索、番剧详情和弹幕拉取增加独立请求令牌,避免旧响应覆盖新结果。
- 传递并克隆当前调用链路,修正手动失败和空结果的返回目标。
- 清理弹幕测试静态 inline 样式,补充热力图、筛选、跳集和移动端样式。
- 收敛方法标记和热力图类名,复用弹幕类型统计并增强长文本展示。

* 移除弹幕测试详情页调用链路显示

* 弹幕测试统计改为彩色占比
2026-06-13 13:44:44 +08:00
Elegy233 7996e8d2b1 fix(bilibili): 修复集数倒序问题并规范化HTML实体解码 (#342)
- 修复:将集数排序基准从易受干扰的标题文本切换为B站底层数据主键(ep.id/cid),进行绝对数值升序排列,彻底解决因不规则标题(如精华版)破坏排序算法导致的集数倒序问题。
- 重构:移除各处零散的内联HTML实体解码字典,将命名实体解码逻辑统一收敛下沉至公共工具类 `codec-util.js`,提升代码规范度与复用性。
2026-06-13 13:44:28 +08:00
huangxd- cda5ba5c6e chore(release): bump version to 1.19.11 2026-06-13 13:43:55 +08:00
Elegy233 d4caa14cf2 feat: 逐源管道解耦 searchAnime 两阶段流程 (#341)
将 searchAnime 中的两阶段阻塞模型(Promise.all(search) → executeSourceHandlers)
改为逐源管道模型:每个源形成独立的 search → executeSourceHandlers 流水线,
search 完成后通过 {[source]: searchResult} 调用 executeSourceHandlers 处理该源,
不等待其他源完成。

改动说明:
- 构建 sourceSearchMap 存储各源搜索 Promise(搜索并发度不变)
- 每个源的搜索 Promise 通过 .then() 链式调用 executeSourceHandlers
- 传入仅含当前源数据的 {[source]: searchResult},使 executeSourceHandlers 仅处理该源
- executeSourceHandlers 增加 activeSourceKeys 过滤,仅处理 resultData 中存在数据的源
- 各管道独立维护 isolatedAnimes 和 isolatedDetailStore
- 所有管道通过 Promise.allSettled 并发执行
- 管道完成后按 SOURCE_ORDER 顺序合并结果(animeId 去重、detailStore 键去重)
- resultData 在管道 .then() 回调中填充,供 S2+ 季度扩展逻辑读取
- executeSourceHandlers 函数未做任何修改,源路由逻辑仍由其集中维护

预期收益:
消除阶段壁垒,各源 handleAnimes 不再等待最慢源搜索完成,
可减少约 max(handleAnimes) 的等待时间,同时实现管道级错误隔离

网络层容错增强(http-util.js):
- 自适应重试退避:网络层物理阻断(ETIMEDOUT / ECONNRESET / AbortError)
  采用 100ms 短退避快速重试;服务端业务错误保持原有指数退避逻辑,
  在不影响服务端错误安全性的前提下加速 GFW 间歇性阻断场景的恢复
- 修复 linkSignal 事件监听器内存泄漏:
  finally 块中 removeEventListener 注销监听器,阻断跨请求引用累积

巴哈姆特源容错增强(bahamut.js):
- HTTP 请求重试次数提升至 3(共 4 次尝试),配合自适应退避提高反代可达率
- tmdbSearchPromise 错误处理与 originalSearchPromise 保持一致:
  网络失败返回 {success: false} 而非 throw,避免快速失败吞掉搜索结果
- handleAnimes 增加 epData 结构校验,防止 getEpisodes 返回空数组时 TypeError
- getEpisodes 日志仅输出 videoSn/animeSn/title/totalEpisode/episodes 关键字段,
  避免全量输出 contentHtml/relatedGnn 等冗余数据

日志裁剪(kan360.js):
- zongyi response 日志从全量 API 响应改为输出每页剧集条数
- search response 日志从全量 API 响应改为输出搜索结果数组
2026-06-07 11:37:04 +08:00
Elegy233 dc41b9147d fix: REMEMBER_LAST_SELECT 偏好记录在季节性缓存分区后失效,同时修复跨源标题别名拒绝写入 (#340)
改动涉及问题:
1. PR #303 引入的搜索缓存季度分区导致单季度搜索覆盖 lastSelectMap 的 animeIds,
   后续 setPreferByAnimeId 因找不到目标 animeId 而静默失败
2. 手动指定的优选番剧在平台偏好场景下被非优选源覆盖(手动偏好优先级低于平台偏好)
3. 评论 handler 的 titleMatches 仅检查主标题,不同源对同一番剧的标题存在差异
   (如 bilibili "正相反的你与我" vs dandan "相反的你和我"),导致跨源的偏好无法记录

修复:
cache-util.js
- storeAnimeIdsToMap: 合并旧 animeIds 而非覆盖,避免单季度搜索结果清空全量 ID
- findAnimeIdByCommentId: 返回 anime.aliases(各源已填充),用于标题兼容校验

dandan-api.js
- searchAnime: 季节性缓存 miss 时回退至泛化(无季度)缓存
- matchAniAndEp: 手动优选番剧增加 isPreferredAnime 标记,含三重保障:
  目标平台未命中时放宽平台限制、+9999 评分权重确保优先、命中即时跳出
- getComment: 偏好写入闸门增加别名匹配,防止因标题差异导致偏好静默丢弃
2026-06-07 11:36:46 +08:00
huangxd- 1bca4ea470 chore: bump version to 1.19.10 2026-06-07 11:37:18 +08:00
Wo254992 81a320177e fix: 修复特殊字符标题搜索匹配失败 (#337)
* fix: 修复特殊字符标题搜索匹配失败

改动详情:

- 使用 URL.searchParams 构造内部 /search/anime 搜索地址
- 避免标题中的 & 等特殊字符被当作查询参数分隔符截断
- 补充回归测试,验证 keyword、season、episode 参数保持正确

* refactor: 简化搜索地址构造调用
2026-06-06 12:18:25 +08:00
dyphireandhuangxd- aad97a0f88 fix(kan360): 360 kan 的 /v1/detail 接口在集数非常多时获取失败 (#336)
Co-authored-by: huangxd- <649924757@qq.com>
2026-06-06 12:18:08 +08:00
Elegy233 ee15f5871c feat: 前端新增覆盖全项目的日志筛选分类系统 (#335)
* feat: 前端新增覆盖全项目的日志筛选分类系统

基于项目架构建立三级日志标签体系(编排层/工具层/源层),
覆盖 50 个文件。

=== 前端日志分类引擎 (logview.js + components.css.js) ===
- 新增 getLogCategory 标签分类引擎,支持标签提取、归类与续行上下文继承
- ISO 时间戳与 HH:MM:SS 格式精确过滤,避免误杀数字开头标签(如 360kan)
- 续行 _inherit_ 机制:无标签行自动继承上一行分类
- normalizationMap 归一化映射:变体标签统一收束至标准分类
- 标签筛选按钮 UI 按 system → utils/cache/merge → 源 三层分组排序

=== 后端标签规范化 ===
- sources/ 20 个源文件:弹幕提取、搜索函数、JSON 响应等全部 log 调用补全源标签
- utils/ 12 个工具文件:以 [Utils] [Name] 格式统一,保留 [Cache][Merge] 独立标签
- apis/dandan-api.js 采用 [system] [SubName] 层级格式:
  子类别覆盖 Duration / executeSourceHandlers / searchAnime / LogVar-API /
  Episodes / matchAnime / Spillover / getBangumi / Offset / YearFilter /
  Match / Bangumi / SegmentComment
- apis/env-api.js 4 处 console.error 改用 log() 纳入日志缓冲区
- configs/handlers/ 8 个文件补全 [system] [Server] 标签
- worker.js 补全 [system] [Server] / [Utils] [Rate Limit] / [Utils] [IP Blacklist]
- forward/forward-widget.js 补全 [Forward],删除重复 console.log
- node-functions/index.js console.log → log() 统一纳入日志系统
- TMDB 标签拆分:sources/tmdb.js 保持 [TMDB],utils/tmdb-util.js 使用 [Utils] [TMDB]
- fetchMergedComments 合并拉取路径补全源级获取弹幕日志

=== 基础设施 ===
- http-util.js 新增 sourceLogContext (AsyncLocalStorage) 跨异步日志上下文追踪
- http-util.js 新增 toLogSourceName() 集中映射函数(360→360kan, imgo→mango)
- http-util.js 诊断续行移除重复标签前缀
- 额外季数检索改为并行 Promise.all
- 前端 JSON 续行切割修复:HH:MM:SS 时间戳识别 + 无标签行自动继承

=== 标签层级 ===
系统层:[system] [Server]             [AI]
工具层:[Utils] [Name]                 [Cache] [Merge]
源层:  [360kan][vod][bilibili][tencent][youku][iqiyi]
        [mango][migu][renren][hanjutv][bahamut][dandan]
        [sohu][leshi][xigua][maiduidui][aiyifan][animeko]
        [Douban][TMDB][custom][other]
插件层:[Forward]

* 回退node-functions/index.js
2026-06-06 12:16:03 +08:00
huangxd- 3ce9ecc1ec chore: bump version to 1.19.9 2026-06-06 12:16:00 +08:00
Elegy233 6752d867cf feat(animeko): 新增 Bangumi 镜像站支持并引入详情接口多源降级适配 (#333)
- animeko.js:
  1. 搜索节点扩容: 为 Bangumi V0 搜索接入高性能镜像站 (api.bangumi.one),并依据代理配置状态动态分配轮询优先级(代理状态:官方/代理 > 镜像;直连状态:镜像 > 官方)。
  2. 详情灾备链路: 以聚合度最高、性能最优的 Animeko V2 API 作为首选详情节点,重新接入镜像 V0 与官方 V0 节点作为底层的降级备份。
  3. 详情 V0 适配器: 构建降级适配器。在触发 V0 节点降级时,直接复用搜索链路已下发的基础元数据,仅并发请求剧集与关联端点,在内存中将数据无缝归一化为 V2 结构,确保上层业务逻辑零感知且网络开销最小化。
2026-05-31 20:11:02 +08:00