huangxd-
4e07d2daa4
feat: 新增豆瓣源支持 ( #81 )
...
* 单独提取出REMEMBER_LAST_SELECT环境变量:是否记住手动选择结果,用于match自动匹配时优选上次的选择,默认为`true`,表示记住
* 再增加部分数据模型校验
* 新增豆瓣源支持
2025-10-31 00:12:38 +08:00
huangxd-
b7afcf08dd
feat: 人人视频增加调用APP API方式请求弹幕,原先方式作为兜底 ( #80 )
...
* 人人视频增加调用APP API方式请求弹幕,原先方式作为兜底
* 个别抽出数据模型
* 修改小版本号
2025-10-29 23:57:02 +08:00
woleigedouer
68e35e4f97
修复 iqiyi 电影 综艺信息获取 ( #79 )
...
* 修复iqiyi综艺视频信息获取
* 修复iqiyi电影类别信息获取
2025-10-29 23:54:22 +08:00
huangxd-
186c37639e
修复首页json中布尔值true显示为false的问题
2025-10-27 23:11:06 +08:00
huangxd-
1406bd8148
修复cloudflare上环境变量不生效的问题 ( #78 )
...
* 修复cloudflare上环境变量不生效的问题
* 将源的初始化提到文件开头,避免重复创建多个对象
* 修改小版本号
2025-10-27 22:42:26 +08:00
woleigedouer
b794f02733
feat: 完善视频源类型识别逻辑,修复动漫误判为电视剧的问题 ( #77 )
2025-10-27 22:34:57 +08:00
Elegy233
90de8a29c5
巴哈姆特专项优化 ( #74 )
...
* 增加反代模式判断
* 增强SOURCE_ORDER和PROXY_URL环境变量
1.SOURCE_ORDER中用户可以为bahamut添加后缀@tc实现不繁转简;
2.PROXY_URL新增反代模式判断
* TMDB搜索增加类型判断
并在搜索流程中增加检查点实现可被中断
* 增加反代模式,第二次搜索并行执行并可被打断
并统一搜索构建
* Update README.md
* Update .env.example
* Update README.md
* Update .env.example
* 规范化,繁转简控制改为单独的环境变量DANMU_SIMPLIFIED
* 规范化,繁转简控制改为单独的环境变量DANMU_SIMPLIFIED
* 增加PROXY_URL控制变量
* 增加反代模式判断
* 规范化调整
* 更新DANMU_SIMPLIFIED
* Update .env.example
* 去除不必要的
* 实际并不需要修改这个文件
* Update globals.js
* Update globals.js
* Update globals.js
2025-10-27 22:34:17 +08:00
huangxd-
df1e1d47a3
自动匹配支持从如“惊天魔盗团2.2016.2160p.UHD.BluRay.REMUX.HEVC.HDR.TrueHD7.1-DreamHD”获取电影名“惊天魔盗团2”来进行弹幕匹配;修复韩剧tv弹幕中顶端弹幕不识别的问题
2025-10-26 22:25:09 +08:00
woleigedouer
5d942dc4c4
refactor: 将弹幕URL获取接口从POST改为GET并接入缓存和限流 (v1.6.1) ( #73 )
...
* refactor: 将弹幕URL获取接口从POST改为GET并接入缓存和限流 (v1.6.1)
## 主要变更
### 1. 接口重构:移除POST接口,改为GET方式
- **移除**: `POST /api/v2/comment/by-url` 接口
- **新增**: `GET /api/v2/comment?url=${videoUrl}&format=json` 接口
- **优势**:
- 更符合RESTful规范(GET用于查询数据)
- 兼容第三方弹幕服务器的使用习惯(如 api.danmu.icu)
- 播放器可直接在地址栏拼接URL,无需构造POST请求体
- 更易于测试和调试
### 2. 缓存和限流机制接入 ⭐
- **缓存优先策略**:
- 通过url参数获取弹幕时,先检查缓存
- 缓存命中时直接返回,不计入限流次数
- 提高响应速度,减少不必要的网络请求
- **限流保护**:
- 缓存未命中时才执行限流检查
- 与通过commentId获取弹幕的限流逻辑保持一致
- 默认:1分钟内同一IP最多请求3次(可通过 RATE_LIMIT_MAX_REQUESTS 配置)
- 超过限制返回 HTTP 429 错误
- **统一限流返回格式**:
- 旧格式: `{ status: 429, body: "..." }`
- 新格式: `{ errorCode: 429, success: false, errorMessage: "Too many requests, please try again later" }`
- 保持与其他API错误响应格式一致
### 3. 代码修改详情
**danmu_api/worker.js** (+96/-57 行)
- 合并路由逻辑:`GET /api/v2/comment` 同时支持 commentId 和 url 参数
- 为url参数方式添加完整的"缓存检查 → 限流检查 → 获取弹幕"流程
- 统一限流返回格式,保持API响应一致性
- 简化限流逻辑,移除冗余的历史记录清理代码
- 添加参数验证:必须提供 commentId 或 url 参数之一
**danmu_api/apis/dandan-api.js** (+23/-13 行)
- 函数签名变更:`getCommentByUrl(req, queryFormat)` → `getCommentByUrl(videoUrl, queryFormat)`
- 移除POST请求体解析逻辑(`req.json()`)
- 改为直接接收URL字符串参数
- 更新错误提示信息
- 保留内部缓存检查逻辑(作为双重保障)
**README.md** (+6/-3 行)
- 更新API接口文档说明
- 更新测试示例和使用示例
- 移除POST请求相关说明
**danmu_api/configs/globals.js** (+2/-1 行)
- 版本号:1.6.0 → 1.6.1
### 4. 配置优化(附带修改)
**.env.example** (+13/-4 行)
- 完善 `EPISODE_TITLE_FILTER` 环境变量注释说明
- 添加默认过滤规则的完整示例
- 启用 `MAX_LAST_SELECT_MAP=100` 配置
**danmu_api/configs/envs.js** (+10/-6 行)
- 修改 `EPISODE_TITLE_FILTER` 逻辑:从"增量添加"改为"完全覆盖"
- 简化剧集过滤规则,移除过于复杂的正则表达式
**danmu_api/sources/base.js** (+8/-1 行)
- 添加动漫去重逻辑:检查 animeId 是否已存在,避免重复添加
* fix: 修复 SOURCE_ORDER=bahamut 时出现重复的问题
问题原因:
- 当用户配置 SOURCE_ORDER=bahamut 时,在 Cloudflare/Vercel/Netlify 平台上
- resolveSourceOrder 函数会自动追加 ',bahamut'
- 导致最终变成 'bahamut,bahamut',出现重复结果
修复方案:
- 删除自动追加 bahamut 的隐式逻辑
- 用户需要在 SOURCE_ORDER 中显式配置 bahamut 源
- 配置即所得,避免魔法行为
修改文件:
- danmu_api/configs/envs.js: 删除自动追加逻辑
- .env.example: 更新配置说明
- README.md: 更新文档说明
2025-10-26 22:24:26 +08:00
woleigedouer
1e80b60632
feat: 多平台搜索源升级与严格匹配模式支持 ( #72 )
...
* 修复 环境变量模板
* 修复芒果TV弹幕获取失败问题并实现双API兜底机制
问题背景:
1. 芒果TV新API (getctlbarrage) 返回数据缺少 cdn_list 和 cdn_version 字段
2. convertToDanmakuJson() 在接收空数组时抛出异常,导致兜底逻辑无法执行
3. 用户无法获取芒果TV弹幕
修复内容:
1. danmu_api/utils/danmu-util.js
- 修改 convertToDanmakuJson() 函数
- 空数组输入时返回空数组而不是抛出异常
- 允许兜底逻辑正常执行
2. danmu_api/sources/mango.js
- 实现双API兜底机制
- 优先使用新API (getctlbarrage) 支持彩色弹幕
- 新API失败时自动切换到旧API (rdbarrage)
- 旧API作为兜底保证弹幕获取成功率
* feat: 将 youku 升级为独立搜索源
## 主要变更
### 1. 核心功能集成
- 在 envs.js 中将 youku 添加到 ALLOWED_SOURCES
- 在 dandan-api.js 中集成 youku 源的搜索和处理逻辑
- youku 现在既是独立搜索源,也是弹幕获取器(与 tencent 源一致)
### 2. Bug 修复
- 修复 http-util.js 中的超时配置问题
- 添加了 parseInt 的基数参数和默认值
- 解决了 vodRequestTimeout 为字符串导致的 NaN 超时问题
### 3. 配置文件更新
- 更新 .env.example:在 SOURCE_ORDER 说明中添加 youku
- 更新 README.md:
- 在环境变量说明中添加 youku 源
- 在采集源列表中添加 youku 条目
## 使用方式
在 .env 中配置 SOURCE_ORDER 即可启用 youku 源:
* feat: 为 iQiyi 源添加独立搜索匹配功能
主要变更:
1. danmu_api/sources/iqiyi.js
- 新增 search() 方法:使用爱奇艺桌面版 API 搜索内容
- 新增 getEpisodes() 方法:使用 v3 base_info API 获取分集列表
- 新增 handleAnimes() 方法:格式化搜索结果为 DanDanPlay 格式并缓存
- 新增工具方法:
* _filterIqiyiSearchItem() - 过滤搜索结果
* _videoIdToEntityId() - video_id 到 entity_id 转换
* _xorOperation() - 异或运算
* _createSign() - API 签名生成
- 添加静态常量:XOR_KEY、SECRET_KEY、KEY_NAME
2. danmu_api/configs/envs.js
- 将 'iqiyi' 添加到 ALLOWED_SOURCES 数组
3. danmu_api/apis/dandan-api.js
- 导入 IqiyiSource 类
- 创建 iqiyiSource 实例
- 在搜索流程中集成 iqiyi 源
- 在结果处理循环中添加 iqiyi 处理逻辑
4. .env.example
- 更新 SOURCE_ORDER 说明,添加 iqiyi 选项
5. README.md
- 在 SOURCE_ORDER 环境变量说明中添加 iqiyi
- 在采集源列表中添加 iqiyi 源(平台:qiyi)
* feat: 将 mango (imgo) 升级为独立搜索源
## 主要变更
### 1. 核心功能集成
- 在 envs.js 中将 imgo 添加到 ALLOWED_SOURCES
- 在 dandan-api.js 中集成 imgo 源的搜索和处理逻辑
- mango 现在既是独立搜索源,也是弹幕获取器
### 2. 高级特性实现
- 分页获取分集列表(按月份分页)
- 专属黑名单过滤(过滤预告、花絮、特辑等非正片内容)
- 综艺节目智能处理("第N期"格式识别和排序)
- 电影类型专门处理(智能正片识别)
### 3. 代码优化
- 添加 _getMovieEpisode() 方法处理电影类型
- 添加 _processVarietyEpisodes() 方法处理综艺节目
- 完善的日志输出和错误处理
## 使用方式
在 .env 中配置 SOURCE_ORDER 即可启用 imgo 源:
SOURCE_ORDER=360,vod,imgo,renren,hanjutv
* feat: 将 bilibili 升级为独立搜索源
## 主要变更
### 1. 核心功能集成
- 在 envs.js 中将 bilibili 添加到 ALLOWED_SOURCES
- 在 dandan-api.js 中集成 bilibili 源的搜索和处理逻辑
- bilibili 现在既是独立搜索源,也是弹幕获取器(与 youku 源一致)
### 2. bilibili.js 功能实现
- 添加 WBI 签名机制(_getWbiMixinKey, _getWbiSignedParams)
- 实现搜索功能(search, _searchByType)
- 支持 media_bangumi 和 media_ft 两种类型搜索
- 自动去重和结果合并
- 实现分集获取(getEpisodes, _getPgcEpisodes, _getUgcEpisodes)
- 支持番剧(ss格式)和普通视频(bv格式)
- 实现结果处理(handleAnimes)
- 格式化为统一的 anime 对象
- 添加到缓存并按年份排序
### 3. 配置文件更新
- 更新 .env.example:在 SOURCE_ORDER 说明中添加 bilibili
- 更新 README.md:
- 在环境变量说明中添加 bilibili 源
- 在采集源列表中添加 bilibili 条目
## 使用方式
在 .env 中配置 SOURCE_ORDER 即可启用 bilibili 源:
```bash
SOURCE_ORDER=360,vod,bilibili,renren,hanjutv
* feat: 添加严格标题匹配模式环境变量 STRICT_TITLE_MATCH
新增 STRICT_TITLE_MATCH 环境变量,支持严格标题匹配模式,解决模糊搜索返回过多无关结果的问题。
## 功能说明
- 默认值:false(宽松模糊匹配)
- 启用后:只匹配标题开头或完全匹配的结果
- 示例:搜索"遮天"时
- false: 匹配"遮天"、"古惑仔3之只手遮天"(所有包含"遮天"的标题)
- true: 只匹配"遮天"、"遮天 第一季"、"遮天(2024)"等
## 修改内容
1. 环境变量配置
- 新增 STRICT_TITLE_MATCH 配置项到 .env 和 .env.example
- 在 envs.js 中添加配置读取逻辑
2. 工具函数(common-util.js)
- 新增 strictTitleMatch() 严格匹配函数
- 新增 titleMatches() 根据配置选择匹配模式
3. Source文件修改(10个)
- bilibili.js, tencent.js, iqiyi.js, youku.js, mango.js
- renren.js, hanjutv.js, vod.js, kan360.js
- 统一使用 titleMatches() 替代 .includes() 模糊匹配
- bahamut.js: 扩展 bahamutTitleMatches() 支持严格模式(保留繁简转换)
4. 文档更新
- README.md 添加 STRICT_TITLE_MATCH 环境变量说明
## 技术细节
- 严格匹配支持的分隔符:空格、括号、冒号、破折号、季集标识等
- Bahamut源特殊处理:严格模式下仍支持繁简体转换
- 所有修改向后兼容,默认保持原有模糊匹配行为
## 相关 Issue
解决用户反馈的模糊搜索匹配过多无关内容的问题(如搜索"遮天"匹配到"古惑仔3之只手遮天")
* 调整默认超时时间 更新版本号
2025-10-26 17:42:44 +08:00
huangxd-
039d9a2d90
修改README
2025-10-26 13:22:36 +08:00
huangxd-
f480621adf
拆分worker.js ( #71 )
...
* 拆分出envs.js和globals.js
* 拆分出多个工具类,完善了全局变量和环境变量文件
* 修复环境变量热加载,并增加自动转发所有属性访问到 Globals.getConfig(),减少代码量
* 继续拆分各种工具类
* 拆分各类源
* 拆分360和vod源
* 拆分弹弹play兼容接口
* 适配测试用例
2025-10-26 13:03:42 +08:00
huangxd-
1088040b4f
修复bahamut弹幕没有去重的问题
2025-10-22 00:32:41 +08:00
huangxd-
c7658ec5db
修复bahamut弹幕分散的问题
2025-10-22 00:07:26 +08:00
huangxd-
f4dff47bc3
修复bahamut在本地启动和docker场景下代理问题 ( #70 )
2025-10-21 23:22:21 +08:00
huangxd-
fa7bc04085
修复bahamut在本地启动和docker场景下代理问题
2025-10-21 22:20:14 +08:00
woleigedouer
3748e46247
feat: 实现Bilibili标准XML格式弹幕输出 ( #69 )
...
- 新增XML格式支持,完全遵循Bilibili标准8字段格式
- 增强convertToDanmakuJson()支持多种p属性格式(4/8/9字段)
- 重构convertDanmuToXml()使用<i>根元素和标准8字段p属性
- 新增generateDanmuId()生成11位数字弹幕ID
- 新增buildBilibiliDanmuP()构建标准8字段p属性(时间,类型,字体,颜色,时间戳,弹幕池,用户Hash,弹幕ID)
- 使用固定值(时间戳1751533608,用户Hash和弹幕池为0)符合实际格式标准
- 更新README.md添加详细的XML格式说明和使用示例
技术细节:
- XML根元素从<root>改为<i>
- p属性从4字段扩展为8字段标准格式
- 时间保留1位小数,颜色为RGB十进制值
- 向后兼容多种输入格式,增强解析逻辑
- 完全符合第1集.xml的实际格式标准
2025-10-21 22:16:29 +08:00
huangxd-
86aa844666
更新README
2025-10-20 23:06:55 +08:00
huangxd-
5ed75139a8
修复cloudflare部署后查询请求空以及部分空格编码不一致的问题
2025-10-20 22:24:43 +08:00
huangxd-
6461d04052
更新README
2025-10-20 21:50:38 +08:00
huangxd-
3bffc26412
修改小版本号
2025-10-20 21:47:09 +08:00
Elegy233
bb2d53021f
增加TMDB_API_KEY环境变量,实现巴哈兜底名称搜索 ( #67 )
...
* 增加TMDB_API_KEY环境变量,为巴哈添加兜底名称搜索
* 更新TMDB_API_KEY环境变量使用方法
* 从TMDB获取Taiwan译名改为获取日语原名
* Update VOD_RETURN_MODE description in README
* 使用可以直连的api,去除代理依赖
* Update README with PROXY_URL and TMDB_API_KEY details
* Fix formatting of TMDB API Key description in README
* 我嘞个翻译插件正则替换掉了all
* 简化bahamutSearch参数
* Clarify TMDB API Key usage in README
Updated TMDB API Key description for clarity and performance impact.
2025-10-20 21:46:20 +08:00
woleigedouer
09805f330b
fix: 修复 Dockerfile 目录结构和环境变量热更新逻辑 ( #66 )
...
* fix: 修复 Dockerfile 目录结构和环境变量热更新逻辑
* feat: 实现弹幕 XML 格式输出,支持环境变量和查询参数配置
- 添加 DANMU_OUTPUT_FORMAT 环境变量支持(默认:json)
- 支持 ?format=xml 和 ?format=json 查询参数
- 实现优先级系统:查询参数 > 环境变量 > 默认值
- 添加 JSON 到 XML 的转换函数
- 完整的 XML 特殊字符转义处理
- 支持所有平台(bilibili、youku、360等)
- 错误回退机制:转换失败时返回 JSON
- 修改端点:GET /api/v2/comment/:commentId、POST /api/v2/comment/by-url
* Update README.md
2025-10-20 21:45:09 +08:00
woleigedouer
571bc727a6
feat: 添加弹幕转换功能 - 支持顶部/底部和彩色弹幕转换 ( #62 ) ( #65 )
...
* feat: 添加弹幕转换功能
- 支持将顶部/底部弹幕转换为浮动弹幕(CONVERT_TOP_BOTTOM_TO_SCROLL)
- 支持将彩色弹幕转换为纯白弹幕(CONVERT_COLOR_TO_WHITE)
- 解决部分播放器不支持顶部/底部弹幕和彩色弹幕的问题
- 优化 convertToDanmakuJson() 函数逻辑
- 转换在去重后执行,性能开销极小(< 0.5 微秒/条)
- 已通过多平台真实测试(腾讯、爱奇艺、优酷、芒果)
- 更新 .env 和 README.md 文档
* 修复 bahamut episodes 处理错误并添加 b23.tv 短链接解析功能
* fix: 移除 worker.js 中的 dotenv require 以修复 Cloudflare Workers 部署问题
* feat: 添加环境变量热更新功能
- 实现 .env 文件监听和自动重载
- 添加 200ms 防抖机制避免重复触发
- 支持文件删除事件处理
- 实现优雅关闭和资源清理
- 修复 dotenv 不覆盖已存在环境变量的问题(添加 override: true)
- 添加 chokidar 依赖支持文件监听
- 更新文档说明热更新使用方法
影响范围:
- Node.js 本地运行环境
- Docker 容器环境(需 Volume 挂载)
- 不影响 Cloudflare/Vercel/Netlify 部署
* 调整日志级别默认值为 info
* Update worker.js
2025-10-19 23:35:25 +08:00
huangxd-
cc9e303323
增加各源内anime根据年份降序排序 ( #64 )
2025-10-19 14:19:56 +08:00
woleigedouer
9dc8886fc4
feat: 添加日志级别配置和弹幕缓存独立配置,修复 lastSelectMap Map 序列化 BUG ( #63 )
...
* Update README.md
* feat: 添加日志级别配置和弹幕缓存独立配置,修复 lastSelectMap Map 序列化 BUG
新增功能:
- 添加 LOG_LEVEL 环境变量支持(error/warn/info 三个级别,默认 warn)
- 添加 COMMENT_CACHE_MINUTES 环境变量支持(弹幕缓存时间独立配置)
- 改进 lastSelectMap 为 Map 对象,支持 FIFO 删除和更好的性能
BUG 修复:
- 修复 lastSelectMap Map 对象序列化问题,防止 Redis 缓存数据丢失
- 新增 serializeValue() 函数处理 Map 对象的正确序列化
- 修复 getRedisCaches() 中的哈希值计算
- 修复 updateRedisCaches() 中的序列化逻辑
- 修复 setRedisKey() 和 setRedisKeyWithExpiry() 中的数据序列化
改进:
- 增强 addAnime() 函数的错误处理(try-catch)
- 改进日志输出格式(使用 JSON.stringify)
- 新增 cleanupExpiredIPs() 函数清理过期的限流 IP 记录
- 优化 Redis 缓存初始化逻辑
文档更新:
- 更新 .env.example 配置文件
- 更新 README.md 功能说明和环境变量文档
* fix: 修复 JSON 日期格式导致小幻客户端反序列化失败
问题描述
========
小幻客户端在搜索"琉璃的宝石"时报错:
System.Text.Json.JsonException: The JSON value could not be converted to
System.Nullable`1[System.DateTimeOffset].
Path: $.bangumi.episodes[0].airDate
根本原因
========
VOD 源(如听风)返回的年份为 0 时,生成的 startDate 格式为 "0-01-01T00:00:00",
不符合 ISO 8601 标准,导致 .NET 的 DateTimeOffset 无法解析。
修复方案
========
1. 添加 generateValidStartDate() 函数
- 验证年份是否在 1900-2100 范围内
- 无效年份自动使用当前年份
- 返回标准 ISO 8601 格式:YYYY-01-01T00:00:00Z
2. 更新所有 6 个数据源的日期生成逻辑
- VOD 源(听风等)
- 360kan
- 人人视频
- hanjutv
- bahamut
- 腾讯视频
修改文件
========
- danmu_api/worker.js
* 第 1405-1413 行:添加 generateValidStartDate() 函数
* 第 4539 行:VOD 源日期修复
* 第 4603 行:360kan 日期修复
* 第 4641 行:人人视频日期修复
* 第 4690 行:hanjutv 日期修复
* 第 4734 行:bahamut 日期修复
* 第 4782 行:腾讯视频日期修复
测试结果
========
✅ 10 个单元测试通过
✅ 6 个 API 响应场景测试通过
✅ 代码语法检查通过
备注
====
- hanjutv 搜索日志 "seriesData 或 seriesList 不存在" 是正常行为
- 该修复确保所有数据源返回的日期格式都符合 ISO 8601 标准
- 小幻客户端现在能够正确解析 DateTimeOffset 类型
2025-10-19 14:17:37 +08:00
huangxd-
5df03312d0
修复芒果tv弹幕没有彩色弹幕的问题并优化upstash redis请求 ( #60 )
...
* 修复芒果tv弹幕没有彩色弹幕的问题
* 优化upstash redis请求,增加hash缓存,减少调用量
2025-10-19 08:36:01 +08:00
woleigedouer
cc3ffe6b0b
feat: 添加手动匹配过滤功能并替换默认VOD站点 ( #59 )
...
* feat: 手动匹配时添加过滤功能并替换默认VOD站点
- 将默认VOD站点改为 https://gctf.tfdh.top
- 在手动选择接口中实现过滤
- 支持剧集标题和选集列表标题的过滤
- 添加ENABLE_EPISODE_FILTER环境变量开关
- 更新所有相关文档和配置
* fix: 修复360电影和VOD高清正片被过滤的问题
- 移除DEFAULT_EPISODE_TITLE_FILTER中的'高清正片'关键词
* 高清正片是正片的标记,不应该被过滤
* 修复VOD数据中#高清正片#被误过滤的问题
- 为360电影标题添加#符号
* 统一所有数据源的标题格式为【平台】 #标题#
* 修复360电影数据全部被过滤的问题
* 使extractEpTitle()能正确提取标题
- 同步更新README.md文档中的默认过滤规则示例
* refactor: 优化和扩展剧集标题过滤规则
- 合并平台规则,提高过滤精准度
* 新增灵活匹配:抢先(看|版|集|篇)?、加更(版|篇)?、会员(专享|加长|尊享|专属|版)?
* 新增幕后变体:幕后(故事|花絮|独家)?
* 新增直播变体:直播(陪看|回顾)?
* 新增未播变体:未播(片段)?
* 新增花絮变体:花絮(独家)?
- 新增平台特定内容过滤
* 腾讯:解忧局、走心局、火锅局、巅峰时刻、坞里都知道、福持目标坞民
* 芒果:陪看(记)?、超前营业、超前vlog
* 通用:采访
- 优化正则表达式
* .{2,}篇 → .{3,}篇(避免过度过滤)
* 移除冗余的会员版(已包含在会员(版)?中)
* feat: 实现搜索结果和弹幕缓存功能
- 添加内存缓存机制,支持搜索结果和弹幕数据缓存
- 实现时间戳检查,自动过期清理(默认1分钟TTL)
- 添加 SEARCH_CACHE_MINUTES 环境变量配置
- 更新 README 文档和环境变量说明
修改文件:
- danmu_api/worker.js: 添加缓存管理函数和集成逻辑
- .env.example: 添加缓存配置说明
- README.md: 更新功能列表、环境变量表和注意事项
性能提升:
- 相同关键词的重复搜索响应时间从 API 调用时间降低到毫秒级
- 相同视频 URL 的重复弹幕请求响应时间从 API 调用时间降低到毫秒级
* feat: 实现 VOD 采集站点可配置返回模式
- 添加 VOD_RETURN_MODE 环境变量,支持两种模式:
* all: 返回所有配置的 VOD 站点结果(结果较多)
* fastest: 只返回最快响应的 VOD 站点结果(默认,避免结果过多)
- 实现 getVodAnimesFromFastestServer() 函数
* 使用 Promise.race 获取最快响应的服务器
* 如果最快的服务器无数据,自动尝试其他服务器
- 实现 getVodAnimesFromAllServersImpl() 函数
* 使用 Promise.allSettled 并发查询所有服务器
* 单个服务器失败不影响其他服务器
- 更新默认 VOD 站点配置为 3 个站点:
* 金蝉@https://zy.jinchancaiji.com
* 789@https://www.caiji.cyou
* 听风@https://gctf.tfdh.top
- 更新配置文件和文档
* .env.example: 添加 VOD_RETURN_MODE 配置
* README.md: 更新环境变量表和使用说明
- 默认行为改为 fastest 模式,避免搜索结果过多
* feat: 添加 .env 文件支持并优化构建脚本
- 在 worker.js 和 worker.test.js 中添加 dotenv 加载
- 优化 docker-image.yml 构建脚本(合并命令,快 50%)
- 修复 README 中的拼写错误(damnu_api → danmu_api, your_domian → your_domain)
- 添加 Docker .env 文件使用说明和示例
* chore: bump version to 1.4.0
* feat: 禁用集标题过滤默认值并修复环境变量配置
- 将 ENABLE_EPISODE_FILTER 默认值从 true 改为 false,避免综艺节目被过度过滤
- 修复 vodReturnMode 环境变量未被添加到 envs 对象的问题
- 同步更新 .env.example 和 README.md 文档
Fixes: huangxd- review comments
* refactor: 移除剧集标题 # 号包裹设计
- 移除所有剧集标题中的 # 号包裹(10 处)
- 删除 extractEpTitle() 函数及所有调用(7 处)
- 更新过滤逻辑以直接使用完整标题
- 简化 filterSameEpisodeTitle() 函数
- 保留【】平台前缀格式及正确的空格
修改位置:
- 360kan、renren(2处)、imgo、youku、qq、hanjutv、bahamut、tencent、手动解析
- searchAnime、getBangumi、searchBangumi、fallbackMatchAniAndEp 过滤逻辑
* feat: 优化限流与缓存交互设计 - 缓存命中时不计入限流
feat: 优化限流与缓存交互设计 - 缓存命中时不计入限流
## 问题描述
原始设计中,限流检查在缓存检查之前执行,导致即使返回缓存数据也会计入限流次数。
这会导致用户频繁访问同一弹幕时被限流,影响用户体验。
## 解决方案
重构 GET /api/v2/comment/:commentId 接口的限流逻辑:
1. 在限流检查之前先检查缓存
2. 缓存命中时直接返回,不执行限流检查
3. 只有缓存未命中时才计入限流次数
## 改进效果
- ✅ 缓存命中时不计入限流,用户可频繁访问同一弹幕
- ✅ 缓存未命中时正常计入限流,保护后端服务
- ✅ 添加详细的 [Rate Limit] 日志标记,便于调试
- ✅ 添加设计说明注释,便于后续维护
## 技术细节
- 修改文件:danmu_api/worker.js (第 5415-5476 行)
- 新增逻辑:缓存优先检查 + 条件限流
- 新增日志:[Rate Limit] Cache hit 和 Request counted
## 测试验证
已通过运行日志验证:
- 首次请求弹幕:计入限流 ✓
- 重复请求同一弹幕:不计入限流 ✓
- 新弹幕首次请求:计入限流 ✓
- 新弹幕重复请求:不计入限流 ✓
* feat: 统一 Tencent 平台标识为 qq
- 将 Tencent 集标题平台标识从【tencent】改为【qq】
- 更新 README 采集源平台列表中 Tencent 对应的平台为 qq
- 从 PLATFORM_ORDER 可选平台列表中移除 tencent
2025-10-19 08:26:08 +08:00
huangxd-
534761c7db
feat: 支持netlify一键部署并修复一些bug ( #58 )
...
* 修复如果不冷启动一直使用animes缓存中旧数据的问题
* 修复有对接redis的场景下手动解析链接只返回第一次请求的链接的问题
* 手动搜索场景通过获取播放链接title作为集标题显示
* 增加netlify一键部署
* 修改readme
2025-10-18 11:49:51 +08:00
woleigedouer
58d6292948
feat: 添加B站ss格式番剧链接支持 ( #55 )
...
* feat: 添加B站ss格式番剧链接支持
- 新增对 ss 格式番剧链接的识别和处理
- 使用 season_id 参数调用B站API获取番剧信息
- 默认获取第一集的弹幕数据
- 更新错误提示信息,包含 ss 格式说明
* feat: 添加 VOD 服务器请求超时机制
- 使用 AbortController 实现 HTTP 请求超时控制
- 新增 VOD_REQUEST_TIMEOUT 环境变量(默认 5000ms)
- 防止慢速或失效的采集站阻塞整个搜索过程
- 添加详细的超时错误日志"
* fix(tencent): 支持单页剧集分集提取
问题:
- 部分腾讯视频剧集采用单页展示所有集数
- 原逻辑在未找到tabs分页信息时直接返回空数组
- 导致这类剧集无法被缓存和使用
修改:
- 在getTencentEpisodes函数中新增单页处理分支
- 当tabs.length === 0时,尝试从初始API响应中提取分集
- 保持原有多页逻辑不变
影响范围:
- danmu_api/worker.js (getTencentEpisodes函数, 第1814-1896行)
* Update worker.js
2025-10-18 11:49:22 +08:00
woleigedouer
6b3a4289fd
fix: 修复 SenPlayer 无法显示 Tencent 数据源剧集列表的问题 ( #54 )
...
* fix: 修复 SenPlayer 无法显示 Tencent 数据源剧集列表的问题
- 问题: SenPlayer 客户端无法显示 Tencent 数据源的剧集列表
- 原因: Tencent 使用字符串类型的 mediaId (如 'mzc00200aaogpgh'),而 SenPlayer 期望数字类型的 animeId
- 解决: 在 handleTencentAnimes 函数中使用 convertToAsciiSum() 哈希函数将字符串 mediaId 转换为数字 animeId
- 影响: 修复后 SenPlayer 可以正常显示 Tencent 数据源的 116 集剧集列表
- 兼容性: 保持 bangumiId 为原始字符串 mediaId,确保内部查询功能不受影响
* fix: 缩短 Tencent 数据源的剧集标题长度
- 问题: Tencent 数据源的剧集标题过长,包含动漫名称和年份
- 影响: 选集时标题过长导致看不到第几集
- 解决: 删除标题中的 anime.title 和 anime.year,只保留平台标识和集数
- 格式: 从 '【tencent】遮天(2023) #遮天_01#' 改为 '【tencent】 #遮天_01#'
- 对齐: 与其他数据源 (360/VOD/Renren/Hanjutv/Bahamut) 的标题格式保持一致
* Update worker.js
2025-10-17 15:39:04 +08:00
Elegy233
2cff9d8f0d
增强Node部署客户端IP获取逻辑使能够兼容反代场景 ( #52 )
...
* Node部署客户端IP获取兼容反代场景
* 增加小幻使用提示
* 更改issue链接方式,直接#不确定合并行不行(
2025-10-17 15:37:30 +08:00
huangxd-
91ee96d917
feat: 支持手动搜索过程中输入爱优腾芒哔播放链接获取弹幕并修复一些bug ( #51 )
...
* 删除集标题中的title和date,防止集标题过长导致选集时看不到第几集
* 修复优酷弹幕颜色
* 支持手动搜索过程中输入爱优腾芒哔播放链接获取弹幕
* 修改readme
* 修复日志中的时区问题,默认使用shanghai时区
2025-10-16 22:39:58 +08:00
woleigedouer
8088045edb
feat: 支持可配置的API限流功能并修复内存泄漏 ( #50 )
...
* feat: 支持可配置的API限流功能并修复内存泄漏
1. 新增限流配置
- 添加 RATE_LIMIT_MAX_REQUESTS 环境变量
- 默认值为 3(保持向后兼容)
- 设置为 0 可关闭限流
2. Bug 修复
- 修复 getComment 中 title 为 null 时的崩溃
3. 性能优化
- 优化 requestHistory Map 内存管理
- 自动清理过期的 IP 记录,避免内存泄漏
4. 文档更新
- 更新 .env.example 和 README.md
* feat: 添加腾讯视频源支持并优化ID处理
- 新增腾讯视频搜索、过滤、分集获取功能
- 修复ID哈希冲突问题,改用字符串ID
- 统一所有源的ID比较逻辑(使用.toString())
- 更新默认源顺序,添加tencent源
* 恢复默认值
2025-10-16 22:39:16 +08:00
Elegy233
18b78696cc
规范路径处理日志输出 ( #48 )
2025-10-14 21:09:55 +08:00
woleigedouer
694e6b9bf8
feat: 重构VOD服务器配置,支持多服务器并发查询。添加通过视频URL直接获取弹幕的API接口 。 ( #46 )
...
* feat: 重构VOD服务器配置,支持多服务器并发查询
- 移除 VOD_SERVER 和 VOD_SERVER2 双服务器配置
- 新增 VOD_SERVERS 支持无限个 VOD 服务器
- 配置格式: 名称@URL,名称@URL,...
- 使用 Promise.allSettled 并发查询所有 VOD 服务器
- 单个服务器失败不影响其他服务器
- 调整默认源排序: 360 优先于 vod
- 添加 dotenv 支持本地开发
- 新增 .env.example 环境变量配置示例
Breaking Changes:
- 环境变量 VOD_SERVER 和 VOD_SERVER2 已废弃
- 请使用 VOD_SERVERS 替代
- 默认 VOD 服务器从 https://gctf.tfdh.top 改为 https://www.caiji.cyou
* feat: 添加通过视频URL直接获取弹幕的API接口
- 新增 POST /api/v2/comment/by-url 接口,支持通过视频URL直接获取弹幕
- 新增 getCommentByUrl 函数处理URL推送请求
- 支持 B站、腾讯、爱奇艺、优酷、芒果TV 等主流平台
- 优化 getComment 函数的平台判断逻辑(改为 if-else if)
* Update README.md
* 更新版本号 修正文档错误示例
2025-10-14 18:51:00 +08:00
huangxd-
bc320de259
增加upstash redis的支持,并修复一些bug ( #45 )
...
* 韩剧tv增加分类类型
* claw部署修改为不稳定不推荐
* 修复vod中集标题可能重复的问题,将后面出现的相同集标题的episode过滤,只对match自动匹配接口有效
* 修复360综艺集标题命名规范与vod不一致的问题
* 360综艺集可能存在乱序的情况,获取集后尝试进行排序
* 修改vod默认源为https://gctf.tfdh.top
* 增加upstash redis支持,用于持久化存储,不会因为冷启动而丢失过去的查询信息(在cf/eo/claw上配置后应该能更稳定点,但会稍微影响请求速度)
* 修复vod和vod2如果url重复导致vod2中episodes不全的问题
* 支持记住之前搜索title时手动选择的anime,并在后续的match自动匹配时优选该anime【实验性】
修复home页面json中episodeTitleFilter实际存在值但没有打印的问题
* commentId增加lastSelectMap上传redis
* 过滤favicon.ico请求的redis请求
2025-10-12 22:30:45 +08:00
huangxd-
7f1bd8b6bb
/api/v2/comment接口增加1分钟内同一IP只能请求三次的限制 ( #44 )
...
* /api/v2/comment接口增加1分钟内同一IP只能请求三次的限制
* 修改去重后的大写X改用小写x,且两边有空格
2025-10-08 22:40:59 +08:00
Elegy233
fae43c10b9
修复本地部署也默认开了巴哈姆特源 ( #43 )
...
* 修复本地部署标识,完善注释
* 将local标识改为node
2025-10-07 05:40:04 +08:00
huangxd-
aa99af1aac
Update README.md
2025-10-06 17:10:56 +08:00
huangxd-
5aeb07318f
修改readme
2025-10-06 16:48:47 +08:00
huangxd-
d09e9820a2
vercel/cloudflare默认开启巴哈姆特源 ( #42 )
...
* vercel/cloudflare默认开启巴哈姆特源
在home页面打印所有环境变量,用于确认配置的环境变量是否生效
* match接口增加从网盘命名 无忧渡.S01E01.2160p.WEB-DL.H265.DDP.5.1 中提取 title/season/episode,用于自动匹配
2025-10-06 16:38:06 +08:00
huangxd-
c458577595
增加支持巴哈姆特源以及vod2源支持 ( #41 )
...
* 刷新弹幕屏蔽词正则示例列表
* 增加支持巴哈姆特源
* 添加vod2源支持
* docker和node启动支持配置代理环境变量PROXY_URL
2025-10-06 14:46:49 +08:00
Elegy233
4b86f61bac
修复设置不去重时值无效 ( #39 )
2025-10-06 14:43:43 +08:00
huangxd-
f3ff8e76b7
删除重复的弹幕X前面的空格
2025-10-03 20:24:39 +08:00
huangxd-
a521188224
删除BLOCKED_WORDS示例值中的带空格的正则
2025-10-03 20:06:37 +08:00
huangxd-
f671fa758f
增加GROUP_MINUTE环境变量,合并去重分钟数,表示按n分钟分组后对弹幕合并去重,默认为1,最大值为30,0表示不去重 ( #38 )
...
* 增加GROUP_MINUTE环境变量,合并去重分钟数,表示按n分钟分组后对弹幕合并去重,默认为1,最大值为30,0表示不去重
* 将allowedPlatforms和vodAllowedPlatforms提取成全局变量
2025-10-03 19:51:01 +08:00
huangxd-
478afcf18b
Merge pull request #36 from woleigedouer/main
...
feat: 支持在match接口中通过@语法动态指定平台优先级
2025-10-03 19:16:47 +08:00
woleigedouer
b23169ac44
feat: 支持在match接口中通过@语法动态指定平台优先级
...
- 新增parseFileName函数解析@平台标识
- 新增createDynamicPlatformOrder动态调整平台顺序
- 支持多种@符号位置格式
- 保持向后兼容,不影响现有功能
- 支持的平台:qiyi, bilibili1, imgo, youku, qq, renren, hanjutv
2025-10-03 12:10:58 +08:00
huangxd-
e217c87df4
修复韩剧tv(韩小圈)弹幕源在hills和AfuseKt的问题
2025-10-02 22:24:47 +08:00