From 122eea237483f94465fd7a2092e8aff360f67484 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Mon, 8 Jan 2024 13:01:21 +0100 Subject: [PATCH] Accommodate for empty RD accounts --- internal/torrent/latestState.go | 53 ++++++++++++++++----------------- internal/torrent/manager.go | 4 +-- internal/torrent/repair.go | 3 ++ pkg/realdebrid/api.go | 8 +++++ 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/internal/torrent/latestState.go b/internal/torrent/latestState.go index e9ae58b..b7dead8 100644 --- a/internal/torrent/latestState.go +++ b/internal/torrent/latestState.go @@ -1,38 +1,33 @@ package torrent import ( - "time" - "github.com/debridmediamanager/zurg/pkg/realdebrid" ) type LibraryState struct { TotalCount int ActiveCount int - FirstTorrent realdebrid.Torrent - FirstActiveTorrent realdebrid.Torrent + FirstTorrent *realdebrid.Torrent + FirstActiveTorrent *realdebrid.Torrent } func (ls LibraryState) equal(a LibraryState) bool { - return a.TotalCount == ls.TotalCount && - a.ActiveCount == ls.ActiveCount && - a.FirstTorrent.ID == ls.FirstTorrent.ID && - a.FirstTorrent.Status == ls.FirstTorrent.Status && - a.FirstActiveTorrent.ID == ls.FirstActiveTorrent.ID && - a.FirstActiveTorrent.Status == ls.FirstActiveTorrent.Status -} - -func EmptyState() LibraryState { - empty := realdebrid.Torrent{ - ID: "", - Added: (time.Time{}).Format(time.RFC3339), + if a.TotalCount != ls.TotalCount || a.ActiveCount != ls.ActiveCount { + return false } - return LibraryState{ - TotalCount: 0, - ActiveCount: 0, - FirstTorrent: empty, - FirstActiveTorrent: empty, + if (ls.FirstTorrent == nil) != (a.FirstTorrent == nil) { + return false } + if ls.FirstTorrent != nil && (ls.FirstTorrent.ID != a.FirstTorrent.ID || ls.FirstTorrent.Status != a.FirstTorrent.Status) { + return false + } + if (ls.FirstActiveTorrent == nil) != (a.FirstActiveTorrent == nil) { + return false + } + if ls.FirstActiveTorrent != nil && (ls.FirstActiveTorrent.ID != a.FirstActiveTorrent.ID || ls.FirstActiveTorrent.Status != a.FirstActiveTorrent.Status) { + return false + } + return true } func (t *TorrentManager) SetNewLatestState(checksum LibraryState) { @@ -52,7 +47,7 @@ func (t *TorrentManager) getCurrentState() LibraryState { torrentChan := make(chan torrentsResp, 1) activeChan := make(chan torrentsResp, 1) countChan := make(chan int, 1) - errChan := make(chan error, 3) // accommodate errors from both goroutines + errChan := make(chan error, 3) // accommodate errors from all goroutines defer close(torrentChan) defer close(activeChan) defer close(countChan) @@ -85,22 +80,24 @@ func (t *TorrentManager) getCurrentState() LibraryState { countChan <- count.DownloadingCount }) - // Existing goroutines for GetTorrents and GetActiveTorrentCount - var first realdebrid.Torrent - var active realdebrid.Torrent + var first, active *realdebrid.Torrent var totalCount, count int for i := 0; i < 3; i++ { select { case firstResp := <-torrentChan: - first = firstResp.torrents[0] + if len(firstResp.torrents) > 0 { + first = &firstResp.torrents[0] + } totalCount = firstResp.totalCount case activeResp := <-activeChan: - active = activeResp.torrents[0] + if len(activeResp.torrents) > 0 { + active = &activeResp.torrents[0] + } case count = <-countChan: case err := <-errChan: t.log.Warnf("Checksum API Error: %v", err) - return EmptyState() + return LibraryState{} } } diff --git a/internal/torrent/manager.go b/internal/torrent/manager.go index 18b47fb..cd46eeb 100644 --- a/internal/torrent/manager.go +++ b/internal/torrent/manager.go @@ -38,13 +38,11 @@ type TorrentManager struct { // it will fetch all torrents and their info in the background // and store them in-memory and cached in files func NewTorrentManager(cfg config.ConfigInterface, api *realdebrid.RealDebrid, p *ants.Pool, log *logutil.Logger) *TorrentManager { - initialSate := EmptyState() - t := &TorrentManager{ Config: cfg, Api: api, allAccessKeys: mapset.NewSet[string](), - latestState: &initialSate, + latestState: &LibraryState{}, requiredVersion: "07.01.2024", workerPool: p, log: log, diff --git a/internal/torrent/repair.go b/internal/torrent/repair.go index 91b7a85..cb33f8d 100644 --- a/internal/torrent/repair.go +++ b/internal/torrent/repair.go @@ -49,6 +49,9 @@ func (t *TorrentManager) repairAll() { var availabilityChecks = make(map[string]bool) uncachedCount := 0 for i := range hashGroups { + if hashGroups[i].Cardinality() == 0 { + break + } resp, err := t.Api.AvailabilityCheck(hashGroups[i].ToSlice()) if err != nil { t.log.Warnf("Cannot check availability: %v", err) diff --git a/pkg/realdebrid/api.go b/pkg/realdebrid/api.go index 49ae7a5..fdcd9e7 100644 --- a/pkg/realdebrid/api.go +++ b/pkg/realdebrid/api.go @@ -95,6 +95,10 @@ func (rd *RealDebrid) GetTorrents(customLimit int, active bool) ([]Torrent, int, } defer resp.Body.Close() + if resp.StatusCode == http.StatusNoContent { + return allTorrents, 0, nil + } + // if status code is not 2xx, return erro var torrents []Torrent @@ -340,6 +344,10 @@ func (rd *RealDebrid) GetDownloads(page, offset int) ([]Download, int, error) { } defer resp.Body.Close() + if resp.StatusCode == http.StatusNoContent { + return allDownloads, 0, nil + } + // if status code is not 2xx, return erro var downloads []Download