🔖 Release v1.5.0

This commit is contained in:
Oliver 2025-07-08 10:48:12 +02:00
parent c0b03ba477
commit 1d54cf904b
7 changed files with 213 additions and 16 deletions

View file

@ -1,3 +1,21 @@
## [v1.5.0] 2025-07-08
### 💡 Neue Funktionen
- 🪄 DALL·E-Bildgenerierung per Button direkt im Artikel-Expander
- Automatische Metadaten (Caption, Copyright, Quelle) für KI-generierte Bilder
### 🔧 Änderungen & Fixes
- 🔒 Kritischer Bugfix: Artikel gingen nach DALL·E oder Rewrite verloren → jetzt sichere `save_articles()`-Logik über alle Artikel
- Status-Änderungen, Rewrite und Bilderfassung überschreiben nicht mehr die Gesamtdatei
- Kein `st.rerun()` mehr nach jedem Klick flüssiger Workflow
### 📦 Internes
- Neue Datei `utils/dalle_generator.py` für DALL·E-Integration
- Erweiterung der Teststrategie um strukturierte `TEST-CHECKLIST.md`
- Verbesserte Update-Strategie für Einzelartikel bei Bearbeitung
## [v1.4.8] 2025-07-07
### 💡 Neue Funktionen

View file

@ -1 +1 @@
VERSION = "1.4.6"
VERSION = "1.5.0"

46
app.py
View file

@ -1,5 +1,3 @@
# app.py
import streamlit as st
from datetime import datetime
from main import (
@ -10,6 +8,7 @@ from main import (
process_articles,
rewrite_articles
)
from utils.dalle_generator import generate_dalle_image
import os
st.set_page_config(page_title="📰 RSS Artikel Manager", layout="wide")
@ -38,9 +37,10 @@ if st.sidebar.button("✍️ Artikel umschreiben (Rewrite)"):
st.header("📋 Artikelübersicht")
status_filter = st.selectbox("Status filtern", ["Alle", "New", "Rewrite", "Process", "Online", "On Hold", "Trash"], index=1)
articles = load_articles()
all_articles = load_articles()
articles = all_articles
if status_filter != "Alle":
articles = [a for a in articles if a.get("status") == status_filter]
articles = [a for a in all_articles if a.get("status") == status_filter]
# === Artikel-Tabelle ===
if articles:
@ -80,7 +80,12 @@ if articles:
new_status = st.selectbox("", status_options, index=status_options.index(current_status), key=f"status_{article['id']}")
if new_status != current_status:
article["status"] = new_status
save_articles(articles)
# Speichern in vollständiger Artikelliste
for idx, art in enumerate(all_articles):
if art["id"] == article["id"]:
all_articles[idx] = article
break
save_articles(all_articles)
st.rerun()
with st.expander(f"🔍 {article['title']}"):
@ -102,8 +107,37 @@ if articles:
img["caption"] = caption or "Kein Bildtitel vorhanden"
img["copyright"] = copyright or "Unbekannt"
img["copyright_url"] = copyright_url or "#"
save_articles(articles)
# Speichern in vollständiger Artikelliste
for idx, art in enumerate(all_articles):
if art["id"] == article["id"]:
all_articles[idx] = article
break
save_articles(all_articles)
st.success("Bilddaten gespeichert")
if st.button("🪄 KI-Bild generieren", key=f"dalle_{article['id']}"):
if not any(img.get("copyright") == "OpenAI DALL·E" for img in article.get("images", [])):
prompt = article["title"]
image_url = generate_dalle_image(prompt)
if image_url:
article.setdefault("images", []).append({
"url": image_url,
"alt": f"KI-generiertes Titelbild zu: {prompt}",
"caption": f"KI-generiertes Titelbild zu: {prompt}",
"copyright": "OpenAI DALL·E",
"copyright_url": "https://openai.com/dall-e"
})
for idx, art in enumerate(all_articles):
if art["id"] == article["id"]:
all_articles[idx] = article
break
save_articles(all_articles)
st.success("DALL·E-Bild erfolgreich hinzugefügt")
st.rerun()
else:
st.error("Fehler beim Erzeugen des Bildes.")
else:
st.info("Ein KI-generiertes Bild ist bereits vorhanden.")
else:
st.info("Keine Artikel für den gewählten Status gefunden.")

File diff suppressed because one or more lines are too long

View file

@ -92,3 +92,51 @@
2025-07-07 10:38:21,362 - INFO - Lade Feed: https://www.camping-news.de/rss/
2025-07-07 10:38:21,538 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/
2025-07-07 10:38:21,538 - INFO - Keine neuen Artikel gefunden.
2025-07-08 09:28:17,147 - INFO - Lade Feed: https://www.camping-news.de/rss/
2025-07-08 09:28:17,409 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/
2025-07-08 09:28:17,409 - INFO - Keine neuen Artikel gefunden.
2025-07-08 09:29:05,882 - INFO - ✍️ Umschreiben von: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz
2025-07-08 09:29:28,434 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-07-08 09:29:31,336 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-07-08 09:29:31,339 - INFO - ✅ Artikel umgeschrieben: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz
2025-07-08 09:29:31,343 - INFO - Alle Artikel mit Status 'Rewrite' wurden verarbeitet.
2025-07-08 09:32:08,168 - INFO - 🧠 Generiere DALL·E-Bild für Prompt: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz
2025-07-08 09:32:20,090 - INFO - HTTP Request: POST https://api.openai.com/v1/images/generations "HTTP/1.1 200 OK"
2025-07-08 09:32:20,096 - INFO - ✅ Bild generiert: https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-TNJKFEUCBFmLnSUoZMXBlDdV.png?st=2025-07-08T06%3A32%3A20Z&se=2025-07-08T08%3A32%3A20Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=cc612491-d948-4d2e-9821-2683df3719f5&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-07-07T20%3A25%3A11Z&ske=2025-07-08T20%3A25%3A11Z&sks=b&skv=2024-08-04&sig=62C8D6N0YVYMRpgEhUnTgO9YGITstqAxRa370dT2Aq4%3D
2025-07-08 09:39:01,010 - INFO - Lade Feed: https://www.camping-news.de/rss/
2025-07-08 09:39:01,311 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5927
2025-07-08 09:39:01,669 - INFO - 10 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5927
2025-07-08 09:39:01,670 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5928
2025-07-08 09:39:01,886 - INFO - 10 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5928
2025-07-08 09:39:01,887 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5929
2025-07-08 09:39:02,095 - INFO - 17 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5929
2025-07-08 09:39:02,096 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5925
2025-07-08 09:39:02,305 - INFO - 16 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5925
2025-07-08 09:39:02,306 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5926
2025-07-08 09:39:02,518 - INFO - 10 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5926
2025-07-08 09:39:02,519 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5923
2025-07-08 09:39:02,702 - INFO - 10 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5923
2025-07-08 09:39:02,702 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5922
2025-07-08 09:39:02,947 - INFO - 17 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5922
2025-07-08 09:39:02,948 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5921
2025-07-08 09:39:03,157 - INFO - 17 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5921
2025-07-08 09:39:03,157 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5920
2025-07-08 09:39:03,363 - INFO - 9 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5920
2025-07-08 09:39:03,363 - INFO - 9 neue Artikel gefunden in https://www.camping-news.de/rss/
2025-07-08 09:39:03,365 - INFO - 9 neue Artikel gespeichert.
2025-07-08 09:50:04,409 - INFO - ✍️ Umschreiben von: Den eigenen Verbrauchszahlen auf der Spur
2025-07-08 09:50:28,820 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-07-08 09:50:30,722 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-07-08 09:50:30,725 - INFO - ✅ Artikel umgeschrieben: Den eigenen Verbrauchszahlen auf der Spur
2025-07-08 09:50:30,729 - INFO - Alle Artikel mit Status 'Rewrite' wurden verarbeitet.
2025-07-08 09:51:09,253 - INFO - 🧠 Generiere DALL·E-Bild für Prompt: Den eigenen Verbrauchszahlen auf der Spur
2025-07-08 09:51:24,155 - INFO - HTTP Request: POST https://api.openai.com/v1/images/generations "HTTP/1.1 200 OK"
2025-07-08 09:51:24,161 - INFO - ✅ Bild generiert: https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-w5yMQWBqUD40hBBdASWHRCGl.png?st=2025-07-08T06%3A51%3A24Z&se=2025-07-08T08%3A51%3A24Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=cc612491-d948-4d2e-9821-2683df3719f5&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-07-07T20%3A13%3A47Z&ske=2025-07-08T20%3A13%3A47Z&sks=b&skv=2024-08-04&sig=8r2oI6by0IXMpsxHTc9VK/2fFJOzdxPwGoXFiiA8Eiw%3D
2025-07-08 10:36:28,283 - INFO - ✍️ Umschreiben von: Das weltweit größte Caravaning-Erlebnis
2025-07-08 10:36:50,617 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-07-08 10:36:52,619 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-07-08 10:36:52,622 - INFO - ✅ Artikel umgeschrieben: Das weltweit größte Caravaning-Erlebnis
2025-07-08 10:36:52,627 - INFO - Alle Artikel mit Status 'Rewrite' wurden verarbeitet.
2025-07-08 10:38:57,857 - INFO - 🧠 Generiere DALL·E-Bild für Prompt: Das weltweit größte Caravaning-Erlebnis
2025-07-08 10:39:16,622 - INFO - HTTP Request: POST https://api.openai.com/v1/images/generations "HTTP/1.1 200 OK"
2025-07-08 10:39:16,627 - INFO - ✅ Bild generiert: https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-6d1irbwhkDKGNvLJG50pYaZK.png?st=2025-07-08T07%3A39%3A16Z&se=2025-07-08T09%3A39%3A16Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=cc612491-d948-4d2e-9821-2683df3719f5&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-07-07T20%3A35%3A26Z&ske=2025-07-08T20%3A35%3A26Z&sks=b&skv=2024-08-04&sig=DVMzSGr162NqN8830eX0tAH5Wtm5NAnTPxk2C7NQgTs%3D

35
test_checklist.md Normal file
View file

@ -0,0 +1,35 @@
## ✅ Artikel-Rewrite prüfen
| Testschritt | Erwartung | Erfüllt? (✔/✘) |
|-----------------------------------------------------|-------------------------------|----------------|
| Artikel mit Status "Rewrite" umschreiben | Text wird ersetzt | |
| Andere Artikel bleiben unverändert | Kein Datenverlust | |
| Tags bei anderen Artikeln bleiben erhalten | Keine versehentliche Änderung | |
| Nur bearbeitete Artikel bekommen neue Tags | Zielgenaue Verarbeitung | |
| JSON enthält alle Artikel | Kein Verlust nach save() | |
## ✅ DALL·E-Bildgenerierung prüfen
| Testschritt | Erwartung | Erfüllt? (✔/✘) |
|-----------------------------------------------------|-------------------------------------------|----------------|
| KI-Button klickbar | Nur wenn noch kein DALL·E-Bild vorhanden | |
| Bild wird korrekt generiert | URL, Metadaten vorhanden | |
| Nur ein Bild wird hinzugefügt | Keine Duplikate | |
| Bild wird korrekt gespeichert | In `images[]` mit passendem Prompt | |
| Andere Artikel bleiben unverändert | Kein Datenverlust | |
## ✅ Statusänderung prüfen
| Testschritt | Erwartung | Erfüllt? (✔/✘) |
|-----------------------------------------------------|-------------------------------|----------------|
| Artikelstatus ändern (z.B. auf Trash) | Wird korrekt übernommen | |
| Nur ein Artikel wird verändert | Kein Einfluss auf andere | |
| Artikel bleibt in JSON erhalten | Kein versehentliches Löschen | |
## ✅ Gesamtsystemprüfung
| Testschritt | Erwartung | Erfüllt? (✔/✘) |
|-----------------------------------------------------|-------------------------------------------|----------------|
| `articles.json` vollständig | Alle Artikel erhalten | |
| Keine Fehlermeldungen im UI oder Log | Logging funktioniert, keine Exceptions | |
| Filterfunktion bleibt erhalten nach Aktion | Kein Verlust des Statusfilters | |

29
utils/dalle_generator.py Normal file
View file

@ -0,0 +1,29 @@
import openai
import logging
import os
openai.api_key = os.getenv("OPENAI_API_KEY")
def generate_dalle_image(prompt: str) -> str:
"""
Erzeugt ein Bild mit DALL·E basierend auf dem übergebenen Prompt.
Gibt die URL zum generierten Bild zurück.
"""
try:
logging.info(f"🧠 Generiere DALL·E-Bild für Prompt: {prompt}")
response = openai.images.generate(
model="dall-e-3",
prompt=prompt,
n=1,
size="1024x1024",
quality="standard"
)
image_url = response.data[0].url
logging.info(f"✅ Bild generiert: {image_url}")
return image_url
except Exception as e:
logging.exception("❌ Fehler bei der DALL·E-Bildgenerierung")
return None