@@ -16,12 +16,14 @@ import (
16
16
"github.com/alist-org/alist/v3/internal/op"
17
17
"github.com/alist-org/alist/v3/pkg/utils"
18
18
sdk "github.com/xhofe/115-sdk-go"
19
+ "golang.org/x/time/rate"
19
20
)
20
21
21
22
type Open115 struct {
22
23
model.Storage
23
24
Addition
24
- client * sdk.Client
25
+ client * sdk.Client
26
+ limiter * rate.Limiter
25
27
}
26
28
27
29
func (d * Open115 ) Config () driver.Config {
@@ -47,6 +49,16 @@ func (d *Open115) Init(ctx context.Context) error {
47
49
if err != nil {
48
50
return err
49
51
}
52
+ if d .Addition .LimitRate > 0 {
53
+ d .limiter = rate .NewLimiter (rate .Limit (d .Addition .LimitRate ), 1 )
54
+ }
55
+ return nil
56
+ }
57
+
58
+ func (d * Open115 ) WaitLimit (ctx context.Context ) error {
59
+ if d .limiter != nil {
60
+ return d .limiter .Wait (ctx )
61
+ }
50
62
return nil
51
63
}
52
64
@@ -59,6 +71,9 @@ func (d *Open115) List(ctx context.Context, dir model.Obj, args model.ListArgs)
59
71
pageSize := int64 (200 )
60
72
offset := int64 (0 )
61
73
for {
74
+ if err := d .WaitLimit (ctx ); err != nil {
75
+ return nil , err
76
+ }
62
77
resp , err := d .client .GetFiles (ctx , & sdk.GetFilesReq {
63
78
CID : dir .GetID (),
64
79
Limit : pageSize ,
@@ -84,6 +99,9 @@ func (d *Open115) List(ctx context.Context, dir model.Obj, args model.ListArgs)
84
99
}
85
100
86
101
func (d * Open115 ) Link (ctx context.Context , file model.Obj , args model.LinkArgs ) (* model.Link , error ) {
102
+ if err := d .WaitLimit (ctx ); err != nil {
103
+ return nil , err
104
+ }
87
105
var ua string
88
106
if args .Header != nil {
89
107
ua = args .Header .Get ("User-Agent" )
@@ -113,11 +131,13 @@ func (d *Open115) Link(ctx context.Context, file model.Obj, args model.LinkArgs)
113
131
}
114
132
115
133
func (d * Open115 ) MakeDir (ctx context.Context , parentDir model.Obj , dirName string ) (model.Obj , error ) {
134
+ if err := d .WaitLimit (ctx ); err != nil {
135
+ return nil , err
136
+ }
116
137
resp , err := d .client .Mkdir (ctx , parentDir .GetID (), dirName )
117
138
if err != nil {
118
139
return nil , err
119
140
}
120
- time .Sleep (800 * time .Millisecond )
121
141
return & Obj {
122
142
Fid : resp .FileID ,
123
143
Pid : parentDir .GetID (),
@@ -130,6 +150,9 @@ func (d *Open115) MakeDir(ctx context.Context, parentDir model.Obj, dirName stri
130
150
}
131
151
132
152
func (d * Open115 ) Move (ctx context.Context , srcObj , dstDir model.Obj ) (model.Obj , error ) {
153
+ if err := d .WaitLimit (ctx ); err != nil {
154
+ return nil , err
155
+ }
133
156
_ , err := d .client .Move (ctx , & sdk.MoveReq {
134
157
FileIDs : srcObj .GetID (),
135
158
ToCid : dstDir .GetID (),
@@ -141,6 +164,9 @@ func (d *Open115) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj
141
164
}
142
165
143
166
func (d * Open115 ) Rename (ctx context.Context , srcObj model.Obj , newName string ) (model.Obj , error ) {
167
+ if err := d .WaitLimit (ctx ); err != nil {
168
+ return nil , err
169
+ }
144
170
_ , err := d .client .UpdateFile (ctx , & sdk.UpdateFileReq {
145
171
FileID : srcObj .GetID (),
146
172
FileNma : newName ,
@@ -156,6 +182,9 @@ func (d *Open115) Rename(ctx context.Context, srcObj model.Obj, newName string)
156
182
}
157
183
158
184
func (d * Open115 ) Copy (ctx context.Context , srcObj , dstDir model.Obj ) (model.Obj , error ) {
185
+ if err := d .WaitLimit (ctx ); err != nil {
186
+ return nil , err
187
+ }
159
188
_ , err := d .client .Copy (ctx , & sdk.CopyReq {
160
189
PID : dstDir .GetID (),
161
190
FileID : srcObj .GetID (),
@@ -168,6 +197,9 @@ func (d *Open115) Copy(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj
168
197
}
169
198
170
199
func (d * Open115 ) Remove (ctx context.Context , obj model.Obj ) error {
200
+ if err := d .WaitLimit (ctx ); err != nil {
201
+ return err
202
+ }
171
203
_obj , ok := obj .(* Obj )
172
204
if ! ok {
173
205
return fmt .Errorf ("can't convert obj" )
@@ -183,6 +215,9 @@ func (d *Open115) Remove(ctx context.Context, obj model.Obj) error {
183
215
}
184
216
185
217
func (d * Open115 ) Put (ctx context.Context , dstDir model.Obj , file model.FileStreamer , up driver.UpdateProgress ) error {
218
+ if err := d .WaitLimit (ctx ); err != nil {
219
+ return err
220
+ }
186
221
tempF , err := file .CacheFullInTempFile ()
187
222
if err != nil {
188
223
return err
0 commit comments