菜单

提取器系统

相关源文件

提取器系统是 You-Get 的核心组件,负责从各种网站提取媒体 URL 和元数据。它为从 70 多个不同网站下载内容提供了一个统一的接口,每个网站都有其独特的结构和 API。本文档记录了提取器系统的架构、功能和用法。

有关整体下载流程的信息,请参阅 下载系统。有关 URL 如何映射到提取器的详细信息,请参阅 URL 路由

概述

提取器系统抽象了解析不同网站结构和 API 的复杂性,为 You-Get 的其余部分提供了一个一致的接口。它负责:

  1. 从网页提取实际的媒体 URL
  2. 识别可用的媒体格式和质量级别
  3. 解析标题和视频描述等元数据
  4. 处理特定站点的身份验证和加密
  5. 提取字幕或歌词等辅助内容

来源:src/you_get/extractor.py1-274 src/you_get/extractors/__init__.py1-87 src/you_get/common.py25-127

提取器类层次结构

提取器系统围绕一系列类构建,这些类提供功能上越来越专业的服务。

来源:src/you_get/extractor.py10-20 src/you_get/extractor.py21-274

基础提取器类

You-Get 提供了两个主要的基类来构建特定于站点的提取器:

  1. Extractor:一个最小的基类,具有用于简单场景的基本属性

  2. VideoExtractor:一个全面的基类,具有用于视频提取的扩展功能

VideoExtractor 类是更常用的基类,因为它提供了完整的下载工作流程的方法。

方法目的
download_by_url(url, **kwargs)按 URL 下载的入口点
download_by_vid(vid, **kwargs)按视频 ID 下载的入口点
prepare(**kwargs)准备提取(解析网页,获取元数据)
extract(**kwargs)提取实际的媒体 URL
download(**kwargs)处理下载过程
p_stream(stream_id)打印特定流的信息
p(stream_id)打印可用流的信息

来源:src/you_get/extractor.py10-20 src/you_get/extractor.py21-274

提取器工作流程

提取器操作的典型工作流程遵循以下顺序:

来源:src/you_get/extractor.py42-62 src/you_get/extractor.py179-267

关键工作流程方法

  1. prepare():设置提取过程

    • 解析网页以提取元数据(标题、可用格式等)
    • 识别可用流及其质量
    • 将提取的信息存储在提取器的属性中
  2. extract():执行实际的 URL 提取

    • 根据用户偏好选择合适的流
    • 解析最终的媒体 URL 以进行下载
  3. download():处理下载过程

    • 如果设置了 info_only,则下载内容或显示信息
    • 管理文件创建、命名和保存
    • 处理字幕或歌词等辅助内容

来源:src/you_get/extractor.py82-88 src/you_get/extractor.py179-267

特定站点提取器

每个网站都有自己的提取器,它们继承自 VideoExtractor,并实现特定于站点的逻辑来提取媒体内容。

站点提取器的常见结构

来源:src/you_get/extractors/bilibili.py10-153 src/you_get/extractors/imgur.py7-16

示例:Bilibili 提取器

Bilibili 提取器展示了一个复杂的实现,具有许多特定于站点的功能。

来源:src/you_get/extractors/bilibili.py10-597

示例:简单的 Imgur 提取器

相比之下,Imgur 提取器要简单得多。

来源:src/you_get/extractors/imgur.py7-74

流管理

提取器管理两种类型的流字典:

  1. 常规流(self.streams:包含传统的媒体流
  2. DASH 流(self.dash_streams:包含 DASH 格式的流(单独的音频和视频)

流字典结构

每个提取器都定义了自己的 stream_types 列表,该列表决定了可用质量级别及其优先级。

来源:src/you_get/extractors/bilibili.py14-42 src/you_get/extractor.py91-116

处理多种媒体来源

许多提取器需要处理多种媒体类型或不同的 URL 模式。这通常在 prepare() 方法中完成,通过以下方式:

  1. 分析 URL 模式或内容以确定媒体类型
  2. 根据识别出的类型应用不同的提取逻辑

例如,Bilibili 提取器处理多种内容类型。

来源:src/you_get/extractors/bilibili.py193-506

与主系统的集成

提取器系统主要通过 common.py 中的 URL 路由机制与 You-Get 主系统集成。

  1. SITES 字典将域名映射到特定的提取器模块。
  2. url_to_module() 函数(在代码库中隐式定义)使用此字典来确定使用哪个提取器。
  3. any_download() 函数实例化相应的提取器并调用其方法。

来源:src/you_get/common.py25-127 src/you_get/extractor.py42-62

添加新提取器

要为新网站添加支持,通常需要:

  1. extractors 目录中创建一个新的 Python 模块
  2. 定义一个继承自 VideoExtractor 的类
  3. 至少实现 prepare() 方法
  4. common.pySITES 字典中添加站点

有关实现新提取器的详细信息,请参阅 添加新提取器

总结

提取器系统是 You-Get 支持广泛网站能力的核心。其模块化设计允许:

  1. 为主应用程序提供一致的接口
  2. 轻松添加新的站点提取器
  3. 在重用通用代码的同时进行特定于站点的自定义
  4. 灵活处理不同的媒体类型和格式

这种架构使 You-Get 能够以最小的代码重复和可维护的代码库支持 70 多个不同的网站。