From cde49e6e989bf5d9fe53c57e028f5770ccb1d917 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Thu, 6 Feb 2020 10:27:20 +0800 Subject: [PATCH] Feat: group-defined aria2 download options --- models/group.go | 17 +++++++++-------- models/migration.go | 2 +- pkg/aria2/aria2.go | 16 ++++++++++++---- pkg/aria2/caller.go | 5 +++-- service/aria2/add.go | 2 +- 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/models/group.go b/models/group.go index df1ae9d..1107f30 100644 --- a/models/group.go +++ b/models/group.go @@ -25,14 +25,15 @@ type Group struct { // GroupOption 用户组其他配置 type GroupOption struct { - ArchiveDownload bool `json:"archive_download,omitempty"` // 打包下载 - ArchiveTask bool `json:"archive_task,omitempty"` // 在线压缩 - CompressSize uint64 `json:"compress_size,omitempty"` // 可压缩大小 - DecompressSize uint64 `json:"decompress_size,omitempty"` - OneTimeDownload bool `json:"one_time_download,omitempty"` - ShareDownload bool `json:"share_download,omitempty"` - ShareFree bool `json:"share_free,omitempty"` - Aria2 bool `json:"aria2,omitempty"` // 离线下载 + ArchiveDownload bool `json:"archive_download,omitempty"` // 打包下载 + ArchiveTask bool `json:"archive_task,omitempty"` // 在线压缩 + CompressSize uint64 `json:"compress_size,omitempty"` // 可压缩大小 + DecompressSize uint64 `json:"decompress_size,omitempty"` + OneTimeDownload bool `json:"one_time_download,omitempty"` + ShareDownload bool `json:"share_download,omitempty"` + ShareFree bool `json:"share_free,omitempty"` + Aria2 bool `json:"aria2,omitempty"` // 离线下载 + Aria2Options []interface{} `json:"aria2_options,omitempty"` // 离线下载用户组配置 } // GetAria2Option 获取用户离线下载设备 diff --git a/models/migration.go b/models/migration.go index cb95bde..2c8e9aa 100644 --- a/models/migration.go +++ b/models/migration.go @@ -160,7 +160,7 @@ Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; verti {Name: "aria2_token", Value: `your token`, Type: "aria2"}, {Name: "aria2_token", Value: `your token`, Type: "aria2"}, {Name: "aria2_temp_path", Value: ``, Type: "aria2"}, - {Name: "aria2_options", Value: `{"max-tries":5}`, Type: "aria2"}, + {Name: "aria2_options", Value: `[]`, Type: "aria2"}, {Name: "aria2_interval", Value: `10`, Type: "aria2"}, {Name: "max_worker_num", Value: `10`, Type: "task"}, {Name: "max_parallel_transfer", Value: `4`, Type: "task"}, diff --git a/pkg/aria2/aria2.go b/pkg/aria2/aria2.go index 07c0e2d..d8b8038 100644 --- a/pkg/aria2/aria2.go +++ b/pkg/aria2/aria2.go @@ -1,6 +1,7 @@ package aria2 import ( + "encoding/json" model "github.com/HFO4/cloudreve/models" "github.com/HFO4/cloudreve/pkg/serializer" "github.com/HFO4/cloudreve/pkg/util" @@ -17,7 +18,7 @@ var EventNotifier = &Notifier{} // Aria2 离线下载处理接口 type Aria2 interface { // CreateTask 创建新的任务 - CreateTask(task *model.Download) error + CreateTask(task *model.Download, options []interface{}) error // 返回状态信息 Status(task *model.Download) (rpc.StatusInfo, error) // 取消任务 @@ -52,7 +53,8 @@ const ( var ( // ErrNotEnabled 功能未开启错误 - ErrNotEnabled = serializer.NewError(serializer.CodeNoPermissionErr, "离线下载功能未开启", nil) + ErrNotEnabled = serializer.NewError(serializer.CodeNoPermissionErr, "离线下载功能未开启", nil) + // ErrUserNotFound 未找到下载任务创建者 ErrUserNotFound = serializer.NewError(serializer.CodeNotFound, "无法找到任务创建者", nil) ) @@ -61,7 +63,7 @@ type DummyAria2 struct { } // CreateTask 创建新任务,此处直接返回未开启错误 -func (instance *DummyAria2) CreateTask(task *model.Download) error { +func (instance *DummyAria2) CreateTask(model *model.Download, options []interface{}) error { return ErrNotEnabled } @@ -104,7 +106,13 @@ func Init() { server.Path = "/jsonrpc" // todo 加载自定义下载配置 - if err := client.Init(server.String(), options["aria2_token"], timeout, []interface{}{}); err != nil { + var globalOptions []interface{} + err = json.Unmarshal([]byte(options["aria2_options"]), &globalOptions) + if err != nil { + util.Log().Warning("无法解析 aria2 全局配置,%s", err) + } + + if err := client.Init(server.String(), options["aria2_token"], timeout, globalOptions); err != nil { util.Log().Warning("初始化 aria2 RPC 服务失败,%s", err) return } diff --git a/pkg/aria2/caller.go b/pkg/aria2/caller.go index 5f01ffb..65513f7 100644 --- a/pkg/aria2/caller.go +++ b/pkg/aria2/caller.go @@ -78,7 +78,7 @@ func (client *RPCService) Select(task *model.Download, files []int) error { } // CreateTask 创建新任务 -func (client *RPCService) CreateTask(task *model.Download) error { +func (client *RPCService) CreateTask(task *model.Download, groupOptions []interface{}) error { // 生成存储路径 path := filepath.Join( model.GetSettingByName("aria2_temp_path"), @@ -89,8 +89,9 @@ func (client *RPCService) CreateTask(task *model.Download) error { // 创建下载任务 options := []interface{}{map[string]string{"dir": path}} if len(client.options.Options) > 0 { - options = append(options, client.options.Options) + options = append(options, client.options.Options...) } + options = append(options, groupOptions...) gid, err := client.caller.AddURI(task.Source, options...) if err != nil || gid == "" { diff --git a/service/aria2/add.go b/service/aria2/add.go index 9edbd29..2b67578 100644 --- a/service/aria2/add.go +++ b/service/aria2/add.go @@ -41,7 +41,7 @@ func (service *AddURLService) Add(c *gin.Context, taskType int) serializer.Respo UserID: fs.User.ID, Source: service.URL, } - if err := aria2.Instance.CreateTask(task); err != nil { + if err := aria2.Instance.CreateTask(task, fs.User.Group.OptionsSerialized.Aria2Options); err != nil { return serializer.Err(serializer.CodeNotSet, "任务创建失败", err) }