Repair edge cases
This commit is contained in:
@@ -45,7 +45,7 @@ func (t *TorrentManager) Delete(accessKey string, deleteInRD bool) {
|
||||
}
|
||||
}
|
||||
t.allAccessKeys.Remove(accessKey)
|
||||
t.log.Infof("Removing torrent %s from zurg database", accessKey)
|
||||
t.log.Infof("Removing torrent %s from zurg database (not real-debrid)", accessKey)
|
||||
t.DirectoryMap.IterCb(func(directory string, torrents cmap.ConcurrentMap[string, *Torrent]) {
|
||||
torrents.Remove(accessKey)
|
||||
})
|
||||
|
||||
@@ -122,7 +122,11 @@ func (t *TorrentManager) UnrestrictUntilOk(link string) *realdebrid.Download {
|
||||
if download, exists := t.DownloadCache.Get(link); exists {
|
||||
return download
|
||||
}
|
||||
ret, _ := t.Api.UnrestrictLink(link, t.Config.ShouldServeFromRclone())
|
||||
ret, err := t.Api.UnrestrictLink(link, t.Config.ShouldServeFromRclone())
|
||||
if err != nil {
|
||||
t.log.Warnf("Cannot unrestrict link %s: %v", link, err)
|
||||
return nil
|
||||
}
|
||||
if ret != nil && ret.Link != "" {
|
||||
if strings.Contains(ret.Download, "download.real-debrid.") {
|
||||
prefHost := t.Config.GetRandomPreferredHost()
|
||||
|
||||
@@ -31,7 +31,7 @@ func (t *TorrentManager) RefreshTorrents() []string {
|
||||
if instances[idx].IsDone() && t.fixers.Has(instances[idx].ID) {
|
||||
fixer := instances[idx]
|
||||
torrent, _ := t.fixers.Pop(fixer.ID)
|
||||
t.log.Debugf("Fixer %s is done, let's check if it fixed torrent %s", instances[idx].ID, t.GetKey(torrent))
|
||||
t.log.Debugf("Fixer %s is done, let's check if it fixed torrent %s by redownloading", instances[idx].ID, t.GetKey(torrent))
|
||||
brokenFiles := getBrokenFiles(torrent)
|
||||
info, err := t.redownloadTorrent(torrent, "")
|
||||
if err == nil {
|
||||
|
||||
@@ -242,6 +242,10 @@ func (t *TorrentManager) repair(torrent *Torrent) {
|
||||
t.log.Infof("Successfully repaired torrent %s using repair_method#1", t.GetKey(torrent))
|
||||
return
|
||||
}
|
||||
if info != nil && info.ID != "" {
|
||||
t.log.Warnf("Torrent %s is still broken after repair_method#1, cleaning up", t.GetKey(torrent))
|
||||
t.Api.DeleteTorrent(info.ID)
|
||||
}
|
||||
|
||||
// second solution: add only the broken files
|
||||
if len(brokenFiles) > 0 {
|
||||
@@ -258,7 +262,6 @@ func (t *TorrentManager) repair(torrent *Torrent) {
|
||||
}
|
||||
|
||||
func (t *TorrentManager) redownloadTorrent(torrent *Torrent, brokenFiles string) (*realdebrid.TorrentInfo, error) {
|
||||
t.log.Debugf("Redownloading torrent %s, broken files=%s (all if empty)", t.GetKey(torrent), brokenFiles)
|
||||
oldTorrentIDs := make([]string, 0)
|
||||
// broken files means broken links
|
||||
// if brokenFiles is not provided
|
||||
@@ -424,7 +427,7 @@ func getBrokenFiles(torrent *Torrent) []*File {
|
||||
func (t *TorrentManager) isStillBroken(info *realdebrid.TorrentInfo, brokenFiles []*File) bool {
|
||||
for _, oldFile := range brokenFiles {
|
||||
for idx, newFile := range info.Files {
|
||||
if oldFile.Path == newFile.Path {
|
||||
if oldFile.Path == newFile.Path || oldFile.Bytes == newFile.Bytes {
|
||||
unrestrict := t.UnrestrictUntilOk(info.Links[idx])
|
||||
if unrestrict == nil || oldFile.Bytes != unrestrict.Filesize {
|
||||
return true
|
||||
|
||||
Reference in New Issue
Block a user