Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add chaoxing and vtencent #5526

Merged
merged 7 commits into from
Nov 23, 2023
Merged

add chaoxing and vtencent #5526

merged 7 commits into from
Nov 23, 2023

Conversation

msterzhang
Copy link
Contributor

Copy link

welcome bot commented Nov 16, 2023

Thanks for opening this pull request! Please check out our contributing guidelines.

"content-type": "application/json",
"origin": d.conf.origin,
"referer": d.conf.referer,
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
})
}).ForceContentType("application/json")

响应头ContentType有问题,所以后面json不解析。可以加上这个解决

}
var resps RspFiles
rsp, err := d.request(api, http.MethodPost, func(req *resty.Request) {
req.SetBody(dat)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
req.SetBody(dat)
req.SetBody(form)

设置"content-type": "application/json"头后,可以直接发json字符串。

}
secretKey := "M6BrOqmpW9rl+jZuFoAOwNawGdWCaKllffpDb53za4I="
SummaryKey := QTwoSignatureKey(uuid.New().String(), secretKey)
rspCreatrMaterial, err := d.CreateUploadMaterial(classId, stream.GetName(), SummaryKey)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

抓包看第三个参数好像是文件sha1,用于判断秒传?

Comment on lines 368 to 379
uploadId, err := d.GetUploadId(rspUGC)
if err != nil {
return err
}
Etag, err := d.PutFile(uploadId, rspUGC, stream)
if err != nil {
return err
}
err = d.CompleteMultipartUpload(uploadId, Etag, rspUGC, stream)
if err != nil {
return err
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

腾讯cos可以用s3上传,代码大致是这样.少写代码😏

        params := rspUGC.Data
	certificate := params.TempCertificate
	cfg := &aws.Config{
		HTTPClient: base.HttpClient,
		// S3ForcePathStyle: aws.Bool(true),
		Credentials: credentials.NewStaticCredentials(certificate.SecretID, certificate.SecretKey, certificate.Token),
		Region:      aws.String(params.StorageRegionV5),
		Endpoint:    aws.String(fmt.Sprintf("cos.%s.myqcloud.com", params.StorageRegionV5)),
	}
	ss, err := session.NewSession(cfg)
	if err != nil {
		return nil, err
	}
	uploader := s3manager.NewUploader(ss)
	input := &s3manager.UploadInput{
		Bucket: aws.String(fmt.Sprintf("%s-%d", params.StorageBucket, params.StorageAppID)),
		Key:    &params.Video.StoragePath,
		Body:   stream,
	}
	out, err := uploader.UploadWithContext(ctx, input)
	if err != nil {
		return nil, err
	}
	Etag := strings.Trim(*out.ETag, "\"")

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

改了试了下,报InvalidArgument错误

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

没问题啊,你是不是把Etag传CompleteMultipartUpload里面去了.
我贴的代码把368-379替换了改一改就可用直接跑成功的啊

FinishUploadMaterial 的 SummaryKey 是文件sha1 在上面rspCreatrMaterial.Data.QuickUpload为true时使用的,用于秒传跳过ApplyUploadUGC到CommitUploadUGC这些方法

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已测试跑完没问题,不需要CompleteMultipartUpload,但是有个问题UploadSummaryKey并不是sha1,这个东西会变变,你可以同一个文件多传几次看看 ,暂时不知道生成规则

Copy link
Contributor

@foxxorcat foxxorcat Nov 19, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

捕获
没问题就是sha1

不过大于10MIB的文件UploadSummaryKey只计算前10485760字节

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok 已经测试成功!秒传没问题了

@xhofe xhofe added this to the v3.29.0 milestone Nov 18, 2023
Comment on lines 115 to 123
var resps RspFiles
rsp, err := d.request(api, http.MethodPost, func(req *resty.Request) {
req.SetBody(form).ForceContentType("application/json")
}, &resps)
if err != nil {
}
if err := json.Unmarshal(rsp, &resps); err != nil {
return []File{}, err
}
Copy link
Contributor

@foxxorcat foxxorcat Nov 19, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

> 响应头ContentType有问题,所以后面json不解析。可以加上这个解决

这里你理解错了,我的意识是可用把代码改成这样,不需要额外json.Unmarshal. 只需要传入request就行

Suggested change
var resps RspFiles
rsp, err := d.request(api, http.MethodPost, func(req *resty.Request) {
req.SetBody(form).ForceContentType("application/json")
}, &resps)
if err != nil {
}
if err := json.Unmarshal(rsp, &resps); err != nil {
return []File{}, err
}
var resps RspFiles
rsp, err := d.request(api, http.MethodPost, func(req *resty.Request) {
req.SetBody(form)
}, &resps)
if err != nil {
return []File{}, err
}

Comment on lines 232 to 303
func (d *Vtencent) FileUpload(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
classId, err := strconv.Atoi(dstDir.GetID())
if err != nil {
return err
}
tmpF, err := stream.CacheFullInTempFile()
if err != nil {
return err
}
SummaryKey, err := utils.HashFile(utils.SHA1, tmpF)
if err != nil {
return err
}
chunkHash := SummaryKey
var chunkLength int64 = 1024 * 1024 * 10
if stream.GetSize() > chunkLength {
buf := bytes.NewBuffer(make([]byte, 0, chunkLength))
io.CopyN(buf, tmpF, chunkLength)
chunkHash = utils.HashData(utils.SHA1, buf.Bytes())
}
rspCreatrMaterial, err := d.CreateUploadMaterial(classId, stream.GetName(), chunkHash)
if err != nil {
return err
}
if rspCreatrMaterial.Data.QuickUpload {
UploadContext := rspCreatrMaterial.Data.UploadContext
_, err = d.FinishHashUploadMaterial(SummaryKey, UploadContext)
if err != nil {
return err
}
return nil
}
rspUGC, err := d.ApplyUploadUGC(rspCreatrMaterial.Data.VodUploadSign, stream)
if err != nil {
return err
}
params := rspUGC.Data
certificate := params.TempCertificate
cfg := &aws.Config{
HTTPClient: base.HttpClient,
// S3ForcePathStyle: aws.Bool(true),
Credentials: credentials.NewStaticCredentials(certificate.SecretID, certificate.SecretKey, certificate.Token),
Region: aws.String(params.StorageRegionV5),
Endpoint: aws.String(fmt.Sprintf("cos.%s.myqcloud.com", params.StorageRegionV5)),
}
ss, err := session.NewSession(cfg)
if err != nil {
return err
}
uploader := s3manager.NewUploader(ss)
input := &s3manager.UploadInput{
Bucket: aws.String(fmt.Sprintf("%s-%d", params.StorageBucket, params.StorageAppID)),
Key: &params.Video.StoragePath,
Body: stream,
}
_, err = uploader.UploadWithContext(ctx, input)
if err != nil {
return err
}
rspCommitUGC, err := d.CommitUploadUGC(rspCreatrMaterial.Data.VodUploadSign, rspUGC.Data.VodSessionKey)
if err != nil {
return err
}
VodVerifyKey := rspCommitUGC.Data.Video.VerifyContent
VodFileId := rspCommitUGC.Data.FileID
UploadContext := rspCreatrMaterial.Data.UploadContext
_, err = d.FinishUploadMaterial(SummaryKey, VodVerifyKey, UploadContext, VodFileId)
if err != nil {
return err
}
return nil
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
func (d *Vtencent) FileUpload(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
classId, err := strconv.Atoi(dstDir.GetID())
if err != nil {
return err
}
tmpF, err := stream.CacheFullInTempFile()
if err != nil {
return err
}
SummaryKey, err := utils.HashFile(utils.SHA1, tmpF)
if err != nil {
return err
}
chunkHash := SummaryKey
var chunkLength int64 = 1024 * 1024 * 10
if stream.GetSize() > chunkLength {
buf := bytes.NewBuffer(make([]byte, 0, chunkLength))
io.CopyN(buf, tmpF, chunkLength)
chunkHash = utils.HashData(utils.SHA1, buf.Bytes())
}
rspCreatrMaterial, err := d.CreateUploadMaterial(classId, stream.GetName(), chunkHash)
if err != nil {
return err
}
if rspCreatrMaterial.Data.QuickUpload {
UploadContext := rspCreatrMaterial.Data.UploadContext
_, err = d.FinishHashUploadMaterial(SummaryKey, UploadContext)
if err != nil {
return err
}
return nil
}
rspUGC, err := d.ApplyUploadUGC(rspCreatrMaterial.Data.VodUploadSign, stream)
if err != nil {
return err
}
params := rspUGC.Data
certificate := params.TempCertificate
cfg := &aws.Config{
HTTPClient: base.HttpClient,
// S3ForcePathStyle: aws.Bool(true),
Credentials: credentials.NewStaticCredentials(certificate.SecretID, certificate.SecretKey, certificate.Token),
Region: aws.String(params.StorageRegionV5),
Endpoint: aws.String(fmt.Sprintf("cos.%s.myqcloud.com", params.StorageRegionV5)),
}
ss, err := session.NewSession(cfg)
if err != nil {
return err
}
uploader := s3manager.NewUploader(ss)
input := &s3manager.UploadInput{
Bucket: aws.String(fmt.Sprintf("%s-%d", params.StorageBucket, params.StorageAppID)),
Key: &params.Video.StoragePath,
Body: stream,
}
_, err = uploader.UploadWithContext(ctx, input)
if err != nil {
return err
}
rspCommitUGC, err := d.CommitUploadUGC(rspCreatrMaterial.Data.VodUploadSign, rspUGC.Data.VodSessionKey)
if err != nil {
return err
}
VodVerifyKey := rspCommitUGC.Data.Video.VerifyContent
VodFileId := rspCommitUGC.Data.FileID
UploadContext := rspCreatrMaterial.Data.UploadContext
_, err = d.FinishUploadMaterial(SummaryKey, VodVerifyKey, UploadContext, VodFileId)
if err != nil {
return err
}
return nil
}
func (d *Vtencent) FileUpload(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
classId, err := strconv.Atoi(dstDir.GetID())
if err != nil {
return err
}
const chunkLength int64 = 1024 * 1024 * 10
reader, err := stream.RangeRead(http_range.Range{Start: 0, Length: chunkLength})
if err != nil {
return err
}
chunkHash, err := utils.HashReader(utils.SHA1, reader)
if err != nil {
return err
}
rspCreatrMaterial, err := d.CreateUploadMaterial(classId, stream.GetName(), chunkHash)
if err != nil {
return err
}
if rspCreatrMaterial.Data.QuickUpload {
SummaryKey := stream.GetHash().GetHash(utils.SHA1)
if len(SummaryKey) < utils.SHA1.Width {
if SummaryKey, err = utils.HashReader(utils.SHA1, stream); err != nil {
return err
}
}
UploadContext := rspCreatrMaterial.Data.UploadContext
_, err = d.FinishHashUploadMaterial(SummaryKey, UploadContext)
if err != nil {
return err
}
return nil
}
hash := sha1.New()
rspUGC, err := d.ApplyUploadUGC(rspCreatrMaterial.Data.VodUploadSign, stream)
if err != nil {
return err
}
params := rspUGC.Data
certificate := params.TempCertificate
cfg := &aws.Config{
HTTPClient: base.HttpClient,
// S3ForcePathStyle: aws.Bool(true),
Credentials: credentials.NewStaticCredentials(certificate.SecretID, certificate.SecretKey, certificate.Token),
Region: aws.String(params.StorageRegionV5),
Endpoint: aws.String(fmt.Sprintf("cos.%s.myqcloud.com", params.StorageRegionV5)),
}
ss, err := session.NewSession(cfg)
if err != nil {
return err
}
uploader := s3manager.NewUploader(ss)
input := &s3manager.UploadInput{
Bucket: aws.String(fmt.Sprintf("%s-%d", params.StorageBucket, params.StorageAppID)),
Key: &params.Video.StoragePath,
Body: io.TeeReader(stream, io.MultiWriter(hash, driver.NewProgress(stream.GetSize(), up))),
}
_, err = uploader.UploadWithContext(ctx, input)
if err != nil {
return err
}
rspCommitUGC, err := d.CommitUploadUGC(rspCreatrMaterial.Data.VodUploadSign, rspUGC.Data.VodSessionKey)
if err != nil {
return err
}
VodVerifyKey := rspCommitUGC.Data.Video.VerifyContent
VodFileId := rspCommitUGC.Data.FileID
UploadContext := rspCreatrMaterial.Data.UploadContext
SummaryKey := hex.EncodeToString(hash.Sum(nil))
_, err = d.FinishUploadMaterial(SummaryKey, VodVerifyKey, UploadContext, VodFileId)
if err != nil {
return err
}
return nil
}

可以改成这样优化一下大文件的上传

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK 之前对stream.RangeRead不太了解,我优化下这部分代码

@anwen-anyi
Copy link
Contributor

腾讯智能创作平台和腾讯Cos可以互传吗?
还是说可以和所有 sha1 存储互相存储

@msterzhang
Copy link
Contributor Author

腾讯智能创作平台和腾讯Cos可以互传吗? 还是说可以和所有 sha1 存储互相存储

理论上这个秒传功能是针对单个客户的储存桶的

@xhofe xhofe merged commit 1280070 into AlistGo:main Nov 23, 2023
1 check passed
Copy link

welcome bot commented Nov 23, 2023

Congrats on merging your first pull request! We here at behavior bot are proud of you!

truecharts-admin referenced this pull request in truecharts/public Nov 25, 2023
…15347)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [xhofe/alist](https://togithub.com/alist-org/alist) | minor |
`v3.28.0` -> `v3.29.1` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>alist-org/alist (xhofe/alist)</summary>

###
[`v3.29.1`](https://togithub.com/alist-org/alist/releases/tag/v3.29.1)

[Compare
Source](https://togithub.com/alist-org/alist/compare/v3.29.0...v3.29.1)

#####    🐞 Bug Fixes

- Task popped but not execute  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5565](https://togithub.com/alist-org/alist/issues/5565)
[<samp>(68af2)</samp>](https://togithub.com/alist-org/alist/commit/68af284)

#####     [View changes on
GitHub](https://togithub.com/alist-org/alist/compare/v3.29.0...v3.29.1)

###
[`v3.29.0`](https://togithub.com/alist-org/alist/releases/tag/v3.29.0)

[Compare
Source](https://togithub.com/alist-org/alist/compare/v3.28.0...v3.29.0)

#####    🚀 Features

- Add `header` to `meta`  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5317](https://togithub.com/alist-org/alist/issues/5317)
[<samp>(9ff83)</samp>](https://togithub.com/alist-org/alist/commit/9ff83a7)
- Add ignore direct link params  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5434](https://togithub.com/alist-org/alist/issues/5434)
[<samp>(c0f9c)</samp>](https://togithub.com/alist-org/alist/commit/c0f9c8e)
- Refactor offline download
([#&#8203;5408](https://togithub.com/alist-org/alist/issues/5408) close
[#&#8203;4108](https://togithub.com/alist-org/alist/issues/4108))  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) and
[@&#8203;renovate](https://togithub.com/renovate)\[bot]
in[https://github.com/alist-org/alist/issues/5408](https://togithub.com/alist-org/alist/issues/5408)8
and[https://github.com/alist-org/alist/issues/4108](https://togithub.com/alist-org/alist/issues/4108)8
[<samp>(76928)</samp>](https://togithub.com/alist-org/alist/commit/769281b)
- Add `115_share` driver
([#&#8203;5481](https://togithub.com/alist-org/alist/issues/5481) close
[#&#8203;5384](https://togithub.com/alist-org/alist/issues/5384))  -  by
[@&#8203;SheltonZhu](https://togithub.com/SheltonZhu) in
[https://github.com/alist-org/alist/issues/5481](https://togithub.com/alist-org/alist/issues/5481)
and
[https://github.com/alist-org/alist/issues/5384](https://togithub.com/alist-org/alist/issues/5384)
[<samp>(da1c7)</samp>](https://togithub.com/alist-org/alist/commit/da1c7a4)
- Invalidate old token after changing the password  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5515](https://togithub.com/alist-org/alist/issues/5515)
[<samp>(3d518)</samp>](https://togithub.com/alist-org/alist/commit/3d51845)
- Support using external dist files  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5531](https://togithub.com/alist-org/alist/issues/5531)
[<samp>(6fc67)</samp>](https://togithub.com/alist-org/alist/commit/6fc6751)
- Refactor task module  -  by
[@&#8203;xhofe](https://togithub.com/xhofe)
[<samp>(11a30)</samp>](https://togithub.com/alist-org/alist/commit/11a30c5)
- Customize workers and retry of task (close
[#&#8203;5493](https://togithub.com/alist-org/alist/issues/5493) fix
[#&#8203;5274](https://togithub.com/alist-org/alist/issues/5274))  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5493](https://togithub.com/alist-org/alist/issues/5493)
and
[https://github.com/alist-org/alist/issues/5274](https://togithub.com/alist-org/alist/issues/5274)
[<samp>(7583c)</samp>](https://togithub.com/alist-org/alist/commit/7583c4d)
- Retry all failed task  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5242](https://togithub.com/alist-org/alist/issues/5242)
[<samp>(b2890)</samp>](https://togithub.com/alist-org/alist/commit/b2890f0)
- Add chaoxing and vtencent driver
([#&#8203;5526](https://togithub.com/alist-org/alist/issues/5526) close
[#&#8203;3347](https://togithub.com/alist-org/alist/issues/3347))  -  by
[@&#8203;msterzhang](https://togithub.com/msterzhang) in
[https://github.com/alist-org/alist/issues/5526](https://togithub.com/alist-org/alist/issues/5526)
and
[https://github.com/alist-org/alist/issues/3347](https://togithub.com/alist-org/alist/issues/3347)
[<samp>(12800)</samp>](https://togithub.com/alist-org/alist/commit/1280070)
- Allow keep files in offline download  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/4678](https://togithub.com/alist-org/alist/issues/4678)
[<samp>(b6134)</samp>](https://togithub.com/alist-org/alist/commit/b6134dc)
- Customize allow `origins`, `headers` and `methods`  -  by
[@&#8203;xhofe](https://togithub.com/xhofe)
[<samp>(3f405)</samp>](https://togithub.com/alist-org/alist/commit/3f405de)
-   **cloudreve**:
- Support thumbnail
([#&#8203;5373](https://togithub.com/alist-org/alist/issues/5373) close
[#&#8203;5348](https://togithub.com/alist-org/alist/issues/5348))  -  by
[@&#8203;itsHenry35](https://togithub.com/itsHenry35) in
[https://github.com/alist-org/alist/issues/5373](https://togithub.com/alist-org/alist/issues/5373)
and
[https://github.com/alist-org/alist/issues/5348](https://togithub.com/alist-org/alist/issues/5348)
[<samp>(7f733)</samp>](https://togithub.com/alist-org/alist/commit/7f73354)
- Folder size count and switch
([#&#8203;5457](https://togithub.com/alist-org/alist/issues/5457) close
[#&#8203;5395](https://togithub.com/alist-org/alist/issues/5395))  -  by
[@&#8203;itsHenry35](https://togithub.com/itsHenry35) in
[https://github.com/alist-org/alist/issues/5457](https://togithub.com/alist-org/alist/issues/5457)
and
[https://github.com/alist-org/alist/issues/5395](https://togithub.com/alist-org/alist/issues/5395)
[<samp>(65c5e)</samp>](https://togithub.com/alist-org/alist/commit/65c5ec0)
-   **crypt**:
- Optional pre-generated thumbnails  -  by
[@&#8203;chaoqing](https://togithub.com/chaoqing) in
[https://github.com/alist-org/alist/issues/5284](https://togithub.com/alist-org/alist/issues/5284)
[<samp>(fb13d)</samp>](https://togithub.com/alist-org/alist/commit/fb13dae)
- Add show hidden option  -  by
[@&#8203;textrix](https://togithub.com/textrix) in
[https://github.com/alist-org/alist/issues/5554](https://togithub.com/alist-org/alist/issues/5554)
[<samp>(fe34d)</samp>](https://togithub.com/alist-org/alist/commit/fe34d30)
-   **google_drive**:
- Add `hash_info`, `ctime`, `thumbnail`  -  by
[@&#8203;foxxorcat](https://togithub.com/foxxorcat) in
[https://github.com/alist-org/alist/issues/5334](https://togithub.com/alist-org/alist/issues/5334)
[<samp>(1a283)</samp>](https://togithub.com/alist-org/alist/commit/1a283bb)
-   **offline_download**:
- Add simple http tool  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/4002](https://togithub.com/alist-org/alist/issues/4002)
[<samp>(34746)</samp>](https://togithub.com/alist-org/alist/commit/34746e9)
-   **onedrive**:
- Custom host for download link  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5310](https://togithub.com/alist-org/alist/issues/5310)
[<samp>(0fd51)</samp>](https://togithub.com/alist-org/alist/commit/0fd5164)
-   **sso**:
- Custom username key for `OIDC`  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5169](https://togithub.com/alist-org/alist/issues/5169)
[<samp>(e719a)</samp>](https://togithub.com/alist-org/alist/commit/e719a1a)
-   **webdav**:
- Add `tls_insecure_skip_verify` field  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5490](https://togithub.com/alist-org/alist/issues/5490)
[<samp>(91f51)</samp>](https://togithub.com/alist-org/alist/commit/91f51f1)

#####    🐞 Bug Fixes

- Hash gcid empty file  -  by
[@&#8203;foxxorcat](https://togithub.com/foxxorcat) in
[https://github.com/alist-org/alist/issues/5394](https://togithub.com/alist-org/alist/issues/5394)
[<samp>(cdfbe)</samp>](https://togithub.com/alist-org/alist/commit/cdfbe6d)
- Incorrect content-type of apk files  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5385](https://togithub.com/alist-org/alist/issues/5385)
[<samp>(4355d)</samp>](https://togithub.com/alist-org/alist/commit/4355dae)
- Reflected XSS vulnerability plist api  -  by
[@&#8203;xhofe](https://togithub.com/xhofe)
[<samp>(61006)</samp>](https://togithub.com/alist-org/alist/commit/6100647)
- `content-type` conflicts with
[#&#8203;5420](https://togithub.com/alist-org/alist/issues/5420)  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5420](https://togithub.com/alist-org/alist/issues/5420)
[<samp>(d2688)</samp>](https://togithub.com/alist-org/alist/commit/d26887d)
-   **115**:
- Allow use proxy directly  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5324](https://togithub.com/alist-org/alist/issues/5324)
[<samp>(e8958)</samp>](https://togithub.com/alist-org/alist/commit/e895801)
- Limit request rate
([#&#8203;5367](https://togithub.com/alist-org/alist/issues/5367) close
[#&#8203;5275](https://togithub.com/alist-org/alist/issues/5275))  -  by
[@&#8203;foxxorcat](https://togithub.com/foxxorcat) and
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5367](https://togithub.com/alist-org/alist/issues/5367)
and
[https://github.com/alist-org/alist/issues/5275](https://togithub.com/alist-org/alist/issues/5275)
[<samp>(b9e19)</samp>](https://togithub.com/alist-org/alist/commit/b9e192b)
- Fix driver package import and variable  -  by
[@&#8203;SheltonZhu](https://togithub.com/SheltonZhu) in
[https://github.com/alist-org/alist/issues/5482](https://togithub.com/alist-org/alist/issues/5482)
[<samp>(3bbdd)</samp>](https://togithub.com/alist-org/alist/commit/3bbdd4f)
-   **aliyundrive_open**:
- Change default api to raw server  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5358](https://togithub.com/alist-org/alist/issues/5358)
[<samp>(7600d)</samp>](https://togithub.com/alist-org/alist/commit/7600dc2)
- Upload progress for normal upload  -  by
[@&#8203;NewbieOrange](https://togithub.com/NewbieOrange) in
[https://github.com/alist-org/alist/issues/5398](https://togithub.com/alist-org/alist/issues/5398)
[<samp>(8ef80)</samp>](https://togithub.com/alist-org/alist/commit/8ef8023)
- Mitigation measures for 15-minute limit
([#&#8203;5560](https://togithub.com/alist-org/alist/issues/5560) close
[#&#8203;5547](https://togithub.com/alist-org/alist/issues/5547))  -  by
[@&#8203;BlueSkyXN](https://togithub.com/BlueSkyXN) and
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5560](https://togithub.com/alist-org/alist/issues/5560)
and
[https://github.com/alist-org/alist/issues/5547](https://togithub.com/alist-org/alist/issues/5547)
[<samp>(0fbb9)</samp>](https://togithub.com/alist-org/alist/commit/0fbb986)
-   **baidu_netdisk**:
- Hash and `error 2`  -  by
[@&#8203;foxxorcat](https://togithub.com/foxxorcat) in
[https://github.com/alist-org/alist/issues/5356](https://togithub.com/alist-org/alist/issues/5356)
[<samp>(8ef89)</samp>](https://togithub.com/alist-org/alist/commit/8ef89ad)
- Upload file > 4GB  -  by [@&#8203;xhofe](https://togithub.com/xhofe)
in
[https://github.com/alist-org/alist/issues/5392](https://togithub.com/alist-org/alist/issues/5392)
[<samp>(4fc0a)</samp>](https://togithub.com/alist-org/alist/commit/4fc0a77)
-   **deps**:
- Update module github.com/ipfs/go-ipfs-api to v0.7.0  -  by
[@&#8203;renovate](https://togithub.com/renovate)\[bot]
in[https://github.com/alist-org/alist/issues/5247](https://togithub.com/alist-org/alist/issues/5247)7
[<samp>(eb918)</samp>](https://togithub.com/alist-org/alist/commit/eb91865)
- Update module github.com/aliyun/aliyun-oss-go-sdk to
v2.2.9+incompatible  -  by
[@&#8203;renovate](https://togithub.com/renovate)\[bot]
in[https://github.com/alist-org/alist/issues/5141](https://togithub.com/alist-org/alist/issues/5141)1
[<samp>(69a98)</samp>](https://togithub.com/alist-org/alist/commit/69a98ea)
- Update module golang.org/x/net to v0.17.0 \[security]  -  by
[@&#8203;renovate](https://togithub.com/renovate)\[bot]
in[https://github.com/alist-org/alist/issues/5370](https://togithub.com/alist-org/alist/issues/5370)0
[<samp>(cc86d)</samp>](https://togithub.com/alist-org/alist/commit/cc86d6f)
- Update golang.org/x/exp digest to
[`7918f67`](https://togithub.com/alist-org/alist/commit/7918f67)  -  by
[@&#8203;renovate](https://togithub.com/renovate)\[bot]
in[https://github.com/alist-org/alist/issues/5366](https://togithub.com/alist-org/alist/issues/5366)6
[<samp>(4dff4)</samp>](https://togithub.com/alist-org/alist/commit/4dff494)
- Update module github.com/charmbracelet/lipgloss to v0.9.1  -  by
[@&#8203;renovate](https://togithub.com/renovate)\[bot]
in[https://github.com/alist-org/alist/issues/5234](https://togithub.com/alist-org/alist/issues/5234)4
[<samp>(a6325)</samp>](https://togithub.com/alist-org/alist/commit/a632596)
- Update module github.com/aws/aws-sdk-go to v1.46.7  -  by
[@&#8203;renovate](https://togithub.com/renovate)\[bot]
in[https://github.com/alist-org/alist/issues/5068](https://togithub.com/alist-org/alist/issues/5068)8
[<samp>(a7421)</samp>](https://togithub.com/alist-org/alist/commit/a7421d8)
-   **local**:
- Video file thumbnails not displaying on iOS Safari  -  by
[@&#8203;gmugu](https://togithub.com/gmugu) in
[https://github.com/alist-org/alist/issues/5420](https://togithub.com/alist-org/alist/issues/5420)
[<samp>(867ac)</samp>](https://togithub.com/alist-org/alist/commit/867acca)
-   **mopan**:
- 302 Redirect
([#&#8203;5505](https://togithub.com/alist-org/alist/issues/5505) close
[#&#8203;5502](https://togithub.com/alist-org/alist/issues/5502))  -  by
[@&#8203;foxxorcat](https://togithub.com/foxxorcat) and
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5505](https://togithub.com/alist-org/alist/issues/5505)
and
[https://github.com/alist-org/alist/issues/5502](https://togithub.com/alist-org/alist/issues/5502)
[<samp>(55a14)</samp>](https://togithub.com/alist-org/alist/commit/55a14bc)
-   **onedrive_app**:
- Incorrect api on `_accessToken`  -  by
[@&#8203;jeffmingup](https://togithub.com/jeffmingup) in
[https://github.com/alist-org/alist/issues/5346](https://togithub.com/alist-org/alist/issues/5346)
[<samp>(35d67)</samp>](https://togithub.com/alist-org/alist/commit/35d6722)
-   **terabox**:
- Auto refresh `JsToken`  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5277](https://togithub.com/alist-org/alist/issues/5277)
[<samp>(6b67a)</samp>](https://togithub.com/alist-org/alist/commit/6b67a36)
- Encode parameters for `filemanager` api  -  by
[@&#8203;URenko](https://togithub.com/URenko) in
[https://github.com/alist-org/alist/issues/5308](https://togithub.com/alist-org/alist/issues/5308)
[<samp>(e1ef6)</samp>](https://togithub.com/alist-org/alist/commit/e1ef690)
-   **vtencent**:
- Hack file with size 0 but actual size is not 0  -  by
[@&#8203;xhofe](https://togithub.com/xhofe)
[<samp>(d455a)</samp>](https://togithub.com/alist-org/alist/commit/d455a23)
-   **weiyun**:
- Unmarshal overflow  -  by
[@&#8203;foxxorcat](https://togithub.com/foxxorcat) in
[https://github.com/alist-org/alist/issues/5459](https://togithub.com/alist-org/alist/issues/5459)
[<samp>(68f44)</samp>](https://togithub.com/alist-org/alist/commit/68f440a)
-   **wopan**:
- Fatal error concurrent map writes  -  by
[@&#8203;xhofe](https://togithub.com/xhofe) in
[https://github.com/alist-org/alist/issues/5352](https://togithub.com/alist-org/alist/issues/5352)
[<samp>(1ebc9)</samp>](https://togithub.com/alist-org/alist/commit/1ebc96a)

#####    🏎 Performance

- **webdav**: Support request with cookies  -  by
[@&#8203;gmugu](https://togithub.com/gmugu) in
[https://github.com/alist-org/alist/issues/5391](https://togithub.com/alist-org/alist/issues/5391)
[<samp>(aaffa)</samp>](https://togithub.com/alist-org/alist/commit/aaffaee)

#####     [View changes on
GitHub](https://togithub.com/alist-org/alist/compare/v3.28.0...v3.29.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://togithub.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy42OC4wIiwidXBkYXRlZEluVmVyIjoiMzcuNjguMSIsInRhcmdldEJyYW5jaCI6Im1hc3RlciJ9-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants