Skip to content

FFandown 插件 ​

首先,你需要知道这是一个专门为开发ffandown插件的 demo。它不支持其他系统

GitHub forks

插件列表 ​

插件名称插件地址插件仓库插件描述
bilibiligithubgithub支持b站直播和视频解析,如果不设置 cookie 只能下载 480p

要求 ​

  • FFandown (5.0+)

开发 ​

不支持在脚本内引入其他的第三方模块

插件是在下载之前调用的,在 ffandown 输入的地址,首先会进入插件系统匹配(通过插件的 match 方法匹配),如果匹配到了插件,那么会将地址和插件的配置信息传给插件的 parser 方法,等待 parser 返回解析后的地址之后,调用 ffandown 的下载器开始下载。

插件是通过 node 的 vm 模块运行的,插件不可以调用所有的 node 的模块,仅支持以下几个模块和函数。

fs、path模块只能操作 tmp(可执行文件目录) 文件夹,其他文件夹没有权限执行。

模块模块文档
bcrypthttps://www.npmjs.com/package/bcrypt ^5.1.1
fetchhttps://www.npmjs.com/package/node-fetch ^2
URLhttps://nodejs.org/api/url.html#class-url
URLSearchParamshttps://nodejs.org/api/url.html#class-urlsearchparams
consolehttps://nodejs.org/api/console.html#console
fsreadFileSync、writeFileSync、existsSync、mkdirSync、readdirSync、unlinkSync、statSync、
pathhttps://nodejs.org/api/path.html
logwinston实例,日志会输出到日志文件内,verbose 方法会在 debug 开启时输出

plugin system

基础插件 ​

插件的基础结构如下:

js
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 方法用于解析地址,需要解析后的地址必须是一个对象,对象的结构如下:

js
{
    url: string,
    audioUrl: string,
    headers: [{
        key: string,
        value: string
    }]
}

url 是视频的地址,audioUrl 是音频的地址。(注意:audioUrl 是可选的) 如果 url 和 audioUrl 同时存在,那么会同时下载视频和音频并合并在一起。 headers 是请求头,是一个数组,数组的每个元素是一个对象。 headers 是可选的。

parser 方法的参数是地址和插件的配置信息。 插件的配置信息是在插件系统内配置,在插件系统内配置的插件的配置信息会被传递给插件的 parser 方法。

插件配置 ​

如果插件需要配置 cookie 等信息,那么首先需要在package.json中的 settings字段内配置。

settings 字段的结构如下:

json
{
     "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 组件必填)❎

测试 ​

测试插件 ​

  1. 修改parser.test.js内测试的地址为插件解析的平台地址。

  2. npm run test确保测试用例通过。

新增插件 ​

在开发插件时,你可以使用 npm run dev 命令来启动插件。 在启动插件后,你可以在 FFandown 内的插件系统内新增插件,在插件内输入地址: http://loclahost:3312。

配置插件信息 ​

plugin

打包 ​

npm run build 打包插件,打包后的插件在 build 文件夹内, 打包后的插件可以上传到在线 oss 服务或者利用 github 的 workflows 打包到 Release,目前该项目已经支持 github actions 自动打包,只需推送对应版本的 tag 即可自动构建。