HTTP 下载器是 youtube-dl 下载系统中的核心组件,负责通过 HTTP 和 HTTPS 协议获取媒体文件。它提供了强大的基础文件下载功能,包括可续传性、速率限制和错误处理。对于 HLS、DASH 或 RTMP 等专用媒体格式,请参阅 碎片媒体下载器 中的相应下载器。
HTTP 下载器实现为 HttpFD,它是抽象的 FileDownloader 类的子类。它处理标准的 HTTP/HTTPS 文件下载过程,管理连接、跟踪进度,并在从 Web 服务器下载内容时处理错误。
下载器系统层级中的 HTTP 下载器
来源: youtube_dl/downloader/http.py youtube_dl/downloader/common.py youtube_dl/downloader/fragment.py youtube_dl/downloader/hls.py youtube_dl/downloader/dash.py youtube_dl/downloader/f4m.py youtube_dl/downloader/rtmp.py youtube_dl/downloader/ism.py
HTTP 下载器负责 HTTP 下载的整个生命周期,从建立连接到完成下载文件。核心工作流程包括以下主要阶段:
来源: youtube_dl/downloader/http.py28-362
HTTP 下载器使用 DownloadContext 字典状对象来维护下载过程中的状态。此上下文包含:
来源: youtube_dl/downloader/http.py31-34
establish_connection 函数处理:
如果请求了续传但服务器不支持,下载器将从头开始。
来源: youtube_dl/downloader/http.py86-196
主要的 download 函数管理:
来源: youtube_dl/downloader/http.py197-346
HTTP 下载器支持恢复部分下载的文件,这对于大型媒体文件特别有用。此功能由 continuedl 参数控制,工作方式是:
Range HTTP 标头以仅请求剩余部分Content-Range 标头验证服务器响应是否支持 Range 请求此功能对于在不从头开始的情况下恢复中断的下载至关重要。
来源: youtube_dl/downloader/http.py59-147
速率限制可防止下载器充分利用可用带宽
ratelimit 参数指定每秒最大字节数slow_down 方法来源: youtube_dl/downloader/common.py177-191
HTTP 下载器通过 http_chunk_size 参数支持分块下载
此功能通过使用 Range 标头请求特定的字节范围,然后将这些块合并为完整文件来实现。
来源: youtube_dl/downloader/http.py87-100 youtube_dl/downloader/http.py313-316
为了优化下载性能,HTTP 下载器会根据下载速度动态调整块大小
buffersize 参数(默认:1024 字节)noresizebuffer 参数禁用来源: youtube_dl/downloader/common.py136-147 youtube_dl/downloader/http.py289-292
HTTP 下载器实施了强大的错误处理机制,以应对各种网络问题
下载器将根据 retries 参数重试失败的下载
当需要重试时,下载器会报告错误,在必要时等待,然后再次尝试下载。
来源: youtube_dl/downloader/http.py347-361 youtube_dl/downloader/http.py149-195
下载完成后,下载器会验证接收到的内容是否与预期大小匹配
Content-Length 标头,下载器会将其与实际下载的字节数进行比较ContentTooShortError,可能会触发重试此验证有助于确保下载内容的完整性。
来源: youtube_dl/downloader/http.py325-329
HTTP 下载器支持许多控制其行为的配置选项
| 选项 | 描述 | 默认 |
|---|---|---|
buffersize | 下载缓冲区大小(字节) | 1024 |
continuedl | 尽可能尝试继续下载 | True |
http_chunk_size | 分块下载的块大小 | 0 (禁用) |
noprogress | 不要打印进度条 | 否 |
noresizebuffer | 不要自动调整下载缓冲区大小 | 否 |
ratelimit | 下载速度限制(字节/秒) | None |
retries | 针对 HTTP 错误 5xx 的重试次数 | 0 |
test | 仅下载前几个字节以测试下载器 | 否 |
min_filesize | 跳过小于此大小的文件 | None |
max_filesize | 跳过大于此大小的文件 | None |
updatetime | 使用 Last-modified 标头设置输出文件时间戳 | True |
xattr_set_filesize | 使用预期的文件大小设置 ytdl.filesize 用户 xattribute | 否 |
这些选项可以在传递给 FileDownloader 构造函数的 params 字典中设置。
来源: youtube_dl/downloader/common.py20-56
HTTP下载器集成了youtube-dl的其他组件
来源: youtube_dl/downloader/common.py youtube_dl/downloader/http.py youtube_dl/downloader/fragment.py145-156
HTTP下载器被基于片段的下载器(如FragmentFD及其子类)用作
HttpQuietDownloader - 一种抑制输出的专用版本这种关系使专用下载器能够利用强大的 HTTP 下载功能,同时实现其自身的格式特定逻辑。
来源: youtube_dl/downloader/fragment.py17-19 youtube_dl/downloader/fragment.py145-156
HTTP下载器通过钩子机制报告下载进度
add_progress_hook 注册进度钩子此信息用于向用户显示进度条和其他反馈。
来源: youtube_dl/downloader/http.py296-308 youtube_dl/downloader/common.py258-317