mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			155 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
package yandex
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"github.com/Xhofe/alist/conf"
 | 
						|
	"github.com/Xhofe/alist/drivers/base"
 | 
						|
	"github.com/Xhofe/alist/model"
 | 
						|
	"github.com/Xhofe/alist/utils"
 | 
						|
	"github.com/go-resty/resty/v2"
 | 
						|
	"path"
 | 
						|
	"strconv"
 | 
						|
)
 | 
						|
 | 
						|
func (driver Yandex) RefreshToken(account *model.Account) error {
 | 
						|
	err := driver.refreshToken(account)
 | 
						|
	if err != nil && err == base.ErrEmptyToken {
 | 
						|
		err = driver.refreshToken(account)
 | 
						|
	}
 | 
						|
	if err != nil {
 | 
						|
		account.Status = err.Error()
 | 
						|
	}
 | 
						|
	_ = model.SaveAccount(account)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (driver Yandex) refreshToken(account *model.Account) error {
 | 
						|
	u := "https://oauth.yandex.com/token"
 | 
						|
	var resp base.TokenResp
 | 
						|
	var e TokenErrResp
 | 
						|
	_, err := base.RestyClient.R().SetResult(&resp).SetError(&e).SetFormData(map[string]string{
 | 
						|
		"grant_type":    "refresh_token",
 | 
						|
		"refresh_token": account.RefreshToken,
 | 
						|
		"client_id":     account.ClientId,
 | 
						|
		"client_secret": account.ClientSecret,
 | 
						|
	}).Post(u)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	if e.Error != "" {
 | 
						|
		return fmt.Errorf("%s : %s", e.Error, e.ErrorDescription)
 | 
						|
	}
 | 
						|
	if resp.RefreshToken == "" {
 | 
						|
		return base.ErrEmptyToken
 | 
						|
	}
 | 
						|
	account.Status = "work"
 | 
						|
	account.AccessToken, account.RefreshToken = resp.AccessToken, resp.RefreshToken
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (driver Yandex) Request(pathname string, method int, headers, query, form map[string]string, data interface{}, resp interface{}, account *model.Account) ([]byte, error) {
 | 
						|
	u := "https://cloud-api.yandex.net/v1/disk/resources" + pathname
 | 
						|
	req := base.RestyClient.R()
 | 
						|
	req.SetHeader("Authorization", "OAuth "+account.AccessToken)
 | 
						|
	if headers != nil {
 | 
						|
		req.SetHeaders(headers)
 | 
						|
	}
 | 
						|
	if query != nil {
 | 
						|
		req.SetQueryParams(query)
 | 
						|
	}
 | 
						|
	if form != nil {
 | 
						|
		req.SetFormData(form)
 | 
						|
	}
 | 
						|
	if data != nil {
 | 
						|
		req.SetBody(data)
 | 
						|
	}
 | 
						|
	if resp != nil {
 | 
						|
		req.SetResult(resp)
 | 
						|
	}
 | 
						|
	var res *resty.Response
 | 
						|
	var err error
 | 
						|
	var e ErrResp
 | 
						|
	req.SetError(&e)
 | 
						|
	switch method {
 | 
						|
	case base.Get:
 | 
						|
		res, err = req.Get(u)
 | 
						|
	case base.Post:
 | 
						|
		res, err = req.Post(u)
 | 
						|
	case base.Patch:
 | 
						|
		res, err = req.Patch(u)
 | 
						|
	case base.Delete:
 | 
						|
		res, err = req.Delete(u)
 | 
						|
	case base.Put:
 | 
						|
		res, err = req.Put(u)
 | 
						|
	default:
 | 
						|
		return nil, base.ErrNotSupport
 | 
						|
	}
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	//log.Debug(res.String())
 | 
						|
	if e.Error != "" {
 | 
						|
		if e.Error == "UnauthorizedError" {
 | 
						|
			err = driver.RefreshToken(account)
 | 
						|
			if err != nil {
 | 
						|
				return nil, err
 | 
						|
			}
 | 
						|
			return driver.Request(pathname, method, headers, query, form, data, resp, account)
 | 
						|
		}
 | 
						|
		return nil, errors.New(e.Description)
 | 
						|
	}
 | 
						|
	return res.Body(), nil
 | 
						|
}
 | 
						|
 | 
						|
func (driver Yandex) GetFiles(rawPath string, account *model.Account) ([]model.File, error) {
 | 
						|
	path_ := utils.Join(account.RootFolder, rawPath)
 | 
						|
	limit := 100
 | 
						|
	page := 1
 | 
						|
	res := make([]model.File, 0)
 | 
						|
	for {
 | 
						|
		offset := (page - 1) * limit
 | 
						|
		query := map[string]string{
 | 
						|
			"path":   path_,
 | 
						|
			"limit":  strconv.Itoa(limit),
 | 
						|
			"offset": strconv.Itoa(offset),
 | 
						|
		}
 | 
						|
		if account.OrderBy != "" {
 | 
						|
			if account.OrderDirection == "desc" {
 | 
						|
				query["sort"] = "-" + account.OrderBy
 | 
						|
			} else {
 | 
						|
				query["sort"] = account.OrderBy
 | 
						|
			}
 | 
						|
		}
 | 
						|
		var resp FilesResp
 | 
						|
		_, err := driver.Request("", base.Get, nil, query, nil, nil, &resp, account)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		for _, file := range resp.Embedded.Items {
 | 
						|
			f := model.File{
 | 
						|
				Name:      file.Name,
 | 
						|
				Size:      file.Size,
 | 
						|
				Driver:    driver.Config().Name,
 | 
						|
				UpdatedAt: &file.Modified,
 | 
						|
				Thumbnail: file.Preview,
 | 
						|
				Url:       file.File,
 | 
						|
			}
 | 
						|
			if file.Type == "dir" {
 | 
						|
				f.Type = conf.FOLDER
 | 
						|
			} else {
 | 
						|
				f.Type = utils.GetFileType(path.Ext(file.Name))
 | 
						|
			}
 | 
						|
			res = append(res, f)
 | 
						|
		}
 | 
						|
		if resp.Embedded.Total <= offset+limit {
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return res, nil
 | 
						|
}
 | 
						|
 | 
						|
func init() {
 | 
						|
	base.RegisterDriver(&Yandex{})
 | 
						|
}
 |