Set verified links cache time to 3 mins

This commit is contained in:
Ben Adrian Sarmiento
2024-08-25 13:30:40 +02:00
parent 11e9c5d431
commit 54230c9eaa
4 changed files with 34 additions and 30 deletions

View File

@@ -17,7 +17,7 @@ import (
)
type RealDebrid struct {
UnrestrictMap cmap.ConcurrentMap[string, cmap.ConcurrentMap[string, *Download]]
UnrestrictCache cmap.ConcurrentMap[string, cmap.ConcurrentMap[string, *Download]]
TokenManager *DownloadTokenManager
torrentsCache []Torrent
verifiedLinks cmap.ConcurrentMap[string, int64]
@@ -45,7 +45,7 @@ func NewRealDebrid(apiClient,
}
rd := &RealDebrid{
UnrestrictMap: cmap.New[cmap.ConcurrentMap[string, *Download]](),
UnrestrictCache: cmap.New[cmap.ConcurrentMap[string, *Download]](),
TokenManager: NewDownloadTokenManager(downloadTokens, log),
torrentsCache: []Torrent{},
verifiedLinks: cmap.New[int64](),
@@ -59,16 +59,17 @@ func NewRealDebrid(apiClient,
}
for _, token := range downloadTokens {
rd.UnrestrictMap.Set(token, cmap.New[*Download]())
rd.UnrestrictCache.Set(token, cmap.New[*Download]())
}
return rd
}
const DOWNLOAD_LINK_EXPIRY = 60 * 60 * 1.5 // 1.5 hours
const DOWNLOAD_LINK_EXPIRY = 60 * 3 // 3 minutes
func (rd *RealDebrid) UnrestrictAndVerify(link string) (*Download, error) {
for {
now := time.Now().Unix()
token, err := rd.TokenManager.GetCurrentToken()
if err != nil {
// when all tokens are expired
@@ -76,39 +77,40 @@ func (rd *RealDebrid) UnrestrictAndVerify(link string) (*Download, error) {
}
// check if the link is already unrestricted
tokenMap, _ := rd.UnrestrictMap.Get(token)
if tokenMap.Has(link) {
download, _ := tokenMap.Get(link)
unrestrictCache, _ := rd.UnrestrictCache.Get(token)
if unrestrictCache.Has(link) {
download, _ := unrestrictCache.Get(link)
// check if the link is in the verified links cache
if expiry, ok := rd.verifiedLinks.Get(download.ID); ok && expiry > time.Now().Unix() {
// check if the link is in the verified links cache and not expired
if expiry, ok := rd.verifiedLinks.Get(download.ID); ok && expiry > now {
return download, nil
} else if ok {
// if the link is expired, remove it from the verified links cache
rd.verifiedLinks.Remove(download.ID)
}
// check if the link is still valid (not in the cache or expired)
// we need to re-verify the link
rd.verifiedLinks.Remove(download.ID)
err := rd.downloadClient.VerifyLink(download.Download)
if utils.IsBytesLimitReached(err) {
if err == nil {
// yes? then extend the expiry time?
rd.verifiedLinks.Set(download.ID, now+DOWNLOAD_LINK_EXPIRY)
return download, nil
} else if utils.IsBytesLimitReached(err) {
rd.TokenManager.SetTokenAsExpired(token, "bandwidth limit exceeded")
continue
} else if err == nil {
rd.verifiedLinks.Set(download.ID, time.Now().Unix()+DOWNLOAD_LINK_EXPIRY)
return download, nil
}
// if verification failed, remove the link from the token map
tokenMap.Remove(link)
unrestrictCache.Remove(link)
}
download, err := rd.UnrestrictLinkWithToken(link, token)
if err != nil {
return nil, err
}
download.Token = token
tokenMap.Set(link, download)
unrestrictCache.Set(link, download)
rd.verifiedLinks.Remove(download.ID)
err = rd.downloadClient.VerifyLink(download.Download)
if utils.IsBytesLimitReached(err) {
rd.TokenManager.SetTokenAsExpired(token, "bandwidth limit exceeded")
@@ -117,7 +119,7 @@ func (rd *RealDebrid) UnrestrictAndVerify(link string) (*Download, error) {
return nil, err
}
rd.verifiedLinks.Set(download.ID, time.Now().Unix()+DOWNLOAD_LINK_EXPIRY)
rd.verifiedLinks.Set(download.ID, now+DOWNLOAD_LINK_EXPIRY)
return download, err
}
@@ -162,6 +164,8 @@ func (rd *RealDebrid) UnrestrictLinkWithToken(link, token string) (*Download, er
return nil, fmt.Errorf("undecodable response: %v", err)
}
response.Token = token
// rd.log.Debugf("Unrestricted link %s into %s", link, response.Download)
return &response, nil
}
@@ -428,10 +432,10 @@ func (rd *RealDebrid) MonitorExpiredTokens() {
i++
expiredTokens := rd.TokenManager.GetExpiredTokens()
for _, token := range expiredTokens {
tokenMap, _ := rd.UnrestrictMap.Get(token)
unrestrictCache, _ := rd.UnrestrictCache.Get(token)
stillExpired := true
skipAll := false
tokenMap.IterCb(func(key string, download *Download) {
unrestrictCache.IterCb(func(key string, download *Download) {
if skipAll {
return
}