Verify downloads

This commit is contained in:
Ben Sarmiento
2023-12-08 14:38:49 +01:00
parent 62bfa375ca
commit 4dcd2e64bb
2 changed files with 23 additions and 3 deletions

View File

@@ -19,6 +19,7 @@ type ConfigInterface interface {
EnableRetainRDTorrentName() bool EnableRetainRDTorrentName() bool
GetRandomPreferredHost() string GetRandomPreferredHost() string
ShouldServeFromRclone() bool ShouldServeFromRclone() bool
ShouldVerifyDownloadLink() bool
ShouldForceIPv6() bool ShouldForceIPv6() bool
GetRealDebridTimeout() int GetRealDebridTimeout() int
GetRetriesUntilFailed() int GetRetriesUntilFailed() int
@@ -49,6 +50,7 @@ type ZurgConfig struct {
PreferredHosts []string `yaml:"preferred_hosts" json:"preferred_hosts"` PreferredHosts []string `yaml:"preferred_hosts" json:"preferred_hosts"`
NetworkBufferSize int `yaml:"network_buffer_size" json:"network_buffer_size"` NetworkBufferSize int `yaml:"network_buffer_size" json:"network_buffer_size"`
ServeFromRclone bool `yaml:"serve_from_rclone" json:"serve_from_rclone"` ServeFromRclone bool `yaml:"serve_from_rclone" json:"serve_from_rclone"`
VerifyDownloadLink bool `yaml:"verify_download_link" json:"verify_download_link"`
ForceIPv6 bool `yaml:"force_ipv6" json:"force_ipv6"` ForceIPv6 bool `yaml:"force_ipv6" json:"force_ipv6"`
OnLibraryUpdate string `yaml:"on_library_update" json:"on_library_update"` OnLibraryUpdate string `yaml:"on_library_update" json:"on_library_update"`
@@ -125,6 +127,10 @@ func (z *ZurgConfig) ShouldServeFromRclone() bool {
return z.ServeFromRclone return z.ServeFromRclone
} }
func (z *ZurgConfig) ShouldVerifyDownloadLink() bool {
return z.VerifyDownloadLink
}
func (z *ZurgConfig) ShouldForceIPv6() bool { func (z *ZurgConfig) ShouldForceIPv6() bool {
return z.ForceIPv6 return z.ForceIPv6
} }

View File

@@ -54,9 +54,16 @@ func (gf *GetFile) HandleGetRequest(directory, torrentName, fileName string, res
link := file.Link link := file.Link
if download, exists := torMgr.DownloadCache.Get(link); exists { if download, exists := torMgr.DownloadCache.Get(link); exists {
if cfg.ShouldServeFromRclone() && torMgr.Api.CanFetchFirstByte(download.Download) { if cfg.ShouldServeFromRclone() {
redirect(resp, req, download.Download, cfg) if cfg.ShouldVerifyDownloadLink() {
return if torMgr.Api.CanFetchFirstByte(download.Download) {
redirect(resp, req, download.Download, cfg)
return
}
} else {
redirect(resp, req, download.Download, cfg)
return
}
} else { } else {
err := gf.streamCachedLinkToResponse(download.Download, resp, req, torMgr, cfg, log) err := gf.streamCachedLinkToResponse(download.Download, resp, req, torMgr, cfg, log)
if err == nil { if err == nil {
@@ -93,6 +100,13 @@ func (gf *GetFile) HandleGetRequest(directory, torrentName, fileName string, res
} }
torMgr.DownloadCache.Set(link, unrestrict) torMgr.DownloadCache.Set(link, unrestrict)
if cfg.ShouldServeFromRclone() { if cfg.ShouldServeFromRclone() {
if cfg.ShouldVerifyDownloadLink() {
if !torMgr.Api.CanFetchFirstByte(unrestrict.Download) {
log.Warnf("File %s is not available", fileName)
http.Error(resp, "File is not available", http.StatusNotFound)
return
}
}
redirect(resp, req, unrestrict.Download, cfg) redirect(resp, req, unrestrict.Download, cfg)
} else { } else {
gf.streamFileToResponse(torrent, file, unrestrict, resp, req, torMgr, cfg, log) gf.streamFileToResponse(torrent, file, unrestrict, resp, req, torMgr, cfg, log)