Add job for monitoring bw limit status of tokens
This commit is contained in:
@@ -3,6 +3,9 @@ package realdebrid
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/debridmediamanager/zurg/pkg/logutil"
|
||||
"github.com/debridmediamanager/zurg/pkg/utils"
|
||||
)
|
||||
|
||||
type Token struct {
|
||||
@@ -14,15 +17,16 @@ type DownloadTokenManager struct {
|
||||
tokens []Token
|
||||
current int
|
||||
mu sync.RWMutex
|
||||
log *logutil.Logger
|
||||
}
|
||||
|
||||
// NewDownloadTokenManager initializes a new DownloadTokenManager with the given tokens.
|
||||
func NewDownloadTokenManager(tokenStrings []string) *DownloadTokenManager {
|
||||
func NewDownloadTokenManager(tokenStrings []string, log *logutil.Logger) *DownloadTokenManager {
|
||||
tokens := make([]Token, len(tokenStrings))
|
||||
for i, t := range tokenStrings {
|
||||
tokens[i] = Token{value: t, expired: false}
|
||||
}
|
||||
return &DownloadTokenManager{tokens: tokens, current: 0}
|
||||
return &DownloadTokenManager{tokens: tokens, current: 0, log: log}
|
||||
}
|
||||
|
||||
// GetCurrentToken returns the current non-expired token.
|
||||
@@ -38,19 +42,36 @@ func (dtm *DownloadTokenManager) GetCurrentToken() (string, error) {
|
||||
dtm.current = (dtm.current + 1) % len(dtm.tokens)
|
||||
|
||||
if dtm.current == 0 {
|
||||
return "", fmt.Errorf("all tokens are bandwidth-limited")
|
||||
return "", fmt.Errorf("all tokens are expired")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SetTokenAsExpired sets the specified token as expired.
|
||||
func (dtm *DownloadTokenManager) SetTokenAsExpired(token string) error {
|
||||
func (dtm *DownloadTokenManager) SetTokenAsExpired(token, reason string) error {
|
||||
dtm.mu.Lock()
|
||||
defer dtm.mu.Unlock()
|
||||
|
||||
for i, t := range dtm.tokens {
|
||||
if t.value == token {
|
||||
dtm.tokens[i].expired = true
|
||||
dtm.log.Debugf("Token %s set as expired (reason=%s)", utils.MaskToken(token), reason)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return fmt.Errorf("token not found")
|
||||
}
|
||||
|
||||
// SetTokenAsUnexpired sets the specified token as unexpired.
|
||||
func (dtm *DownloadTokenManager) SetTokenAsUnexpired(token string) error {
|
||||
dtm.mu.Lock()
|
||||
defer dtm.mu.Unlock()
|
||||
|
||||
for i, t := range dtm.tokens {
|
||||
if t.value == token {
|
||||
dtm.tokens[i].expired = false
|
||||
dtm.log.Debugf("Token %s set as unexpired", utils.MaskToken(token))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
@@ -68,3 +89,16 @@ func (dtm *DownloadTokenManager) ResetAllTokens() {
|
||||
}
|
||||
dtm.current = 0
|
||||
}
|
||||
|
||||
func (dtm *DownloadTokenManager) GetExpiredTokens() []string {
|
||||
dtm.mu.RLock()
|
||||
defer dtm.mu.RUnlock()
|
||||
|
||||
var tokens []string
|
||||
for _, t := range dtm.tokens {
|
||||
if t.expired {
|
||||
tokens = append(tokens, t.value)
|
||||
}
|
||||
}
|
||||
return tokens
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user