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

     1  package aria2
     2  
     3  import (
     4  	model "github.com/cloudreve/Cloudreve/v3/models"
     5  	"github.com/cloudreve/Cloudreve/v3/pkg/aria2/common"
     6  	"github.com/cloudreve/Cloudreve/v3/pkg/cluster"
     7  	"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
     8  	"github.com/gin-gonic/gin"
     9  )
    10  
    11  // SelectFileService 选择要下载的文件服务
    12  type SelectFileService struct {
    13  	Indexes []int `json:"indexes" binding:"required"`
    14  }
    15  
    16  // DownloadTaskService 下载任务管理服务
    17  type DownloadTaskService struct {
    18  	GID string `uri:"gid" binding:"required"`
    19  }
    20  
    21  // DownloadListService 下载列表服务
    22  type DownloadListService struct {
    23  	Page uint `form:"page"`
    24  }
    25  
    26  // Finished 获取已完成的任务
    27  func (service *DownloadListService) Finished(c *gin.Context, user *model.User) serializer.Response {
    28  	// 查找下载记录
    29  	downloads := model.GetDownloadsByStatusAndUser(service.Page, user.ID, common.Error, common.Complete, common.Canceled, common.Unknown)
    30  	for key, download := range downloads {
    31  		node := cluster.Default.GetNodeByID(download.GetNodeID())
    32  		if node != nil {
    33  			downloads[key].NodeName = node.DBModel().Name
    34  		}
    35  	}
    36  
    37  	return serializer.BuildFinishedListResponse(downloads)
    38  }
    39  
    40  // Downloading 获取正在下载中的任务
    41  func (service *DownloadListService) Downloading(c *gin.Context, user *model.User) serializer.Response {
    42  	// 查找下载记录
    43  	downloads := model.GetDownloadsByStatusAndUser(service.Page, user.ID, common.Downloading, common.Seeding, common.Paused, common.Ready)
    44  	intervals := make(map[uint]int)
    45  	for key, download := range downloads {
    46  		if _, ok := intervals[download.ID]; !ok {
    47  			if node := cluster.Default.GetNodeByID(download.GetNodeID()); node != nil {
    48  				intervals[download.ID] = node.DBModel().Aria2OptionsSerialized.Interval
    49  			}
    50  		}
    51  
    52  		node := cluster.Default.GetNodeByID(download.GetNodeID())
    53  		if node != nil {
    54  			downloads[key].NodeName = node.DBModel().Name
    55  		}
    56  	}
    57  
    58  	return serializer.BuildDownloadingResponse(downloads, intervals)
    59  }
    60  
    61  // Delete 取消或删除下载任务
    62  func (service *DownloadTaskService) Delete(c *gin.Context) serializer.Response {
    63  	userCtx, _ := c.Get("user")
    64  	user := userCtx.(*model.User)
    65  
    66  	// 查找下载记录
    67  	download, err := model.GetDownloadByGid(c.Param("gid"), user.ID)
    68  	if err != nil {
    69  		return serializer.Err(serializer.CodeNotFound, "Download record not found", err)
    70  	}
    71  
    72  	if download.Status >= common.Error && download.Status <= common.Unknown {
    73  		// 如果任务已完成,则删除任务记录
    74  		if err := download.Delete(); err != nil {
    75  			return serializer.DBErr("Failed to delete task record", err)
    76  		}
    77  		return serializer.Response{}
    78  	}
    79  
    80  	// 取消任务
    81  	node := cluster.Default.GetNodeByID(download.GetNodeID())
    82  	if node == nil {
    83  		return serializer.Err(serializer.CodeNodeOffline, "", err)
    84  	}
    85  
    86  	if err := node.GetAria2Instance().Cancel(download); err != nil {
    87  		return serializer.Err(serializer.CodeNotSet, "Operation failed", err)
    88  	}
    89  
    90  	return serializer.Response{}
    91  }
    92  
    93  // Select 选取要下载的文件
    94  func (service *SelectFileService) Select(c *gin.Context) serializer.Response {
    95  	userCtx, _ := c.Get("user")
    96  	user := userCtx.(*model.User)
    97  
    98  	// 查找下载记录
    99  	download, err := model.GetDownloadByGid(c.Param("gid"), user.ID)
   100  	if err != nil {
   101  		return serializer.Err(serializer.CodeNotFound, "Download record not found", err)
   102  	}
   103  
   104  	if download.StatusInfo.BitTorrent.Mode != "multi" || (download.Status != common.Downloading && download.Status != common.Paused) {
   105  		return serializer.ParamErr("You cannot select files for this task", nil)
   106  	}
   107  
   108  	// 选取下载
   109  	node := cluster.Default.GetNodeByID(download.GetNodeID())
   110  	if err := node.GetAria2Instance().Select(download, service.Indexes); err != nil {
   111  		return serializer.Err(serializer.CodeNotSet, "Operation failed", err)
   112  	}
   113  
   114  	return serializer.Response{}
   115  
   116  }
   117  
   118  // SlaveStatus 从机查询离线任务状态
   119  func SlaveStatus(c *gin.Context, service *serializer.SlaveAria2Call) serializer.Response {
   120  	caller, _ := c.Get("MasterAria2Instance")
   121  
   122  	// 查询任务
   123  	status, err := caller.(common.Aria2).Status(service.Task)
   124  	if err != nil {
   125  		return serializer.Err(serializer.CodeInternalSetting, "Failed to query remote download task status", err)
   126  	}
   127  
   128  	return serializer.NewResponseWithGobData(status)
   129  
   130  }
   131  
   132  // SlaveCancel 取消从机离线下载任务
   133  func SlaveCancel(c *gin.Context, service *serializer.SlaveAria2Call) serializer.Response {
   134  	caller, _ := c.Get("MasterAria2Instance")
   135  
   136  	// 查询任务
   137  	err := caller.(common.Aria2).Cancel(service.Task)
   138  	if err != nil {
   139  		return serializer.Err(serializer.CodeInternalSetting, "Failed to cancel task", err)
   140  	}
   141  
   142  	return serializer.Response{}
   143  
   144  }
   145  
   146  // SlaveSelect 从机选取离线下载任务文件
   147  func SlaveSelect(c *gin.Context, service *serializer.SlaveAria2Call) serializer.Response {
   148  	caller, _ := c.Get("MasterAria2Instance")
   149  
   150  	// 查询任务
   151  	err := caller.(common.Aria2).Select(service.Task, service.Files)
   152  	if err != nil {
   153  		return serializer.Err(serializer.CodeInternalSetting, "Failed to select files", err)
   154  	}
   155  
   156  	return serializer.Response{}
   157  
   158  }
   159  
   160  // SlaveSelect 从机选取离线下载任务文件
   161  func SlaveDeleteTemp(c *gin.Context, service *serializer.SlaveAria2Call) serializer.Response {
   162  	caller, _ := c.Get("MasterAria2Instance")
   163  
   164  	// 查询任务
   165  	err := caller.(common.Aria2).DeleteTempFile(service.Task)
   166  	if err != nil {
   167  		return serializer.Err(serializer.CodeInternalSetting, "Failed to delete temp files", err)
   168  	}
   169  
   170  	return serializer.Response{}
   171  
   172  }