Spaces:
Paused
Paused
| package handles | |
| import ( | |
| "math" | |
| "github.com/alist-org/alist/v3/internal/fs" | |
| "github.com/alist-org/alist/v3/internal/offline_download/tool" | |
| "github.com/alist-org/alist/v3/pkg/tache" | |
| "github.com/alist-org/alist/v3/pkg/utils" | |
| "github.com/alist-org/alist/v3/server/common" | |
| "github.com/gin-gonic/gin" | |
| ) | |
| type TaskInfo struct { | |
| ID string `json:"id"` | |
| Name string `json:"name"` | |
| State tache.State `json:"state"` | |
| Status string `json:"status"` | |
| Progress float64 `json:"progress"` | |
| Size int64 `json:"size"` | |
| Error string `json:"error"` | |
| } | |
| func getTaskInfo[T tache.TaskWithInfo](task T) TaskInfo { | |
| errMsg := "" | |
| if task.GetErr() != nil { | |
| errMsg = task.GetErr().Error() | |
| } | |
| progress := task.GetProgress() | |
| // if progress is NaN, set it to 100 | |
| if math.IsNaN(progress) { | |
| progress = 100 | |
| } | |
| return TaskInfo{ | |
| ID: task.GetID(), | |
| Name: task.GetName(), | |
| State: task.GetState(), | |
| Status: task.GetStatus(), | |
| Size: task.GetSize(), | |
| Progress: progress, | |
| Error: errMsg, | |
| } | |
| } | |
| func getTaskInfos[T tache.TaskWithInfo](tasks []T) []TaskInfo { | |
| return utils.MustSliceConvert(tasks, getTaskInfo[T]) | |
| } | |
| func taskRoute[T tache.TaskWithInfo](g *gin.RouterGroup, manager *tache.Manager[T]) { | |
| g.GET("/undone", func(c *gin.Context) { | |
| common.SuccessResp(c, getTaskInfos(manager.GetByState(tache.StatePending, tache.StateRunning, | |
| tache.StateCanceling, tache.StateErrored, tache.StateFailing, tache.StateWaitingRetry, tache.StateBeforeRetry))) | |
| }) | |
| g.GET("/done", func(c *gin.Context) { | |
| common.SuccessResp(c, getTaskInfos(manager.GetByState(tache.StateCanceled, tache.StateFailed, tache.StateSucceeded))) | |
| }) | |
| g.POST("/info", func(c *gin.Context) { | |
| tid := c.Query("tid") | |
| task, ok := manager.GetByID(tid) | |
| if !ok { | |
| common.ErrorStrResp(c, "task not found", 404) | |
| return | |
| } | |
| common.SuccessResp(c, getTaskInfo(task)) | |
| }) | |
| g.POST("/cancel", func(c *gin.Context) { | |
| tid := c.Query("tid") | |
| manager.Cancel(tid) | |
| common.SuccessResp(c) | |
| }) | |
| g.POST("/delete", func(c *gin.Context) { | |
| tid := c.Query("tid") | |
| manager.Remove(tid) | |
| common.SuccessResp(c) | |
| }) | |
| g.POST("/retry", func(c *gin.Context) { | |
| tid := c.Query("tid") | |
| manager.Retry(tid) | |
| common.SuccessResp(c) | |
| }) | |
| g.POST("/clear_done", func(c *gin.Context) { | |
| manager.RemoveByState(tache.StateCanceled, tache.StateFailed, tache.StateSucceeded) | |
| common.SuccessResp(c) | |
| }) | |
| g.POST("/clear_succeeded", func(c *gin.Context) { | |
| manager.RemoveByState(tache.StateSucceeded) | |
| common.SuccessResp(c) | |
| }) | |
| g.POST("/retry_failed", func(c *gin.Context) { | |
| manager.RetryAllFailed() | |
| common.SuccessResp(c) | |
| }) | |
| } | |
| func SetupTaskRoute(g *gin.RouterGroup) { | |
| taskRoute(g.Group("/upload"), fs.UploadTaskManager) | |
| taskRoute(g.Group("/copy"), fs.CopyTaskManager) | |
| taskRoute(g.Group("/offline_download"), tool.DownloadTaskManager) | |
| taskRoute(g.Group("/offline_download_transfer"), tool.TransferTaskManager) | |
| } | |