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