diff --git a/pkg/aria2/remote_caller.go b/pkg/aria2/remote_caller.go index fd11eff..19b9239 100644 --- a/pkg/aria2/remote_caller.go +++ b/pkg/aria2/remote_caller.go @@ -10,6 +10,7 @@ import ( "github.com/cloudreve/Cloudreve/v3/pkg/serializer" "net/url" "path" + "strconv" "strings" ) @@ -36,7 +37,6 @@ func (client *RemoteService) CreateTask(task *model.Download, options map[string return err } - // 发送列表请求 bodyReader := strings.NewReader(string(reqBodyEncoded)) signTTL := model.GetIntSetting("slave_api_timeout", 60) resp, err := client.Client.Request( @@ -49,31 +49,35 @@ func (client *RemoteService) CreateTask(task *model.Download, options map[string return err } - // 处理列取结果 if resp.Code != 0 { - return errors.New(resp.Error) - } - - if resStr, ok := resp.Data.(string); ok { - var res serializer.Response - err = json.Unmarshal([]byte(resStr), &res) - if err != nil { - return err - } - if res.Code != 0 { - return errors.New(res.Msg) - } + return errors.New(resp.Msg) } return nil } func (client *RemoteService) Status(task *model.Download) (rpc.StatusInfo, error) { - panic("implement me") + // 远程 Aria2 不会使用此方法 + return rpc.StatusInfo{}, nil } func (client *RemoteService) Cancel(task *model.Download) error { - panic("implement me") + signTTL := model.GetIntSetting("slave_api_timeout", 60) + resp, err := client.Client.Request( + "POST", + client.getAPIUrl("cancel", strconv.Itoa(int(task.ID))), + nil, + request.WithCredential(client.AuthInstance, int64(signTTL)), + ).CheckHTTPResponse(200).DecodeResponse() + if err != nil { + return err + } + + if resp.Code != 0 { + return errors.New(resp.Error) + } + + return nil } func (client *RemoteService) Select(task *model.Download, files []int) error { @@ -91,6 +95,8 @@ func (client *RemoteService) getAPIUrl(scope string, routes ...string) string { switch scope { case "add": controller, _ = url.Parse("/api/v3/slave/aria2/add") + case "cancel": + controller, _ = url.Parse("/api/v3/slave/aria2/cancel") default: controller = serverURL } diff --git a/routers/controllers/slave.go b/routers/controllers/slave.go index 71652fe..5cb1594 100644 --- a/routers/controllers/slave.go +++ b/routers/controllers/slave.go @@ -187,3 +187,14 @@ func SlaveAria2Add(c *gin.Context) { c.JSON(200, ErrorResponse(err)) } } + +// SlaveAria2Cancel 从机删除远程下载任务 +func SlaveAria2Cancel(c *gin.Context) { + var service slave.Aria2CancelService + if err := c.ShouldBindUri(&service); err == nil { + res := service.Cancel() + c.JSON(200, res) + } else { + c.JSON(200, ErrorResponse(err)) + } +} diff --git a/routers/router.go b/routers/router.go index cbffe30..c1e32d7 100644 --- a/routers/router.go +++ b/routers/router.go @@ -55,6 +55,7 @@ func InitSlaveRouter() *gin.Engine { aria2.Use(middleware.SignRequired()) { aria2.POST("add", controllers.SlaveAria2Add) + aria2.POST("cancel/:taskId", controllers.SlaveAria2Cancel) } return r } diff --git a/service/slave/aria2.go b/service/slave/aria2.go index 6e22208..145e82f 100644 --- a/service/slave/aria2.go +++ b/service/slave/aria2.go @@ -12,6 +12,10 @@ type Aria2AddService struct { Options map[string]interface{} `json:"options"` } +type Aria2CancelService struct { + TaskId uint `uri:"taskId"` +} + func (service *Aria2AddService) Add() serializer.Response { task, err := model.GetDownloadById(service.TaskId) if err != nil { @@ -26,3 +30,21 @@ func (service *Aria2AddService) Add() serializer.Response { aria2.Lock.RUnlock() return serializer.Response{} } + +func (service *Aria2CancelService) Cancel() serializer.Response { + task, err := model.GetDownloadById(service.TaskId) + if err != nil { + util.Log().Warning("无法获取记录, %s", err) + return serializer.Err(serializer.CodeNotSet, "任务创建失败, 无法获取记录", err) + } + + // 取消任务 + aria2.Lock.RLock() + defer aria2.Lock.RUnlock() + if err := aria2.Instance.Cancel(task); err != nil { + util.Log().Debug("删除远程下载任务出错, %s", err) + return serializer.Err(serializer.CodeNotSet, "操作失败", err) + } + + return serializer.Response{} +}