Commit Graph
86 Commits
Author SHA1 Message Date
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- 94a94bddf0 修改README,增加cookie-butler工具 2026-01-11 23:21:56 +08:00
huangxd- 53e81421a3 删除config.yaml配置支持,后续只支持.env配置文件 2026-01-11 23:10:01 +08:00
huangxd- edb794bfb9 配置优先级调整为:系统环境变量 > .env 文件 > config.yaml 文件 (#140)
* 优化系统配置没权限提醒

* 配置优先级调整为:系统环境变量 > .env 文件 > config.yaml 文件
2026-01-08 23:06:25 +08:00
Elegy233 435e22210a 为bilibili支持解析服务器实现港澳台搜索*2,为云部署支持反向代理 (#139)
* 去除反向代理相关判断,即将迁移至globals.js文件

* 增加反向代理相关判断,为云部署支持反向代理配置

* 增加流式传输方法,增加外部中断控制器

b站app接口无结果会返回高达3.69mb的推荐数据,这是人啊*2
外部中断控制器实现了原始搜索成功真打断tmdb搜索

* 支持外部随时传入的真中断,同时实现并发请求合并

* 去除非必要的点位检查,同时使用新的代理URL构建

* 实现web与app接口的港澳台番剧搜索与获取

目前只能通过万能反代或特定反代开启。实际实现很简单,但因为全网没有一个喂饭教程所以踩了超级超级多的坑,但也是多亏了踩坑现在对于港澳台的兼容非常非常健壮😵*2

* 更新说明

* 更新说明

* 更新文档
2026-01-08 23:02:16 +08:00
huangxd- e4b763a2c8 Revert "为bilibili支持解析服务器 实现港澳台搜索 (App/Web双模) (#129)" (#131)
This reverts commit 762634754e.
2026-01-05 06:59:43 +08:00
huangxd- a7392ee394 增加sohu源 (#130)
* 补充README

* 增加搜狐视频源

* 替换URLSearchParams

* 增加搜狐弹幕分片并发请求

* 修复docker场景不存在.env时自动创建的问题

* 修改版本号

* 修改docker-image构建flow条件

* 修改镜像构建触发条件

* 修复sohu源buildQueryString缺失的问题
2026-01-04 21:32:04 +08:00
Elegy233 762634754e 为bilibili支持解析服务器实现港澳台搜索 (App/Web双模) (#129)
* 增加Bilibili专用反代判断和流式传输支持

* 增加流式传输方法,解决港澳台庞大数据读取缓慢堵塞

b站app接口无结果会返回高达3.69mb的数据,这是人啊

* 实现web与app接口的港澳台番剧搜索与获取

实际实现很简单,但因为全网没有一个喂饭教程所以踩了超级超级多的坑,但也是多亏了踩坑现在对于港澳台的兼容非常非常健壮😵

* 更新PROXY_URL说明

* 更新平台列表与注意事项

* Fix duplicate bilibili proxy URL instructions

Removed duplicate instructions for enabling bilibili proxy URL in the README.

* 更新cookie

* 更新注意事项

* 添加返回接口报错信息,添加App接口失败回落至Web接口

* 更新BILIBILI_COOKIE说明

* 修复流式输式中断被当成请求失败回落至web接口

* 修复缩进

* 去掉bilibili-overseas

* Update .env.example

* Update config.yaml.example

* Update .env.example

* Update config.yaml.example
2026-01-04 21:29:10 +08:00
huangxd- f6eb744473 修改docker打包流水线非main分支在镜像版本号后加-test (#125) 2025-12-29 23:17:02 +08:00
huangxd- f199f69d8b 支持自定义弹幕源 (#121)
* 解决api配置反代后的ui路径问题

* ui修改body和header背景色

* 修复segmentcomment接口调试时format选择xml不生效的问题

* Revert "修复segmentcomment接口调试时format选择xml不生效的问题"

This reverts commit 997a101cb0537d95ebdb62e9f1267af7e94475a9.

* 修复分片弹幕请求xml还是返回json的问题

* 支持自定义弹幕源

* 修复在反代场景下api端点显示

* 修复导航栏标签切换问题

* 修复iqiyi源的弹幕emoji不显示的问题

* 完善readme中的项目结构

* 修改小版本号
2025-12-28 11:02:50 +08:00
huangxd- 3022f14fdf Feature: 支持分片弹幕接口并增加一键导出forward弹幕插件 (#118)
支持分片弹幕接口

/api/v2/comment 请求时支持定义 segmentflag=true 参数,用于请求弹幕分片列表
/api/v2/segmentcomment 通过comment接口返回体中的Segment类JSON数据获取单独一个分片的弹幕数据
增加一键导出forward弹幕插件,使用命令 node build-forward-widget.js

修复youku弹幕里color是字符串导致返回的格式错误的问题
2025-12-24 22:38:36 +08:00
huangxd- f1bb15ef20 修复一些小问题 v.1.9.2 (#108)
* 切换日志查看模块时立即刷新一次日志

* .env和config.yaml挪到config目录下,后续docker要加载配置文件,请挂载./config:/app/config目录,并在config目录中创建.env或config.yaml文件

* 修复b站和爱奇艺平台的优选不生效问题

* 更新小版本号
2025-12-09 23:38:05 +08:00
huangxd- 56d95439c7 fix: 修复一些问题 (#107) 2025-12-09 00:02:32 +08:00
huangxd- 995d5f10e0 feature: 新增UI支持 (#105)
* 增加环境变量处理类

* 完善node-handler.js

* 完善node-handler.js

* 完善vercel-handler.js

* 增加netlify-handler

* 修改netlify-handler.js

* 完善netlify-handler.js

* 增加cloudflare-handler.js

* 完善cloudflare-handler.js

* 完善cloudflare-handler.js

* 新增edgeone-handler.js

* edgeone和vercel增加部署函数

* 增加部署平台环境变量配置指南

* 优化小点

* 增加UI界面,非真实数据,main.js待后续拆分

* 增加当前版本和最新版本通过后端接口获取

* 修复云端部署的问题

* 前端使用分离文件模块

* 前端使用分离文件模块

* 在html和script上使用globals全局变量信息

* 使用 Language Injection 注释,支持语法高亮、补全、格式化、跳转

* 清理ui无用文件

* 优化缓存清理和重新部署确认弹窗UI

* 修改调试api

* 使用正式调试api返回数据

* 完善接口调试实际接口数据

* 日志查看调用真实数据

* 修改成系统配置

* 合并冲突

* 配置预览使用真实数据

* 提取log接口函数到system-api

* ui上增加API端点展示

* 系统配置里的环境变量使用真实数据

* 删除添加配置按钮,优化变量值输入框

* 系统设置环境变量从原始环境变量获取

* 增删改环境变量对接真实数据

* 修复ui请求报401的问题

* 优化deployPlatform

* 数字类型的环境变量增加最小值和最大值限制

* 重新部署对接真实接口

* 修复云服务部署

* 日志中隐藏敏感字符

* 清理缓存打通真实数据接口

* 将main.js中的css提取到css文件中

* 增加ADMIN_TOKEN环境变量

* 完善admin_token访问权限控制

* 增加NODE_TLS_REJECT_UNAUTHORIZED,用于控制在建立 HTTPS 连接时是否验证服务器的 SSL/TLS 证书

* 所有alert都替换成自定义样式弹窗

* 增加部署平台的检查,如果没有配置部署相关的环境变量,也提示需要配置

* 没有token的情况下访问不了日志查看和接口调试

* 增加推送弹幕模块

* 修复推送弹幕

* 推送弹幕界面当点击一个anime获取到剧集列表后直接跳转到剧集列表处

* 弹幕推送ui适配手机样式

* 推送弹幕中的按钮修改为点击后加载转圈

* 推送校验地址挪到推送按钮

* 所有确认弹窗都改成适配ui样式

* 优化API端点显示

* 修复如果是默认token则用admin_token访问不了的问题

* 抽出css到css文件

* 修改handler-factory.js,将各个import的语句挪到switch相对应的case里,延迟引入

* 测试下

* 再测试下

* 尝试解决cloudflare和edgeone部署失败

* 再次尝试解决cloudflare和edgeone部署失败

* 再次尝试解决cloudflare和edgeone部署失败+1

* 再次尝试解决cloudflare和edgeone部署失败+2

* 再次尝试解决cloudflare和edgeone部署失败+3

* 再次尝试解决cloudflare和edgeone部署失败+4

* 修复弹幕推送跨域问题

* 修改标题等小细节

* 修复一些小细节

* 添加ui界面的readme

* 将handlers下的README挪到UI目录下的README

* 修改readme

* readme增加目录指引

* 刷新目录结构

* main.js中的init里的非函数抽出函数

* 拆分main.js,单独拆出preview.js

* 抽出日志查看模块

* 提取出接口调试部分

* 提取出弹幕推送模块

* 抽出系统配置模块js

* 更新项目结构

* 配置预览优化显示

* 系统配置变量值背景色修改

* 修改右上角的五个按钮布局

* 修复token非默认值的情况下api端点直接显示了token的问题

* 修复在非默认值TOKEN的情况下访问url api端点显示了token的问题

* 修改README

* 增加日志打印deployPlatform

* 调试vercel参数

* 修复vercel平台部署被判断为cloudfalre的问题

* 修复/api/config获取在没有权限的情况下不应该返回私密信息的问题

* 修复api/config接口的权限问题

* 修复日志查看、接口调试和推送弹幕模块默认token场景下没有token也能访问

* 优化currentToken获取

* main.js中部分代码挪到其他js

* 测试vercel部署方式判断

* 修复部署平台参数的问题

* 修复部署平台的几个参数问题

* 修复没有环境变量的情况下设置失败的问题

* 挪动修改环境变量代码

* 修改环境变量描述

* 修改变量的值和描述的字体颜色

* 修改cloudflare才是需要DEPLOY_PLATFROM_ACCOUNT的平台

* 添加环境变量修改后说明

* 修改重新部署时长

* 修改版本号
2025-12-07 16:42:16 +08:00
xiaoQQya 55da0c489e 支持弹幕颜色转换为随机彩色 (#103)
* feat: 支持随机彩色弹幕

* v1.8.1
2025-11-29 21:24:16 +08:00
huangxd- e1fb096a81 完善PLATFORM_ORDER环境变量说明 2025-11-26 07:34:15 +08:00
huangxd- 81ea65441a 新增弹弹play源,使用的是开源第三方接口,感谢开源项目 https://github.com/Mr-Quin/danmaku-anywhere 2025-11-25 23:48:38 +08:00
huangxd- 7df3047260 修改小版本号及相应README 2025-11-22 07:55:07 +08:00
huangxd- 4e9e25e0eb 1. 修复vod设置fastest模式下match自动匹配可能搜索结果不存在上次手动选择的animeId的问题
2. match自动匹配适配标题格式`爱情公寓.ipartment.2009.S03E05.H.265.25fps.mkv`
2025-11-18 21:59:38 +08:00
huangxd- 4dbe4aff34 本地和Docker部署支持实时保存缓存到文件 2025-11-15 09:15:29 +08:00
huangxd- b65d27ad9f 弹幕分片下载请求已加入重试机制,重试次数为1次 2025-11-10 22:32:12 +08:00
huangxd- 9f7b6334fd 添加环境变量TITLE_TO_CHINESE,表示是否在match自动匹配时将外语标题转换成中文标题,适用于网盘没有刮削的资源 2025-11-09 20:54:55 +08:00
huangxd- 80869079ce 支持DANMU_LIMIT环境变量,用于等间隔采样限制弹幕总数,且修改TOKEN默认的情况下api中可以不用填写token 2025-11-09 14:04:42 +08:00
huangxd- 9d72069918 douban源和tmdb源修复某些剧名不一致导致过滤的问题以及其他小修小补 (#88)
* 优化根据imdbid获取豆瓣信息

* douban源过滤一些不是电影/电视剧的类型

* douban源和tmdb源修复某些剧名不一致导致过滤的问题
2025-11-08 08:54:35 +08:00
huangxd- 61dc1b05d3 feat: 增加TMDB源 (#86)
* 优化:如果查询关键字为空,则直接返回[]
增加imdb-util,用于请求imdb相关接口

* 增加douban-util,用于请求豆瓣相关API接口

* 增加douban-util,用于请求豆瓣相关API接口

* 增加TMDB源

* 完善TMDB源

* 源内年份相同的anime按标题字数少的靠前排序

* 修复万能反代问题
2025-11-07 00:00:15 +08:00
Elegy233 e5e8443f98 代理优化,增加几个繁简转换字 (#85)
* 增加係蹟隻闢闆妳

* 严谨现有Netlify反代教程说明

* 给tmdb加代理

* 规范URL构建

* 拆分反代模式

* 拆分反代模式

* 拆分反代模式

* 拆分反代模式

* 不拆分合并

* 不拆分合并

* 不拆分合并

* Update README.md

* Update .env.example

* 将裡这个繁体字调整到裏前面,解决彈珠汽水瓶裡的千歲同學这部番没有结果

进行简转繁搜索的时候“里”先索引到了“裏”,导致转换后是“彈珠汽水瓶裏的千歲同學”,然后无结果

* 1.6.8

* 修复缺少逗号

* 统一特定反代的叫法

* 优化代码逻辑
2025-11-04 19:32:22 +08:00
huangxd- c482f58c38 豆瓣源anime增加电影/电视剧细分类型,补充繁简转换字体 2025-11-01 20:25:00 +08:00
woleigedouer c04a11ffc1 小修小改 (#82)
* Fix:为所有源处理器添加全面的错误处理

* feat: 添加 YAML 配置文件支持

新增功能:
- 添加 js-yaml 依赖用于解析 YAML 配置文件
- 实现 YAML 配置加载和转换功能
  * loadYamlConfig() - 加载和解析 config.yaml 文件
  * applyYamlConfig() - 将 YAML 配置转换为环境变量(支持递归嵌套对象)
- 扩展文件监听机制,同时支持 .env 和 config.yaml 热更新

* feat: 实现空格无关的标题匹配,解决搜索结果不一致问题

* Update globals.js
2025-10-31 17:11:16 +08:00
huangxd- 4e07d2daa4 feat: 新增豆瓣源支持 (#81)
* 单独提取出REMEMBER_LAST_SELECT环境变量:是否记住手动选择结果,用于match自动匹配时优选上次的选择,默认为`true`,表示记住

* 再增加部分数据模型校验

* 新增豆瓣源支持
2025-10-31 00:12:38 +08:00
huangxd- 1406bd8148 修复cloudflare上环境变量不生效的问题 (#78)
* 修复cloudflare上环境变量不生效的问题

* 将源的初始化提到文件开头,避免重复创建多个对象

* 修改小版本号
2025-10-27 22:42:26 +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- 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- 6461d04052 更新README 2025-10-20 21:50:38 +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
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
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
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