文章目录
关于 you-get
- github : https://github.com/soimort/you-get
you-get 是一个有名的开源视频下载工具包,这里不赘述。
代码调用
you-get 提供了命令行的方式下载视频,这里介绍使用 Python 调用源代码来下载视频,以便处理更多定制化的需求。
以下载 youtube 视频为例
代码逻辑如下,但运行时会出现报错,调整方式见下方:
python
site = YouTube()
# 使用 url 下载
url = 'https://www.youtube.com/watch?v=mchvUV0iQLg'
site.download_by_url(url)
# 使用 vid 下载
vid = '1c3iQWFEDJI'
site.download_by_vid(vid)
报错处理
1、使用 url 下载时,可能会报错:[Failed] Unsupported URL pattern.
如果一个 url 是 https://www.youtube.com/watch?v=mchvUV0iQLg
,那么它的 vid 是 mchvUV0iQLg
。
是因为 youtube.py 中的 get_vid_from_url
没有解析到 url 中的 vid,导致 prepare 函数中会将 url 传递给 download_playlist_by_url
来下载,同时它不符合 playlist 的标准,所以报错。
你可以更改 get_vid_from_url
的规则来识别 vid。
2、只传递 vid 来下载时,程序可能崩溃,因为 youtube.py
中的 prepare
函数,在执行 if re.search('\Wlist=', self.url)
的时候,这里没有传递 url,所以改为如下即可:
python
if self.url and re.search('\Wlist=', self.url) and not kwargs.get('playlist'):
log.w('This video is from a playlist. (use --playlist to download all videos in the playlist.)')
源码简单分析
在调用和打断点的过程,我们可以了解到
- 源码主要在 src 文件夹中;
- 各个下载器在 extractors 文件夹中,下载器继承自
VideoExtractor
类; - VideoExtractor 类内部,会调用子类的
extract
来提取流的内容;
调用自身的download
方法下载视频,这里会使用common.py
文件的download_urls
方法,内部使用 ffmpeg 下载视频,并根据需要将分段视频合并。
shell
├── src
│ └── you_get
│ ├── __init__.py
│ ├── __main__.py
│ ├── cli_wrapper
│ │ ├── __init__.py
│ │ ├── downloader
│ │ │ └── __init__.py
│ │ ├── openssl
│ │ │ └── __init__.py
│ │ ├── player
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── dragonplayer.py
│ │ │ ├── gnome_mplayer.py
│ │ │ ├── mplayer.py
│ │ │ ├── vlc.py
│ │ │ └── wmp.py
│ │ └── transcoder
│ │ ├── __init__.py
│ │ ├── ffmpeg.py
│ │ ├── libav.py
│ │ └── mencoder.py
│ ├── common.py
│ ├── extractor.py
│ ├── extractors
│ │ ├── __init__.py
│ │ ├── acfun.py
│ │ ├── alive.py
│ │ ├── ...
│ │ ├── youku.py
│ │ ├── youtube.py
│ │ └── zhihu.py
│ ├── json_output.py
│ ├── processor
│ │ ├── __init__.py
│ │ ├── ffmpeg.py
│ │ ├── join_flv.py
│ │ ├── join_mp4.py
│ │ ├── join_ts.py
│ │ └── rtmpdump.py
│ ├── util
│ │ ├── __init__.py
│ │ ├── fs.py
│ │ ├── git.py
│ │ ├── log.py
│ │ ├── os.py
│ │ ├── strings.py
│ │ └── term.py
│ └── version.py
├── tests
│ ├── __init__.py
│ ├── test.py
│ ├── test_common.py
│ └── test_util.py
├── you-get
├── you-get.json
└── you-get.plugin.zsh
伊织 2023-11-09(周四)