up
This commit is contained in:
parent
ebb2db9e39
commit
037d44ed0e
@ -704,6 +704,9 @@ func DetailHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var seriesRegex = regexp.MustCompile(`^(.+?)\.S\d{2}E\d{2}`)
|
||||||
|
|
||||||
|
// HandleAddJobsMultiple gère le débridage de plusieurs liens, auto-création de sous-dossier, et enregistrement
|
||||||
func HandleAddJobsMultiple(db *gorm.DB) http.HandlerFunc {
|
func HandleAddJobsMultiple(db *gorm.DB) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
if err := r.ParseForm(); err != nil {
|
if err := r.ParseForm(); err != nil {
|
||||||
@ -728,18 +731,6 @@ func HandleAddJobsMultiple(db *gorm.DB) http.HandlerFunc {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Création d'un sous-dossier si renseigné
|
|
||||||
sub := strings.TrimSpace(r.FormValue("new_subfolder"))
|
|
||||||
finalDir := basePath.Path
|
|
||||||
if sub != "" {
|
|
||||||
finalDir = filepath.Join(basePath.Path, sanitizeFileName(sub))
|
|
||||||
if err := os.MkdirAll(finalDir, os.ModePerm); err != nil {
|
|
||||||
log.Printf("Erreur création dossier: %v", err)
|
|
||||||
http.Error(w, "Impossible de créer le sous-dossier", http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
client := debridlink.NewClient(db)
|
client := debridlink.NewClient(db)
|
||||||
account := download.GetFirstActiveAccount(client)
|
account := download.GetFirstActiveAccount(client)
|
||||||
if account == nil {
|
if account == nil {
|
||||||
@ -748,31 +739,69 @@ func HandleAddJobsMultiple(db *gorm.DB) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
client.SetAccount(account)
|
client.SetAccount(account)
|
||||||
|
|
||||||
|
// Itérer sur chaque lien à débrider
|
||||||
for _, link := range lines {
|
for _, link := range lines {
|
||||||
link = strings.TrimSpace(link)
|
link = strings.TrimSpace(link)
|
||||||
if link == "" {
|
if link == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// Débride chaque lien
|
|
||||||
|
// Débride le lien
|
||||||
links, err := client.AddLink(context.Background(), link)
|
links, err := client.AddLink(context.Background(), link)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Echec débridage pour %s: %v", link, err)
|
log.Printf("Échec débridage pour %s: %v", link, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, l := range links {
|
for _, l := range links {
|
||||||
// Création transcode si nécessaire
|
// Détermination automatique du sous-dossier via regex
|
||||||
|
name := sanitizeFileName(l.Name)
|
||||||
|
series := ""
|
||||||
|
if m := seriesRegex.FindStringSubmatch(name); len(m) == 2 {
|
||||||
|
series = m[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
// FinalDir selon détection ou création manuelle
|
||||||
|
finalDir := basePath.Path
|
||||||
|
var assignPathID uint = basePath.ID
|
||||||
|
|
||||||
|
if series != "" {
|
||||||
|
// créer sous-dossier pour cette série
|
||||||
|
dirName := sanitizeFileName(series)
|
||||||
|
dirPath := filepath.Join(basePath.Path, dirName)
|
||||||
|
if err := os.MkdirAll(dirPath, os.ModePerm); err != nil {
|
||||||
|
log.Printf("Erreur création dossier série %s: %v", dirName, err)
|
||||||
|
} else {
|
||||||
|
// vérifier/ajouter en base PathDownload
|
||||||
|
var pathRec models.PathDownload
|
||||||
|
if err := db.Where("path = ?", dirPath).First(&pathRec).Error; err != nil {
|
||||||
|
if err == gorm.ErrRecordNotFound {
|
||||||
|
pathRec = models.PathDownload{Name: series, Path: dirPath}
|
||||||
|
if err := db.Create(&pathRec).Error; err != nil {
|
||||||
|
log.Printf("Erreur création PathDownload en base: %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Printf("Erreur lecture PathDownload: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assignPathID = pathRec.ID
|
||||||
|
finalDir = dirPath
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Création transcode si besoin
|
||||||
streamInfo, err := client.CreateTranscode(context.Background(), l.ID)
|
streamInfo, err := client.CreateTranscode(context.Background(), l.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Erreur transcode:", err)
|
log.Println("Erreur transcode:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enregistrement du job
|
||||||
job := &download.DownloadJob{
|
job := &download.DownloadJob{
|
||||||
ID: l.ID,
|
ID: l.ID,
|
||||||
Link: l.DownloadURL,
|
Link: l.DownloadURL,
|
||||||
Name: l.Name,
|
Name: l.Name,
|
||||||
Status: "waiting",
|
Status: "waiting",
|
||||||
PathID: id,
|
PathID: assignPathID,
|
||||||
Size: l.Size,
|
Size: l.Size,
|
||||||
Host: l.Host,
|
Host: l.Host,
|
||||||
Progress: 0,
|
Progress: 0,
|
||||||
@ -793,15 +822,18 @@ func HandleAddJobsMultiple(db *gorm.DB) http.HandlerFunc {
|
|||||||
renderPartial(w, "downloads_table", data)
|
renderPartial(w, "downloads_table", data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sanitizeFileName utilise la même logique que download.SanitizeFileName
|
||||||
|
func sanitizeFileName(name string) string {
|
||||||
|
return download.SanitizeFileName(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// getAllPaths renvoie tous les PathDownload
|
||||||
func getAllPaths(db *gorm.DB) []*models.PathDownload {
|
func getAllPaths(db *gorm.DB) []*models.PathDownload {
|
||||||
var paths []*models.PathDownload
|
var paths []*models.PathDownload
|
||||||
db.Order("name").Find(&paths)
|
db.Order("name").Find(&paths)
|
||||||
return paths
|
return paths
|
||||||
}
|
}
|
||||||
func sanitizeFileName(name string) string {
|
|
||||||
// même regex que download.sanitizeFileName
|
|
||||||
return download.SanitizeFileName(name)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -23,9 +23,7 @@
|
|||||||
|
|
||||||
<!-- Tableau des jobs -->
|
<!-- Tableau des jobs -->
|
||||||
<div id="downloads-table">
|
<div id="downloads-table">
|
||||||
{{ template "downloads_table" . }}
|
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
|
||||||
<div
|
<div
|
||||||
hx-ext="sse"
|
hx-ext="sse"
|
||||||
sse-connect="/api/download/stream"
|
sse-connect="/api/download/stream"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user