菜单

添加新的提取器

相关源文件

本指南解释了如何通过实现自定义提取器来为 you-get 添加对新网站的支持。提取器是处理从网站提取视频、音频或图像信息的特定于站点的逻辑的模块。每个受支持的网站都有其自己的提取器,了解该网站的结构、API 和媒体传输机制。

提取器架构概述

在创建新的提取器之前,了解提取器如何适应 you-get 的整体架构非常重要。

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

当用户运行 you-get 并提供一个 URL 时,系统会:

  1. 分析 URL 以确定它属于哪个网站
  2. 加载相应的提取器模块
  3. 使用提取器获取并解析网页
  4. 提取媒体信息和可用格式
  5. 下载所选格式

提取过程流程

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

创建一个新的提取器

按照以下步骤为新网站创建提取器

1. 创建一个新文件

src/you_get/extractors/ 目录下创建一个新的 Python 文件。以你支持的网站命名(例如,newsite.py)。

2. 导入所需模块

3. 定义你的提取器类

你的提取器类应:

  • 继承自 VideoExtractor
  • 定义一个 name 属性
  • 可选地定义一个 stream_types 列表
  • 实现 prepare 方法
  • 可选地实现 extract 方法

示例骨架

来源: src/you_get/extractors/imgur.py7-77 src/you_get/extractors/youtube.py15-442

4. 实现 prepare 方法

prepare 方法是提取器的核心。它需要:

  1. 从 URL 中提取视频 ID 或其他标识符(如果适用)
  2. 获取网页或 API 数据
  3. 解析数据以提取元数据(标题、描述等)
  4. 识别可用的流/格式
  5. 用提取的数据填充以下属性:
    • self.title: 视频/图片的标题
    • self.streams: 可用流的字典(非 DASH 格式)
    • self.dash_streams: 可用 DASH 流的字典(如果适用)
    • self.caption_tracks: 字幕的字典(如果可用)
    • self.danmaku: 弹幕内容(针对具有此功能的网站)

来源: src/you_get/extractors/imgur.py15-67 src/you_get/extractors/youtube.py208-415 src/you_get/extractors/bilibili.py153-508

5. 流字典结构

streams 字典应具有以下结构:

self.streams = {
    'stream_id': {
        'container': 'mp4',     # Container format (mp4, flv, etc.)
        'quality': 'high',      # Human-readable quality
        'size': 12345678,       # Size in bytes (if known)
        'src': ['http://example.com/video.mp4'],  # List of source URLs
    },
    # Additional stream formats...
}

对于 DASH 流(单独的音频和视频)

self.dash_streams = {
    'stream_id': {
        'container': 'mp4',
        'quality': '1080p',
        'size': 12345678,
        'src': [
            ['http://example.com/video.mp4'],  # Video streams
            ['http://example.com/audio.mp4']   # Audio streams
        ],
    },
    # Additional DASH formats...
}

来源: src/you_get/extractors/bilibili.py305-307 src/you_get/extractors/youtube.py383-391

6. 实现 extract 方法(可选)

extract 方法在 prepare 方法之后调用,负责设置要下载的所选流。在许多情况下,您不需要实现此方法,因为基本实现已足够。

何时实现 extract

  • 当特定流格式需要额外处理时
  • 当您需要发出额外请求以获取可播放的 URL 时
  • 当您需要解密或转换流 URL 时

来源: src/you_get/extractor.py86-88 src/you_get/extractors/youtube.py417-431

示例:简单提取器(Imgur)

让我们看一个 Imgur 提取器的简单示例

Imgur 提取器处理三种类型的 URL:

  1. 相册 URL (imgur.com/a/...)
  2. 直接图片 URL (i.imgur.com/...)
  3. 图库图片 URL (imgur.com/gallery/...)

对于每种类型,它提取相关信息并用适当的图片 URL 填充 streams 字典。

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

示例:复杂提取器(Bilibili)

对于像 Bilibili 这样更复杂的网站,提取器需要处理:

  1. 多种页面类型(视频、番剧、直播等)
  2. 各种视频质量和格式
  3. 带身份验证的 API 请求
  4. 提取元数据、评论和字幕

Bilibili 提取器实现了一个广泛的 prepare 方法,该方法:

  1. 识别内容类型(普通视频、番剧、直播等)
  2. 根据内容类型发出相应的 API 请求
  3. 提取可用的流格式及其 URL
  4. 处理单独的音频和视频的 DASH 流
  5. 在可用时提取弹幕(评论)

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

常用技术

URL 分析

大多数提取器都通过分析 URL 来提取 ID 或确定内容类型

来源: src/you_get/extractors/youtube.py144-153 src/you_get/extractors/bilibili.py166-208

发出 HTTP 请求

使用 get_content 函数发出 HTTP 请求

对于 JSON API

来源: src/you_get/extractors/bilibili.py159 src/you_get/extractors/youtube.py225-226

解析 HTML/JSON

对于 HTML 解析,使用正则表达式或其他解析方法

对于 JSON 数据

来源: src/you_get/extractors/youtube.py240 src/you_get/extractors/bilibili.py244-245

处理多种流格式

按质量对流进行排序和组织

来源: src/you_get/extractors/bilibili.py14-43 src/you_get/extractors/bilibili.py295-307

最佳实践

  1. 错误处理:为网络请求和解析操作实现适当的错误处理。

  2. 用户代理:设置一个真实的用户代理以避免被阻止

  3. Referer:在发出请求时设置适当的 Referer 头部

  4. 分页:对于播放列表,在 download_playlist_by_url 方法中实现分页支持。

  5. 文档:添加注释解释特定于站点的逻辑,特别是对于复杂的 API 交互或解密。

  6. 流排序:按照质量顺序定义 stream_types 列表,以帮助用户选择最佳格式。

  7. 优雅降级:如果某些功能(如字幕)不可用,则继续下载而不是失败。

来源: src/you_get/extractors/youtube.py209 src/you_get/extractors/bilibili.py62-71

测试您的提取器

要测试您的提取器:

  1. 以开发模式安装 you-get

    pip install -e .
    
  2. 尝试使用 -i 选项下载视频以查看可用流

    you-get -i "https://example.com/video"
    
  3. 下载视频以验证提取器是否正常工作

    you-get "https://example.com/video"
    
  4. 使用不同的 URL 模式和内容类型进行测试,以确保全面覆盖。

  5. 验证元数据(标题、缩略图)和流选择是否正常工作。

来源: README.md164-201

结论

添加新的提取器到 you-get 涉及:

  1. 理解网站的结构和媒体传输机制
  2. 创建一个继承自 VideoExtractor 的新提取器类
  3. 实现 prepare 方法以提取媒体信息
  4. 用可用格式填充流字典
  5. 导出必要的函数供 you-get 使用

通过仔细的分析和实现,您可以扩展 you-get,以支持那些尚未被现有提取器覆盖的您喜欢的网站。