323 lines
8.9 KiB
Markdown
323 lines
8.9 KiB
Markdown
# biliup-next
|
||
|
||
`biliup-next` 是当前仓库内独立运行的新流水线实现。
|
||
|
||
目标:
|
||
|
||
- 使用单 worker + 状态机替代旧 watcher 流程
|
||
- 提供独立控制面、配置系统和隔离 workspace
|
||
- 在 `biliup-next` 内独立运行完整主链路
|
||
|
||
## Current Scope
|
||
|
||
当前已实现:
|
||
|
||
- 文档基线
|
||
- 配置系统骨架
|
||
- SQLite 存储骨架
|
||
- 任务模型与任务仓库
|
||
- 最小 HTTP API
|
||
- 基础 CLI
|
||
- 隔离 workspace 运行
|
||
- `stage -> ingest -> transcribe -> song_detect -> split -> publish -> comment -> collection` 主链路
|
||
- session 级归并与交付
|
||
- 同主播、文件名时间相差 `3` 小时内的片段归入同一 session
|
||
- session 的 `session_key` 使用最早片段标题
|
||
- 同一 session 的纯享版只发布一个 BV
|
||
- 同一 session 的纯享版评论与完整版评论都按 `P1/P2/P3` 聚合
|
||
|
||
## Run
|
||
|
||
```bash
|
||
cd /home/theshy/biliup
|
||
PYTHONPATH=biliup-next/src python -m biliup_next.app.cli init
|
||
PYTHONPATH=biliup-next/src python -m biliup_next.app.cli doctor
|
||
PYTHONPATH=biliup-next/src python -m biliup_next.app.cli init-workspace
|
||
PYTHONPATH=biliup-next/src python -m biliup_next.app.cli worker --interval 5
|
||
PYTHONPATH=biliup-next/src python -m biliup_next.app.cli serve --host 127.0.0.1 --port 8787
|
||
```
|
||
|
||
推荐先执行一键初始化:
|
||
|
||
```bash
|
||
cd /home/theshy/biliup/biliup-next
|
||
bash setup.sh
|
||
```
|
||
|
||
它会完成:
|
||
|
||
- 创建 `biliup-next/.venv`
|
||
- `pip install -e .`
|
||
- 缺失时自动生成 standalone `settings.json`
|
||
- 初始化隔离 workspace
|
||
- 缺失时自动生成 runtime 模板文件
|
||
- 校验 `runtime/` 中的本地运行资产
|
||
- 执行一次 `doctor`
|
||
- 可选安装 `systemd` 服务
|
||
|
||
新机器冷启动步骤见:
|
||
|
||
- `docs/cold-start-checklist.md`
|
||
|
||
浏览器访问:
|
||
|
||
```text
|
||
http://127.0.0.1:8787/
|
||
```
|
||
|
||
旧控制台保留入口:
|
||
|
||
```text
|
||
http://127.0.0.1:8787/classic
|
||
```
|
||
|
||
当 `frontend/dist/` 存在时,Python API 会自动把 React 控制台托管为默认首页 `/`;旧控制台保留在 `/classic`。
|
||
|
||
控制台当前支持:
|
||
|
||
- 任务列表 / 步骤 / 产物查看
|
||
- `doctor` 检查查看
|
||
- 模块清单查看
|
||
- schema 驱动的 Settings 表单
|
||
- 高频参数优先展示,低频项收纳在 Advanced Settings
|
||
- 配置分组标题、排序和 featured 字段均由 `config/settings.schema.json` 控制
|
||
- `ui_widget`、placeholder 和分组说明也由 schema 决定
|
||
- `publish.retry_schedule_minutes` 支持按次配置上传重试间隔
|
||
- 默认第 1 次重试等待 15 分钟
|
||
- 第 2-5 次各等待 5 分钟
|
||
- 评论链路支持拆分:
|
||
- 纯享版 `bvid.txt` 下默认发布 session 级聚合歌单评论
|
||
- 同一 session 只由 anchor task 发一次,内容按 `P1/P2/P3` 分组
|
||
- 完整版主视频默认尝试发布 session 级“带时间轴评论”
|
||
- 同一 session 只由 anchor task 发一次,内容按 `P1/P2/P3` 分组
|
||
- 若找不到 `full_video_bvid.txt` 或匹配不到完整版视频,则主视频评论跳过
|
||
- 任务完成后支持可选清理:
|
||
- 删除 session 中的原始完整视频
|
||
- 删除 `split_video/` 目录中的纯享切片
|
||
- `settings.json` 原始 JSON 兜底编辑
|
||
- 敏感字段会显示为 `__BILIUP_NEXT_SECRET__`
|
||
- 保留占位符表示“不改原值”,改为空字符串才会清空
|
||
- 手动触发一轮 `worker`
|
||
- 单任务执行 / 指定 step 重试 / 重置到某一步后重跑
|
||
- 任务详情直接显示下一次重试时间、剩余等待时长和重试策略
|
||
- 控制台已重构为 `Overview / Tasks / Settings / Logs` 分区导航,任务页支持搜索、状态过滤和排序
|
||
- `systemd` 服务状态查看与 `start/stop/restart`
|
||
- 全局 Recent Actions 动作流,可按任务 / 状态 / action_name 过滤
|
||
- 系统日志查看,可按当前任务标题过滤
|
||
- 把本机现有视频导入隔离 `stage`
|
||
- 浏览器直接上传文件到隔离 `stage`
|
||
|
||
控制台操作手册见:
|
||
|
||
- `docs/control-plane-guide.md`
|
||
|
||
也可以直接使用项目内启动脚本:
|
||
|
||
```bash
|
||
cd /home/theshy/biliup/biliup-next
|
||
bash run-worker.sh
|
||
bash run-api.sh
|
||
```
|
||
|
||
安装后也可以直接使用 console script:
|
||
|
||
```bash
|
||
cd /home/theshy/biliup/biliup-next
|
||
./.venv/bin/biliup-next doctor
|
||
./.venv/bin/biliup-next worker --interval 5
|
||
./.venv/bin/biliup-next serve --host 127.0.0.1 --port 8787
|
||
```
|
||
|
||
快速冒烟测试:
|
||
|
||
```bash
|
||
cd /home/theshy/biliup/biliup-next
|
||
bash smoke-test.sh
|
||
bash cold-start-smoke.sh
|
||
```
|
||
|
||
## Runtime
|
||
|
||
默认工作目录全部在 `biliup-next/data/workspace/` 下:
|
||
|
||
- `stage/`
|
||
- `backup/`
|
||
- `session/`
|
||
- `biliup_next.db`
|
||
|
||
运行资产默认都位于 `biliup-next/runtime/`:
|
||
|
||
- `runtime/cookies.json`
|
||
- `runtime/upload_config.json`
|
||
- `runtime/biliup`
|
||
- `runtime/logs/api.log`
|
||
- `runtime/logs/worker.log`
|
||
|
||
`run-api.sh` 和 `run-worker.sh` 现在会自动把 stdout/stderr 追加写入对应日志文件,同时保留终端输出;控制台 `Logs` 页会直接读取这些日志文件。
|
||
|
||
默认日志轮转策略:
|
||
|
||
- 单文件上限 `20 MiB`
|
||
- 保留最近 `5` 个历史文件
|
||
- 可通过环境变量覆盖:
|
||
- `BILIUP_NEXT_LOG_MAX_BYTES`
|
||
- `BILIUP_NEXT_LOG_BACKUPS`
|
||
|
||
如果你要把当前机器上已有版本复制到本地 runtime,可以执行:
|
||
|
||
```bash
|
||
cd /home/theshy/biliup/biliup-next
|
||
./.venv/bin/biliup-next sync-legacy-assets
|
||
```
|
||
|
||
这会把当前可用的:
|
||
|
||
- `cookies.json`
|
||
- `upload_config.json`
|
||
- `biliup`
|
||
|
||
复制到 `biliup-next/runtime/`,并把 `settings.json` 切换到本地副本。
|
||
|
||
## Comment And Cleanup
|
||
|
||
评论默认分成两条:
|
||
|
||
- `comment.post_split_comment = true`
|
||
- 纯享版视频下发布 session 级聚合编号歌单评论
|
||
- 同一 session 只发一次
|
||
- 内容按 `P1/P2/P3` 分组
|
||
- `comment.post_full_video_timeline_comment = true`
|
||
- 尝试在完整版主视频下发布 session 级带时间轴置顶评论
|
||
- 同一 session 只发一次
|
||
- 内容按 `P1/P2/P3` 分组
|
||
- 依赖 `full_video_bvid.txt` 或通过标题匹配解析到完整版 BV
|
||
|
||
清理默认关闭:
|
||
|
||
- `cleanup.delete_source_video_after_collection_synced = false`
|
||
- `cleanup.delete_split_videos_after_collection_synced = false`
|
||
|
||
只有在任务进入 `collection_synced` 后,才会按配置执行清理。
|
||
|
||
## Full Video BV Input
|
||
|
||
完整版 `BV` 目前支持 3 种来源:
|
||
|
||
- `stage/*.meta.json` 中的 `full_video_bvid`
|
||
- 前端 / API 手工绑定
|
||
- webhook:`POST /webhooks/full-video-uploaded`
|
||
|
||
推荐 webhook 负载:
|
||
|
||
```json
|
||
{
|
||
"session_key": "王海颖:20260402T2203",
|
||
"source_title": "王海颖唱歌录播 04月02日 22时03分",
|
||
"streamer": "王海颖",
|
||
"room_id": "581192190066",
|
||
"full_video_bvid": "BV1uH9wBsELC"
|
||
}
|
||
```
|
||
|
||
如果 webhook 先于片段 ingest 到达,`biliup-next` 会先把它持久化;后续同 `session_key` 或 `source_title` 的任务进入时会自动继承该 `BV`。
|
||
|
||
## Session Rules
|
||
|
||
当前默认 session 归并规则是最小启发式实现:
|
||
|
||
- 从文件名解析 `streamer + 日期时间`
|
||
- 同一 `streamer`
|
||
- 时间相差在 `3` 小时内
|
||
- 归到同一个 session
|
||
- `session_key` 直接使用最早片段标题
|
||
|
||
例如:
|
||
|
||
- `Self-test 04月04日 09时23分`
|
||
- `Self-test 04月04日 09时25分`
|
||
- `Self-test 04月04日 09时27分`
|
||
|
||
会归到同一个:
|
||
|
||
```text
|
||
session_key = Self-test 04月04日 09时23分
|
||
```
|
||
|
||
在同一个 session 内:
|
||
|
||
- 只有最早片段对应的 anchor task 会真正执行纯享版上传
|
||
- 上传时会聚合整个 session 下所有 `split_video`
|
||
- 成功后整组 task 共用同一个 `bvid.txt`
|
||
- 纯享版评论与完整版评论也都只由 anchor task 发送一次
|
||
|
||
推荐 webhook 也使用同一个最早标题作为 `session_key` / `source_title`,这样完整版 `BV` 能稳定命中整组任务。
|
||
|
||
## Security
|
||
|
||
控制台支持可选 token 保护:
|
||
|
||
- 配置项:`runtime.control_token`
|
||
- 默认值为空,表示不启用认证
|
||
- 配置后,除 `/` 和 `/health` 外,其余 API 都要求请求头 `X-Biliup-Token`
|
||
- 控制台首页可在顶部输入并保存 token,浏览器会保存在本地 `localStorage`
|
||
|
||
## systemd
|
||
|
||
模板位于:
|
||
|
||
- `systemd/biliup-next-worker.service.template`
|
||
- `systemd/biliup-next-api.service.template`
|
||
- `install-systemd.sh`
|
||
|
||
使用前把模板中的这些占位符替换成实际值:
|
||
|
||
- `__PROJECT_DIR__`
|
||
- `__USER__`
|
||
- `__GROUP__`
|
||
- `__PYTHON_BIN__`
|
||
|
||
推荐先启动 `worker`,`api` 可以单独开。
|
||
|
||
在当前机器上直接安装:
|
||
|
||
```bash
|
||
cd /home/theshy/biliup/biliup-next
|
||
bash install-systemd.sh
|
||
```
|
||
|
||
脚本会自动:
|
||
|
||
- 按当前目录渲染 unit
|
||
- 安装到 `/etc/systemd/system/`
|
||
- `daemon-reload`
|
||
- `enable --now` 启动 `worker` 和 `api`
|
||
|
||
## Bilibili URL Ingest
|
||
|
||
现在也支持直接给 B 站视频链接创建任务。
|
||
|
||
CLI:
|
||
|
||
```bash
|
||
cd /home/theshy/biliup/biliup-next
|
||
PYTHONPATH=src python -m biliup_next.app.cli create-task \
|
||
--source-type bilibili_url \
|
||
"https://www.bilibili.com/video/BVxxxxxxxxxx"
|
||
```
|
||
|
||
API:
|
||
|
||
```bash
|
||
curl -X POST http://127.0.0.1:8787/tasks \
|
||
-H 'Content-Type: application/json' \
|
||
-d '{
|
||
"source_type": "bilibili_url",
|
||
"source_url": "https://www.bilibili.com/video/BVxxxxxxxxxx"
|
||
}'
|
||
```
|
||
|
||
相关配置:
|
||
|
||
- `ingest.provider = bilibili_url`
|
||
- `ingest.yt_dlp_cmd = yt-dlp`
|