Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/offline_download/thunder/thunder.go
1562 views
1
package thunder
2
3
import (
4
"context"
5
"errors"
6
"fmt"
7
"github.com/alist-org/alist/v3/internal/conf"
8
"github.com/alist-org/alist/v3/internal/setting"
9
"strconv"
10
11
"github.com/alist-org/alist/v3/drivers/thunder"
12
"github.com/alist-org/alist/v3/internal/errs"
13
"github.com/alist-org/alist/v3/internal/model"
14
"github.com/alist-org/alist/v3/internal/offline_download/tool"
15
"github.com/alist-org/alist/v3/internal/op"
16
)
17
18
type Thunder struct {
19
refreshTaskCache bool
20
}
21
22
func (t *Thunder) Name() string {
23
return "Thunder"
24
}
25
26
func (t *Thunder) Items() []model.SettingItem {
27
return nil
28
}
29
30
func (t *Thunder) Run(task *tool.DownloadTask) error {
31
return errs.NotSupport
32
}
33
34
func (t *Thunder) Init() (string, error) {
35
t.refreshTaskCache = false
36
return "ok", nil
37
}
38
39
func (t *Thunder) IsReady() bool {
40
tempDir := setting.GetStr(conf.ThunderTempDir)
41
if tempDir == "" {
42
return false
43
}
44
storage, _, err := op.GetStorageAndActualPath(tempDir)
45
if err != nil {
46
return false
47
}
48
if _, ok := storage.(*thunder.Thunder); !ok {
49
return false
50
}
51
return true
52
}
53
54
func (t *Thunder) AddURL(args *tool.AddUrlArgs) (string, error) {
55
// 添加新任务刷新缓存
56
t.refreshTaskCache = true
57
storage, actualPath, err := op.GetStorageAndActualPath(args.TempDir)
58
if err != nil {
59
return "", err
60
}
61
thunderDriver, ok := storage.(*thunder.Thunder)
62
if !ok {
63
return "", fmt.Errorf("unsupported storage driver for offline download, only Thunder is supported")
64
}
65
66
ctx := context.Background()
67
68
if err := op.MakeDir(ctx, storage, actualPath); err != nil {
69
return "", err
70
}
71
72
parentDir, err := op.GetUnwrap(ctx, storage, actualPath)
73
if err != nil {
74
return "", err
75
}
76
77
task, err := thunderDriver.OfflineDownload(ctx, args.Url, parentDir, "")
78
if err != nil {
79
return "", fmt.Errorf("failed to add offline download task: %w", err)
80
}
81
82
return task.ID, nil
83
}
84
85
func (t *Thunder) Remove(task *tool.DownloadTask) error {
86
storage, _, err := op.GetStorageAndActualPath(task.TempDir)
87
if err != nil {
88
return err
89
}
90
thunderDriver, ok := storage.(*thunder.Thunder)
91
if !ok {
92
return fmt.Errorf("unsupported storage driver for offline download, only Thunder is supported")
93
}
94
ctx := context.Background()
95
err = thunderDriver.DeleteOfflineTasks(ctx, []string{task.GID}, false)
96
if err != nil {
97
return err
98
}
99
return nil
100
}
101
102
func (t *Thunder) Status(task *tool.DownloadTask) (*tool.Status, error) {
103
storage, _, err := op.GetStorageAndActualPath(task.TempDir)
104
if err != nil {
105
return nil, err
106
}
107
thunderDriver, ok := storage.(*thunder.Thunder)
108
if !ok {
109
return nil, fmt.Errorf("unsupported storage driver for offline download, only Thunder is supported")
110
}
111
tasks, err := t.GetTasks(thunderDriver)
112
if err != nil {
113
return nil, err
114
}
115
s := &tool.Status{
116
Progress: 0,
117
NewGID: "",
118
Completed: false,
119
Status: "the task has been deleted",
120
Err: nil,
121
}
122
for _, t := range tasks {
123
if t.ID == task.GID {
124
s.Progress = float64(t.Progress)
125
s.Status = t.Message
126
s.Completed = (t.Phase == "PHASE_TYPE_COMPLETE")
127
s.TotalBytes, err = strconv.ParseInt(t.FileSize, 10, 64)
128
if err != nil {
129
s.TotalBytes = 0
130
}
131
if t.Phase == "PHASE_TYPE_ERROR" {
132
s.Err = errors.New(t.Message)
133
}
134
return s, nil
135
}
136
}
137
s.Err = fmt.Errorf("the task has been deleted")
138
return s, nil
139
}
140
141
func init() {
142
tool.Tools.Add(&Thunder{})
143
}
144
145