菜单

InfoExtractor 基类

相关源文件

InfoExtractor 基类是 youtube-dl 提取系统的基础。它提供了从各种网站提取视频元数据和下载信息的核心功能。本页面记录了 InfoExtractor 类的架构、关键方法和用法模式,该类是 youtube-dl 代码库中所有特定网站提取器的父类。

有关特定平台提取器的信息,请参阅 特定平台提取器。有关通用提取器的详细信息,请参阅 通用提取器

架构概述

InfoExtractor 类位于 youtube-dl 提取系统的核心。当用户请求下载时,YoutubeDL 核心组件会确定哪个提取器应处理给定的 URL,并将提取过程委托给相应的 InfoExtractor 子类。

类层次结构

来源: youtube_dl/extractor/vimeo.py39-40/youtube_dl/extractor/brightcove.py9-10/youtube_dl/extractor/soundcloud.py7-10/youtube_dl/extractor/arte.py6-7

提取过程

下面的图表说明了下载视频时的典型提取流程。

来源: youtube_dl/extractor/__init__.py19-46/test/test_download.py167-172

核心功能

InfoExtractor 基类提供了丰富的实用工具集,供子类用于从不同网站提取视频信息。这些实用工具处理常见任务,如下载网页、解析 HTML 和 JSON 以及规范化元数据。

关键属性

属性类型描述
_VALID_URL正则表达式匹配此提取器可以处理的 URL 的模式
_WORKING布尔值指示此提取器是否正常运行(默认为 True)
_NETRC_MACHINE字符串用于 .netrc 身份验证的机器名称
IE_NAME字符串提取器的名称(默认为类名去掉 'IE')
IE_DESC字符串提取器的人类可读描述

来源: youtube_dl/extractor/generic.py137-140/youtube_dl/extractor/vimeo.py40-41/youtube_dl/extractor/vimeo.py291-292

核心方法

InfoExtractor 类定义了几个核心方法,它们构成了提取过程的骨干。

URL 处理方法

  • suitable(url): 通过与 _VALID_URL 匹配来确定提取器是否可以处理给定的 URL。
  • extract(url): 提取的主要入口点。通常在执行通用的设置任务后调用 _real_extract
  • _real_extract(url): 特定平台提取器必须实现以提取视频信息的方

网页内容检索方法

  • _download_webpage(url, video_id, ...): 从 URL 下载 HTML 内容。
  • _download_json(url, video_id, ...): 从 URL 下载并解析 JSON 数据。
  • _download_xml(url, video_id, ...): 从 URL 下载并解析 XML 数据。

内容解析方法

  • _search_regex(pattern, string, name, ...): 在字符串中搜索模式并返回匹配项。
  • _html_search_regex(pattern, webpage, name, ...): 在 HTML 中搜索模式。
  • _og_search_property(prop, html, ...): 从 HTML 中提取 Open Graph 元数据。
  • _html_search_meta(name, html, ...): 从 HTML meta 标签中提取元数据。

格式处理方法

  • _sort_formats(formats): 根据质量对提取的格式进行排序。
  • _extract_m3u8_formats(url, ...): 从 M3U8 manifest 中提取格式。
  • _extract_mpd_formats(url, ...): 从 MPEG-DASH manifest 中提取格式。

来源: youtube_dl/extractor/vimeo.py118-122/youtube_dl/extractor/brightcove.py11-37

创建特定平台提取器

要为特定网站创建新的提取器,您需要继承 InfoExtractor 基类并至少实现以下内容:

  1. 定义一个匹配目标网站 URL 的 _VALID_URL 模式
  2. 实现 _real_extract 方法来处理提取逻辑

特定平台提取器的典型结构示例

典型提取流程

大多数特定平台提取器的 _real_extract 方法遵循类似的模式

  1. 使用 _VALID_URL 中的捕获组从 URL 中提取视频 ID
  2. 下载包含视频信息的网页或 JSON 数据
  3. 提取元数据(标题、描述、上传者等)和可用格式
  4. 返回一个包含所有提取信息的字典

来源: youtube_dl/extractor/vimeo.py259-548/youtube_dl/extractor/thestar.py28-36

信息字典

信息字典(或 info_dict)是所有提取器返回的标准数据结构。它包含视频的元数据和可用的下载格式。

信息字典中的常见字段

字段类型描述
id字符串视频的唯一标识符
title字符串视频标题
formats列表具有质量信息的可用下载格式
thumbnails列表可用的缩略图图像
description字符串视频描述
upload_date字符串上传日期,格式为 YYYYMMDD
uploader字符串上传者姓名
uploader_id字符串上传者 ID
duration数字视频时长(秒)
view_count数字观看次数
like_count数字点赞数
comment_count数字评论数
subtitlesDict按语言代码区分的可用字幕

有关信息字典中所有可能字段的完整参考,请参阅 YoutubeDL 类中的文档。

来源: youtube_dl/extractor/vimeo.py217-228/youtube_dl/extractor/soundcloud.py450-454

通用提取模式

InfoExtractor 基类旨在处理各种提取场景。以下是特定平台提取器使用的一些常见模式:

直接视频 URL 提取

对于公开直接视频 URL 的网站,提取器通常会

  1. 下载网页
  2. 使用正则表达式或 DOM 解析来提取视频 URL
  3. 返回包含 URL 和元数据的字典

基于 API 的提取

对于具有 API 的网站,提取器通常会

  1. 根据视频 ID 构建 API 请求 URL
  2. 下载并解析 JSON 响应
  3. 从响应中提取视频 URL 和元数据

嵌入式播放器提取

许多提取器通过以下方式处理嵌入式视频:

  1. 识别网页中的嵌入式播放器
  2. 提取播放器的配置数据
  3. 解析配置以查找视频 URL 和元数据

从多个来源提取

一些复杂的提取器会合并多个来源

  1. 下载主网页以获取基本元数据
  2. 调用其他 API 来获取视频格式
  3. 将来自不同来源的信息合并到一个字典中

来源: youtube_dl/extractor/generic.py137-289/youtube_dl/extractor/soundcloud.py318-445

错误处理

InfoExtractor 基类提供了强大的错误处理机制,用于应对各种失败场景。

常见错误类型

  • ExtractorError: 当提取因预期原因(地理限制、私有视频等)失败时引发。
  • DownloadError: 下载网页或文件失败时引发。
  • UnavailableVideoError: 视频不可用(已删除、私有等)时引发。

错误报告

提取器应引发适当的带有描述性消息的错误,以帮助用户理解提取失败的原因。InfoExtractor 基类提供了常见错误场景的辅助方法。

来源: youtube_dl/extractor/soundcloud.py301-308

与YoutubeDL的集成

InfoExtractor 基类并非孤立工作。它通过 ExtractorRegistry 与 YoutubeDL 核心紧密集成。

提取器注册

所有提取器类都会自动注册到 ExtractorRegistry,该注册表维护着可用提取器的列表。当 YoutubeDL 处理 URL 时,它会使用该注册表来查找适当的提取器。

来源: youtube_dl/extractor/__init__.py19-46

结论

InfoExtractor 基类是 youtube-dl 能够以统一的接口支持数百个不同视频平台的基石。它提供了丰富的网页解析、元数据提取和格式处理实用工具集,特定平台提取器可以利用这些工具来实现特定网站的逻辑。

通过理解InfoExtractor类及其支持的提取模式,开发人员可以维护现有的提取器并创建新的提取器来扩展youtube-dl的功能。