Files
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

499 lines
27 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 弹幕 API 环境变量配置示例
# 复制此文件为 .env 并根据需要修改配置
#
# 配置方式说明:
# 本项目支持三种配置方式,优先级从高到低:
# 1. 系统环境变量(最高优先级)
# 2. .env 文件(低优先级)
#
# 热更新说明:
# - Docker 环境:修改宿主机的 .env 文件后,容器会自动检测并重新加载配置(无需重启容器)
# - Node.js 本地环境:修改 .env 文件后,应用会自动检测并重新加载配置(无需重启应用)
# - Cloudflare/Vercel/Netlify/Edgeone/Hugging Face Spaces:需要在平台的环境变量设置中修改,然后重新部署
# ==================== 基础配置 ====================
# API 访问令牌(用于鉴权)
# 默认值:87654321
TOKEN=87654321
# API 服务监听端口
# 默认值:9321
# 说明:本地 Node 服务会优先读取 DANMU_API_PORT;未设置时回退到 9321
# DANMU_API_PORT=9321
# API 对外访问协议(反向代理未传递 X-Forwarded-Proto 时使用)
# 可选值:http、https;默认值:http
# DANMU_API_PUBLIC_PROTO=https
# 系统管理访问令牌(用于系统管理功能)
# 如果未配置此值,则无法访问系统管理功能,需要先配置后在URL中填入此token才能打开系统管理
# 默认值:空(不启用系统管理访问控制)
# ADMIN_TOKEN=
# 收藏写入和管理接口是否必须使用 ADMIN_TOKEN(收藏列表始终可公开读取)
# false:自定义 TOKEN 时必须显式携带 TOKEN 或 ADMIN_TOKEN;TOKEN=87654321 时可省略
# true:无论 TOKEN 是否为默认值,都只能使用 ADMIN_TOKEN
# 默认值:false
FAVORITE_REQUIRE_ADMIN=false
# 本地弹幕上传和删除是否无需 ADMIN 权限
# false:仅 ADMIN_TOKEN 可上传和删除;true:也允许普通 TOKEN 用户上传和删除
# 默认值:false;普通 TOKEN 用户可查看已导入列表
LOCAL_DANMU_NOT_REQUIRE_ADMIN=false
# 其他服务器地址(第三方弹幕服务器)
# 默认值:https://api.danmu.icu
OTHER_SERVER=https://api.danmu.icu
# 自定义弹幕源API地址
# 默认为空,配置后还需在SOURCE_ORDER添加custom源
# CUSTOM_SOURCE_API_URL=
# ==================== VOD 配置 ====================
# VOD 服务器配置(支持多服务器)
# 格式:名称@URL,名称@URL,...
# 示例:VOD_SERVERS=金蝉@https://zy.jinchancaiji.com,789@https://www.caiji.cyou,听风@https://gctf.tfdh.top
# 如果不指定名称,会自动生成 vod-1, vod-2 等名称
# 默认值:金蝉@https://zy.jinchancaiji.com,789@https://www.caiji.cyou,听风@https://gctf.tfdh.top
VOD_SERVERS=金蝉@https://zy.jinchancaiji.com,789@https://www.caiji.cyou,听风@https://gctf.tfdh.top
# VOD 服务器返回模式
# 可选值:all(返回所有站点结果)、fastest(只返回最快的站点结果)
# 默认值:fastest
# 说明:
# - all: 搜索时会并发查询所有配置的 VOD 站点,返回所有结果(结果较多)
# - fastest: 搜索时只返回首先响应成功的 VOD 站点结果(结果较少,避免重复)
VOD_RETURN_MODE=fastest
# VOD 服务器请求超时时间(毫秒)
# 默认值:10000(10秒)
# 建议值:5000-15000
# 说明:防止慢速或失效的采集站阻塞整个搜索过程(单个请求超时)
# 由于 fastest 模式只返回最快响应的站点,可以设置较大的超时时间给慢速站点更多机会
VOD_REQUEST_TIMEOUT=10000
# ==================== Bilibili 配置 ====================
# Bilibili Cookie(用于访问需要登录的内容)
# 默认值:空(不使用 Cookie)
# BILIBILI_COOKIE=
# 豆瓣 Cookie(用于豆瓣相关接口请求,配置后可降低豆瓣接口风控影响,提升搜索/详情获取的稳定性。填写浏览器中已登录豆瓣后的完整 Cookie 字符串即可,格式示例:`bid=xxxx; ll="118282"; ...`。如遇到豆瓣搜索不稳定、返回异常或频繁验证,建议优先补充该变量)
# 默认值:空(不使用 Cookie)
# DOUBAN_COOKIE=
# ==================== 优酷配置 ====================
# 优酷并发数(最大:16)
# 默认值:8
YOUKU_CONCURRENCY=8
# ==================== NipaPlay 中转弹弹play服务端配置 ====================
# 弹弹play账号(dandan 源获取弹幕使用)
# 说明:
# - 与密码同时填写后自动开启,无需额外开关
# - 开启后 dandan 源改由 NipaPlay 中转弹弹play服务端获取弹幕,并把同一请求下发的弹弹关联链接分发给对应平台源实时拉取(需开启对应源),最终弹幕为两者合并去重后的结果
# - 注意:关联链接指向的平台视频若已下架将无法通过自有链路补取;关联含巴哈姆特平台时需确保能够连通巴哈
# DANDANPLAY_ACCOUNT=
# 弹弹play密码(dandan 源获取弹幕使用)
# DANDANPLAY_PASSWORD=
# ==================== 源排序配置 ====================
# 数据源查询顺序(可选值:360, vod, tmdb, douban, tencent, youku, iqiyi, imgo, bilibili, migu, renren, hanjutv, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, dandan, bahamut, animeko, custom, local)
# 默认值:douban,360,renren,hanjutv(不包含 tencent, youku, iqiyi, imgo, bilibili, migu, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, dandan, bahamut, animeko, custom、local 等)
# 如需使用腾讯源、优酷源、爱奇艺源、芒果源、B站源、搜狐源、乐视源、西瓜源、埋堆堆源、爱壹帆源、红果源,请手动添加:SOURCE_ORDER=douban,360,tencent,youku,iqiyi,imgo,bilibili,migu,renren,hanjutv,sohu,leshi,xigua,maiduidui,aiyifan,hongguo
# 如需使用巴哈姆特源,请手动添加:SOURCE_ORDER=douban,360,renren,hanjutv,bahamut
# 如需使用弹弹play源,请手动添加:SOURCE_ORDER=douban,360,renren,hanjutv,dandan
# 如需使用TMDB源,请手动添加:SOURCE_ORDER=douban,360,tmdb,renren,hanjutv
# 如需使用已上传的本地弹幕,请手动添加 local 源,例如:SOURCE_ORDER=local,douban,360
SOURCE_ORDER=douban,360,renren,hanjutv
# ==================== 平台排序配置 ====================
# 平台优先级排序(用于自动匹配)
# 默认值:空(自动匹配)
# 可选值:qiyi, bilibili1, imgo, youku, qq, migu, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, renren, hanjutv, dandan, bahamut, animeko, custom 或 qiyi&bilibili1&imgo,dandan&animeko
# 说明:平台排序配置,可以配置自动匹配时的优选平台,当配置合并平台的时候可以指定期望的合并源
# local 是本地弹幕源,不属于播放平台;如需启用本地弹幕,请在 SOURCE_ORDER 中添加 local
# PLATFORM_ORDER=
# ==================== 源合并配置 ====================
# 数据源合并配置(可选值:tencent, youku, iqiyi, imgo, bilibili, migu, renren, hanjutv, sohu, leshi, xigua, maiduidui, aiyifan, hongguo, dandan, bahamut, animeko)
# 默认值:空
# 说明:配置后将对应源合并同时一起获取弹幕返回,允许多组、允许同时存在、允许多源,允许填单源表示保留原结果,一组中第一个为主源其余为副源,副源往主源合并,主源如果没有结果会轮替下一个作为主源循环
# 格式:源字段&源字段&源字段,源字段
# 示例:MERGE_SOURCE_PAIRS=dandan&bahamut&animeko,renren&hanjutv,renren
# MERGE_SOURCE_PAIRS=
# 合并映射表
# 默认值:空
# 说明:用于自定义源合并行为,实现强制合并源结果或阻断合并源结果。[/S季数] 与 [|路由规则] 为可选项,留空则交由程序判断。多个规则用分号(;)隔开,多段路由用逗号(,)分隔。
# 格式1(合并):副源剧名/S季数@来源 -> 主源剧名/S季数@来源 | E副源集数>E主源集数
# 格式2(阻断):副源剧名@来源 × 主源剧名@来源
# 示例:
# - 常规合并:天气之子@bilibili -> 天气之子@dandan
# - 多集路由:我推的孩子/S01@bahamut -> 我推的孩子/S03@dandan | E25~E35>E25~E35
# - 阻断合并:辉夜大小姐想让我告白?~天才们的恋爱头脑战~(2020)@bilibili × 辉夜大小姐想让我告白~天才们的恋爱头脑战~ OVA(2021)【OVA】@dandan
# CUSTOM_MERGE_RULES=
# ==================== 剧集标题过滤 ====================
# 剧集标题过滤正则表达式(用于过滤花絮、预告等非正片内容)
# 默认值:下方完整规则
# 说明:
# - 如果设置了此环境变量,将完全覆盖默认的过滤规则(不是增量添加)
# - 格式:使用 | 分隔多个关键词,例如:预告|花絮|特辑|番外
# - 可以直接修改下方规则,按需增删关键词
# 示例:只过滤预告和花絮
# EPISODE_TITLE_FILTER=预告|花絮
EPISODE_TITLE_FILTER=(特别|惊喜|纳凉)?企划(?!(书|案|部))|合伙人手记|超前(营业|vlog)?|速览|vlog|(?<!(Chain|Chemical|Nuclear|连锁|化学|核|生化|生理|应激))reaction|(?<!(单))纯享|加更(版|篇)?|抢先(看|版|集|篇)?|(?<!(被|争|谁))抢[先鲜](?!(一步|手|攻|了|告|言|机|话))|抢鲜|预告(?!(函|信|书|犯))|(?<!(死亡|恐怖|灵异|怪谈))花絮(独家)?|(?<!(一|直))直拍|(制作|拍摄|幕后|花絮|未播|独家|演员|导演|主创|杀青|探班|收官|开播|先导|彩蛋|NG|回顾|高光|个人|主创)特辑|(?<!(行动|计划|游戏|任务|危机|神秘|黄金))彩蛋|(?<!(嫌疑人|证人|家属|律师|警方|凶手|死者))专访|(?<!(证人))采访(?!(吸血鬼|鬼))|(正式|角色|先导|概念|首曝|定档|剧情|动画|宣传|主题曲|印象)[\s\.]*[PpPp][VvVv]|(?<!(退居|回归|走向|转战|隐身|藏身|的))幕后(?!(主谋|主使|黑手|真凶|玩家|老板|金主|英雄|功臣|推手|大佬|操纵|交易|策划|博弈|BOSS|真相))(故事|花絮|独家)?|直播(陪看|回顾)|未播(片段)?|衍生(?!(品|物|兽))|番外(?!(地|人))|会员(专享|加长|尊享|专属|版)?|(?<!(鸦|雪|纸|相|照|图|名|大))片花|(?<!(提取|吸收|生命|魔法|修护|美白))精华|看点|速看|解读(?!.*(密文|密码|密电|电报|档案|书信|遗书|碑文|代码|信号|暗号|讯息|谜题|人心|唇语|真相|谜团|梦境))|(?<!(案情|人生|死前|历史|世纪))回顾|影评|解说|(?<!(更|会|能|来|的|比|适合|擅长|比起))吐槽(?!.*(艺人|役|大会|担当))|吐槽(?!.*(艺人|役|大会|担当))|吐槽(?!.*(艺人|役|大会|担当))|吐槽(?!.*(艺人|役|大会|担当))|吐槽(?!.*(艺人|役|大会|担当))|(?<!(年终|季度|库存|资产|物资|财务|收获|战利))盘点|拍摄花絮|制作花絮|幕后花絮|未播花絮|独家花絮|花絮特辑|先导预告|终极预告|正式预告|官方预告|彩蛋片段|删减片段|未播片段|番外彩蛋|精彩片段|精彩看点|精彩集锦|看点解析|看点预告|NG镜头|NG花絮|番外篇|番外特辑|制作特辑|拍摄特辑|幕后特辑|导演特辑|演员特辑|片尾曲|(?<!(生命|生活|情感|爱情|一段|小|意外))插曲|高光回顾|背景音乐|OST|音乐MV|歌曲MV|前季回顾|剧情回顾|往期回顾|内容总结|剧情盘点|精选合集|剪辑合集|混剪视频|独家专访|演员访谈|导演访谈|主创访谈|媒体采访|发布会采访|陪看(记)?|试看版|短剧|精编|(?<!(Love|Disney|One|C|Note|S\d+|\+|&|\s))Plus|独家版|(?<!(导演|加长|周年))特别版(?!(图|画))|短片|(?<!(新闻|紧急|临时|召开|破坏|大闹|澄清|道歉|新品|产品|事故))发布会|解忧局|走心局|火锅局|巅峰时刻|坞里都知道|福持目标坞民|福利(?!(院|会|主义|课))篇|(福利|加更|番外|彩蛋|衍生|特别|收官|游戏|整蛊|日常)篇|独家(?!(记忆|试爱|报道|秘方|占有|宠爱|恩宠))|.{2,}(?<!(市|分|警|总|省|卫|药|政|监|结|大|开|破|布|僵|困|骗|赌|胜|败|定|乱|危|迷|谜|入|搅|设|中|残|平|和|终|变|对|安|做|书|画|察|务|案|通|信|育|商|象|源|业|冰))局(?!(长|座|势|面|部|内|外|中|限|促|气))|(?<!(重症|隔离|实验|心理|审讯|单向|术后))观察室|上班那点事儿|周top|赛段|VLOG|(?<!(大案|要案|刑侦|侦查|破案|档案|风云|历史|战争|探案|自然|人文|科学|医学|地理|宇宙|赛事|世界杯|奥运))全纪录|开播|先导|总宣|展演|集锦|旅行日记|精彩分享|剧情揭秘(?!(者|人))|(?:^|】\s*|\]\s*)(?:[SC]|SP|OP|ED|PV)\d+(?:[\s::\.\-]|$)
# ==================== 屏蔽词配置 ====================
# 屏蔽词列表(用于过滤弹幕内容)
# 默认值:空
# BLOCKED_WORDS=
# ==================== IP 黑名单配置 ====================
# IP 黑名单列表(命中则拒绝请求)
# 默认值:空
# 说明:支持逗号/分号/换行分隔;支持使用 /regex/ 或 /regex/i 形式的正则;支持 IPv4/IPv6 CIDR
# 示例:IP_BLACKLIST=192.168.1.10,10.0.0.0/24,2001:db8::/64,/^203\.0\.113\./
# IP_BLACKLIST=
# ==================== 弹幕去重配置 ====================
# 分钟内合并去重(最大值:30,0 表示不去重)
# 默认值:1
GROUP_MINUTE=1
# ==================== 限制弹幕总数 ====================
# 等间隔采样限制弹幕总数(单位为k,即千:默认 0,表示不限制弹幕数)
# 默认值:0
DANMU_LIMIT=0
# ==================== 弹幕转换配置 ====================
# 是否将顶部和底部弹幕转换为浮动弹幕
# 默认值:false(不转换)
# 说明:启用后,顶部弹幕(ct=5)和底部弹幕(ct=4)会被转换为浮动弹幕(ct=1)
# 可选值:true, false
CONVERT_TOP_BOTTOM_TO_SCROLL=false
# 弹幕转换颜色配置
# 默认值:default(不转换)
# 说明:default 模式不转换,white 模式将所有非白色的弹幕颜色转换为纯白色,color 模式将所有白色弹幕转换为随机颜色(包含白色)
# 可选值:default, white, color
CONVERT_COLOR=default
# 自定义颜色池(CONVERT_COLOR为color时生效)
# 默认值:空(使用内置默认颜色池:白、红、橙、黄、绿、青、蓝、紫、粉)
# 说明:格式为十进制颜色值逗号分隔,例如 16711680 表示红色(即 #FF0000)
# 示例:16711680,65280,255,16776960
COLOR_POOL=
# 渐变色弹幕概率(CONVERT_COLOR为color时生效)
# 默认值:5
# 说明:白色弹幕转换为随机颜色时,按该概率(百分比)改为从渐变色带上取色;颜色随弹幕出现时间平滑流转(60秒循环),相邻弹幕颜色渐变过渡;0 表示关闭
# 可选值:0-100
GRADIENT_CHANCE=0
# 渐变色带(CONVERT_COLOR为color时生效)
# 默认值:空(使用内置默认皮肤 bilibili:B站标准粉蓝 #FB7299→#33B8FF)
# 说明:可直接填皮肤名,或填十进制颜色值逗号分隔(至少2个,相邻颜色平滑过渡)
# 皮肤预设:
# bilibili = 粉→蓝 #FB7299→#33B8FF(B站标准)
# sweet = 粉紫 #FF6B8B→#A259FF(甜美风)
# cyber = 荧光绿→天青 #00FF87→#60EFFF(电竞风)
# sunset = 金橙→珊瑚 #FFA726→#FF5252(日落风)
# ocean = 深海蓝→浅蓝 #2E3192→#1BFFFF(海洋风)
# mint = 薄荷绿 #43E97B→#38F9D7(清新风)
# rainbow = 彩虹七色(红橙黄绿青蓝紫)
# 示例:GRADIENT_COLORS=sweet 或 GRADIENT_COLORS=16711680,16776960,255
GRADIENT_COLORS=
# 弹幕简繁体转换设置:default(默认不转换)、simplified(繁转简)、traditional(简转繁)
# 默认值:default(不转换)
# 可选值:default, simplified, traditional
DANMU_SIMPLIFIED_TRADITIONAL=default
# 弹幕时间偏移配置
# 格式:剧名:秒 或 剧名/季:秒 或 剧名/季/集:秒,支持指定来源:剧名@来源:秒 或 剧名/季@来源1&来源2:秒(不指定来源则对所有来源生效)
# 正数表示弹幕延后(向右),负数表示弹幕提前(向左),多条用逗号分隔
# 支持百分比模式:在路径或来源末尾追加 %,如 东方/S03/E02@tencent%:11
# 百分比模式会按公式:调整后时间 = 原时间 * (视频时长 + 偏移秒数) / 视频时长
# 示例:overlord/S01:90,re-zero/S02@bilibili:120,re-zero/S02/E03@dandan&bilibili:10,东方/S03/E02@tencent%:11
# 默认值:空
DANMU_OFFSET=
# 弹幕点赞数显示开关
# 默认值:true(开启)
# 说明:开启后会在弹幕内容后显示点赞数标记,≥5 才显示,避免低赞干扰
# 可选值:true, false
LIKE_SWITCH=true
# ==================== 弹幕推送配置 ====================
# 弹幕推送地址
# 默认值:空
# 说明:如果设置了此值,在弹幕推送页面的推送地址输入框里会默认填上该地址
# 示例:http://127.0.0.1:9978/action?do=refresh&type=danmaku&path=
DANMU_PUSH_URL=http://127.0.0.1:9978/action?do=refresh&type=danmaku&path=
# ==================== 弹幕输出格式配置 ====================
# 弹幕输出格式(全局默认格式)
# 默认值:json
# 可选值:json, xml
# 说明:
# - json: 返回 JSON 格式的弹幕数据(默认)
# - xml: 返回 XML 格式的弹幕数据(兼容弹弹play等客户端)
# 注意:可通过 API 查询参数 ?format=xml 或 ?format=json 覆盖此设置
# 示例:GET /api/v2/comment/10001?format=xml
DANMU_OUTPUT_FORMAT=json
# ==================== 限流配置 ====================
# API 限流:1分钟内同一IP最大请求次数
# 默认值:3(1分钟内最多3次请求)
# 设置为 0 表示不限流
RATE_LIMIT_MAX_REQUESTS=3
# ==================== 集标题过滤开关 ====================
# 控制手动搜索的时候是否根据ANIME_TITLE_FILTER进行剧名过滤以及根据EPISODE_TITLE_FILTER进行集标题过滤
# 默认值:false(禁用)
# 说明:GET /api/v2/bangumi/{id} 和 GET /api/v2/search/anime 接口会过滤掉预告、花絮等特殊集
# 如需启用过滤,设置为 true
# 可选值:true, false
ENABLE_ANIME_EPISODE_FILTER=false
# ==================== 搜索匹配模式 ====================
# 是否启用严格标题匹配模式
# 默认值:false(宽松模糊匹配)
# 说明:
# - false(默认): 模糊匹配,只要标题包含搜索词即可(例如搜索"遮天"会匹配"古惑仔3之只手遮天")
# - true: 严格匹配,只匹配标题开头或完全匹配(例如搜索"遮天"只匹配"遮天"、"遮天 第一季"等)
# 可选值:true, false
STRICT_TITLE_MATCH=false
# 是否在match自动匹配时将外语标题转换成中文标题,适用于网盘没有刮削的资源
# 默认值:false(不转换)
# 说明:需配合TMDB_API_KEY使用
# 可选值:true, false
# TITLE_TO_CHINESE=false
# 是否启用 Bangumi Data 加速匹配
# 默认值:false(关闭)
# 说明:
# - 开启后将动画元数据缓存至本地或内存中给源调用,提升动画源的检索与匹配速度并解锁隐藏/区域番剧。
# - 本地和Docker部署使用时请先挂载.cache目录获得最佳体验,云部署使用时会将数据缓存至临时内存中如果体验不佳请关闭。
# 可选值:true, false
USE_BANGUMI_DATA=false
# ==================== 界面配置 ====================
# 管理界面主题
# 默认值:shinyo(新叶绿)
# 可选值:shinyo(新叶绿)、sakura(哔哩粉)、tianyi(天依蓝)、hatsune(初音青)、sakuragi(樱木红)、violet(罗兰紫)、amber(LCL橘)、lavender(经典默认)
UI_THEME=shinyo
# ==================== 代理配置 ====================
# 代理/反代地址(用于访问受限资源)
# 默认值:空(不使用代理/反代)
# 格式:
# - 设置为代理为 http://proxy-server:port 或 https://proxy-server:port
# - 设置为万能反代为 @http://proxy-server:port 或 @https://proxy-server
# - 设置为巴哈反代为 bahamut@http://proxy-server:port 或 bahamut@https://proxy-server
# - 设置为TMDB反代为 tmdb@http://proxy-server:port 或 tmdb@https://proxy-server
# - 设置为bilibili反代为 bilibili@http://proxy-server:port 或 bilibili@https://proxy-server
# - 设置为animeko反代为 animeko@http://proxy-server:port 或 animeko@https://proxy-server
# 说明:目前只对巴哈姆特、TMDB API、bilibili、animeko生效
# 如果使用 Docker 部署并且访问不了 bahamut / animeko 源或 TMDB API ,请配置代理/反代地址(animeko 也可通过开启 Bangumi Data 解决)
# 如果想启用B站港澳台番剧的弹幕搜索与获取请配置反代/解析服务器地址
# 反代教程参考:https://github.com/wan0ge/bahamut-api-proxy
# PROXY_URL=
# ==================== TMDB 配置 ====================
# TMDB API Key(用于巴哈姆特源的译名转换)
# 默认值:空(不使用 TMDB)
# 说明:配置后并行从 TMDB 获取日语原名搜索巴哈
# 如果TMDB条目类型不是动画或制作地区不是jp则不会进行巴哈搜索
# 可以解决巴哈译名不同导致的搜索无结果问题(例如:间谍过家家 vs 間諜家家酒)
# 获取方法参考:https://www.ugnas.com/tutorial-detail/id-226.html
# TMDB_API_KEY=
# ==================== 日志配置 ====================
# 日志级别(可选值:error, warn, info)
# 默认值:info
# 说明:
# - error: 仅显示错误日志
# - warn: 显示错误和警告日志
# - info: 显示所有日志(包括详细的调试信息)
# 建议:生产环境使用 warn,开发/调试时使用 info
LOG_LEVEL=info
# ==================== 缓存配置 ====================
# 搜索结果缓存时间(分钟)
# 默认值:3
# 说明:避免短期内重复的不必要 API 请求,同时保证获取最新的结果列表
# 可根据需要调整:Vercel/Cloudflare 建议 1-5 分钟,Docker 可设置 5-30 分钟
# 设置为 0 表示不缓存
SEARCH_CACHE_MINUTES=3
# 弹幕缓存时间(分钟)
# 默认值:3
# 说明:弹幕数据的缓存时间,独立于搜索结果缓存
# 可根据需要调整
# 设置为 0 表示不缓存
COMMENT_CACHE_MINUTES=3
# 弹幕缓存最少条数
# 默认值:100
# 说明:缓存中的弹幕低于该数量时,无视缓存时间并重新获取最新弹幕
# 设置为 0 表示关闭此机制
COMMENT_CACHE_MIN_COUNT=100
# 红果短剧是否将所有集弹幕按剧集顺序合并为一集,默认关闭
HONGGUO_MERGE_ALL_EPISODES=false
# 是否记住手动选择结果
# 默认值:true
# 说明:是否记住明确手动选择的结果,用于match自动匹配时优选上次的选择
# 自动匹配后直接获取其返回结果不会写入偏好,选择不同结果时才会记录
REMEMBER_LAST_SELECT=true
# 用户偏好记忆缓存大小限制
# 默认值:100
# 说明:lastSelectMap 最多保存的条目数,超过限制时删除最早的条目(FIFO)
# 用于存储查询关键字上次选择的 animeId,下次 match 自动匹配时优先选择该 anime
MAX_LAST_SELECT_MAP=100
# 动漫标题缓存最大数量
# 默认值:100
# 说明:缓存最多保存的anime条目数,超过限制时删除最早的条目(FIFO)
# 最小值100,最大值1000
MAX_ANIMES=100
# Bangumi Data 缓存有效期(天)
# 默认值:7
# 说明:指定 Bangumi Data 数据有效期,超过有效期后会下载更新,设置0则每次请求时强制异步更新
BANGUMI_DATA_CACHE_DAYS=7
# ==================== 通用文件缓存配置 ====================
# 通用文件缓存开关(Node/Docker)
# 默认值:true,需已有 .cache 目录
# 设置 false 后不读取或写入通用文件缓存,包括收藏与定时计划;已配置 Upstash 时仍可持久化
# 不影响本地弹幕文件、Bangumi Data 或 Redis
# LOCAL_CACHE_ENABLED=true
# ==================== Redis 配置(Upstash)====================
# Upstash Redis REST URL(用于缓存)
# 默认值:空(不使用 Redis)
# UPSTASH_REDIS_REST_URL=
# Upstash Redis REST Token
# 默认值:空
# UPSTASH_REDIS_REST_TOKEN=
# ==================== 本地 Redis 配置 ====================
# 本地 Redis 连接 URL(用于查询数据持久化,收藏与定时计划需使用文件缓存或 Upstash)
# 格式:redis://:password@127.0.0.1:6379/0
# 默认值:空(不使用本地 Redis)
# LOCAL_REDIS_URL=
# ==================== 部署平台API接口信息 配置 ====================
# 部署账号ID,调用部署服务API需要,配置后可使用UI界面配置服务
# Hugging Face Spaces 填 Space 所属用户名或组织名
# 默认值:空
#DEPLOY_PLATFROM_ACCOUNT=
# 部署项目名称,调用部署服务API需要,配置后可使用UI界面配置服务
# Hugging Face Spaces 填 Space 名称
# 默认值:空
#DEPLOY_PLATFROM_PROJECT=
# 部署平台token,调用部署服务API需要,配置后可使用UI界面配置服务
# Hugging Face Spaces 填具备目标 Space 写入权限的 User Access Token
# 默认值:空
#DEPLOY_PLATFROM_TOKEN=
# 在建立 HTTPS 连接时是否验证服务器的 SSL/TLS 证书,0表示忽略
# 默认值:1
# NODE_TLS_REJECT_UNAUTHORIZED=1
# ==================== 标题映射表配置 ====================
# 标题映射表(用于自动匹配时替换标题进行搜索)
# 格式:原始标题->映射标题;原始标题->映射标题;...
# 示例:TITLE_MAPPING_TABLE: "唐朝诡事录->唐朝诡事录之西行;国色芳华->锦绣芳华"
# 默认值:空(不启用标题映射)
TITLE_MAPPING_TABLE=
# 自动匹配映射表(仅作用于 POST /api/v2/match)
# 默认值:空(不启用自动匹配映射)
# 说明:多个规则用分号(;)分隔,源标题按规范化后的完整标题精确匹配,支持 S5E2 和 S05E02
# 开放映射:从源季起始集开始递增映射,但不会延伸到下一季
# 有限范围:箭头两侧都必须填写范围且长度相同,范围包含两端;范围外保持原始匹配
# 目标可使用 (年份)、【类型】和 @平台 优选结果;限定结果或映射目标不可用时会自动回退
# 优先级:当前源季的手动选择偏好 > AUTO_MATCH_MAPPING_TABLE > TITLE_MAPPING_TABLE > 普通自动匹配
# 开放映射:永生 S05E02 -> 永生 S01E58
# 有限范围:永生 S05E02~03 -> 永生 S01E58~59
# 指定结果:海贼王 S02E01 -> 航海王(1999)【动漫】 S01E62
# 指定平台:航海王 S01E01 -> 航海王 S01E01 @qiyi
AUTO_MATCH_MAPPING_TABLE=
# 是否在搜索时将繁体剧名标题自动转换为简体,适用于繁体标题搜索
# 默认值:false(不转换)
# 可选值:true, false
ANIME_TITLE_SIMPLIFIED=false
# ==================== 剧名过滤配置 ====================
# 剧名过滤规则(用于过滤不需要的剧集),需开启ENABLE_ANIME_EPISODE_FILTER
# 默认值:空(不过滤)
# 说明:使用 | 分隔多个关键词,例如:广告|预告|无关剧名
ANIME_TITLE_FILTER=
# 剧名杂音清理规则(按正则表达式清理搜索与匹配阶段的剧名杂音词,如`百花杀(真彩)`→`百花杀`)
# 默认值:下方完整规则
# 说明:
# - 如果设置了此环境变量,将完全覆盖默认规则(不是增量添加)
# - 可以直接修改下方规则,按需增删关键词
# 示例:只清理括号臻彩和真彩
# TITLE_NOISE_FILTER=[((](?:臻彩|真彩)[))]
# 设为空值可禁用
TITLE_NOISE_FILTER=[((\[[](?:臻彩|真彩|高清|标清|超清|国配|中配|日配|粤语|原声|台配|无修|未删减|完整版|日语版|国语版|英语版|中字|字幕|助听|原版)[\]))]]
# ==================== AI 配置 ====================
# AI服务的基础URL地址,用于配置AI相关功能的API端点
# 默认值:https://api.openai.com/v1
# AI_BASE_URL=
# AI模型名称,指定使用的AI模型
# 默认值:gpt-4o
# AI_MODEL=
# AI服务的API密钥,用于身份验证
# 默认值:空(不使用AI功能)
# AI_API_KEY=
# AI匹配提示词,用于自定义AI匹配行为
# 默认值:空(使用默认提示词)
# AI_MATCH_PROMPT=