Prevent duplicates
This commit is contained in:
@@ -371,6 +371,8 @@ func (t *TorrentManager) redownloadTorrent(torrent *Torrent, selection []string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// redownload torrent
|
// redownload torrent
|
||||||
|
var newTorrentID string
|
||||||
|
prevState := t.latestState
|
||||||
resp, err := t.api.AddMagnetHash(torrent.Hash)
|
resp, err := t.api.AddMagnetHash(torrent.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), "infringing") {
|
if strings.Contains(err.Error(), "infringing") {
|
||||||
@@ -386,10 +388,20 @@ func (t *TorrentManager) redownloadTorrent(torrent *Torrent, selection []string)
|
|||||||
} else if strings.Contains(err.Error(), "allowed") {
|
} else if strings.Contains(err.Error(), "allowed") {
|
||||||
t.markAsUnfixable(torrent, "torrent not allowed")
|
t.markAsUnfixable(torrent, "torrent not allowed")
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("cannot add magnet of torrent %s (hash=%s): %v", t.GetKey(torrent), torrent.Hash, err)
|
if strings.Contains(err.Error(), "timeout") {
|
||||||
|
newState := t.getCurrentState()
|
||||||
|
if prevState.Eq(newState) {
|
||||||
|
return t.redownloadTorrent(torrent, selection)
|
||||||
|
}
|
||||||
|
newTorrentID = t.latestState.FirstTorrentId
|
||||||
|
} else {
|
||||||
|
return nil, fmt.Errorf("cannot add magnet of torrent %s (hash=%s): %v", t.GetKey(torrent), torrent.Hash, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
newTorrentID := resp.ID
|
if resp != nil {
|
||||||
|
newTorrentID = resp.ID
|
||||||
|
}
|
||||||
|
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
|
|
||||||
|
|||||||
@@ -159,9 +159,6 @@ func (r *HTTPClient) Do(req *http.Request) (*http.Response, error) {
|
|||||||
req.Header.Set("Authorization", "Bearer "+r.bearerToken)
|
req.Header.Set("Authorization", "Bearer "+r.bearerToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if Range header is set
|
|
||||||
reqHasRangeHeader := req.Header.Get("Range") != "" && !strings.HasPrefix(req.Header.Get("Range"), "bytes=0-")
|
|
||||||
|
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
@@ -196,7 +193,7 @@ func (r *HTTPClient) Do(req *http.Request) (*http.Response, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
incr := r.shouldRetry(resp, reqHasRangeHeader, err, r.cfg.GetRateLimitSleepSecs())
|
incr := r.shouldRetry(req, resp, err, r.cfg.GetRateLimitSleepSecs())
|
||||||
if incr > 0 {
|
if incr > 0 {
|
||||||
attempt += incr
|
attempt += incr
|
||||||
if attempt > r.maxRetries {
|
if attempt > r.maxRetries {
|
||||||
@@ -211,7 +208,8 @@ func (r *HTTPClient) Do(req *http.Request) (*http.Response, error) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err != nil && strings.Contains(err.Error(), "timeout") && req.Host == "api.real-debrid.com" && !strings.HasSuffix(req.URL.Path, "unrestrict/link") {
|
okWithTimeout := strings.HasSuffix(req.URL.Path, "unrestrict/link") && strings.HasSuffix(req.URL.Path, "torrents/addMagnet")
|
||||||
|
if err != nil && strings.Contains(err.Error(), "timeout") && req.Host == "api.real-debrid.com" && !okWithTimeout {
|
||||||
r.log.Warnf("Adjust your API timeout settings, request to %s timed out", req.URL.String())
|
r.log.Warnf("Adjust your API timeout settings, request to %s timed out", req.URL.String())
|
||||||
}
|
}
|
||||||
return resp, err
|
return resp, err
|
||||||
@@ -253,7 +251,10 @@ func (r *HTTPClient) proxyDialer(proxyURL *url.URL) (proxy.Dialer, error) {
|
|||||||
return nil, fmt.Errorf("unsupported proxy scheme: %s", proxyURL.Scheme)
|
return nil, fmt.Errorf("unsupported proxy scheme: %s", proxyURL.Scheme)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *HTTPClient) shouldRetry(resp *http.Response, reqHasRangeHeader bool, err error, rateLimitSleep int) int {
|
func (r *HTTPClient) shouldRetry(req *http.Request, resp *http.Response, err error, rateLimitSleep int) int {
|
||||||
|
if strings.HasSuffix(req.URL.Path, "torrents/addMagnet") {
|
||||||
|
return -1 // don't retry to prevent duplicate torrents
|
||||||
|
}
|
||||||
if err != nil && strings.HasPrefix(err.Error(), "api response error:") {
|
if err != nil && strings.HasPrefix(err.Error(), "api response error:") {
|
||||||
if apiErr, ok := err.(*ApiErrorResponse); ok {
|
if apiErr, ok := err.(*ApiErrorResponse); ok {
|
||||||
switch apiErr.Code {
|
switch apiErr.Code {
|
||||||
@@ -300,7 +301,8 @@ func (r *HTTPClient) shouldRetry(resp *http.Response, reqHasRangeHeader bool, er
|
|||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
// if the request has a Range header but the server doesn't respond with a Content-Range header
|
// if the request has a Range header but the server doesn't respond with a Content-Range header
|
||||||
if resp.StatusCode/100 == 2 && resp.Header.Get("Content-Range") == "" && reqHasRangeHeader {
|
hasRangeHeader := req.Header.Get("Range") != "" && !strings.HasPrefix(req.Header.Get("Range"), "bytes=0-")
|
||||||
|
if hasRangeHeader && resp.StatusCode/100 == 2 && resp.Header.Get("Content-Range") == "" {
|
||||||
time.Sleep(10 * time.Millisecond)
|
time.Sleep(10 * time.Millisecond)
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user