Files
biliup-next/README.md

8.9 KiB
Raw Blame History

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

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

推荐先执行一键初始化:

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

浏览器访问:

http://127.0.0.1:8787/

旧控制台保留入口:

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

也可以直接使用项目内启动脚本:

cd /home/theshy/biliup/biliup-next
bash run-worker.sh
bash run-api.sh

安装后也可以直接使用 console script

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

快速冒烟测试:

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.shrun-worker.sh 现在会自动把 stdout/stderr 追加写入对应日志文件,同时保留终端输出;控制台 Logs 页会直接读取这些日志文件。

默认日志轮转策略:

  • 单文件上限 20 MiB
  • 保留最近 5 个历史文件
  • 可通过环境变量覆盖:
    • BILIUP_NEXT_LOG_MAX_BYTES
    • BILIUP_NEXT_LOG_BACKUPS

如果你要把当前机器上已有版本复制到本地 runtime可以执行

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 手工绑定
  • webhookPOST /webhooks/full-video-uploaded

推荐 webhook 负载:

{
  "session_key": "王海颖:20260402T2203",
  "source_title": "王海颖唱歌录播 04月02日 22时03分",
  "streamer": "王海颖",
  "room_id": "581192190066",
  "full_video_bvid": "BV1uH9wBsELC"
}

如果 webhook 先于片段 ingest 到达,biliup-next 会先把它持久化;后续同 session_keysource_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分

会归到同一个:

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__

推荐先启动 workerapi 可以单独开。

在当前机器上直接安装:

cd /home/theshy/biliup/biliup-next
bash install-systemd.sh

脚本会自动:

  • 按当前目录渲染 unit
  • 安装到 /etc/systemd/system/
  • daemon-reload
  • enable --now 启动 workerapi

Bilibili URL Ingest

现在也支持直接给 B 站视频链接创建任务。

CLI

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

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