mirror of https://github.com/cloudreve/Cloudreve
				
				
				
			Feat: group-defined aria2 download options
							parent
							
								
									c29695a40d
								
							
						
					
					
						commit
						cde49e6e98
					
				| 
						 | 
				
			
			@ -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 获取用户离线下载设备
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 == "" {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue