mirror of
https://github.com/rclone/rclone.git
synced 2025-11-23 21:44:49 +02:00
ulozto: Fix downloads returning HTML error page
The uloz.to backend was failing to download files, instead returning
an HTML page with a "Slow download" message. This was caused by
recent changes in the uloz.to API.
This commit fixes the issue by making the following changes to the
download process:
1. The `hash` received from the download link API is now appended as a
query parameter to the download URL.
2. The download is now performed using the authenticated `rest` client
to ensure premium access is recognized.
3. The `DeviceID` is now generated dynamically for each download request
to avoid potential rate-limiting of a static ID.
This commit is contained in:
@@ -801,8 +801,7 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (rc io.Read
|
|||||||
req := &api.GetDownloadLinkRequest{
|
req := &api.GetDownloadLinkRequest{
|
||||||
Slug: o.slug,
|
Slug: o.slug,
|
||||||
UserLogin: o.fs.opt.Username,
|
UserLogin: o.fs.opt.Username,
|
||||||
// Has to be set but doesn't seem to be used server side.
|
DeviceID: fmt.Sprintf("%d", time.Now().UnixNano()),
|
||||||
DeviceID: "foobar",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var resp *api.GetDownloadLinkResponse
|
var resp *api.GetDownloadLinkResponse
|
||||||
@@ -815,16 +814,26 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (rc io.Read
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
downloadURL := resp.Link
|
||||||
|
if resp.Hash != "" {
|
||||||
|
if strings.Contains(downloadURL, "?") {
|
||||||
|
downloadURL += "&"
|
||||||
|
} else {
|
||||||
|
downloadURL += "?"
|
||||||
|
}
|
||||||
|
downloadURL += "hash=" + url.QueryEscape(resp.Hash)
|
||||||
|
}
|
||||||
|
|
||||||
opts = rest.Opts{
|
opts = rest.Opts{
|
||||||
Method: "GET",
|
Method: "GET",
|
||||||
RootURL: resp.Link,
|
RootURL: downloadURL,
|
||||||
Options: options,
|
Options: options,
|
||||||
}
|
}
|
||||||
|
|
||||||
var httpResp *http.Response
|
var httpResp *http.Response
|
||||||
|
|
||||||
err = o.fs.pacer.Call(func() (bool, error) {
|
err = o.fs.pacer.Call(func() (bool, error) {
|
||||||
httpResp, err = o.fs.cdn.Call(ctx, &opts)
|
httpResp, err = o.fs.rest.Call(ctx, &opts)
|
||||||
return o.fs.shouldRetry(ctx, httpResp, err, true)
|
return o.fs.shouldRetry(ctx, httpResp, err, true)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user