diff --git a/internal/dav/delete.go b/internal/dav/delete.go index 200576d..80266e5 100644 --- a/internal/dav/delete.go +++ b/internal/dav/delete.go @@ -6,20 +6,20 @@ import ( "github.com/debridmediamanager/zurg/internal/torrent" ) -func HandleDeleteTorrent(directory, torrentName string, t *torrent.TorrentManager) error { - torrents, ok := t.DirectoryMap.Get(directory) +func HandleDeleteTorrent(directory, torrentName string, torMgr *torrent.TorrentManager) error { + torrents, ok := torMgr.DirectoryMap.Get(directory) if !ok { return fmt.Errorf("cannot find directory %s", directory) } if !torrents.Has(torrentName) { return fmt.Errorf("cannot find torrent %s", torrentName) } - t.Delete(torrentName, true) + torMgr.Delete(torrentName, true) return nil } -func HandleDeleteFile(directory, torrentName, fileName string, t *torrent.TorrentManager) error { - torrents, ok := t.DirectoryMap.Get(directory) +func HandleDeleteFile(directory, torrentName, fileName string, torMgr *torrent.TorrentManager) error { + torrents, ok := torMgr.DirectoryMap.Get(directory) if !ok { return fmt.Errorf("cannot find directory %s", directory) } @@ -32,8 +32,8 @@ func HandleDeleteFile(directory, torrentName, fileName string, t *torrent.Torren return fmt.Errorf("cannot find file %s", fileName) } file.Link = "unselect" - if t.CheckDeletedState(torrent) { - t.Delete(torrentName, true) + if torMgr.CheckDeletedState(torrent) { + torMgr.Delete(torrentName, true) } // todo: triggeer an update ??? // t.TriggerHookOnLibraryUpdate(updatedPaths) diff --git a/internal/dav/listing.go b/internal/dav/listing.go index a16a51a..792b5b4 100644 --- a/internal/dav/listing.go +++ b/internal/dav/listing.go @@ -11,10 +11,10 @@ import ( "go.uber.org/zap" ) -func HandleListDirectories(t *torrent.TorrentManager) (*string, error) { +func HandleListDirectories(torMgr *torrent.TorrentManager) (*string, error) { davDoc := "" davDoc += dav.BaseDirectory("", "") - directories := t.DirectoryMap.Keys() + directories := torMgr.DirectoryMap.Keys() sort.Strings(directories) for _, directory := range directories { if strings.HasPrefix(directory, "int__") { @@ -26,25 +26,33 @@ func HandleListDirectories(t *torrent.TorrentManager) (*string, error) { return &davDoc, nil } -func HandleListTorrents(directory string, t *torrent.TorrentManager, log *zap.SugaredLogger) (*string, error) { - _, ok := t.DirectoryMap.Get(directory) +func HandleListTorrents(directory string, torMgr *torrent.TorrentManager, log *zap.SugaredLogger) (*string, error) { + torrents, ok := torMgr.DirectoryMap.Get(directory) if !ok { return nil, fmt.Errorf("cannot find directory %s", directory) } davDoc := "" davDoc += dav.Directory("", "") - directories := t.DirectoryMap.Keys() - sort.Strings(directories) - for _, directory := range directories { - davDoc += dav.Directory(directory, "") + var allTorrents []*torrent.Torrent + torrents.IterCb(func(_ string, tor *torrent.Torrent) { + if tor.AllInProgress() { + return + } + allTorrents = append(allTorrents, tor) + }) + sort.Slice(allTorrents, func(i, j int) bool { + return allTorrents[i].AccessKey < allTorrents[j].AccessKey + }) + for _, tor := range allTorrents { + davDoc += dav.Directory(tor.AccessKey, tor.LatestAdded) } davDoc += "" return &davDoc, nil } -func HandleListFiles(directory, torrentName string, t *torrent.TorrentManager, log *zap.SugaredLogger) (*string, error) { - torrents, ok := t.DirectoryMap.Get(directory) +func HandleListFiles(directory, torrentName string, torMgr *torrent.TorrentManager, log *zap.SugaredLogger) (*string, error) { + torrents, ok := torMgr.DirectoryMap.Get(directory) if !ok { return nil, fmt.Errorf("cannot find directory %s", directory) } diff --git a/internal/http/listing.go b/internal/http/listing.go index 48340ab..0bb7b31 100644 --- a/internal/http/listing.go +++ b/internal/http/listing.go @@ -26,8 +26,8 @@ func HandleListDirectories(torMgr *torrent.TorrentManager) (*string, error) { return &htmlDoc, nil } -func HandleListTorrents(directory string, t *torrent.TorrentManager, log *zap.SugaredLogger) (*string, error) { - torrents, ok := t.DirectoryMap.Get(directory) +func HandleListTorrents(directory string, torMgr *torrent.TorrentManager, log *zap.SugaredLogger) (*string, error) { + torrents, ok := torMgr.DirectoryMap.Get(directory) if !ok { return nil, fmt.Errorf("cannot find directory %s", directory) } @@ -49,8 +49,8 @@ func HandleListTorrents(directory string, t *torrent.TorrentManager, log *zap.Su return &htmlDoc, nil } -func HandleListFiles(directory, torrentName string, t *torrent.TorrentManager, log *zap.SugaredLogger) (*string, error) { - torrents, ok := t.DirectoryMap.Get(directory) +func HandleListFiles(directory, torrentName string, torMgr *torrent.TorrentManager, log *zap.SugaredLogger) (*string, error) { + torrents, ok := torMgr.DirectoryMap.Get(directory) if !ok { return nil, fmt.Errorf("cannot find directory %s", directory) } diff --git a/internal/torrent/manager.go b/internal/torrent/manager.go index ebbdaa0..85e0627 100644 --- a/internal/torrent/manager.go +++ b/internal/torrent/manager.go @@ -131,7 +131,7 @@ func (t *TorrentManager) RefreshTorrents() { t.log.Infof("Fetched info for %d torrents", len(instances)) freshKeys := set.NewStringSet() - oldTorrents, _ := t.DirectoryMap.Get(INT_ALL) + allTorrents, _ := t.DirectoryMap.Get(INT_ALL) noInfoCount := 0 for info := range infoChan { if info == nil { @@ -139,14 +139,14 @@ func (t *TorrentManager) RefreshTorrents() { continue } freshKeys.Add(info.AccessKey) - if torrent, exists := oldTorrents.Get(info.AccessKey); !exists { - oldTorrents.Set(info.AccessKey, info) + if torrent, exists := allTorrents.Get(info.AccessKey); !exists { + allTorrents.Set(info.AccessKey, info) } else if !strset.Difference(info.DownloadedIDs, torrent.DownloadedIDs).IsEmpty() { mainTorrent := t.mergeToMain(torrent, info) - oldTorrents.Set(info.AccessKey, &mainTorrent) + allTorrents.Set(info.AccessKey, &mainTorrent) } } - t.log.Infof("Compiled into %d torrents, %d were missing info", oldTorrents.Count(), noInfoCount) + t.log.Infof("Compiled into %d torrents, %d were missing info", allTorrents.Count(), noInfoCount) // removed strset.Difference(t.accessKeySet, freshKeys).Each(func(accessKey string) bool { @@ -156,6 +156,11 @@ func (t *TorrentManager) RefreshTorrents() { // new strset.Difference(freshKeys, t.accessKeySet).Each(func(accessKey string) bool { t.accessKeySet.Add(accessKey) + tor, _ := allTorrents.Get(accessKey) + t.AssignedDirectoryCb(tor, func(directory string) { + torrents, _ := t.DirectoryMap.Get(directory) + torrents.Set(accessKey, tor) + }) return true }) diff --git a/internal/universal/head.go b/internal/universal/head.go index 5b34761..3b11268 100644 --- a/internal/universal/head.go +++ b/internal/universal/head.go @@ -10,9 +10,9 @@ import ( "go.uber.org/zap" ) -func HandleHeadRequest(directory, torrentName, fileName string, w http.ResponseWriter, req *http.Request, t *torrent.TorrentManager, log *zap.SugaredLogger) { +func HandleHeadRequest(directory, torrentName, fileName string, w http.ResponseWriter, req *http.Request, torMgr *torrent.TorrentManager, log *zap.SugaredLogger) { - torrents, ok := t.DirectoryMap.Get(directory) + torrents, ok := torMgr.DirectoryMap.Get(directory) if !ok { log.Warnf("Cannot find directory %s", directory) http.Error(w, "File not found", http.StatusNotFound)