From 26f6f384a34ac0fd785a2b092f4198f85f12ba70 Mon Sep 17 00:00:00 2001 From: Mukhtar Akere Date: Sun, 16 Mar 2025 05:43:25 +0100 Subject: [PATCH] Fix arr download_uncached settings --- internal/config/config.go | 2 +- pkg/arr/arr.go | 4 ++-- pkg/debrid/alldebrid/alldebrid.go | 6 +++++- pkg/debrid/debrid.go | 25 ++++++++++++++++++------- pkg/debrid/debrid_link/debrid_link.go | 6 +++++- pkg/debrid/engine/service.go | 1 + pkg/debrid/realdebrid/realdebrid.go | 9 +++++---- pkg/debrid/torbox/torbox.go | 6 +++++- pkg/qbit/http.go | 3 ++- pkg/web/server.go | 2 +- 10 files changed, 45 insertions(+), 19 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index bd9b816..7ceac43 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -50,7 +50,7 @@ type Arr struct { Token string `json:"token"` Cleanup bool `json:"cleanup"` SkipRepair bool `json:"skip_repair"` - DownloadUncached bool `json:"download_uncached"` + DownloadUncached *bool `json:"download_uncached"` } type Repair struct { diff --git a/pkg/arr/arr.go b/pkg/arr/arr.go index 808b8b7..45ca1ec 100644 --- a/pkg/arr/arr.go +++ b/pkg/arr/arr.go @@ -31,11 +31,11 @@ type Arr struct { Type Type `json:"type"` Cleanup bool `json:"cleanup"` SkipRepair bool `json:"skip_repair"` - DownloadUncached bool `json:"download_uncached"` + DownloadUncached *bool `json:"download_uncached"` client *http.Client } -func New(name, host, token string, cleanup, skipRepair, downloadUncached bool) *Arr { +func New(name, host, token string, cleanup, skipRepair bool, downloadUncached *bool) *Arr { return &Arr{ Name: name, Host: host, diff --git a/pkg/debrid/alldebrid/alldebrid.go b/pkg/debrid/alldebrid/alldebrid.go index 190b5cb..d9eecee 100644 --- a/pkg/debrid/alldebrid/alldebrid.go +++ b/pkg/debrid/alldebrid/alldebrid.go @@ -192,7 +192,7 @@ func (ad *AllDebrid) CheckStatus(torrent *torrent.Torrent, isSymlink bool) (*tor } break } else if slices.Contains(ad.GetDownloadingStatus(), status) { - if !ad.DownloadUncached && !torrent.DownloadUncached { + if !torrent.DownloadUncached { return torrent, fmt.Errorf("torrent: %s not cached", torrent.Name) } // Break out of the loop if the torrent is downloading. @@ -280,6 +280,10 @@ func (ad *AllDebrid) GetDownloadingStatus() []string { return []string{"downloading"} } +func (ad *AllDebrid) GetDownloadUncached() bool { + return ad.DownloadUncached +} + func New(dc config.Debrid, cache *cache.Cache) *AllDebrid { rl := request.ParseRateLimit(dc.RateLimit) headers := map[string]string{ diff --git a/pkg/debrid/debrid.go b/pkg/debrid/debrid.go index cabda74..e3dc0df 100644 --- a/pkg/debrid/debrid.go +++ b/pkg/debrid/debrid.go @@ -47,14 +47,14 @@ func createDebrid(dc config.Debrid, cache *cache.Cache) engine.Service { } } -func ProcessTorrent(d *engine.Engine, magnet *utils.Magnet, a *arr.Arr, isSymlink, downloadUncached bool) (*torrent.Torrent, error) { +func ProcessTorrent(d *engine.Engine, magnet *utils.Magnet, a *arr.Arr, isSymlink, overrideDownloadUncached bool) (*torrent.Torrent, error) { + debridTorrent := &torrent.Torrent{ - InfoHash: magnet.InfoHash, - Magnet: magnet, - Name: magnet.Name, - Arr: a, - Size: magnet.Size, - DownloadUncached: cmp.Or(downloadUncached, a.DownloadUncached), + InfoHash: magnet.InfoHash, + Magnet: magnet, + Name: magnet.Name, + Arr: a, + Size: magnet.Size, } errs := make([]error, 0) @@ -63,6 +63,17 @@ func ProcessTorrent(d *engine.Engine, magnet *utils.Magnet, a *arr.Arr, isSymlin logger := db.GetLogger() logger.Info().Msgf("Processing debrid: %s", db.GetName()) + // Override first, arr second, debrid third + + if overrideDownloadUncached { + debridTorrent.DownloadUncached = true + } else if a.DownloadUncached != nil { + // Arr cached is set + debridTorrent.DownloadUncached = *a.DownloadUncached + } else { + debridTorrent.DownloadUncached = db.GetDownloadUncached() + } + logger.Info().Msgf("Torrent Hash: %s", debridTorrent.InfoHash) if db.GetCheckCached() { hash, exists := db.IsAvailable([]string{debridTorrent.InfoHash})[debridTorrent.InfoHash] diff --git a/pkg/debrid/debrid_link/debrid_link.go b/pkg/debrid/debrid_link/debrid_link.go index 059eaf5..33aaf43 100644 --- a/pkg/debrid/debrid_link/debrid_link.go +++ b/pkg/debrid/debrid_link/debrid_link.go @@ -217,7 +217,7 @@ func (dl *DebridLink) CheckStatus(torrent *torrent.Torrent, isSymlink bool) (*to } break } else if slices.Contains(dl.GetDownloadingStatus(), status) { - if !dl.DownloadUncached && !torrent.DownloadUncached { + if !torrent.DownloadUncached { return torrent, fmt.Errorf("torrent: %s not cached", torrent.Name) } // Break out of the loop if the torrent is downloading. @@ -271,6 +271,10 @@ func (dl *DebridLink) GetCheckCached() bool { return dl.CheckCached } +func (dl *DebridLink) GetDownloadUncached() bool { + return dl.DownloadUncached +} + func New(dc config.Debrid, cache *cache.Cache) *DebridLink { rl := request.ParseRateLimit(dc.RateLimit) headers := map[string]string{ diff --git a/pkg/debrid/engine/service.go b/pkg/debrid/engine/service.go index a670b79..30dcf25 100644 --- a/pkg/debrid/engine/service.go +++ b/pkg/debrid/engine/service.go @@ -13,6 +13,7 @@ type Service interface { DeleteTorrent(tr *torrent.Torrent) IsAvailable(infohashes []string) map[string]bool GetCheckCached() bool + GetDownloadUncached() bool GetTorrent(torrent *torrent.Torrent) (*torrent.Torrent, error) GetTorrents() ([]*torrent.Torrent, error) GetName() string diff --git a/pkg/debrid/realdebrid/realdebrid.go b/pkg/debrid/realdebrid/realdebrid.go index 7a64ff7..a65493c 100644 --- a/pkg/debrid/realdebrid/realdebrid.go +++ b/pkg/debrid/realdebrid/realdebrid.go @@ -249,12 +249,9 @@ func (r *RealDebrid) CheckStatus(t *torrent.Torrent, isSymlink bool) (*torrent.T } break } else if slices.Contains(r.GetDownloadingStatus(), status) { - if !r.DownloadUncached && !t.DownloadUncached { + if !t.DownloadUncached { return t, fmt.Errorf("torrent: %s not cached", t.Name) } - // Break out of the loop if the torrent is downloading. - // This is necessary to prevent infinite loop since we moved to sync downloading and async processing - break } else { return t, fmt.Errorf("torrent: %s has error: %s", t.Name, status) } @@ -384,6 +381,10 @@ func (r *RealDebrid) GetDownloadingStatus() []string { return []string{"downloading", "magnet_conversion", "queued", "compressing", "uploading"} } +func (r *RealDebrid) GetDownloadUncached() bool { + return r.DownloadUncached +} + func New(dc config.Debrid, cache *cache.Cache) *RealDebrid { rl := request.ParseRateLimit(dc.RateLimit) headers := map[string]string{ diff --git a/pkg/debrid/torbox/torbox.go b/pkg/debrid/torbox/torbox.go index d95c7f2..96f44f6 100644 --- a/pkg/debrid/torbox/torbox.go +++ b/pkg/debrid/torbox/torbox.go @@ -231,7 +231,7 @@ func (tb *Torbox) CheckStatus(torrent *torrent.Torrent, isSymlink bool) (*torren } break } else if slices.Contains(tb.GetDownloadingStatus(), status) { - if !tb.DownloadUncached && !torrent.DownloadUncached { + if !torrent.DownloadUncached { return torrent, fmt.Errorf("torrent: %s not cached", torrent.Name) } // Break out of the loop if the torrent is downloading. @@ -332,6 +332,10 @@ func (tb *Torbox) GetTorrents() ([]*torrent.Torrent, error) { return nil, fmt.Errorf("not implemented") } +func (tb *Torbox) GetDownloadUncached() bool { + return tb.DownloadUncached +} + func New(dc config.Debrid, cache *cache.Cache) *Torbox { rl := request.ParseRateLimit(dc.RateLimit) headers := map[string]string{ diff --git a/pkg/qbit/http.go b/pkg/qbit/http.go index d40769a..1764eda 100644 --- a/pkg/qbit/http.go +++ b/pkg/qbit/http.go @@ -59,7 +59,8 @@ func (q *QBit) authContext(next http.Handler) http.Handler { // Check if arr exists a := svc.Arr.Get(category) if a == nil { - a = arr.New(category, "", "", false, false, false) + downloadUncached := false + a = arr.New(category, "", "", false, false, &downloadUncached) } if err == nil { host = strings.TrimSpace(host) diff --git a/pkg/web/server.go b/pkg/web/server.go index 433d481..16dacdc 100644 --- a/pkg/web/server.go +++ b/pkg/web/server.go @@ -311,7 +311,7 @@ func (ui *Handler) handleAddContent(w http.ResponseWriter, r *http.Request) { _arr := svc.Arr.Get(arrName) if _arr == nil { - _arr = arr.New(arrName, "", "", false, false, false) + _arr = arr.New(arrName, "", "", false, false, &downloadUncached) } // Handle URLs