| | package febbox |
| |
|
| | import ( |
| | "encoding/json" |
| | "errors" |
| | "github.com/alist-org/alist/v3/drivers/base" |
| | "github.com/alist-org/alist/v3/internal/op" |
| | "github.com/go-resty/resty/v2" |
| | "net/http" |
| | "strconv" |
| | ) |
| |
|
| | func (d *FebBox) refreshTokenByOAuth2() error { |
| | token, err := d.oauth2Token.Token() |
| | if err != nil { |
| | return err |
| | } |
| | d.Status = "work" |
| | d.accessToken = token.AccessToken |
| | d.Addition.RefreshToken = token.RefreshToken |
| | op.MustSaveDriverStorage(d) |
| | return nil |
| | } |
| |
|
| | func (d *FebBox) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) { |
| | req := base.RestyClient.R() |
| | |
| | token, err := d.oauth2Token.Token() |
| | if err != nil { |
| | return nil, err |
| | } |
| | req.SetAuthScheme(token.TokenType).SetAuthToken(token.AccessToken) |
| |
|
| | if callback != nil { |
| | callback(req) |
| | } |
| | if resp != nil { |
| | req.SetResult(resp) |
| | } |
| | var e ErrResp |
| | req.SetError(&e) |
| | res, err := req.Execute(method, url) |
| | if err != nil { |
| | return nil, err |
| | } |
| |
|
| | switch e.ErrorCode { |
| | case 0: |
| | return res.Body(), nil |
| | case 1: |
| | return res.Body(), nil |
| | case -10001: |
| | if e.ServerName != "" { |
| | |
| | if err = d.refreshTokenByOAuth2(); err != nil { |
| | return nil, err |
| | } |
| | return d.request(url, method, callback, resp) |
| | } else { |
| | return nil, errors.New(e.Error()) |
| | } |
| | default: |
| | return nil, errors.New(e.Error()) |
| | } |
| | } |
| |
|
| | func (d *FebBox) getFilesList(id string) ([]File, error) { |
| | if d.PageSize <= 0 { |
| | d.PageSize = 100 |
| | } |
| | res, err := d.listWithLimit(id, d.PageSize) |
| | if err != nil { |
| | return nil, err |
| | } |
| | return *res, nil |
| | } |
| |
|
| | func (d *FebBox) listWithLimit(dirID string, pageLimit int64) (*[]File, error) { |
| | var files []File |
| | page := int64(1) |
| | for { |
| | result, err := d.getFiles(dirID, page, pageLimit) |
| | if err != nil { |
| | return nil, err |
| | } |
| | files = append(files, *result...) |
| | if int64(len(*result)) < pageLimit { |
| | break |
| | } else { |
| | page++ |
| | } |
| | } |
| | return &files, nil |
| | } |
| |
|
| | func (d *FebBox) getFiles(dirID string, page, pageLimit int64) (*[]File, error) { |
| | var fileList FileListResp |
| | queryParams := map[string]string{ |
| | "module": "file_list", |
| | "parent_id": dirID, |
| | "page": strconv.FormatInt(page, 10), |
| | "pagelimit": strconv.FormatInt(pageLimit, 10), |
| | "order": d.Addition.SortRule, |
| | } |
| |
|
| | res, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) { |
| | req.SetMultipartFormData(queryParams) |
| | }, &fileList) |
| | if err != nil { |
| | return nil, err |
| | } |
| |
|
| | if err = json.Unmarshal(res, &fileList); err != nil { |
| | return nil, err |
| | } |
| |
|
| | return &fileList.Data.FileList, nil |
| | } |
| |
|
| | func (d *FebBox) getDownloadLink(id string, ip string) (string, error) { |
| | var fileDownloadResp FileDownloadResp |
| | queryParams := map[string]string{ |
| | "module": "file_get_download_url", |
| | "fids[]": id, |
| | "ip": ip, |
| | } |
| |
|
| | res, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) { |
| | req.SetMultipartFormData(queryParams) |
| | }, &fileDownloadResp) |
| | if err != nil { |
| | return "", err |
| | } |
| |
|
| | if err = json.Unmarshal(res, &fileDownloadResp); err != nil { |
| | return "", err |
| | } |
| |
|
| | return fileDownloadResp.Data[0].DownloadURL, nil |
| | } |
| |
|
| | func (d *FebBox) makeDir(id string, name string) error { |
| | queryParams := map[string]string{ |
| | "module": "create_dir", |
| | "parent_id": id, |
| | "name": name, |
| | } |
| |
|
| | _, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) { |
| | req.SetMultipartFormData(queryParams) |
| | }, nil) |
| | if err != nil { |
| | return err |
| | } |
| |
|
| | return nil |
| | } |
| |
|
| | func (d *FebBox) move(id string, id2 string) error { |
| | queryParams := map[string]string{ |
| | "module": "file_move", |
| | "fids[]": id, |
| | "to": id2, |
| | } |
| |
|
| | _, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) { |
| | req.SetMultipartFormData(queryParams) |
| | }, nil) |
| | if err != nil { |
| | return err |
| | } |
| |
|
| | return nil |
| | } |
| |
|
| | func (d *FebBox) rename(id string, name string) error { |
| | queryParams := map[string]string{ |
| | "module": "file_rename", |
| | "fid": id, |
| | "name": name, |
| | } |
| |
|
| | _, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) { |
| | req.SetMultipartFormData(queryParams) |
| | }, nil) |
| | if err != nil { |
| | return err |
| | } |
| |
|
| | return nil |
| | } |
| |
|
| | func (d *FebBox) copy(id string, id2 string) error { |
| | queryParams := map[string]string{ |
| | "module": "file_copy", |
| | "fids[]": id, |
| | "to": id2, |
| | } |
| |
|
| | _, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) { |
| | req.SetMultipartFormData(queryParams) |
| | }, nil) |
| | if err != nil { |
| | return err |
| | } |
| |
|
| | return nil |
| | } |
| |
|
| | func (d *FebBox) remove(id string) error { |
| | queryParams := map[string]string{ |
| | "module": "file_delete", |
| | "fids[]": id, |
| | } |
| |
|
| | _, err := d.request("https://api.febbox.com/oauth", http.MethodPost, func(req *resty.Request) { |
| | req.SetMultipartFormData(queryParams) |
| | }, nil) |
| | if err != nil { |
| | return err |
| | } |
| |
|
| | return nil |
| | } |
| |
|