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
+25
-7
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.
|
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
|
## Logo
|
||||||
|
|
||||||
|
|||||||
+24
-6
@@ -10,7 +10,7 @@
|
|||||||
* Das Aenderungsdatum haengt als ?v=… an der URL: ein ersetztes Bild ist
|
* Das Aenderungsdatum haengt als ?v=… an der URL: ein ersetztes Bild ist
|
||||||
* sofort sichtbar, obwohl /media/… einen Tag lang gecacht wird.
|
* 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 path from "node:path";
|
||||||
import { site, type Media } from "@/content/site";
|
import { site, type Media } from "@/content/site";
|
||||||
import { env } from "./env";
|
import { env } from "./env";
|
||||||
@@ -21,14 +21,32 @@ const VIDEO_EXTS = [".mp4", ".webm"];
|
|||||||
|
|
||||||
type Found = { src: string; ext: string };
|
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> {
|
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);
|
||||||
for (const ext of exts) {
|
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 {
|
try {
|
||||||
const info = await stat(path.join(dir, `${base}${ext}`));
|
entries = await readdir(dir);
|
||||||
if (info.isFile()) return { src: `/media/${base}${ext}?v=${Math.floor(info.mtimeMs)}`, ext };
|
|
||||||
} catch {
|
} catch {
|
||||||
// Datei fehlt: naechste Endung probieren.
|
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, match));
|
||||||
|
if (!info.isFile()) continue;
|
||||||
|
const rel = folder === "." ? match : `${folder}/${match}`;
|
||||||
|
return { src: `/media/${encodeURI(rel)}?v=${Math.floor(info.mtimeMs)}`, ext };
|
||||||
|
} catch {
|
||||||
|
// Datei zwischenzeitlich entfernt: naechste Endung probieren.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
Reference in new issue
Block a user