Commit Graph
131 Commits
Author SHA1 Message Date
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