Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/offline_download/pikpak/util.go
1562 views
1
package pikpak
2
3
import (
4
"context"
5
"time"
6
7
"github.com/Xhofe/go-cache"
8
"github.com/alist-org/alist/v3/drivers/pikpak"
9
"github.com/alist-org/alist/v3/internal/op"
10
"github.com/alist-org/alist/v3/pkg/singleflight"
11
)
12
13
var taskCache = cache.NewMemCache(cache.WithShards[[]pikpak.OfflineTask](16))
14
var taskG singleflight.Group[[]pikpak.OfflineTask]
15
16
func (p *PikPak) GetTasks(pikpakDriver *pikpak.PikPak) ([]pikpak.OfflineTask, error) {
17
key := op.Key(pikpakDriver, "/drive/v1/task")
18
if !p.refreshTaskCache {
19
if tasks, ok := taskCache.Get(key); ok {
20
return tasks, nil
21
}
22
}
23
p.refreshTaskCache = false
24
tasks, err, _ := taskG.Do(key, func() ([]pikpak.OfflineTask, error) {
25
ctx := context.Background()
26
phase := []string{"PHASE_TYPE_RUNNING", "PHASE_TYPE_ERROR", "PHASE_TYPE_PENDING", "PHASE_TYPE_COMPLETE"}
27
tasks, err := pikpakDriver.OfflineList(ctx, "", phase)
28
if err != nil {
29
return nil, err
30
}
31
// 添加缓存 10s
32
if len(tasks) > 0 {
33
taskCache.Set(key, tasks, cache.WithEx[[]pikpak.OfflineTask](time.Second*10))
34
} else {
35
taskCache.Del(key)
36
}
37
return tasks, nil
38
})
39
if err != nil {
40
return nil, err
41
}
42
return tasks, nil
43
}
44
45