feat(baidu_netdisk): support dynamical slice size for low bandwith upload case (#7965)
* 动态分片尺寸 * 补充严格测试结果
This commit is contained in:
parent
4145734c18
commit
2570707a06
@ -189,7 +189,7 @@ func (d *BaiduNetdisk) Put(ctx context.Context, dstDir model.Obj, stream model.F
|
|||||||
}
|
}
|
||||||
|
|
||||||
streamSize := stream.GetSize()
|
streamSize := stream.GetSize()
|
||||||
sliceSize := d.getSliceSize()
|
sliceSize := d.getSliceSize(streamSize)
|
||||||
count := int(math.Max(math.Ceil(float64(streamSize)/float64(sliceSize)), 1))
|
count := int(math.Max(math.Ceil(float64(streamSize)/float64(sliceSize)), 1))
|
||||||
lastBlockSize := streamSize % sliceSize
|
lastBlockSize := streamSize % sliceSize
|
||||||
if streamSize > 0 && lastBlockSize == 0 {
|
if streamSize > 0 && lastBlockSize == 0 {
|
||||||
@ -197,7 +197,7 @@ func (d *BaiduNetdisk) Put(ctx context.Context, dstDir model.Obj, stream model.F
|
|||||||
}
|
}
|
||||||
|
|
||||||
//cal md5 for first 256k data
|
//cal md5 for first 256k data
|
||||||
const SliceSize int64 = 256 * 1024
|
const SliceSize int64 = 256 * utils.KB
|
||||||
// cal md5
|
// cal md5
|
||||||
blockList := make([]string, 0, count)
|
blockList := make([]string, 0, count)
|
||||||
byteSize := sliceSize
|
byteSize := sliceSize
|
||||||
|
@ -8,16 +8,17 @@ import (
|
|||||||
type Addition struct {
|
type Addition struct {
|
||||||
RefreshToken string `json:"refresh_token" required:"true"`
|
RefreshToken string `json:"refresh_token" required:"true"`
|
||||||
driver.RootPath
|
driver.RootPath
|
||||||
OrderBy string `json:"order_by" type:"select" options:"name,time,size" default:"name"`
|
OrderBy string `json:"order_by" type:"select" options:"name,time,size" default:"name"`
|
||||||
OrderDirection string `json:"order_direction" type:"select" options:"asc,desc" default:"asc"`
|
OrderDirection string `json:"order_direction" type:"select" options:"asc,desc" default:"asc"`
|
||||||
DownloadAPI string `json:"download_api" type:"select" options:"official,crack" default:"official"`
|
DownloadAPI string `json:"download_api" type:"select" options:"official,crack" default:"official"`
|
||||||
ClientID string `json:"client_id" required:"true" default:"iYCeC9g08h5vuP9UqvPHKKSVrKFXGa1v"`
|
ClientID string `json:"client_id" required:"true" default:"iYCeC9g08h5vuP9UqvPHKKSVrKFXGa1v"`
|
||||||
ClientSecret string `json:"client_secret" required:"true" default:"jXiFMOPVPCWlO2M5CwWQzffpNPaGTRBG"`
|
ClientSecret string `json:"client_secret" required:"true" default:"jXiFMOPVPCWlO2M5CwWQzffpNPaGTRBG"`
|
||||||
CustomCrackUA string `json:"custom_crack_ua" required:"true" default:"netdisk"`
|
CustomCrackUA string `json:"custom_crack_ua" required:"true" default:"netdisk"`
|
||||||
AccessToken string
|
AccessToken string
|
||||||
UploadThread string `json:"upload_thread" default:"3" help:"1<=thread<=32"`
|
UploadThread string `json:"upload_thread" default:"3" help:"1<=thread<=32"`
|
||||||
UploadAPI string `json:"upload_api" default:"https://d.pcs.baidu.com"`
|
UploadAPI string `json:"upload_api" default:"https://d.pcs.baidu.com"`
|
||||||
CustomUploadPartSize int64 `json:"custom_upload_part_size" type:"number" default:"0" help:"0 for auto"`
|
CustomUploadPartSize int64 `json:"custom_upload_part_size" type:"number" default:"0" help:"0 for auto"`
|
||||||
|
LowBandwithUploadMode bool `json:"low_bandwith_upload_mode" default:"false"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var config = driver.Config{
|
var config = driver.Config{
|
||||||
|
@ -136,7 +136,7 @@ func (d *BaiduNetdisk) getFiles(dir string) ([]File, error) {
|
|||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *BaiduNetdisk) linkOfficial(file model.Obj, args model.LinkArgs) (*model.Link, error) {
|
func (d *BaiduNetdisk) linkOfficial(file model.Obj, _ model.LinkArgs) (*model.Link, error) {
|
||||||
var resp DownloadResp
|
var resp DownloadResp
|
||||||
params := map[string]string{
|
params := map[string]string{
|
||||||
"method": "filemetas",
|
"method": "filemetas",
|
||||||
@ -164,7 +164,7 @@ func (d *BaiduNetdisk) linkOfficial(file model.Obj, args model.LinkArgs) (*model
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *BaiduNetdisk) linkCrack(file model.Obj, args model.LinkArgs) (*model.Link, error) {
|
func (d *BaiduNetdisk) linkCrack(file model.Obj, _ model.LinkArgs) (*model.Link, error) {
|
||||||
var resp DownloadResp2
|
var resp DownloadResp2
|
||||||
param := map[string]string{
|
param := map[string]string{
|
||||||
"target": fmt.Sprintf("[\"%s\"]", file.GetPath()),
|
"target": fmt.Sprintf("[\"%s\"]", file.GetPath()),
|
||||||
@ -230,22 +230,72 @@ func joinTime(form map[string]string, ctime, mtime int64) {
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
DefaultSliceSize int64 = 4 * utils.MB
|
DefaultSliceSize int64 = 4 * utils.MB
|
||||||
VipSliceSize = 16 * utils.MB
|
VipSliceSize int64 = 16 * utils.MB
|
||||||
SVipSliceSize = 32 * utils.MB
|
SVipSliceSize int64 = 32 * utils.MB
|
||||||
|
|
||||||
|
MaxSliceNum = 2048 // 文档写的是 1024/没写 ,但实际测试是 2048
|
||||||
|
SliceStep int64 = 1 * utils.MB
|
||||||
)
|
)
|
||||||
|
|
||||||
func (d *BaiduNetdisk) getSliceSize() int64 {
|
func (d *BaiduNetdisk) getSliceSize(filesize int64) int64 {
|
||||||
if d.CustomUploadPartSize != 0 {
|
// 非会员固定为 4MB
|
||||||
return d.CustomUploadPartSize
|
if d.vipType == 0 {
|
||||||
}
|
if d.CustomUploadPartSize != 0 {
|
||||||
switch d.vipType {
|
log.Warnf("CustomUploadPartSize is not supported for non-vip user, use DefaultSliceSize")
|
||||||
case 1:
|
}
|
||||||
return VipSliceSize
|
if filesize > MaxSliceNum*DefaultSliceSize {
|
||||||
case 2:
|
log.Warnf("File size(%d) is too large, may cause upload failure", filesize)
|
||||||
return SVipSliceSize
|
}
|
||||||
default:
|
|
||||||
return DefaultSliceSize
|
return DefaultSliceSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if d.CustomUploadPartSize != 0 {
|
||||||
|
if d.CustomUploadPartSize < DefaultSliceSize {
|
||||||
|
log.Warnf("CustomUploadPartSize(%d) is less than DefaultSliceSize(%d), use DefaultSliceSize", d.CustomUploadPartSize, DefaultSliceSize)
|
||||||
|
return DefaultSliceSize
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.vipType == 1 && d.CustomUploadPartSize > VipSliceSize {
|
||||||
|
log.Warnf("CustomUploadPartSize(%d) is greater than VipSliceSize(%d), use VipSliceSize", d.CustomUploadPartSize, VipSliceSize)
|
||||||
|
return VipSliceSize
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.vipType == 2 && d.CustomUploadPartSize > SVipSliceSize {
|
||||||
|
log.Warnf("CustomUploadPartSize(%d) is greater than SVipSliceSize(%d), use SVipSliceSize", d.CustomUploadPartSize, SVipSliceSize)
|
||||||
|
return SVipSliceSize
|
||||||
|
}
|
||||||
|
|
||||||
|
return d.CustomUploadPartSize
|
||||||
|
}
|
||||||
|
|
||||||
|
maxSliceSize := DefaultSliceSize
|
||||||
|
|
||||||
|
switch d.vipType {
|
||||||
|
case 1:
|
||||||
|
maxSliceSize = VipSliceSize
|
||||||
|
case 2:
|
||||||
|
maxSliceSize = SVipSliceSize
|
||||||
|
}
|
||||||
|
|
||||||
|
// upload on low bandwidth
|
||||||
|
if d.LowBandwithUploadMode {
|
||||||
|
size := DefaultSliceSize
|
||||||
|
|
||||||
|
for size <= maxSliceSize {
|
||||||
|
if filesize <= MaxSliceNum*size {
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
size += SliceStep
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if filesize > MaxSliceNum*maxSliceSize {
|
||||||
|
log.Warnf("File size(%d) is too large, may cause upload failure", filesize)
|
||||||
|
}
|
||||||
|
|
||||||
|
return maxSliceSize
|
||||||
}
|
}
|
||||||
|
|
||||||
// func encodeURIComponent(str string) string {
|
// func encodeURIComponent(str string) string {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user