package aliyundrive_open import ( "errors" "fmt" "net/http" "github.com/alist-org/alist/v3/drivers/base" "github.com/alist-org/alist/v3/internal/op" "github.com/go-resty/resty/v2" ) // do others that not defined in Driver interface func (d *AliyundriveOpen) refreshToken() error { url := d.base + "/oauth/access_token" if d.OauthTokenURL != "" && d.ClientID == "" { url = d.OauthTokenURL } var resp base.TokenResp var e ErrResp _, err := base.RestyClient.R(). ForceContentType("application/json"). SetBody(base.Json{ "client_id": d.ClientID, "client_secret": d.ClientSecret, "grant_type": "refresh_token", "refresh_token": d.RefreshToken, }). SetResult(&resp). SetError(&e). Post(url) if err != nil { return err } if e.Code != "" { return fmt.Errorf("failed to refresh token: %s", e.Message) } if resp.RefreshToken == "" { return errors.New("failed to refresh token: refresh token is empty") } d.RefreshToken, d.AccessToken = resp.RefreshToken, resp.AccessToken op.MustSaveDriverStorage(d) return nil } func (d *AliyundriveOpen) request(uri, method string, callback base.ReqCallback) ([]byte, error) { req := base.RestyClient.R() // TODO check whether access_token is expired req.SetHeader("Authorization", "Bearer "+d.AccessToken) if method == http.MethodPost { req.SetHeader("Content-Type", "application/json") } if callback != nil { callback(req) } var e ErrResp req.SetError(&e) res, err := req.Execute(method, d.base+uri) if err != nil { return nil, err } if e.Code != "" { return nil, fmt.Errorf("%s:%s", e.Code, e.Message) } return res.Body(), nil } func (d *AliyundriveOpen) getFiles(fileId string) ([]File, error) { marker := "first" res := make([]File, 0) for marker != "" { if marker == "first" { marker = "" } var resp Files data := base.Json{ "drive_id": d.DriveId, "limit": 200, "marker": marker, "order_by": d.OrderBy, "order_direction": d.OrderDirection, "parent_file_id": fileId, //"category": "", //"type": "", //"video_thumbnail_time": 120000, //"video_thumbnail_width": 480, //"image_thumbnail_width": 480, } _, err := d.request("/adrive/v1.0/openFile/list", http.MethodPost, func(req *resty.Request) { req.SetBody(data).SetResult(&resp) }) if err != nil { return nil, err } marker = resp.NextMarker res = append(res, resp.Items...) } return res, nil }