#!/usr/bin/env python3
"""Generate the KW28 Fantasywelt article HTML from parsed JSON data."""
import json
import html as html_mod
with open('/home/hermes/workspace/fantasywelt_data/kw28_parsed.json', 'r') as f:
data = json.load(f)
neuheiten = data['neuheiten']
wieder_da = data['wieder_da']
vorbestellungen = data['vorbestellungen']
AFFILIATE = 'ig1UxQ0L2cNMNslzFhyr'
def escape_html(text):
"""Escape text for HTML, but preserve existing entities."""
return html_mod.escape(text, quote=False)
def build_table(items, max_items=None):
"""Build an HTML table from items."""
if max_items:
items = items[:max_items]
rows = []
for item in items:
name = escape_html(item['name'])
url = item['url']
price = item['price_display']
ersch = item['ersch_date']
ausverkauft = item['ausverkauft']
if ausverkauft:
price_cell = f'{price} (ausverkauft)'
else:
price_cell = f'{price}'
rows.append(f'
| {name} | {price_cell} | {ersch} |
')
table = f'''
| Spiel | Preis | Erschienen |
{chr(10).join(rows)}
'''
return table
# Build the article
article = f'''
Die Spiele sind nun bei FantasyWelt erstmals auf Lager oder wieder verfügbar (KW28)
8. Juli 2026
{len(neuheiten)} brandneue Brettspiele und {len(wieder_da)} Rückkehrer: Das ist neu bei Fantasywelt in der KW28.
Die Spiele sind nun bei FantasyWelt erstmals auf Lager oder wieder verfügbar (KW28)
Die Kalenderwoche 28 bringt frischen Wind in die Fantasywelt-Regale: {len(neuheiten)} brandneue Titel sind erstmals im Shop gelistet, {len(wieder_da)} weitere Spiele sind nach einer Durststrecke wieder auf Lager. Dazu kommen {len(vorbestellungen)} neue Vorbestellungen. Wir haben alle Neuheiten und Rückkehrer für euch zusammengestellt — mit Preisen, Sprache und Verfügbarkeit.
ℹ️ Hinweis: Die Verfügbarkeitsangaben entsprechen dem Stand vom 8. Juli 2026. Besonders Trading-Card-Game(TCG)-Produkte sind oft innerhalb weniger Stunden ausverkauft. „Auf Lager" bedeutet: zum Zeitpunkt der Abfrage verfügbar. Bei ausverkauften Titeln lohnt sich der Klick trotzdem — oft gibt es eine Vormerkfunktion.
Neu im Shop ({len(neuheiten)})
{build_table(neuheiten)}
Wieder auf Lager ({len(wieder_da)})
Auswahl der wichtigsten Titel. Die vollständige Liste umfasst {len(wieder_da)} Spiele.
{build_table(wieder_da)}
Neue Vorbestellungen ({len(vorbestellungen)})
{build_table(vorbestellungen)}
Quellen
Recherchestand: 8. Juli 2026. Preise und Verfügbarkeiten können sich ändern. Dieser Artikel enthält Affiliate-Links — bei einem Kauf erhalten wir eine Provision. Alle Angaben ohne Gewähr.
'''
with open('/home/hermes/workspace/artikel_fantasywelt_kw28.html', 'w') as f:
f.write(article)
print(f"Article written to artikel_fantasywelt_kw28.html")
print(f" Neuheiten: {len(neuheiten)}")
print(f" Wieder da: {len(wieder_da)}")
print(f" Vorbestellungen: {len(vorbestellungen)}")
print(f" Total items in tables: {len(neuheiten) + len(wieder_da) + len(vorbestellungen)}")