菜单

通用提取器

相关源文件

通用提取器是 youtube-dl 中一种备用机制,用于从没有专用平台提取器的网站提取媒体。当没有其他提取器匹配 URL 时,通用提取器会尝试各种技术来识别和提取页面中的视频内容。它特别适用于处理直接媒体链接、来自流行平台的嵌入式播放器以及标准的媒体交付格式。

有关通用提取器继承的 InfoExtractor 基类的信息,请参阅 InfoExtractor 基类。有关特定平台提取器信息,请参阅 特定平台提取器

系统架构和定位

通用提取器在 youtube-dl 的提取器选择过程中充当一个“捕获所有”的解决方案。它拥有尽可能通用的 URL 模式(r'.*'),确保它仅在没有其他更具体的提取器匹配 URL 时运行。

提取工作流中的通用提取器

来源: youtube_dl/extractor/generic.py137-143 youtube_dl/extractor/extractors.py449

核心功能

通用提取器有一个非常简单的识别模式(r'.*'),但包含复杂的检测逻辑。它在继承自基本 InfoExtractor 类的 GenericIE 类中实现。

来源: youtube_dl/extractor/generic.py137-143 youtube_dl/extractor/common.py9

检测和提取策略

通用提取器采用多种技术来检测和提取媒体内容

通过检查以下内容来判断 URL 是否直接指向媒体文件:

  • 文件扩展名
  • HTTP 标头中的 MIME 类型
  • Content-Type 标头

对于直接媒体链接,提取器将:

  1. 确定文件扩展名或格式
  2. 创建以文件名作为标题的基本信息字典
  3. 原样返回 URL 以供下载

来源: youtube_dl/extractor/generic.py286-427

2. 嵌入式播放器检测

通用提取器可以检测并提取各种嵌入式播放器,并在可能时委托给相应的提取器

嵌入式平台检测方法
Brightcove在页面中搜索 Brightcove 对象、参数或 URL
YouTube检测嵌入的 YouTube iframe 或对象
Vimeo识别 Vimeo 播放器并提取视频 ID
Dailymotion定位 Dailymotion 嵌入代码
Facebook查找 Facebook 视频嵌入
还有许多其他语言各种特定平台的检测模式

检测到嵌入式播放器时,通用提取器将:

  1. 提取必要的视频信息(ID、URL)
  2. 委托给相应的特定平台提取器
  3. 返回提取的视频信息

来源: youtube_dl/extractor/generic.py243-284 youtube_dl/extractor/generic.py405-500

3. 媒体清单解析

提取器可以处理各种标准化的媒体格式

格式类型描述文件模式
HLSHTTP 直播.m3u8 文件
DASHHTTP 上的动态自适应流.mpd 文件
SMIL同步多媒体集成语言.smil 文件
XSPFXML 可共享播放列表格式.xspf 文件

这些格式中的每一种都会被解析以提取可用的媒体流和元数据。

来源: youtube_dl/extractor/generic.py350-395 youtube_dl/extractor/generic.py266-335

4. RSS Feed 处理

通用提取器可以从 RSS Feed 中提取媒体附件

  • 检测 RSS XML 结构
  • 提取媒体附件
  • 创建所有媒体项目的播放列表

来源: youtube_dl/extractor/generic.py199-255

5. URL 重定向处理

当 URL 重定向到受支持的平台时

  • 跟踪 HTTP 重定向
  • 处理 URL 短链接
  • 处理 meta refresh 重定向
  • Google 重定向和其他常见的重定向模式

来源: youtube_dl/extractor/generic.py397-427

与其他提取器的交互

通用提取器经常识别应由更专业的提取器处理的内容。在这种情况下,它会将提取委托给适当的专业提取器。

来源: youtube_dl/extractor/generic.py400-650 youtube_dl/extractor/brightcove.py150-284

Brightcove 支持

Brightcove 嵌入视频得到了特别关注,因为它们在许多网站上都很常见。通用提取器对旧版和新版 Brightcove 播放器都有先进的检测功能。

Brightcove 检测方法

  1. 搜索 Brightcove 播放器对象标签
  2. 识别 Brightcove 播放器 JavaScript 代码
  3. 查找 Brightcove URL 和元标签
  4. 提取播放器 ID、视频 ID 和账户 ID

检测到后,提取器会构建一个可以被 BrightcoveLegacyIEBrightcoveNewIE 处理的 URL。

来源: youtube_dl/extractor/generic.py400-580 youtube_dl/extractor/brightcove.py150-284 youtube_dl/extractor/brightcove.py340-400

示例用例

通用提取器处理未应用专用提取器的各种场景

  1. 直接媒体链接:直接从以媒体扩展名(.mp4、.webm 等)结尾的 URL 下载文件
  2. 鲜为人知的网站上的嵌入视频:从嵌入常见平台的网站提取视频
  3. 标准媒体格式:处理 HLS、DASH 和其他标准化的流媒体格式
  4. RSS Feed 中的媒体:从播客 Feed 和其他基于 RSS 的内容中提取媒体
  5. 大学和教育网站:通常处理使用常见视频平台的教育门户网站上的视频

局限性

通用提取器有几个局限性

  1. 它无法从具有复杂保护或加密的网站提取
  2. 没有可识别模式的自定义播放器可能无法被检测到
  3. 严重混淆其嵌入代码的网站可能难以处理
  4. DRM 保护的内容无法下载
  5. 随着平台更改其嵌入方法,某些检测方法可能会过时

测试通用提取器

通用提取器包含涵盖各种场景的广泛测试用例

测试类型描述
直接链接用于直接视频文件 URL 的测试
嵌入式视频用于各种嵌入式播放器类型的测试
媒体格式用于 HLS、DASH、SMIL 等的测试
RSS Feed用于从 RSS Feed 中提取的测试
重定向用于 URL 重定向的测试

来源: youtube_dl/extractor/generic.py141-1137

总结

通用提取器是 youtube-dl 中一项必不可少的备用机制,它能够从各种没有专用提取器的网站提取媒体。它使用复杂的检测技术来识别和提取媒体内容,这使得 youtube-dl 比仅依赖特定平台提取器更加通用。

来源: youtube_dl/extractor/generic.py137-1600