Files
biliup-next/README.md

323 lines
8.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`