升级
  64%

       UID3919
       金钱10
       交易币0
       贡献0
|
[ 本帖最后由 linychen 于 2025-8-14 00:34 编辑 ]\n\n[ 本帖最后由 linychen 于 2025-8-13 23:41 编辑 ]\n\nok,现在来解释一下这个修改后代码的核心逻辑和思路
一、核心功能概述
工具集成了多种视频获取方案(第三方工具调用ffmpeg.exe + 爬虫),支持清晰度选择、授权信息配置(Header/Cookie),并通过多线程实现异步操作,避免 UI 卡顿。
二、爬取与下载的核心流程
1. 准备工作:环境检测与初始化
下载工具检测:启动时自动检测系统中是否安装 you-get、yt-dlp(或兼容的 youtube-dl),这些工具是爬取视频的核心依赖。
UI 初始化:创建输入区域(URL、授权信息、输出路径)、信息展示区域(日志、视频信息、清晰度选择)和控制区域(按钮、进度条)。
会话初始化:创建带反爬机制的请求会话(requests.Session),包含随机 User-Agent、授权头信息(Authorization/Cookie)等,模拟浏览器行为。
2. 视频信息获取(get_video_info 方法)
目的是从视频 URL 中提取基础信息(标题、时长、上传者等),并为后续检测视频流做准备。流程如下:
输入验证:检查 URL 是否为空,输出路径是否有效。
授权信息保存:将用户输入的 Authorization、Cookie 等信息存入会话头,用于后续请求身份验证。
多方式信息提取:
优先调用第三方工具:通过 yt-dlp 或 you-get 的命令行参数(如 --dump-json、--info)获取结构化视频信息,解析后展示标题、时长等。
自定义爬虫兜底:若第三方工具失败,使用初始化的会话直接请求 URL,通过正则提取网页中的标题、描述等元数据(如 <title> 标签、meta 标签)。
3. 视频流与清晰度检测(_detect_video_streams 方法)
这是核心功能之一,目的是从视频页面中提取所有可用的视频流(不同清晰度、格式),并分类供用户选择。流程如下:
多来源检测视频流:
第三方工具提取:
yt-dlp:通过 --list-formats 命令获取所有可用视频格式,解析出格式 ID、清晰度(如 1080p)、大小等信息。
you-get:通过 --info 命令提取视频流 ID、分辨率(如 1920x1080)、文件大小等信息。
自定义爬虫提取:
JSON 数据解析:从网页脚本中提取包含视频信息的 JSON 数据(如 window.videoInfo、var videoData),递归解析其中的视频 URL。
直接 URL 匹配:通过正则匹配网页中直接出现的视频 URL(如 .mp4、.m3u8、.flv 等后缀),补全相对 URL 为绝对 URL。
高级 API 检测:若上述方法失败,尝试从网页中提取 API 接口(如 /api/video),调用接口获取视频流信息。
清晰度分类与排序:
通过 _extract_quality_from_string 方法从 URL 或格式信息中提取清晰度(如 1080p、720p)。
通过 _quality_sort_key 方法对清晰度排序(4K > 2K > 1080p > ...),并展示在下拉框中供用户选择。
4. 视频下载(start_download 方法)
根据选择的清晰度和下载工具,启动下载流程,核心逻辑如下:
选择视频流:根据用户选择的清晰度(或自动选择最佳),从检测到的视频流中匹配对应的流信息(URL 或格式 ID)。
选择下载方式:
第三方工具下载:若选择 yt-dlp 或 you-get,通过命令行调用工具,传入视频 URL、格式 ID、输出路径等参数(如 yt-dlp -f <格式ID> -o <输出路径> <URL>)。
自定义爬虫下载:若为直接视频 URL(如 .mp4),使用 requests 分块下载(stream=True),支持断点续传和进度显示。
进度跟踪与控制:
通过多线程执行下载,避免 UI 冻结。
实时解析第三方工具的输出日志(如 yt-dlp 的进度信息),或计算分块下载的进度,更新进度条和状态文字。
支持取消下载(终止子进程或停止分块请求)。
三、关键技术与思路
多工具兼容:结合 yt-dlp(支持多平台、多网站)和 you-get(对国内网站支持较好)的优势,自动选择最佳工具。
反爬机制:
随机 User-Agent 模拟不同浏览器。
支持自定义 Header 和 Cookie,解决需要登录 / 授权才能访问的视频。
模拟浏览器请求头(Referer、Accept 等),避免被服务器识别为爬虫。
体验优化:
异步操作(多线程)避免 UI 卡顿。
清晰的进度展示和日志记录。
自动检测并提示缺失的依赖工具。
多种信息提取方式兜底(工具调用失败则用自定义爬虫)。
异常捕获与错误提示(如无效 URL、下载失败)。 |
|