Release 1.1.0

This commit is contained in:
Oliver 2025-07-04 09:48:03 +02:00
parent 633f312bc7
commit 2f7f2a1eb7
8 changed files with 242 additions and 20 deletions

33
.gitignore vendored
View file

@ -1 +1,34 @@
# Byte-compiled / optimierte / andere Python-Dateien
__pycache__/
*.py[cod]
*$py.class
# Virtuelle Umgebungen
.venv/
env/
venv/
ENV/
# VS Code / PyCharm / andere IDEs
.vscode/
.idea/
# Betriebssystemdateien
.DS_Store
Thumbs.db
# Streamlit spezifisch
.streamlit/config.toml
# dotenv / Umgebungsvariablen
.env
# JSON-Datenbanken / Zwischenspeicherung
*.json
!feeds.json # optional entfernbar, wenn du Beispielfeeds mit versionieren willst
# LOG Files ausschließen, dienen nur zum Debuggen
# *.log
# Start Bash ignirieren
start.sh

28
CHANGELOG.md Normal file
View file

@ -0,0 +1,28 @@
# CHANGELOG.md
## [1.1.0] - 2025-07-04
### Hinzugefügt
- Visuell aufgewertete Box zur Darstellung eines Artikels mit:
- Kopierbutton für Titel
- Kopierbutton für Artikeltext
- Kopierbutton für Tags
- Button zum Öffnen des Originalartikels im neuen Tab
- Artikelansicht ist nun in einer grauen, abgerundeten Box gekapselt
- Icons unterstützen visuelle Orientierung (📝, 📋, 📎 etc.)
### Geändert
- Artikelkopierfunktion für WordPress ist nun interaktiv über Buttons möglich
- HTML-Markup innerhalb von Streamlit für flexibleres Styling
### Behoben
- Keine
---
## [1.0.0] - 2025-07-03
### Initialversion
- Artikel aus RSS-Feeds einlesen
- Speichern in JSON-Datei
- Anzeige in Tabelle mit Statusfilter
- Rewrite per ChatGPT mit Zusammenfassung und Tag-Generierung
- Exportierbare Inhalte für manuelles Posting auf WordPress

21
LICENCE Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Oliver Giertz
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

25
README.md Normal file
View file

@ -0,0 +1,25 @@
# 📰 RSS Artikel Manager
Ein Python-Webtool, das RSS-Artikel automatisch einliest, per ChatGPT umschreibt und mit Tags versieht. Die Artikel lassen sich nach Status filtern und über eine tabellarische Streamlit-Oberfläche verwalten.
---
## 🚀 Features
- Verwaltung von RSS-Feeds direkt in der Weboberfläche
- Artikel laden, duplikatfrei speichern und anzeigen
- Artikelstatus: `New`, `Rewrite`, `Process`, `Online`, `On Hold`, `Trash`
- Artikel per ChatGPT umformulieren und automatisch taggen
- Filterbare und editierbare Artikelübersicht in Tabellenform
- Speicherung in `articles.json` (lokale JSON-Datei)
---
## 🛠️ Installation
```bash
git clone https://github.com/dein-user/rss-artikel-manager.git
cd rss-artikel-manager
python -m venv .venv
source .venv/bin/activate # oder .venv\\Scripts\\activate auf Windows
pip install -r requirements.txt

4
app.log Normal file
View file

@ -0,0 +1,4 @@
2025-07-04 09:29:50,207 - INFO - Status von 1 Artikel(n) auf 'Rewrite' gesetzt.
2025-07-04 09:30:17,000 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
2025-07-04 09:30:17,010 - INFO - ✅ Artikel umgeschrieben: Das weltweit größte Caravaning-Erlebnis
2025-07-04 09:46:03,001 - INFO - Status von 1 Artikel(n) auf 'Online' gesetzt.

71
app.py
View file

@ -6,7 +6,20 @@ import os
from datetime import datetime
import pandas as pd
import openai
from openai import OpenAI
from dotenv import load_dotenv
import logging
# ==== Version ====
APP_VERSION = "1.1.0"
# ==== Logging konfigurieren ====
LOG_FILE = "app.log"
logging.basicConfig(
filename=LOG_FILE,
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
)
# ==== Konfiguration ====
ARTICLES_FILE = "articles.json"
@ -16,7 +29,8 @@ ALL_STATUSES = ["New", "Rewrite", "Process", "Online", "On Hold", "Trash"]
# ==== API Schlüssel laden ====
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
api_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=api_key)
# ==== Hilfsfunktionen ====
def load_articles():
@ -26,6 +40,7 @@ def load_articles():
with open(ARTICLES_FILE, "r") as f:
return json.load(f)
except json.JSONDecodeError:
logging.error("Fehler beim Laden von articles.json")
return []
def save_articles(articles):
@ -39,6 +54,7 @@ def load_feeds():
with open(FEEDS_FILE, "r") as f:
return json.load(f)
except json.JSONDecodeError:
logging.error("Fehler beim Laden von feeds.json")
return []
def save_feeds(feeds):
@ -81,28 +97,31 @@ def format_date(date_str):
except Exception:
return date_str
def rewrite_article_with_gpt(original_text):
def rewrite_article_with_gpt(original_text, title):
prompt = (
"Schreibe folgenden Artikel um und formuliere ihn in journalistischem Stil neu. "
"Füge am Ende eine Liste von 23 passenden Tags hinzu (nur Schlagwörter, keine Hashtags):\n"
f"{original_text}"
)
try:
response = openai.ChatCompletion.create(
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.7
)
return response.choices[0].message.content
result = response.choices[0].message.content
logging.info(f"✅ Artikel umgeschrieben: {title}")
return result
except Exception as e:
logging.error(f"❌ Fehler beim Umschreiben von '{title}': {e}")
return f"FEHLER: {e}"
# ==== UI ====
st.set_page_config(page_title="RSS Artikel Manager", layout="wide")
st.title("📰 RSS Artikel Manager")
st.sidebar.markdown(f"🧩 Version: `{APP_VERSION}`")
# Bereich: Feed-Verwaltung
st.sidebar.header("RSS Feeds verwalten")
feeds = load_feeds()
new_feed = st.sidebar.text_input("Neuen Feed hinzufügen")
if st.sidebar.button(" Feed hinzufügen") and new_feed:
@ -126,6 +145,7 @@ if st.button("🔄 Artikel aus Feeds laden"):
all_articles = load_articles() + new
save_articles(all_articles)
st.success(f"{len(new)} neue Artikel geladen.")
logging.info(f"{len(new)} neue Artikel geladen.")
else:
st.info("Keine neuen Artikel gefunden.")
@ -134,12 +154,16 @@ rewrite_articles = [a for a in load_articles() if a["status"] == "Rewrite"]
if rewrite_articles:
if st.button("✍️ Alle Artikel mit Status 'Rewrite' umschreiben"):
all_articles = load_articles()
progress_text = st.empty()
with st.spinner("Artikel werden umgeschrieben..."):
total = len([a for a in all_articles if a["status"] == "Rewrite"])
count = 0
for a in all_articles:
if a["status"] == "Rewrite":
result = rewrite_article_with_gpt(a["content"])
count += 1
progress_text.markdown(f"➡️ Umschreibe Artikel {count} von {total}: **{a['title']}**")
result = rewrite_article_with_gpt(a["content"], a["title"])
if "FEHLER:" not in result:
# Aufteilen in Text und Tags, falls möglich
if "Tags:" in result:
rewritten, tags = result.rsplit("Tags:", 1)
a["content"] = rewritten.strip()
@ -161,12 +185,11 @@ if articles:
st.markdown("---")
st.subheader(f"Artikel mit Status '{status_filter}'")
# Checkbox-Auswahl manuell verwalten
selected_ids = []
for i, article in enumerate(articles):
cols = st.columns([0.5, 1.5, 3, 4, 1, 2, 1])
with cols[0]:
if st.checkbox("", key=article["id"]):
if st.checkbox("Auswählen", key=article["id"], label_visibility="collapsed"):
selected_ids.append(article["id"])
cols[1].markdown(format_date(article["date"]))
cols[2].markdown(f"**{article['title']}**")
@ -177,14 +200,42 @@ if articles:
st.markdown("---")
if selected_ids:
all_articles = load_articles()
selected_articles = [a for a in all_articles if a["id"] in selected_ids]
with st.expander("📋 Inhalte für WordPress kopieren"):
for a in selected_articles:
with st.container():
st.markdown("""
<div style="border: 1px solid #CCC; padding: 1rem; border-radius: 10px; background-color: #F9F9F9;">
""", unsafe_allow_html=True)
st.markdown(f"### ✏️ {a['title']}")
st.markdown(f"<button style='margin-bottom:0.5rem;' onclick=\"navigator.clipboard.writeText('{a['title']}')\">🔗 Titel kopieren</button>", unsafe_allow_html=True)
st.text_area("📝 Artikeltext", value=a["content"], height=300, key=f"content_{a['id']}", help="CMD+C zum Kopieren")
st.markdown(f"<button style='margin-bottom:0.5rem;' onclick=\"navigator.clipboard.writeText(`{a['content']}`)\">📋 Artikeltext kopieren</button>", unsafe_allow_html=True)
st.text_input("🏷️ Tags", value=", ".join(a["tags"]), key=f"tags_{a['id']}", help="CMD+C zum Kopieren")
st.markdown(f"<button style='margin-bottom:0.5rem;' onclick=\"navigator.clipboard.writeText('{', '.join(a['tags'])}')\">📎 Tags kopieren</button>", unsafe_allow_html=True)
st.markdown(f"<a href='{a['link']}' target='_blank' style='text-decoration: none;'><button style='background-color:#e8f0fe; border:none; padding:0.5rem 1rem; border-radius:5px;'>🔗 Zum Originalartikel</button></a>", unsafe_allow_html=True)
st.markdown("</div>", unsafe_allow_html=True)
new_status = st.selectbox("Neuen Status setzen für ausgewählte Artikel", ALL_STATUSES)
if st.button("✅ Status ändern"):
all_articles = load_articles()
for a in all_articles:
if a["id"] in selected_ids:
a["status"] = new_status
save_articles(all_articles)
st.success("Status aktualisiert.")
logging.info(f"Status von {len(selected_ids)} Artikel(n) auf '{new_status}' gesetzt.")
st.rerun()
else:
st.warning(f"Keine Artikel mit Status '{status_filter}' vorhanden.")

View file

@ -47,11 +47,15 @@
"id": "a97f65f6-ce4e-4607-9ed6-1d33e04a278b",
"date": "Tue, 13 May 2025 00:00:00 +0200",
"title": "Das weltweit gr\u00f6\u00dfte Caravaning-Erlebnis",
"summary": "<p>Der CARAVAN SALON ist die gr&ouml;&szlig;te und wichtigste Messe weltweit, die sich ausschlie&szlig;lich dem Thema Caravaning widmet - und macht di",
"content": "<p>Der CARAVAN SALON ist die gr&ouml;&szlig;te und wichtigste Messe weltweit, die sich ausschlie&szlig;lich dem Thema Caravaning widmet - und macht dieses Lebensgef&uuml;hl zu einem einzigartigen Messe-Erlebnis. Als unangefochtener Branchentreffpunkt pr&auml;sentiert die weltweit f&uuml;hrende Leitmesse die gr&ouml;&szlig;te Auswahl an Reisemobilen, Caravans und Campervans. Erg&auml;nzt wird das Angebot durch eine unvergleichliche Vielfalt an Zubeh&ouml;r, technischem Equipment, Ausbauteilen, Dachzelten, Mobilheimen, Caravaning- und Campingzubeh&ouml;r, Reisedestinationen, Campingpl&auml;tzen sowie Reisemobilstellpl&auml;tzen.<br /><br /></p>\n<p><strong>Messeerlebnis nicht zu ersetzen</strong><br /><br />&bdquo;Gerade in herausfordernden Zeiten zeigt sich eindrucksvoll, welchen unsch&auml;tzbaren Wert Messen f&uuml;r unsere Branche haben. Potenzielle Kunden wollen die Fahrzeuge vor der Kaufentscheidung nicht nur sehen &ndash; sie wollen erleben, anfassen, vergleichen, einsteigen und sp&uuml;ren, welcher Grundriss zu ihrem Lebensstil passt. Der CARAVAN SALON ist der einzige Ort, an dem alle renommierten nationalen und internationalen Hersteller versammelt sind &ndash; und Besucher die ganze Bandbreite des Marktes auf einen Blick erfassen k&ouml;nnen&ldquo;, sagt Director Stefan Koschke. In D&uuml;sseldorf werden die Premieren der kommenden Saison gezeigt: Top-Produkte, Innovationen und Weltneuheiten &ndash; erstmals &ouml;ffentlich erlebbar, erg&auml;nzt durch zahlreiche spannende Neuaussteller, die die Modellvielfalt nochmals erweitern. &bdquo;Das Messeerlebnis CARAVAN SALON wird damit noch intensiver, vom passenden Fahrzeug bis zum ganz pers&ouml;nlichen Traumziel&ldquo;, erg&auml;nzt Stefan Koschke.</p>\n<p><br /><strong>Neue Halleneinteilung &ndash; noch mehr entdecken, noch leichter finden</strong><br /><br />Dank einer neuen, &uuml;bersichtlich gestalteten Hallenstruktur, gelangen Besucherinnen und Besucher weiterhin schnell und gezielt in ihre pers&ouml;nliche Caravaning-Welt. Ob Camping-Neuling, Technik-Fan, kreativer Selbstausbauer oder Luxus-Liebhaber &ndash; auf dem CARAVAN SALON kommt jeder auf seine Kosten und entdeckt genau das, was das eigene Herz h&ouml;herschlagen l&auml;sst. &bdquo;Mit der neuen Aufteilung schaffen wir ein inspirierendes Messeerlebnis f&uuml;r unsere G&auml;ste. Durch laufende Modernisierungen des Gel&auml;ndes und der Hallen sichern wir auch langfristig optimale Bedingungen f&uuml;r Beratung, Austausch und Networking. Im Zuge dieser Ma&szlig;nahmen wird Halle 9 vor&uuml;bergehend nicht genutzt &ndash; daf&uuml;r d&uuml;rfen sich Besucher auf interessante und spannende Platzierungen vieler Marken in einem frischen Umfeld freuen&ldquo;, erkl&auml;rt Stefan Koschke.</p>\n<p><br /><strong>Caravaning so beliebt wie nie zuvor</strong><br /><br />&bdquo;Caravaning erfreut sich seit vielen Jahren wachsender Beliebtheit, denn die individuelle und flexible Art des Reisens im Einklang mit der Natur entspricht dem Wunsch vieler Menschen nach einem selbstbestimmten Urlaub. Im Zuge dieser Entwicklung hat sich der mobile Urlaub l&auml;ngst generationen&uuml;bergreifend zu einer der beliebtesten Reiseformen entwickelt &ndash; und das nicht nur in Europa, sondern weltweit. Noch nie waren so viele Menschen mit Reisemobil oder Caravan unterwegs wie heute. Diese Dynamik spiegelt sich auch auf dem CARAVAN SALON wider, der seit jeher die wichtigste internationale B&uuml;hne der Caravaningbranche ist. Nirgendwo sonst ist die Vielfalt an Fahrzeugen, Zubeh&ouml;r, Dienstleistungen und Reiseinspirationen gr&ouml;&szlig;er als in D&uuml;sseldorf. Jahr f&uuml;r Jahr untermauert der CARAVAN SALON damit seine Rolle als Leuchtturm der Branche&ldquo;, erkl&auml;rt Daniel Onggowinarso, Gesch&auml;ftsf&uuml;hrer des Caravaning Industrie Verbandes (CIVD).</p>\n<p>Der Preview Day am 29. August bietet mit begrenztem Ticketkontingent eine besonders entspannte Atmosph&auml;re f&uuml;r alle, die die Neuheiten der Branche in Ruhe entdecken wollen.</p>\n<p>Der Ticketverkauf startet am 11. Juni. Aktuelle Informationen und Neuigkeiten gibt es im Internet unter <a href=\"https://www.caravan-salon.de\" target=\"_blank\">www.caravan-salon.de</a>.</p>",
"word_count": 487,
"tags": [],
"status": "Rewrite",
"summary": "Als f\u00fchrendes internationales Forum f\u00fcr die Caravaning-Industrie setzt der CARAVAN SALON neue Standards und bietet Besuchern ein unvergleichliches Erl",
"content": "Als f\u00fchrendes internationales Forum f\u00fcr die Caravaning-Industrie setzt der CARAVAN SALON neue Standards und bietet Besuchern ein unvergleichliches Erlebnis. Der Salon hat sich als weltweite Drehscheibe f\u00fcr mobile Reiseenthusiasten etabliert und stellt eine umfangreiche Auswahl an Reisemobilen, Caravans und Campervans vor. Die Ausstellung wird durch ein breites Spektrum an Zubeh\u00f6r, technischen Ger\u00e4ten, Ausbauteilen, Dachzelten, Mobilheimen, Campingbedarf und Reisedestinationen erg\u00e4nzt.\n\nStefan Koschke, Direktor des CARAVAN SALON, hebt die entscheidende Rolle hervor, die Messen - besonders in herausfordernden Zeiten - f\u00fcr die Branche spielen. \"Potenzielle Kunden wollen die Fahrzeuge nicht nur sehen, sondern sie erleben, anfassen und vergleichen. Der CARAVAN SALON bietet die unvergleichliche Gelegenheit, alle nationalen und internationalen Hersteller unter einem Dach zu erleben und einen umfassenden \u00dcberblick \u00fcber den Markt zu gewinnen\", so Koschke.\n\nEine Neuerung auf dem CARAVAN SALON ist die klar strukturierte Hallenorganisation, die Besuchern hilft, schnell und gezielt ihre gew\u00fcnschten Ausstellungen zu erreichen. Koschke f\u00fcgt hinzu, dass st\u00e4ndige Modernisierungen des Veranstaltungsortes und der Hallen ideale Bedingungen f\u00fcr Beratung, Austausch und Networking gew\u00e4hrleisten.\n\nDaniel Onggowinarso, Gesch\u00e4ftsf\u00fchrer des Caravaning Industrie Verbandes (CIVD), unterstreicht die wachsende Attraktivit\u00e4t des Caravaning. \"Die individuelle und flexible Art des Reisens in Harmonie mit der Natur erf\u00fcllt den Wunsch vieler Menschen nach einem selbstbestimmten Urlaub. Der CARAVAN SALON reflektiert diese Trenddynamik und best\u00e4tigt seine Position als internationale Plattform der Caravaningbranche\", so Onggowinarso.\n\nAm 29. August bietet der Preview Day den Besuchern die M\u00f6glichkeit, die Branchenneuheiten in einer entspannten Umgebung zu erkunden. Der Ticketverkauf startet am 11. Juni. Weitere Informationen und Updates sind auf der Website des CARAVAN SALON verf\u00fcgbar.",
"word_count": 254,
"tags": [
"CARAVAN SALON",
"Caravaning",
"Mobiles Reisen"
],
"status": "Online",
"link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5926"
},
{
@ -69,11 +73,15 @@
"id": "4f83b2d1-f43c-4d41-8d68-bcb6b0675c46",
"date": "Wed, 07 May 2025 00:00:00 +0200",
"title": "Fr\u00fchjahrsaktionen vom Verein WOHNmobil f\u00fcr Klimaschutz",
"summary": "Jagsthausen in Baden-W&uuml;rttemberg, Uchte in Niedersachsen, Wernigerode in Sachsen-Anhalt und Harkebr&uuml;gger See in Niedersachsen - so hei&szlig",
"content": "Jagsthausen in Baden-W&uuml;rttemberg, Uchte in Niedersachsen, Wernigerode in Sachsen-Anhalt und Harkebr&uuml;gger See in Niedersachsen - so hei&szlig;en die Stationen der \"Fr&uuml;hjahrs-Tour\" des Vereins WOHNmobil f&uuml;r Klimaschutz e.V. <br /><br />Dabei fanden 6.000 Hainbuchen, Rotbuchen, Hainbuchen, Eichen und Wei&szlig;tannen ihr neues Zuhause im jeweils heimischen Wald. Teams in der St&auml;rke von 12 bis 18 Vereinsmitgliedern pflanzten an 3 Wochenenden im M&auml;rz und Anfang April die 2- bis 3-j&auml;hrigen Setzlinge gemein sam mit dem jeweiligen Revierf&ouml;rster auf den vorgesehenen Fl&auml;chen. Dabei handelte es sich in zwei F&auml;llen um freiger&auml;umte Fl&auml;chen, auf denen fr&uuml;her Fichten standen, die aber Trockenheit, St&uuml;rme und Borkenk&auml;fer nicht &uuml;berlebt haben. Im anderen Fall wurden die Setzlinge in einem reinen Kiefernbestand untergepflanzt und sollen so die Basis f&uuml;r den beabsichtigen Umbau zu einem Mischwald bilden. Je nach Bodenbeschaffenheit kamen bei den Arbeiten Hohlspaten oder Pflanzhacke zum Einsatz. <br /><br />Mit den neuen Setzlingen f&uuml;llt sich das \"Baumkonto\" von WOHNmobil f&uuml;r Klimaschutz e.V. auf nunmehr fast 19.000 gespendete und in vielen Teilen Deutschlands gepflanzte B&auml;ume. \"Wenn man bedenkt, dass jeder Baum in den kommenden 100 Jahren durchschnittlich j&auml;hrlich 10 kg CO2 speichert, dann leisten unsere B&auml;ume einen gro&szlig;artigen Beitrag zum Klimaschutz\", bewertet Vereinsvorstand Albert M&auml;rkl die bisherige Bilanz des Vereins.<br /><br /> Das Gesellige kommt bei den Aktionen des Vereins nicht zu kurz. Dieses mal standen auf dem Programm: Stadtf&uuml;hrungen in &Ouml;hringen und Wernigerode, eine Fahrt mit einer historischen Moorbahn und eine F&uuml;hrung durch das Neust&auml;dter Moor. <br /><br />Einen Beitrag zu umweltfreundlichem und -bewusstem Camping leistete WOHNmobil f&uuml;r Kli maschutz e.V. auch dadurch, dass der Verein das &ouml;kologische Profil von Wohnmobilstellpl&auml;tzen bewertete sowie &ouml;kologisch gestaltete und betriebene Pl&auml;tze auszeichnete. Am 27.03.2025 pr&auml;mierte der Verein das Wohnmobilcamp Sm&aring;land am Harkebr&uuml;gger See bei 26676 Bar&szlig;el/NI als seinen &Ouml;kologischen Wohnmobilstellplatz 2025. Vereinsvorstand Albert M&auml;rkl (links im Bild) &uuml;berreichte dem stolzen Besitzer Hans-J&uuml;rgen Lampe die Urkunde und ein Camper-Insektenhotel. Der idyllisch gelegene und naturnah gestaltete Stellplatz erinnert nicht nur wegen seines Namens an Schweden, sondern vor allem aufgrund seiner sch&ouml;nen Lage und Umgebung. Er be sticht zudem nicht nur durch seine Idylle und das liebevoll gestaltete Gr&uuml;n. Er verf&uuml;gt auch &uuml;ber eine Reihe von energie- und wassersparenden Einrichtungen, &uuml;ber eine sorgf&auml;ltige M&uuml;lltren nung und &uuml;ber Informationen f&uuml;r die G&auml;ste zum umweltschonenden Verhalten auf dem Platz, wie zu Rad- und Wanderwegen. Die Stellplatzfl&auml;chen sind nicht versiegelt, Oberfl&auml;chenwasser wird zus&auml;tzlich in eine Art Biotop abgeleitet. Die Einrichtungen zur Ver- und Entsorgung sind gut anzufahren und hygienisch mit Sp&uuml;lungen ausgestattet. M&auml;rkl: \"Es lohnt sich, den Stellplatz an zufahren, man sp&uuml;rt sofort, dass den Betreibern das Wohl ihrer G&auml;ste und das Wohl unserer Umwelt und Natur am Herzen liegen\". <br /><br />Informationen dar&uuml;ber, wie man Mitglied oder F&ouml;rdermitglied werden kann, sind unter <a href=\"http://www.wohnmobil-fuer-klimaschutz.de\" target=\"_blank\">www.wohnmobil-fuer-klimaschutz.de</a> zu finden.",
"word_count": 450,
"tags": [],
"status": "Rewrite",
"summary": "\"Fr\u00fchlings-Tour\" des Vereins WOHNmobil f\u00fcr Klimaschutz: 6.000 neue B\u00e4ume gepflanzt\n\nDer Verein WOHNmobil f\u00fcr Klimaschutz e.V. hat es sich zur Mission ",
"content": "\"Fr\u00fchlings-Tour\" des Vereins WOHNmobil f\u00fcr Klimaschutz: 6.000 neue B\u00e4ume gepflanzt\n\nDer Verein WOHNmobil f\u00fcr Klimaschutz e.V. hat es sich zur Mission gemacht, die Umwelt zu sch\u00fctzen. In ihrer j\u00fcngsten Aktion, der \"Fr\u00fchlings-Tour\", haben die Mitglieder des Vereins in den W\u00e4ldern von Jagsthausen (Baden-W\u00fcrttemberg), Uchte und Harkebr\u00fcgger See (beide in Niedersachsen) und Wernigerode (Sachsen-Anhalt) insgesamt 6.000 junge B\u00e4ume gepflanzt.\n\nDie Vielfalt der gepflanzten B\u00e4ume reicht von Hain- und Rotbuchen \u00fcber Eichen bis hin zu Wei\u00dftannen. Diese wurden in drei Wochenenden im M\u00e4rz und April von Teams aus 12 bis 18 Vereinsmitgliedern unter Anleitung lokaler F\u00f6rster gepflanzt. Ziel der Aktion war es, fr\u00fchere Fichtenfl\u00e4chen, die unter Trockenheit, St\u00fcrmen und Borkenk\u00e4ferbefall gelitten hatten, neu zu bepflanzen und reine Kiefernw\u00e4lder in Mischw\u00e4lder umzuwandeln.\n\nMit dieser Aktion ist das \"Baumkonto\" des Vereins auf knapp 19.000 gespendete und gepflanzte B\u00e4ume angewachsen. \"Jeder dieser B\u00e4ume wird in den n\u00e4chsten 100 Jahren durchschnittlich 10 kg CO2 pro Jahr speichern. Damit tragen unsere B\u00e4ume wesentlich zum Klimaschutz bei\", erkl\u00e4rt Vereinsvorstand Albert M\u00e4rkl.\n\nNeben dem Umweltschutz legt der Verein auch Wert auf soziale Aktivit\u00e4ten. So wurden w\u00e4hrend der \"Fr\u00fchlings-Tour\" Stadtf\u00fchrungen in \u00d6hringen und Wernigerode organisiert, eine historische Moorbahn besichtigt und eine F\u00fchrung durch das Neust\u00e4dter Moor angeboten. \n\nDar\u00fcber hinaus setzt sich der Verein f\u00fcr nachhaltiges und umweltfreundliches Camping ein. Im Rahmen seiner Aktivit\u00e4ten bewertet er die \u00f6kologischen Merkmale von Wohnmobilstellpl\u00e4tzen und zeichnet besonders umweltfreundlich gestaltete und betriebene Pl\u00e4tze aus. Zuletzt wurde das Wohnmobilcamp Sm\u00e5land am Harkebr\u00fcgger See in Bar\u00dfel als \"\u00d6kologischer Wohnmobilstellplatz 2025\" ausgezeichnet.\n\nWer sich f\u00fcr die Arbeit des Vereins WOHNmobil f\u00fcr Klimaschutz e.V. interessiert und Mitglied oder F\u00f6rdermitglied werden m\u00f6chte, findet weitere Informationen auf der Website des Vereins: www.wohnmobil-fuer-klimaschutz.de.",
"word_count": 271,
"tags": [
"Klimaschutz",
"Baumpflanzung",
"nachhaltiges Camping"
],
"status": "Process",
"link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5924"
},
{

52
requirements.txt Normal file
View file

@ -0,0 +1,52 @@
altair==5.5.0
annotated-types==0.7.0
anyio==4.9.0
attrs==25.3.0
blinker==1.9.0
cachetools==6.1.0
certifi==2025.6.15
charset-normalizer==3.4.2
click==8.2.1
distro==1.9.0
feedparser==6.0.11
gitdb==4.0.12
GitPython==3.1.44
h11==0.16.0
httpcore==1.0.9
httpx==0.28.1
idna==3.10
Jinja2==3.1.6
jiter==0.10.0
jsonschema==4.24.0
jsonschema-specifications==2025.4.1
MarkupSafe==3.0.2
narwhals==1.45.0
numpy==2.3.1
openai==1.93.0
packaging==25.0
pandas==2.3.0
pillow==11.3.0
protobuf==6.31.1
pyarrow==20.0.0
pydantic==2.11.7
pydantic_core==2.33.2
pydeck==0.9.1
python-dateutil==2.9.0.post0
python-dotenv==1.1.1
pytz==2025.2
referencing==0.36.2
requests==2.32.4
rpds-py==0.26.0
sgmllib3k==1.0.0
six==1.17.0
smmap==5.0.2
sniffio==1.3.1
streamlit==1.46.1
tenacity==9.1.2
toml==0.10.2
tornado==6.5.1
tqdm==4.67.1
typing-inspection==0.4.1
typing_extensions==4.14.0
tzdata==2025.2
urllib3==2.5.0