Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/aliyundrive_share/driver.go
1986 views
1
package aliyundrive_share
2
3
import (
4
"context"
5
"fmt"
6
"net/http"
7
"time"
8
9
"github.com/Xhofe/rateg"
10
"github.com/alist-org/alist/v3/drivers/base"
11
"github.com/alist-org/alist/v3/internal/driver"
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/pkg/cron"
15
"github.com/alist-org/alist/v3/pkg/utils"
16
"github.com/go-resty/resty/v2"
17
log "github.com/sirupsen/logrus"
18
)
19
20
type AliyundriveShare struct {
21
model.Storage
22
Addition
23
AccessToken string
24
ShareToken string
25
DriveId string
26
cron *cron.Cron
27
28
limitList func(ctx context.Context, dir model.Obj) ([]model.Obj, error)
29
limitLink func(ctx context.Context, file model.Obj) (*model.Link, error)
30
}
31
32
func (d *AliyundriveShare) Config() driver.Config {
33
return config
34
}
35
36
func (d *AliyundriveShare) GetAddition() driver.Additional {
37
return &d.Addition
38
}
39
40
func (d *AliyundriveShare) Init(ctx context.Context) error {
41
err := d.refreshToken()
42
if err != nil {
43
return err
44
}
45
err = d.getShareToken()
46
if err != nil {
47
return err
48
}
49
d.cron = cron.NewCron(time.Hour * 2)
50
d.cron.Do(func() {
51
err := d.refreshToken()
52
if err != nil {
53
log.Errorf("%+v", err)
54
}
55
})
56
d.limitList = rateg.LimitFnCtx(d.list, rateg.LimitFnOption{
57
Limit: 4,
58
Bucket: 1,
59
})
60
d.limitLink = rateg.LimitFnCtx(d.link, rateg.LimitFnOption{
61
Limit: 1,
62
Bucket: 1,
63
})
64
return nil
65
}
66
67
func (d *AliyundriveShare) Drop(ctx context.Context) error {
68
if d.cron != nil {
69
d.cron.Stop()
70
}
71
d.DriveId = ""
72
return nil
73
}
74
75
func (d *AliyundriveShare) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
76
if d.limitList == nil {
77
return nil, fmt.Errorf("driver not init")
78
}
79
return d.limitList(ctx, dir)
80
}
81
82
func (d *AliyundriveShare) list(ctx context.Context, dir model.Obj) ([]model.Obj, error) {
83
files, err := d.getFiles(dir.GetID())
84
if err != nil {
85
return nil, err
86
}
87
return utils.SliceConvert(files, func(src File) (model.Obj, error) {
88
return fileToObj(src), nil
89
})
90
}
91
92
func (d *AliyundriveShare) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
93
if d.limitLink == nil {
94
return nil, fmt.Errorf("driver not init")
95
}
96
return d.limitLink(ctx, file)
97
}
98
99
func (d *AliyundriveShare) link(ctx context.Context, file model.Obj) (*model.Link, error) {
100
data := base.Json{
101
"drive_id": d.DriveId,
102
"file_id": file.GetID(),
103
// // Only ten minutes lifetime
104
"expire_sec": 600,
105
"share_id": d.ShareId,
106
}
107
var resp ShareLinkResp
108
_, err := d.request("https://api.alipan.com/v2/file/get_share_link_download_url", http.MethodPost, func(req *resty.Request) {
109
req.SetHeader(CanaryHeaderKey, CanaryHeaderValue).SetBody(data).SetResult(&resp)
110
})
111
if err != nil {
112
return nil, err
113
}
114
return &model.Link{
115
Header: http.Header{
116
"Referer": []string{"https://www.alipan.com/"},
117
},
118
URL: resp.DownloadUrl,
119
}, nil
120
}
121
122
func (d *AliyundriveShare) Other(ctx context.Context, args model.OtherArgs) (interface{}, error) {
123
var resp base.Json
124
var url string
125
data := base.Json{
126
"share_id": d.ShareId,
127
"file_id": args.Obj.GetID(),
128
}
129
switch args.Method {
130
case "doc_preview":
131
url = "https://api.alipan.com/v2/file/get_office_preview_url"
132
case "video_preview":
133
url = "https://api.alipan.com/v2/file/get_video_preview_play_info"
134
data["category"] = "live_transcoding"
135
default:
136
return nil, errs.NotSupport
137
}
138
_, err := d.request(url, http.MethodPost, func(req *resty.Request) {
139
req.SetBody(data).SetResult(&resp)
140
})
141
if err != nil {
142
return nil, err
143
}
144
return resp, nil
145
}
146
147
var _ driver.Driver = (*AliyundriveShare)(nil)
148
149