diff --git a/pkg/aria2/Monitor.go b/pkg/aria2/Monitor.go index 765c094..ee36147 100644 --- a/pkg/aria2/Monitor.go +++ b/pkg/aria2/Monitor.go @@ -99,6 +99,8 @@ func (monitor *Monitor) Update() bool { case "active", "waiting", "paused": return false case "removed": + monitor.Task.Status = Canceled + monitor.Task.Save() return true default: util.Log().Warning("下载任务[%s]返回未知状态信息[%s],", monitor.Task.GID, status.Status) @@ -145,7 +147,7 @@ func (monitor *Monitor) UpdateTaskInfo(status rpc.StatusInfo) error { // 文件大小更新后,对文件限制等进行校验 if err := monitor.ValidateFile(); err != nil { // 验证失败时取消任务 - monitor.Cancel() + Instance.Cancel(monitor.Task) return err } } @@ -153,20 +155,6 @@ func (monitor *Monitor) UpdateTaskInfo(status rpc.StatusInfo) error { return nil } -// Cancel 取消上传并尝试删除临时文件 -func (monitor *Monitor) Cancel() { - if err := Instance.Cancel(monitor.Task); err != nil { - util.Log().Warning("无法取消离线下载任务[%s], %s", monitor.Task.GID, err) - } - util.Log().Debug("离线下载任务[%s]已取消,1 分钟后删除临时文件", monitor.Task.GID) - go func(monitor *Monitor) { - select { - case <-time.After(time.Duration(60) * time.Second): - monitor.RemoveTempFolder() - } - }(monitor) -} - // ValidateFile 上传过程中校验文件大小、文件名 func (monitor *Monitor) ValidateFile() error { // 找到任务创建者 diff --git a/pkg/aria2/caller.go b/pkg/aria2/caller.go index 2ec6396..5f01ffb 100644 --- a/pkg/aria2/caller.go +++ b/pkg/aria2/caller.go @@ -5,6 +5,7 @@ import ( model "github.com/HFO4/cloudreve/models" "github.com/HFO4/cloudreve/pkg/util" "github.com/zyxar/argo/rpc" + "os" "path/filepath" "strconv" "strings" @@ -44,7 +45,24 @@ func (client *RPCService) Status(task *model.Download) (rpc.StatusInfo, error) { // Cancel 取消下载 func (client *RPCService) Cancel(task *model.Download) error { + // 取消下载任务 _, err := client.caller.Remove(task.GID) + if err != nil { + util.Log().Warning("无法取消离线下载任务[%s], %s", task.GID, err) + } + + // 删除临时文件 + util.Log().Debug("离线下载任务[%s]已取消,1 分钟后删除临时文件", task.GID) + go func(task *model.Download) { + select { + case <-time.After(time.Duration(60) * time.Second): + err := os.RemoveAll(task.Parent) + if err != nil { + util.Log().Warning("无法删除离线下载临时目录[%s], %s", task.Parent, err) + } + } + }(task) + return err } diff --git a/routers/controllers/aria2.go b/routers/controllers/aria2.go index 3680134..de087b0 100644 --- a/routers/controllers/aria2.go +++ b/routers/controllers/aria2.go @@ -70,3 +70,14 @@ func AddAria2Torrent(c *gin.Context) { c.JSON(200, ErrorResponse(err)) } } + +// CancelAria2Download 取消aria2离线下载任务 +func CancelAria2Download(c *gin.Context) { + var selectService aria2.DownloadTaskService + if err := c.ShouldBindUri(&selectService); err == nil { + res := selectService.Delete(c) + c.JSON(200, res) + } else { + c.JSON(200, ErrorResponse(err)) + } +} diff --git a/routers/router.go b/routers/router.go index c317c57..ad8b778 100644 --- a/routers/router.go +++ b/routers/router.go @@ -282,6 +282,8 @@ func InitMasterRouter() *gin.Engine { aria2.POST("torrent/*path", controllers.AddAria2Torrent) // 重新选择要下载的文件 aria2.PUT("select/:gid", controllers.SelectAria2File) + // 取消下载任务 + aria2.DELETE("task/:gid", controllers.CancelAria2Download) } // 目录 diff --git a/service/aria2/manage.go b/service/aria2/manage.go index a965753..bf36261 100644 --- a/service/aria2/manage.go +++ b/service/aria2/manage.go @@ -12,6 +12,34 @@ type SelectFileService struct { Indexes []int `json:"indexes" binding:"required"` } +// DownloadTaskService 下载任务管理服务 +type DownloadTaskService struct { + GID string `uri:"gid" binding:"required"` +} + +// Delete 取消下载任务 +func (service *DownloadTaskService) Delete(c *gin.Context) serializer.Response { + userCtx, _ := c.Get("user") + user := userCtx.(*model.User) + + // 查找下载记录 + download, err := model.GetDownloadByGid(c.Param("gid"), user.ID) + if err != nil { + return serializer.Err(serializer.CodeNotFound, "下载记录不存在", err) + } + + if download.Status != aria2.Downloading && download.Status != aria2.Paused { + return serializer.Err(serializer.CodeNoPermissionErr, "此下载任务无法取消", err) + } + + // 取消任务 + if err := aria2.Instance.Cancel(download); err != nil { + return serializer.Err(serializer.CodeNotSet, "操作失败", err) + } + + return serializer.Response{} +} + // Select 选取要下载的文件 func (service *SelectFileService) Select(c *gin.Context) serializer.Response { userCtx, _ := c.Get("user")