Files
danmu_api/config/.env.example
T
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

364 lines
19 KiB
Bash
Raw 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:需要在平台的环境变量设置中修改,然后重新部署
# ==================== 基础配置 ====================
# API 访问令牌(用于鉴权)
# 默认值:87654321
TOKEN=87654321
# API 服务监听端口
# 默认值:9321
# 说明:本地 Node 服务会优先读取 DANMU_API_PORT;未设置时回退到 9321
# DANMU_API_PORT=9321
# 系统管理访问令牌(用于系统管理功能)
# 如果未配置此值,则无法访问系统管理功能,需要先配置后在URL中填入此token才能打开系统管理
# 默认值:空(不启用系统管理访问控制)
# ADMIN_TOKEN=
# 其他服务器地址(第三方弹幕服务器)
# 默认值: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=
# ==================== 优酷配置 ====================
# 优酷并发数(最大:16)
# 默认值:8
YOUKU_CONCURRENCY=8
# ==================== 弹弹配置 ====================
# 弹弹第三方数据源实时拉取开关(可选值:true、false)
# 默认值:false(关闭)
# 说明:开启后在获取弹弹源弹幕时重新拉取绑定的第三方数据源弹幕,覆盖弹弹服务器缓存的旧弹幕,实际拉取时需要在SOURCE_ORDER中开启对应的源(弹弹平台允许绑定的源:bilibili, bahamut, iqiyi, youku, tencent, imgo)
REAL_TIME_PULL_DANDAN=false
# ==================== 源排序配置 ====================
# 数据源查询顺序(可选值:360, vod, tmdb, douban, tencent, youku, iqiyi, imgo, bilibili, migu, renren, hanjutv, bahamut, dandan, sohu, leshi, xigua, maiduidui, animeko, custom)
# 默认值:360,vod,renren,hanjutv(不包含 tencent, youku, iqiyi, imgo, bilibili, migu, sohu , leshi, xigua, maiduidui等)
# 如需使用腾讯源、优酷源、爱奇艺源、芒果源、B站源、搜狐源、乐视源、西瓜源、埋堆堆源,请手动添加:SOURCE_ORDER=360,vod,tencent,youku,iqiyi,imgo,bilibili,migu,renren,hanjutv,sohu,leshi,xigua,maiduidui
# 如需使用巴哈姆特源,请手动添加:SOURCE_ORDER=360,vod,renren,hanjutv,bahamut
# 如需使用弹弹play源,请手动添加:SOURCE_ORDER=360,vod,renren,hanjutv,dandan
# 如需使用豆瓣源,请手动添加:SOURCE_ORDER=360,vod,douban,renren,hanjutv
# 如需使用TMDB源,请手动添加:SOURCE_ORDER=360,vod,tmdb,renren,hanjutv
SOURCE_ORDER=360,vod,renren,hanjutv
# ==================== 平台排序配置 ====================
# 平台优先级排序(用于自动匹配)
# 默认值:空(自动匹配)
# 可选值:qiyi, bilibili1, imgo, youku, qq, migu, sohu, leshi, xigua, maiduidui, renren, hanjutv, bahamut, dandan, animeko, custom 或 qiyi&bilibili1&imgo,dandan&animeko
# 说明:平台排序配置,可以配置自动匹配时的优选平台,当配置合并平台的时候可以指定期望的合并源
# PLATFORM_ORDER=
# ==================== 源合并配置 ====================
# 数据源合并配置(可选值:tencent, youku, iqiyi, imgo, bilibili, migu, renren, hanjutv, bahamut, dandan, sohu, leshi, xigua, maiduidui, animeko)
# 默认值:空
# 说明:配置后将对应源合并同时一起获取弹幕返回,允许多组、允许同时存在、允许多源,允许填单源表示保留原结果,一组中第一个为主源其余为副源,副源往主源合并,主源如果没有结果会轮替下一个作为主源循环
# 格式:源字段&源字段&源字段,源字段
# 示例:MERGE_SOURCE_PAIRS=imgo&iqiyi,dandan&bahamut&animeko,imgo
# MERGE_SOURCE_PAIRS=
# ==================== 剧集标题过滤 ====================
# 剧集标题过滤正则表达式(用于过滤花絮、预告等非正片内容)
# 默认值:下方完整规则
# 说明:
# - 如果设置了此环境变量,将完全覆盖默认的过滤规则(不是增量添加)
# - 格式:使用 | 分隔多个关键词,例如:预告|花絮|特辑|番外
# - 可以直接修改下方规则,按需增删关键词
# 示例:只过滤预告和花絮
# 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|(?<!(大案|要案|刑侦|侦查|破案|档案|风云|历史|战争|探案|自然|人文|科学|医学|地理|宇宙|赛事|世界杯|奥运))全纪录|开播|先导|总宣|展演|集锦|旅行日记|精彩分享|剧情揭秘(?!(者|人))
# ==================== 屏蔽词配置 ====================
# 屏蔽词列表(用于过滤弹幕内容)
# 默认值:空
# 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
# 弹幕简繁体转换设置:default(默认不转换)、simplified(繁转简)、traditional(简转繁)
# 默认值:default(不转换)
# 可选值:default, simplified, traditional
DANMU_SIMPLIFIED_TRADITIONAL=default
# 弹幕时间偏移配置
# 格式:剧名:秒 或 剧名/季:秒 或 剧名/季/集:秒,支持指定来源:剧名@来源:秒 或 剧名/季@来源1&来源2:秒(不指定来源则对所有来源生效)
# 正数表示弹幕延后(向右),负数表示弹幕提前(向左),多条用逗号分隔
# 示例:overlord/S01:90,re-zero/S02@bilibili:120,re-zero/S02/E03@dandan&bilibili:10
# 默认值:空
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
# ==================== 代理配置 ====================
# 代理/反代地址(用于访问受限资源)
# 默认值:空(不使用代理/反代)
# 格式:
# - 设置为代理为 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
# 说明:目前只对巴哈姆特、TMDB API、bilibili生效
# 如果使用 Docker 部署并且访问不了 bahamut 源或 TMDB API ,请配置代理/反代地址
# 如果想启用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
# 是否记住手动选择结果
# 默认值:true
# 说明:是否记住手动选择结果,用于match自动匹配时优选上次的选择
# 用于存储查询关键字上次选择的 animeId,下次 match 自动匹配时优先选择该 anime
REMEMBER_LAST_SELECT=true
# 用户偏好记忆缓存大小限制
# 默认值:100
# 说明:lastSelectMap 最多保存的条目数,超过限制时删除最早的条目(FIFO)
# 用于存储查询关键字上次选择的 animeId,下次 match 自动匹配时优先选择该 anime
MAX_LAST_SELECT_MAP=100
# ==================== Redis 配置(Upstash)====================
# Upstash Redis REST URL(用于缓存)
# 默认值:空(不使用 Redis)
# UPSTASH_REDIS_REST_URL=
# Upstash Redis REST Token
# 默认值:空
# UPSTASH_REDIS_REST_TOKEN=
# ==================== 本地 Redis 配置 ====================
# 本地 Redis 连接 URL(用于本地缓存存储)
# 格式:redis://:password@127.0.0.1:6379/0
# 默认值:空(不使用本地 Redis)
# LOCAL_REDIS_URL=
# ==================== 部署平台API接口信息 配置 ====================
# 部署账号ID,调用部署服务API需要,配置后可使用UI界面配置服务
# 默认值:空
#DEPLOY_PLATFROM_ACCOUNT=
# 部署项目名称,调用部署服务API需要,配置后可使用UI界面配置服务
# 默认值:空
#DEPLOY_PLATFROM_PROJECT=
# 部署平台token,调用部署服务API需要,配置后可使用UI界面配置服务
# 默认值:空
#DEPLOY_PLATFROM_TOKEN=
# 在建立 HTTPS 连接时是否验证服务器的 SSL/TLS 证书,0表示忽略
# 默认值:1
# NODE_TLS_REJECT_UNAUTHORIZED=1
# ==================== 标题映射表配置 ====================
# 标题映射表(用于自动匹配时替换标题进行搜索)
# 格式:原始标题->映射标题;原始标题->映射标题;...
# 示例:TITLE_MAPPING_TABLE: "唐朝诡事录->唐朝诡事录之西行;国色芳华->锦绣芳华"
# 默认值:空(不启用标题映射)
TITLE_MAPPING_TABLE=
# 是否在搜索时将繁体剧名标题自动转换为简体,适用于繁体标题搜索
# 默认值:false(不转换)
# 可选值:true, false
ANIME_TITLE_SIMPLIFIED=false
# ==================== 剧名过滤配置 ====================
# 剧名过滤规则(用于过滤不需要的剧集),需开启ENABLE_ANIME_EPISODE_FILTER
# 默认值:空(不过滤)
# 说明:使用 | 分隔多个关键词,例如:广告|预告|无关剧名
ANIME_TITLE_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=