fix(thunder_browser): fix space parameter not handled correctly in some cases & update some parameters (#6952)
This commit is contained in:
@ -15,8 +15,8 @@ import (
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
"github.com/aws/aws-sdk-go/service/s3/s3manager"
|
||||
"github.com/go-resty/resty/v2"
|
||||
"io"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@ -309,7 +309,7 @@ type XunLeiBrowserCommon struct {
|
||||
}
|
||||
|
||||
func (xc *XunLeiBrowserCommon) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
|
||||
return xc.getFiles(ctx, dir.GetID(), args.ReqPath)
|
||||
return xc.getFiles(ctx, dir, args.ReqPath)
|
||||
}
|
||||
|
||||
func (xc *XunLeiBrowserCommon) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
|
||||
@ -317,17 +317,10 @@ func (xc *XunLeiBrowserCommon) Link(ctx context.Context, file model.Obj, args mo
|
||||
|
||||
params := map[string]string{
|
||||
"_magic": "2021",
|
||||
"space": "SPACE_BROWSER",
|
||||
"space": file.(*Files).GetSpace(),
|
||||
"thumbnail_size": "SIZE_LARGE",
|
||||
"with": "url",
|
||||
}
|
||||
// 对 "迅雷云盘" 内的文件 特殊处理
|
||||
if file.GetPath() == ThunderDriveFileID {
|
||||
params = map[string]string{}
|
||||
} else if file.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
// 对 "超级保险箱" 内的文件 特殊处理
|
||||
params["space"] = "SPACE_BROWSER_SAFE"
|
||||
}
|
||||
|
||||
_, err := xc.Request(FILE_API_URL+"/{fileID}", http.MethodGet, func(r *resty.Request) {
|
||||
r.SetContext(ctx)
|
||||
@ -361,22 +354,9 @@ func (xc *XunLeiBrowserCommon) MakeDir(ctx context.Context, parentDir model.Obj,
|
||||
"kind": FOLDER,
|
||||
"name": dirName,
|
||||
"parent_id": parentDir.GetID(),
|
||||
"space": "SPACE_BROWSER",
|
||||
}
|
||||
if parentDir.GetPath() == ThunderDriveFileID {
|
||||
js = base.Json{
|
||||
"kind": FOLDER,
|
||||
"name": dirName,
|
||||
"parent_id": parentDir.GetID(),
|
||||
}
|
||||
} else if parentDir.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
js = base.Json{
|
||||
"kind": FOLDER,
|
||||
"name": dirName,
|
||||
"parent_id": parentDir.GetID(),
|
||||
"space": "SPACE_BROWSER_SAFE",
|
||||
}
|
||||
"space": parentDir.(*Files).GetSpace(),
|
||||
}
|
||||
|
||||
_, err := xc.Request(FILE_API_URL, http.MethodPost, func(r *resty.Request) {
|
||||
r.SetContext(ctx)
|
||||
r.SetBody(&js)
|
||||
@ -386,33 +366,14 @@ func (xc *XunLeiBrowserCommon) MakeDir(ctx context.Context, parentDir model.Obj,
|
||||
|
||||
func (xc *XunLeiBrowserCommon) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
|
||||
|
||||
srcSpace := "SPACE_BROWSER"
|
||||
dstSpace := "SPACE_BROWSER"
|
||||
|
||||
// 对 "超级保险箱" 内的文件 特殊处理
|
||||
if srcObj.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
srcSpace = "SPACE_BROWSER_SAFE"
|
||||
}
|
||||
if dstDir.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
dstSpace = "SPACE_BROWSER_SAFE"
|
||||
}
|
||||
|
||||
params := map[string]string{
|
||||
"_from": dstSpace,
|
||||
"_from": srcObj.(*Files).GetSpace(),
|
||||
}
|
||||
js := base.Json{
|
||||
"to": base.Json{"parent_id": dstDir.GetID(), "space": dstSpace},
|
||||
"space": srcSpace,
|
||||
"to": base.Json{"parent_id": dstDir.GetID(), "space": dstDir.(*Files).GetSpace()},
|
||||
"space": srcObj.(*Files).GetSpace(),
|
||||
"ids": []string{srcObj.GetID()},
|
||||
}
|
||||
// 对 "迅雷云盘" 内的文件 特殊处理
|
||||
if srcObj.GetPath() == ThunderDriveFileID {
|
||||
params = map[string]string{}
|
||||
js = base.Json{
|
||||
"to": base.Json{"parent_id": dstDir.GetID()},
|
||||
"ids": []string{srcObj.GetID()},
|
||||
}
|
||||
}
|
||||
|
||||
_, err := xc.Request(FILE_API_URL+":batchMove", http.MethodPost, func(r *resty.Request) {
|
||||
r.SetContext(ctx)
|
||||
@ -425,16 +386,7 @@ func (xc *XunLeiBrowserCommon) Move(ctx context.Context, srcObj, dstDir model.Ob
|
||||
func (xc *XunLeiBrowserCommon) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
|
||||
|
||||
params := map[string]string{
|
||||
"space": "SPACE_BROWSER",
|
||||
}
|
||||
// 对 "迅雷云盘" 内的文件 特殊处理
|
||||
if srcObj.GetPath() == ThunderDriveFileID {
|
||||
params = map[string]string{}
|
||||
} else if srcObj.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
// 对 "超级保险箱" 内的文件 特殊处理
|
||||
params = map[string]string{
|
||||
"space": "SPACE_BROWSER_SAFE",
|
||||
}
|
||||
"space": srcObj.(*Files).GetSpace(),
|
||||
}
|
||||
|
||||
_, err := xc.Request(FILE_API_URL+"/{fileID}", http.MethodPatch, func(r *resty.Request) {
|
||||
@ -448,33 +400,14 @@ func (xc *XunLeiBrowserCommon) Rename(ctx context.Context, srcObj model.Obj, new
|
||||
|
||||
func (xc *XunLeiBrowserCommon) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
|
||||
|
||||
srcSpace := "SPACE_BROWSER"
|
||||
dstSpace := "SPACE_BROWSER"
|
||||
|
||||
// 对 "超级保险箱" 内的文件 特殊处理
|
||||
if srcObj.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
srcSpace = "SPACE_BROWSER_SAFE"
|
||||
}
|
||||
if dstDir.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
dstSpace = "SPACE_BROWSER_SAFE"
|
||||
}
|
||||
|
||||
params := map[string]string{
|
||||
"_from": dstSpace,
|
||||
"_from": srcObj.(*Files).GetSpace(),
|
||||
}
|
||||
js := base.Json{
|
||||
"to": base.Json{"parent_id": dstDir.GetID(), "space": dstSpace},
|
||||
"space": srcSpace,
|
||||
"to": base.Json{"parent_id": dstDir.GetID(), "space": dstDir.(*Files).GetSpace()},
|
||||
"space": srcObj.(*Files).GetSpace(),
|
||||
"ids": []string{srcObj.GetID()},
|
||||
}
|
||||
// 对 "迅雷云盘" 内的文件 特殊处理
|
||||
if srcObj.GetPath() == ThunderDriveFileID {
|
||||
params = map[string]string{}
|
||||
js = base.Json{
|
||||
"to": base.Json{"parent_id": dstDir.GetID()},
|
||||
"ids": []string{srcObj.GetID()},
|
||||
}
|
||||
}
|
||||
|
||||
_, err := xc.Request(FILE_API_URL+":batchCopy", http.MethodPost, func(r *resty.Request) {
|
||||
r.SetContext(ctx)
|
||||
@ -488,30 +421,17 @@ func (xc *XunLeiBrowserCommon) Remove(ctx context.Context, obj model.Obj) error
|
||||
|
||||
js := base.Json{
|
||||
"ids": []string{obj.GetID()},
|
||||
"space": "SPACE_BROWSER",
|
||||
"space": obj.(*Files).GetSpace(),
|
||||
}
|
||||
// 对 "迅雷云盘" 内的文件 特殊处理
|
||||
if obj.GetPath() == ThunderDriveFileID {
|
||||
js = base.Json{
|
||||
"ids": []string{obj.GetID()},
|
||||
}
|
||||
} else if obj.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
// 对 "超级保险箱" 内的文件 特殊处理
|
||||
js = base.Json{
|
||||
"ids": []string{obj.GetID()},
|
||||
"space": "SPACE_BROWSER_SAFE",
|
||||
}
|
||||
}
|
||||
|
||||
// 先判断是否是特殊情况
|
||||
if obj.GetPath() == ThunderDriveFileID {
|
||||
if obj.(*Files).GetSpace() == ThunderDriveSpace {
|
||||
_, err := xc.Request(FILE_API_URL+"/{fileID}/trash", http.MethodPatch, func(r *resty.Request) {
|
||||
r.SetContext(ctx)
|
||||
r.SetPathParam("fileID", obj.GetID())
|
||||
r.SetBody("{}")
|
||||
}, nil)
|
||||
return err
|
||||
} else if obj.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
} else if obj.(*Files).GetSpace() == ThunderBrowserDriveSafeSpace || obj.(*Files).GetSpace() == ThunderDriveSafeSpace {
|
||||
_, err := xc.Request(FILE_API_URL+":batchDelete", http.MethodPost, func(r *resty.Request) {
|
||||
r.SetContext(ctx)
|
||||
r.SetBody(&js)
|
||||
@ -557,29 +477,7 @@ func (xc *XunLeiBrowserCommon) Put(ctx context.Context, dstDir model.Obj, stream
|
||||
"size": stream.GetSize(),
|
||||
"hash": gcid,
|
||||
"upload_type": UPLOAD_TYPE_RESUMABLE,
|
||||
"space": "SPACE_BROWSER",
|
||||
}
|
||||
// 对 "迅雷云盘" 内的文件 特殊处理
|
||||
if dstDir.GetPath() == ThunderDriveFileID {
|
||||
js = base.Json{
|
||||
"kind": FILE,
|
||||
"parent_id": dstDir.GetID(),
|
||||
"name": stream.GetName(),
|
||||
"size": stream.GetSize(),
|
||||
"hash": gcid,
|
||||
"upload_type": UPLOAD_TYPE_RESUMABLE,
|
||||
}
|
||||
} else if dstDir.GetPath() == ThunderBrowserDriveSafeFileID {
|
||||
// 对 "超级保险箱" 内的文件 特殊处理
|
||||
js = base.Json{
|
||||
"kind": FILE,
|
||||
"parent_id": dstDir.GetID(),
|
||||
"name": stream.GetName(),
|
||||
"size": stream.GetSize(),
|
||||
"hash": gcid,
|
||||
"upload_type": UPLOAD_TYPE_RESUMABLE,
|
||||
"space": "SPACE_BROWSER_SAFE",
|
||||
}
|
||||
"space": dstDir.(*Files).GetSpace(),
|
||||
}
|
||||
|
||||
var resp UploadTaskResponse
|
||||
@ -610,58 +508,35 @@ func (xc *XunLeiBrowserCommon) Put(ctx context.Context, dstDir model.Obj, stream
|
||||
Bucket: aws.String(param.Bucket),
|
||||
Key: aws.String(param.Key),
|
||||
Expires: aws.Time(param.Expiration),
|
||||
Body: stream,
|
||||
Body: io.TeeReader(stream, driver.NewProgress(stream.GetSize(), up)),
|
||||
})
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (xc *XunLeiBrowserCommon) getFiles(ctx context.Context, folderId string, path string) ([]model.Obj, error) {
|
||||
func (xc *XunLeiBrowserCommon) getFiles(ctx context.Context, dir model.Obj, path string) ([]model.Obj, error) {
|
||||
files := make([]model.Obj, 0)
|
||||
var pageToken string
|
||||
for {
|
||||
var fileList FileList
|
||||
folderSpace := "SPACE_BROWSER"
|
||||
folderSpace := ""
|
||||
switch dirF := dir.(type) {
|
||||
case *Files:
|
||||
folderSpace = dirF.GetSpace()
|
||||
default:
|
||||
// 处理 根目录的情况
|
||||
folderSpace = ThunderBrowserDriveSpace
|
||||
}
|
||||
params := map[string]string{
|
||||
"parent_id": folderId,
|
||||
"parent_id": dir.GetID(),
|
||||
"page_token": pageToken,
|
||||
"space": folderSpace,
|
||||
"filters": `{"trashed":{"eq":false}}`,
|
||||
"with": "url",
|
||||
"with_audit": "true",
|
||||
"thumbnail_size": "SIZE_LARGE",
|
||||
}
|
||||
var fileType int8
|
||||
// 处理特殊目录 “迅雷云盘” 设置特殊的 params 以便正常访问
|
||||
pattern1 := fmt.Sprintf(`^/.*/%s(/.*)?$`, ThunderDriveFolderName)
|
||||
thunderDriveMatch, _ := regexp.MatchString(pattern1, path)
|
||||
// 处理特殊目录 “超级保险箱” 设置特殊的 params 以便正常访问
|
||||
pattern2 := fmt.Sprintf(`^/.*/%s(/.*)?$`, ThunderBrowserDriveSafeFolderName)
|
||||
thunderBrowserDriveSafeMatch, _ := regexp.MatchString(pattern2, path)
|
||||
|
||||
// 如果是 "迅雷云盘" 内的
|
||||
if folderId == ThunderDriveFileID || thunderDriveMatch {
|
||||
params = map[string]string{
|
||||
"space": "",
|
||||
"__type": "drive",
|
||||
"refresh": "true",
|
||||
"__sync": "true",
|
||||
"parent_id": folderId,
|
||||
"page_token": pageToken,
|
||||
"with_audit": "true",
|
||||
"limit": "100",
|
||||
"filters": `{"phase":{"eq":"PHASE_TYPE_COMPLETE"},"trashed":{"eq":false}}`,
|
||||
}
|
||||
// 如果不是 "迅雷云盘"的"根目录"
|
||||
if folderId == ThunderDriveFileID {
|
||||
params["parent_id"] = ""
|
||||
}
|
||||
fileType = ThunderDriveType
|
||||
} else if thunderBrowserDriveSafeMatch {
|
||||
// 如果是 "超级保险箱" 内的
|
||||
fileType = ThunderBrowserDriveSafeType
|
||||
params["space"] = "SPACE_BROWSER_SAFE"
|
||||
}
|
||||
|
||||
_, err := xc.Request(FILE_API_URL, http.MethodGet, func(r *resty.Request) {
|
||||
r.SetContext(ctx)
|
||||
@ -670,24 +545,13 @@ func (xc *XunLeiBrowserCommon) getFiles(ctx context.Context, folderId string, pa
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 对文件夹也进行处理
|
||||
fileList.FolderType = fileType
|
||||
|
||||
for i := 0; i < len(fileList.Files); i++ {
|
||||
file := &fileList.Files[i]
|
||||
// 标记 文件夹内的文件
|
||||
file.FileType = fileList.FolderType
|
||||
for i := range fileList.Files {
|
||||
// 解决 "迅雷云盘" 重复出现问题————迅雷后端发送错误
|
||||
if file.Name == ThunderDriveFolderName && file.ID == "" && file.FolderType == ThunderDriveFolderType && folderId != "" {
|
||||
if fileList.Files[i].FolderType == ThunderDriveFolderType && fileList.Files[i].ID == "" && fileList.Files[i].Space == "" && dir.GetID() != "" {
|
||||
continue
|
||||
}
|
||||
// 处理特殊目录 “迅雷云盘” 设置特殊的文件夹ID
|
||||
if file.Name == ThunderDriveFolderName && file.ID == "" && file.FolderType == ThunderDriveFolderType {
|
||||
file.ID = ThunderDriveFileID
|
||||
} else if file.Name == ThunderBrowserDriveSafeFolderName && file.FolderType == ThunderBrowserDriveSafeFolderType {
|
||||
file.FileType = ThunderBrowserDriveSafeType
|
||||
}
|
||||
files = append(files, file)
|
||||
files = append(files, &fileList.Files[i])
|
||||
}
|
||||
|
||||
if fileList.NextPageToken == "" {
|
||||
|
Reference in New Issue
Block a user