diff --git a/cmd/zurg/main.go b/cmd/zurg/main.go index 33b70c0..6224959 100644 --- a/cmd/zurg/main.go +++ b/cmd/zurg/main.go @@ -3,7 +3,6 @@ package main import ( "log" "net/http" - "os" "github.com/debridmediamanager.com/zurg/internal/config" "github.com/debridmediamanager.com/zurg/internal/dav" @@ -16,7 +15,7 @@ func main() { log.Panicf("Config failed to load: %v", cErr) } - t := torrent.NewTorrentManager(os.Getenv("RD_TOKEN"), c) + t := torrent.NewTorrentManager(c) // app := aero.New() // dav.Setup(app, c, t) diff --git a/internal/config/load.go b/internal/config/load.go index 9b2cf15..24b792a 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -9,6 +9,7 @@ import ( type ConfigInterface interface { GetVersion() string + GetToken() string GetDirectories() []string MeetsConditions(directory, fileID, fileName string) bool } diff --git a/internal/config/types.go b/internal/config/types.go index 77afb9a..5f4c348 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -2,4 +2,5 @@ package config type ZurgConfig struct { Version string `yaml:"zurg"` + Token string `yaml:"token"` } diff --git a/internal/config/v1.go b/internal/config/v1.go index 905b7c6..b5b637f 100644 --- a/internal/config/v1.go +++ b/internal/config/v1.go @@ -20,6 +20,10 @@ func (z *ZurgConfigV1) GetVersion() string { return "v1" } +func (z *ZurgConfigV1) GetToken() string { + return z.Token +} + func (z *ZurgConfigV1) GetDirectories() []string { var rootDirectories []string for directory := range z.Directories { diff --git a/internal/dav/aero.go b/internal/dav/aero.go index 6027877..6715831 100644 --- a/internal/dav/aero.go +++ b/internal/dav/aero.go @@ -5,7 +5,6 @@ import ( "fmt" "log" "net/http" - "os" "strings" "github.com/aerogo/aero" @@ -87,7 +86,7 @@ func Setup(app *aero.Application, c config.ConfigInterface, t *torrent.TorrentMa } unrestrictFn := func() (*realdebrid.UnrestrictResponse, error) { - return realdebrid.UnrestrictLink(os.Getenv("RD_TOKEN"), link) + return realdebrid.UnrestrictLink(c.GetToken(), link) } resp := realdebrid.RetryUntilOk(unrestrictFn) if resp == nil { diff --git a/internal/dav/getfile.go b/internal/dav/getfile.go index 7069c10..a5aa36c 100644 --- a/internal/dav/getfile.go +++ b/internal/dav/getfile.go @@ -4,18 +4,18 @@ import ( "fmt" "log" "net/http" - "os" "path" "path/filepath" "strings" + "github.com/debridmediamanager.com/zurg/internal/config" "github.com/debridmediamanager.com/zurg/internal/torrent" "github.com/debridmediamanager.com/zurg/pkg/davextra" "github.com/debridmediamanager.com/zurg/pkg/realdebrid" ) // HandleGetRequest handles a GET request to a file -func HandleGetRequest(w http.ResponseWriter, r *http.Request, t *torrent.TorrentManager) { +func HandleGetRequest(w http.ResponseWriter, r *http.Request, t *torrent.TorrentManager, c config.ConfigInterface) { requestPath := path.Clean(r.URL.Path) segments := strings.Split(requestPath, "/") @@ -48,13 +48,15 @@ func HandleGetRequest(w http.ResponseWriter, r *http.Request, t *torrent.Torrent } unrestrictFn := func() (*realdebrid.UnrestrictResponse, error) { - return realdebrid.UnrestrictLink(os.Getenv("RD_TOKEN"), link) + return realdebrid.UnrestrictLink(c.GetToken(), link) } resp := realdebrid.RetryUntilOk(unrestrictFn) if resp == nil { // TODO: Readd the file // when unrestricting fails, it means the file is not available anymore, but still in their database // if it's the only file, tough luck + // 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) http.Error(w, "Cannot find file", http.StatusNotFound) return diff --git a/internal/dav/router.go b/internal/dav/router.go index 625616c..d4a840e 100644 --- a/internal/dav/router.go +++ b/internal/dav/router.go @@ -16,7 +16,7 @@ func Router(mux *http.ServeMux, c config.ConfigInterface, t *torrent.TorrentMana HandlePropfindRequest(w, r, t, c) case http.MethodGet: - HandleGetRequest(w, r, t) + HandleGetRequest(w, r, t, c) case http.MethodOptions: w.WriteHeader(http.StatusOK) diff --git a/internal/torrent/manager.go b/internal/torrent/manager.go index 0f22dff..2623caa 100644 --- a/internal/torrent/manager.go +++ b/internal/torrent/manager.go @@ -45,9 +45,9 @@ func (handler *TorrentManager) refreshTorrents() { // NewTorrentManager creates a new torrent manager // it will fetch all torrents and their info in the background // and store them in-memory -func NewTorrentManager(token string, config config.ConfigInterface) *TorrentManager { +func NewTorrentManager(config config.ConfigInterface) *TorrentManager { handler := &TorrentManager{ - token: token, + token: config.GetToken(), workerPool: make(chan bool, 10), config: config, } diff --git a/pkg/realdebrid/api.go b/pkg/realdebrid/api.go index 913afc3..bd24253 100644 --- a/pkg/realdebrid/api.go +++ b/pkg/realdebrid/api.go @@ -81,10 +81,10 @@ func UnrestrictLink(accessToken, link string) (*UnrestrictResponse, error) { return nil, err } - if canFetchFirstByte(response.Download) { - return &response, nil + if !canFetchFirstByte(response.Download) { + return nil, fmt.Errorf("can't fetch first byte") } - return nil, fmt.Errorf("can't fetch first byte") + return &response, nil } func canFetchFirstByte(url string) bool { @@ -108,19 +108,14 @@ func canFetchFirstByte(url string) bool { if resp.StatusCode == http.StatusPartialContent { buffer := make([]byte, 1) _, err := resp.Body.Read(buffer) - if err != nil { - return false - } - return true + return err == nil } // If server doesn't support partial content, try reading the first byte and immediately close buffer := make([]byte, 1) - _, err = io.ReadFull(resp.Body, buffer) - if err != nil { - return false - } - return true + _, err = resp.Body.Read(buffer) + resp.Body.Close() // Close immediately after reading + return err == nil } // GetTorrents returns all torrents, paginated