From bcf0f5c93706e2bee07d8baebd855b9499f75d26 Mon Sep 17 00:00:00 2001 From: Nick Szaunig Date: Fri, 2 Oct 2026 06:37:00 +0200 Subject: [PATCH] fix: Medien unabhaengig von Gross- und Kleinschreibung finden Im Container (Linux) wurde z. B. reels/Reel-1.JPG nicht als Vorschaubild erkannt, weil nur exakt reel-1.jpg gesucht wurde. Die Suche vergleicht Dateinamen jetzt ohne Ruecksicht auf die Schreibweise und liefert den echten Dateinamen aus. Gilt fuer Logo, Headerbild, Portraets und Videos. Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/MEDIEN.md | 2 +- src/lib/site-media.ts | 28 +++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/docs/MEDIEN.md b/docs/MEDIEN.md index 37d3d1e..ed4a1f7 100644 --- a/docs/MEDIEN.md +++ b/docs/MEDIEN.md @@ -4,7 +4,7 @@ Logo, Headerbild, Porträts und Reels liegen im Medienverzeichnis. Im Cluster is Lege eine Datei unter dem passenden Namen dort ab, dann erscheint sie beim nächsten Seitenaufruf. Neustart und Deployment sind nicht nötig. Fehlt eine Datei, bleibt der Platzhalter oder das Standardbild sichtbar. -Dateinamen bitte genau so schreiben: alles klein, ohne Leerzeichen und Umlaute. Bei mehreren Endungen nimmt die Seite die erste, die sie findet. +Dateinamen bitte so schreiben: ohne Leerzeichen und Umlaute. Gross- und Kleinschreibung ist egal (`Reel-1.JPG` wird auch erkannt). Bei mehreren Endungen nimmt die Seite die erste, die sie findet. ## Logo diff --git a/src/lib/site-media.ts b/src/lib/site-media.ts index ef02962..24d14f6 100644 --- a/src/lib/site-media.ts +++ b/src/lib/site-media.ts @@ -10,7 +10,7 @@ * Das Aenderungsdatum haengt als ?v=… an der URL: ein ersetztes Bild ist * sofort sichtbar, obwohl /media/… einen Tag lang gecacht wird. */ -import { stat } from "node:fs/promises"; +import { readdir, stat } from "node:fs/promises"; import path from "node:path"; import { site, type Media } from "@/content/site"; import { env } from "./env"; @@ -21,14 +21,32 @@ const VIDEO_EXTS = [".mp4", ".webm"]; type Found = { src: string; ext: string }; +/** + * Sucht "/." ohne Ruecksicht auf Gross- und + * Kleinschreibung: Im Container (Linux) waere "Reel-1.JPG" sonst eine + * andere Datei als "reel-1.jpg". Geliefert wird der echte Dateiname. + */ async function find(base: string, exts: readonly string[]): Promise { - const dir = path.resolve(env().MEDIA_DIR); + const root = path.resolve(env().MEDIA_DIR); + const folder = path.posix.dirname(base); + const name = path.posix.basename(base).toLowerCase(); + const dir = folder === "." ? root : path.join(root, folder); + let entries: string[]; + try { + entries = await readdir(dir); + } catch { + return null; // Ordner fehlt: Platzhalter bleibt. + } for (const ext of exts) { + const match = entries.find((entry) => entry.toLowerCase() === `${name}${ext}`); + if (!match) continue; try { - const info = await stat(path.join(dir, `${base}${ext}`)); - if (info.isFile()) return { src: `/media/${base}${ext}?v=${Math.floor(info.mtimeMs)}`, ext }; + const info = await stat(path.join(dir, match)); + if (!info.isFile()) continue; + const rel = folder === "." ? match : `${folder}/${match}`; + return { src: `/media/${encodeURI(rel)}?v=${Math.floor(info.mtimeMs)}`, ext }; } catch { - // Datei fehlt: naechste Endung probieren. + // Datei zwischenzeitlich entfernt: naechste Endung probieren. } } return null;