From 2385778c80b7f46eb564169baefdb2f653991155 Mon Sep 17 00:00:00 2001 From: Linrador <68631622+Linrador@users.noreply.github.com> Date: Sat, 28 Mar 2026 12:41:17 +0100 Subject: [PATCH] updated --- backend/assets/img/cb.jpg | Bin 0 -> 17934 bytes backend/assets/img/mfc.jpg | Bin 0 -> 7754 bytes backend/preview.go | 110 +++++++++++++++++- .../src/components/ui/FinishedDownloads.tsx | 8 +- frontend/src/components/ui/HoverPopover.tsx | 2 +- 5 files changed, 111 insertions(+), 9 deletions(-) create mode 100644 backend/assets/img/cb.jpg create mode 100644 backend/assets/img/mfc.jpg diff --git a/backend/assets/img/cb.jpg b/backend/assets/img/cb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23fbc8bcfa54a9f9d31a5f0751bcc4a2c6b1f881 GIT binary patch literal 17934 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 literal 0 HcmV?d00001 diff --git a/backend/preview.go b/backend/preview.go index 9c15574..91ca494 100644 --- a/backend/preview.go +++ b/backend/preview.go @@ -6,6 +6,7 @@ import ( "bytes" "context" "crypto/sha1" + "embed" "encoding/hex" "encoding/json" "errors" @@ -58,6 +59,9 @@ func setCoverModelStore(s *ModelStore) { coverModelStore = s } var errCoverNotSupported = errors.New("cover not supported") +//go:embed assets/img/cb.jpg assets/img/mfc.jpg +var embeddedFallbackImages embed.FS + // ============================================================ // Covers: generated/covers/. + info.json // Routes: @@ -1501,6 +1505,99 @@ func serveLivePreviewJPGBytes(w http.ResponseWriter, b []byte) { _, _ = w.Write(b) } +func detectPreviewProvider(job *RecordJob, outPath string) string { + if job != nil { + sourceURL := strings.ToLower(strings.TrimSpace(job.SourceURL)) + + switch { + case strings.Contains(sourceURL, "chaturbate.com"): + return "chaturbate" + case strings.Contains(sourceURL, "myfreecams.com"): + return "mfc" + } + } + + modelKey := strings.TrimSpace(inferModelFromThumbLike(outPath)) + if modelKey == "" || coverModelStore == nil { + return "" + } + modelKey = strings.ToLower(modelKey) + + models := coverModelStore.List() + for _, m := range models { + if strings.ToLower(strings.TrimSpace(m.ModelKey)) != modelKey { + continue + } + + host := strings.ToLower(strings.TrimSpace(m.Host)) + input := strings.ToLower(strings.TrimSpace(m.Input)) + + switch { + case strings.Contains(host, "chaturbate"), strings.Contains(input, "chaturbate.com"): + return "chaturbate" + case strings.Contains(host, "myfreecams"), strings.Contains(input, "myfreecams.com"): + return "mfc" + } + } + + return "" +} + +func fallbackPreviewImageAssetPathForProvider(provider string) (string, error) { + switch strings.ToLower(strings.TrimSpace(provider)) { + case "chaturbate": + return "assets/img/cb.jpg", nil + case "mfc": + return "assets/img/mfc.jpg", nil + default: + return "", fmt.Errorf("unknown provider") + } +} + +func serveFallbackPreviewImage(w http.ResponseWriter, r *http.Request, job *RecordJob, outPath string) bool { + provider := detectPreviewProvider(job, outPath) + if provider == "" { + return false + } + + assetPath, err := fallbackPreviewImageAssetPathForProvider(provider) + if err != nil { + return false + } + + b, err := embeddedFallbackImages.ReadFile(assetPath) + if err != nil || len(b) == 0 { + return false + } + + ext := strings.ToLower(filepath.Ext(assetPath)) + switch ext { + case ".png": + w.Header().Set("Content-Type", "image/png") + default: + w.Header().Set("Content-Type", "image/jpeg") + } + + w.Header().Set("Cache-Control", "public, max-age=60") + w.Header().Set("X-Content-Type-Options", "nosniff") + + if r.Method == http.MethodHead { + w.WriteHeader(http.StatusOK) + return true + } + + w.WriteHeader(http.StatusOK) + _, _ = w.Write(b) + return true +} + +func serveProviderFallbackOrStatus(w http.ResponseWriter, r *http.Request, job *RecordJob, outPath string, label string, status int) { + if serveFallbackPreviewImage(w, r, job, outPath) { + return + } + servePreviewStatusSVG(w, label, status) +} + func servePreviewJPGAlias(w http.ResponseWriter, r *http.Request, id string) { jobsMu.Lock() job := jobs[id] @@ -1531,7 +1628,7 @@ func servePreviewJPGAlias(w http.ResponseWriter, r *http.Request, id string) { } } - servePreviewStatusSVG(w, "Preview", http.StatusOK) + serveProviderFallbackOrStatus(w, r, job, job.Output, "Preview", http.StatusOK) return } @@ -1649,15 +1746,15 @@ func recordPreviewWithBase(w http.ResponseWriter, r *http.Request, basePath stri jobsMu.Unlock() if state == "private" { - servePreviewStatusSVG(w, "Private", http.StatusOK) + serveProviderFallbackOrStatus(w, r, job, job.Output, "Private", http.StatusOK) return } if state == "offline" { - servePreviewStatusSVG(w, "Offline", http.StatusOK) + serveProviderFallbackOrStatus(w, r, job, job.Output, "Offline", http.StatusOK) return } - servePreviewStatusSVG(w, "Preview", http.StatusOK) + serveProviderFallbackOrStatus(w, r, job, job.Output, "Preview", http.StatusOK) return } @@ -1792,6 +1889,11 @@ func servePreviewForFinishedFile(w http.ResponseWriter, r *http.Request, id stri return } + // Wenn noch kein generiertes preview.jpg existiert, Provider-Fallbackbild liefern + if serveFallbackPreviewImage(w, r, nil, outPath) { + return + } + genCtx, cancel := context.WithTimeout(r.Context(), 30*time.Second) defer cancel() diff --git a/frontend/src/components/ui/FinishedDownloads.tsx b/frontend/src/components/ui/FinishedDownloads.tsx index 0f146de..da642fd 100644 --- a/frontend/src/components/ui/FinishedDownloads.tsx +++ b/frontend/src/components/ui/FinishedDownloads.tsx @@ -28,7 +28,7 @@ import { AdjustmentsHorizontalIcon, CheckCircleIcon, ExclamationTriangleIcon, - SparklesIcon, + ClockIcon, CheckIcon, XMarkIcon, ArchiveBoxIcon, @@ -1146,7 +1146,7 @@ export function renderFinishedPostworkBadge( {summary.state === 'running' ? ( ) : summary.state === 'queued' ? ( - + ) : summary.state === 'done' ? ( ) : summary.state === 'error' ? ( @@ -1162,7 +1162,7 @@ export function renderFinishedPostworkBadge( {summary.state === 'running' ? ( ) : summary.state === 'queued' ? ( - + ) : summary.state === 'done' ? ( ) : summary.state === 'error' ? ( @@ -1208,7 +1208,7 @@ export function renderFinishedPostworkBadge( ) : step.state === 'queued' ? ( <> - + {typeof step.position === 'number' && step.position > 0 ? `Wartet #${step.position}` diff --git a/frontend/src/components/ui/HoverPopover.tsx b/frontend/src/components/ui/HoverPopover.tsx index a177269..3f9eefe 100644 --- a/frontend/src/components/ui/HoverPopover.tsx +++ b/frontend/src/components/ui/HoverPopover.tsx @@ -142,7 +142,7 @@ export default function HoverPopover({ children, content }: HoverPopoverProps) { createPortal(