package dav import ( "path/filepath" "github.com/debridmediamanager.com/zurg/internal/torrent" "github.com/debridmediamanager.com/zurg/pkg/dav" "github.com/debridmediamanager.com/zurg/pkg/davextra" ) // createMultiTorrentResponse creates a WebDAV response for a list of torrents func createMultiTorrentResponse(torrents []torrent.Torrent) (*dav.MultiStatus, error) { var responses []dav.Response responses = append(responses, dav.Directory("/torrents")) seen := make(map[string]bool) for _, item := range torrents { if item.Progress != 100 { continue } if _, exists := seen[item.Filename]; exists { continue } seen[item.Filename] = true path := filepath.Join("/torrents", item.Filename) responses = append(responses, dav.Directory(path)) } return &dav.MultiStatus{ XMLNS: "DAV:", Response: responses, }, nil } // createTorrentResponse creates a WebDAV response for a single torrent // but it also handles the case where there are many torrents with the same name func createCombinedTorrentResponse(torrents []torrent.Torrent, t *torrent.TorrentManager) (*dav.MultiStatus, error) { var responses []dav.Response // initial response is the directory itself currentPath := filepath.Join("/torrents", torrents[0].Filename) responses = append(responses, dav.Directory(currentPath)) seen := make(map[string]bool) var torrentResponses []dav.Response for _, torrent := range torrents { for _, file := range torrent.SelectedFiles { filename := filepath.Base(file.Path) fragment := davextra.GetLinkFragment(file.Link) filename = davextra.InsertLinkFragment(filename, fragment) if _, exists := seen[filename]; exists { continue } seen[filename] = true filePath := filepath.Join(currentPath, filename) torrentResponses = append(torrentResponses, dav.File( filePath, file.Bytes, convertDate(torrent.Added), file.Link, )) } } responses = append(responses, torrentResponses...) return &dav.MultiStatus{ XMLNS: "DAV:", Response: responses, }, nil }