Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/febbox/util.go
1987 views
1
package febbox
2
3
import (
4
"encoding/json"
5
"errors"
6
"fmt"
7
"github.com/alist-org/alist/v3/drivers/base"
8
"github.com/alist-org/alist/v3/internal/op"
9
"github.com/go-resty/resty/v2"
10
"net/http"
11
"strconv"
12
)
13
14
func (d *FebBox) refreshTokenByOAuth2() error {
15
token, err := d.oauth2Token.Token()
16
if err != nil {
17
return err
18
}
19
d.Status = "work"
20
d.accessToken = token.AccessToken
21
d.Addition.RefreshToken = token.RefreshToken
22
op.MustSaveDriverStorage(d)
23
return nil
24
}
25
26
func (d *FebBox) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
27
req := base.RestyClient.R()
28
// 使用oauth2 获取 access_token
29
token, err := d.oauth2Token.Token()
30
if err != nil {
31
return nil, err
32
}
33
req.SetAuthScheme(token.TokenType).SetAuthToken(token.AccessToken)
34
35
if callback != nil {
36
callback(req)
37
}
38
if resp != nil {
39
req.SetResult(resp)
40
}
41
var e ErrResp
42
req.SetError(&e)
43
res, err := req.Execute(method, url)
44
if err != nil {
45
return nil, err
46
}
47
48
switch e.ErrorCode {
49
case 0:
50
return res.Body(), nil
51
case 1:
52
return res.Body(), nil
53
case -10001:
54
if e.ServerName != "" {
55
// access_token 过期
56
if err = d.refreshTokenByOAuth2(); err != nil {
57
return nil, err
58
}
59
return d.request(url, method, callback, resp)
60
} else {
61
return nil, errors.New(e.Error())
62
}
63
default:
64
return nil, errors.New(e.Error())
65
}
66
}
67
68
func (d *FebBox) getFilesList(id string) ([]File, error) {
69
if d.PageSize <= 0 {
70
d.PageSize = 100
71
}
72
res, err := d.listWithLimit(id, d.PageSize)
73
if err != nil {
74
return nil, err
75
}
76
return *res, nil
77
}
78
79
func (d *FebBox) listWithLimit(dirID string, pageLimit int64) (*[]File, error) {
80
var files []File
81
page := int64(1)
82
for {
83
result, err := d.getFiles(dirID, page, pageLimit)
84
if err != nil {
85
return nil, err
86
}
87
files = append(files, *result...)
88
if int64(len(*result)) < pageLimit {
89
break
90
} else {
91
page++
92
}
93
}
94
return &files, nil
95
}
96
97
func (d *FebBox) getFiles(dirID string, page, pageLimit int64) (*[]File, error) {
98
var fileList FileListResp
99
queryParams := map[string]string{
100
"module": "file_list",
101
"parent_id": dirID,
102
"page": strconv.FormatInt(page, 10),
103
"pagelimit": strconv.FormatInt(pageLimit, 10),
104
"order": d.Addition.SortRule,
105
}
106
107
res, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) {
108
req.SetMultipartFormData(queryParams)
109
}, &fileList)
110
if err != nil {
111
return nil, err
112
}
113
114
if err = json.Unmarshal(res, &fileList); err != nil {
115
return nil, err
116
}
117
118
return &fileList.Data.FileList, nil
119
}
120
121
func (d *FebBox) getDownloadLink(id string, ip string) (string, error) {
122
var fileDownloadResp FileDownloadResp
123
queryParams := map[string]string{
124
"module": "file_get_download_url",
125
"fids[]": id,
126
"ip": ip,
127
}
128
129
res, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) {
130
req.SetMultipartFormData(queryParams)
131
}, &fileDownloadResp)
132
if err != nil {
133
return "", err
134
}
135
136
if err = json.Unmarshal(res, &fileDownloadResp); err != nil {
137
return "", err
138
}
139
if len(fileDownloadResp.Data) == 0 {
140
return "", fmt.Errorf("can not get download link, code:%d, msg:%s", fileDownloadResp.Code, fileDownloadResp.Msg)
141
}
142
143
return fileDownloadResp.Data[0].DownloadURL, nil
144
}
145
146
func (d *FebBox) makeDir(id string, name string) error {
147
queryParams := map[string]string{
148
"module": "create_dir",
149
"parent_id": id,
150
"name": name,
151
}
152
153
_, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) {
154
req.SetMultipartFormData(queryParams)
155
}, nil)
156
if err != nil {
157
return err
158
}
159
160
return nil
161
}
162
163
func (d *FebBox) move(id string, id2 string) error {
164
queryParams := map[string]string{
165
"module": "file_move",
166
"fids[]": id,
167
"to": id2,
168
}
169
170
_, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) {
171
req.SetMultipartFormData(queryParams)
172
}, nil)
173
if err != nil {
174
return err
175
}
176
177
return nil
178
}
179
180
func (d *FebBox) rename(id string, name string) error {
181
queryParams := map[string]string{
182
"module": "file_rename",
183
"fid": id,
184
"name": name,
185
}
186
187
_, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) {
188
req.SetMultipartFormData(queryParams)
189
}, nil)
190
if err != nil {
191
return err
192
}
193
194
return nil
195
}
196
197
func (d *FebBox) copy(id string, id2 string) error {
198
queryParams := map[string]string{
199
"module": "file_copy",
200
"fids[]": id,
201
"to": id2,
202
}
203
204
_, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) {
205
req.SetMultipartFormData(queryParams)
206
}, nil)
207
if err != nil {
208
return err
209
}
210
211
return nil
212
}
213
214
func (d *FebBox) remove(id string) error {
215
queryParams := map[string]string{
216
"module": "file_delete",
217
"fids[]": id,
218
}
219
220
_, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) {
221
req.SetMultipartFormData(queryParams)
222
}, nil)
223
if err != nil {
224
return err
225
}
226
227
return nil
228
}
229
230