fix: Medien unabhaengig von Gross- und Kleinschreibung finden
Docker-Images bauen und veroeffentlichen / build-and-push (push) Successful in 2m53s
Docker-Images bauen und veroeffentlichen / build-and-push (push) Successful in 2m53s
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) <[email protected]>
This commit is contained in:
1 parent
a37f12a60f
commit
bcf0f5c937
2 files changed
+24
-6
No files matched your search
+1
-1
@@ -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
|
||||
|
||||
|
||||
+23
-5
@@ -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 "<ordner>/<name>.<endung>" 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<Found | null> {
|
||||
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;
|
||||
|
||||
Reference in new issue
Block a user