diff --git a/internal/debridlink/client.go b/internal/debridlink/client.go index 7ef7ea2..dd58e37 100644 --- a/internal/debridlink/client.go +++ b/internal/debridlink/client.go @@ -16,7 +16,7 @@ import ( "gorm.io/gorm" ) -const baseURL = "https://api.debrid-link.com/" +const baseURL = "https://debrid-link.com/api/v2/" type Client struct { http *http.Client diff --git a/internal/route/main.go b/internal/route/main.go index 4c10996..8bd5fe2 100644 --- a/internal/route/main.go +++ b/internal/route/main.go @@ -58,11 +58,11 @@ func RoutesProtected(r *mux.Router, bd *gorm.DB) { r.HandleFunc("/api/download/all", renders.HandleListJobsPartial(bd)).Methods("GET") r.HandleFunc("/downloads", renders.GoDownload2(bd)) r.HandleFunc("/stream/{id}", download.HandleStreamPage()).Methods("GET") -r.HandleFunc("/api/download/start/{id}", renders.HandleStartJob(bd)).Methods("POST") -r.HandleFunc("/api/download/pause/{id}", renders.HandlePauseJob).Methods("POST") -r.HandleFunc("/api/download/resume/{id}", renders.HandleResumeJob(bd)).Methods("POST") -r.HandleFunc("/api/download/delete/{id}", renders.HandleDeleteJob).Methods("DELETE") - + r.HandleFunc("/api/download/start/{id}", renders.HandleStartJob(bd)).Methods("POST") + r.HandleFunc("/api/download/pause/{id}", renders.HandlePauseJob).Methods("POST") + r.HandleFunc("/api/download/resume/{id}", renders.HandleResumeJob(bd)).Methods("POST") + r.HandleFunc("/api/download/delete/{id}", renders.HandleDeleteJob).Methods("DELETE") + // API user r.HandleFunc("/api/user/create", users.CreateUser(bd)).Methods("POST") diff --git a/renders/renders.go b/renders/renders.go index 96df969..d4478b6 100644 --- a/renders/renders.go +++ b/renders/renders.go @@ -305,9 +305,12 @@ func HandleAddJob(db *gorm.DB) http.HandlerFunc { PathID: uint(parsedID), Size: l.Size, Host: l.Host, - CreatedAt: time.Now(), + Progress: 0, // obligatoire si valeur attendue + StreamURL: "", // vide par défaut } - download.RegisterJobWithDB(job,db) // => stocke en mémoire ou DB selon ton implémentation + if err := download.RegisterJobWithDB(job, db); err != nil { + log.Printf("[ERROR] Job non enregistré : %v\n", err) + } } // Met à jour la vue partielle (tableau des jobs) @@ -335,16 +338,30 @@ var ( func HandleStartJob(db *gorm.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { id := mux.Vars(r)["id"] + log.Printf("[id] job id= "+id) + // 1. Récupérer depuis la map jobsMu.Lock() job, exists := jobs[id] jobsMu.Unlock() + // 2. Sinon fallback base de données if !exists { - http.Error(w, "Job introuvable", http.StatusNotFound) - return + var j download.DownloadJob + if err := db.First(&j, "id = ?", id).Error; err != nil { + http.Error(w, "Job introuvable", http.StatusNotFound) + return + } + + // important : on copie vers un pointeur pour que la map pointe bien dessus + jobCopy := j + jobsMu.Lock() + jobs[id] = &jobCopy + job = &jobCopy + jobsMu.Unlock() } + // 3. Setup client Debrid-Link client := debridlink.NewClient(db) account := download.GetFirstActiveAccount(client) if account == nil { @@ -353,11 +370,13 @@ func HandleStartJob(db *gorm.DB) http.HandlerFunc { } client.SetAccount(account) - go download.StartDownload(job, job.Link, client, db) + // 4. Lancer le téléchargement réel + go download.StartDownload(job,job.Link,client, db) w.WriteHeader(http.StatusNoContent) } } + func HandlePauseJob(w http.ResponseWriter, r *http.Request) { id := mux.Vars(r)["id"] download.UpdateJobStatus(id, "paused", nil) @@ -367,15 +386,27 @@ func HandleResumeJob(db *gorm.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { id := mux.Vars(r)["id"] + // 1. Chercher en mémoire jobsMu.Lock() job, exists := jobs[id] jobsMu.Unlock() + // 2. Si absent, fallback DB if !exists { - http.Error(w, "Job introuvable", http.StatusNotFound) - return + var j download.DownloadJob + if err := db.First(&j, "id = ?", id).Error; err != nil { + http.Error(w, "Job introuvable", http.StatusNotFound) + return + } + + jobCopy := j + jobsMu.Lock() + jobs[id] = &jobCopy + job = &jobCopy + jobsMu.Unlock() } + // 3. Initialiser le client Debrid-Link client := debridlink.NewClient(db) account := download.GetFirstActiveAccount(client) if account == nil { @@ -384,10 +415,12 @@ func HandleResumeJob(db *gorm.DB) http.HandlerFunc { } client.SetAccount(account) - go download.StartDownload(job, job.Link, client, db) + // 4. Redémarrer le téléchargement + go download.StartDownload(job,job.Link,client,db) w.WriteHeader(http.StatusNoContent) } } + func HandleDeleteJob(w http.ResponseWriter, r *http.Request) { id := mux.Vars(r)["id"] download.DeleteJob(id) diff --git a/shelfly_db.db b/shelfly_db.db index 5ebc959..c5cb33d 100644 Binary files a/shelfly_db.db and b/shelfly_db.db differ diff --git a/templates/downloads_table.pages.tmpl b/templates/downloads_table.pages.tmpl index 8e687da..f2523ef 100644 --- a/templates/downloads_table.pages.tmpl +++ b/templates/downloads_table.pages.tmpl @@ -11,11 +11,11 @@ {{ range .jobs }} - {{ .FileName }} + {{ .Name }} {{ .Status }} - {{ .Speed }} + {{ .Progress }} - {{ if eq .Status "added" }} + {{ if eq .Status "waiting" }} {{ end }} {{ if eq .Status "paused" }} diff --git a/tmp/main b/tmp/main index 8f42ad6..d379cb7 100755 Binary files a/tmp/main and b/tmp/main differ diff --git a/tmp/stdout b/tmp/stdout index 4c65af2..0f5fcea 100644 --- a/tmp/stdout +++ b/tmp/stdout @@ -1 +1 @@ -exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 \ No newline at end of file +exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 \ No newline at end of file