Skip to content

插件开发

Harlan-H edited this page Sep 30, 2022 · 8 revisions

0.简介

这里是假设你是开发者,所以在下方实例中给了两个非常简单得代码实现。
插件中你需要关心得就是如何处理数据即可,当m3u8文件中有密钥相关信息得时候,软件会自动请求数据,同时调用SetCryptData
然后你可以根据需要来确认他是否需要特殊处理等等
HandleData是在多线程中被调用得,当数据请求完成会调用此函数,请确保此函数调用之后数据是正确处理得,当他保存硬盘得时候,后面得合并是不会检查文件格式得

1.创建项目

  1. 新建类库
    1

  2. 填写项目名称

  3. 选择.net6.0 这下面的图没有换 但是需要选择.net6.0
    2

  4. 添加项目引用
    3

  5. 浏览 选择pluginInterface.dll
    4

  6. 继承接口
    5

2. 实例

提供两种构造函数得方法:

  1. 无参构造函数 无参数得构造函数如果不需要可以不写
  2. 带httpclient,header得构造函数

1. 对特殊密钥得处理实例

using PluginInterface;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using VideoDownloaderEx.Extensions;

namespace PluginTest3
{
    public class Class1 : IPlugin
    {
        private byte[] aesKey;
        private byte[] aesIv;

        //此函数会在单线程中调用
        public Task Initialize(CancellationToken cancellationToken) => Task.CompletedTask;

        //这里假设key是超过16位  但是只有前16位是有用得
        //只有当m3u8文件有key那个字段得时候 才会被调用
        //此函数会在单线程中调用
        public void SetCryptData(string method, byte[] key, byte[] iv)
        {
            aesKey = key[0..16];
            aesIv = iv;
        }

        //这个函数是多线程调用得
        public Stream HandleData(Stream stream, CancellationToken cancellationToken)
        {
            //这里的AesDecrypt需要项目引用VideoDownloaderEx.Extensions.dll 然后using VideoDownloaderEx.Extensions即可使用
            return stream.AesDecrypt(aesKey, aesIv);
        }
    }
}

2. 需要发起http请求

using PluginInterface;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using VideoDownloaderEx.Extensions;

namespace PluginTest3
{
    public class Class1 : IPlugin
    {
        private byte[] aesKey;
        private readonly HttpClient httpClient;
        private readonly IEnumerable<KeyValuePair<string, string>> headers;

        //headers是设置中得请求头
        public Class1(HttpClient httpClient, IEnumerable<KeyValuePair<string, string>> headers)
        {
            this.httpClient = httpClient;
            this.headers = headers;
        }

        //这里假设需要是从某地址请求一段密钥
        //如果网站对某些请求头有检测 那请求操作得时候 最好加上请求头
        //此函数会在单线程中调用
        public async Task Initialize(CancellationToken cancellationToken)
        {
            //GetByteArrayAsync 需要项目引用VideoDownloaderEx.Extensions.dll 然后using VideoDownloaderEx.Extensions
            aesKey = await httpClient.GetByteArrayAsync("https://www.xxx.com", headers, cancellationToken);
        }

        //这里假设在m3u8文件中 没有key那个字段 所以这个函数也自然不会被执行
        //此函数会在单线程中调用
        public void SetCryptData(string method, byte[] key, byte[] iv)
        {
        }

        //此函数会在多线程中调用
        public Stream HandleData(Stream stream, CancellationToken cancellationToken)
        {
            return stream.AesDecrypt(aesKey, new byte[16]);
        }
    }
}

3. 配置插件文件

此文件在程序同目录下得plugin目录中

  • title 是在这种中得显示名称
  • filepath dll得路径
    • 如果将dll放入到了程序附带得plugin目录中 则只要写上dll得全路径 例如: xxx.dll 即可
    • 如果是绝对路径可以按照下面得示例填写
  • 每一行代表一个插件 可以有多个
<config>
    <plugins>
        <pluginItem title="myplugin" filepath="E:\desktop\PluginTest1.dll" />
        <pluginItem title="myplugin2" filepath="E:\desktop\PluginTest2.dll" />
    </plugins>
</config>

4. 选择插件

在下载前,到设置中选择需要得插件即可

Clone this wiki locally