YTB2BILI:YouTube 到 Bilibili 自动化转载系统完全指南

系统概述

YTB2BILI 是一个功能完整的视频自动化处理系统,专为内容创作者设计,能够实现从 YouTube 等平台下载视频,自动生成字幕、翻译内容、生成元数据,并定时上传到 Bilibili 的一站式解决方案。该系统采用模块化设计,通过智能任务链处理引擎,将复杂的视频处理流程分解为可控步骤,大幅提升内容转载效率。

核心功能详解

智能视频处理链

系统采用四步准备流程实现实时视频处理:

  1. 字幕生成:集成 Whisper AI 技术,自动识别视频语音并生成高质量字幕文件。支持多语言识别,准确率高达 95% 以上,平均处理时间 2-5 分钟(取决于视频长度)。
  2. 封面下载:自动获取视频原始封面,上传至腾讯云 COS 存储,生成 CDN 访问链接。支持高清封面下载,处理时间通常在 10-30 秒内完成。
  3. 字幕翻译:提供百度翻译和 DeepSeek AI 两种翻译方案,支持多语言互译。翻译过程智能化处理,保留时间轴信息,平均耗时 30-60 秒。
  4. 元数据生成:基于 AI 分析视频内容,自动生成符合 B 站规范的标题、描述和标签。系统会分析视频主题、关键词和内容特征,生成优化的元数据,耗时 30-90 秒。

定时上传策略

为避免频繁上传触发平台限制,系统采用智能调度机制:

  • 视频上传:每小时仅上传一个处理完成的视频,通过时间间隔控制上传频率
  • 字幕上传:视频上传成功后延迟 1 小时再上传字幕,确保视频审核通过
  • 手动触发:提供 Web 界面手动控制,可跳过队列立即执行上传任务

可视化管理面板

系统提供直观的 Web 管理界面,包含以下功能:

  • 视频列表:实时展示所有视频处理状态,支持按状态筛选(待处理/处理中/已完成/失败)
  • 详细信息:查看完整视频信息和处理步骤追踪,包含每个步骤的执行时间和结果
  • 单步重试:对失败的任务步骤支持单独重新执行,无需从头开始
  • 进度监控:实时显示处理进度百分比和已执行时长
  • 文件管理:提供视频、字幕、封面等所有生成文件的在线查看和下载功能

B 站账户集成

系统深度集成 B 站认证体系:

  • 扫码登录:支持 Bilibili TV 版二维码快速登录
  • 二维码生成:后端自动生成 PNG 格式登录二维码
  • 状态检测:前端实时轮询检测登录状态变化
  • 用户信息:获取并展示用户名、头像等账户信息
  • 状态持久化:自动保存登录 Token 和 Cookie,避免重复登录
  • 登录验证:智能检测账户登录状态,异常时自动提示重新认证

技术架构解析

后端技术栈

  • 开发语言:Go 1.24+,利用最新语言特性提升性能
  • Web 框架:Gin 高性能 HTTP 框架,支持高并发请求
  • 数据库支持:GORM v2 ORM 框架,兼容 MySQL 8.0+、PostgreSQL 15+ 和 SQLite
  • 文件存储:腾讯云 COS 对象存储,支持大文件分片上传
  • 依赖管理:Uber FX 实现声明式依赖注入
  • 定时任务:Robfig Cron v3 提供秒级精度的任务调度
  • 日志系统:Zap + Lumberjack 实现结构化日志和自动轮转

前端技术栈

  • 框架:Next.js 15+,支持 App Router 路由模式
  • 开发语言:TypeScript 5.x,确保类型安全
  • UI 组件:React 18 + Tailwind CSS 3.x 响应式设计
  • 图标系统:Lucide React 现代化图标库
  • HTTP 客户端:Axios 支持请求拦截和自动重试
  • 部署方式:静态导出 + 嵌入式部署,简化运维

外部服务集成

服务名称 功能描述 集成方式
yt-dlp 多平台视频下载 命令行工具调用
Whisper AI 语音识别与字幕生成 本地模型部署
百度翻译 API 专业机器翻译 RESTful API
DeepSeek AI AI 翻译与内容生成 RESTful API
Bilibili SDK 视频上传与用户认证 官方 API
腾讯云 COS 对象存储服务 SDK 集成

项目结构说明

ytb2bili/
├── main.go                      # 应用程序入口
├── Makefile                     # 自动化构建脚本
├── config.toml                  # 主配置文件
├── config.toml.example          # 配置模板
├── go.mod                       # Go 模块依赖
└── README.md                    # 项目文档
internal/                        # 内部业务逻辑
├── chain_task/                  # 任务链处理引擎
│   ├── chain_task_handler.go    # 任务链执行器
│   ├── upload_scheduler.go      # 上传调度器
│   ├── handlers/                # 任务处理器
│   │   ├── generate_subtitles.go      # 字幕生成
│   │   ├── translate_subtitle.go      # 字幕翻译
│   │   ├── generate_metadata.go       # 元数据生成
│   │   ├── download_img_handler.go    # 封面处理
│   │   ├── upload_to_bilibili.go      # 视频上传
│   │   └── upload_subtitle_to_bilibili.go  # 字幕上传
│   └── manager/                 # 任务管理
├── core/                        # 核心业务层
│   ├── app_server.go            # HTTP 服务器
│   ├── models/                  # 数据模型
│   ├── services/                # 业务服务
│   └── types/                   # 类型定义
├── handler/                     # HTTP 请求处理器
├── storage/                     # 存储抽象层
└── web/                         # 前端资源
pkg/                             # 可重用组件
├── analytics/                   # 数据分析
├── cos/                         # 腾讯云 COS 客户端
├── logger/                      # 日志组件
├── services/                    # 通用服务
├── store/                       # 数据库操作
├── translator/                  # 翻译服务
└── utils/                       # 工具函数

快速部署指南

环境要求

组件 版本要求 说明
Go 1.24+ 后端运行环境
Node.js 18+ 前端构建(仅构建时需要)
数据库 MySQL 8.0+/PostgreSQL 15+/SQLite 数据存储
yt-dlp 最新版 视频下载工具(自动安装)

一键部署方案

# 克隆项目
git clone https://github.com/difyz9/ytb2bili.git
cd ytb2bili/bili-up-api
# 一键构建(前端+后端)
make build
# 启动服务
./bili-up-api-server

部署完成后访问 http://localhost:8096 即可使用完整功能。

配置文件设置

  1. 复制配置模板:
cp config.toml.example config.toml
  1. 编辑配置文件:
# 服务配置
listen = ":8096"
environment = "production"
debug = false
FileUpDir = "/data/ytb2bili/media"
# 数据库配置
[database]
  type = "mysql"
  host = "localhost"
  port = 3306
  username = "ytb2bili"
  password = "your_password"
  database = "ytb2bili"
  timezone = "Asia/Shanghai"
# 腾讯云 COS 配置
[TenCosConfig]
  enabled = true
  CosBucketURL = "https://your-bucket.cos.ap-guangzhou.myqcloud.com"
  CosSecretId = "您的SecretId"
  CosSecretKey = "您的SecretKey"
  CosRegion = "ap-guangzhou"
  CosBucket = "your-bucket"
  SubAppId = "您的AppId"

数据库设计

核心表结构

视频主表 (tb_videos)

CREATE TABLE `tb_videos` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `video_id` varchar(100) NOT NULL COMMENT 'YouTube视频ID',
  `title` varchar(500) DEFAULT NULL COMMENT '视频标题',
  `description` text COMMENT '视频描述',
  `cover_url` varchar(1000) DEFAULT NULL COMMENT '封面URL',
  `file_path` varchar(1000) DEFAULT NULL COMMENT '本地文件路径',
  `status` varchar(20) DEFAULT '001' COMMENT '处理状态',
  `bilibili_bvid` varchar(20) DEFAULT NULL COMMENT 'B站BV号',
  `bilibili_aid` bigint DEFAULT NULL COMMENT 'B站AV号',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_video_id` (`video_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

任务步骤表 (task_steps)

CREATE TABLE `task_steps` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `video_id` varchar(100) NOT NULL,
  `step_name` varchar(100) NOT NULL,
  `step_order` int NOT NULL,
  `status` enum('pending','running','completed','failed','skipped') DEFAULT 'pending',
  `start_time` timestamp NULL DEFAULT NULL,
  `end_time` timestamp NULL DEFAULT NULL,
  `duration` int DEFAULT NULL COMMENT '执行耗时(秒)',
  `error_msg` text COMMENT '错误信息',
  `result_data` json DEFAULT NULL,
  `can_retry` tinyint(1) DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_video_step` (`video_id`,`step_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

状态流转机制

系统采用六种状态标记视频处理进度:

  • 001:待处理
  • 002:处理中
  • 200:准备上传
  • 300:视频已上传
  • 400:完成
  • 999:失败
    状态转换遵循严格流程,确保处理步骤按序执行。

常见问题解答

安装与配置问题

Q:数据库连接失败怎么办?

  1. 检查配置文件中的数据库参数是否正确
  2. 验证数据库服务是否运行:sudo systemctl status mysql
  3. 确认用户权限:mysql -u username -p -e "SHOW DATABASES"
    Q:如何切换到 SQLite 数据库?
    修改配置文件:
[database]
  type = "sqlite"
  database = "./data/ytb2bili.db"

视频处理问题

Q:字幕生成失败的原因?

  1. 检查 Whisper 模型是否正确安装
  2. 确认系统内存充足(推荐 4GB+)
  3. 查看日志获取具体错误信息
    Q:视频下载速度慢怎么解决?
  4. 更新 yt-dlp:pip install --upgrade yt-dlp
  5. 检查网络连接质量
  6. 在配置中设置代理(如需)
    Q:翻译服务不可用如何处理?
    百度翻译验证:
curl -X POST "https://fanyi-api.baidu.com/api/trans/vip/translate" \
  -d "q=test&from=en&to=zh&appid=YOUR_APPID&salt=123&sign=YOUR_SIGN"

DeepSeek 验证:

curl -X POST "https://api.deepseek.com/chat/completions" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{"model":"deepseek-chat","messages":[{"role":"user","content":"test"}]}'

上传与认证问题

Q:B 站登录二维码无法显示?

  1. 检查服务端口是否正常开放:netstat -tulpn | grep 8096
  2. 验证接口响应:curl http://localhost:8096/api/v1/auth/qrcode
  3. 确认防火墙设置允许访问
    Q:视频上传被限制怎么办?
    系统已内置智能调度策略:
  • 自动控制上传频率(每小时 1 个视频)
  • 视频与字幕上传间隔 1 小时
  • 支持手动触发紧急上传

生产部署建议

Docker 部署方案

创建 docker-compose.yml

version: '3.8'
services:
  ytb2bili:
    image: ytb2bili:latest
    ports:
      - "8096:8096"
    volumes:
      - ./config.toml:/app/config.toml
      - ./data:/data/ytb2bili
    environment:
      - CONFIG_FILE=/app/config.toml
    depends_on:
      - mysql
    restart: unless-stopped
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: ytb2bili
      MYSQL_USER: ytb2bili
      MYSQL_PASSWORD: app_password
    volumes:
      - mysql_data:/var/lib/mysql
    restart: unless-stopped
volumes:
  mysql_data:

启动命令:

docker-compose up -d

Nginx 反向代理配置

server {
    listen 443 ssl http2;
    server_name your-domain.com;
    
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    
    client_max_body_size 10G;
    
    location / {
        proxy_pass http://localhost:8096;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }
}

监控与维护

日志监控

# 实时查看应用日志
tail -f logs/app.log
# 查看错误日志
grep "ERROR" logs/app.log

性能分析

# HTTP 请求分析
curl -w "@curl-format.txt" -s -o /dev/null http://localhost:8096/api/v1/videos
# 内存分析
go tool pprof http://localhost:8096/debug/pprof/heap

定期维护任务

  1. 每周清理临时文件:find /data/ytb2bili -name "*.tmp" -delete
  2. 每月备份数据库:mysqldump -u root -p ytb2bili > backup.sql
  3. 季度更新依赖:go mod tidy && go mod download

系统扩展性

支持的视频平台

通过 yt-dlp 集成,系统支持以下平台:

  • YouTube
  • TikTok
  • Instagram
  • Twitter
  • Bilibili
  • 以及其他 1000+ 网站

翻译服务扩展

系统采用模块化翻译架构:

// 当前支持的服务
type Translator interface {
    Translate(text string, from string, to string) (string, error)
}
// 可轻松扩展新服务
type GoogleTranslator struct {}
func (g *GoogleTranslator) Translate(text, from, to string) (string, error) {
    // 实现逻辑
}

存储方案扩展

除腾讯云 COS 外,系统预留存储接口:

type Storage interface {
    Upload(file io.Reader, key string) error
    Download(key string) (io.ReadCloser, error)
    GetURL(key string) string
}

可轻松扩展支持:

  • 阿里云 OSS
  • AWS S3
  • 自建 MinIO

总结

YTB2BILI 系统通过智能化的任务链处理引擎,实现了从视频下载到平台上传的全流程自动化。其模块化架构设计确保了系统的可扩展性和可维护性,而可视化面板则大幅降低了使用门槛。无论是个人内容创作者还是团队运营,该系统都能显著提升视频处理效率,减少重复性劳动。
系统采用 Go 语言后端配合 Next.js 前端的现代技术栈,保证了高性能和良好的用户体验。通过定时上传策略和智能错误处理机制,有效解决了平台限制问题。完善的数据库设计和状态管理系统,确保了处理过程的可靠性和可追溯性。
对于需要大规模处理视频内容的用户,系统提供了 Docker 部署方案和 Nginx 代理配置,支持生产环境的高可用部署。丰富的日志和监控功能,使得系统运维更加便捷。