nsfwapp/backend/record_job_progress.go
2026-02-09 14:42:56 +01:00

93 lines
2.1 KiB
Go

package main
import (
"math"
"strings"
)
func setJobProgress(job *RecordJob, phase string, pct int) {
phase = strings.TrimSpace(phase)
phaseLower := strings.ToLower(phase)
// clamp pct 0..100
if pct < 0 {
pct = 0
}
if pct > 100 {
pct = 100
}
// "globale" Zielbereiche pro Phase (dein Pipeline-Modell)
// postwork wartet: 70..72
// remuxing: 72..78
// moving: 78..84
// probe: 84..86
// assets: 86..99
type rng struct{ start, end int }
rangeFor := func(ph string) rng {
switch ph {
case "postwork":
return rng{70, 72}
case "remuxing":
return rng{72, 78}
case "moving":
return rng{78, 84}
case "probe":
return rng{84, 86}
case "assets":
return rng{86, 99}
default:
return rng{0, 100}
}
}
jobsMu.Lock()
defer jobsMu.Unlock()
// Sobald Postwork läuft oder Aufnahme beendet ist -> Recorder darf NICHTS mehr überschreiben.
inPostwork := job.EndedAt != nil || (strings.TrimSpace(job.Phase) != "" && strings.ToLower(strings.TrimSpace(job.Phase)) != "recording")
if inPostwork {
// harte Blockade: alte recording-Updates dürfen weder Phase noch Progress anfassen
if phaseLower == "" || phaseLower == "recording" {
return
}
}
// Phase aktualisieren (aber nur wenn nicht leer)
if phase != "" {
job.Phase = phase
}
// Progress-Logik:
// - wenn wir in Postwork sind und jemand phasenlokale 0..100 liefert (z.B. remuxing 25),
// mappe das in den globalen Bereich der Phase.
// - danach: niemals rückwärts.
mapped := pct
if inPostwork {
r := rangeFor(phaseLower)
if r.start > 0 && r.end >= r.start {
// Wenn pct kleiner ist als unser globaler Einstiegspunkt, interpretieren wir ihn als lokal (0..100)
// und mappen in [start..end].
if pct < r.start {
width := float64(r.end - r.start)
mapped = r.start + int(math.Round((float64(pct)/100.0)*width))
} else {
// Wenn schon "global" geliefert wird, trotzdem in den Bereich begrenzen
if mapped < r.start {
mapped = r.start
}
if mapped > r.end {
mapped = r.end
}
}
}
}
// niemals rückwärts
if mapped < job.Progress {
mapped = job.Progress
}
job.Progress = mapped
}