本指南解释了如何通过实现自定义提取器来为 you-get 添加对新网站的支持。提取器是处理从网站提取视频、音频或图像信息的特定于站点的逻辑的模块。每个受支持的网站都有其自己的提取器,了解该网站的结构、API 和媒体传输机制。
在创建新的提取器之前,了解提取器如何适应 you-get 的整体架构非常重要。
来源: src/you_get/extractor.py10-274
当用户运行 you-get 并提供一个 URL 时,系统会:
来源: src/you_get/extractor.py42-62 src/you_get/extractor.py179-267
按照以下步骤为新网站创建提取器
在 src/you_get/extractors/ 目录下创建一个新的 Python 文件。以你支持的网站命名(例如,newsite.py)。
你的提取器类应:
VideoExtractorname 属性stream_types 列表prepare 方法extract 方法示例骨架
来源: src/you_get/extractors/imgur.py7-77 src/you_get/extractors/youtube.py15-442
prepare 方法prepare 方法是提取器的核心。它需要:
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
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
extract 方法(可选)extract 方法在 prepare 方法之后调用,负责设置要下载的所选流。在许多情况下,您不需要实现此方法,因为基本实现已足够。
何时实现 extract
来源: src/you_get/extractor.py86-88 src/you_get/extractors/youtube.py417-431
让我们看一个 Imgur 提取器的简单示例
Imgur 提取器处理三种类型的 URL:
imgur.com/a/...)i.imgur.com/...)imgur.com/gallery/...)对于每种类型,它提取相关信息并用适当的图片 URL 填充 streams 字典。
来源: src/you_get/extractors/imgur.py7-77
对于像 Bilibili 这样更复杂的网站,提取器需要处理:
Bilibili 提取器实现了一个广泛的 prepare 方法,该方法:
来源: src/you_get/extractors/bilibili.py10-599
大多数提取器都通过分析 URL 来提取 ID 或确定内容类型
来源: src/you_get/extractors/youtube.py144-153 src/you_get/extractors/bilibili.py166-208
使用 get_content 函数发出 HTTP 请求
对于 JSON API
来源: src/you_get/extractors/bilibili.py159 src/you_get/extractors/youtube.py225-226
对于 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
错误处理:为网络请求和解析操作实现适当的错误处理。
用户代理:设置一个真实的用户代理以避免被阻止
Referer:在发出请求时设置适当的 Referer 头部
分页:对于播放列表,在 download_playlist_by_url 方法中实现分页支持。
文档:添加注释解释特定于站点的逻辑,特别是对于复杂的 API 交互或解密。
流排序:按照质量顺序定义 stream_types 列表,以帮助用户选择最佳格式。
优雅降级:如果某些功能(如字幕)不可用,则继续下载而不是失败。
来源: src/you_get/extractors/youtube.py209 src/you_get/extractors/bilibili.py62-71
要测试您的提取器:
以开发模式安装 you-get
pip install -e .
尝试使用 -i 选项下载视频以查看可用流
you-get -i "https://example.com/video"
下载视频以验证提取器是否正常工作
you-get "https://example.com/video"
使用不同的 URL 模式和内容类型进行测试,以确保全面覆盖。
验证元数据(标题、缩略图)和流选择是否正常工作。
来源: README.md164-201
添加新的提取器到 you-get 涉及:
VideoExtractor 的新提取器类prepare 方法以提取媒体信息通过仔细的分析和实现,您可以扩展 you-get,以支持那些尚未被现有提取器覆盖的您喜欢的网站。