From e07c1437d35c1a5b6a0136aa246e51b0cd8f4626 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Mon, 13 Jul 2026 19:03:04 +0200 Subject: [PATCH] feat: Excel-Felder auto-fill + Amazon/AllGames4You Affiliate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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/ --- article_server.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/article_server.py b/article_server.py index 0a20198..61807aa 100644 --- a/article_server.py +++ b/article_server.py @@ -1916,7 +1916,7 @@ textarea{{min-height:100px;resize:vertical}}

Auto-Resize: 1920x1080 @ 72dpi

3. Metadaten

-
+
@@ -1930,6 +1930,10 @@ textarea{{min-height:100px;resize:vertical}}
+
+
+
+
@@ -1955,7 +1959,7 @@ imageDrop.addEventListener('dragleave',function(){{imageDrop.classList.remove('d imageDrop.addEventListener('drop',function(e){{e.preventDefault();imageDrop.classList.remove('dragover');aif(e.dataTransfer.files)}}); imageInput.addEventListener('change',function(){{aif(imageInput.files)}}); function aif(files){{for(var i=0;iX';li.querySelector('.remove').onclick=function(){{imageFiles=imageFiles.filter(function(x){{return x!==f}});li.remove()}};imageList.appendChild(li)}})(files[i])}}}} -async function submitForm(publish){{var s=document.getElementById('spielname').value.trim();if(!s){{st('Spielname fehlt','err');return}}if(!excelFile){{st('Excel-Datei fehlt','err');return}}var fd=new FormData();fd.append('excel',excelFile);imageFiles.forEach(function(f){{fd.append('images',f)}});fd.append('spielname',s);fd.append('autor',document.getElementById('autor').value);fd.append('rubrik',document.getElementById('rubrik').value);fd.append('komplexitaet',document.getElementById('komplexitaet').value);fd.append('disclosure',document.getElementById('disclosure').value);fd.append('verlag',document.getElementById('verlag').value.trim());fd.append('fantasywelt_url',document.getElementById('fantasywelt_url').value.trim());fd.append('so_url',document.getElementById('so_url').value.trim());fd.append('publish',publish?'1':'0');st(publish?'Veroffentliche...':'Baue Vorschau...','info');try{{var resp=await fetch('/review-builder/build?key={access_token}',{{method:'POST',body:fd}});var data=await resp.json();if(!data.ok){{st(data.error||'Fehler','err');return}}var box=document.getElementById('resultBox');box.classList.add('visible');document.getElementById('resultTitle').textContent=data.title;document.getElementById('resultLink').innerHTML=data.published?'Artikel online: '+data.article_url+'':'Vorschau: '+data.filename+'';st(data.published?'Veroffentlicht!':'Vorschau bereit','ok')}}catch(e){{st('Fehler: '+e.message,'err')}}}} +async function submitForm(publish){{var s=document.getElementById('spielname').value.trim();if(!excelFile){{st('Excel-Datei fehlt','err');return}}var fd=new FormData();fd.append('excel',excelFile);imageFiles.forEach(function(f){{fd.append('images',f)}});fd.append('spielname',s);fd.append('autor',document.getElementById('autor').value);fd.append('rubrik',document.getElementById('rubrik').value);fd.append('komplexitaet',document.getElementById('komplexitaet').value);fd.append('disclosure',document.getElementById('disclosure').value);fd.append('verlag',document.getElementById('verlag').value.trim());fd.append('fantasywelt_url',document.getElementById('fantasywelt_url').value.trim());fd.append('so_url',document.getElementById('so_url').value.trim());fd.append('amazon_url',document.getElementById('amazon_url').value.trim());fd.append('allgames4you_url',document.getElementById('allgames4you_url').value.trim());fd.append('publish',publish?'1':'0');st(publish?'Veroffentliche...':'Baue Vorschau...','info');try{{var resp=await fetch('/review-builder/build?key={access_token}',{{method:'POST',body:fd}});var data=await resp.json();if(!data.ok){{st(data.error||'Fehler','err');return}}var box=document.getElementById('resultBox');box.classList.add('visible');document.getElementById('resultTitle').textContent=data.title;document.getElementById('resultLink').innerHTML=data.published?'Artikel online: '+data.article_url+'':'Vorschau: '+data.filename+'';st(data.published?'Veroffentlicht!':'Vorschau bereit','ok')}}catch(e){{st('Fehler: '+e.message,'err')}}}} document.getElementById('previewBtn').addEventListener('click',function(){{submitForm(false)}}); document.getElementById('publishBtn').addEventListener('click',function(){{submitForm(true)}}); """ @@ -2014,10 +2018,10 @@ document.getElementById('publishBtn').addEventListener('click',function(){{submi zusatz = xl.get("Zusatztitel", "").strip() tester = xl.get("Test von", "").strip() - # Autor-Mapping: "Jan Maguna" → autor_key + # Autor-Mapping: "Jan Maguna" → autor_key (immer aus Excel, Form nur Fallback) autor_key = meta.get("autor", "basti").strip() cfg = REVIEW_CONFIG - if tester and autor_key == "basti": + if tester: for k, v in cfg.get("authors", {}).items(): if v["name"].lower() == tester.lower(): autor_key = k @@ -2028,6 +2032,8 @@ document.getElementById('publishBtn').addEventListener('click',function(){{submi do_publish = meta.get("publish", "0") == "1" fantasywelt_url = meta.get("fantasywelt_url", "").strip() so_url = meta.get("so_url", "").strip() + amazon_url = meta.get("amazon_url", "").strip() + allgames4you_url = meta.get("allgames4you_url", "").strip() # Excel-Felder komplex = xl.get("Komplexität des Spiels", "").strip() @@ -2133,6 +2139,10 @@ document.getElementById('publishBtn').addEventListener('click',function(){{submi aff_html += f'

Bei Fantasywelt kaufen

\n' if so_url: aff_html += f'

Bei Spiele-Offensive kaufen

\n' + if amazon_url: + aff_html += f'

Bei Amazon kaufen

\n' + if allgames4you_url: + aff_html += f'

Bei AllGames4You kaufen

\n' gal_path = f"01/{erster}/{ordner}" tags_str = ", ".join(tags) if tags else f"{spielname}, Brettspiel, Review, Bewertung, {autor_name}"