From 59eb51b37b4feffbb86e703e8dd724b4bea56b64 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 20 Oct 2023 03:04:57 +0200 Subject: [PATCH] proper marking of file as deleted --- cmd/zurg/main.go | 8 +++++++- internal/config/load.go | 1 + internal/config/types.go | 1 + internal/config/v1.go | 4 ++++ internal/config/v1types.go | 2 +- internal/dav/aero.go | 10 ++++++++-- internal/dav/getfile.go | 23 +++++++++++++++-------- internal/torrent/manager.go | 6 ++++++ pkg/realdebrid/api.go | 4 +++- 9 files changed, 46 insertions(+), 13 deletions(-) diff --git a/cmd/zurg/main.go b/cmd/zurg/main.go index 6224959..47d8f46 100644 --- a/cmd/zurg/main.go +++ b/cmd/zurg/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "log" "net/http" @@ -23,5 +24,10 @@ func main() { mux := http.NewServeMux() dav.Router(mux, c, t) - http.ListenAndServe(":8123", mux) + addr := fmt.Sprintf(":%s", c.GetPort()) + log.Printf("Starting server on %s\n", addr) + err := http.ListenAndServe(addr, mux) + if err != nil { + log.Panicf("Failed to start server: %v", err) + } } diff --git a/internal/config/load.go b/internal/config/load.go index 24b792a..ec47b17 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -10,6 +10,7 @@ import ( type ConfigInterface interface { GetVersion() string GetToken() string + GetPort() string GetDirectories() []string MeetsConditions(directory, fileID, fileName string) bool } diff --git a/internal/config/types.go b/internal/config/types.go index 5f4c348..e978a25 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -3,4 +3,5 @@ package config type ZurgConfig struct { Version string `yaml:"zurg"` Token string `yaml:"token"` + Port string `yaml:"port"` } diff --git a/internal/config/v1.go b/internal/config/v1.go index b5b637f..a6d949f 100644 --- a/internal/config/v1.go +++ b/internal/config/v1.go @@ -24,6 +24,10 @@ func (z *ZurgConfigV1) GetToken() string { return z.Token } +func (z *ZurgConfigV1) GetPort() string { + return z.Port +} + func (z *ZurgConfigV1) GetDirectories() []string { var rootDirectories []string for directory := range z.Directories { diff --git a/internal/config/v1types.go b/internal/config/v1types.go index 0f2e769..cfb2f94 100644 --- a/internal/config/v1types.go +++ b/internal/config/v1types.go @@ -1,7 +1,7 @@ package config type ZurgConfigV1 struct { - ZurgConfig + ZurgConfig `yaml:",inline"` Directories map[string]*DirectoryFilterConditionsV1 `yaml:"directories"` } type DirectoryFilterConditionsV1 struct { diff --git a/internal/dav/aero.go b/internal/dav/aero.go index 6715831..f423b0f 100644 --- a/internal/dav/aero.go +++ b/internal/dav/aero.go @@ -79,11 +79,16 @@ func Setup(app *aero.Application, c config.ConfigInterface, t *torrent.TorrentMa } filenameV2, linkFragment := davextra.ExtractLinkFragment(filename) - link := getLink(torrents, filenameV2, linkFragment) - if link == "" { + torrent, file := getFile(torrents, filenameV2, linkFragment) + if file == nil { + log.Println("Cannot find file", filename) + return ctx.Error(http.StatusNotFound, "Cannot find file") + } + if file.Link == "" { log.Println("Link not found", filename) return ctx.Error(http.StatusNotFound, "Cannot find file") } + link := file.Link unrestrictFn := func() (*realdebrid.UnrestrictResponse, error) { return realdebrid.UnrestrictLink(c.GetToken(), link) @@ -94,6 +99,7 @@ func Setup(app *aero.Application, c config.ConfigInterface, t *torrent.TorrentMa // when unrestricting fails, it means the file is not available anymore // if it's the only file, tough luck log.Println("Cannot unrestrict link", link, filenameV2) + t.MarkFileAsDeleted(torrent, file) return ctx.Error(http.StatusNotFound, "Cannot find file") } if resp.Filename != filenameV2 { diff --git a/internal/dav/getfile.go b/internal/dav/getfile.go index a5aa36c..68a911a 100644 --- a/internal/dav/getfile.go +++ b/internal/dav/getfile.go @@ -40,12 +40,18 @@ func HandleGetRequest(w http.ResponseWriter, r *http.Request, t *torrent.Torrent } filenameV2, linkFragment := davextra.ExtractLinkFragment(filename) - link := getLink(torrents, filenameV2, linkFragment) - if link == "" { + torrent, file := getFile(torrents, filenameV2, linkFragment) + if file == nil { + log.Println("Cannot find file", filename) + http.Error(w, "Cannot find file", http.StatusNotFound) + return + } + if file.Link == "" { log.Println("Link not found", filename) http.Error(w, "Cannot find file", http.StatusNotFound) return } + link := file.Link unrestrictFn := func() (*realdebrid.UnrestrictResponse, error) { return realdebrid.UnrestrictLink(c.GetToken(), link) @@ -58,6 +64,7 @@ func HandleGetRequest(w http.ResponseWriter, r *http.Request, t *torrent.Torrent // if it's the only file, try to readd it // delete the old one, add a new one log.Println("Cannot unrestrict link", link, filenameV2) + t.MarkFileAsDeleted(torrent, file) http.Error(w, "Cannot find file", http.StatusNotFound) return } @@ -72,15 +79,15 @@ func HandleGetRequest(w http.ResponseWriter, r *http.Request, t *torrent.Torrent http.Redirect(w, r, resp.Download, http.StatusFound) } -// getLink finds a link by a fragment, it might be wrong -func getLink(torrents []torrent.Torrent, filename, fragment string) string { - for _, torrent := range torrents { - for _, file := range torrent.SelectedFiles { +// getFile finds a link by a fragment, it might be wrong +func getFile(torrents []torrent.Torrent, filename, fragment string) (*torrent.Torrent, *torrent.File) { + for t := range torrents { + for f, file := range torrents[t].SelectedFiles { fname := filepath.Base(file.Path) if filename == fname && strings.HasPrefix(file.Link, fmt.Sprintf("https://real-debrid.com/d/%s", fragment)) { - return file.Link + return &torrents[t], &torrents[t].SelectedFiles[f] } } } - return "" + return nil, nil } diff --git a/internal/torrent/manager.go b/internal/torrent/manager.go index 2623caa..b2feef6 100644 --- a/internal/torrent/manager.go +++ b/internal/torrent/manager.go @@ -254,6 +254,12 @@ func (t *TorrentManager) getInfo(torrentID string) *Torrent { return torrent } +func (t *TorrentManager) MarkFileAsDeleted(torrent *Torrent, file *File) { + log.Println("Marking file as deleted", file.Path) + file.Link = "" + t.writeToFile(torrent.ID, torrent) +} + func (t *TorrentManager) GetInfo(torrentID string) *Torrent { for i := range t.torrents { if t.torrents[i].ID == torrentID { diff --git a/pkg/realdebrid/api.go b/pkg/realdebrid/api.go index bd24253..a002141 100644 --- a/pkg/realdebrid/api.go +++ b/pkg/realdebrid/api.go @@ -110,7 +110,9 @@ func canFetchFirstByte(url string) bool { _, err := resp.Body.Read(buffer) return err == nil } - + if resp.StatusCode != http.StatusOK { + return false + } // If server doesn't support partial content, try reading the first byte and immediately close buffer := make([]byte, 1) _, err = resp.Body.Read(buffer)