Skip to content

feat: 新增弹幕解析 API 服务并修复首行弹幕截断#177

Open
CharyeahOwO wants to merge 2 commits intochen310:masterfrom
CharyeahOwO:feat/danmaku-server
Open

feat: 新增弹幕解析 API 服务并修复首行弹幕截断#177
CharyeahOwO wants to merge 2 commits intochen310:masterfrom
CharyeahOwO:feat/danmaku-server

Conversation

@CharyeahOwO
Copy link

问题

原项目中默认的弹幕服务器 subtitle.chen310.repl.co 已经失效(Replit 免费服务下线),导致用户无法使用弹幕功能。

解决方案

1. 新增 danmaku-server/ 弹幕解析 API 服务

基于 FastAPI 编写了一个全新的、生产级的弹幕解析后端服务,功能完全兼容原有协议:

  • 弹幕转换GET /subtitle?cid={cid}&font=...&font_size=...&alpha=... — 从 B 站获取 XML 弹幕,转换为标准 .ass 字幕格式
    • 支持滚动弹幕(类型 1/2/3/6)、顶部弹幕(类型 5)、底部弹幕(类型 4)
    • 弹幕碰撞避免算法(基于轨道分配)
    • 支持完整样式参数(字体、字号、不透明度、显示区域、持续时间)
  • 字幕代理GET /subtitle?url={url} — 代理 B 站 JSON 字幕并转为 .ass 格式
  • BV 号解析GET /subtitle?bvid={bvid} — 自动从 BV 号解析 cid
  • 健康检查GET /healthGET /ping

生产级特性:

  • ✅ CORS 全开放(支持反代 + CDN)
  • ✅ Gunicorn + Uvicorn Worker 生产级部署
  • ✅ 内存级 IP 限流(60 请求/分钟)
  • ✅ Docker + docker-compose 一键部署(CPU 0.5 核、内存 256M 资源限制)
  • ✅ 基于 Python 3.12 Alpine 的极简镜像、非 root 用户运行

2. 更新默认弹幕服务器地址

更新 Bilibili_Config.json 中的 danmaku.server

- "server": "https://subtitle.chen310.repl.co"
+ "server": "https://api.mulingowo.cn"

公益弹幕服务 https://api.mulingowo.cn 已上线运行,用户无需自行搭建即可使用。

3. 用户如需自行部署

cd danmaku-server
docker compose up -d --build

然后修改 Bilibili_Config.json:

"server": "https://你的域名"

文件变更

文件 说明
danmaku-server/main.py FastAPI 弹幕解析服务(~560 行)
danmaku-server/requirements.txt Python 依赖
danmaku-server/Dockerfile Python 3.12 Alpine 生产镜像
danmaku-server/docker-compose.yml 编排文件(端口 3000、资源限制、健康检查)
danmaku-server/.gitignore Python 项目忽略规则
Media/PlayParse/Bilibili_Config.json 更新弹幕服务器地址

测试验证

# 健康检查
$ curl https://api.mulingowo.cn/health
{"status":"ok"}

# 弹幕转换(以超电磁炮 cid=1176840 为例)
$ curl "https://api.mulingowo.cn/subtitle?cid=1176840"
[Script Info]
Title: Bilibili Danmaku
...
Dialogue: 0,0:00:00.00,0:00:15.00,Danmaku,,0,0,0,,{...}你指间跃动的电光,是我此生不变的信仰...

@CharyeahOwO CharyeahOwO changed the title feat: 新增弹幕解析 API 服务,替换已失效的外部弹幕服务器 feat: 新增弹幕解析 API 服务并修复首行弹幕截断 Mar 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant