From bf0ee3d31501a2963ebaffbb90b6cb50bdaf7bae Mon Sep 17 00:00:00 2001 From: foxxorcat Date: Mon, 9 May 2022 12:43:51 +0800 Subject: [PATCH] refactor(baidu.photo): add a file api of download --- drivers/baiduphoto/driver.go | 52 ++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/drivers/baiduphoto/driver.go b/drivers/baiduphoto/driver.go index 99010ac1..ce871019 100644 --- a/drivers/baiduphoto/driver.go +++ b/drivers/baiduphoto/driver.go @@ -43,6 +43,14 @@ func (driver Baidu) Items() []base.Item { Label: "album_id", Type: base.TypeString, }, + { + Name: "internal_type", + Label: "download api", + Type: base.TypeSelect, + Required: true, + Values: "file,album", + Default: "album", + }, { Name: "client_id", Label: "client id", @@ -156,6 +164,13 @@ func (driver Baidu) Files(path string, account *model.Account) ([]model.File, er } func (driver Baidu) Link(args base.Args, account *model.Account) (*base.Link, error) { + if account.InternalType == "file" { + return driver.LinkFile(args, account) + } + return driver.LinkAlbum(args, account) +} + +func (driver Baidu) LinkAlbum(args base.Args, account *model.Account) (*base.Link, error) { file, err := driver.File(args.Path, account) if err != nil { return nil, err @@ -190,6 +205,43 @@ func (driver Baidu) Link(args base.Args, account *model.Account) (*base.Link, er }, nil } +func (driver Baidu) LinkFile(args base.Args, account *model.Account) (*base.Link, error) { + file, err := driver.File(args.Path, account) + if err != nil { + return nil, err + } + + if !IsAlbumFile(file) { + return nil, base.ErrNotSupport + } + + album, err := driver.File(utils.Dir(utils.ParsePath(args.Path)), account) + if err != nil { + return nil, err + } + // 拷贝到根目录 + cfile, err := driver.CopyAlbumFile(album.Id, account, file.Id) + if err != nil { + return nil, err + } + // 获取文件下载地址 + res, err := base.NoRedirectClient.R(). + SetQueryParams(map[string]string{ + "access_token": account.AccessToken, + "fsid": fmt.Sprint(cfile.Fsid), + }). + Head(FILE_API_URL + "/download") + if err != nil { + return nil, err + } + return &base.Link{ + Headers: []base.Header{ + {Name: "User-Agent", Value: base.UserAgent}, + }, + Url: res.Header().Get("location"), + }, nil +} + func (driver Baidu) Path(path string, account *model.Account) (*model.File, []model.File, error) { path = utils.ParsePath(path) file, err := driver.File(path, account)