|
|
@ -1,14 +1,11 @@
|
|
|
|
package aria2
|
|
|
|
package aria2
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
|
|
|
|
"net/url"
|
|
|
|
|
|
|
|
"sync"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
|
|
|
|
model "github.com/cloudreve/Cloudreve/v3/models"
|
|
|
|
model "github.com/cloudreve/Cloudreve/v3/models"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/aria2/rpc"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/aria2/rpc"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/util"
|
|
|
|
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// Instance 默认使用的Aria2处理实例
|
|
|
|
// Instance 默认使用的Aria2处理实例
|
|
|
@ -22,6 +19,8 @@ var EventNotifier = &Notifier{}
|
|
|
|
|
|
|
|
|
|
|
|
// Aria2 离线下载处理接口
|
|
|
|
// Aria2 离线下载处理接口
|
|
|
|
type Aria2 interface {
|
|
|
|
type Aria2 interface {
|
|
|
|
|
|
|
|
// Init 初始化客户端连接
|
|
|
|
|
|
|
|
Init() error
|
|
|
|
// CreateTask 创建新的任务
|
|
|
|
// CreateTask 创建新的任务
|
|
|
|
CreateTask(task *model.Download, options map[string]interface{}) (string, error)
|
|
|
|
CreateTask(task *model.Download, options map[string]interface{}) (string, error)
|
|
|
|
// 返回状态信息
|
|
|
|
// 返回状态信息
|
|
|
@ -67,6 +66,10 @@ var (
|
|
|
|
type DummyAria2 struct {
|
|
|
|
type DummyAria2 struct {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (instance *DummyAria2) Init() error {
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CreateTask 创建新任务,此处直接返回未开启错误
|
|
|
|
// CreateTask 创建新任务,此处直接返回未开启错误
|
|
|
|
func (instance *DummyAria2) CreateTask(model *model.Download, options map[string]interface{}) (string, error) {
|
|
|
|
func (instance *DummyAria2) CreateTask(model *model.Download, options map[string]interface{}) (string, error) {
|
|
|
|
return "", ErrNotEnabled
|
|
|
|
return "", ErrNotEnabled
|
|
|
@ -89,53 +92,6 @@ func (instance *DummyAria2) Select(task *model.Download, files []int) error {
|
|
|
|
|
|
|
|
|
|
|
|
// Init 初始化
|
|
|
|
// Init 初始化
|
|
|
|
func Init(isReload bool) {
|
|
|
|
func Init(isReload bool) {
|
|
|
|
Lock.Lock()
|
|
|
|
|
|
|
|
defer Lock.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 关闭上个初始连接
|
|
|
|
|
|
|
|
if previousClient, ok := Instance.(*RPCService); ok {
|
|
|
|
|
|
|
|
if previousClient.Caller != nil {
|
|
|
|
|
|
|
|
util.Log().Debug("关闭上个 aria2 连接")
|
|
|
|
|
|
|
|
previousClient.Caller.Close()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
options := model.GetSettingByNames("aria2_rpcurl", "aria2_token", "aria2_options")
|
|
|
|
|
|
|
|
timeout := model.GetIntSetting("aria2_call_timeout", 5)
|
|
|
|
|
|
|
|
if options["aria2_rpcurl"] == "" {
|
|
|
|
|
|
|
|
Instance = &DummyAria2{}
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
util.Log().Info("初始化 aria2 RPC 服务[%s]", options["aria2_rpcurl"])
|
|
|
|
|
|
|
|
client := &RPCService{}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 解析RPC服务地址
|
|
|
|
|
|
|
|
server, err := url.Parse(options["aria2_rpcurl"])
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
util.Log().Warning("无法解析 aria2 RPC 服务地址,%s", err)
|
|
|
|
|
|
|
|
Instance = &DummyAria2{}
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
server.Path = "/jsonrpc"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 加载自定义下载配置
|
|
|
|
|
|
|
|
var globalOptions map[string]interface{}
|
|
|
|
|
|
|
|
err = json.Unmarshal([]byte(options["aria2_options"]), &globalOptions)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
util.Log().Warning("无法解析 aria2 全局配置,%s", err)
|
|
|
|
|
|
|
|
Instance = &DummyAria2{}
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if err := client.Init(server.String(), options["aria2_token"], timeout, globalOptions); err != nil {
|
|
|
|
|
|
|
|
util.Log().Warning("初始化 aria2 RPC 服务失败,%s", err)
|
|
|
|
|
|
|
|
Instance = &DummyAria2{}
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Instance = client
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if !isReload {
|
|
|
|
if !isReload {
|
|
|
|
// 从数据库中读取未完成任务,创建监控
|
|
|
|
// 从数据库中读取未完成任务,创建监控
|
|
|
|
unfinished := model.GetDownloadsByStatus(Ready, Paused, Downloading)
|
|
|
|
unfinished := model.GetDownloadsByStatus(Ready, Paused, Downloading)
|
|
|
|