-
-
Notifications
You must be signed in to change notification settings - Fork 96
插件开发
Harlan-H edited this page Sep 30, 2022
·
8 revisions
这里是假设你是开发者,所以在下方实例中给了两个非常简单得代码实现。
插件中你需要关心得就是如何处理数据即可,当m3u8文件中有密钥相关信息得时候,软件会自动请求数据,同时调用SetCryptData
然后你可以根据需要来确认他是否需要特殊处理等等
HandleData是在多线程中被调用得,当数据请求完成会调用此函数,请确保此函数调用之后数据是正确处理得,当他保存硬盘得时候,后面得合并是不会检查文件格式得
-
新建类库
-
填写项目名称
-
选择.net6.0 这下面的图没有换 但是需要选择.net6.0
-
添加项目引用
-
浏览 选择pluginInterface.dll
-
继承接口
提供两种构造函数得方法:
- 无参构造函数 无参数得构造函数如果不需要可以不写
- 带httpclient,header得构造函数
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);
}
}
}
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]);
}
}
}
此文件在程序同目录下得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>
在下载前,到设置中选择需要得插件即可