Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/lanzou/driver.go
1987 views
1
package lanzou
2
3
import (
4
"context"
5
"net/http"
6
7
"github.com/alist-org/alist/v3/drivers/base"
8
"github.com/alist-org/alist/v3/internal/driver"
9
"github.com/alist-org/alist/v3/internal/errs"
10
"github.com/alist-org/alist/v3/internal/model"
11
"github.com/alist-org/alist/v3/pkg/utils"
12
"github.com/go-resty/resty/v2"
13
)
14
15
type LanZou struct {
16
Addition
17
model.Storage
18
uid string
19
vei string
20
21
flag int32
22
}
23
24
func (d *LanZou) Config() driver.Config {
25
return config
26
}
27
28
func (d *LanZou) GetAddition() driver.Additional {
29
return &d.Addition
30
}
31
32
func (d *LanZou) Init(ctx context.Context) (err error) {
33
if d.UserAgent == "" {
34
d.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.39 (KHTML, like Gecko) Chrome/89.0.4389.111 Safari/537.39"
35
}
36
switch d.Type {
37
case "account":
38
_, err := d.Login()
39
if err != nil {
40
return err
41
}
42
fallthrough
43
case "cookie":
44
if d.RootFolderID == "" {
45
d.RootFolderID = "-1"
46
}
47
d.vei, d.uid, err = d.getVeiAndUid()
48
}
49
return
50
}
51
52
func (d *LanZou) Drop(ctx context.Context) error {
53
d.uid = ""
54
return nil
55
}
56
57
// 获取的大小和时间不准确
58
func (d *LanZou) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
59
if d.IsCookie() || d.IsAccount() {
60
return d.GetAllFiles(dir.GetID())
61
} else {
62
return d.GetFileOrFolderByShareUrl(dir.GetID(), d.SharePassword)
63
}
64
}
65
66
func (d *LanZou) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
67
var (
68
err error
69
dfile *FileOrFolderByShareUrl
70
)
71
switch file := file.(type) {
72
case *FileOrFolder:
73
// 先获取分享链接
74
sfile := file.GetShareInfo()
75
if sfile == nil {
76
sfile, err = d.getFileShareUrlByID(file.GetID())
77
if err != nil {
78
return nil, err
79
}
80
file.SetShareInfo(sfile)
81
}
82
83
// 然后获取下载链接
84
dfile, err = d.GetFilesByShareUrl(sfile.FID, sfile.Pwd)
85
if err != nil {
86
return nil, err
87
}
88
// 修复文件大小
89
if d.RepairFileInfo && !file.repairFlag {
90
size, time := d.getFileRealInfo(dfile.Url)
91
if size != nil {
92
file.size = size
93
file.repairFlag = true
94
}
95
if file.time != nil {
96
file.time = time
97
}
98
}
99
case *FileOrFolderByShareUrl:
100
dfile, err = d.GetFilesByShareUrl(file.GetID(), file.Pwd)
101
if err != nil {
102
return nil, err
103
}
104
// 修复文件大小
105
if d.RepairFileInfo && !file.repairFlag {
106
size, time := d.getFileRealInfo(dfile.Url)
107
if size != nil {
108
file.size = size
109
file.repairFlag = true
110
}
111
if file.time != nil {
112
file.time = time
113
}
114
}
115
}
116
exp := GetExpirationTime(dfile.Url)
117
return &model.Link{
118
URL: dfile.Url,
119
Header: http.Header{
120
"User-Agent": []string{base.UserAgent},
121
},
122
Expiration: &exp,
123
}, nil
124
}
125
126
func (d *LanZou) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) {
127
if d.IsCookie() || d.IsAccount() {
128
data, err := d.doupload(func(req *resty.Request) {
129
req.SetContext(ctx)
130
req.SetFormData(map[string]string{
131
"task": "2",
132
"parent_id": parentDir.GetID(),
133
"folder_name": dirName,
134
"folder_description": "",
135
})
136
}, nil)
137
if err != nil {
138
return nil, err
139
}
140
return &FileOrFolder{
141
Name: dirName,
142
FolID: utils.Json.Get(data, "text").ToString(),
143
}, nil
144
}
145
return nil, errs.NotSupport
146
}
147
148
func (d *LanZou) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) {
149
if d.IsCookie() || d.IsAccount() {
150
if !srcObj.IsDir() {
151
_, err := d.doupload(func(req *resty.Request) {
152
req.SetContext(ctx)
153
req.SetFormData(map[string]string{
154
"task": "20",
155
"folder_id": dstDir.GetID(),
156
"file_id": srcObj.GetID(),
157
})
158
}, nil)
159
if err != nil {
160
return nil, err
161
}
162
return srcObj, nil
163
}
164
}
165
return nil, errs.NotSupport
166
}
167
168
func (d *LanZou) Rename(ctx context.Context, srcObj model.Obj, newName string) (model.Obj, error) {
169
if d.IsCookie() || d.IsAccount() {
170
if !srcObj.IsDir() {
171
_, err := d.doupload(func(req *resty.Request) {
172
req.SetContext(ctx)
173
req.SetFormData(map[string]string{
174
"task": "46",
175
"file_id": srcObj.GetID(),
176
"file_name": newName,
177
"type": "2",
178
})
179
}, nil)
180
if err != nil {
181
return nil, err
182
}
183
srcObj.(*FileOrFolder).NameAll = newName
184
return srcObj, nil
185
}
186
}
187
return nil, errs.NotSupport
188
}
189
190
func (d *LanZou) Remove(ctx context.Context, obj model.Obj) error {
191
if d.IsCookie() || d.IsAccount() {
192
_, err := d.doupload(func(req *resty.Request) {
193
req.SetContext(ctx)
194
if obj.IsDir() {
195
req.SetFormData(map[string]string{
196
"task": "3",
197
"folder_id": obj.GetID(),
198
})
199
} else {
200
req.SetFormData(map[string]string{
201
"task": "6",
202
"file_id": obj.GetID(),
203
})
204
}
205
}, nil)
206
return err
207
}
208
return errs.NotSupport
209
}
210
211
func (d *LanZou) Put(ctx context.Context, dstDir model.Obj, s model.FileStreamer, up driver.UpdateProgress) (model.Obj, error) {
212
if d.IsCookie() || d.IsAccount() {
213
var resp RespText[[]FileOrFolder]
214
_, err := d._post(d.BaseUrl+"/html5up.php", func(req *resty.Request) {
215
reader := driver.NewLimitedUploadStream(ctx, &driver.ReaderUpdatingProgress{
216
Reader: s,
217
UpdateProgress: up,
218
})
219
req.SetFormData(map[string]string{
220
"task": "1",
221
"vie": "2",
222
"ve": "2",
223
"id": "WU_FILE_0",
224
"name": s.GetName(),
225
"folder_id_bb_n": dstDir.GetID(),
226
}).SetFileReader("upload_file", s.GetName(), reader).SetContext(ctx)
227
}, &resp, true)
228
if err != nil {
229
return nil, err
230
}
231
return &resp.Text[0], nil
232
}
233
return nil, errs.NotSupport
234
}
235
236