Y2A-Auto README

The project's README from github.com/fqscfqj/Y2A-Auto. As one markdown file: README.md.

Y2A-Auto

Y2A-Auto Logo

将 YouTube 视频自动搬运到 AcFun / bilibili 的一体化工具。

License Python Docker

从下载、ASR、字幕翻译、字幕质检、内容审核到上传,全流程自动化;内置 Web 管理后台、YouTube 监控和维护能力。

快速开始 · 功能概览 · 部署与运行 · Telegram 机器人 · 配置说明 · 使用指南 · 通知推送 · CookieCloud · 安全特性 · 常见问题


Telegram Bot
Telegram 转发机器人(公共实例): @Y2AAuto_bot
⚠️ 公共实例部署在个人 VPS 上,该服务器已被墙,可用性无法保证;若无法连接,请按 自部署说明搭建自己的机器人: Y2A-Auto-tgbot

项目展示

Dashboard Screenshot

Monitor Screenshot Settings Screenshot

以上为当前页面截图。

核心亮点

能力模块 说明
全流程自动化 从下载、ASR、字幕、元信息到上传一条龙处理
审核可控 支持人工审核、强制上传、内容安全检测和登录保护
灵活部署 Docker / 本地双模式,支持 CPU 与多种 GPU 编码
监控拉取 支持 YouTube 频道 / 关键词定时抓取与历史记录
消息推送 企业微信、Server酱、message-pusher 多渠道异步通知
CookieCloud 从 CookieCloud 服务自动同步 YouTube Cookies
安全防护 密码保护、暴力破解锁定、会话超时、路径遍历防护
维护完善 支持日志清理、下载清理、并发控制和 FFmpeg 自动补齐

功能概览

项目结构

Y2A-Auto/
├── app.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── docker-compose-build.yml
├── acfunid/
├── build-tools/
├── config/
├── cookies/
├── db/
├── downloads/
├── ffmpeg/
├── fonts/
├── logs/
├── modules/
├── static/
├── temp/
├── templates/
└── tests/

快速开始

推荐使用 Docker(无需手动安装 Python、FFmpeg、yt-dlp)。

  1. 准备 Cookie(必须)
  1. 启动服务
# 默认从 Docker Hub 拉取镜像 fqscfqj/y2a-auto:latest
# 如需使用 GitHub 容器注册表,可切换为 ghcr.io/fqscfqj/y2a-auto:latest
docker compose up -d
  1. 打开 Web

默认会持久化目录:config/、db/、downloads/、logs/、temp/、cookies/。

说明:fonts/ 中的字体属于项目内置依赖,用于字幕烧录;许可证见 fonts/LICENSE.txt。

部署与运行

方案 A:Docker(推荐)

如需本地构建镜像,可使用:

docker compose -f docker-compose-build.yml up -d --build

如果启动日志出现写入 config/、db/ 或 logs/ 等挂载目录的 PermissionError,请在项目目录中创建这些目录,并将其属主改为容器内应用使用的 UID/GID(默认 1000:1000):

mkdir -p config db downloads logs cookies temp
sudo chown -R 1000:1000 config db downloads logs cookies temp

启用了 rootless Docker 或 userns-remap 时,请使用容器 UID 1000 实际映射到宿主机的 UID/GID;映射方式参见 Docker 官方文档。

方案 B:本地运行

前置要求:

py -3.11 -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python app.py

访问 http://127.0.0.1:5000。

方案 C:Windows 便携包

方案 D:Telegram 转发机器人(可选)

Y2A-Auto-tgbot 是一个独立的 Telegram 机器人:在 Telegram 里直接发送 YouTube 视频 / 播放列表链接,机器人会调用本服务的 /tasks/add_via_extension 接口提交上传任务。它需要单独部署,不会随本项目一起启动。

⚠️ 公共实例不保证可用。 @Y2AAuto_bot 运行在个人 VPS 上,该服务器已被墙,可能随时无法访问。需要长期、稳定使用时请自行部署。

自部署要点(Bot Token 创建、Token 作用范围等完整说明见 Y2A-Auto-tgbot README):

  1. 在 Telegram 找 @BotFather,发送 /newbot 创建机器人,拿到 TG_BOT_TOKEN(形如 123456789:AAE...)

  2. 克隆并启动机器人:

    git clone https://github.com/fqscfqj/Y2A-Auto-tgbot.git
    cd Y2A-Auto-tgbot
    # 编辑 docker-compose.yml 填写 TG_BOT_TOKEN(可选 ADMIN_TELEGRAM_IDS),然后:
    docker compose up -d
    
  3. 打开本项目的 设置 → 运维与安全 → Telegram Bot API Token,点击「生成 Token」并立即复制 y2a_tgbot_v1_...(明文只显示一次)

  4. 在 Telegram 向新建的机器人发送 /settings,填写 API 地址(机器人所在网络能访问到的本项目地址,例如同机 http://127.0.0.1:5000,跨机器 http://192.168.1.100:5000)和 API Token,再点「🔬 测试」确认连接成功

  5. 测试通过后,直接给机器人发送 YouTube 链接即可提交任务

该 Token 只允许调用 /tasks/add_via_extension,无法访问设置、日志等其它接口,并且可以随时在设置页重置或撤销。

配置说明

首次运行会自动生成 config/config.json。推荐先配置以下几类参数:

基础与安全

账号与网络

FFmpeg 版本要求:≥ 5.1。 字幕烧录使用 -fps_mode cfr 控制帧率模式, 该选项在 FFmpeg 5.1 才引入(5.0 及更早只认已弃用的 -vsync)。仓库自带的 与自动下载的 FFmpeg(BtbN latest)都远高于该版本;但若通过 FFMPEG_LOCATION 指向 5.0 或更早的旧版本,软件编码路径会因 Unrecognized option 'fps_mode' 直接失败(非硬件编码器没有降级重试,任务会直接报错)。

VIDEO_CPU_CODEC=x265 还额外要求该 FFmpeg 构建带 libx265(需 --enable-gpl --enable-libx265,BtbN 与仓库自带版本均满足)。缺失时会自动降级为 libx264 并继续烧录,不会因缺库而丢掉整条字幕。

AI 与投稿

AI 文本功能同时兼容 OpenAI Chat Completions 与 Responses API。OPENAI_BASE_URL 可填写 API 根地址(例如 https://api.openai.com/v1,默认使用 Chat Completions)或完整的 /chat/completions、/responses 地址;填写完整端点时会自动选择协议并规范化。Responses 请求会自动转换消息、JSON 输出格式、思考开关和 token 上限参数,返回值也会归一化供翻译、质检、智能分段等现有功能使用。当兼容服务不支持 response_format、token 上限参数、自定义 temperature 或特定指令角色时,系统会根据端点实际错误逐级协商;若网关只返回笼统的请求 schema 错误,则降级为仅含 model + user messages 的最小标准请求。能力只在降级请求成功后按端点、协议和模型缓存。

字幕处理

烧录字幕外观(默认值即历史观感;对 .ass/.ssa 源的行为变更见下方说明):

行为变更(.ass / .ssa 源素材):上述外观配置现在对所有字幕源统一生效。 此前上游只把字体与边距写进 force_style,字色 / 描边色 / 粗体 / 底板这些键对 .ass / .ssa 源不生效(同一份配置喂 .srt 是红字、喂 .ass 仍是创作者的白字), 现在这些键改为逐键覆盖源样式 —— 也就是说,素材自带的字色 / 粗体 / 底板样式会被 应用配置覆盖,未配置时即默认的白字 + 粗体 + 描边(与 SRT 源行为一致)。 升级后若想保留素材自带外观,请把对应配置项显式设置成与素材一致的取值,或改用 自带样式的外部字幕文件而不依赖本功能。

语音识别(ASR)

视频转码与维护

通知推送

CookieCloud

内容审核

下载质量

字幕后处理

配置示例

{
  "AUTO_MODE_ENABLED": false,
  "password_protection_enabled": false,
  "password": "",
  "UPLOAD_TARGET_DEFAULT": "acfun",
  "OPENAI_API_KEY": "",
  "OPENAI_BASE_URL": "https://api.openai.com/v1",
  "OPENAI_MODEL_NAME": "gpt-3.5-turbo",
  "OPENAI_THINKING_ENABLED": false,
  "SUBTITLE_TRANSLATION_ENABLED": false,
  "SUBTITLE_QC_ENABLED": true,
  "SPEECH_RECOGNITION_ENABLED": false,
  "SPEECH_RECOGNITION_PROVIDER": "whisper",
  "VAD_ENABLED": true,
  "VIDEO_ENCODER": "auto",
  "VIDEO_CPU_CODEC": "x264",
  "VIDEO_CPU_PRESET": "medium",
  "VIDEO_CPU_PRESET_HD": "veryfast",
  "FFMPEG_AUTO_DOWNLOAD": true,
  "MAX_CONCURRENT_TASKS": 2,
  "MAX_CONCURRENT_UPLOADS": 1
}

字幕质检说明

SUBTITLE_QC_ENABLED 默认为 true:系统会对 ASR 生成的源字幕做预检。

QC 会先用规则做硬拦截,只有边界样本才会调用 AI 严格复核。

命中署名行、噪声提示、界面操作词、模板化重复句等明显低质量字幕时,会在规则层直接失败,不再进入宽松放行。

时间轴维度(覆盖率 / 间隙 / 语速)会在 ASR 来源退化(subtitle_quality_state == degraded)时随严格模式一并参与判定。

时间轴维度的三条边界语义:片尾留白容忍带取「30 秒」与「片长 25%」的较小值(60 秒素材不会因为末尾 23 秒无字幕而被当作良性留白);零时长 cue 达到「≥3 条且 ≥20%」即视为实质缺陷,AI 不可用时不予放行(≥25% 无条件硬失败);畸形时间戳(时间行无法解析)的 cue 会被跳过并记 warning,不再静默退化为 0.0 —— 退化到 0.0 会虚高覆盖率并反过来帮助质检通过。

可疑样本在 AI 不可用、返回异常或输出不合规时,默认按失败处理。QC 失败时会跳过烧录字幕,但仍保留字幕文件并继续上传原视频,任务最终标记为完成,并显示字幕异常标记。

被判定不合格的 ASR 字幕会被改名为 *.rejected.txt(内容保留供人工检查),移出复用范围,避免任务重跑时复用旧字幕而永远拿不到新字幕。平台自带或人工提供的字幕不受此影响。

烧录门控开关

「质检不可用」(字幕文件缺失 / 执行异常)与「用户主动关闭质检」是两种不同结局:前者按拒绝处理,后者放行。任务列表中会通过 qc_unavailable / subtitle_qc_rejected / asr_failed_block_embed / asr_degraded_block_embed 标注具体原因。

语音识别说明

当前支持两类 ASR 提供商:

建议优先保持 VAD_ENABLED=true。当前默认采用质量优先的扫描窗参数,分片更短、重叠更小,便于提升字幕边界精度。

如果 VAD 结果不理想,系统会自动进入分片或整段兜底流程。

内置字幕字体

使用指南

  1. 在首页或任务页提交 YouTube 链接创建任务。
  2. 自动模式下流程为:下载 -> ASR / 字幕处理(可选) -> AI 元信息 -> 审核 -> 上传目标平台。
  3. 在人工审核页可调整标题、简介、标签、分区并强制上传。
  4. 启用 YouTube 监控后,可按频道或关键词定时拉取任务,并自动加入任务队列;只想搬运标题命中特定内容的视频(如某个频道的 ASMR)时,在监控配置里填写「标题包含关键词」并选择「任一 / 全部」匹配。
  5. 在设置页可分组维护账号、AI、字幕、ASR、转码、维护与安全项。
  6. AcFun / bilibili 支持 QR 码扫码登录:在设置页点击「扫码登录」,用手机 App 扫码即可完成认证。
  7. 如已部署 CookieCloud 服务,可在设置页配置后一键同步 YouTube Cookies,无需手动导出。
  8. 启用通知推送后,任务状态变化和登录事件会自动推送到企业微信等渠道。

FFmpeg 与硬件加速

Docker GPU 示例

NVIDIA(推荐):

# 在 docker-compose.yml 内取消以下注释即可启用:
# gpus: all
# environment:
#   - NVIDIA_VISIBLE_DEVICES=all
#   - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility

Intel / AMD(Linux):

devices:
  - /dev/dri:/dev/dri
group_add:
  - video
  - render

NVIDIA 专用覆盖文件已移除,相关配置已直接集成到主 docker-compose.yml。

YouTube 监控

通知推送

支持三种推送渠道,可在设置页自由组合启用:

渠道 标识 必需配置
企业微信 wecom NOTIFY_WECOM_WEBHOOK_URL
Server酱 serverchan NOTIFY_SERVERCHAN_SENDKEY
message-pusher message_pusher NOTIFY_MESSAGE_PUSHER_SERVER + USERNAME + TOKEN

支持的事件类型:

通知采用异步重试队列(SQLite outbox),递增间隔(30s → 120s → 600s → 1800s → 3600s)保证最终投递。企业微信优先使用 Markdown 格式,失败后自动回退纯文本。

CookieCloud 集成

支持从 CookieCloud 服务自动拉取 YouTube / Google Cookies,免去手动导出的麻烦。

安全特性

常见问题

云服务器无法访问 Web 界面

云平台的安全组 / 网络防火墙或服务器自身的防火墙可能没有放行 TCP 5000。不要直接将该端口向整个公网开放:Web 密码保护默认关闭,直接访问使用的也是明文 HTTP。

推荐通过 SSH 本地端口转发访问,无需开放公网 5000 端口:

ssh -N -L 5000:127.0.0.1:5000 -o ServerAliveInterval=30 user@<服务器公网IP>

连接建立后,在本地浏览器打开 http://localhost:5000。如果确实需要长期公网访问,请先启用 Web 密码保护,通过反向代理配置 HTTPS,并将云防火墙和主机防火墙的入站来源限制为可信 IP 或网段。

Telegram 机器人无法使用

公共实例 @Y2AAuto_bot 运行在个人 VPS 上,该服务器已被墙,不保证一直可用,也可能随时停止服务。遇到连不上、长时间无响应或提示服务异常时,请自行部署,见 方案 D:Telegram 转发机器人。

自部署后仍无法转发时,按顺序排查:

贡献与反馈

致谢

许可证

本项目基于 GNU GPL v3 开源。请遵守相关平台条款,仅在合法合规前提下用于学习与研究。

Y2A-Auto (fqscfqj/Y2A-Auto)

Searching Database…

What is this?An all-in-one tool that automatically moves YouTube videos to AcFun and bilibili. It downloads the video, transcribes and translates subtitles, checks content, and uploads the result.
Is it a desktop app or a web service?It is a self-hosted web service with a built-in admin panel. You run it with Docker or locally and manage tasks in the browser. A Windows portable package is also provided.
How do I get it running?Docker is recommended. Put your cookie files into cookies/, run 'docker compose up -d', then open the web UI and first set up login protection, platform accounts and the YouTube cookie.
Do I need Python, FFmpeg or yt-dlp installed myself?Not with Docker, which bundles Python, FFmpeg and yt-dlp. A local run needs Python 3.11+, FFmpeg and yt-dlp. You must also supply your own YouTube, AcFun and bilibili cookie files.
Which AI services can it use for translation and tags?Any OpenAI-compatible API. Set OPENAIBASEURL and OPENAIMODELNAME. It accepts both Chat Completions and Responses endpoints, either as a base URL or as a full endpoint URL.
What happens if the subtitle quality check fails?The video still uploads, but the subtitles are not burned in. The failed ASR subtitle file is renamed to .rejected.txt for manual review, and the task is marked with a subtitle-error flag.
Can it delete downloaded files after uploading?Yes. With DELETEDOWNLOADFILESAFTERUPLOAD enabled, a task's files are removed once every target platform has accepted the upload. This option is off by default.
Which topics is it in?bilibili, python
Creator
fqscfqj
Size
53.1 MB
Stars
4.6K
Age
1y
Commits · 90 Days