bilistalk 是一个自托管的 B 站直播自动跟踪和录播工具。
当前版本已经实现一个可运行的 MVP:
- 添加 B 站 UID、直播间 ID 或直播间链接。
- 持续轮询直播状态。
- 主播开播后自动创建录制任务。
- 通过录制引擎接口调用外部录制工具。
- 用 SQLite 保存目标、状态、任务、会话和事件。
- 用 Web 页面查看目标、录制、任务和日志。
- 用 Docker Compose 部署,并把配置、数据库、录播文件挂载到宿主机。
- 容易配置:用户只需要关心目标主播、录播目录和少数必要设置。
- 运行稳定:支持持久化状态、失败重试、健康检查、可恢复的任务状态。
- 使用舒服:默认参数保守清晰,页面能直接看到当前状态和错误原因。
- 引擎可替换:业务层负责跟踪、调度、状态和界面;录制引擎只是适配器。
当前 MVP 是一个单进程 Node.js 服务:
- 原生 HTTP API 和静态 Web 管理界面。
- 基于
node:sqlite的内置 SQLite 数据库。 - YAML 配置。
- B 站直播状态跟踪器。
- 带重试状态的录制调度器。
- 录制引擎接口。
streamlink录制适配器,支持 Cookie 文件和可用流探测。- Docker Compose 部署,持久化目录为
/config、/data、/recordings。
应用层不会把 UI、调度和 B 站跟踪逻辑绑定到某一个录制工具上。streamlink 只是第一个实现的引擎适配器。
本地运行需要 Node.js 24 或更高版本。真正录制时还需要本机 PATH 中存在 streamlink。
npm install
npm start打开:
http://127.0.0.1:27110
Docker 部署会在镜像里通过 Python 虚拟环境安装新版 streamlink:
docker compose up --build持久化目录:
./config:可选配置文件目录。./data:SQLite 数据库。./recordings:录播文件和元数据。
npm run check
npm test
npm start配置
-> 目标解析器
-> B站直播状态跟踪器
-> 录制调度器
-> 录制引擎适配器
-> 文件存储和元数据
-> Web 管理界面和事件日志
边界划分:
- B 站跟踪代码只负责判断目标是否开播。
- 调度器决定什么时候创建任务、开始录制、停止录制、重试或恢复。
- 录制引擎只负责执行录制命令并回报进程/会话状态。
- 存储逻辑负责文件名、目录、磁盘检查和元数据。
- Web 管理界面负责管理跟踪目标和展示状态,不包含录制业务逻辑。
server:
host: 0.0.0.0
port: 27110
data:
database_path: ./data/bilistalk.sqlite
storage:
output_dir: ./recordings
filename_template: "{date}/{streamer}/{start_time}_{title}"
file_extension: ".flv"
min_free_space_gb: 10
tracking:
check_interval_seconds: 30
request_timeout_seconds: 12
recording:
engine: streamlink
quality: best
auto_retry: true
retry_delays_seconds: [5, 15, 30, 60, 120, 300]
streamlink:
executable_path: streamlink
# 如果 B 站需要登录才能拿到更高清晰度,可以挂载 cookies.txt 后启用。
# 支持 Netscape cookies.txt、KEY=VALUE 行、KEY=VALUE; KEY2=VALUE2。
# cookie_file: /config/bilibili.cookies.txt
extra_args: []
targets:
- uid: 123456
name: example-streamer
- room_id: 654321大部分字段都有默认值。也可以不在 YAML 里写 targets,直接在 Web 管理界面中添加目标;界面添加的目标会写入 SQLite。
默认录制策略是 quality: best,也就是优先选择 Streamlink 能看到的最高流。管理界面中每个目标都有“探测”按钮,可以查看当前直播间对 Streamlink 暴露了哪些流。
如果只能探测到 source,或者实际录出来仍是 720p,通常不是前端设置问题,而是未登录请求、Streamlink 插件或 B 站接口只返回了这些流。需要更高画质时,优先配置 recording.streamlink.cookie_file,让 Streamlink 以登录态请求直播流。