Skip to content

develop guide

SeaHOH edited this page Feb 8, 2020 · 8 revisions

Basic intro

VideoExtractor

  • prepare:
    解析单个视频的函数,必须重载,需要返回一个 VideoInfo 的实例

  • prepare_list:
    解析播放的函数,需要支持播放列表时重载,需要返回一个 VideoInfo 实例的列表,列表中每一个元素是一个具体的视频信息。 或者用 yield 返回一个生成 VideoInfo 的生成器。

  • list_only:
    判断是否只解析播放列表而非单个视频的函数,需要时重载,返回一个 boolean 值。

VideoInfo

  • 结构:
成员 含义 类型
site 网站名 utf-8 String,汉字(字母)
title 视频标题 utf-8 String,直播视频建议加入作者信息
artist 视频作者 utf-8 String
stream_types 当前视频支持的清晰度列表 list,最好是 TD, HD, SD 等组成的, 按清晰度排序
streams 视频的具体信息 dict,其中 key 来自 stream_types
live 是否为直播 boolean
extra 附加参数,用于播放器 dict,保存 HTTP 头字段等参数
  • streams:
key container video_profile src size
来自 stream_types 具体的视频后缀 flv/mp4/m3u8 便于理解的 key 视频真实的链接,是一个列表 视频的大小,可以是 0,或float('inf')
  • extra:
key ua referer header proxy rangefetch
--- User-Agent Referer 其它头字段 代理地址,由 cykdl 自动设置 分段下载代理参数,用于加速限速视频
  • rangefetch:
key first_size max_size threads video_rate proxy headers
--- 第一分段大小 最大分段大小 初始下载线程,下载中会随情况自动增减 码率 dict,key 对应 streams 代理地址,由 cykdl 自动设置 暂未使用

其他模块

name usage
compact 兼容性,需要考虑兼容 OS 差异,python 版本差异
downloader 内置下载器,支持多任务和断点续传
rangefetch_server 内置分段多线程下载代理,仅用于播放器
html urllib.request 的简单封装, 用于下载页面
jsengine 对系统内置、python 绑定以及常见 Javascript 解释器的封装,用于执行 Javascript
match re 的简单封装, 用于获取匹配字符串,如 title, vid
wrap 外部工具的简单封装, player, ffmpeg
m3u8_wrap 外部 library m3u8 的简单封装, 用于解析 m3u8
cykdl/__main__.py 主入口,一个例子,各种乱七八糟的东西

support new sites

implement

Tools

external develop guild

things you need to know

  • ykdl 是一个可以获取视频真实信息的 python lib.
  • ykdl 有内置的视频下载方法
  • cykdl 是一个使用 ykdl 的例子
  • ykdl 支持的网站列表

开始

第一步:

作为一个 library,ykdl 被使用的方式只有一个

from ykdl.commom import url_to_module

第二步:

site, new_url = url_to_module(url)

返回值:

site: 解析url的模块

new_url:和 url 相同,或者是 url 重定向之后的网址,或者是 get_extractor(url) 返回的结果

第三步:

如果解析的是一个列表:

video_list = site.parser_list(new_url)

返回值:

video_list : 一个 video_info 的列表或者是一个生成 video_info 的生成器

如果解析的是单个视频:

video = site.parser(new_url)

返回值:

video : 是一个 video_info 类型的变量

第四步:

根据返回值类型做相应的操作,可以调用内置下载器下载,或者外部下载器,或者是直接调用播放器播放。

参考代码

https://github.com/zhangn1985/ykdl/blob/master/cykdl/__main__.py