Path: blob/main/internal/offline_download/thunder/thunder.go
1562 views
package thunder12import (3"context"4"errors"5"fmt"6"github.com/alist-org/alist/v3/internal/conf"7"github.com/alist-org/alist/v3/internal/setting"8"strconv"910"github.com/alist-org/alist/v3/drivers/thunder"11"github.com/alist-org/alist/v3/internal/errs"12"github.com/alist-org/alist/v3/internal/model"13"github.com/alist-org/alist/v3/internal/offline_download/tool"14"github.com/alist-org/alist/v3/internal/op"15)1617type Thunder struct {18refreshTaskCache bool19}2021func (t *Thunder) Name() string {22return "Thunder"23}2425func (t *Thunder) Items() []model.SettingItem {26return nil27}2829func (t *Thunder) Run(task *tool.DownloadTask) error {30return errs.NotSupport31}3233func (t *Thunder) Init() (string, error) {34t.refreshTaskCache = false35return "ok", nil36}3738func (t *Thunder) IsReady() bool {39tempDir := setting.GetStr(conf.ThunderTempDir)40if tempDir == "" {41return false42}43storage, _, err := op.GetStorageAndActualPath(tempDir)44if err != nil {45return false46}47if _, ok := storage.(*thunder.Thunder); !ok {48return false49}50return true51}5253func (t *Thunder) AddURL(args *tool.AddUrlArgs) (string, error) {54// 添加新任务刷新缓存55t.refreshTaskCache = true56storage, actualPath, err := op.GetStorageAndActualPath(args.TempDir)57if err != nil {58return "", err59}60thunderDriver, ok := storage.(*thunder.Thunder)61if !ok {62return "", fmt.Errorf("unsupported storage driver for offline download, only Thunder is supported")63}6465ctx := context.Background()6667if err := op.MakeDir(ctx, storage, actualPath); err != nil {68return "", err69}7071parentDir, err := op.GetUnwrap(ctx, storage, actualPath)72if err != nil {73return "", err74}7576task, err := thunderDriver.OfflineDownload(ctx, args.Url, parentDir, "")77if err != nil {78return "", fmt.Errorf("failed to add offline download task: %w", err)79}8081return task.ID, nil82}8384func (t *Thunder) Remove(task *tool.DownloadTask) error {85storage, _, err := op.GetStorageAndActualPath(task.TempDir)86if err != nil {87return err88}89thunderDriver, ok := storage.(*thunder.Thunder)90if !ok {91return fmt.Errorf("unsupported storage driver for offline download, only Thunder is supported")92}93ctx := context.Background()94err = thunderDriver.DeleteOfflineTasks(ctx, []string{task.GID}, false)95if err != nil {96return err97}98return nil99}100101func (t *Thunder) Status(task *tool.DownloadTask) (*tool.Status, error) {102storage, _, err := op.GetStorageAndActualPath(task.TempDir)103if err != nil {104return nil, err105}106thunderDriver, ok := storage.(*thunder.Thunder)107if !ok {108return nil, fmt.Errorf("unsupported storage driver for offline download, only Thunder is supported")109}110tasks, err := t.GetTasks(thunderDriver)111if err != nil {112return nil, err113}114s := &tool.Status{115Progress: 0,116NewGID: "",117Completed: false,118Status: "the task has been deleted",119Err: nil,120}121for _, t := range tasks {122if t.ID == task.GID {123s.Progress = float64(t.Progress)124s.Status = t.Message125s.Completed = (t.Phase == "PHASE_TYPE_COMPLETE")126s.TotalBytes, err = strconv.ParseInt(t.FileSize, 10, 64)127if err != nil {128s.TotalBytes = 0129}130if t.Phase == "PHASE_TYPE_ERROR" {131s.Err = errors.New(t.Message)132}133return s, nil134}135}136s.Err = fmt.Errorf("the task has been deleted")137return s, nil138}139140func init() {141tool.Tools.Add(&Thunder{})142}143144145