FFandown 插件
首先,你需要知道这是一个专门为开发ffandown插件的 demo。它不支持其他系统
插件列表
插件名称 | 插件地址 | 插件仓库 | 插件描述 |
---|---|---|---|
bilibili | github | github | 支持b站直播和视频解析,如果不设置 cookie 只能下载 480p |
要求
- FFandown (5.0+)
开发
不支持在脚本内引入其他的第三方模块
插件是在下载之前调用的,在 ffandown 输入的地址,首先会进入插件系统匹配(通过插件的 match 方法匹配),如果匹配到了插件,那么会将地址和插件的配置信息传给插件的 parser 方法,等待 parser 返回解析后的地址之后,调用 ffandown 的下载器开始下载。
插件是通过 node 的 vm 模块运行的,插件不可以调用所有的 node 的模块,仅支持以下几个模块和函数。
fs
、path
模块只能操作 tmp(可执行文件目录) 文件夹,其他文件夹没有权限执行。
模块 | 模块文档 |
---|---|
bcrypt | https://www.npmjs.com/package/bcrypt ^5.1.1 |
fetch | https://www.npmjs.com/package/node-fetch ^2 |
URL | https://nodejs.org/api/url.html#class-url |
URLSearchParams | https://nodejs.org/api/url.html#class-urlsearchparams |
console | https://nodejs.org/api/console.html#console |
fs | readFileSync、writeFileSync、existsSync、mkdirSync、readdirSync、unlinkSync、statSync、 |
path | https://nodejs.org/api/path.html |
log | winston实例,日志会输出到日志文件内,verbose 方法会在 debug 开启时输出 |
基础插件
插件的基础结构如下:
class Parser {
match(url) {
// return true if the url is matched
return true;
}
async parser(url, options) {
return {
url,
audioUrl,
headers: [
{
key: 'cookie',
value: 'cookie'
}
]
}
}
}
插件本身是一个类,match 和 parser 方法必须存在。 match
方法用于匹配地址, match
方法返回 true 表示匹配成功,parser
方法返回解析后的地址。 match
方法的参数是地址
parser
方法用于解析地址,需要解析后的地址必须是一个对象,对象的结构如下:
{
url: string,
audioUrl: string,
headers: [{
key: string,
value: string
}]
}
url 是视频的地址,audioUrl 是音频的地址。(注意:audioUrl 是可选的) 如果 url 和 audioUrl 同时存在,那么会同时下载视频和音频并合并在一起。 headers
是请求头,是一个数组,数组的每个元素是一个对象。 headers
是可选的。
parser
方法的参数是地址和插件的配置信息。 插件的配置信息是在插件系统内配置,在插件系统内配置的插件的配置信息会被传递给插件的 parser 方法。
插件配置
如果插件需要配置 cookie 等信息,那么首先需要在package.json
中的 settings
字段内配置。
settings
字段的结构如下:
{
"settings": {
"cookie": {
"type": "input",
"value": "",
"require": true,
"label": "Cookie",
"placeholder": "请输入 cookie"
},
"quality": {
"type": "select",
"placeholder": "请选择最高质量",
"options": [
{
"label": "超高清 8K",
"value": "127"
},
{
"label": "杜比视界",
"value": "126"
},
{
"label": "真彩 HDR",
"value": "125"
},
{
"label": "超清 4K",
"value": "120"
},
{
"label": "高清 1080P60",
"value": "116"
},
{
"label": "高清 1080P+",
"value": "112"
},
{
"label": "高清 1080P",
"value": "80"
},
{
"label": "高清 720P60",
"value": "72"
},
{
"label": "高清 720P",
"value": "64"
},
{
"label": "清晰 480P",
"value": "32"
},
{
"label": "流畅 360P",
"value": "16"
},
{
"label": "极速 240P",
"value": "6"
}
],
"require": true,
"label": "Max Quality",
"value": "116"
}
}
}
settings
对象下面的每个字段都是一个插件的配置项。
例如当前的配置内,有两个配置项,一个是 cookie,一个是 quality。
cookie 的配置项是一个输入框,value
是默认值,require
是是否必填,label
是标签。
quality 的配置项是一个下拉框,options
是下拉框的选项,require
是是否必填,label
是标签,value
是默认值。
字段 | 描述 | 必要 |
---|---|---|
type | (input、select) input 文件框组件 select 选择器组件 | ✅ |
require | 控制组件的是否必填 | ✅ |
value | 组件的默认值 | ✅ |
label | 组件的名称标签 | ❎ |
notice | 组件的提示文本 | ❎ |
placeholder | 组件提示词 | ❎ |
options | 配置项(select 组件必填) | ❎ |
测试
测试插件
修改
parser.test.js
内测试的地址为插件解析的平台地址。npm run test
确保测试用例通过。
新增插件
在开发插件时,你可以使用 npm run dev
命令来启动插件。 在启动插件后,你可以在 FFandown 内的插件系统内新增插件,在插件内输入地址: http://loclahost:3312
。
配置插件信息
打包
npm run build
打包插件,打包后的插件在 build
文件夹内, 打包后的插件可以上传到在线 oss 服务或者利用 github 的 workflows 打包到 Release,目前该项目已经支持 github actions 自动打包,只需推送对应版本的 tag 即可自动构建。