From fbe9f306a37d6ca032ceee71d2b93998e403156c Mon Sep 17 00:00:00 2001 From: Linrador <68631622+Linrador@users.noreply.github.com> Date: Tue, 7 Apr 2026 12:16:26 +0200 Subject: [PATCH] updated --- backend/tasks_regenerate_assets.go | 5 -- frontend/src/App.tsx | 7 +- .../src/components/ui/RecorderSettings.tsx | 69 ++++++++++++------- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/backend/tasks_regenerate_assets.go b/backend/tasks_regenerate_assets.go index 4ab4221..de367fb 100644 --- a/backend/tasks_regenerate_assets.go +++ b/backend/tasks_regenerate_assets.go @@ -6,7 +6,6 @@ import ( "context" "encoding/json" "errors" - "fmt" "net/http" "os" "path/filepath" @@ -335,10 +334,6 @@ func runRegenerateAssetsJob(job *regenerateAssetsJob) { failJob := func(queue, phase, msg string) { msg = strings.TrimSpace(msg) - if msg != "" { - fmt.Printf("❌ regenerate-assets error file=%s queue=%s phase=%s error=%s\n", file, queue, phase, msg) - } - if queue != "" && phase != "" { publishFinishedPostworkPhase(file, id, queue, phase, "error", "Fehler", msg) } diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index ded3142..18065ac 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -2102,7 +2102,7 @@ export default function App() { if (alreadyRunning) return true // ✅ Nur Auto-/Silent-Starts: Chaturbate ggf. in Warteschlange statt Sofortstart - if (silent && provider === 'chaturbate' && recSettingsRef.current.useChaturbateApi) { + if (provider === 'chaturbate' && recSettingsRef.current.useChaturbateApi) { try { const parsed = await apiJSON('/api/models/parse', { method: 'POST', @@ -2712,10 +2712,7 @@ export default function App() { }, [playerJob, modelsByKey]) async function onStart() { - const ok = enqueueStart({ - url: sourceUrl, - silent: false, - }) + const ok = await startUrl(sourceUrl, { silent: false }) if (ok) { setSourceUrl('') diff --git a/frontend/src/components/ui/RecorderSettings.tsx b/frontend/src/components/ui/RecorderSettings.tsx index fa67ab9..77cfc89 100644 --- a/frontend/src/components/ui/RecorderSettings.tsx +++ b/frontend/src/components/ui/RecorderSettings.tsx @@ -245,17 +245,26 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) { assetsError.toLowerCase() === 'cancelled' || assetsError.toLowerCase() === 'canceled' - setAssetsTask((t) => ({ - ...t, - status: cancelled ? 'cancelled' : 'error', - title: 'Assets generieren', - text: shortTaskFilename(String(assets.currentFile || assets.text || '')), - done: Number(assets.done ?? 0), - total: Number(assets.total ?? 0), - err: cancelled ? undefined : assetsError, - cancellable: false, - fading: false, - })) + setAssetsTask((t) => { + // Wenn schon idle oder bereits am Ausfaden: nicht wieder "sichtbar reaktivieren" + if (cancelled && (t.status === 'idle' || t.fading)) { + return t + } + + const next: TaskItem = { + ...t, + status: cancelled ? 'cancelled' : 'error', + title: 'Assets generieren', + text: shortTaskFilename(String(assets.currentFile || assets.text || '')), + done: Number(assets.done ?? 0), + total: Number(assets.total ?? 0), + err: cancelled ? undefined : assetsError, + cancellable: false, + fading: t.fading ?? false, + } + + return next + }) } else if (assets?.text || assets?.finishedAt) { setAssetsTask((t) => ({ ...t, @@ -717,25 +726,35 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) { } async function cancelAssetsTask() { - const ac = assetsAbortRef.current - assetsAbortRef.current = null + const ac = assetsAbortRef.current + assetsAbortRef.current = null - // UI sofort - setAssetsTask((t: TaskItem) => ({ ...t, status: 'cancelled', text: 'Abgebrochen.' })) + // UI sofort + setAssetsTask((t: TaskItem) => ({ + ...t, + status: 'cancelled', + title: 'Assets generieren', + text: 'Abgebrochen.', + err: undefined, + cancellable: false, + fading: false, + })) - if (ac) { - ac.abort() - return - } + fadeOutTask(setAssetsTask) - // Fallback (z.B. nach Reload, wenn kein Controller existiert): - try { - await fetch('/api/tasks/generate-assets', { method: 'DELETE', cache: 'no-store' as any }) - } catch { - // ignore - } + if (ac) { + ac.abort() + return } + // Fallback (z.B. nach Reload, wenn kein Controller existiert): + try { + await fetch('/api/tasks/generate-assets', { method: 'DELETE', cache: 'no-store' as any }) + } catch { + // ignore + } +} + async function cancelRegenerateAssetsTask(file: string) { const cleanFile = String(file || '').trim() if (!cleanFile) return