Serve downloads list

This commit is contained in:
Ben Sarmiento
2024-01-07 23:44:26 +01:00
parent 57e6b0b860
commit 62de3723c1
4 changed files with 68 additions and 2 deletions

View File

@@ -22,6 +22,7 @@ func ServeRootDirectoryForInfuse(torMgr *torrent.TorrentManager) ([]byte, error)
} }
buf.WriteString(dav.BaseDirectory(directory, "")) buf.WriteString(dav.BaseDirectory(directory, ""))
} }
buf.WriteString(dav.BaseDirectory(config.DOWNLOADS, ""))
buf.WriteString("</d:multistatus>") buf.WriteString("</d:multistatus>")
return buf.Bytes(), nil return buf.Bytes(), nil
} }
@@ -86,3 +87,17 @@ func ServeFilesListForInfuse(directory, torrentName string, torMgr *torrent.Torr
buf.WriteString("</d:multistatus>") buf.WriteString("</d:multistatus>")
return buf.Bytes(), nil return buf.Bytes(), nil
} }
func ServeDownloadsListForInfuse(torMgr *torrent.TorrentManager) ([]byte, error) {
var buf bytes.Buffer
if !torMgr.Config.GetConfig().UseDownloadCache {
buf.WriteString("Enable download cache in config to use this feature")
return buf.Bytes(), nil
}
buf.WriteString("<?xml version=\"1.0\" encoding=\"utf-8\"?><d:multistatus xmlns:d=\"DAV:\">")
for _, download := range torMgr.DownloadCache.Items() {
buf.WriteString(dav.File(download.Filename, download.Filesize, download.Generated))
}
buf.WriteString("</d:multistatus>")
return buf.Bytes(), nil
}

View File

@@ -24,6 +24,7 @@ func ServeRootDirectory(torMgr *torrent.TorrentManager) ([]byte, error) {
} }
buf.WriteString(dav.Directory(directory, "")) buf.WriteString(dav.Directory(directory, ""))
} }
buf.WriteString(dav.Directory(config.DOWNLOADS, ""))
buf.WriteString("</d:multistatus>") buf.WriteString("</d:multistatus>")
return buf.Bytes(), nil return buf.Bytes(), nil
} }
@@ -112,3 +113,18 @@ func HandleSingleFile(directory, torrentName, fileName string, torMgr *torrent.T
buf.WriteString("</d:multistatus>") buf.WriteString("</d:multistatus>")
return buf.Bytes(), nil return buf.Bytes(), nil
} }
func ServeDownloadsList(torMgr *torrent.TorrentManager) ([]byte, error) {
var buf bytes.Buffer
if !torMgr.Config.GetConfig().UseDownloadCache {
buf.WriteString("Enable download cache in config to use this feature")
return buf.Bytes(), nil
}
buf.WriteString("<?xml version=\"1.0\" encoding=\"utf-8\"?><d:multistatus xmlns:d=\"DAV:\">")
buf.WriteString(dav.BaseDirectory(config.DOWNLOADS, ""))
for _, download := range torMgr.DownloadCache.Items() {
buf.WriteString(dav.File(download.Filename, download.Filesize, download.Generated))
}
buf.WriteString("</d:multistatus>")
return buf.Bytes(), nil
}

View File

@@ -57,6 +57,10 @@ func ApplyRouteTable(router *httprouter.Router, getfile *universal.GetFile, torM
router.GET("/dav/", zr.davRootHandler) router.GET("/dav/", zr.davRootHandler)
router.GET("/dav/:directory/", zr.davTorrentsListHandler) router.GET("/dav/:directory/", zr.davTorrentsListHandler)
router.GET("/dav/:directory/:torrent/", zr.davFilesListHandler) router.GET("/dav/:directory/:torrent/", zr.davFilesListHandler)
// EXTRA: for browser handling of infuse
router.GET("/infuse/", zr.infuseDavRootHandler)
router.GET("/infuse/:directory/", zr.infuseDavTorrentsListHandler)
router.GET("/infuse/:directory/:torrent/", zr.infuseDavFilesListHandler)
// DELETE routes // DELETE routes
router.DELETE("/dav/:directory/:torrent/", zr.deleteTorrentHandler) router.DELETE("/dav/:directory/:torrent/", zr.deleteTorrentHandler)
router.DELETE("/dav/:directory/:torrent/:file", zr.deleteFileHandler) router.DELETE("/dav/:directory/:torrent/:file", zr.deleteFileHandler)
@@ -129,11 +133,25 @@ func (zr *ZurgRouter) httpTorrentsListHandler(resp http.ResponseWriter, req *htt
} }
func (zr *ZurgRouter) davTorrentsListHandler(resp http.ResponseWriter, req *http.Request, params httprouter.Params) { func (zr *ZurgRouter) davTorrentsListHandler(resp http.ResponseWriter, req *http.Request, params httprouter.Params) {
zr.handleTorrentsListRequest(resp, req, params, dav.ServeTorrentsList, "text/xml; charset=\"utf-8\"") directory := params.ByName("directory")
handlerFunc := dav.ServeTorrentsList
if directory == config.DOWNLOADS {
handlerFunc = func(_ string, torMgr *torrent.TorrentManager) ([]byte, error) {
return dav.ServeDownloadsList(torMgr)
}
}
zr.handleTorrentsListRequest(resp, req, params, handlerFunc, "text/xml; charset=\"utf-8\"")
} }
func (zr *ZurgRouter) infuseDavTorrentsListHandler(resp http.ResponseWriter, req *http.Request, params httprouter.Params) { func (zr *ZurgRouter) infuseDavTorrentsListHandler(resp http.ResponseWriter, req *http.Request, params httprouter.Params) {
zr.handleTorrentsListRequest(resp, req, params, dav.ServeTorrentsListForInfuse, "text/xml; charset=\"utf-8\"") directory := params.ByName("directory")
handlerFunc := dav.ServeTorrentsListForInfuse
if directory == config.DOWNLOADS {
handlerFunc = func(_ string, torMgr *torrent.TorrentManager) ([]byte, error) {
return dav.ServeDownloadsListForInfuse(torMgr)
}
}
zr.handleTorrentsListRequest(resp, req, params, handlerFunc, "text/xml; charset=\"utf-8\"")
} }
func (zr *ZurgRouter) handleFilesListRequest(resp http.ResponseWriter, req *http.Request, params httprouter.Params, handleFunc func(string, string, *torrent.TorrentManager) ([]byte, error), contentType string) { func (zr *ZurgRouter) handleFilesListRequest(resp http.ResponseWriter, req *http.Request, params httprouter.Params, handleFunc func(string, string, *torrent.TorrentManager) ([]byte, error), contentType string) {
@@ -158,6 +176,7 @@ func (zr *ZurgRouter) davFilesListHandler(resp http.ResponseWriter, req *http.Re
} }
func (zr *ZurgRouter) infuseDavFilesListHandler(resp http.ResponseWriter, req *http.Request, params httprouter.Params) { func (zr *ZurgRouter) infuseDavFilesListHandler(resp http.ResponseWriter, req *http.Request, params httprouter.Params) {
fmt.Println(">>>>>>>>>>>>>>>>>>> infuseDavFilesListHandler", params.ByName("directory"), params.ByName("torrent"))
zr.handleFilesListRequest(resp, req, params, dav.ServeFilesListForInfuse, "text/xml; charset=\"utf-8\"") zr.handleFilesListRequest(resp, req, params, dav.ServeFilesListForInfuse, "text/xml; charset=\"utf-8\"")
} }

View File

@@ -22,6 +22,22 @@ type Download struct {
Host string `json:"host"` // Host main domain Host string `json:"host"` // Host main domain
Download string `json:"download"` // Generated link Download string `json:"download"` // Generated link
Streamable int `json:"streamable"` Streamable int `json:"streamable"`
Generated string `json:"-"` // jsonDate
}
func (d *Download) UnmarshalJSON(data []byte) error {
type Alias Download
aux := &struct {
Generated string `json:"generated"`
*Alias
}{
Alias: (*Alias)(d),
}
if err := json.Unmarshal(data, &aux); err != nil {
return err
}
d.Generated = strings.Replace(aux.Generated, "Z", "+01:00", 1)
return nil
} }
type Torrent struct { type Torrent struct {