80 lines
2.0 KiB
Go
80 lines
2.0 KiB
Go
package dav
|
|
|
|
import (
|
|
"path/filepath"
|
|
|
|
"github.com/debridmediamanager.com/zurg/internal/torrent"
|
|
"github.com/debridmediamanager.com/zurg/pkg/dav"
|
|
)
|
|
|
|
// createMultiTorrentResponse creates a WebDAV response for a list of torrents
|
|
func createMultiTorrentResponse(basePath string, torrents []torrent.Torrent) (*dav.MultiStatus, error) {
|
|
var responses []dav.Response
|
|
responses = append(responses, dav.Directory(basePath))
|
|
|
|
seen := make(map[string]bool)
|
|
|
|
for _, item := range torrents {
|
|
if item.Progress != 100 {
|
|
continue
|
|
}
|
|
if _, exists := seen[item.Name]; exists {
|
|
continue
|
|
}
|
|
seen[item.Name] = true
|
|
|
|
path := filepath.Join(basePath, item.Name)
|
|
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 createSingleTorrentResponse(basePath string, torrents []torrent.Torrent) (*dav.MultiStatus, error) {
|
|
var responses []dav.Response
|
|
|
|
// initial response is the directory itself
|
|
currentPath := filepath.Join(basePath, torrents[0].Name)
|
|
responses = append(responses, dav.Directory(currentPath))
|
|
|
|
finalName := make(map[string]bool)
|
|
|
|
var torrentResponses []dav.Response
|
|
|
|
for _, torrent := range torrents {
|
|
for _, file := range torrent.SelectedFiles {
|
|
if file.Link == "" {
|
|
// TODO: fix the file?
|
|
// log.Println("File has no link, skipping (repairing links take time)", file.Path)
|
|
continue
|
|
}
|
|
|
|
filename := filepath.Base(file.Path)
|
|
if finalName[filename] {
|
|
continue
|
|
}
|
|
finalName[filename] = true
|
|
|
|
filePath := filepath.Join(currentPath, filename)
|
|
torrentResponses = append(torrentResponses, dav.File(
|
|
filePath,
|
|
file.Bytes,
|
|
convertRFC3339toRFC1123(torrent.Added),
|
|
file.Link,
|
|
))
|
|
}
|
|
}
|
|
|
|
responses = append(responses, torrentResponses...)
|
|
|
|
return &dav.MultiStatus{
|
|
XMLNS: "DAV:",
|
|
Response: responses,
|
|
}, nil
|
|
}
|