From 6726b1e54ed73b2b5d9ccdbac85373afcdb47726 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Mon, 5 Feb 2024 00:42:28 +0100 Subject: [PATCH] Fix the fixer --- internal/torrent/fixer.go | 32 ++++++++++++++++++++------------ internal/torrent/refresh.go | 2 +- internal/torrent/repair.go | 2 +- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/internal/torrent/fixer.go b/internal/torrent/fixer.go index dfabfa1..b300487 100644 --- a/internal/torrent/fixer.go +++ b/internal/torrent/fixer.go @@ -4,6 +4,7 @@ import ( "io" "os" + "github.com/debridmediamanager/zurg/pkg/realdebrid" cmap "github.com/orcaman/concurrent-map/v2" ) @@ -20,36 +21,43 @@ func (t *TorrentManager) fixerAddCommand(trigger, command string) { t.writeFixersToFile() } -func (t *TorrentManager) handleFixers() { +func (t *TorrentManager) handleFixers(instances []realdebrid.Torrent) { var toDelete []string + var toRedownload []*Torrent allTorrents, _ := t.DirectoryMap.Get(INT_ALL) - infoCache, _ := t.DirectoryMap.Get(INT_INFO_CACHE) - infoCache.IterCb(func(id string, torrent *Torrent) { - if !t.fixers.Has(id) || torrent.AnyInProgress() { + for _, instance := range instances { + id := instance.ID + if !t.fixers.Has(id) { return } command, _ := t.fixers.Pop(id) // delete the fixer if it's done switch command { case "replaced": // id is old torrent id - t.log.Debugf("Deleting old id=%s because it's redundant to fixed %s ", id, t.GetKey(torrent)) + t.log.Debugf("Deleting old id=%s because it's redundant to fixed %s ", id, instance.Name) toDelete = append(toDelete, id) case "download_failed": // id is failed fixer id - t.log.Debugf("Deleting failed fixer id=%s of torrent %s", id, t.GetKey(torrent)) + t.log.Debugf("Deleting failed fixer id=%s of torrent %s", id, instance.Name) toDelete = append(toDelete, id) - case "repaired": // id is fixer id + case "repaired": // this torrent contains broken files + if instance.Progress != 100 { + return + } + torrent := t.getMoreInfo(instance) t.log.Debugf("Repairing torrent %s again now that fixer id=%s is done", t.GetKey(torrent), id) repairMe, _ := allTorrents.Get(t.GetKey(torrent)) - repairMe.DownloadedIDs.Remove(id) - toDelete = append(toDelete, id) - t.TriggerRepair(repairMe) + toRedownload = append(toRedownload, repairMe) } - }) + } + + infoCache, _ := t.DirectoryMap.Get(INT_INFO_CACHE) for _, id := range toDelete { t.Api.DeleteTorrent(id) infoCache.Remove(id) t.deleteTorrentFile(id) } - + for _, torrent := range toRedownload { + t.redownloadTorrent(torrent, "") + } // remove expired fixers var expired []string t.fixers.IterCb(func(trigger string, command string) { diff --git a/internal/torrent/refresh.go b/internal/torrent/refresh.go index a830240..a1721da 100644 --- a/internal/torrent/refresh.go +++ b/internal/torrent/refresh.go @@ -88,7 +88,7 @@ func (t *TorrentManager) refreshTorrents() []string { if t.Config.EnableRepair() { t.workerPool.Submit(func() { - t.handleFixers() + t.handleFixers(instances) }) } diff --git a/internal/torrent/repair.go b/internal/torrent/repair.go index 0a5d636..af3c350 100644 --- a/internal/torrent/repair.go +++ b/internal/torrent/repair.go @@ -383,7 +383,7 @@ func (t *TorrentManager) redownloadTorrent(torrent *Torrent, selection string) ( return nil, fmt.Errorf("it did not fix the issue for %s (id=%s), only got %d files but we need %d, undoing", t.GetKey(torrent), info.ID, len(info.Links), selectionCount) } - // looks like it's fixed even if it's not done yet + t.log.Infof("Redownloading torrent %s successful (progress=%d)", t.GetKey(torrent), info.Progress) for _, id := range oldTorrentIDs { t.fixerAddCommand(id, "replaced") }