@@ -16,12 +16,14 @@ import (
1616 "github.com/alist-org/alist/v3/internal/op"
1717 "github.com/alist-org/alist/v3/pkg/utils"
1818 sdk "github.com/xhofe/115-sdk-go"
19+ "golang.org/x/time/rate"
1920)
2021
2122type Open115 struct {
2223 model.Storage
2324 Addition
24- client * sdk.Client
25+ client * sdk.Client
26+ limiter * rate.Limiter
2527}
2628
2729func (d * Open115 ) Config () driver.Config {
@@ -47,6 +49,16 @@ func (d *Open115) Init(ctx context.Context) error {
4749 if err != nil {
4850 return err
4951 }
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+ }
5062 return nil
5163}
5264
@@ -59,6 +71,9 @@ func (d *Open115) List(ctx context.Context, dir model.Obj, args model.ListArgs)
5971 pageSize := int64 (200 )
6072 offset := int64 (0 )
6173 for {
74+ if err := d .WaitLimit (ctx ); err != nil {
75+ return nil , err
76+ }
6277 resp , err := d .client .GetFiles (ctx , & sdk.GetFilesReq {
6378 CID : dir .GetID (),
6479 Limit : pageSize ,
@@ -84,6 +99,9 @@ func (d *Open115) List(ctx context.Context, dir model.Obj, args model.ListArgs)
8499}
85100
86101func (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+ }
87105 var ua string
88106 if args .Header != nil {
89107 ua = args .Header .Get ("User-Agent" )
@@ -113,11 +131,13 @@ func (d *Open115) Link(ctx context.Context, file model.Obj, args model.LinkArgs)
113131}
114132
115133func (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+ }
116137 resp , err := d .client .Mkdir (ctx , parentDir .GetID (), dirName )
117138 if err != nil {
118139 return nil , err
119140 }
120- time .Sleep (800 * time .Millisecond )
121141 return & Obj {
122142 Fid : resp .FileID ,
123143 Pid : parentDir .GetID (),
@@ -130,6 +150,9 @@ func (d *Open115) MakeDir(ctx context.Context, parentDir model.Obj, dirName stri
130150}
131151
132152func (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+ }
133156 _ , err := d .client .Move (ctx , & sdk.MoveReq {
134157 FileIDs : srcObj .GetID (),
135158 ToCid : dstDir .GetID (),
@@ -141,6 +164,9 @@ func (d *Open115) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj
141164}
142165
143166func (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+ }
144170 _ , err := d .client .UpdateFile (ctx , & sdk.UpdateFileReq {
145171 FileID : srcObj .GetID (),
146172 FileNma : newName ,
@@ -156,6 +182,9 @@ func (d *Open115) Rename(ctx context.Context, srcObj model.Obj, newName string)
156182}
157183
158184func (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+ }
159188 _ , err := d .client .Copy (ctx , & sdk.CopyReq {
160189 PID : dstDir .GetID (),
161190 FileID : srcObj .GetID (),
@@ -168,6 +197,9 @@ func (d *Open115) Copy(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj
168197}
169198
170199func (d * Open115 ) Remove (ctx context.Context , obj model.Obj ) error {
200+ if err := d .WaitLimit (ctx ); err != nil {
201+ return err
202+ }
171203 _obj , ok := obj .(* Obj )
172204 if ! ok {
173205 return fmt .Errorf ("can't convert obj" )
@@ -183,6 +215,9 @@ func (d *Open115) Remove(ctx context.Context, obj model.Obj) error {
183215}
184216
185217func (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+ }
186221 tempF , err := file .CacheFullInTempFile ()
187222 if err != nil {
188223 return err
0 commit comments