YTB2BILI 是一个专为内容创作者打造的智能视频搬运工具。通过整合 yt-dlp、Whisper AI、DeepSeek/Gemini 等先进技术,实现从 YouTube/TikTok 等平台到 Bilibili 的零人工介入全流程自动化。
- ✅ 完全自动化 - 从下载到发布,仅需提供视频链接
- 🧠 AI 驱动 - 智能字幕生成、多语言翻译、元数据优化
- ⚡ 定时发布 - 智能调度避免频控,支持每小时自动上传
- 🔄 失败重试 - 任务级精细化控制,支持单步骤重试
- 📊 可视化管理 - 现代化 Web 管理界面,实时监控任务状态
- 🐳 Docker 一键部署 - 预构建镜像,开箱即用,支持 amd64 / arm64
系统采用责任链模式,将视频处理拆解为独立任务步骤:
📥 下载视频 → 🎤 提取音频 → 📝 生成字幕 → 🌐 翻译字幕
→ 📷 下载封面 → 🤖 生成元数据 → 📤 上传B站 → 📝 上传字幕
每个步骤支持独立执行、失败重试,状态实时可查。
- 支持 YouTube、TikTok、Twitter 等 1000+ 平台
- 自动选择最高清晰度(支持 4K)
- 智能元数据提取(标题、描述、标签、播放量等)
- 本地离线生成,无需依赖第三方 API
- 支持 90+ 种语言自动识别
- 生成带时间轴的 SRT 格式字幕
- DeepSeek - 高质量 AI 翻译,上下文理解强,价格低廉
- OpenAI - GPT 系列模型
- 兼容 OpenAI 接口 - OpenRouter / 本地 Ollama 等均可接入
- 标题优化 - 符合 B站 SEO,提升推荐率
- 简介生成 - 自动总结视频内容,添加关键词
- 标签提取 - 分析视频内容,生成相关话题标签
- 大文件分片上传,支持 GB 级视频稳定上传
- 可选腾讯云 COS 加速
- 自动投稿,配置版权、分区、封面等
- 视频发布后自动追加多语言 CC 字幕
镜像已预装 yt-dlp、FFmpeg、Whisper,无需额外安装任何依赖,5 分钟即可完成部署。
新建工作目录并获取配置文件(二选一):
方式 A:直接下载(无需克隆整个仓库)
mkdir ytb2bili && cd ytb2bili
curl -fsSL https://raw.githubusercontent.com/difyz9/ytb2bili-docker/main/config.toml \
-o config.toml
curl -fsSL https://raw.githubusercontent.com/difyz9/ytb2bili-docker/main/docker-compose.yml \
-o docker-compose.yml方式 B:克隆本仓库后使用 docker/ 目录下的文件
git clone https://github.com/difyz9/ytb2bili.git
cd ytb2bili/docker
cp config.toml.example config.toml数据库部分无需改动,默认已与
docker-compose.yml保持一致。
打开 config.toml,只需配置 LLM 翻译服务(三选一):
首先开启翻译开关:
[workflow]
llm_translation_enabled = true
llm_translation_source_lang = "en" # 原始字幕语言
llm_translation_target_lang = "zh-Hans" # 目标语言(简体中文)
llm_translation_batch_size = 25 # 每批翻译字幕条数
llm_translation_max_workers = 3 # 并发翻译协程数然后按需选择 LLM 服务:
方案 A — DeepSeek(推荐,中文效果好,价格低)
[agent.llm]
provider = "deepseek"
api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxx"
model = "deepseek-chat"方案 B — OpenAI
申请 Key:https://platform.openai.com
[agent.llm]
provider = "openai"
api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxx"
model = "gpt-4o-mini" # 速度快、价格低;换 gpt-4o 效果更好方案 C — 兼容 OpenAI 接口(OpenRouter / 本地 Ollama 等)
# OpenRouter 示例
[agent.llm]
provider = "openai"
api_key = "sk-or-v1-xxxxxxxxxxxxxxxx"
base_url = "https://openrouter.ai/api/v1"
model = "anthropic/claude-3.5-sonnet"# 本地 Ollama 示例
[agent.llm]
provider = "openai"
api_key = "ollama"
base_url = "http://host.docker.internal:11434/v1"
model = "qwen2.5:14b"docker compose up -d首次启动会自动拉取镜像并等待 MySQL 就绪(约 30 秒),可用以下命令查看进度:
docker compose logs -f启动成功后,访问以下地址:
| 服务 | 地址 |
|---|---|
| Web 管理后台 | http://localhost:8096 |
| MySQL(调试用) | localhost:3309 |
- 打开
http://localhost:8096 - 进入 设置 → B站账号
- 用 Bilibili App 扫码完成授权
- Cookie 自动保存,后续无需重复登录
提示:Cookie 有效期约 30 天,过期后需重新扫码登录。
- 进入 任务 → 新建任务
- 粘贴 YouTube / TikTok 等平台的视频链接
- 点击 创建,系统自动依次执行:
- 下载视频(yt-dlp)
- 提取音频,Whisper 生成字幕
- LLM 翻译字幕
- AI 生成标题 / 简介 / 标签
- 上传到 B站并追加字幕
# 查看实时日志
docker compose logs -f ytb2bili
# 升级到最新版本
docker compose pull && docker compose up -d
# 停止服务(保留数据)
docker compose down
# 彻底清除(含数据库数据)
docker compose down -vservices:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: your_password
MYSQL_DATABASE: bili_up
MYSQL_USER: ytb2bili
MYSQL_PASSWORD: ytb2bili@123
volumes:
- ./mysql_data:/var/lib/mysql # 数据库文件持久化到本地
ports:
- "3309:3306" # 宿主机 3309 → 容器 3306
ytb2bili:
image: difyz9/ytb2bili:latest # 从 Docker Hub 拉取预构建镜像
depends_on:
mysql:
condition: service_healthy # 等待 MySQL 健康检查通过
ports:
- "8096:8096"
volumes:
- ./config.toml:/app/config.toml # 挂载配置文件
- ./logs:/app/do # 日志目录
- ./downloads:/app/downloads # 视频下载目录
environment:
- TZ=Asia/Shanghai镜像支持
linux/amd64和linux/arm64(Apple Silicon Mac、树莓派 4/5)。
数据库配置
[database]
type = "mysql"
host = "mysql" # Docker Compose 服务名,无需改动
port = 3306
user = "ytb2bili"
password = "ytb2bili@123"
dbname = "bili_up"
timezone = "Asia/Shanghai"
auto_migrate = true视频处理工作流
[workflow]
download_dir = "./downloads" # 视频下载目录
ytdlp_path = "/usr/local/bin/yt-dlp" # 镜像内已预装
ffmpeg_path = "/usr/bin/ffmpeg" # 镜像内已预装
# 代理(可选,用于访问受限地区视频)
# proxy_url = "http://127.0.0.1:7890"
# Cookies 文件路径(可选,用于下载需要登录才能看的视频)
# cookies_file = "/path/to/cookies.txt"
# LLM 翻译
llm_translation_enabled = true
llm_translation_batch_size = 25
llm_translation_max_workers = 3
llm_translation_context_size = 2
llm_translation_source_lang = "en"
llm_translation_target_lang = "zh-Hans"LLM 翻译配置(三选一)
# DeepSeek(推荐)
[agent.llm]
provider = "deepseek"
api_key = "sk-..."
model = "deepseek-chat"
# OpenAI
# [agent.llm]
# provider = "openai"
# api_key = "sk-..."
# model = "gpt-4o-mini"
# 自定义兼容接口
# [agent.llm]
# provider = "openai"
# api_key = "..."
# base_url = "https://your-endpoint/v1"
# model = "your-model"腾讯云 COS 配置(可选,大文件加速)
[tencos]
enabled = true
cos_bucket_url = "https://your-bucket.cos.ap-guangzhou.myqcloud.com"
cos_secret_id = "AKIDxxxxxxxx"
cos_secret_key = "xxxxxxxx"
cos_region = "ap-guangzhou"
cos_bucket = "your-bucket-name"
sub_app_id = "125xxxxxx"启用 COS 后,上传速度可提升 3-5 倍,支持超大文件(>4GB)分片续传。
自动更新配置
[updater]
enabled = true
auto_update = false # 建议设为 false,手动执行 docker compose pull 更新
check_interval = 24 # 检查更新间隔(小时)系统创建任务后自动执行以下步骤:
1. 📥 下载视频 [约 1-5 分钟]
2. 🎤 提取音频 [约 10-30 秒]
3. 📝 Whisper 生成字幕 [约 1-10 分钟,取决于视频长度]
4. 🌐 LLM 翻译字幕 [约 30 秒-2 分钟]
5. 📷 下载封面 [约 5-10 秒]
6. 🤖 AI 生成元数据 [约 20-60 秒]
7. 📤 上传到 Bilibili [约 5-30 分钟,取决于视频大小]
8. 📝 追加 CC 字幕 [约 10-30 秒]
如果某个步骤失败,在"任务详情"页面找到红色标记的步骤,点击"重试"即可单步重试,无需从头开始。
常见失败原因:
- 下载失败 - 视频已删除或地区限制 → 在配置中添加
proxy_url - 翻译失败 - API Key 无效或额度耗尽 → 检查 Key 或更换引擎
- 上传失败 - Cookie 过期 → 重新扫码登录;大文件 → 启用 COS 加速
通过 yt-dlp 支持 1000+ 平台,常用平台包括:
- YouTube (
youtube.com,youtu.be) - TikTok (
tiktok.com) - Twitter / X (
twitter.com,x.com) - Instagram (
instagram.com) - 完整平台列表
| 组件 | 技术选型 | 用途 |
|---|---|---|
| Web 框架 | Gin | HTTP 路由和中间件 |
| 依赖注入 | Uber FX | 模块化依赖管理 |
| ORM | GORM v2 | 支持 MySQL / PostgreSQL |
| 定时任务 | Robfig Cron v3 | 秒级精度调度器 |
| 日志系统 | Zap + Lumberjack | 结构化日志与自动轮转 |
| 认证鉴权 | JWT + Cookie | 双重认证机制 |
核心模块:
internal/chain_task- 任务链处理引擎(责任链模式)internal/handler- HTTP API 路由控制器pkg/translator- 多翻译引擎(工厂模式)pkg/subtitle- 字幕生成和格式转换pkg/cos- 腾讯云 COS 客户端封装
| 组件 | 技术选型 |
|---|---|
| 框架 | Next.js 15 (App Router) |
| 语言 | TypeScript 5 |
| UI | TailwindCSS 3 |
| 状态管理 | Zustand |
| HTTP 客户端 | Axios |
- yt-dlp - 视频下载
- FFmpeg - 音视频处理
- Whisper - 语音识别(本地运行,无额外 API 费用)
如需从源码构建,需要以下依赖:
- Go 1.24+
- Node.js 18+
- yt-dlp
- FFmpeg
- Whisper(
pip3 install openai-whisper) - MySQL 8.0+ 或 PostgreSQL 14+
git clone https://github.com/difyz9/ytb2bili.git
cd ytb2bili
# 编译前后端
make build
# 复制并配置文件
cp config.toml.example config.toml
# 编辑 config.toml,配置数据库和 LLM
# 启动服务
./ytb2biliQ: 首次启动很慢?
首次 docker compose up -d 会拉取镜像(含 Whisper 模型),根据网速需要几分钟。之后启动只需几秒。
Q: 视频下载失败 / 提示地区限制?
在 config.toml 中配置代理:
[workflow]
proxy_url = "http://127.0.0.1:7890" # 替换为实际代理地址Q: MySQL 端口是 3309 还是 3306?
容器内部使用 3306,宿主机映射到 3309(避免与本地已运行的 MySQL 冲突)。config.toml 中连接的是容器内部端口,无需修改。
Q: 如何查看 Whisper 字幕生成进度?
docker compose logs -f ytb2biliQ: 如何升级到新版本?
docker compose pull && docker compose up -d欢迎提交 Issue 和 Pull Request!
提交规范参考 Conventional Commits:
feat:新功能fix:Bug 修复docs:文档更新refactor:代码重构
本项目采用 MIT License 开源协议。
- yt-dlp - 视频下载核心
- OpenAI Whisper - 语音识别
- bilibili-go-sdk - B站 API 封装
- Gin - Web 框架
- Next.js - 前端框架
- GORM - ORM 框架