
深度对抗 YouTube 风控机制的专业级视频下载器
以工程级容错与 Fluent Design 美学,交付无人值守的极致下载体验
核心创新 • 功能全景 • 设计亮点 • 技术栈 • 快速开始 • 目录结构 • Reference •
[!WARNING] 🛑 重要声明 1. 《品牌商标与防盗卖政策》:严禁任何团队或个人在不更改软件名称和图标的情况下,对本软件进行二次分发或商业售卖。违者将被追究法律责任并全网下架。 2. 《反学术抄袭声明》:除作者本人以外,绝对禁止将本仓库的全部或部分源码用于提交高校课程作业或毕业设计。本仓库已被各大查重系统收录,一经查实将向涉事高校发出实名举报。
YouTube 拥有互联网上最严格的反爬体系——签名 URL 动态过期、Bot Check 机器人检测、IP 风控限速、Chromium v130+ 的 DPAPI App-Bound Encryption Cookie 锁定……传统视频下载器在面对这些挑战时,往往只是给命令行套了一层薄壳:崩溃即失败,无法恢复;批量下载留下满屏碎片;VR 内容无法正常播放;多音轨视频随机选择配音。
FluentYTDL 从底层重新设计了整条下载管线。它不是简单的 GUI 包装器,而是一个拥有 148 个 Python 源文件、约 5 万行代码的完整工程系统——具备风控感知的质量守卫引擎、三层优先级的播放列表懒加载调度器、基于语言学分析的智能音轨打分系统、支持 VR 全景投影转码的后处理管道、以及能从 Chromium DPAPI 死锁中突围的 WebView2 沙盒鉴权系统。
一句话定位: 面向内容创作者、视频搬运工和数字仓鼠的生产力工具,在 YouTube 日益收紧的围墙花园中撕开一道可靠的裂缝。
FluentYTDL 在底层做出了许多深入 YouTube 视频交付策略和风控机制的开创性设计:
网络波动和 YouTube 的反爬策略常导致批量下载意外中断或静默降级(请求 4K 却只拿到 720p)。FluentYTDL 的 Quality Guard 引擎在下载管线的首尾两端设置了双重关卡:
QualityGuardManager 全局跟踪连续质量降级的任务计数。当连续失败次数达到可配置阈值(默认 3 次)时,判定为遭遇 YouTube 风控,自动将所有排队任务 "挂起 (Suspended)" 至安全队列,并通过消息中心推送 risk_control 级别的严重通知。环境恢复后可一键复活摒弃传统下载器只能"全盘下载"的笨重逻辑,FluentYTDL 为不同场景设计了六种独立的解析-下载流程:
| 模式 | 用途 | 下载路径 | 沙箱 | Feature 管道 |
|---|---|---|---|---|
| 🎬 Video | 标准单视频下载 | 完整(Executor + Strategy) | ✅ | 全部 5 个 Feature |
| 🥽 VR | VR/360° 视频,android_vr 客户端 |
完整 + VR 后处理 | ✅ | 全部 + VRFeature |
| 📺 Channel | 频道标签页列表,视口感知懒加载 | 完整(逐条目) | ✅ | 全部 |
| 📋 Playlist | 播放列表批量下载 | 完整(逐条目) | ✅ | 全部 |
| 📝 Subtitle | 仅提取全语种字幕 | 轻量(无 Executor) | ❌ | 无 |
| 🖼️ Cover | 仅提取封面图 | 直链 / 轻量 | ❌ | 无 |
extract_flat + lazy_playlist 模式,跳过冗长的 Authcheck 步骤,瞬间枚举整个频道或数百条目的播放列表。详细元数据由 PlaylistScheduler 的三层优先队列按需深度提取面对 MrBeast 等创作者的多语种视频(可能含数十条音轨),传统下载器只能靠码率高低随机选择。FluentYTDL 在 format_scorer.py 中实现了基于等差加权的音轨评分算法:
original 或 default 的原汁原味音轨,无条件置顶dubbed),仅次于原声auto、translated、ai 关键词的机器合成配音,施加极度惩罚,仅作走投无路时的兜底zh-Hans 自动匹配 zh-CN、zh-SG 等变体;en 覆盖 en-US、en-GB、en-AU、en-CAm4a/aac 音频流额外加 2000 分,避免选择需要转封装的 WebM/Opus 流["orig", "zh-Hans", "en"] 的偏好列表,按等差间距 (10,000,000) 递减赋权传统 Cookie 提取工具极易因浏览器进程锁定(尤其 Chromium v130+ 的 App-Bound Encryption)而失败。FluentYTDL 构建了完整的认证生命周期:
pywebview + Edge WebView2 后端,在完全隔离的沙盒窗口中完成 YouTube 登录,绕过 DPAPI 文件锁,100% 可靠获取 CookiePOTManager 管理 bgutil-ytdlp-pot-provider 子进程,通过 Deno 运行时生成 PO Token 突破 YouTube 极其严格的机器人检测。内置三级渐进恢复:清除缓存 (~100ms) → 清除完整性令牌 (~5s) → 完整重启 (~15s)JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 的 Job Object,即使 FluentYTDL 崩溃,操作系统也会自动清理子进程,杜绝僵尸服务器YouTube 在分发全景视频时常使用特殊的 EAC (Equi-Angular Cubemap) 投影格式,导致普通播放器画面扭曲。FluentYTDL 的 VRFeature 提供了完整的 VR 后处理管道:
__vr_projection 和 __vr_stereo_mode 元数据v360=eac:e 滤镜,支持 GPU 硬件加速(NVENC → QSV → AMF 优先级递降),CPU 回退使用 libx264 -preset veryfast -crf 23spatialmedia 工具包,向 MP4/MOV 容器注入标准的球面投影和立体声模式元数据(top-bottom / left-right / none),确保 Meta Quest、Pico 等 VR 头显直接获得完美沉浸式体验.part-Frag 删除失败)+ 文件 ≥ 预期大小的 50%(过滤截断下载),两门均通过则视为成功sponsor、selfpromo、interaction 等)精细配置.fluent_temp/task_{id}/ 临时目录中执行,成功后通过同文件系统的原子 shutil.move() 移入最终目录rmtree 带 5 次重试(0.5s 间隔)逐步清理,回退到逐文件删除db_id) 而非 UUID,确保崩溃恢复时写入同一沙箱update-manifest.json 统一管理 app-core 和 bin/ 工具的版本检查v-(稳定版,GitHub Release Latest)/ pre-(预发布,包含所有 Release)/ beta-(测试版,锁定更新)premium_only)ERROR: 行并截断至 97 字符extract_cookie、switch_proxy)和恢复提示TaskDBWriter 异步写入线程持久化,主线程零 I/O 阻塞running/downloading/parsing 状态安全降级为 paused,防止重启时的并发下载风暴effective_state 属性作为权威状态解析器消除竞态条件FluentWindow、InfoBar、MessageBox 等),拒绝原生 Qt 控件┌─────────────────────────────────────────────┐
│ UI 层 (ui/) │
│ 53+ 文件:主窗口、页面、组件、委托、模型 │
├──────────────┬──────────────────────────────-┤
│ ↓ 依赖 │
│ 服务层 │
│ auth/ youtube/ download/ processing/ │
│ storage/ notification/ │
├──────────────┬──────────────────────────────-┤
│ ↓ 依赖 │
│ 核心基础设施 (core/) │
│ ConfigManager、Controller、DependencyMgr │
├──────────────┬──────────────────────────────-┤
│ ↓ 依赖 │
│ 基础层 (utils/, models/) │
│ 无内部依赖 │
└─────────────────────────────────────────────┘
强制规则: UI 绝不直接调用 yt-dlp → 通过 youtube_service;服务层绝不从 ui/ 导入 → 仅通过 Qt Signal 通信;Models 自包含无循环依赖。
所有 UI-后端通信通过 Qt Signal/Slot 机制。DownloadWorker 发射 6 种信号(unified_status、output_path_ready、completed、error、cancelled、QThread.finished),DownloadManager 通过 QueuedConnection 桥接到 TaskDBWriter,实现"单写者桥接连接"防止 SQLite 争用。
PlaylistListModel 使用 200ms 前缘去抖,50 行并发更新仅发射 3-5 次 dataChanged 信号,将连续脏行合并为最小范围播放列表条目以 30 个为一块添加到模型,每块之间通过 QTimer.singleShot(0) 让出事件循环,保持 UI 在数千条目加载时仍然流畅响应。
| 技术 | 版本要求 | 用途 |
|---|---|---|
| PySide6 | ≥ 6.10, < 6.11 | Qt6 for Python 官方绑定 |
| QFluentWidgets | ≥ 1.10, < 1.11 | 微软 Fluent Design 组件库 (Qt6) |
| 技术 | 用途 |
|---|---|
| yt-dlp | 视频解析与下载引擎(CLI 子进程模式,非 Python API) |
| FFmpeg | 转码、合并、封装、VR 投影转换、封面嵌入(MKV) |
| AtomicParsley | MP4/M4A 封面嵌入(最可靠方案) |
| Deno | PO Token 生成环境(安全的 JS 运行时) |
| 技术 | 用途 |
|---|---|
| rookiepy | 跨浏览器 Cookie 提取(Chromium / Firefox / Edge) |
| pywebview | WebView2 沙盒登录环境(绕过 DPAPI 文件锁) |
| 技术 | 用途 |
|---|---|
| loguru | 结构化日志框架 |
| Pillow | 封面图像处理与缩放 |
| requests | HTTP 通信(更新检查、缩略图下载) |
| psutil | 系统进程监控、硬件检测、内存预警 |
| markdown | 更新日志渲染 |
| Google Spatial Media | VR 球面投影元数据注入工具包 |
| 技术 | 用途 |
|---|---|
| SQLite (WAL 模式) | 任务生命周期持久化、崩溃恢复 |
| JSON | 用户配置存储 (config.json) |
| 技术 | 用途 |
|---|---|
| PyInstaller | Python 应用打包为 Windows 可执行文件 |
| Inno Setup | Windows 安装程序生成 |
| Ruff | 代码检查与格式化 |
| Pyright | 静态类型检查(咨询模式) |
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10/11 (64-bit) |
| Python | 3.10 或更高版本(仅源码运行需要) |
| 内存 | 4GB RAM 或更多 |
| 存储 | 500MB 可用空间 |
*-setup.exe 安装程序或 *-full.7z 便携包⚠️ 注意: 请务必从本仓库的 Releases 页面获取,这是唯一合法的分发渠道。任何第三方下载站均非授权来源。
# 克隆仓库
git clone https://github.com/SakuraForgot/FluentYTDL.git
cd FluentYTDL
# 安装依赖
pip install -e .
# 运行应用
python main.py
💡 提示: FFmpeg 和 Deno 运行时会在首次启动时自动下载,无需手动安装。如果自动下载失败,请手动将对应文件放入
bin/目录。
FluentYTDL/
├── main.py # 应用入口:QApplication 创建、主题/字体设置、POT 预热、主窗口启动
├── pyproject.toml # 项目元数据、依赖声明、Ruff/Pyright 配置
├── VERSION # 版本单一真相源(格式: v-3.0.27 / pre-X.X.X / beta-X.X.X)
├── config.json # 用户配置(.gitignore,不提交)
│
├── src/fluentytdl/ # 核心包 (148 个 .py 文件)
│ ├── auth/ # 🔐 Cookie 生命周期、CookieSentinel、WebView2 提供者
│ │ └── providers/ # DLE 提供者(Chrome 扩展注入)、WebView2 提供者(pywebview)
│ ├── core/ # ⚙️ ConfigManager (JSON+Signal)、Controller、DependencyManager、
│ │ # ComponentUpdateManager、HardwareManager、进程管理
│ ├── download/ # 📥 DownloadManager (队列+并发)、DownloadExecutor (子进程)、
│ │ # DownloadWorker (QThread)、Feature 管道 (5个)、QualityGuard、
│ │ # AsyncExtractManager、策略引擎 (SPEED/STABLE/HARSH)
│ ├── models/ # 📦 DTO: YtMediaDTO (防腐层)、VideoTask (UI 领域模型)、ErrorCode
│ │ └── mappers/ # 原始 yt-dlp dict → 类型化 DTO 转换器
│ ├── notification/ # 🔔 消息中心 (风控通知、质量预警)
│ ├── processing/ # 🎛️ 音频处理、字幕合并、封面嵌入、SponsorBlock 集成
│ ├── storage/ # 💾 TaskDB (SQLite WAL)、TaskDBWriter (异步写入)、历史服务
│ ├── ui/ # 🖥️ 53+ 文件的 UI 层
│ │ ├── components/ # 28 个可复用控件 (含 DownloadConfigWindow ~3600 行)
│ │ ├── delegates/ # QPainter 列表项渲染器 (播放列表/下载/历史)
│ │ ├── dialogs/ # 模态对话框
│ │ ├── models/ # Qt 列表模型 (PlaylistListModel,含脏行去抖)
│ │ ├── pages/ # 页面容器
│ │ └── settings/ # 设置子模块
│ ├── utils/ # 🔧 路径、日志、error_parser (16规则)、format_scorer、验证器
│ │ └── spatialmedia/ # Google 空间媒体工具包 (第三方, Apache 2.0)
│ ├── youtube/ # 🌐 YoutubeService (yt-dlp CLI 封装)、POTManager、节点诊断
│ └── yt_dlp_plugins_ext/ # 🔌 yt-dlp PO Token 提供者插件 (随应用捆绑)
│
├── assets/ # Logo、图标等资源文件
├── bin/ # 外置二进制工具 (yt-dlp、FFmpeg、Deno、AtomicParsley)
├── scripts/ # 构建脚本、版本管理、规则同步
├── installer/ # Inno Setup 安装程序脚本
├── tests/ # pytest 测试
├── docs/ # 架构文档、开发规则、yt-dlp 排障知识库
└── licenses/ # 第三方许可证
欢迎贡献!请阅读 [CONTRIBUTING.md](CONTRIBUTING.
$ claude mcp add FluentYTDL \
-- python -m otcore.mcp_server <graph>