57 Commits
Author SHA1 Message Date
Wo254992andhuangxd- 7f44d1a67f fix(cache): 隔离缓存后端并优先恢复 Local Redis 查询数据 (#492)
* fix(cache): 隔离缓存后端并优先恢复 Local Redis 查询数据

* fix(cache): 透传剧集 ID 写入失败并补充清理失败提示

- addAnime 的 ID 溢出/映射错误保留在请求级 detailStore,逐层合并后写入搜索响应 errorMessage,不再只留服务端日志
- 清缓存保存失败时提示未保存的后端仍保留清理前数据、重启后会重新加载
- 补充搜索透传与清理失败提示的回归用例

* fix(cache): 收敛剧集 ID 写入失败的提示范围并隔离诊断日志

- 诊断用的 animes 序列化移出主 try 并自带容错:历史快照里残留
  links 为 null 的条目时,序列化不再把已成功的写入判成失败,也不再把
  内部报错透给调用方。
- errorMessage 只在"没有结果"时承载写入失败原因,恢复与 dandanplay
  既有约定一致(其余响应点均与 success:false 配对);链接解析与合并
  分支恒有合成条目,不承载该提示。
- /api/v2/match 与 /api/v2/search/episodes 在无结果时透出同一原因,
  补齐上一提交只覆盖搜索接口的缺口。
- 逐源隔离存储的错误合并抽为 mergeAddAnimeError,去掉重复实现。
- 测试:溢出用例拆成"无结果"与"部分成功"两个方向,新增 links 为 null
  的历史快照不再拖垮后续写入用例。

* fix(cache): 限制本地 Redis 命令响应等待时间

- 初始化读取使用 5 秒响应期限,普通 GET/SET/SETEX 使用 30 秒期限
- 超时关闭对应连接并冷却 30 秒,释放在途请求;失败不更新保存 hash
- 复用现有 TCP 故障测试,覆盖读取回退、并发等待、写入失败及冷却后重连
- 影响范围仅限 Local Redis 工具与测试,不新增配置或依赖
- 验证:159 项测试通过,原始故障脚本复测通过,语法检查及 Node/neutral 打包通过

* fix(cache): 收敛编号恢复并限制缓存清理等待

- 编号兜底统一在初始化结束时判断,健康计数器或 ID 不受损坏副本影响
- 剧集链接分配失败时回滚本次追加的 ID 和计数器,保留既有详情与映射
- 各后端并发清理,Redis 清理使用包含 Local Redis 建连时间的 5 秒预算
- 保留持久化失败状态与失败后端提示,普通业务沿用原超时设置
- 复用持久化和 TCP 故障用例补充回归,说明编号兜底及备份语义

* fix(cache): 修复 Upstash 收藏热切换与读取失败假成功

* fix(cache): 补齐剧集编号引用并按详情批次校正上界

* perf(cache): 复用 Local Redis 批量保存的序列化结果

* fix(cache): 阻止热切换前的收藏请求修改新库

* test(cache): 将缓存回归测试合并到主测试文件

* test(cache): 扩大 Redis 超时测试的预算压缩范围,5 个场景耗时从 ~27s 降至 ~8s

- 业务命令 30s、握手 5s、批量/清理 5s 与 Upstash 5s 一并钳制到 1200ms,并新增 AbortSignal.timeout 钳制
- clear-write 假服务器慢握手停顿 3000ms 降至 600ms,保持仍慢于压缩后的命令预算
- 断言下限 4500ms 调整为 1000ms,上界收紧至 4000ms
- 新增断言验证清理路径剩余预算扣除已耗连接时间(budgets 记录原始值)

---------

Co-authored-by: huangxd- <649924757@qq.com>
2026-10-02 23:11:33 +08:00
Elegy233 d91079ebc1 feat(dandan): 弹弹302关联链接仅分发给已在 SOURCE_ORDER 开启的源 (#489)
关联链接的对应平台只要已接入采集源就会实时拉取,与 SOURCE_ORDER 表达的可选源范围无关。现要求该源已在 SOURCE_ORDER 中开启才分发,未开启的源与已独立选择的合并源一样跳过并记录日志。README、config/.env.example 与 envs.js 中 DANDANPLAY_ACCOUNT 的说明同步为「并把同一请求下发的弹弹关联链接分发给对应平台源实时拉取(需开启对应源)」。

worker.test.js 新增用例:仅开启 bilibili 时只拉取 bilibili、仅开启 tencent 时分发目标随之切换、两个关联源均未开启时不拉取、已开启但被独立选择的合并源覆盖时同样跳过。
2026-10-02 21:35:44 +08:00
Elegy233andhuangxd- c42877ccf0 feat(dandan): 弹弹play弹幕替代机制改用 NipaPlay 中转弹弹play服务端获取弹幕与弹弹302关联链接(需登录) (#487)
* feat: 弹弹play弹幕替代机制改用 NipaPlay 中转弹弹play服务端获取弹幕与弹弹302关联链接

dandan 源原经弹幕代理获取弹弹缓存弹幕,仅在弹幕为空时借弹弹302关联链接拉取跨平台弹幕。现改为:配置弹弹play账号后,dandan 源经 NipaPlay 中转弹弹play服务端获取弹幕,并把同一请求下发的弹弹302关联链接分发给已接入的对应平台源实时拉取,两部分沿用既有多源去重合并。

- 源配置新增 DANDANPLAY_ACCOUNT 与 DANDANPLAY_PASSWORD,账号与密码同时填写后自动开启,移除 NIPAPLAY_REPLACE_DANDAN 开关
- 密码配置页提供连通性测试,新增 POST /api/nipaplay/verify
- NipaPlay 中转弹弹play服务端以香港线路为主、国内线路为备,主线路连续失败达到阈值后临时切换备用线路
- 原生弹幕地址请求失败时保留已解析的弹弹302关联链接,仍交由自采源拉取
- 以内嵌应用密钥与签名换取关联链接的做法改为账号令牌登录,令牌临近过期自动续期
- 凭据类变量与文本类变量同样绕过 dotenv 注释截断,含 # 时无需转义即可完整读取,写入 .env 后即时生效
- AI API Key 与 B站 Cookie 各自独立的编辑器样式合并为通用凭证编辑器样式,供 AI API Key、弹弹play密码与 B站 Cookie 共用
- nipaplay-util.js 日志标签按源与服务模块标注为 [dandan] [nipaplay]
- README 与 .env.example 新增两个账号变量的配置项与说明,配置预览新增「NipaPlay 中转弹弹play服务端」分组

* fix: httpRequestMethod 统一支持 allow_redirects 并修正失真 JSDoc

httpGet/httpPost 已实现 allow_redirects,httpRequestMethod(PATCH/PUT/DELETE 委托)此前未实现,其 JSDoc 标注「暂未实现」失真。现于 httpRequestMethod 统一实现:默认跟随重定向,false 时禁止以截获 3xx Location,与 GET/POST 行为一致;同步修正 JSDoc,并移除与 JSDoc 语义重复的那行注释。

* fix: 管理接口凭据写入日志脱敏,以按 encrypt 登记的变量为判据

- setEnv 日志对凭据类变量以 *** 脱敏,避免令牌/密码/Cookie/带令牌 URL 明文进入运行日志;判据为 Envs.sensitiveKeys(由 Envs.get 在 encrypt 为真时登记),非凭据变量保留明文以便排障
- 保存接口对掩码值 *** 跳过写入,避免凭据编辑框未改动直接保存时用星号覆盖服务端已存的真实值
- 补全 Envs.get 缺失的 encrypt 参数说明

* fix: applyShiftToDanmu 复用通用偏移工具处理关联链接偏移

原手写实现直接对 p 首字段与 t 做加减,缺少通用偏移工具的非负钳制,负偏移且绝对值大于弹幕时间时会产出负时间戳。
现改为调用 offset-util 的 applyOffset,与手动 @偏移、DANMU_OFFSET 等其余偏移路径行为一致,并保留 isRealTimePulled 标记供 dandan 源 formatComments 跳过专属转换。
worker.test.js 补充负偏移钳制用例。

* test: 补充重定向一致性与 dandan 实时拉取标记的回归用例

worker.test.js 补充两处行为的回归用例:httpRequestMethod(经 httpPatch)的 allow_redirects 是否与 GET/POST 一致,以及 dandan 源 formatComments 是否按 isRealTimePulled 区分原生弹幕与实时拉取弹幕。两者均为可稳定回归的纯逻辑,纳入项目测试以免后续回归。

* refactor: dandan.js 模块级定义下移以与其它源的结构保持一致

将 DandanUserAgent、SOURCE_TO_PLATFORM、getRelatedDanmuViaNipaplay、fetchDandanComments 下移到导出类之后,使「获取弹弹play弹幕」分节注释与其它源一致地紧随导入与源实例之后。
上述标识符均在函数体或方法体内使用,不在模块加载期求值,故下移不影响运行;已验证导出类方法仍可正常调用下移后的函数。

* fix: 弹弹play 与 AI 连通性检测改为随请求提交配置值

B站 Cookie 检测以请求体中的值向 B 站实时校验,弹弹play 与 AI 的检测则只能取到服务端运行期配置:弹弹play 的账号、AI 的地址与模型都不随检测请求提交。云部署(vercel 等)保存变量需重新部署才会刷新运行期配置,因此这两处检测在重新部署前一直失败。

现改为账号、密码、密钥、地址、模型一律随检测请求提交,取值自设置页已加载的配置;掩码值(当前访问无权限读取明文)视为未知,交由服务端回退到已保存配置。

worker.test.js 补充设置页请求体字段与弹弹play/AI 验证接口以请求体为准的用例。

* chore: bump version to 1.21.3

---------

Co-authored-by: huangxd- <649924757@qq.com>
2026-09-26 16:21:34 +08:00
Elegy233 ea88a15a7a refactor(ui): 配置界面优化与图标补全,修正 TITLE_NOISE_FILTER 默认值 (#478)
* feat(ui): 配置页统一最近数据入口与操作按钮,修正合并模式已选源状态

- 新增 chevron-left 图标,返回按钮以图标替换手写左箭头符号
- 「查看最近数据」按钮与面板抽为 renderRecentDataButton / renderRecentDataPanel 供各配置页共用
- 标题过滤类配置(ANIME_TITLE_FILTER、EPISODE_TITLE_FILTER、TITLE_NOISE_FILTER)增加「查看最近数据」入口
- 「查看最近数据」统一右对齐,尺寸与同行操作按钮保持一致
- 修正 PLATFORM_ORDER 开启合并模式后已选源不可再选的问题,与 MERGE_SOURCE_PAIRS 行为一致

* fix: 修正 TITLE_NOISE_FILTER 默认值文档并补齐全角方括号

- README 与 config/.env.example 中 TITLE_NOISE_FILTER 默认值多写了一个反斜杠,字符类被
  提前闭合导致 new RegExp 抛 Unmatched ')',用户照抄该默认值会得到非法正则
- 默认规则补齐全角方括号 [],描述按段落换行,并改用 String.raw 使源码文本与正则内容一致
- MERGE_SOURCE_PAIRS 示例在描述、README 与 JSDoc 中统一为 dandan&bahamut&animeko,renren&hanjutv,renren
- worker.test.js 增加默认规则用例:默认值可直接编译并清理剧名杂音(含全角方括号),且
  README 与 config/.env.example 中的默认值必须与代码默认值一致

* feat(ui): 配置页操作按钮增加间距与图标

映射表、偏移规则、合并规则页的左右操作按钮在窄屏下无间距而贴边,
为按钮行增加间距;并为添加与解析类操作按钮增加线性图标,与查看最近
数据按钮的图标风格对齐。

- 左右操作按钮行增加间距
- 新增加号图标,用于添加映射项、添加规则按钮
- 解析并更新列表按钮使用刷新图标

* fix(ui): 修复添加规则切换按钮图标丢失

添加规则与收起规则切换按钮按状态写入图标:收起态使用向上箭头图标,
添加态使用加号图标。

* refactor(ui): 请求记录时间戳时钟 emoji 替换为线性图标

时间戳前的时钟 emoji 由 CSS 伪元素注入,改为在标记中渲染时钟
线性图标。

* refactor(ui): 日志查看与请求记录页头部间距与对齐调整

日志查看与请求记录页标题与操作按钮行之间增加间距;请求记录页
今日请求总数改用 flex 与刷新按钮居中对齐。

* fix(ui): 修复请求记录页在旧内核浏览器下的卡顿

最新版本徽标的呼吸动画叠加 backdrop-filter 模糊,缩放时持续重新
采样整页内容,旧内核浏览器软件合成下触发持续重绘,记录较多时卡顿。
去掉该徽标的 backdrop-filter,并为页头持续动画补充合成提示。

* fix(ui): 统一最新版本徽标暗色模式背景并清理无意义毛玻璃

最新版本徽标在暗色模式下沿用实底主题色覆盖,与浅色模式的半透明
背景不一致,删除该覆盖;并移除当前版本徽标上无意义的 backdrop-filter。
2026-09-13 13:10:36 +08:00
huangxd- 1524494c45 feat(local-danmu): 新增本地弹幕上传、解析与管理功能 (#474)
- 新增 POST /api/v2/local-danmu/upload 接口,支持上传并解析本地弹幕文件(multipart/form-data,单文件最大 10 MB),电视剧可指定 season/episode
- 新增 GET /api/v2/local-danmu/list 获取按标题、年份、类型、季分组的资源列表;GET/DELETE /api/v2/local-danmu/:resourceKey 支持查询元数据与删除资源
- 接口需 TOKEN 或 ADMIN_TOKEN 鉴权,新增 LOCAL_DANMU_NOT_REQUIRE_ADMIN 环境变量控制上传/删除权限,默认仅管理员可操作,设为 true 时普通 TOKEN 用户也可执行
- Node/Docker 部署将资源保存至 .cache/local-danmu,云端部署使用 Redis 持久化
- SOURCE_ORDER 新增 local 源字段,可将本地弹幕搜索结果纳入排序(如 local,douban,360)
- 管理面板新增本地弹幕上传、列表管理与删除功能,并同步更新 README 接口与配置说明
2026-09-12 07:26:07 +08:00
xlmcandxlmc 3ffdd13763 feat: add configurable danmaku gradient colors (default off) (#458)
* feat: add configurable danmaku gradient colors

* feat: default GRADIENT_CHANCE to 0 (off)

---------

Co-authored-by: xlmc <xlmc@users.noreply.github.com>
2026-08-25 23:02:47 +08:00
Elegy233 62fd0afddf feat: 弹弹play源支持经 NipaPlay 302关联链接获取弹幕,并支持 NIPAPLAY_REPLACE_DANDAN 替代原生弹幕开关 (#439)
* feat: 弹弹play源支持经 NipaPlay 302关联链接获取弹幕,并支持 NIPAPLAY_REPLACE_DANDAN 替代原生弹幕开关

当 dandanplay 原生弹幕为空(新番上线缓存空窗期)时,dandan 源借助 NipaPlay 授权的
302关联接口,经 302 重定向获取用户在弹弹play客户端实际绑定的跨平台播放链接,实时拉取
bilibili/bahamut/iqiyi/youku/tencent/mango 的弹幕作为兜底。

新增 NIPAPLAY_REPLACE_DANDAN 开关(默认关闭,经 envs 暴露、前端可配置):开启后 dandan
源以 nipaplay 关联弹幕替代弹弹原生弹幕,跳过原本的弹弹 HTTP 弹幕接口请求(不做并行,避免请求量
放大);当关联链接为空时回退弹弹自身弹幕作为安全网(因采用项目链路获取弹幕,会丢失弹弹
自身平台弹幕,多平台中巴哈需确保可连通)。

实现要点:
- 关联接口凭证由 NipaPlay 授权下发,参数经运行时派生与重组还原,源码不出现可读明文(禁止滥用);
- 签名生成、302 关联链接的解析与请求抽取至 nipaplay-util.js,dandan.js 仅负责触发与分发;
- 复用各平台既有源实例拉取弹幕,对各源零侵入;
- 兜底弹幕按真实来源标注平台标识(如 bilibili1/qq/qiyi),与手动解析链接输出一致;
- 同平台多个链接串行、间隔 1 秒请求,避免短时间内同平台并发触发风控;
- 已独立选择的合并源按源名与平台标识双重比对跳过,避免重复获取;对跳过的合并源输出日志,使合并源冲突防范可见;
- 关联接口响应仅含重定向(无弹幕体,单次线上响应约数百字节),弹幕数据来自后续按平台
  链接实时拉取,对既有请求路径无额外放大。

* test: 增加 nipaplay 弹蛋302关联工具函数单元测试(注释态)

覆盖 parseNipaplayRelatedLinks、resolveNipaplayLink、applyShiftToDanmu、generateNipaplaySignature;按仓库既有约定以注释形式提交,解除注释即可经 node --test 运行。

* fix: 移除 NIPAPLAY_REPLACE_DANDAN 配置说明反引号并改用换行

envs.js 与 .env.example 的 NIPAPLAY_REPLACE_DANDAN 说明原使用反引号包裹 false/true 与三条注意事项,前端当前无法渲染反引号。改为去掉反引号,并参照既有配置(如 USE_BANGUMI_DATA)使用换行分隔默认值、可选值与注意事项,提升前端展示可读性。

* docs: 调整 README 致谢中 NipaPlay-Reload 弹弹302关联链接描述

去掉致谢行中重复的 NipaPlay-Reload 字样,并将授权改为请求授权以准确描述链接授权性质。

* docs: README 致谢补充弹弹play开放平台链接

在 NipaPlay-Reload 提供的 302关联链接请求授权描述中,为弹弹play开放平台补充官方文档链接,与上方 danmaku-anywhere 行风格一致。
2026-08-15 07:57:46 +08:00
huangxd- 1b719f43d6 feat: 新增收藏管理权限控制环境变量 FAVORITE_REQUIRE_ADMIN (#434)
* feat: 新增收藏管理权限控制环境变量 FAVORITE_REQUIRE_ADMIN

支持通过环境变量控制收藏写入和管理接口是否必须使用 ADMIN_TOKEN,收藏列表仍保持公开只读。更新了配置示例、环境变量文档、UI 预览及版本号至 1.20.6。

* fix: 修复排序配置中源重复选择问题并优化合并模式逻辑

- 对 SOURCE_ORDER 和 PLATFORM_ORDER 的已选项按 `&` 拆分后判断源是否已存在,避免同一源重复添加
- MERGE_SOURCE_PAIRS 保留同一源参与不同合并组的能力,仅检查暂存区重复
- 将禁用状态检查提前至 addSelectedTag,防止无效添加
- 新增单元测试覆盖拆分逻辑和重复源防护
2026-08-11 00:18:37 +08:00
huangxd- b811f8fd17 feat(match): 支持自动匹配映射表规则 (#430)
* feat(favorite): 重构收藏匹配逻辑,为搜索场景独立实现解析函数

- 将原 `resolveFavoriteForKeyword` 重命名为 `resolveFavoriteForSearchKeyword`,专门用于搜索场景的收藏命中判断
- 新增 `resolveFavoriteForSearchKeyword` 实现精确标题匹配,避免短关键词误复用更长标题的收藏结果
- 更新所有调用点(缓存有效性、搜索接口、匹配接口)使用新函数
- 版本号升级至 v1.20.5

此变更解决了因关键词长度差异导致收藏缓存错误命中其他剧集的问题,确保搜索缓存和收藏优先级判断更准确。

* feat(ui): 将弹幕测试设为接口调试页面的默认标签页

交换了顶部标签按钮的顺序,并将对应的内容区域设为激活状态,使页面加载时默认显示弹幕测试功能,提升测试场景的使用便捷性。

* feat(match): 支持自动匹配映射表规则,可跨季映射并指定平台/结果优先级

- 新增 `AUTO_MATCH_MAPPING_TABLE` 环境变量,支持开放映射(源季递增)和有限范围映射(等长范围),并支持目标结果优选(含年份/类型/平台)
- 更新 README 和 `.env.example` 中的配置说明,明确映射优先级为:当前源季手动偏好 > 本映射表 > `TITLE_MAPPING_TABLE` > 普通匹配
- 优化 `REMEMBER_LAST_SELECT` 描述,澄清仅记录明确手动选择,自动匹配后直接返回不会写入偏好

* feat: 预览数组值显示为逗号分隔字符串

在预览界面中,当数据字段为数组类型时,原先会进入对象处理逻辑导致显示不友好。
现增加对数组类型的单独处理,将其转换为逗号分隔的字符串,提升预览可读性。

* fix: 修复标签拖拽触摸支持并清理历史脏数据

- 为表单控件添加 touch-action 样式,改善移动端交互体验
- 关闭模态框时主动取消触摸拖拽状态,防止事件残留
- 选中值渲染时对逗号分隔项进行去重,清理历史重复脏数据
- 重构标签元素获取逻辑,统一排除拖拽幽灵元素
- 为待选标签添加 touchcancel 事件处理,完善触摸拖拽生命周期
- 实现基于坐标的选中标签拖拽目标检测,提升拖拽定位准确性
- 拖拽结束后清空内部引用,避免内存泄漏
2026-08-09 12:23:03 +08:00
Elegy233 8ff78add1e feat(ui): 管理界面视觉重构,采用 Bangumi-syncer 柔和圆角设计风格 (#423)
* feat(ui): 管理界面视觉重构,采用 Bangumi-syncer 柔和圆角设计风格

整体参照 Bangumi-syncer 的前端设计系统,对 danmu_api 管理面板进行全量 UI 重构。

核心改动:
- 主题系统:8种强调色(shinyo新叶/sakura哔哩/tianyi天依/hatsune初音/sakuragi樱木/violet罗兰/amber LCL/lavender经典) + 独立明暗切换(data-color-scheme)
- 视觉语言:大圆角(16~24px)、多层浅阴影、胶囊形输入框(999px)、渐变按钮、cubic-bezier缓动
- Header 氛围:header弹幕彩色透明文字(词库~80条) + 背景弹幕全屏滚动 + 微光扫过(GPU加速)
- Header 玻璃模糊:nav-btn/badge 等低透明度元素叠加 backdrop-filter,弹幕穿过时可见模糊
- 明暗切换:右上角折角视觉 + 角标按钮,独立持久化
- 全 section 错峰 fade-up 入场,modal 毛玻璃遮罩(backdrop-filter) + enter/exit 动画
- prefers-reduced-motion 全量关闭动画
- 响应式:1200/992/768/480px 四断点,移动端 nav-btn 3 列 + content 14px 圆角容器
- 预览页:总览按钮常驻,点击顶级 Tab 返回总览,子分类选中态悬浮卡片效果
- 弹窗:scrollbar-gutter 稳定布局,弹窗内列表 bullet 与文字对齐
- slider:胶囊形轨道(::-webkit-slider-runnable-track) + 圆形 thumb
- 版本标识:最新版本可点击跳转 Telegram 更新通知频道
- 弹幕系统:DANMAKU_DICT 共享词库约80条(18位 GitHub 贡献者 @ID + 热门梗 + 公益提示),0.5~1.5s 发射(共享 DANMAKU_INTERVAL_MS),animationend 自动释放 DOM
- 底栏:项目声明 + 链接栏(GitHub/讨论组/频道/RSS/Forward 插件)
- README:特别感谢 Bangumi-syncer 提供的 UI 灵感
- 主题键 shinyo(新叶绿) 原为 sanae,已全量同步至前后端

性能:
- 所有动效使用 transform/opacity(GPU 加速),无 left/top 触发布局
- 弹幕元素生命周期:创建→动画结束/超时→remove,自动回收

已知问题:
- 暗浅色折角(.corner-fold)无法应用 backdrop-filter 模糊,受限于浏览器渲染管线(clip-path 在合成阶段未完全裁剪 backdrop-filter 采样区域)
- 界面主题(theme-settings)在 section 切换时无法触发通用入场动画,因该元素初始 hidden 使 CSS animation 错过触发时机

* fix(ui): 批量颜色输入框 textarea 使用直角圆角替代胶囊形

* fix(ui): 弹窗全局模糊右侧白条与内部滚动条刺破圆角

- html 添加 scrollbar-gutter:stable + background,弹窗隐藏滚轨时保留占位
  并填充遮罩同色 background,消除右侧白条
- html.modal-open 设置 overflow-y:hidden + 深色 background,隐藏滚轨
- ::-webkit-scrollbar 全局主题色渐变(10px),弹窗内单独覆盖为 6px 薄滚动条
  配合 margin:24px 0 避免刺破 20px border-radius
- 背景弹幕挂载点从 documentElement 移至 body,避免被 html overflow:hidden 裁剪

* fix(ui): 弹窗 gutter 背景色按暗浅色模式适配

浅色: rgba(0,0,0,0.58)  暗色: rgba(0,0,0,0.95)
通过 :has(body[data-color-scheme]) 跟随主题切换

* feat(ui): Dark Reader 防御适配与系统深浅色跟随

- 模板注入 darkreader-lock meta 阻断第三方暗色扩展注入
- :root 声明 color-scheme: light dark 告知浏览器原生双模式支持
- 首次无存储偏好时读取 prefers-color-scheme 跟随系统主题
- matchMedia change 事件监听系统主题实时变更(仅在用户未手动选择时生效)

* fix(ui): 合并规则关系按钮对齐与映射详情可读性

- 修复 merge-action select 与左右输入框底部对齐(hint 移入 label 内)
- 映射详情容器 padding-left 46→12px,行字号 12→13px
- 映射行新增斑马条纹与圆角
- .btn:hover 统一添加 translateY(-1px) 抬起效果

* fix(ui): 标签选项、暂存标签、合并模式切换、颜色池色块新增 hover 抬起效果

* fix(ui): 合并确认按钮 hover 闪烁 — Chrome 过渡合成循环

.confirm-merge-btn 28px 圆形按钮 margin-left:auto 在 flex 容器内
hover 时 transition:all 触发 background-color/box-shadow/transform
无限循环过渡。窄化为 box-shadow/filter/transform 三项显式声明
并加 !important 阻断 Chrome 自动注入合成属性。

* fix(ui): 审计修复 — 滚动条架构、gutter 色差、滑块统一、代码风格

- 删除 base.css.js 全局 ::-webkit-scrollbar(10px),保留 themes.css.js(8px)
- html 添加 color-scheme:light !important 修复 :root 声明导致 gutter 画布色偏差
- gutter rgba 0.58→0.59 微调匹配 blurred 背景色
- COLOR_POOL 亮度滑轨复用 .number-range 胶囊样式
- DANMAKU_INTERVAL_MS var→const 风格统一
2026-08-08 21:34:07 +08:00
Elegy233 c0788c43f8 fix(envs): resolveEpisodeTitleFilter吐槽添加反向否定,避免误杀正常剧集标题 (#422)
吐槽添加负向断言防止匹配以下正常标题:
- 本喵比起装傻更适合吐槽(前接能力/比较词)
- 吐槽艺人/吐槽役/吐槽大会/吐槽担当(后接角色/事件词)

同步更新.env.example和README.md中的对应正则。
2026-08-08 21:33:42 +08:00
Elegy233 463c14708a chore: 动画源dandan/bahamut/animeko排序置后,引导合理合并配置 (#418)
ALLOWED_PLATFORMS/ALLOWED_SOURCES/MERGE_ALLOWED_SOURCES
中将dandan/bahamut/animeko移至custom之前,同步更新
README.md和.env.example的对应排序。
2026-08-08 21:32:01 +08:00
huangxd- 5f17c51110 feat: 新增弹幕缓存最少条数配置,低于该值自动刷新 (#425)
* feat(cache): 新增弹幕缓存最少条数配置,低于该值自动刷新

- 增加 COMMENT_CACHE_MIN_COUNT 环境变量,默认100条,设为0可关闭
- 更新 README、.env.example 和 envs.js 配置定义
- 在缓存校验逻辑中,若缓存弹幕数低于阈值则忽略缓存时间重新获取
- 同步更新 UI 预览面板中的缓存相关配置项

* chore: bump version to 1.20.4

- 更新全局版本号从 1.20.3 至 1.20.4,以标记新迭代版本。

* refactor(ui): 重构环境变量编辑模态框的只读字段与状态管理

- 新增 `.readonly-field` 样式,用于在编辑模式下以虚线边框和灰色背景展示只读配置值
- 引入 `editingKeyName` 和 `editingType` 变量替代直接 DOM 读取,统一编辑状态管理
- 抽取 `getEnvTypeLabel` 工具函数,消除多处重复的类型标签逻辑
- 编辑时禁用分类、键名、类型等字段,避免误操作,同时保留文本可选择复制
- 关闭模态框时重置编辑状态,确保下次打开使用正确上下文
- 修改 `renderValueInput` 和 `updateTagStates` 等函数,使其依赖内存变量而非 DOM 元素,提升可维护性和可靠性
2026-08-08 21:31:12 +08:00
huangxd- d0ce3b92d5 feat: 支持反向代理HTTPS协议配置,生成正确的对外链接 (#416)
- 新增环境变量 `DANMU_API_PUBLIC_PROTO` 用于指定对外协议
- 请求处理时优先读取 `X-Forwarded-Proto` 头,无则回退至配置变量
- 修复反向代理环境下弹幕链接协议错误的问题
2026-08-02 08:54:55 +08:00
Elegy233 825ddc25bb fix: 修复严格匹配下记住手动选择结果功能失效及匹配遍历过早终止 (#401)
* fix: matchAniAndEp 移除对非优先条目的独占过滤,保留评分优先

原代码通过 preferAnimeId 直接 continue 跳过所有不匹配的优先条目,
其意图是确保优先条目被命中。但该过滤存在两个问题:

1. 与 isPreferredAnime 的 +9999 评分加成功能重复——评分已提供
   压倒性优先权,独占过滤属于冗余保护。
2. 独占过滤阻止了优先源缺失目标集时的自然回退:其他源被
   跳过导致无匹配,需要额外走 fallbackMatchAniAndEp 兜底。

移除独占过滤后,isPreferredAnime 的 +9999 评分加成和匹配后的
break 仍然确保优先条目在正常匹配中绝对优先,同时允许优先源
无目标集时自然回退到其他可用源。

* fix: TITLE_NOISE_FILTER 默认规则增加方括号杂音词支持

默认 TITLE_NOISE_FILTER 仅匹配圆括号内的杂音词(如(日配)、(国配)),
遗漏方括号形式的变种(如[日语版]、[国语版]、[中字])。
tencent 源的标题格式"假面骑士ZZZ[日语版](2025)"中[日语版]未被清理,
导致 titleMatches 在严格匹配下的标题清理不完整。

修复:默认规则扩展为单字符类同时匹配圆括号(中英文)和方括号,
在原有词表基础上新增方括号特供词:日语版、国语版、英语版、中字。
圆括号兼容保持不变。

* fix: 偏好记录流程的titleMatches强制使用非严格匹配,不因STRICT_TITLE_MATCH受影响

titleMatches 在全局 STRICT_TITLE_MATCH 开启时统一走 strictTitleMatch,
但偏好记录(setPreferByAnimeId)场景应始终使用非严格匹配。原因:

1. 用户手动选择某个源的弹幕即表示"我认可这是正确匹配",
   不应因标题含[日语版]等形式差异而被拒。
2. strictTitleMatch 限制 suffix 只能为 seasonPattern 中的模式,
   而(2025)、[日语版]等源补充标识均不符合,导致有意义的用户选择被丢弃。
3. "记住手动选择结果"强调自由选择权,严格匹配的搜索过滤逻辑不适用于此。

修复:titleMatches 增加 forceNonStrict 参数(默认false,完全向后兼容),
偏好记录流程传入 true,跳过 strictTitleMatch 直接走包含匹配(includes)。

* fix: matchAniAndEp 无平台偏好时 break 应感知 preferAnimeId,防止跳过优先条目

第1435行 if(!platform || isPreferredAnime) break 在 platform 为空时
无条件跳出循环,导致即使 preferAnimeId 指向靠后的条目,
循环也会在第一个匹配条目后终止,优先条目从未被评估。

修复:break 仅在两种场景触发:
1. isPreferredAnime=true — 已命中优先条目,无需继续
2. !platform && !preferAnimeId — 无平台偏好且无优先条目,首个匹配即可
当 preferAnimeId 存在但尚未命中时,继续循环评估后续条目。
2026-07-29 22:37:17 +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
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 ad303b1b8e feat(animeko): 详情接口迁移至 Animeko V2 API 并新增 animeko@ 代理反代支持 (#330)
- animeko.js:
  1. 详情与关联接口全面迁移至 Animeko V2 API (/v2/subjects),并新增 animeko API 隔离逻辑(API请求不走代理,符合预期)。
  2. 为 Bangumi API 搜索接口新增 animeko@ 代理/反代支持。
  3. 完整集成 4 个 Animeko 备用域名,根据部署时区(UTC+8/其他)动态反转分配节点的轮询优先级。
  4. 新增模块级短效缓存 (3分钟 / 100条限制),消除在“关系检测”与“剧集获取”跨方法调用时产生的重复接口请求。
  5. 修复 _extractRelations 方法中因原始接口 ID 数组与 Name 数组长度不对齐导致的潜在数据错位问题,改为纯 ID 校验提取。
  6. 为 API 降级轮询机制显式注入 3000ms 超时控制,加速不可用节点的故障跳过。

- globals.js:
  新增 animeko@ 代理/反代规则的解析与支持,配合 animeko.js 实现按需代理。

- http-util.js:
  使 httpGet 与 httpGetWithStreamCheck 支持接收 options.timeout 参数,提供单次请求维度的自定义超时配置能力。

- README.md & config/.env.example:
  添加 Animeko 代理及反代的配置说明与使用文档。
2026-05-31 12:54:27 +08:00
huangxd- ca05231b51 SOURCE_ORDER 默认源排序修改为douban,360,renren,hanjutv 2026-05-31 12:51:36 +08:00
Elegy233 d894ccdd3d perf(match): 为 match 接口支持跨季集数顺延匹配,提高匹配成功率;新增 CUSTOM_MERGE_RULES 环境变量,用于自定义源合并行为 (#310)
* perf(api): 将数据源处理逻辑提取为公共函数,加入'跨季集数顺延映射'功能提高 match 接口匹配成功率

* feat(utils): 等价重组合并工具,使用12层清晰分层并补全所有函数必要注释,降低维护难度

我是超级重构大师()这一次真的好起来了结构清晰多了()

* perf(envs): 新增合并映射表('CUSTOM_MERGE_RULES')变量与解析函数

* feat(utils): 使合并工具支持合并映射表

* feat(ui): 新增CUSTOM_MERGE_RULES 合并映射表 专用编辑界面

* feat(env): 新增合并映射表配置说明

* feat(md): 新增合并映射表配置说明
2026-05-18 23:02:08 +08:00
049e412748 Hugging配备ui管理 (#288)
* Create sync.yml

* Update README.md

* Add Hugging Face Spaces deployment support

* Update sync.yml

* Update README.md

* Update Dockerfile

* Update README.md

* Update README.md

* Update Dockerfile

* Rename sync.yml to sync_hf.yml

* Update README.md

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: huangxd- <649924757@qq.com>
2026-04-30 22:51:36 +08:00
Elegy233 01fd9e15aa 集成 bangumi-data 项目,开启后提升动画源的检索与匹配速度并解锁隐藏/区域番剧 (#283)
* envs.js:新增 Bangumi Data 加速匹配开关 与 Bangumi Data 缓存有效期 配置

* 新增 Bangumi Data 管理工具,用于下载与管理Bangumi Data数据

感谢 https://github.com/bangumi-data/bangumi-data

* worker.js:参加Bangumi Data 辅助函数用于判断数据更新

* server.js:配合清理 Bangumi Data 关闭时占用的内存

* tmdb-util.js:Bangumi Data 开启时调用它大幅提升获取日语原名速度

实现获取动画日语原名零请求

* animeko.js:Bangumi Data 开启时调用它,节省一次搜索请求

已知问题:缺失imageUrl,问题不大

* bahamut.js:Bangumi Data 开启时调用它,补全别名与类型

Bangumi Data 给的是acg_sn,预期需要是video_sn,因此无法直接应用
https://github.com/bangumi-data/bangumi-data/issues/336

* bilibili.js:Bangumi Data 开启时调用它,补全缺失的隐藏结果与区域结果

实现港澳台番剧与隐藏番剧自由,例如《笨拙之极的上野》

* dandan.js:Bangumi Data 开启时调用它,节省一次搜索请求

弹弹其实当务之急是怎么节省详情接口的请求… 多结果风控错误概率大

* common-util.js:为标题匹配的相似度策略加入一定阻断

防止纯英文搜索时因相似度打乱字符匹配大量结果被放行

* .env.example:更新 Bangumi Data 相关变量

* README.md:更新 Bangumi Data 相关说明

* Enhance comments for USE_BANGUMI_DATA in .env.example

Updated comments to clarify the functionality of USE_BANGUMI_DATA.

* Enhance USE_BANGUMI_DATA description

Updated the description for USE_BANGUMI_DATA to include unlocking hidden/region-specific anime.

* README.md:补全目录

* bangumi-data-util.js:纯内存加载时使用原生 fetch ,并声明压缩头

* bangumi-data-util.js:增加云部署纯内存运行提示

* bangumi-data-util.js:更新配音版本正则

* merge-util.js:标准化正则

* tmdb-util.js:标准化正则

* animeko.js:标准化正则

* README.md:补充文件目录

* bangumi-data-util.js:修复CF部署下载请求被切断导致堵塞

Added download lock mechanism to prevent deadlocks in serverless environments and implemented a timeout for download operations.

* worker.js:透传ctx

* bangumi-data-util.js:调用 ctx.waitUntil 延长 Serverless 生命周期

* bilibili.js:补全md号解析链路

Add handling for media IDs starting with 'md' to fetch episodes.

* server.js:异步初始化 Bangumi Data 缓存,消除首个真实请求遭遇冷启动的等待延迟

* bangumi-data-util.js:双节点同时竞速下载数据,提升下载可用性与速度
2026-04-26 15:26:02 +08:00
dyphire 77ecdcf233 跟随弹弹上游 API 变动废弃 related 相关接口功能 (#274) 2026-04-11 13:56:01 +08:00
huangxd- 3495835e7c 新增弹幕时间偏移功能以及环境变量DOUBAN_COOKIE (#276)
* 弹幕偏移支持百分比模式

* 修复偏移配置保存之后不显示源选择的问题

* 增加豆瓣cookie环境变量
2026-04-11 13:55:39 +08:00
Elegy233 59533acfc9 使 match 接口匹配时检查源传入的别名,并优化别名替换相关逻辑 (#271)
* dandan-api.js:使 match 接口匹配时检查别名

* dandan.js:彻底删除内部api别名替换逻辑,因为别名已经传给需要的工具

* tmdb-util.js:全面优化tmdb智能标题替换逻辑

优先选择与用户传入的关键词相同的别名(https://github.com/huangxd-/danmu_api/pull/270 的拓展)

* envs.js:更新集过滤正则与aliases ai提示

* .env.example:更新集过滤正则

* Update README.md
2026-04-03 22:00:20 +08:00
huangxd- f7fc36f384 更新小版本号 2026-03-30 22:23:12 +08:00
huangxd- ae4f20c9c9 增加爱壹帆源 (#262)
* 增加爱壹帆源

* 修复爱壹帆源自动匹配
2026-03-29 23:53:14 +08:00
Wo254992andClaude Opus 4.6 b267db281d 新增自定义颜色池功能,CONVERT_COLOR为color时支持自定义颜色 (#243)
- 新增 COLOR_POOL 环境变量,支持自定义弹幕随机颜色池
- 前端新增色轮选色器、随机添加、批量添加弹窗(支持十进制和#hex格式)
- 颜色池样式提取到 components.css.js,JS 中仅保留动态样式
- 不配置时使用默认颜色池,行为与原来一致
- 同步更新 forward-widget、README、.env.example

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 22:39:27 +08:00
Celestials316 faa570273f DANMU_OFFSET 支持按来源指定弹幕偏移,重构偏移系统为独立模块,配置界面增加快速添加规则,修复模态框滚动问题 (#241)
* DANMU_OFFSET 支持按来源指定偏移,配置界面增加快速添加规则,修复模态框滚动问题

- DANMU_OFFSET 扩展 @来源 语法,支持针对特定弹幕来源单独设置偏移量
- 查找优先级:带来源规则优先,fallback 到通用规则,层级从集->季->剧名逐级回退
- 配置界面增加"添加规则"按钮,展开快速配置面板(剧名/季/集/来源/偏移秒数)
- 来源列表从后端 ALLOWED_SOURCES 动态加载,支持多选
- 修复所有变量编辑模态框内容过长时顶部无法滚动的问题

* 更新文档:DANMU_OFFSET 补充 @来源 语法说明

- README 功能介绍和环境变量表格补充来源指定格式
- .env.example 补充来源语法注释和示例

* 重构弹幕偏移系统:独立 offset-util 模块,支持合并源按来源分别偏移

- 新建 offset-util.js,集中偏移逻辑(解析/匹配/应用)
- parseOffsetRules 启动时解析一次,缓存到 globals.danmuOffsetRules
- resolveOffset 支持多级路径匹配(集>季>剧)、来源特定/all通配/通用规则优先级
- applyOffset 兼容 p/t/progress/timepoint 多种时间字段格式
- 支持来源别名映射(tencent→qq, iqiyi→qiyi, bilibili→bilibili1)
- 合并源流程:对齐后、合并前按来源分别应用偏移
- 单源流程:convertToDanmakuJson 前应用偏移
- 删除 danmu-util.js 中旧的 parseOffset/getOffset/applyDanmuOffset

* 优化偏移配置界面:inline styles 提取到 CSS,来源标签选中状态改用 class 控制
2026-03-18 23:38:31 +08:00
huangxd- 410ff59d61 修改弹幕时间偏移配置说明 2026-03-18 00:32:56 +08:00
huangxd- c5b7221997 新增记住手动选择结果功能新增支持记住集episode/弹幕时间偏移配置/IP黑名单列表配置 (#231)
* 记住手动选择结果功能新增支持记住集episode,下次自动匹配时会对集进行偏移

* 更新README

* 新增IP黑名单列表配置,通过环境变量IP_BLACKLIST配置

* 增加上次匹配剧标题和本次弹幕获取据标题的匹配,防止两者不对应

* 新增弹幕时间偏移配置

* 补充forward插件相关配置

* 增加打印日志

* 修复findIndexById方法没有引用的问题

* 优化lastSelectMap,支持存储不同季

* 优化extractSeasonNumberFromAnimeTitle中尾部阿拉伯数字(如"某某 2" 或 "某某2",但不超过2位)

* 再次优化尾部阿拉伯数字问题
2026-03-15 12:57:32 +08:00
Elegy233 a656308fc2 增加弹弹第三方弹幕源实时拉取功能,用于覆盖掉弹弹服务器内缓存的旧弹幕 (#220)
* dandan.js:增加related接口,实现拉取绑定的第三方数据源

同时传出related接口的偏移值和绑定链接给合并工具的跨源时间轴对齐使用

* dandan-api.js:挂载dandan源传出的相关参数,同时更新源标签的标记方式

* merge-util.js:接收来自dandan源准确的偏移值和链接信息,替换掉低精度计算

* danmu-util.js:基于准确的源标签做更加完美的相关处理

* envs.js:增加弹弹第三方数据源实时拉取开关,默认开启

* systemsettings.js:增加一个默认值为true的变量保持开启状态

* .env.example:增加弹弹第三方数据源实时拉取开关说明

* Add REAL_TIME_PULL_DANDAN option to README

* .env.example:统一弹弹第三方数据源实时拉取说明

* .env.example:将第三方数据源统称为第三方弹幕源

* envs.js:将第三方数据源统称为第三方弹幕源

* README.md:将第三方数据源统称为第三方弹幕源

* merge-util.js:去除已经没有使用的旧函数

* systemsettings.js:REAL_TIME_PULL_DANDAN不再保持true

* dandan.js:related接口根据开关动态请求

只在REAL_TIME_PULL_DANDAN实时拉取开启状态或者启用了MERGE_SOURCE_PAIRS合并功能才请求

* envs.js:实时拉取默认设置为关闭

* .env.example:实时拉取默认设置为关闭

* README.md:实时拉取默认设置为关闭
2026-03-04 22:40:15 +08:00
huangxd- 10b2ca89ae 支持本地redis缓存配置 (#213)
* 弹幕点赞数改成镂空♡显示,数量使用下标数字,并增加环境变量LIKE_SWITCH开关该功能,默认开启

* 增加hanjutv日志打印

* 修改说明

* 支持本地redis缓存配置

* 增加render环境的判断

* Revert "增加render环境的判断"

This reverts commit 952257895a2705debf079485c8558969b46f986a.

* 修改注释

* 修复cloudflare不支持redis包安装的问题

* 修复cloudflare不支持redis包安装的问题
2026-03-01 13:46:28 +08:00
huangxd- 0153ebc929 增加埋堆堆源并增加ai匹配 (#197)
* 增加埋堆堆源

* match自动匹配接口系只能ai匹配功能,需根据自身使用模型配置AI_BASE_URL/AI_MODEL/AI_API_KEY/AI_MATCH_PROMPT四个环境变量

* 增加ai连通性测试按钮

* 优化ai match自动匹配

* hanjutv增加弹幕点赞数显示
2026-02-23 22:27:27 +08:00
huangxd- 6b7588d18e 环境变量ENABLE_EPISODE_FILTER更名为ENABLE_ANIME_EPISODE_FILTER,同时修复ENABLE_EPISODE_FILTER开启的情况下搜索接口返回500的问题 (#191)
* 修复ENABLE_EPISODE_FILTER开启的情况下搜索接口返回500的问题

* 环境变量ENABLE_EPISODE_FILTER更名为ENABLE_ANIME_EPISODE_FILTER
2026-02-13 22:59:35 +08:00
huangxd- 6ea819744c 添加剧名过滤规则环境便来给你ANIME_TITLE_FILTER,用于按正则表达式对剧名进行过滤,适用于过滤一些不需要的剧集 (#190)
* 添加剧名过滤规则环境便来给你ANIME_TITLE_FILTER,用于按正则表达式对剧名进行过滤,适用于过滤一些不需要的剧集,需开启ENABLE_EPISODE_FILTER

* fw插件如果启用了搜索关键字繁转简,则进行转换
2026-02-12 21:30:01 +08:00
huangxd- a6a0babd22 增加环境变量ANIME_TITLE_SIMPLIFIED,在搜索时将繁体剧名标题自动转换为简体,适用于繁体标题搜索 (#187)
* 修复搜索到的标题中带有括号导致自动匹配季不正确的问题

* 增加环境变量ANIME_TITLE_SIMPLIFIED,在搜索时将繁体剧名标题自动转换为简体,适用于繁体标题搜索,默认值:false(不转换)

* 接口调试ui界面上的/api/v2/search/episodes接口增加episode,用于指定集
2026-02-09 23:22:24 +08:00
zcw199604 495665dd8d feat(server): 支持 DANMU_API_PORT 配置主端口 (#185) 2026-02-08 23:17:20 +08:00
huangxd- 2ad2d5fa1a 支持咪咕源并增加请求记录标签页 (#186)
* 增加咪咕源

* 完善咪咕源,包括从豆瓣源获取咪咕弹幕

* 修改弹幕源简介

* EPISODE_TITLE_FILTER环境变量不再应用于剧标题过滤,只对集标题生效

* 增加处理简繁同源场景,比如吃->喫;注意->註意,实际不用转换

* 增加请求历史记录

* 增加请求记录ui界面

* 删除清空记录按钮

* 将请求记录的参数改为请求body体

* 对record.interface进行解码

* 请求参数为空的清空下不显示请求体

* 在没有请求体的情况下虚线也不显示

* 增加todayReqNum全局变量,用于记录今日请求数量

* 在UI界面显示今日请求总数

* 修改README

* 修复云部署的服务配置redis后请求记录还是0的问题
2026-02-08 23:16:26 +08:00
Elegy233 1c1207ae14 合并功能支持填写单源表示合并后仍保留原结果,忽略来自hanjutv的年份因为不准确 (#181)
* envs.js:合并解析支持解析单个源

* merge-util.js:支持填写单源表示合并后仍保留原结果,忽略来自hanjutv的年份因为不准确

* .env.example:更新合并说明

* README.md:更新合并说明

* envs.js:更新合并说明

* common-util.js:引入简易的相似度匹配,解决动画翻译细微不同导致的被过滤

解决使用“相反的你和我”搜索B站获取不到“正相反的你与我”,动画还是事太多了()
2026-02-04 18:11:42 +08:00
Elegy233 e84b3b01df 实现合并源功能的智能结果合并,适配自动匹配优选配置和前端使用 (#167)
* envs.js:为平台排序支持合并源

同时更改MERGE_SOURCE_PAIRS为multi-select,为后续前端更新做准备

* dandan-api.js:更新平台排序相关函数,更改排序配置决定函数适配复杂的合并源场景

应该大概没有删减什么,新的决定函数是命中计数权重算法

* merge-util.js:合并逻辑增加主源轮替功能,实现结果智能合并,不再硬性要求主源

a&b&c&d合并,a无结果拿b、c、d对比合并,b无结果拿c、d……

* components.css.js:增加合并模式相关样式

* systemsettings.js:增加multi-select合并模式相关逻辑

* README.md:更新源合并配置说明

* .env.example:更新源合并相关说明

* animeko.js:增加自动降级服务器地址

* animeko.js:降低相似度阈值到0.6(撤回更改)

* animeko.js:支持剧集翻页、过滤结果前先清洗文本

* merge-util.js:健壮对比函数

1.修复“犬夜叉 超越时代的思念”意外与“犬夜叉”匹配,新增主副标题的结构检测。
2.修复"犬夜叉 超越时代的思念(2001)【动漫】from youku",不能与"犬夜叉 穿越时代的思念(2001)【剧场版】from dandan"匹配,新增主副标题如果匹配上可以无视剧场版标识冲突。
3.新增验证合并覆盖率是否合规,如果成功合并集远远小于总集则视为异常驳回关联。
让我看看还有什么问题.jpg

* animeko.js:得利于清洗文本,过滤使用的相似度阀值可以提高到0.9

* bilibili.js:条目原名也扔给common-util工具对比(修复使用条目原名搜索出来的结果会被过滤掉)

话说我在做animeko源的时候完全忘了有这个工具… 改天重构调用一下吧

* animeko.js:修复清洗文本太极端的问题

* merge-util.js:调整主副标题结构冲突为扣分而不是抛弃,合并覆盖率验证豁免animeko

没想到意外这么快来,"判处勇者刑(2026)【动漫】from bilibili" 与 "判处勇者刑 惩罚勇者9004队刑务纪录(2026)【TV动画】from animeko" 只是翻译问题但是因为主副标题冲突被禁止合并了,然后因为animeko通常包含未放送集数(并且无法获取状态)所以需要豁免合并覆盖率

* README.md:手动同步上游

* merge-util.js:增加季度信息的统一映射

震惊之前竟然没做

* animeko.js:还原更改,挪到新的PR专项优化

* bilibili.js:还原更改,挪到新的PR专项优化

* merge-util.js:全方面优化,支持未匹配上的集也返回

燃尽了,有一点点堆成屎山了之后再重构吧先把逻辑全部做出来确保准确率()感谢“间谍过家家”这个番,几乎全平台有,发现了大量平台差异与季度差异

* merge-util.js:优化集提取正则

* dandan-api.js:修复当评分相同时后遍历到的结果会无条件覆盖先遍历到的结果

* dandan-api.js:去除没匹上就跳过检查集

* dandan-api.js:重新实现,同步修复季匹配错误问题函数

* merge-util.js:支持字母后缀的季度差分,例如小林家的龙女仆S、某科学的超电磁炮S、某科学的超电磁炮T
2026-01-31 22:50:36 +08:00
Celestials316 823e2bc521 修复:替换 Unicode 属性正则以兼容更广泛的 Node.js 版本,优化EPISODE_TITLE_FILTER环境变量相关 (#173)
* Update animeko.js

* Update animeko.js

* 修复config/.env.example 文件内EPISODE_TITLE_FILTER环境变量没有更新的问题

* Update envs.js

* Update .env.example
2026-01-29 23:49:32 +08:00
huangxd- 6ca1398563 合并弹幕颜色环境变量和繁简字体转换环境变量 (#172)
* 删除CONVERT_COLOR_TO_WHITE环境变量,合并保留CONVERT_COLOR

* 删除环境变量DANMU_SIMPLIFIED和DANMU_TRADITIONAL,合并为DANMU_SIMPLIFIED_TRADITIONAL,弹幕简繁体转换设置:default(默认不转换)、simplified(繁转简)、traditional(简转繁)
2026-01-29 00:19:21 +08:00
huangxd- 4fd7ccf412 增加简体转繁体开关 (#169)
* 增加简体转繁体开关

* 修改readme和小版本号

* 修改readme

* 修改缩进问题
2026-01-27 23:39:31 +08:00
huangxd- 90b15f5379 新增西瓜视频源 (#168)
* 暂时增加xigua源

* 更新xigua源

* 完成西瓜视频的搜索

* 增加西瓜视频源

* 删除西瓜视频test文件
2026-01-26 23:58:48 +08:00
Elegy233 2ea441b55c 允许源合并配置多个副源与主源合并,健壮合并工具对比函数 (#160)
* envs.js:支持解析多个合并副源

* merge-util.js:支持合并多个副源、健壮对比函数

* danmu-util.js:对合并源场景智能去重

解决dandan&bahamut等类似场景下,因为dandan本身聚合了bahamut旧弹幕数据,导致弹幕处理后全屏的无效“×2”

* animeko.js:提高结果过滤阀值,针对多季场景智能返回结果

解决用户搜索“葬送的芙莉莲 第二季”/“葬送的芙莉莲 S2E1”会返回不必要的其他季结果

* README.md:更新合并说明

* .env.example:更新合并说明

* README.md:微调合并说明

* globals.js:更新版本号为1.12.4
2026-01-22 22:50:32 +08:00
huangxd- 3fe044bcb7 添加乐视源 (#155) 2026-01-17 00:03:37 +08:00
Elegy233 937532dfa9 增加Animeko源,增加源合并功能 (#152)
* 新增源合并处理工具

非常多的优化,使不同源的合并进入高可用状态(主要还是动画这块,译名不同和集不一样太多了,动画怎会如此折腾)

* 新增Animeko源

感谢188的鼎力相助感谢Animeko,开源伟大!

* 新增MERGE_SOURCE_PAIRS环境变量并增加相关解析,新增允许animeko源

* 兼容新的源合并相关请求,修复b23.tv相关处理缺少httpGet引用

* 更新文档

* 更新env

* 将源合并从匹配配置挪到源配置

* 更新版本号为1.12.0

* 更新获取弹幕函数,使其更加符合整体规范

* 增加Animeko测试例
2026-01-14 18:24:40 +08:00
huangxd- 53e81421a3 删除config.yaml配置支持,后续只支持.env配置文件 2026-01-11 23:10:01 +08:00