Commit Graph

30 Commits

Author SHA1 Message Date
Hermes Agent ed63994e1c fix: Word-Upload-Feld wiederhergestellt + beide Formate parallel
- Excel (.xlsx) für Fakten/Wertung/Pro/Kontra/Tags
- Word (.docx) für Artikeltext (Spielerklärung)
- Beide optional — Text aus Word wird zwischen Infobox und Fazit eingefügt
- Formular zeigt beide Upload-Zonen nebeneinander
2026-07-13 22:43:48 +02:00
Hermes Agent e07c1437d3 feat: Excel-Felder auto-fill + Amazon/AllGames4You Affiliate
- Spielname, Verlag, Autor, Komplexität werden automatisch aus Excel gelesen
- Formular-Felder sind jetzt optional (Excel hat Vorrang)
- Autor-Erkennung aus 'Test von'-Feld jetzt immer aktiv
- Neue Affiliate-Partner: Amazon + AllGames4You
- Banner-Pfade: images/banners/amazon/ + images/banners/allgames4you/
2026-07-13 19:03:04 +02:00
Hermes Agent 7c63321663 feat: Review-Builder auf Excel (.xlsx) umgebaut
- Statt .docx + LLM jetzt .xlsx mit openpyxl parsen
- Felder direkt aus EINGABE-Sheet gemappt: Spieltitel, Test von, Fakten,
  Mechanismen, PRO/KONTRA, Tags, Wertung
- Autor wird automatisch aus 'Test von'-Feld erkannt
- Infobox-Tabelle aus Excel-Feldern generiert
- Keine LLM-Kosten mehr, keine Latenz
- Formular akzeptiert jetzt .xlsx
2026-07-13 17:26:50 +02:00
Hermes Agent d02c9906a9 feat: Review-Builder — Word-Datei + Bilder hochladen, LLM-strukturiert HTML bauen
- GET /review-builder: Upload-Formular (Word .docx + Bilder Drag/Drop + Metadaten)
- POST /review-builder/build: Word parsen → LLM (DeepSeek Flash) strukturiert
  Teaser/Spielerklärung/Fazit → HTML bauen → im Workspace speichern
- Bild-Resize: 1920x1080 @ 72dpi (PIL), Bilderverzeichnis/01/{buchstabe}/{spiel}/
- review_config.json: 25+ Autoren, 5 Disclosures, 5 Rubriken, Komplexitätsstufen
- Live-Publish via Joomla-API optional (Button: Vorschau / Veröffentlichen)
- Link im Dashboard: 📝 Review-Builder
2026-07-13 16:36:00 +02:00
Hermes Agent 31f814a28b fix: Artikel-Link im Dashboard absolut auf brettspiel-news.de 2026-07-09 16:46:17 +02:00
Hermes Agent 6571254e52 feat: Fehler-Melde-Tool — Server auf :8888 + Dashboard in Article-Server
- fehler-server/server.py: Eigenständiger HTTP-Server (Python stdlib)
  - POST /report: Fehlermeldung speichern + Telegram an Basti
  - GET /api/stats: Statistiken (nur localhost)
  - GET /api/meldungen: Alle Meldungen (nur localhost)
  - GET /: HTML-Formular für iframe-Einbindung
  - SQLite-DB, auto-created
- article_server.py: /fehler-Endpunkt + 🐛 Fehler-Link im Header
  - Serverseitig gerendertes Dashboard
  - Holt Daten vom Fehler-Server (localhost:8888)
  - Statistik-Cards + Meldungstabelle
- Cloudflare-Tunnel: fehler.datenhimmel.work → :8888
2026-07-09 14:58:07 +02:00
Hermes Agent b3b6b702d1 chore: vollständiger Workspace-Snapshot 03.07.2026
- publish_gatekeeper.py (neues Gatekeeper-System)
- 4 Premium-Artikel: Veggie Match, Berlin 1960, Wild Tiled West, Scream Park
- Alle kumulierten Artikel, Scripts, Medien und Caches
2026-07-03 11:35:39 +02:00
Hermes Agent fe071ffd8a fix(nanobanana): Immer 16:9 Full HD nativ — kein Resize mehr
- Backend: aspect_ratio auf "16:9" erzwungen (ignoriert UI-Wert)
- imageConfig.aspectRatio im Gemini-API-Call (nativ, nicht per Prompt-Text)
- Post-Processing-Resize komplett entfernt → API-Output 1:1 ausgeliefert
- Nur noch PNG→JPG Konvertierung (DPI setzen, Format wechseln)
- Frontend: Aspect-Ratio-Dropdown entfernt → Fixtext "16:9 — Full HD"
- JS: aspectRatio hardcodiert auf '16:9'

User-Vorgabe: Immer nativ 16:9 rendern, niemals nachträglich verzerren.
2026-06-28 23:00:26 +02:00
Hermes Agent ff334be4c4 fix(nanobanana): Aspect-Ratio-Bug doppelt behoben
- Bug #1: img.resize((1920,1080)) war hartkodiert → auf _aspect_to_size() umgestellt
- Bug #2: imageConfig.aspectRatio fehlte im Gemini-API-Call → ergänzt

Alle Aspect-Ratios (1:1, 2:3, 9:16, 21:9 etc.) werden jetzt korrekt gerendert.
2026-06-28 22:51:36 +02:00
Hermes Agent 1056eef8db Fix: Read-More-Doppelung + Bild-Dimensionen
- Read-More: introtext ohne <hr> (Joomla setzt eigenen)
- Bild-Dimensionen: PIL erkennt Größe → ?width=X&height=Y
2026-06-24 13:32:39 +02:00
Hermes Agent 26f8ac477d Fix 16:9 output + MIME detection for Image-to-Image
- Pillow installiert (fehlte → try/except lief ins Leere)
- _detect_image_mime(): Magic-Bytes-Erkennung (JPEG/PNG/WebP/HEIC)
- _gemini_generate_image(): kein hartes 'image/jpeg' mehr
- PIL-Resize 1920×1080 greift jetzt korrekt
2026-06-23 08:57:26 +02:00
Hermes Agent 202cb9da42 feat: Imagen → Gemini Flash Image (gemini-2.5-flash-image)
- Gemini kann Image-to-Image (Cover+Landschaft), Imagen nur Text
- generateContent statt predict, inlineData statt rawBytes
- PNG-Output, optionale PIL-Konvertierung zu JPEG
- image_base64 als Referenzbild im contents[].parts[]
- Getestet: Text-to-Image + Image-to-Image
2026-06-23 08:38:56 +02:00
Hermes Agent 23a4bff254 feat: Imagen Image-to-Image — Referenzbild als rawBytes übergeben
- _imagen_generate akzeptiert image_base64 (str|None)
- Multipart-Parser extrahiert hochgeladenes Bild als Base64
- rawBytes im Instance-Feld für Image-to-Image-Modus
- Duplicate import base64 as b64 entfernt
- Getestet: Text-to-Image + Image-to-Image funktionieren
2026-06-23 08:30:48 +02:00
Hermes Agent 53efc2f93b feat: NanoBanana → Google Imagen Backend (synchron, kein Polling)
- Ersetzt NanoBanana (async, Credits-Probleme) durch Google Imagen
- Synchron: Bild kommt als Base64 direkt in der Response
- JS vereinfacht: pollStatus() komplett entfernt (-70 Zeilen)
- Assign-Handler unterstützt jetzt lokale /media/ Pfade
- Default-Auflösung 1K, Imagen-Key via bsn-secrets (google-imagen-key)
- Editor: Header auf Google Imagen aktualisiert
2026-06-22 23:50:24 +02:00
Hermes Agent 8299ad1e24 Fix: NanoBanana null-safe handling + bessere Fehlermeldungen
- _handle_nanobanana_generate: Prüfe code!=0 (z.B. 402=kein Guthaben), data=None-Safe
- _handle_nanobanana_status: data=None-Safe + response=None-Safe
- JavaScript: Bessere Fehlermeldung wenn resp.json() fehlschlägt
- Verhindert 'NoneType' object has no attribute 'get' Crash
2026-06-22 22:46:24 +02:00
Hermes Agent 513fc0e6af feat: NanoBanana Bild-Generator — /nanobanana Editor mit Upload, Prompt, Polling, Artikel-Zuordnung
- Neue Unterseite /nanobanana im Article-Server (Port 8890)
- Foto-Upload per Drag/Drop (Referenzbild für Image-to-Image)
- Prompt-Textarea mit Char-Zähler + Ratio/Resolution-Selects
- BSN-Blau UI, Mobile-First CSS, Inline-JS
- Backend: /nanobanana/generate (POST), /status, /articles, /assign
- NanoBanana generate-2 API via bsn-secrets Key
- Automatisches Polling (5s, max 5min) mit Spinner
- Download-Button + Artikel-Zuordnung (unveröffentlichte Artikel)
- Live getestet: Page 200, Generate 200, Status successFlag=1
2026-06-22 22:35:44 +02:00
Hermes Agent 889acd8c6d Fix: H1+Meta aus Joomla-Body strippen, Bild-Auto-Delete entfernt
- H1 und <p class=meta> werden vor dem Senden an Joomla aus dem Body gefiltert
  (Daniel 19.06.: Titel+Lesezeit dürfen nicht im Fließtext landen)
- os.remove() für Bilder nach erfolgreichem Publish entfernt
  (Bilder bleiben auf Disk erhalten für spätere Referenz/Live-Schaltung)
2026-06-19 09:17:41 +02:00
Hermes Agent 0f787589fe fix: upload images to Spiele/<year>/ directory on publish 2026-06-19 00:50:43 +02:00
Hermes Agent 7629eecc24 fix: publish: auto-include meta description, keywords, image upload, Daniel as author
- Add metadesc + metakey extraction from HTML <meta> tags
- Upload article image to Joomla media endpoint before publish
- Set created_by=560 (Daniel Krause) for all articles
- Image is uploaded as both image_intro and image_fulltext
2026-06-19 00:49:15 +02:00
Hermes Agent 3e6db33027 feat: Rubrik-Dropdown beim Live-Stellen — freie Kategoriewahl
- Neuer <select id='rubricSelect'> neben dem 🔴 Live Toggle
- Alle 10 Rubriken: Nachrichten, Angebot, Crowdfunding, Branche,
  Neuerscheinungen, Ankündigungen, Zubehör, Brettspieltest, Magazin, Video, Podcast
- Bei Live+Haken: Rubrik-Wahl pflicht (Toast wenn 'Rubrik wählen…' gesetzt)
- Backend _handle_publish: nutzt rubric vom Client statt meta category-id
- SAFETY GATE bleibt: ohne Live-Haken → immer Korrektur (catid=61)
- Confirm-Dialog zeigt gewählte Rubrik an
2026-06-19 00:38:33 +02:00
Hermes Agent ced413710f chore: Orphan-Section + Image1-6.jpg entfernt — war nur Test/Debug
- Verwaiste-Bilder-Sektion aus build_index() entfernt
- Image1.jpg–Image6.jpg vom Workspace gelöscht
- CSS (orphan-box etc.) bleibt harmlos im Stylesheet
2026-06-19 00:16:45 +02:00
Hermes Agent a16b3368c6 fix: accept-Attribut von File-Inputs entfernt — Browser-Bug blockierte Bilder
- accept='image/*,.jpg,.jpeg,...' wird von Browsern unterschiedlich interpretiert
- Manche Browser machen UND statt ODER → keine Bilder sichtbar
- Fix: accept komplett raus, Server-Validierung bleibt aktiv (.jpg/.jpeg/.png/.webp/.gif/.svg)
2026-06-19 00:15:32 +02:00
Hermes Agent 6e20684af4 feat: Verwaiste-Bilder-Scanner — Orphans automatisch finden + per Dropdown zuordnen
- find_orphan_images(): scannt Workspace nach Bildern ohne article_images.json-Eintrag
- Gelbe Orphan-Box oben auf der Seite: alle verwaisten Bilder mit Artikel-Dropdown
- assignOrphan() JS: Dropdown-Auswahl → fetch /assign-image → Toast + Reload
- _handle_assign_image(): Backend validiert Bildpfad + Artikel + speichert Mapping
- Test-JPEGs aus media/ bereinigt, article_images.json sauber initialisiert
2026-06-19 00:12:59 +02:00
Hermes Agent 32d1e1ef86 fix: Upload-Zone vereinfacht — kein manueller Dateiname mehr
- Text-Input für Artikel-Dateinamen komplett entfernt
- uploadFile() nimmt jetzt den ERSTEN markierten Artikel (Checkbox)
- Drag&Drop-Zone oben: Ziel = markierter Artikel oder Hinweis
- JPEG-Accept verbessert: image/* + explizit .jpg,.jpeg,.png,.webp,.gif
- Obsolete CSS für input[type=text] in upload-zone entfernt
- Nach Upload: Auto-Reload für Badge-Update
2026-06-19 00:08:02 +02:00
Hermes Agent 681437b86b fix: hidden-Attribut von File-Inputs entfernt (verhinderte Bild-Auswahl)
- hidden auf input[type=file] blockiert label-Trigger in manchen Browsern
- CSS .row-file-input { display: none } reicht zum Verstecken
- accept="image/*" ist korrekt gesetzt
2026-06-19 00:02:13 +02:00
Hermes Agent 726f25ff83 fix: Bild-Upload pro Artikel-Zeile — Datei wählen ohne Dateinamen tippen
- Jede Artikel-Zeile hat jetzt einen 📷 Upload-Button (row-upload-btn)
- Klick → native File-Picker → Auto-Upload mit dem korrekten Artikel-Dateinamen
- uploadForRow() JS-Funktion: async fetch + Badge-Update + Toast-Feedback
- Bugfix: f.write(file_data) statt f.write(data) im _handle_upload
- Upload-Zone oben bleibt für Bulk/Drag-Drop erhalten
2026-06-18 23:59:52 +02:00
Hermes Agent ebcd338bd4 SAFETY GATE: Kein Live-Publish ohne explizite Freigabe
- _handle_publish() braucht 'live':true im JSON-Payload
- Ohne live=true: ALLE Artikel → catid=61, state=0 (Korrektur)
- Meta category-id wird NUR bei live=true respektiert
- UI: roter Live-Schalter mit Warn-Confirm
- Server-Log zeigt [PUBLISH] Modus an
- Response enthält live_mode flag
- Daniel 18.06.: 10.000+ Leser/Tag, NIE ohne Freigabe live
2026-06-18 22:50:25 +02:00
Hermes Agent 934ac899ce VG-Wort: Zählmarke NUR bei state=1 (live) verbrauchen
- if state == 1 → Zählmarke aus Pool holen + Pixel einbauen
- Korrektur (state=0) → KEINE Zählmarke, Log-Meldung 'Übersprungen'
- Pool: 19/20 verfügbar (1 korrekt für Live-Test verbraucht)
2026-06-18 22:42:25 +02:00
Hermes Agent eb59327086 VG-Wort: Zählmarken-Pool-Integration via subprocess
- _handle_publish() ruft vgwort_pool.py get auf
- Pixel-Tag auto in articletext vor </article> eingebaut
- Live getestet: Pixel korrekt (15371, vg09.met.vgwort.de)
- Pool-Script: ~/.hermes/vgwort_pool.py
2026-06-18 22:39:10 +02:00
Hermes Agent 2f356ddfb8 Initial commit: article-server mit Publish-Workflow
- Publish-Gate entfernt (Korrektur ist Redaktion-only)
- Default catid=61 (Korrektur), state=0, access=6
- Öffentliche Rubriken auto-featured für 3 Tage
- featured_up=jetzt, featured_down=+3 Tage
- per meta name='featured-days' content='N' anpassbar
2026-06-18 18:33:25 +02:00