From f8d247fcceb83a4ca2d11ddca798945295e19ca1 Mon Sep 17 00:00:00 2001 From: Till Heidrich Date: Tue, 1 Sep 2026 02:17:17 +0000 Subject: [PATCH] docs: unique filenames in changelog, help page, README and llms.txt Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01BNhLunz586g6DeYMa7Qsd1 --- CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++++ README.md | 7 ++++++- src/pages/anleitung.astro | 14 ++++++++++++++ src/pages/changelog.astro | 22 ++++++++++++++++++++++ src/pages/llms.txt.ts | 13 +++++++++++++ 5 files changed, 91 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d4c261..ac2ca99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,42 @@ All notable changes to Klarbild are documented here. Newest first. +## 2026-08-21 — Unique, chronologically sortable filenames + +### Fixed +- **Pictures overwrote each other at Picdrop.** Two badges of the same person in the + same format on the same day both came out as `2026-07-23_lea_the-frame.png`, so the + second upload silently replaced the first. Reported from real use — Till lost images + this way. The name now carries the time down to the second plus a short tag derived + from the item id: + + 2026-08-20_143207_lea-badge_the-frame_a3f9.jpg + + Two pictures can no longer collide: the tag comes from the item id, which is unique. + A belt-and-braces loop appends `-2`, `-3` … if a name is somehow still taken — + deliberately a code loop rather than a UNIQUE constraint, because a rejected write + would fail an already-paid AI job at the very last step. + +### Added +- **Backfill for the existing library** (Admin → Dateinamen). Preview first — it reports + how many names are currently duplicated — then apply. It re-stamps from `created_at` + and the item id while keeping the motif and format already chosen, so it is idempotent: + a second run changes nothing. Stored files are untouched; they live under their id, + not their name. +- **Re-deliver everything** under the new name, for copies already sitting at Picdrop. + The old files stay where they are — deleting a customer's files automatically is the + wrong reflex; that stays a manual decision. + +### Changed +- Timestamps use **Europe/Berlin** (override with `KLARBILD_TZ`) rather than UTC. A + picture taken at 00:30 should not be dated to the previous day. +- Naming moved into `src/lib/naming.ts` — dependency-free, like `printlayout.ts`, so the + rules are testable and identical in every path (jobs, Telegram, MCP, backfill). + The generator strips its own stamp when a result is fed back in as a source, so + re-processing cannot accumulate timestamps. +- 17 new tests (56 total), including the reported bug as an explicit regression test and + a check that lexicographic sorting equals chronological sorting across a DST boundary. + ## 2026-08-20 — Oversize sheets, duplicate images, free labelling, new layout ### Added diff --git a/README.md b/README.md index 5e50321..34b27e4 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,12 @@ Migrationen und Seeds laufen beim Serverstart automatisch. Erststart-Passwörter (sharp + pdf-lib). Browser-Vorschau und Server-PDF benutzen denselben Rechenkern. Auch per Telegram („🖨 Drucken") und MCP (`exact_size`, `print_sheet`). Öffentliche Vorstellungsseite ohne Login: `/vorstellung`. -- **Admin:** Key/Picdrop/Modelle/Nutzer/Kostendeckel/Presets/Speicherverwaltung, Picdrop-Diagnose. +- **Dateinamen (`src/lib/naming.ts`, abhängigkeitsfrei):** `JJJJ-MM-TT_HHMMSS___.`, + z. B. `2026-08-20_143207_lea-badge_the-frame_a3f9.jpg`. Zeitstempel vorn → jede Dateiliste sortiert + chronologisch; Kürzel aus der Item-ID → zwei Bilder können sich beim Ausliefern **nicht mehr überschreiben**. + Zeitzone `KLARBILD_TZ` (Standard `Europe/Berlin`). Nachbenennung der Bibliothek und erneute Auslieferung + im Admin unter „Dateinamen" (`src/lib/renames.ts`), idempotent. +- **Admin:** Key/Picdrop/Modelle/Nutzer/Kostendeckel/Presets/Speicherverwaltung, Dateinamen, Picdrop-Diagnose. ## Datenmodell / Migrationen Nummerierte SQL in `migrations/`, beim Start automatisch (kein ORM-Push). Wichtige Spalten: diff --git a/src/pages/anleitung.astro b/src/pages/anleitung.astro index f286e6b..5ac97da 100644 --- a/src/pages/anleitung.astro +++ b/src/pages/anleitung.astro @@ -56,6 +56,14 @@ import Base from '../layouts/Base.astro';
  • Mehrere auf einmal: Bilder markieren, dann als ZIP laden oder gesammelt in einen Ordner verschieben.
  • +

    Dateinamen sind eindeutig. Jedes Ergebnis heißt + JJJJ-MM-TT_HHMMSS_motiv_format_kürzel, also z. B. + 2026-08-20_143207_lea-badge_the-frame_a3f9.jpg. Weil Datum und Uhrzeit vorn stehen, + sortiert jede Dateiliste — Picdrop, NAS, Finder — von allein chronologisch. Das Kürzel am Ende stammt + aus der Kennung des Bildes: zwei Bilder können sich beim Ausliefern nicht mehr überschreiben, + auch wenn du am selben Tag zweimal dasselbe Motiv im selben Format erzeugst. + (Vor dem 21.08.2026 war das anders — dort ging in so einem Fall das erste Bild verloren. + Unter Admin → Dateinamen lässt sich die vorhandene Bibliothek nachträglich umbenennen.)

    @@ -155,6 +163,12 @@ import Base from '../layouts/Base.astro';

    Im Admin-Bereich lässt sich eine zweite Sicherung aufs NAS einrichten (SFTP/FTPS, auch über Tailscale) — jedes fertige Bild wird dann zusätzlich gespiegelt und in der Bibliothek mit „NAS ✓" markiert. Mit „Alle vorhandenen Bilder aufs NAS sichern" lassen sich auch ältere Bilder nachsichern.

    +

    Unter „Dateinamen" lässt sich die vorhandene Bibliothek auf das eindeutige Namensschema bringen. + „Bibliothek prüfen" zeigt zuerst, was sich ändern würde und wie viele Namen aktuell doppelt vergeben + sind; „Jetzt umbenennen" setzt es um. Die Bilddateien selbst bleiben dabei unangetastet — sie liegen + im Speicher unter ihrer Kennung, nicht unter ihrem Namen. Ein zweiter Lauf ändert nichts mehr. + „Erneut ausliefern" lädt danach alle schon ausgelieferten Bilder unter dem neuen Namen erneut hoch; + die alten Dateien bleiben bei Picdrop liegen und räumst du dort selbst weg.

    Zum Aufräumen gibt es „Bibliothek & Aufträge zurücksetzen": löscht alle Bilder, Aufträge und Ordner (Nutzer, Einstellungen, Modelle und Rezepte bleiben) — mit Sicherheitsabfrage. Am besten vorher einmal aufs NAS sichern.

    diff --git a/src/pages/changelog.astro b/src/pages/changelog.astro index 838f5d6..b038998 100644 --- a/src/pages/changelog.astro +++ b/src/pages/changelog.astro @@ -9,6 +9,28 @@ import Base from '../layouts/Base.astro';

    Was in Klarbild neu ist. Neueste Änderungen oben.

    +
    +
    21.08.2026

    Eindeutige Dateinamen — Bilder überschreiben sich nicht mehr

    +
      +
    • Behoben: Bilder haben sich bei Picdrop gegenseitig überschrieben. Wer am selben Tag zweimal + dasselbe Motiv im selben Format erzeugt hat — etwa zwei Badges —, bekam zweimal denselben Dateinamen + (2026-07-23_lea_the-frame.png). Beim Ausliefern ersetzte das zweite Bild dann stillschweigend + das erste. Das kann jetzt nicht mehr passieren.
    • +
    • Der neue Name: 2026-08-20_143207_lea-badge_the-frame_a3f9.jpg — also Datum, Uhrzeit + auf die Sekunde, Motiv, Format und ein kurzes Kürzel. Weil der Zeitstempel vorn steht, sortiert + jede Dateiliste von allein chronologisch — bei Picdrop, im Finder, auf dem NAS. Das Kürzel stammt + aus der Bild-Kennung und ist damit garantiert eindeutig.
    • +
    • Uhrzeit in deutscher Zeit, nicht in UTC. Ein Bild von 0:30 Uhr trägt jetzt das richtige Datum + und nicht mehr das des Vortags.
    • +
    • Rückwirkend für die ganze Bibliothek: Unter Admin → Dateinamen zeigt „Bibliothek prüfen" + erst an, was sich ändern würde (samt der Zahl der aktuell doppelt vergebenen Namen); „Jetzt umbenennen" + setzt es um. Die Bilddateien selbst bleiben dabei unangetastet. Ein zweiter Lauf ändert nichts mehr.
    • +
    • „Erneut ausliefern" lädt alle schon ausgelieferten Bilder unter dem neuen Namen erneut hoch. + Die alten Dateien bleiben am Ziel liegen — die räumst du bei Picdrop selbst weg, damit nichts + versehentlich beim Kunden verschwindet.
    • +
    +
    +
    20.08.2026

    Übergroße Bilder, Bild duplizieren, freie Beschriftung & neuer Aufbau

      diff --git a/src/pages/llms.txt.ts b/src/pages/llms.txt.ts index c80dff7..c759462 100644 --- a/src/pages/llms.txt.ts +++ b/src/pages/llms.txt.ts @@ -120,6 +120,19 @@ Werkzeug \`klarbild\` (mcp/klarbild-mcp.mjs), nutzt denselben API-Token: - exact_size — OHNE KI: ein Bild exakt auf ein Maß bringen, Datei lokal speichern. - print_sheet — OHNE KI: Druckbogen (mehrere Bilder × Stückzahl, Schnittmarken) als PDF lokal speichern. +## Dateinamen der Ergebnisse +Schema: \`JJJJ-MM-TT_HHMMSS___.\` — z. B. \`2026-08-20_143207_lea-badge_the-frame_a3f9.jpg\`. +- Der Zeitstempel steht vorn, deshalb sortiert jede Dateiliste (Picdrop, NAS, Finder) von allein chronologisch. +- Das vierstellige Kürzel stammt aus der Item-ID. Dadurch sind zwei Bilder **nie** namensgleich — + auch nicht bei gleichem Motiv, gleichem Format und gleichem Tag. (Vor dem 21.08.2026 fehlten Uhrzeit + und Kürzel; gleichartige Bilder desselben Tages überschrieben sich beim Ausliefern.) +- Zeitzone: \`KLARBILD_TZ\`, Standard \`Europe/Berlin\`. +- Motiv wird aus dem Ursprungsnamen geschält (Datum, UUIDs und der eigene Stempel fallen weg); + generische Namen wie \`IMG\`, \`foto\`, \`telegram\` werden zu \`klarbild\`. +- Nachbenennung der ganzen Bibliothek: Admin → „Dateinamen" bzw. + \`POST /api/admin/storage { action: 'rename_preview' | 'rename_apply' | 'redeliver_all' }\` (nur per Login-Session, + nicht per API-Token). Idempotent — Stempel aus \`created_at\`, Kürzel aus der Item-ID. + ## Auslieferung - Picdrop = SFTP/FTPS-Ziel; Galerie = Unterordner unter dem Basispfad. Voller Pfad = Basisordner + Galerie (wird erst beim Ausliefern zusammengesetzt). Standard-Galerie „POSTER LEA"; „The Frame" → „TheFrame-Backgrounds".