bug en attente de reso

This commit is contained in:
julien 2025-06-13 17:12:32 +02:00
parent e0d753a927
commit 10c265141a
7 changed files with 51 additions and 18 deletions

View File

@ -16,7 +16,7 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
) )
const baseURL = "https://api.debrid-link.com/" const baseURL = "https://debrid-link.com/api/v2/"
type Client struct { type Client struct {
http *http.Client http *http.Client

View File

@ -58,11 +58,11 @@ func RoutesProtected(r *mux.Router, bd *gorm.DB) {
r.HandleFunc("/api/download/all", renders.HandleListJobsPartial(bd)).Methods("GET") r.HandleFunc("/api/download/all", renders.HandleListJobsPartial(bd)).Methods("GET")
r.HandleFunc("/downloads", renders.GoDownload2(bd)) r.HandleFunc("/downloads", renders.GoDownload2(bd))
r.HandleFunc("/stream/{id}", download.HandleStreamPage()).Methods("GET") r.HandleFunc("/stream/{id}", download.HandleStreamPage()).Methods("GET")
r.HandleFunc("/api/download/start/{id}", renders.HandleStartJob(bd)).Methods("POST") 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/pause/{id}", renders.HandlePauseJob).Methods("POST")
r.HandleFunc("/api/download/resume/{id}", renders.HandleResumeJob(bd)).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/delete/{id}", renders.HandleDeleteJob).Methods("DELETE")
// API user // API user
r.HandleFunc("/api/user/create", users.CreateUser(bd)).Methods("POST") r.HandleFunc("/api/user/create", users.CreateUser(bd)).Methods("POST")

View File

@ -305,9 +305,12 @@ func HandleAddJob(db *gorm.DB) http.HandlerFunc {
PathID: uint(parsedID), PathID: uint(parsedID),
Size: l.Size, Size: l.Size,
Host: l.Host, 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) // Met à jour la vue partielle (tableau des jobs)
@ -335,16 +338,30 @@ var (
func HandleStartJob(db *gorm.DB) http.HandlerFunc { func HandleStartJob(db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
id := mux.Vars(r)["id"] id := mux.Vars(r)["id"]
log.Printf("[id] job id= "+id)
// 1. Récupérer depuis la map
jobsMu.Lock() jobsMu.Lock()
job, exists := jobs[id] job, exists := jobs[id]
jobsMu.Unlock() jobsMu.Unlock()
// 2. Sinon fallback base de données
if !exists { if !exists {
http.Error(w, "Job introuvable", http.StatusNotFound) var j download.DownloadJob
return 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) client := debridlink.NewClient(db)
account := download.GetFirstActiveAccount(client) account := download.GetFirstActiveAccount(client)
if account == nil { if account == nil {
@ -353,11 +370,13 @@ func HandleStartJob(db *gorm.DB) http.HandlerFunc {
} }
client.SetAccount(account) 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) w.WriteHeader(http.StatusNoContent)
} }
} }
func HandlePauseJob(w http.ResponseWriter, r *http.Request) { func HandlePauseJob(w http.ResponseWriter, r *http.Request) {
id := mux.Vars(r)["id"] id := mux.Vars(r)["id"]
download.UpdateJobStatus(id, "paused", nil) download.UpdateJobStatus(id, "paused", nil)
@ -367,15 +386,27 @@ func HandleResumeJob(db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
id := mux.Vars(r)["id"] id := mux.Vars(r)["id"]
// 1. Chercher en mémoire
jobsMu.Lock() jobsMu.Lock()
job, exists := jobs[id] job, exists := jobs[id]
jobsMu.Unlock() jobsMu.Unlock()
// 2. Si absent, fallback DB
if !exists { if !exists {
http.Error(w, "Job introuvable", http.StatusNotFound) var j download.DownloadJob
return 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) client := debridlink.NewClient(db)
account := download.GetFirstActiveAccount(client) account := download.GetFirstActiveAccount(client)
if account == nil { if account == nil {
@ -384,10 +415,12 @@ func HandleResumeJob(db *gorm.DB) http.HandlerFunc {
} }
client.SetAccount(account) 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) w.WriteHeader(http.StatusNoContent)
} }
} }
func HandleDeleteJob(w http.ResponseWriter, r *http.Request) { func HandleDeleteJob(w http.ResponseWriter, r *http.Request) {
id := mux.Vars(r)["id"] id := mux.Vars(r)["id"]
download.DeleteJob(id) download.DeleteJob(id)

Binary file not shown.

View File

@ -11,11 +11,11 @@
<tbody> <tbody>
{{ range .jobs }} {{ range .jobs }}
<tr class="border-b {{ if eq .Status "error" }}bg-red-100 text-red-800{{ end }}"> <tr class="border-b {{ if eq .Status "error" }}bg-red-100 text-red-800{{ end }}">
<td class="px-2 py-1 text-sm">{{ .FileName }}</td> <td class="px-2 py-1 text-sm">{{ .Name }}</td>
<td class="px-2 py-1 text-sm">{{ .Status }}</td> <td class="px-2 py-1 text-sm">{{ .Status }}</td>
<td class="px-2 py-1 text-sm">{{ .Speed }}</td> <td class="px-2 py-1 text-sm">{{ .Progress }}</td>
<td class="px-2 py-1 text-sm"> <td class="px-2 py-1 text-sm">
{{ if eq .Status "added" }} {{ if eq .Status "waiting" }}
<button hx-post="/api/download/start/{{ .ID }}" class="text-indigo-600">⬇ Télécharger</button> <button hx-post="/api/download/start/{{ .ID }}" class="text-indigo-600">⬇ Télécharger</button>
{{ end }} {{ end }}
{{ if eq .Status "paused" }} {{ if eq .Status "paused" }}

BIN
tmp/main

Binary file not shown.

View File

@ -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 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