github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/aria2/common/common.go (about)

     1  package common
     2  
     3  import (
     4  	model "github.com/cloudreve/Cloudreve/v3/models"
     5  	"github.com/cloudreve/Cloudreve/v3/pkg/aria2/rpc"
     6  	"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
     7  )
     8  
     9  // Aria2 离线下载处理接口
    10  type Aria2 interface {
    11  	// Init 初始化客户端连接
    12  	Init() error
    13  	// CreateTask 创建新的任务
    14  	CreateTask(task *model.Download, options map[string]interface{}) (string, error)
    15  	// 返回状态信息
    16  	Status(task *model.Download) (rpc.StatusInfo, error)
    17  	// 取消任务
    18  	Cancel(task *model.Download) error
    19  	// 选择要下载的文件
    20  	Select(task *model.Download, files []int) error
    21  	// 获取离线下载配置
    22  	GetConfig() model.Aria2Option
    23  	// 删除临时下载文件
    24  	DeleteTempFile(*model.Download) error
    25  }
    26  
    27  const (
    28  	// URLTask 从URL添加的任务
    29  	URLTask = iota
    30  	// TorrentTask 种子任务
    31  	TorrentTask
    32  )
    33  
    34  const (
    35  	// Ready 准备就绪
    36  	Ready = iota
    37  	// Downloading 下载中
    38  	Downloading
    39  	// Paused 暂停中
    40  	Paused
    41  	// Error 出错
    42  	Error
    43  	// Complete 完成
    44  	Complete
    45  	// Canceled 取消/停止
    46  	Canceled
    47  	// Unknown 未知状态
    48  	Unknown
    49  	// Seeding 做种中
    50  	Seeding
    51  )
    52  
    53  var (
    54  	// ErrNotEnabled 功能未开启错误
    55  	ErrNotEnabled = serializer.NewError(serializer.CodeFeatureNotEnabled, "not enabled", nil)
    56  	// ErrUserNotFound 未找到下载任务创建者
    57  	ErrUserNotFound = serializer.NewError(serializer.CodeUserNotFound, "", nil)
    58  )
    59  
    60  // DummyAria2 未开启Aria2功能时使用的默认处理器
    61  type DummyAria2 struct {
    62  }
    63  
    64  func (instance *DummyAria2) Init() error {
    65  	return nil
    66  }
    67  
    68  // CreateTask 创建新任务,此处直接返回未开启错误
    69  func (instance *DummyAria2) CreateTask(model *model.Download, options map[string]interface{}) (string, error) {
    70  	return "", ErrNotEnabled
    71  }
    72  
    73  // Status 返回未开启错误
    74  func (instance *DummyAria2) Status(task *model.Download) (rpc.StatusInfo, error) {
    75  	return rpc.StatusInfo{}, ErrNotEnabled
    76  }
    77  
    78  // Cancel 返回未开启错误
    79  func (instance *DummyAria2) Cancel(task *model.Download) error {
    80  	return ErrNotEnabled
    81  }
    82  
    83  // Select 返回未开启错误
    84  func (instance *DummyAria2) Select(task *model.Download, files []int) error {
    85  	return ErrNotEnabled
    86  }
    87  
    88  // GetConfig 返回空的
    89  func (instance *DummyAria2) GetConfig() model.Aria2Option {
    90  	return model.Aria2Option{}
    91  }
    92  
    93  // GetConfig 返回空的
    94  func (instance *DummyAria2) DeleteTempFile(src *model.Download) error {
    95  	return ErrNotEnabled
    96  }
    97  
    98  // GetStatus 将给定的状态字符串转换为状态标识数字
    99  func GetStatus(status rpc.StatusInfo) int {
   100  	switch status.Status {
   101  	case "complete":
   102  		return Complete
   103  	case "active":
   104  		if status.BitTorrent.Mode != "" && status.CompletedLength == status.TotalLength {
   105  			return Seeding
   106  		}
   107  		return Downloading
   108  	case "waiting":
   109  		return Ready
   110  	case "paused":
   111  		return Paused
   112  	case "error":
   113  		return Error
   114  	case "removed":
   115  		return Canceled
   116  	default:
   117  		return Unknown
   118  	}
   119  }