From 10212f825da80c7e3fb0f5777f18f8af1e4d6d0d Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 7 Jul 2025 17:17:43 +0200 Subject: [PATCH 01/87] =?UTF-8?q?=F0=9F=94=92=20rss=5Ftool.log=20gek=C3=BC?= =?UTF-8?q?rzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logs/rss_tool.log | 71 ----------------------------------------------- 1 file changed, 71 deletions(-) diff --git a/logs/rss_tool.log b/logs/rss_tool.log index 63d131e..d1d04d6 100644 --- a/logs/rss_tool.log +++ b/logs/rss_tool.log @@ -1,74 +1,3 @@ -INFO:root:Abrufen von Feed: https://www.camping-news.de/rss/ -INFO:root:Abrufen von Feed: https://www.camping-news.de/rss/ -INFO:root:Starte Umschreiben von Artikeln mit Status 'Rewrite' ... -INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -INFO:root:✅ Artikel 'Abenteuer für die Kleinen, Entspannung für -die Großen' umgeschrieben. -INFO:root:Abrufen von Feed: https://www.camping-news.de/rss/ -INFO:root:Starte Umschreiben von Artikeln mit Status 'Rewrite' ... -INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -INFO:root:✅ Artikel 'Den eigenen Verbrauchszahlen auf der Spur' umgeschrieben. -INFO:root:Starte Umschreiben von Artikeln mit Status 'Rewrite' ... -INFO:root:Abrufen von Feed: https://www.camping-news.de/rss/ -INFO:root:🔄 Starte Verarbeitung von 0 Feeds... -INFO:root:✅ Alle Feeds erfolgreich verarbeitet. -INFO:root:🔄 Starte Verarbeitung von 1 Feeds... -INFO:root:📥 Verarbeite Feed: https://www.camping-news.de/rss/ -INFO:root:✅ Alle Feeds erfolgreich verarbeitet. -INFO:root:🔄 Starte Verarbeitung von 1 Feeds... -INFO:root:📥 Verarbeite Feed: https://www.camping-news.de/rss/ -INFO:root:✅ Alle Feeds erfolgreich verarbeitet. -2025-07-05 15:53:57,795 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 15:54:02,133 - INFO - 10 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 15:54:02,136 - INFO - 10 neue Artikel gespeichert. -2025-07-05 15:57:50,216 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 15:57:54,463 - INFO - 10 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 15:57:54,465 - INFO - 10 neue Artikel gespeichert. -2025-07-05 16:00:32,416 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 16:00:36,108 - INFO - 9 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 16:00:36,109 - INFO - 9 neue Artikel gespeichert. -2025-07-05 16:06:28,832 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 16:06:30,875 - INFO - 4 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 16:06:30,877 - INFO - 4 neue Artikel gespeichert. -2025-07-05 16:08:14,063 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 16:08:15,413 - INFO - 3 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 16:08:15,414 - INFO - 3 neue Artikel gespeichert. -2025-07-05 16:09:14,943 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 16:09:18,883 - INFO - 9 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 16:09:18,885 - INFO - 9 neue Artikel gespeichert. -2025-07-05 16:17:36,273 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 16:17:36,691 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 16:17:36,691 - INFO - Keine neuen Artikel gefunden. -2025-07-05 16:18:45,562 - INFO - ✍️ Umschreiben von: Den eigenen Verbrauchszahlen auf der Spur -2025-07-05 16:19:04,394 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -2025-07-05 16:19:06,129 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -2025-07-05 16:19:06,132 - INFO - ✅ Artikel umgeschrieben: Den eigenen Verbrauchszahlen auf der Spur -2025-07-05 16:19:06,132 - INFO - ✍️ Umschreiben von: Das weltweit größte Caravaning-Erlebnis -2025-07-05 16:19:18,595 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -2025-07-05 16:19:20,334 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -2025-07-05 16:19:20,336 - INFO - ✅ Artikel umgeschrieben: Das weltweit größte Caravaning-Erlebnis -2025-07-05 16:19:20,336 - INFO - ✍️ Umschreiben von: Komfort und Flexibilität für moderne Camper -2025-07-05 16:19:33,242 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -2025-07-05 16:19:34,796 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" -2025-07-05 16:19:34,799 - INFO - ✅ Artikel umgeschrieben: Komfort und Flexibilität für moderne Camper -2025-07-05 16:19:34,803 - INFO - Alle Artikel mit Status 'Rewrite' wurden verarbeitet. -2025-07-05 16:41:31,067 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 16:41:34,773 - INFO - 8 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 16:41:34,775 - INFO - 8 neue Artikel gespeichert. -2025-07-05 16:43:12,785 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 16:43:13,160 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 16:43:13,160 - INFO - Keine neuen Artikel gefunden. -2025-07-05 16:43:52,517 - INFO - Lade Feed: https://www.camping-news.de/rss/ -2025-07-05 16:43:56,021 - INFO - 9 neue Artikel gefunden in https://www.camping-news.de/rss/ -2025-07-05 16:43:56,022 - INFO - 9 neue Artikel gespeichert. -INFO:root:🔄 Starte Artikelabruf... -INFO:root:✅ 10 neue Artikel aus https://www.camping-news.de/rss/ -INFO:root:✅ Artikelverarbeitung abgeschlossen. -INFO:root:🔄 Starte Artikelabruf... -INFO:root:✅ 9 neue Artikel aus https://www.camping-news.de/rss/ -INFO:root:✅ Artikelverarbeitung abgeschlossen. 2025-07-07 09:26:35,739 - INFO - Lade Feed: https://www.camping-news.de/rss/ 2025-07-07 09:26:36,041 - INFO - 📷 Extrahiere Bilder von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5927 2025-07-07 09:26:36,413 - INFO - 10 Bilder gefunden bei https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5927 From c0b03ba47706903b47c46e58017ffd69084301bd Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 7 Jul 2025 17:24:34 +0200 Subject: [PATCH 02/87] =?UTF-8?q?=F0=9F=94=92=20versioning.py=20weiter=20o?= =?UTF-8?q?ptimiert=20und=20Robustheit=20erh=C3=B6ht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- versioning.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/versioning.py b/versioning.py index f494f32..9c40e02 100644 --- a/versioning.py +++ b/versioning.py @@ -53,8 +53,32 @@ def validate_changelog(version: str) -> bool: return False +def tag_exists(tag: str) -> bool: + result = subprocess.run(["git", "tag"], capture_output=True, text=True) + return tag in result.stdout.splitlines() + + +def ensure_branch(expected_branch="main"): + result = subprocess.run(["git", "rev-parse", "--abbrev-ref", "HEAD"], capture_output=True, text=True) + branch = result.stdout.strip() + if branch != expected_branch: + typer.echo(f"⛔ Du befindest dich auf Branch '{branch}', erwartet wird '{expected_branch}'") + raise typer.Exit(code=1) + + +def extract_changelog_entry(version: str) -> str: + content = CHANGELOG_FILE.read_text(encoding="utf-8") + pattern = rf"## \[v?{re.escape(version)}\](.*?)^## \[" + match = re.search(pattern, content + "\n## [", re.DOTALL | re.MULTILINE) + return match.group(1).strip() if match else "" + + def create_git_tag(version: str): try: + if tag_exists(f"v{version}"): + typer.echo(f"⚠️ Tag v{version} existiert bereits.") + return + subprocess.run(["git", "add", "."], check=True) subprocess.run(["git", "commit", "-m", f"🔖 Release v{version}"], check=True) subprocess.run(["git", "tag", f"v{version}"], check=True) @@ -101,6 +125,8 @@ def rollback(): def create(level: str = typer.Option("patch", help="Versionstyp: patch, minor oder major"), push: bool = typer.Option(False, help="Änderungen direkt an GitHub pushen")): "Neue Version erstellen inkl. CHANGELOG, Git-Tag und optional Push" + ensure_branch() + current_version = get_latest_version() next_version = bump_version(current_version, level) From 1d54cf904bc3dd90e5d2207c438cd82eef562dec Mon Sep 17 00:00:00 2001 From: Oliver G Date: Tue, 8 Jul 2025 10:48:12 +0200 Subject: [PATCH 03/87] =?UTF-8?q?=F0=9F=94=96=20Release=20v1.5.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 18 ++++++++++++++ __version__.py | 2 +- app.py | 46 +++++++++++++++++++++++++++++++----- data/articles.json | 51 +++++++++++++++++++++++++++++++++------- logs/rss_tool.log | 48 +++++++++++++++++++++++++++++++++++++ test_checklist.md | 35 +++++++++++++++++++++++++++ utils/dalle_generator.py | 29 +++++++++++++++++++++++ 7 files changed, 213 insertions(+), 16 deletions(-) create mode 100644 test_checklist.md create mode 100644 utils/dalle_generator.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 023fd31..1c93b2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/__version__.py b/__version__.py index 664747e..177b935 100644 --- a/__version__.py +++ b/__version__.py @@ -1 +1 @@ -VERSION = "1.4.6" +VERSION = "1.5.0" diff --git a/app.py b/app.py index 56a28f0..34cd8d5 100644 --- a/app.py +++ b/app.py @@ -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.") diff --git a/data/articles.json b/data/articles.json index 7457c5a..325eca3 100644 --- a/data/articles.json +++ b/data/articles.json @@ -4,9 +4,13 @@ "title": "Fr\u00fchjahrsaktionen vom Verein WOHNmobil f\u00fcr Klimaschutz", "date": "Wed, 07 May 2025 00:00:00 +0200", "summary": "In den ersten Wochen des Jahres 2025 schon 6.000 Jungbäume gepflanzt", - "text": "Jagsthausen in Baden-W\u00fcrttemberg, Uchte in Niedersachsen, Wernigerode in Sachsen-Anhalt und Harkebr\u00fcgger See in Niedersachsen - so hei\u00dfen die Stationen der \"Fr\u00fchjahrs-Tour\" des Vereins WOHNmobil f\u00fcr Klimaschutz e.V. Dabei fanden 6.000 Hainbuchen, Rotbuchen, Hainbuchen, Eichen und Wei\u00dftannen ihr neues Zuhause im jeweils heimischen Wald. Teams in der St\u00e4rke von 12 bis 18 Vereinsmitgliedern pflanzten an 3 Wochenenden im M\u00e4rz und Anfang April die 2- bis 3-j\u00e4hrigen Setzlinge gemein sam mit dem jeweiligen Revierf\u00f6rster auf den vorgesehenen Fl\u00e4chen. Dabei handelte es sich in zwei F\u00e4llen um freiger\u00e4umte Fl\u00e4chen, auf denen fr\u00fcher Fichten standen, die aber Trockenheit, St\u00fcrme und Borkenk\u00e4fer nicht \u00fcberlebt haben. Im anderen Fall wurden die Setzlinge in einem reinen Kiefernbestand untergepflanzt und sollen so die Basis f\u00fcr den beabsichtigen Umbau zu einem Mischwald bilden. Je nach Bodenbeschaffenheit kamen bei den Arbeiten Hohlspaten oder Pflanzhacke zum Einsatz. Mit den neuen Setzlingen f\u00fcllt sich das \"Baumkonto\" von WOHNmobil f\u00fcr Klimaschutz e.V. auf nunmehr fast 19.000 gespendete und in vielen Teilen Deutschlands gepflanzte B\u00e4ume. \"Wenn man bedenkt, dass jeder Baum in den kommenden 100 Jahren durchschnittlich j\u00e4hrlich 10 kg CO2 speichert, dann leisten unsere B\u00e4ume einen gro\u00dfartigen Beitrag zum Klimaschutz\", bewertet Vereinsvorstand Albert M\u00e4rkl die bisherige Bilanz des Vereins. Das Gesellige kommt bei den Aktionen des Vereins nicht zu kurz. Dieses mal standen auf dem Programm: Stadtf\u00fchrungen in \u00d6hringen und Wernigerode, eine Fahrt mit einer historischen Moorbahn und eine F\u00fchrung durch das Neust\u00e4dter Moor. Einen Beitrag zu umweltfreundlichem und -bewusstem Camping leistete WOHNmobil f\u00fcr Kli maschutz e.V. auch dadurch, dass der Verein das \u00f6kologische Profil von Wohnmobilstellpl\u00e4tzen bewertete sowie \u00f6kologisch gestaltete und betriebene Pl\u00e4tze auszeichnete. Am 27.03.2025 pr\u00e4mierte der Verein das Wohnmobilcamp Sm\u00e5land am Harkebr\u00fcgger See bei 26676 Bar\u00dfel/NI als seinen \u00d6kologischen Wohnmobilstellplatz 2025. Vereinsvorstand Albert M\u00e4rkl (links im Bild) \u00fcberreichte dem stolzen Besitzer Hans-J\u00fcrgen 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\u00f6nen Lage und Umgebung. Er be sticht zudem nicht nur durch seine Idylle und das liebevoll gestaltete Gr\u00fcn. Er verf\u00fcgt auch \u00fcber eine Reihe von energie- und wassersparenden Einrichtungen, \u00fcber eine sorgf\u00e4ltige M\u00fclltren nung und \u00fcber Informationen f\u00fcr die G\u00e4ste zum umweltschonenden Verhalten auf dem Platz, wie zu Rad- und Wanderwegen. Die Stellplatzfl\u00e4chen sind nicht versiegelt, Oberfl\u00e4chenwasser wird zus\u00e4tzlich in eine Art Biotop abgeleitet. Die Einrichtungen zur Ver- und Entsorgung sind gut anzufahren und hygienisch mit Sp\u00fclungen ausgestattet. M\u00e4rkl: \"Es lohnt sich, den Stellplatz an zufahren, man sp\u00fcrt sofort, dass den Betreibern das Wohl ihrer G\u00e4ste und das Wohl unserer Umwelt und Natur am Herzen liegen\". Informationen dar\u00fcber, wie man Mitglied oder F\u00f6rdermitglied werden kann, sind unter www.wohnmobil-fuer-klimaschutz.de zu finden.", - "tags": [], - "status": "On Hold", + "text": "Fr\u00fchjahrsaktionen vom Verein WOHNmobil f\u00fcr Klimaschutz\n\nDer Verein WOHNmobil f\u00fcr Klimaschutz e.V. hat in Teilen Deutschlands insgesamt 6.000 Setzlinge von verschiedenen B\u00e4umen, darunter Hainbuchen, Rotbuchen, Eichen und Wei\u00dftannen, als Teil seiner \"Fr\u00fchjahrs-Tour\" gepflanzt. In Teams von 12 bis 18 Mitgliedern unternahmen sie drei Wochenendtripps im M\u00e4rz und Anfang April nach Jagsthausen, Uchte, Wernigerode und Harkebr\u00fcgger See, um die jungen B\u00e4ume zusammen mit dem \u00f6rtlichen Revierf\u00f6rster zu pflanzen. Zwei der Fl\u00e4chen waren zuvor von Fichten belegt, die Trockenheit, St\u00fcrme und Borkenk\u00e4fer nicht \u00fcberlebt hatten. Bei der anderen Fl\u00e4che wurden die Setzlinge in einen Kiefernbestand gepflanzt, um einen gemischten Wald zu schaffen. Mit diesen neuen Setzlingen hat der Verein nun fast 19.000 B\u00e4ume gespendet und gepflanzt.\n\nDer Verein WOHNmobil f\u00fcr Klimaschutz e.V. f\u00f6rdert auch das umweltfreundliche und -bewusste Camping, indem er \u00f6kologische Wohnmobil-Stellpl\u00e4tze bewertet und auszeichnet. Am 27. M\u00e4rz 2025 hat der Verein das Wohnmobilcamp Sm\u00e5land am Harkebr\u00fcgger See zum \"\u00d6kologischen Wohnmobilstellplatz 2025\" gek\u00fcrt. Der Stellplatz verf\u00fcgt \u00fcber energie- und wassersparende Einrichtungen, eine sorgf\u00e4ltige M\u00fclltrennung und Informationen f\u00fcr die G\u00e4ste \u00fcber umweltschonendes Verhalten. Der Vereinsvorstand, Albert M\u00e4rkl, lobte die Betreiber f\u00fcr ihr Engagement f\u00fcr die Umwelt und das Wohl ihrer G\u00e4ste. Weitere Informationen dazu, wie man Mitglied oder F\u00f6rdermitglied im Verein werden kann, sind auf der Vereins-Website zu finden.", + "tags": [ + "1. Klimaschutz", + "2. B\u00e4ume pflanzen", + "3. \u00d6kologisches Camping" + ], + "status": "Online", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5924", "images": [ { @@ -71,6 +75,13 @@ "caption": "Bild aus Originalartikel", "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5924" + }, + { + "url": "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", + "alt": "KI-generiertes Titelbild zu: Fr\u00fchjahrsaktionen vom Verein WOHNmobil f\u00fcr Klimaschutz", + "caption": "KI-generiertes Titelbild zu: Fr\u00fchjahrsaktionen vom Verein WOHNmobil f\u00fcr Klimaschutz", + "copyright": "OpenAI DALL\u00b7E", + "copyright_url": "https://openai.com/dall-e" } ] }, @@ -243,9 +254,13 @@ "title": "Den eigenen Verbrauchszahlen auf der Spur", "date": "Thu, 05 Jun 2025 00:00:00 +0200", "summary": "Campingplatz Kirchzarten erhält EU Ecolabel", - "text": "Auf dem Campingplatz Kirchzarten wirtschaftet Inhaber Jens Ziegler schon seit Jahrzehnten nachhaltig. Das ist\u00a0ein Herzensanliegen f\u00fcr den Familienvater: \u201eIch m\u00f6chte meinen Kindern eine Umwelt hinterlassen, in der sie weiterleben k\u00f6nnen.\u201c Der Campingplatz Kirchzarten liegt vor den Toren Freiburgs. Hierher kommen die G\u00e4ste, um zu wandern, Rad zu fahren, die Natur des Schwarzwaldes zu genie\u00dfen, um Ausfl\u00fcge etwa nach Freiburg zu unternehmen oder um im Winter Ski zu fahren. Seit Jahren geh\u00f6rt Camping Kirchzarten zu den attraktivsten Campingpl\u00e4tzen in Europa. Das ist kein Zufall. Inhaber Jens Ziegler verbessert seinen Platz st\u00e4ndig. Eines seiner Ziele - das Europ\u00e4ische Um weltzeichen EU Ecolabel erringen. Schon lange arbeitet dieser Betrieb nachhaltig, ist von Anfang an bei ECOCAMPING dabei. Viele der Kriterien f\u00fcr das EU Ecolabel sch\u00fcttelte Ziegler deshalb f\u00fcr seinen Campingplatz praktisch aus dem \u00c4rmel. Aber nicht alle. Seit 70 Jahren besteht der Campingplatz in Kirchzarten schon. Er wurde gebaut, als der Klimawandel noch kein Thema war. Der Klimawandel ist aber inzwischen auch im Schwarzwald sp\u00fcrbar. Wasser sparen ist angezeigt. Bislang hatte Ziegler keine detaillierten Verbrauchsdaten erhoben. Das musste sich f\u00fcrs EU Ecolabel \u00e4ndern. Und siehe da, der Durchfluss war zu hoch. F\u00fcr das EU Ecolabel sollte er nicht mehr als 8,5 Liter pro Minute betragen. \u201eWir lagen bei 12 Litern. Da war ich doch ein wenig erschrocken\u201c, sagt Ziegler. Er versuchte den Durchfluss mit Spareins\u00e4tzen in den Leitungen zu drosseln, doch da beschwerten sich die G\u00e4ste \u00fcber eine tr\u00f6pfelnde Dusche. Ziegler tauschte alle Armaturen wie Brausek\u00f6pfe und H\u00e4hne aus gegen Wassersparmodelle. Seitdem duschen seine G\u00e4ste mit gewohntem Komfort, w\u00e4hrend Ziegler mit 8 Litern pro Minute die Anforderungen unterboten hat. Im kommenden Winter will Ziegler zwei Regenwasserzisternen bauen, um nicht mit Trinkwasser zu bew\u00e4ssern. Wo sich Hummeln tummeln Dass auf seinem Platz keine Pestizide eingesetzt werden, war Ziegler schon lange ein Anliegen. Er setzt auf ein heimische B\u00e4ume und Str\u00e4ucher und neu auch auf bienenfreundliche Blumenwiesen. Als vor drei Jahren eine Gr\u00fcnfl\u00e4che vor dem neuen Sanit\u00e4rgeb\u00e4ude angelegt werden musste, wandelten sie Rasen in ein bienenfreund liches Stauden- und Blumenbeet um. Inzwischen will er Eckbereiche zu Hummel-tummel-Pl\u00e4tzen umgestalten. Nicht mehr als 10 Prozent der Gesamtfl\u00e4che d\u00fcrfen f\u00fcr das EU Ecolabel versiegelt sein. \u201eDa liegen wir deutlich drunter\u201c, sagt Inhaber Ziegler. F\u00fcr den neuen Wertstoffplatz lie\u00df er Drain-Pflaster verlegen, der stabil ist und bei dem das Regenwasser durch die Fugen versickert. Nachhaltigkeit ist ein st\u00e4ndiges Thema f\u00fcr Ziegler: Inzwischen sind alle Beleuchtungen in den Geb\u00e4uden auf LED umgestellt und wenn sinnvoll mit Bewegungsmeldern ausgestattet. In den Mietunterk\u00fcnften stecken die Reinigungssets in Papierkartons statt in Plastik. Durch die digitale Rezeption halbierte sich der Papierverbrauch. \u201eSeit dem gibt es keine Schlangen mehr vor der Rezeption. Und wir haben mehr Zeit f\u00fcr die G\u00e4ste\u201c, sagt Ziegler. Er brauche seitdem weniger Personal, ein Vorteil, denn auch den Personalmangel sp\u00fcrten sie im Schwarzwald. Eine neue Heizanlage mit zwei W\u00e4rmepumpen ersetzt inzwischen den alten Gaskessel. Gas wird noch bei Spit zenlasten eingesetzt. Die eigene Photovoltaikanlage deckt etwa 12 Prozent des Strombedarfs. Zunehmend machen Stromspitzen zu schaffen. Um diese abzufedern, will Ziegler Speicher f\u00fcr den eigenen Sonnenstrom an schaffen. Technische Infos kamen vom ECOCAMPING-Auditor Martin Rolletschek, der das Camp pers\u00f6nlich besuchte, bevor er gr\u00fcnes Licht f\u00fcrs EU Ecolabel gab. \u201eDas pers\u00f6nliche Audit hat mir sehr viel gebracht\u201c, sagt Ziegler. Das EU Ecolabel: der europaweite Weg zu mehr Nachhaltigkeit Das EU Ecolabel ist der in der gesamten EU anerkannte Weg f\u00fcr Betriebe, welche in Fragen des Umweltschutzes\u00a0Vorbild sein wollen. Das Europ\u00e4ische Umweltzeichen zeichnet seit \u00fcber 30 Jahren umweltfreundlichere Produkte und Dienstleistungen in ganz Europa aus \u2013 seit 2005 auch Hotels und Campingpl\u00e4tze. Diese Campingpl\u00e4tze haben gemeinsam, dass sie konkrete Ma\u00dfnahmen f\u00fcr mehr Nachhaltigkeit in ihren Betrieben umgesetzt haben und den strengen Kriterien des EU Ecolabels entsprechen. Campingpl\u00e4tze m\u00fcssen dabei 22 Pflicht-Kriterien und einen Teil der 45 K\u00fcr-Kriterien erf\u00fcllen. Verpflichtend ist beispielsweise die ausschlie\u00dfliche Nutzung von \u00d6kostrom, LED-Beleuchtung und wassersparender Duschk\u00f6pfen. Eine optimale Ma\u00dfnahme kann sein, \u00f6kologisch g\u00fcnstige Verkehrsmittel anzubieten wie etwa einen Fahrrad-Verleih.", - "tags": [], - "status": "On Hold", + "text": "Den eigenen Verbrauchszahlen auf der Spur\n\nDer Campingplatz Kirchzarten wird vom Inhaber Jens Ziegler nachhaltig betrieben. Er strebt das Europ\u00e4ische Umweltzeichen EU Ecolabel an und hat daf\u00fcr verschiedene \u00c4nderungen am Campingplatz vorgenommen. \n\nZiegler hat den Wasserdurchfluss auf seinem Platz reduziert, um den Verbrauch zu verringern. Er hat alle Armaturen wie Brausek\u00f6pfe und Wasserh\u00e4hne gegen wassersparende Modelle ausgetauscht. Dar\u00fcber hinaus plant Ziegler, zwei Regenwasserzisternen zu bauen, um die Bew\u00e4sserung nicht mehr mit Trinkwasser durchf\u00fchren zu m\u00fcssen.\n\nDer Einsatz von Pestiziden auf dem Campingplatz Kirchzarten ist nicht erlaubt. Stattdessen konzentriert sich Ziegler auf einheimische Pflanzen und Str\u00e4ucher sowie bienenfreundliche Blumenwiesen. Er plant au\u00dferdem, bestimmte Bereiche des Campingplatzes in lebendige Hummel-Pl\u00e4tze zu verwandeln. \n\nDar\u00fcber hinaus achtet Ziegler darauf, dass die Beleuchtung in den Geb\u00e4uden auf umweltfreundliche LED-Lichter umgestellt ist und dass die Reinigungssets in umweltfreundlichen Papierkartons anstatt in Plastik verpackt sind. Zudem halbierte die digitale Rezeption den Papierverbrauch und verbessert die Effizienz des Personals. \n\nDie Heizanlage auf dem Campingplatz wurde durch zwei W\u00e4rmepumpen ersetzt, die den alten Gaskessel ersetzen. Ziegler betreibt au\u00dferdem eine eigene Photovoltaikanlage, die etwa 12% des Strombedarfs deckt und plant, Speicher f\u00fcr den eigenen Sonnenstrom zu installieren. \n\nCamping Kirchzarten ist seit langem Mitglied der Organisation ECOCAMPING, was Ziegler half, viele der Kriterien f\u00fcr das EU Ecolabel zu erf\u00fcllen. Durch seine nachhaltigen Bem\u00fchungen wurde Camping Kirchzarten zu einem der attraktivsten Campingpl\u00e4tze in Europa.", + "tags": [ + "Nachhaltiges Camping", + "EU Ecolabel", + "Umweltfreundliche Ma\u00dfnahmen" + ], + "status": "Online", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5929", "images": [ { @@ -366,6 +381,13 @@ "caption": "Bild aus Originalartikel", "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5929" + }, + { + "url": "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", + "alt": "KI-generiertes Titelbild zu: Den eigenen Verbrauchszahlen auf der Spur", + "caption": "KI-generiertes Titelbild zu: Den eigenen Verbrauchszahlen auf der Spur", + "copyright": "OpenAI DALL\u00b7E", + "copyright_url": "https://openai.com/dall-e" } ] }, @@ -498,9 +520,13 @@ "title": "Das weltweit gr\u00f6\u00dfte Caravaning-Erlebnis", "date": "Tue, 13 May 2025 00:00:00 +0200", "summary": "Vom 29. August (Preview Day) bis zum 7. September 2025 wird Düsseldorf erneut zum Treffpunkt der Caravaning-Welt", - "text": "Der CARAVAN SALON ist die gr\u00f6\u00dfte und wichtigste Messe weltweit, die sich ausschlie\u00dflich dem Thema Caravaning widmet - und macht dieses Lebensgef\u00fchl zu einem einzigartigen Messe-Erlebnis. Als unangefochtener Branchentreffpunkt pr\u00e4sentiert die weltweit f\u00fchrende Leitmesse die gr\u00f6\u00dfte Auswahl an Reisemobilen, Caravans und Campervans. Erg\u00e4nzt wird das Angebot durch eine unvergleichliche Vielfalt an Zubeh\u00f6r, technischem Equipment, Ausbauteilen, Dachzelten, Mobilheimen, Caravaning- und Campingzubeh\u00f6r, Reisedestinationen, Campingpl\u00e4tzen sowie Reisemobilstellpl\u00e4tzen. Messeerlebnis nicht zu ersetzen \u201eGerade in herausfordernden Zeiten zeigt sich eindrucksvoll, welchen unsch\u00e4tzbaren Wert Messen f\u00fcr unsere Branche haben. Potenzielle Kunden wollen die Fahrzeuge vor der Kaufentscheidung nicht nur sehen \u2013 sie wollen erleben, anfassen, vergleichen, einsteigen und sp\u00fcren, welcher Grundriss zu ihrem Lebensstil passt. Der CARAVAN SALON ist der einzige Ort, an dem alle renommierten nationalen und internationalen Hersteller versammelt sind \u2013 und Besucher die ganze Bandbreite des Marktes auf einen Blick erfassen k\u00f6nnen\u201c, sagt Director Stefan Koschke. In D\u00fcsseldorf werden die Premieren der kommenden Saison gezeigt: Top-Produkte, Innovationen und Weltneuheiten \u2013 erstmals \u00f6ffentlich erlebbar, erg\u00e4nzt durch zahlreiche spannende Neuaussteller, die die Modellvielfalt nochmals erweitern. \u201eDas Messeerlebnis CARAVAN SALON wird damit noch intensiver, vom passenden Fahrzeug bis zum ganz pers\u00f6nlichen Traumziel\u201c, erg\u00e4nzt Stefan Koschke. Neue Halleneinteilung \u2013 noch mehr entdecken, noch leichter finden Dank einer neuen, \u00fcbersichtlich gestalteten Hallenstruktur, gelangen Besucherinnen und Besucher weiterhin schnell und gezielt in ihre pers\u00f6nliche Caravaning-Welt. Ob Camping-Neuling, Technik-Fan, kreativer Selbstausbauer oder Luxus-Liebhaber \u2013 auf dem CARAVAN SALON kommt jeder auf seine Kosten und entdeckt genau das, was das eigene Herz h\u00f6herschlagen l\u00e4sst. \u201eMit der neuen Aufteilung schaffen wir ein inspirierendes Messeerlebnis f\u00fcr unsere G\u00e4ste. Durch laufende Modernisierungen des Gel\u00e4ndes und der Hallen sichern wir auch langfristig optimale Bedingungen f\u00fcr Beratung, Austausch und Networking. Im Zuge dieser Ma\u00dfnahmen wird Halle 9 vor\u00fcbergehend nicht genutzt \u2013 daf\u00fcr d\u00fcrfen sich Besucher auf interessante und spannende Platzierungen vieler Marken in einem frischen Umfeld freuen\u201c, erkl\u00e4rt Stefan Koschke. Caravaning so beliebt wie nie zuvor \u201eCaravaning 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\u00e4ngst generationen\u00fcbergreifend zu einer der beliebtesten Reiseformen entwickelt \u2013 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\u00fchne der Caravaningbranche ist. Nirgendwo sonst ist die Vielfalt an Fahrzeugen, Zubeh\u00f6r, Dienstleistungen und Reiseinspirationen gr\u00f6\u00dfer als in D\u00fcsseldorf. Jahr f\u00fcr Jahr untermauert der CARAVAN SALON damit seine Rolle als Leuchtturm der Branche\u201c, erkl\u00e4rt Daniel Onggowinarso, Gesch\u00e4ftsf\u00fchrer des Caravaning Industrie Verbandes (CIVD). Der Preview Day am 29. August bietet mit begrenztem Ticketkontingent eine besonders entspannte Atmosph\u00e4re f\u00fcr alle, die die Neuheiten der Branche in Ruhe entdecken wollen. Der Ticketverkauf startet am 11. Juni. Aktuelle Informationen und Neuigkeiten gibt es im Internet unter www.caravan-salon.de .", - "tags": [], - "status": "On Hold", + "text": "Das weltweit gr\u00f6\u00dfte Caravaning-Erlebnis\n\nDer CARAVAN SALON ist die weltweit gr\u00f6\u00dfte Messe, die sich speziell auf Caravaning konzentriert, und bietet eine eindrucksvolle Ausstellung von Reisemobilen, Caravans und Campervans. Zu dem breiten Angebot geh\u00f6ren aber auch Zubeh\u00f6r, technisches Equipment, Ausbauteile, Dachzelte, Mobilheime und Campingzubeh\u00f6r. Der Salon ist auch ein Ort, an dem Besucher Reiseziele, Campingpl\u00e4tze und Wohnmobilstellpl\u00e4tze entdecken k\u00f6nnen. Besucher haben die M\u00f6glichkeit, die Fahrzeuge vor dem Kauf intensiv zu begutachten, zu testen und zu vergleichen, um das f\u00fcr ihren Lebensstil passende Modell zu finden. Als weltweit f\u00fchrendes Event in diesem Bereich versammelt der CARAVAN SALON sowohl nationale als auch internationale Hersteller, und pr\u00e4sentiert die neuesten Produkte, Innovationen und Weltneuheiten. Mit einer neuen und \u00fcbersichtlichen Hallenstruktur sind die Ausstellungsst\u00fccke leicht zu finden und zu vergleichen. Der CARAVAN SALON zeichnet sich dadurch aus, dass er allen Besuchern, ob Neueinsteiger oder Luxus-Liebhaber, ein spannendes Messeerlebnis bietet. Laut dem Gesch\u00e4ftsf\u00fchrer des Caravaning Industrie Verbandes, Daniel Onggowinarso, spiegelt der Salon auch die steigende Beliebtheit und das Wachstum der Caravaningbranche wider. Der Preview Day bietet eine ruhige Atmosph\u00e4re f\u00fcr diejenigen, die die Neuheiten der Branche in Ruhe entdecken wollen. Der Ticketverkauf beginnt am 11. Juni und weitere Informationen sind auf der Website www.caravan-salon.de zu finden.", + "tags": [ + "Caravaning", + "CARAVAN SALON", + "Reisemobile" + ], + "status": "Process", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5926", "images": [ { @@ -572,6 +598,13 @@ "caption": "Bild aus Originalartikel", "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5926" + }, + { + "url": "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", + "alt": "KI-generiertes Titelbild zu: Das weltweit gr\u00f6\u00dfte Caravaning-Erlebnis", + "caption": "KI-generiertes Titelbild zu: Das weltweit gr\u00f6\u00dfte Caravaning-Erlebnis", + "copyright": "OpenAI DALL\u00b7E", + "copyright_url": "https://openai.com/dall-e" } ] }, diff --git a/logs/rss_tool.log b/logs/rss_tool.log index d1d04d6..01b220e 100644 --- a/logs/rss_tool.log +++ b/logs/rss_tool.log @@ -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 diff --git a/test_checklist.md b/test_checklist.md new file mode 100644 index 0000000..16e15fa --- /dev/null +++ b/test_checklist.md @@ -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 | | diff --git a/utils/dalle_generator.py b/utils/dalle_generator.py new file mode 100644 index 0000000..80ea607 --- /dev/null +++ b/utils/dalle_generator.py @@ -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 From 082737a9c4e767efe867a531dd6cfcebcaaf275f Mon Sep 17 00:00:00 2001 From: Oliver G Date: Tue, 8 Jul 2025 10:56:15 +0200 Subject: [PATCH 04/87] Update README.md --- README.md | 82 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 19f88fd..45b913e 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,71 @@ -# 📰 RSS Article Manager +# 📰 RSS News Bot -Ein einfaches, modulares Webtool auf Basis von Streamlit, das RSS-Artikel automatisch einliest, umschreibt, zusammenfasst und mit Tags versieht – bereit zur Veröffentlichung auf WordPress. +Ein intelligentes Tool zum Einlesen, Umschreiben und Veröffentlichen von Artikeln aus RSS-Feeds – mit automatischer Tag-Erkennung, KI-unterstütztem Rewrite via GPT-4, Bildextraktion aus Originalartikeln und optionaler DALL·E-Bildgenerierung. -## ✨ Funktionen +![Version](https://img.shields.io/badge/version-1.5.0-blue) +![License](https://img.shields.io/badge/license-MIT-green) +![Python](https://img.shields.io/badge/python-3.10+-yellow) +![Streamlit](https://img.shields.io/badge/built%20with-Streamlit-ff4b4b) -- 📥 RSS-Feeds direkt über die Oberfläche hinzufügen und verwalten -- 📝 Artikel automatisch umschreiben mit Hilfe von ChatGPT -- 🏷️ Tags und Zusammenfassungen automatisch generieren -- 🗂️ Übersicht in tabellarischer Form mit Filter nach Status -- 📋 Kopierbare Inhalte für manuelles Einfügen in WordPress -- 📎 Link zum Originalartikel zur einfachen Bildübernahme -- 💾 Speicherung in einer lokalen JSON-Datei (später SQLite möglich) -- 📦 Versionierung inkl. CHANGELOG und GitHub Releases +--- -## 🔐 Voraussetzungen +## 🚀 Features -- Python 3.8+ -- OpenAI API Key (per `.env` eingebunden) +- 📡 **RSS-Feeds verwalten** (hinzufügen, aktualisieren) +- ✍️ **Artikel automatisch umschreiben** mit GPT-4 +- 🏷️ **Tags automatisch generieren** +- 🖼️ **Bilder aus Originalartikeln extrahieren** +- 🪄 **Optionales DALL·E-Bild generieren** +- 🔧 **Bearbeiten von Bildmetadaten** +- 🗂️ **Statusverwaltung der Artikel (New, Rewrite, Process, etc.)** +- 📜 **Log-Viewer-Seite integriert** +- 📥 **Export zur Veröffentlichung auf WordPress vorbereitet** -## 🚀 Loslegen +--- + +📋 Artikeltabelle mit Status-Filter +🔍 Artikel-Expander mit Rewrite, Tags & Bildern +🪄 Button für KI-Bildgenerierung + + +--- + +## 🧱 Projektstruktur + +ss-news/ +├── app.py # Haupt-UI mit Streamlit +├── main.py # Logik für Feed-Import und Verarbeitung +├── utils/ +│ └── image_extractor.py # Bilder aus Originalartikeln extrahieren +│ └── dalle_generator.py # DALL·E-Integration (KI-Bild) +├── pages/ +│ └── log_viewer.py # UI zur Anzeige der Logs +├── data/ +│ └── articles.json # Gespeicherte Artikel +│ └── feeds.json # Gespeicherte Feed-URLs +├── logs/ +│ └── rss_tool.log # Logging der Verarbeitung +├── versioning.py # CLI-Tool zur Versionierung & Release +├── TEST-CHECKLIST.md # Manuelle Prüfliste für Releases +├── version.py # Aktuelle Version +└── CHANGELOG.md # Änderungsprotokoll + + +--- + +## ⚙️ Installation ```bash -# Setup -git clone https://github.com/dein-benutzername/rss-article-manager.git -cd rss-article-manager -bash start.sh +git clone https://github.com/OliverGiertz/rss-news.git +cd rss-news +python -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +``` + +--- + +## ▶️ Starten der App + +streamlit run app.py + From 1b3ecbb3dbda6882b599db15a56205e81ed015ee Mon Sep 17 00:00:00 2001 From: Oliver G Date: Tue, 8 Jul 2025 11:15:34 +0200 Subject: [PATCH 05/87] =?UTF-8?q?=F0=9F=94=92=20Erweiterung=20der=20.gitig?= =?UTF-8?q?nore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bc94230..d714f32 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,4 @@ Thumbs.db internal/start.sh internal/copy_files.sh internal/_line.txt - +internal/push_commit.txt From 4e042edaafeb83687541a17239a4d6b8b40e22af Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 9 Jul 2025 08:30:18 +0200 Subject: [PATCH 06/87] Add GitHub Issue & PR templates --- .github/ISSUE_TEMPLATE/bug_report.md | 30 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 ++++ .github/ISSUE_TEMPLATE/feature_request.md | 22 +++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 18 ++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..833cc2c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,30 @@ +--- +name: 🐞 Bug melden +about: Etwas funktioniert nicht wie erwartet? Dann bitte hier melden. +title: "[Bug]: " +labels: bug +--- + +### 🐛 Fehlerbeschreibung + +Beschreibe klar und prägnant, was nicht funktioniert. + +### 🔁 Schritte zur Reproduktion + +1. ... +2. ... +3. ... + +### 🤔 Erwartetes Verhalten + +Was hättest du erwartet, was passieren soll? + +### 📷 Screenshot oder Logauszug (optional) + +Wenn hilfreich, Screenshot oder Terminal-Fehlermeldung einfügen. + +### 🧩 Kontext / Systeminfos + +- Version: z. B. `v1.5.0` +- Python-Version: +- Betriebssystem: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..b4830a3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: 💬 Frage oder Feedback + url: https://github.com/OliverGiertz/rss-news/discussions + about: Nutze GitHub Discussions für allgemeine Fragen oder Feedback. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..5ea74ed --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,22 @@ +--- +name: ✨ Feature Request +about: Du hast eine Idee oder willst eine Funktion vorschlagen? Her damit! +title: "[Feature]: " +labels: enhancement +--- + +### 🚀 Beschreibung der Funktion + +Was soll die neue Funktion können? + +### 🧠 Warum ist das nützlich? + +Welches Problem löst das Feature oder wie verbessert es das Tool? + +### 💡 Vorschläge zur Umsetzung (optional) + +Wie könnte man das technisch umsetzen? + +### 🔗 Relevante Verweise (optional) + +Links, Screenshots, Mockups oder Referenzcode. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..615dc14 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ +## ✅ Änderungen in diesem Pull Request + +- [x] Kurze Beschreibung der Änderung +- [ ] ggf. Screenshots oder Codebeispiele + +## 🧪 Tests + +- [ ] Lokal getestet +- [ ] Streamlit UI geprüft +- [ ] Linter/Formatter ausgeführt + +## 🔗 Zusammenhang mit Issues + +Closes #123 (optional) + +## 📎 Sonstiges + +Falls nötig: Kontext, bekannte Einschränkungen etc. From 91baacd355fd94b8234c15bd06fecf7d3f7ede3c Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 9 Jul 2025 09:03:46 +0200 Subject: [PATCH 07/87] =?UTF-8?q?Entferne=20nicht=20mehr=20ben=C3=B6tigte?= =?UTF-8?q?=20Dateien?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __version__.py | 1 - processed_articles.json | 1 - 2 files changed, 2 deletions(-) delete mode 100644 __version__.py delete mode 100644 processed_articles.json diff --git a/__version__.py b/__version__.py deleted file mode 100644 index 177b935..0000000 --- a/__version__.py +++ /dev/null @@ -1 +0,0 @@ -VERSION = "1.5.0" diff --git a/processed_articles.json b/processed_articles.json deleted file mode 100644 index 0637a08..0000000 --- a/processed_articles.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file From 2a9fa1e548918f6a46cd27955d15cad6b699edca Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 9 Jul 2025 19:02:52 +0200 Subject: [PATCH 08/87] =?UTF-8?q?=F0=9F=94=90=20Update:=20versioning.py=20?= =?UTF-8?q?um=20GPG-Tagging=20erweitert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- versioning.py | 146 +++++++++----------------------------------------- 1 file changed, 25 insertions(+), 121 deletions(-) diff --git a/versioning.py b/versioning.py index 9c40e02..3c47f37 100644 --- a/versioning.py +++ b/versioning.py @@ -1,5 +1,3 @@ -# versioning.py - import re import subprocess from pathlib import Path @@ -12,13 +10,11 @@ CHANGELOG_FILE = Path("CHANGELOG.md") VERSION_FILE = Path("__version__.py") VERSION_PATTERN = r"## \[v?(\d+\.\d+\.\d+)\]" - def get_latest_version(): content = CHANGELOG_FILE.read_text(encoding="utf-8") matches = re.findall(VERSION_PATTERN, content) return matches[0] if matches else "0.0.0" - def bump_version(version: str, level: str = "patch") -> str: major, minor, patch = map(int, version.split(".")) if level == "major": @@ -27,132 +23,40 @@ def bump_version(version: str, level: str = "patch") -> str: return f"{major}.{minor + 1}.0" return f"{major}.{minor}.{patch + 1}" - def write_version_file(version: str): VERSION_FILE.write_text(f"VERSION = \"{version}\"\n", encoding="utf-8") - typer.echo(f"🔢 __version__.py aktualisiert auf {version}") - -def prepend_changelog(version: str): - today = datetime.today().strftime("%Y-%m-%d") - new_entry = f"\n\n## [v{version}] – {today}\n\n### 💡 Neue Funktionen\n- \n\n### 🔧 Änderungen & Fixes\n- \n\n### 📦 Internes\n- " - original = CHANGELOG_FILE.read_text(encoding="utf-8") - CHANGELOG_FILE.write_text(new_entry + original, encoding="utf-8") - typer.echo(f"📝 Neuer Eintrag für v{version} zu CHANGELOG.md hinzugefügt") - - -def validate_changelog(version: str) -> bool: +def update_changelog(version: str): + date = datetime.now().strftime("%Y-%m-%d") + new_entry = f"## [{version}] - {date}\n\n- Beschreibung...\n\n" content = CHANGELOG_FILE.read_text(encoding="utf-8") - pattern = rf"## \[v?{re.escape(version)}\](.*?)^## \[" - match = re.search(pattern, content + "\n## [", re.DOTALL | re.MULTILINE) - if match: - section = match.group(1).strip() - if any(line.strip() != "-" for line in section.splitlines() if line.strip()): - return True - typer.echo("⚠️ CHANGELOG-Eintrag ist noch leer oder unvollständig.") - return False + CHANGELOG_FILE.write_text(new_entry + content, encoding="utf-8") - -def tag_exists(tag: str) -> bool: - result = subprocess.run(["git", "tag"], capture_output=True, text=True) - return tag in result.stdout.splitlines() - - -def ensure_branch(expected_branch="main"): - result = subprocess.run(["git", "rev-parse", "--abbrev-ref", "HEAD"], capture_output=True, text=True) - branch = result.stdout.strip() - if branch != expected_branch: - typer.echo(f"⛔ Du befindest dich auf Branch '{branch}', erwartet wird '{expected_branch}'") - raise typer.Exit(code=1) - - -def extract_changelog_entry(version: str) -> str: - content = CHANGELOG_FILE.read_text(encoding="utf-8") - pattern = rf"## \[v?{re.escape(version)}\](.*?)^## \[" - match = re.search(pattern, content + "\n## [", re.DOTALL | re.MULTILINE) - return match.group(1).strip() if match else "" - - -def create_git_tag(version: str): - try: - if tag_exists(f"v{version}"): - typer.echo(f"⚠️ Tag v{version} existiert bereits.") - return - - subprocess.run(["git", "add", "."], check=True) - subprocess.run(["git", "commit", "-m", f"🔖 Release v{version}"], check=True) - subprocess.run(["git", "tag", f"v{version}"], check=True) - typer.echo(f"🏷️ Git-Tag 'v{version}' erstellt und commit durchgeführt.") - except subprocess.CalledProcessError: - typer.echo("⚠️ Git-Fehler beim Taggen oder Committen. Bitte manuell prüfen.") - - -def push_to_github(): - try: - subprocess.run(["git", "push"], check=True) - subprocess.run(["git", "push", "--tags"], check=True) - typer.echo("🚀 Änderungen und Tags an GitHub gepusht.") - except subprocess.CalledProcessError: - typer.echo("⚠️ Fehler beim Pushen zu GitHub. Bitte Zugang oder Netzwerk prüfen.") - - -@app.command() -def list(): - "Listet alle verfügbaren Versionen aus dem CHANGELOG" - typer.echo("\n📚 Verfügbare Versionen im CHANGELOG:") - content = CHANGELOG_FILE.read_text(encoding="utf-8") - versions = re.findall(VERSION_PATTERN, content) - for v in versions: - typer.echo(f"- v{v}") - - -@app.command() -def rollback(): - "Letzte Version zurückrollen (Tag löschen + Commit zurücknehmen)" - last_version = get_latest_version() - if typer.confirm(f"⚠️ Letzte Version 'v{last_version}' wirklich zurücknehmen?"): - try: - subprocess.run(["git", "tag", "-d", f"v{last_version}"], check=True) - subprocess.run(["git", "reset", "--hard", "HEAD~1"], check=True) - typer.echo(f"🔙 Version 'v{last_version}' wurde zurückgerollt.") - except subprocess.CalledProcessError: - typer.echo("❌ Rollback fehlgeschlagen.") +def create_git_tag(version: str, signed: bool = True): + tag_args = ["git", "tag"] + if signed: + tag_args.append("-s") # signierter Tag else: - typer.echo("⛔ Abgebrochen.") + tag_args.append("-a") # un-signierter, annotierter Tag + tag_args += [f"v{version}", "-m", f"Release v{version}"] + subprocess.run(tag_args, check=True) +def push_git_tag(version: str): + subprocess.run(["git", "push"], check=True) + subprocess.run(["git", "push", "origin", f"v{version}"], check=True) @app.command() -def create(level: str = typer.Option("patch", help="Versionstyp: patch, minor oder major"), - push: bool = typer.Option(False, help="Änderungen direkt an GitHub pushen")): - "Neue Version erstellen inkl. CHANGELOG, Git-Tag und optional Push" - ensure_branch() - - current_version = get_latest_version() - next_version = bump_version(current_version, level) - - typer.echo(f"💡 Aktuelle Version: {current_version}") - typer.echo(f"🚀 Neue Version: {next_version}") - - if typer.confirm("Version übernehmen und eintragen?"): - write_version_file(next_version) - prepend_changelog(next_version) - - typer.echo("\nBitte CHANGELOG.md bearbeiten und danach fortfahren.") - typer.prompt("Drücke Enter, sobald du den neuen Abschnitt ausgefüllt hast") - - if not validate_changelog(next_version): - typer.echo("❌ Release abgebrochen: Bitte fülle den CHANGELOG-Eintrag aus.") - raise typer.Exit(code=1) - - create_git_tag(next_version) - - if push: - push_to_github() - - typer.echo(f"✅ Version {next_version} erfolgreich erstellt.") - else: - typer.echo("❌ Abgebrochen.") - +def create(level: str = "patch", push: bool = False, unsigned: bool = False): + current = get_latest_version() + new_version = bump_version(current, level) + write_version_file(new_version) + update_changelog(new_version) + subprocess.run(["git", "add", "."], check=True) + subprocess.run(["git", "commit", "-m", f"Bump version to v{new_version}"], check=True) + create_git_tag(new_version, signed=not unsigned) + if push: + push_git_tag(new_version) + typer.echo(f"✅ Version {new_version} erstellt und getaggt{' (unsigned)' if unsigned else ' (signed)'}.") if __name__ == "__main__": app() From d2b6648872057d9f5d24e96a3b2dfc0eac68b520 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 9 Jul 2025 19:43:33 +0200 Subject: [PATCH 09/87] =?UTF-8?q?=F0=9F=94=90=20Update:=20versioning.py=20?= =?UTF-8?q?um=20SSH-Tagging=20erweitert=20inkl=20Vorabpr=C3=BCfung=20sowie?= =?UTF-8?q?=20FallBack=20auf=20GPG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- versioning.py | 65 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/versioning.py b/versioning.py index 3c47f37..d74cfdc 100644 --- a/versioning.py +++ b/versioning.py @@ -3,6 +3,7 @@ import subprocess from pathlib import Path from datetime import datetime import typer +import os app = typer.Typer() @@ -32,31 +33,73 @@ def update_changelog(version: str): content = CHANGELOG_FILE.read_text(encoding="utf-8") CHANGELOG_FILE.write_text(new_entry + content, encoding="utf-8") -def create_git_tag(version: str, signed: bool = True): - tag_args = ["git", "tag"] - if signed: - tag_args.append("-s") # signierter Tag +def is_ssh_signing_available() -> bool: + return Path("~/.ssh/id_ed25519").expanduser().exists() + +def is_gpg_available() -> bool: + try: + output = subprocess.check_output(["gpg", "--list-secret-keys"], stderr=subprocess.DEVNULL) + return bool(output.strip()) + except Exception: + return False + +def configure_signing(use_ssh: bool): + if use_ssh: + subprocess.run(["git", "config", "--global", "gpg.format", "ssh"], check=True) + subprocess.run(["git", "config", "--global", "user.signingkey", "~/.ssh/id_ed25519.pub"], check=True) else: - tag_args.append("-a") # un-signierter, annotierter Tag - tag_args += [f"v{version}", "-m", f"Release v{version}"] - subprocess.run(tag_args, check=True) + subprocess.run(["git", "config", "--global", "gpg.format", "openpgp"], check=True) + subprocess.run(["git", "config", "--global", "commit.gpgsign", "true"], check=True) + +def create_git_tag(version: str, sign: bool): + if sign: + subprocess.run(["git", "tag", "-s", f"v{version}", "-m", f"Release v{version}"], check=True) + else: + subprocess.run(["git", "tag", "-a", f"v{version}", "-m", f"Release v{version} (unsigned)"], check=True) def push_git_tag(version: str): subprocess.run(["git", "push"], check=True) subprocess.run(["git", "push", "origin", f"v{version}"], check=True) @app.command() -def create(level: str = "patch", push: bool = False, unsigned: bool = False): +def create(level: str = "patch", push: bool = False, no_sign: bool = False): current = get_latest_version() new_version = bump_version(current, level) write_version_file(new_version) update_changelog(new_version) subprocess.run(["git", "add", "."], check=True) - subprocess.run(["git", "commit", "-m", f"Bump version to v{new_version}"], check=True) - create_git_tag(new_version, signed=not unsigned) + + use_signing = False + signing_method = "none" + + if not no_sign: + if is_ssh_signing_available(): + configure_signing(use_ssh=True) + use_signing = True + signing_method = "ssh" + elif is_gpg_available(): + configure_signing(use_ssh=False) + use_signing = True + signing_method = "gpg" + + commit_cmd = ["git", "commit", "-m", f"Bump version to v{new_version}"] + if use_signing: + commit_cmd.append("-S") + subprocess.run(commit_cmd, check=True) + + create_git_tag(new_version, sign=use_signing) + if push: push_git_tag(new_version) - typer.echo(f"✅ Version {new_version} erstellt und getaggt{' (unsigned)' if unsigned else ' (signed)'}.") + + if use_signing: + if signing_method == "ssh": + typer.secho(f"✅ Version {new_version} erstellt und signiert mit SSH 🔐", fg=typer.colors.GREEN) + elif signing_method == "gpg": + typer.secho(f"✅ Version {new_version} erstellt und signiert mit GPG 🔏", fg=typer.colors.CYAN) + else: + typer.secho(f"⚠️ Version {new_version} wurde ohne Signatur erstellt", fg=typer.colors.YELLOW) + if __name__ == "__main__": app() From 1badb77173c1e2a1511ff1955a69dd7c222133e6 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 9 Jul 2025 20:08:13 +0200 Subject: [PATCH 10/87] Bump version to v1.5.1 --- CHANGELOG.md | 4 ++++ README.md | 64 +++++++++++++++++++++++++++++++++++++++++++++----- __version__.py | 1 + 3 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 __version__.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c93b2c..befa6b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [1.5.1] - 2025-07-09 + +- Beschreibung... + ## [v1.5.0] – 2025-07-08 diff --git a/README.md b/README.md index 45b913e..8df347e 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,9 @@ Ein intelligentes Tool zum Einlesen, Umschreiben und Veröffentlichen von Artike - 🗂️ **Statusverwaltung der Artikel (New, Rewrite, Process, etc.)** - 📜 **Log-Viewer-Seite integriert** - 📥 **Export zur Veröffentlichung auf WordPress vorbereitet** - ---- - -📋 Artikeltabelle mit Status-Filter -🔍 Artikel-Expander mit Rewrite, Tags & Bildern -🪄 Button für KI-Bildgenerierung +- 📋 Artikeltabelle mit Status-Filter +- 🔍 Artikel-Expander mit Rewrite, Tags & Bildern +- 🪄 Button für KI-Bildgenerierung --- @@ -53,6 +50,61 @@ ss-news/ --- +## 🔐 Signierte Commits und Tags + +Dieses Projekt unterstützt **signierte Commits und Tags über SSH** (alternativ GPG). GitHub zeigt für signierte Beiträge ein ✅ **Verified**-Badge an. + +### 🛠 Voraussetzungen + +1. Ein SSH-Key (z. B. `~/.ssh/id_ed25519`) ist generiert: + + ```bash + ssh-keygen -t ed25519 -C "deine@email.de" + ``` + +2. Key bei GitHub an zwei Stellen hinterlegen: + * 🔏 Signing Keys (für Commit-Signatur) + * 🔐 SSH Keys (für Git-Push/Pull) + +3. Git-Konfiguration + + ```bash + git config --global gpg.format ssh + git config --global user.signingkey ~/.ssh/id_ed25519.pub + git config --global commit.gpgsign true + ``` + +4. Optional: SSH config zur Sicherheit: + + ```bash + # ~/.ssh/config + Host github.com + HostName github.com + User git + IdentityFile ~/.ssh/id_ed25519 + IdentitiesOnly yes + ``` +--- + +🧰 Nutzung von versioning.py +Die Datei versioning.py automatisiert: + + * ⬆️ Versionsnummer erhöhen + * 📄 CHANGELOG.md und __version__.py aktualisieren + * 🔒 Commit signieren (SSH oder GPG) + * 🏷 Git-Tag signieren + * ⬆️ Push zu GitHub + +Beispiel: + + ```bash + python versioning.py create --level minor --push + ``` + +* Wählt automatisch SSH oder GPG zur Signatur +* Optional --no-sign, um ohne Signatur zu arbeiten +--- + ## ⚙️ Installation ```bash diff --git a/__version__.py b/__version__.py new file mode 100644 index 0000000..be684c8 --- /dev/null +++ b/__version__.py @@ -0,0 +1 @@ +VERSION = "1.5.1" From 6ab8bdaadb40a576f91b42c371a4675504f9650a Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 9 Jul 2025 20:31:18 +0200 Subject: [PATCH 11/87] Bump version to v1.5.2 --- CHANGELOG.md | 19 +++++++++++++- README.md | 2 +- __version__.py | 2 +- versioning.py | 70 ++++++++++++++++++++++++++++++++++---------------- 4 files changed, 68 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index befa6b4..51d1d84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,24 @@ -## [1.5.1] - 2025-07-09 +## [1.5.2] - 2025-07-09 - Beschreibung... +## [v1.5.2] - 2025-07-09 + +- Fehlerbehandlung bei `CHANGELOG.md`-Doppelungen hinzugefügt +- Signaturlogik robuster (SSH, GPG, fallback) +- Farbige Terminalausgabe verbessert +- dry-run Argument hinzugefügt: + * Versionsnummer wird berechnet ✅ + * Änderungen (Version, Changelog, Commit, Tag, Push) werden nur angezeigt, nicht ausgeführt ✅ + * Ausgabe erfolgt farbig und klar gegliedert ✅ + + +## [1.5.1] - 2025-07-09 + +SSH-Commit-Signatur in versioning.py eingebaut +Automatischer Fallback auf GPG oder keine Signatur +Farbige Terminalausgabe zur Signaturmethode +Readme erweitert mit Setup-Anleitung ## [v1.5.0] – 2025-07-08 diff --git a/README.md b/README.md index 8df347e..17689ad 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ Die Datei versioning.py automatisiert: Beispiel: ```bash - python versioning.py create --level minor --push + python versioning.py --level minor --push ``` * Wählt automatisch SSH oder GPG zur Signatur diff --git a/__version__.py b/__version__.py index be684c8..3585554 100644 --- a/__version__.py +++ b/__version__.py @@ -1 +1 @@ -VERSION = "1.5.1" +VERSION = "1.5.2" diff --git a/versioning.py b/versioning.py index d74cfdc..1d782e5 100644 --- a/versioning.py +++ b/versioning.py @@ -5,16 +5,21 @@ from datetime import datetime import typer import os -app = typer.Typer() - CHANGELOG_FILE = Path("CHANGELOG.md") VERSION_FILE = Path("__version__.py") VERSION_PATTERN = r"## \[v?(\d+\.\d+\.\d+)\]" def get_latest_version(): - content = CHANGELOG_FILE.read_text(encoding="utf-8") - matches = re.findall(VERSION_PATTERN, content) - return matches[0] if matches else "0.0.0" + try: + # Versuch über Git-Tags + tag = subprocess.check_output(["git", "describe", "--tags", "--abbrev=0"], stderr=subprocess.DEVNULL) + return tag.decode("utf-8").strip().lstrip("v") + except subprocess.CalledProcessError: + # Fallback: Changelog + content = CHANGELOG_FILE.read_text(encoding="utf-8") + matches = re.findall(VERSION_PATTERN, content) + return matches[0] if matches else "0.0.0" + def bump_version(version: str, level: str = "patch") -> str: major, minor, patch = map(int, version.split(".")) @@ -31,7 +36,12 @@ def update_changelog(version: str): date = datetime.now().strftime("%Y-%m-%d") new_entry = f"## [{version}] - {date}\n\n- Beschreibung...\n\n" content = CHANGELOG_FILE.read_text(encoding="utf-8") - CHANGELOG_FILE.write_text(new_entry + content, encoding="utf-8") + + if f"## [{version}]" in content: + typer.secho(f"ℹ️ Version {version} ist bereits im CHANGELOG.md vorhanden. Kein Eintrag hinzugefügt.", fg=typer.colors.BLUE) + else: + CHANGELOG_FILE.write_text(new_entry + content, encoding="utf-8") + typer.secho(f"📄 CHANGELOG.md um Version {version} ergänzt.", fg=typer.colors.MAGENTA) def is_ssh_signing_available() -> bool: return Path("~/.ssh/id_ed25519").expanduser().exists() @@ -51,20 +61,33 @@ def configure_signing(use_ssh: bool): subprocess.run(["git", "config", "--global", "gpg.format", "openpgp"], check=True) subprocess.run(["git", "config", "--global", "commit.gpgsign", "true"], check=True) -def create_git_tag(version: str, sign: bool): - if sign: - subprocess.run(["git", "tag", "-s", f"v{version}", "-m", f"Release v{version}"], check=True) - else: - subprocess.run(["git", "tag", "-a", f"v{version}", "-m", f"Release v{version} (unsigned)"], check=True) - -def push_git_tag(version: str): - subprocess.run(["git", "push"], check=True) - subprocess.run(["git", "push", "origin", f"v{version}"], check=True) - -@app.command() -def create(level: str = "patch", push: bool = False, no_sign: bool = False): +def create( + level: str = "patch", + push: bool = False, + no_sign: bool = False, + dry_run: bool = False +): + """ + Erstellt eine neue Version mit optional signiertem Commit & Tag. + Optional: --push, --no-sign, --dry-run + """ current = get_latest_version() new_version = bump_version(current, level) + + if dry_run: + typer.secho("🔍 Dry-Run aktiviert – keine Dateien oder Git-Kommandos werden ausgeführt.\n", fg=typer.colors.YELLOW) + typer.echo(f"➡️ Aktuelle Version: {current}") + typer.echo(f"➡️ Neue Version: {new_version}") + typer.echo(f"➡️ Commit-Level: {level}") + typer.echo(f"➡️ Push nach GitHub: {'Ja' if push else 'Nein'}") + typer.echo(f"➡️ Signieren: {'Nein' if no_sign else 'Automatisch (SSH > GPG)'}") + + date = datetime.now().strftime("%Y-%m-%d") + typer.echo("\n📄 Vorschlag für CHANGELOG-Eintrag:") + typer.echo(f"\n## [{new_version}] - {date}\n\n- Beschreibung...\n") + typer.secho("🚫 Dry-Run beendet.\n", fg=typer.colors.YELLOW) + return + write_version_file(new_version) update_changelog(new_version) subprocess.run(["git", "add", "."], check=True) @@ -87,10 +110,14 @@ def create(level: str = "patch", push: bool = False, no_sign: bool = False): commit_cmd.append("-S") subprocess.run(commit_cmd, check=True) - create_git_tag(new_version, sign=use_signing) + if use_signing: + subprocess.run(["git", "tag", "-s", f"v{new_version}", "-m", f"Release v{new_version}"], check=True) + else: + subprocess.run(["git", "tag", "-a", f"v{new_version}", "-m", f"Release v{new_version} (unsigned)"], check=True) if push: - push_git_tag(new_version) + subprocess.run(["git", "push"], check=True) + subprocess.run(["git", "push", "origin", f"v{new_version}"], check=True) if use_signing: if signing_method == "ssh": @@ -100,6 +127,5 @@ def create(level: str = "patch", push: bool = False, no_sign: bool = False): else: typer.secho(f"⚠️ Version {new_version} wurde ohne Signatur erstellt", fg=typer.colors.YELLOW) - if __name__ == "__main__": - app() + typer.run(create) From 3862879a03a52cedf6c35de608f5cd4dfa63426d Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 9 Jul 2025 20:36:24 +0200 Subject: [PATCH 12/87] =?UTF-8?q?=F0=9F=94=90=20Update=20versioning.py=20m?= =?UTF-8?q?it=20Warten=20auf=20CHANGELOG.md=20anpassung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- versioning.py | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/versioning.py b/versioning.py index 1d782e5..3a3e6ea 100644 --- a/versioning.py +++ b/versioning.py @@ -11,16 +11,15 @@ VERSION_PATTERN = r"## \[v?(\d+\.\d+\.\d+)\]" def get_latest_version(): try: - # Versuch über Git-Tags + # Zuerst versuchen, Git-Tag auszulesen tag = subprocess.check_output(["git", "describe", "--tags", "--abbrev=0"], stderr=subprocess.DEVNULL) return tag.decode("utf-8").strip().lstrip("v") except subprocess.CalledProcessError: - # Fallback: Changelog + # Fallback auf CHANGELOG.md content = CHANGELOG_FILE.read_text(encoding="utf-8") matches = re.findall(VERSION_PATTERN, content) return matches[0] if matches else "0.0.0" - def bump_version(version: str, level: str = "patch") -> str: major, minor, patch = map(int, version.split(".")) if level == "major": @@ -32,17 +31,6 @@ def bump_version(version: str, level: str = "patch") -> str: def write_version_file(version: str): VERSION_FILE.write_text(f"VERSION = \"{version}\"\n", encoding="utf-8") -def update_changelog(version: str): - date = datetime.now().strftime("%Y-%m-%d") - new_entry = f"## [{version}] - {date}\n\n- Beschreibung...\n\n" - content = CHANGELOG_FILE.read_text(encoding="utf-8") - - if f"## [{version}]" in content: - typer.secho(f"ℹ️ Version {version} ist bereits im CHANGELOG.md vorhanden. Kein Eintrag hinzugefügt.", fg=typer.colors.BLUE) - else: - CHANGELOG_FILE.write_text(new_entry + content, encoding="utf-8") - typer.secho(f"📄 CHANGELOG.md um Version {version} ergänzt.", fg=typer.colors.MAGENTA) - def is_ssh_signing_available() -> bool: return Path("~/.ssh/id_ed25519").expanduser().exists() @@ -88,8 +76,24 @@ def create( typer.secho("🚫 Dry-Run beendet.\n", fg=typer.colors.YELLOW) return + # Update version file write_version_file(new_version) - update_changelog(new_version) + + # Prepare or check changelog entry + date = datetime.now().strftime("%Y-%m-%d") + new_entry = f"## [{new_version}] - {date}\n\n- Beschreibung...\n\n" + content = CHANGELOG_FILE.read_text(encoding="utf-8") + + if f"## [{new_version}]" in content: + typer.secho(f"ℹ️ Version {new_version} ist bereits im CHANGELOG.md vorhanden. Kein Eintrag hinzugefügt.", fg=typer.colors.BLUE) + else: + CHANGELOG_FILE.write_text(new_entry + content, encoding="utf-8") + typer.secho(f"📄 CHANGELOG.md wurde vorbereitet für Version {new_version}.", fg=typer.colors.MAGENTA) + + typer.echo("") + typer.secho("✏️ Bitte jetzt den Eintrag in CHANGELOG.md überprüfen oder anpassen.", fg=typer.colors.CYAN) + input("⏸️ Drücke [Enter], um fortzufahren...") + subprocess.run(["git", "add", "."], check=True) use_signing = False From c49864c4aa59953dd63c9c952c6373ce59dca60d Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 9 Jul 2025 20:36:58 +0200 Subject: [PATCH 13/87] =?UTF-8?q?=F0=9F=94=90=20Korrektur=20Changelog.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51d1d84..6b89715 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,3 @@ -## [1.5.2] - 2025-07-09 - -- Beschreibung... - ## [v1.5.2] - 2025-07-09 - Fehlerbehandlung bei `CHANGELOG.md`-Doppelungen hinzugefügt From b41901b1c1df2cc4ecaa6a911902059c8ceb2db4 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Thu, 10 Jul 2025 10:57:35 +0200 Subject: [PATCH 14/87] Update README.md --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 17689ad..830e554 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Ein intelligentes Tool zum Einlesen, Umschreiben und Veröffentlichen von Artikeln aus RSS-Feeds – mit automatischer Tag-Erkennung, KI-unterstütztem Rewrite via GPT-4, Bildextraktion aus Originalartikeln und optionaler DALL·E-Bildgenerierung. -![Version](https://img.shields.io/badge/version-1.5.0-blue) +![Version](https://img.shields.io/badge/version-1.5.2-blue) ![License](https://img.shields.io/badge/license-MIT-green) ![Python](https://img.shields.io/badge/python-3.10+-yellow) ![Streamlit](https://img.shields.io/badge/built%20with-Streamlit-ff4b4b) @@ -96,10 +96,9 @@ Die Datei versioning.py automatisiert: * ⬆️ Push zu GitHub Beispiel: - - ```bash + ```bash python versioning.py --level minor --push - ``` + ``` * Wählt automatisch SSH oder GPG zur Signatur * Optional --no-sign, um ohne Signatur zu arbeiten From 4eaef89be88f397756c8af21095f7cec876b4e19 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Fri, 11 Jul 2025 09:44:31 +0200 Subject: [PATCH 15/87] Bump version to v1.5.3 --- CHANGELOG.md | 33 + __version__.py | 2 +- app.py | 30 +- data/articles.json | 2828 +++++++++++++++++++++++++++++++++++- data/feeds.json | 13 +- logs/rss_tool.log | 78 + main.py | 12 +- pages/01_feed_manager.py | 71 + utils/article_extractor.py | 27 + utils/article_utils.py | 23 + 10 files changed, 3098 insertions(+), 19 deletions(-) create mode 100644 pages/01_feed_manager.py create mode 100644 utils/article_extractor.py create mode 100644 utils/article_utils.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b89715..2ad8a33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,36 @@ +## [v1.5.3] - 2025-07-11 + +### ✨ Neue Funktionen + +- Automatischer Volltextabruf bei zu kurzen Artikeln (< 50 Wörter) + - Inhalte werden direkt von der Originalseite geladen (ähnlich wie bei der Bildextraktion) + - Promobil, Camping-News und andere gängige WordPress-Seiten werden unterstützt + +- Neue Verwaltungsseite `Feed-Verwaltung` unter `pages/01_feed_manager.py` + - RSS-Feeds können nun über eine dedizierte Oberfläche hinzugefügt, bearbeitet und gelöscht werden + - Anzahl verknüpfter Artikel pro Feed wird angezeigt + - Änderungen werden protokolliert und per `st.rerun()` sofort sichtbar + +### 🔧 Verbesserungen + +- Feed-Filter in der Artikelübersicht zeigt jetzt die **korrekten Feed-Namen mit Artikelanzahl** + - Beispiel: „Promobil News (12)“ statt nur „Alle (20)“ + - Basierend auf `source`-Feld im Artikelobjekt + +- Verbesserte Logging-Ausgaben bei Feed-Aktionen (hinzufügen, ändern, löschen) + +### 📁 Neue Dateien + +- `utils/article_extractor.py` – Logik zum Abrufen vollständiger Artikeltexte von Originalseiten +- `pages/01_feed_manager.py` – Eigenständige Verwaltungsseite für RSS-Feeds + +### 🛠 Interne Änderungen + +- `main.py` erweitert: Automatischer Fallback auf `extract_full_article()` bei zu kurzem Text +- Logging konsolidiert und mit Feed-Aktionen ergänzt + + + ## [v1.5.2] - 2025-07-09 - Fehlerbehandlung bei `CHANGELOG.md`-Doppelungen hinzugefügt diff --git a/__version__.py b/__version__.py index 3585554..c3bc1f8 100644 --- a/__version__.py +++ b/__version__.py @@ -1 +1 @@ -VERSION = "1.5.2" +VERSION = "1.5.3" diff --git a/app.py b/app.py index 34cd8d5..c9c33b8 100644 --- a/app.py +++ b/app.py @@ -1,3 +1,5 @@ +# app.py (aktualisiert mit Feed-Dropdown) + import streamlit as st from datetime import datetime from main import ( @@ -10,6 +12,7 @@ from main import ( ) from utils.dalle_generator import generate_dalle_image import os +from collections import Counter st.set_page_config(page_title="📰 RSS Artikel Manager", layout="wide") st.title("📰 RSS Artikel Manager") @@ -20,7 +23,7 @@ feeds = load_feeds() new_feed = st.sidebar.text_input("Neuen RSS Feed hinzufügen") if st.sidebar.button("Feed hinzufügen"): if new_feed and new_feed not in [f.get("url", f) for f in feeds]: - feeds.append({"url": new_feed}) + feeds.append({"url": new_feed, "name": "Neuer Feed"}) save_feeds(feeds) st.sidebar.success("Feed hinzugefügt") @@ -39,8 +42,28 @@ status_filter = st.selectbox("Status filtern", ["Alle", "New", "Rewrite", "Proce all_articles = load_articles() articles = all_articles + if status_filter != "Alle": - articles = [a for a in all_articles if a.get("status") == status_filter] + articles = [a for a in articles if a.get("status") == status_filter] + +# === Feed-Filter === +source_to_name = {f.get("url"): f.get("name", "unidentified") for f in feeds} +source_counter = Counter([a.get("source", "unidentified") for a in articles]) + +feed_options = ["Alle ({})".format(len(articles))] +feed_map = {} + +for source, count in source_counter.items(): + name = source_to_name.get(source, "unidentified") + label = f"{name} ({count})" + feed_options.append(label) + feed_map[label] = source + +selected_feed_label = st.selectbox("Feed-Auswahl", feed_options) + +if selected_feed_label != feed_options[0]: # nicht „Alle“ + selected_source = feed_map[selected_feed_label] + articles = [a for a in articles if a.get("source", "unidentified") == selected_source] # === Artikel-Tabelle === if articles: @@ -80,7 +103,6 @@ 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 - # Speichern in vollständiger Artikelliste for idx, art in enumerate(all_articles): if art["id"] == article["id"]: all_articles[idx] = article @@ -107,7 +129,6 @@ if articles: img["caption"] = caption or "Kein Bildtitel vorhanden" img["copyright"] = copyright or "Unbekannt" img["copyright_url"] = copyright_url or "#" - # Speichern in vollständiger Artikelliste for idx, art in enumerate(all_articles): if art["id"] == article["id"]: all_articles[idx] = article @@ -138,6 +159,5 @@ if articles: 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.") diff --git a/data/articles.json b/data/articles.json index 325eca3..86ea8ac 100644 --- a/data/articles.json +++ b/data/articles.json @@ -83,7 +83,8 @@ "copyright": "OpenAI DALL\u00b7E", "copyright_url": "https://openai.com/dall-e" } - ] + ], + "source": "https://www.camping-news.de/rss/" }, { "id": "Artikel 5927 von camping-news.de", @@ -165,7 +166,8 @@ "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5927" } - ] + ], + "source": "https://www.camping-news.de/rss/" }, { "id": "Artikel 5928 von camping-news.de", @@ -247,7 +249,8 @@ "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5928" } - ] + ], + "source": "https://www.camping-news.de/rss/" }, { "id": "Artikel 5929 von camping-news.de", @@ -389,7 +392,8 @@ "copyright": "OpenAI DALL\u00b7E", "copyright_url": "https://openai.com/dall-e" } - ] + ], + "source": "https://www.camping-news.de/rss/" }, { "id": "Artikel 5925 von camping-news.de", @@ -513,7 +517,8 @@ "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5925" } - ] + ], + "source": "https://www.camping-news.de/rss/" }, { "id": "Artikel 5926 von camping-news.de", @@ -606,7 +611,8 @@ "copyright": "OpenAI DALL\u00b7E", "copyright_url": "https://openai.com/dall-e" } - ] + ], + "source": "https://www.camping-news.de/rss/" }, { "id": "Artikel 5923 von camping-news.de", @@ -688,7 +694,8 @@ "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5923" } - ] + ], + "source": "https://www.camping-news.de/rss/" }, { "id": "Artikel 5922 von camping-news.de", @@ -819,7 +826,8 @@ "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5922" } - ] + ], + "source": "https://www.camping-news.de/rss/" }, { "id": "Artikel 5921 von camping-news.de", @@ -950,7 +958,8 @@ "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5921" } - ] + ], + "source": "https://www.camping-news.de/rss/" }, { "id": "Artikel 5920 von camping-news.de", @@ -1025,6 +1034,2805 @@ "copyright": "Unbekannt", "copyright_url": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5920" } - ] + ], + "source": "https://www.camping-news.de/rss/" + }, + { + "id": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/", + "title": "Hymer k\u00fcndigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue G\u00fcnstig-Marke f\u00fcr Camper", + "date": "Mon, 24 Mar 2025 11:48:00 +0100", + "summary": "

Corigon ist der Name der neuesten Marke der Erwin-Hymer-Group (EHG). Mit dem Chef der EHG hat promobil bereits dar\u00fcber gesprochen.

", + "text": "Corigon ist der Name der neuesten Marke der Erwin-Hymer-Group (EHG). Mit dem Chef der EHG hat promobil bereits dar\u00fcber gesprochen.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2216820.jpg", + "alt": "Corigon CV 60 D, von vorne", + "caption": "Corigon CV 60 D, von vorne", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2216824.jpg", + "alt": "Corigon Advanced Modell, Corigon T 700 S", + "caption": "Corigon Advanced Modell, Corigon T 700 S", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2216823.jpg", + "alt": "Corigon TS 70 LS, Sitzgruppe", + "caption": "Corigon TS 70 LS, Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2216821.jpg", + "alt": "Corigon, Camper Van, Tisch, Sitzgruppe", + "caption": "Corigon, Camper Van, Tisch, Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2219705.jpg", + "alt": "Weinsberg, Carsuite, Wohnmobil", + "caption": "Weinsberg, Carsuite, Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2030929.jpg", + "alt": "Xcabin", + "caption": "Xcabin", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2030129.jpg", + "alt": "Caravan Salon 2024", + "caption": "Caravan Salon 2024", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2216768.jpg", + "alt": "B\u00fcrster Papillon Rendering", + "caption": "B\u00fcrster Papillon Rendering", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2215467.jpg", + "alt": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", + "caption": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2215384.jpg", + "alt": "Giottiline, Wohnmobil, Siena 485, Alkoven, f\u00fcnf Personen, Familien", + "caption": "Giottiline, Wohnmobil, Siena 485, Alkoven, f\u00fcnf Personen, Familien", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2213606.jpg", + "alt": "Fendt, Diamant, Innenraum, Mann, Sitzgruppe", + "caption": "Fendt, Diamant, Innenraum, Mann, Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/", + "title": "Die besten Camper-Innovationen 2025: \u201eFrosch\u201c ist das genialste neue Camping-Zubeh\u00f6r", + "date": "Tue, 18 Mar 2025 06:00:00 +0100", + "summary": "

Das sind die besten Neuerfindungen auf dem Gebiet Camping-Zubeh\u00f6r 2025: Tolle Produkte f\u00fcr Ihr n\u00e4chstes Camping-Abenteuer.

", + "text": "Das sind die besten Neuerfindungen auf dem Gebiet Camping-Zubeh\u00f6r 2025: Tolle Produkte f\u00fcr Ihr n\u00e4chstes Camping-Abenteuer.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/logos/car.svg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2176673.jpg", + "alt": "Erfinder, Campfire", + "caption": "Erfinder, Campfire", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2131731.jpg", + "alt": "VW California Ocean Campervan Aufstelldach", + "caption": "VW California Ocean Campervan Aufstelldach", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2070795.jpg", + "alt": "CMT, Holiday, Spacetourer, Campervan", + "caption": "CMT, Holiday, Spacetourer, Campervan", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2212856.jpg", + "alt": "Skizze, Aufstelldach zugeklappt, stromlinien", + "caption": "Skizze, Aufstelldach zugeklappt, stromlinien", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2180355.jpg", + "alt": "Vickywood", + "caption": "Vickywood", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2180142.jpg", + "alt": "LMC e:dero 470 K (2025) Sofa im Bug", + "caption": "LMC e:dero 470 K (2025) Sofa im Bug", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2178582.jpg", + "alt": "Front, Sprinter", + "caption": "Front, Sprinter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2178156.jpg", + "alt": "Re:van MAN TGE Modulsystem", + "caption": "Re:van MAN TGE Modulsystem", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/", + "title": "CARAVANING Jahrgangs Archiv 2024: CARAVANING f\u00fcrs Archiv", + "date": "Wed, 15 Jan 2025 08:34:00 +0100", + "summary": "

Artikel f\u00fcr Artikel jetzt ganz einfach durchforsten: Mit den Jahrgangs-PDF-Archiven ist das m\u00f6glich. In den Archiven befinden sich alle zw\u00f6lf CARAVANING-Ausgaben des jeweiligen Jahres.

", + "text": "Artikel f\u00fcr Artikel jetzt ganz einfach durchforsten: Mit den Jahrgangs-PDF-Archiven ist das m\u00f6glich. In den Archiven befinden sich alle zw\u00f6lf CARAVANING-Ausgaben des jeweiligen Jahres.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://www.promobil.de/_next/static/img/logos/car.svg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1665061.jpg", + "alt": "CARAVANING f\u00fcrs Archiv", + "caption": "CARAVANING f\u00fcrs Archiv", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/top-10-clever-campen-videos-2024/", + "title": "Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos", + "date": "Sat, 04 Jan 2025 06:00:00 +0100", + "summary": "

Die Redaktionen von promobil und CARAVANING betreiben gemeinsam den CLEVER CAMPEN Youtube-Channel. Hier zeigen wir die Top-Videos 2024.

", + "text": "Die Redaktionen von promobil und CARAVANING betreiben gemeinsam den CLEVER CAMPEN Youtube-Channel. Hier zeigen wir die Top-Videos 2024.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/top-10-clever-campen-videos-2024/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2093924.jpg", + "alt": "Morelo Palace 88 DL (2024) f", + "caption": "Morelo Palace 88 DL (2024) f", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/", + "title": "Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die hei\u00dfesten Wohnmobile 2004", + "date": "Tue, 31 Dec 2024 06:00:00 +0100", + "summary": "

Vom Carthago M-Liner bis zum Esterel Integrierten \u2013 der promobil-R\u00fcckblick auf die Highlights des Jahres 2004.

", + "text": "Vom Carthago M-Liner bis zum Esterel Integrierten \u2013 der promobil-R\u00fcckblick auf die Highlights des Jahres 2004.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2167835.jpg", + "alt": "Au\u00dfenansicht, Carthago", + "caption": "Au\u00dfenansicht, Carthago", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167835.jpg", + "alt": "Au\u00dfenansicht, Carthago", + "caption": "Au\u00dfenansicht, Carthago", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167837.jpg", + "alt": "Au\u00dfenansicht, Esterel", + "caption": "Au\u00dfenansicht, Esterel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167838.jpg", + "alt": "Au\u00dfenansicht, Dethleffs Esprit I 7410", + "caption": "Au\u00dfenansicht, Dethleffs Esprit I 7410", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167840.jpg", + "alt": "Au\u00dfenansicht, Carthago", + "caption": "Au\u00dfenansicht, Carthago", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167842.jpg", + "alt": "Au\u00dfenansicht, Flair", + "caption": "Au\u00dfenansicht, Flair", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167844.jpg", + "alt": "Au\u00dfenansicht, Dethleffs Advantage A 6771", + "caption": "Au\u00dfenansicht, Dethleffs Advantage A 6771", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167846.jpg", + "alt": "Au\u00dfenansicht, TEC Rotec", + "caption": "Au\u00dfenansicht, TEC Rotec", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167848.jpg", + "alt": "Au\u00dfenansicht, Cariva-Alkoven E35.22", + "caption": "Au\u00dfenansicht, Cariva-Alkoven E35.22", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167850.jpg", + "alt": "Au\u00dfenansicht, Hymertramp 655", + "caption": "Au\u00dfenansicht, Hymertramp 655", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167852.jpg", + "alt": "Au\u00dfenansicht, I-TEC 6300 G", + "caption": "Au\u00dfenansicht, I-TEC 6300 G", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167854.jpg", + "alt": "Au\u00dfenraum, B\u00fcrstner Delfin Performance", + "caption": "Au\u00dfenraum, B\u00fcrstner Delfin Performance", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167856.jpg", + "alt": "Au\u00dfenansicht, Silverdream", + "caption": "Au\u00dfenansicht, Silverdream", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/", + "title": "Gaswarner im Wohnmobil: So sch\u00fctze Sie sich vor unsichtbaren Gasen", + "date": "Tue, 26 Nov 2024 12:00:00 +0100", + "summary": "

Im Falle eines Falles k\u00f6nnen sie Leben retten: Gaswarner. Gef\u00e4hrlich werden k\u00f6nnen mehrere ganz unterschiedliche Gasarten im Reisemobil. Promobil erkl\u00e4rt, welche das sind und wie Sie sich vor ihnen sch\u00fctzen.

", + "text": "Gaswarner im Wohnmobil: So sch\u00fctze Sie sich vor unsichtbaren Gasen\n\nGaswarner sind lebensrettende Ger\u00e4te, insbesondere bei der Verwendung in Reisemobilen, da sie verschiedene gef\u00e4hrliche Gasarten erkennen k\u00f6nnen. Promobil bietet wertvolle Informationen dar\u00fcber, welche Gasarten gef\u00e4hrlich sein k\u00f6nnen und wie man sich vor diesen sch\u00fctzen kann.", + "tags": [ + "Gaswarner", + "Reisemobilsicherheit", + "Gassicherheit" + ], + "status": "Trash", + "link": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1765700.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765709.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765710.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765711.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765712.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765713.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765714.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765715.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765716.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765717.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765718.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765719.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765720.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1765705.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2211040.jpg", + "alt": "Gasplakette", + "caption": "Gasplakette", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2178259.jpg", + "alt": "Absorberk\u00fchlschrank, Carado T 471", + "caption": "Absorberk\u00fchlschrank, Carado T 471", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1840128.jpg", + "alt": "Sicherheitszubeh\u00f6r - Einbruchs und Diebstahlschutz", + "caption": "Sicherheitszubeh\u00f6r - Einbruchs und Diebstahlschutz", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1798546.jpg", + "alt": "Gastank-Einbau", + "caption": "Gastank-Einbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2195898.jpg", + "alt": "Sat-Anlagen, Dom-Antenne, Flach-Antenne, mobile Sat-Anlage, feste Sat-Anlage", + "caption": "Sat-Anlagen, Dom-Antenne, Flach-Antenne, mobile Sat-Anlage, feste Sat-Anlage", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1934330.jpg", + "alt": "Vergleich Chausson vs. Hobby", + "caption": "Vergleich Chausson vs. Hobby", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2135374.jpg", + "alt": "Alexander Wottrich Interview", + "caption": "Alexander Wottrich Interview", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/", + "title": "Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo", + "date": "Tue, 15 Oct 2024 16:00:00 +0200", + "summary": "

Der nur 4,40 Meter lange kompakte Minicamper von Freizeitmobile Kliem auf Basis des Fiat Doblo bietet eine flexible L\u00f6sung f\u00fcr Alltag und Reisen.

", + "text": "Der nur 4,40 Meter lange kompakte Minicamper von Freizeitmobile Kliem auf Basis des Fiat Doblo bietet eine flexible L\u00f6sung f\u00fcr Alltag und Reisen.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2148456.jpg", + "alt": "Dailycamper Trekkin Fiat Doblo", + "caption": "Dailycamper Trekkin Fiat Doblo", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2148460.jpg", + "alt": "Dailycamper Trekkin Fiat Doblo", + "caption": "Dailycamper Trekkin Fiat Doblo", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2148458.jpg", + "alt": "Dailycamper Trekkin Fiat Doblo", + "caption": "Dailycamper Trekkin Fiat Doblo", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/", + "title": "Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper f\u00fcr Ironman-Rekord", + "date": "Wed, 04 Sep 2024 13:55:57 +0200", + "summary": "

Am 5. September war es so weit: 120 Langdistanz-Triathlons nacheinander. Extrem-Triathlet Jonas Deichmann macht sein Versprechen wahr und pulverisiert den bisherigen Weltrekord. Vom ersten Tag an half ihm ein Wohnmobil von Rocket Camper, diese t\u00e4gliche Leistung zu meistern. Wir schauen mal rein und kl\u00e4ren, f\u00fcr was er das \u00fcberhaupt braucht.\u00a0

", + "text": "Am 5. September war es so weit: 120 Langdistanz-Triathlons nacheinander. Extrem-Triathlet Jonas Deichmann macht sein Versprechen wahr und pulverisiert den bisherigen Weltrekord. Vom ersten Tag an half ihm ein Wohnmobil von Rocket Camper, diese t\u00e4gliche Leistung zu meistern. Wir schauen mal rein und kl\u00e4ren, f\u00fcr was er das \u00fcberhaupt braucht.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2138103.jpg", + "alt": "Rocket Camper, Jonas Deichmann", + "caption": "Rocket Camper, Jonas Deichmann", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2138096.jpg", + "alt": "Rocket Camper, Au\u00dfenansicht", + "caption": "Rocket Camper, Au\u00dfenansicht", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2138091.jpg", + "alt": "Rocket Camper, Triathlon-Experten, Ryzon", + "caption": "Rocket Camper, Triathlon-Experten, Ryzon", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2138083.jpg", + "alt": "Rocket Camper, Bodenbelag Ryzon", + "caption": "Rocket Camper, Bodenbelag Ryzon", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2138102.jpg", + "alt": "Rocket Camper, Rennradhalterung, Ryzon", + "caption": "Rocket Camper, Rennradhalterung, Ryzon", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2219557.jpg", + "alt": "Dreamer D 43 Up, Au\u00dfenaufnahme", + "caption": "Dreamer D 43 Up, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2219246.jpg", + "alt": "Livingstone Go, Innen, Frau, K\u00fchlschrank", + "caption": "Livingstone Go, Innen, Frau, K\u00fchlschrank", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2218304.jpg", + "alt": "Forster Livin' Up Pro 599 (2026), Au\u00dfenaufnahme, Frau, Campingbus, Halle", + "caption": "Forster Livin' Up Pro 599 (2026), Au\u00dfenaufnahme, Frau, Campingbus, Halle", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2131731.jpg", + "alt": "VW California Ocean Campervan Aufstelldach", + "caption": "VW California Ocean Campervan Aufstelldach", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2206866.jpg", + "alt": "Sunlight Cliff 4x4, Dauertest, Berg", + "caption": "Sunlight Cliff 4x4, Dauertest, Berg", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/", + "title": "E-Trailer f\u00fcr die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome", + "date": "Sat, 06 Jul 2024 12:00:00 +0200", + "summary": "

Wer sein Kontrollboard modernisieren m\u00f6chte, hat mit dem E-Trailer-System die M\u00f6glichkeit, Schritt f\u00fcr Schritt ins digitale Zeitalter zu wechseln.

", + "text": "Wer sein Kontrollboard modernisieren m\u00f6chte, hat mit dem E-Trailer-System die M\u00f6glichkeit, Schritt f\u00fcr Schritt ins digitale Zeitalter zu wechseln.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2105842.jpg", + "alt": "E-Trailer System, APP", + "caption": "E-Trailer System, APP", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2105846.jpg", + "alt": "E-Trailer System, GPS-Tracker", + "caption": "E-Trailer System, GPS-Tracker", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2105843.jpg", + "alt": "E-Trailer System, Wassertanksensor", + "caption": "E-Trailer System, Wassertanksensor", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2105848.jpg", + "alt": "E-Trailer System, Temperaturf\u00fchler", + "caption": "E-Trailer System, Temperaturf\u00fchler", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/", + "title": "Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fu\u00dfball-EM", + "date": "Sun, 14 Apr 2024 18:00:00 +0200", + "summary": "

Neben Berlin ist Leipzig der einzige ostdeutsche EM-Gastgeber. Mit der Hauptstadt mithalten kann Sachsens bev\u00f6lkerungsreichste Stadt durchaus. Und das liegt nicht nur am Fu\u00dfball-Verein.

", + "text": "Neben Berlin ist Leipzig der einzige ostdeutsche EM-Gastgeber. Mit der Hauptstadt mithalten kann Sachsens bev\u00f6lkerungsreichste Stadt durchaus. Und das liegt nicht nur am Fu\u00dfball-Verein.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2091833.jpg", + "alt": "EM-Spiel in Leipzig - Skyline", + "caption": "EM-Spiel in Leipzig - Skyline", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2091837.jpg", + "alt": "EM-Spiel in Leipzig - Baumwollspinnerei", + "caption": "EM-Spiel in Leipzig - Baumwollspinnerei", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2091835.jpg", + "alt": "EM-Spiel in Leipzig - Wasser", + "caption": "EM-Spiel in Leipzig - Wasser", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://imgsdb1.promobil.de/image/5c910df446c956ef07732fa7-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://imgsdb1.promobil.de/image/588f2d56721d54a528170778-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://imgsdb1.promobil.de/image/64c90aa9cbdf3a00089ec3cc-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2091838.jpg", + "alt": "EM-Spiel in Leipzig - Stadion", + "caption": "EM-Spiel in Leipzig - Stadion", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/", + "title": "Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft?", + "date": "Sun, 17 Dec 2023 17:50:00 +0100", + "summary": "

Westfalia produziert an zwei deutschen Standorten Campingbusse: am Stammsitz in Rheda-Wiedenbr\u00fcck Modelle f\u00fcr Automarken wie Mercedes und Ford, in Gotha eigene Fahrzeuge der Marke Westfalia.

", + "text": "Westfalia produziert an zwei deutschen Standorten Campingbusse: am Stammsitz in Rheda-Wiedenbr\u00fcck Modelle f\u00fcr Automarken wie Mercedes und Ford, in Gotha eigene Fahrzeuge der Marke Westfalia.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2058017.jpg", + "alt": "Can-Kasim Dogan", + "caption": "Can-Kasim Dogan", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/", + "title": "Top-Fortbewegungsmittel f\u00fcr Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil?", + "date": "Sun, 26 Nov 2023 16:00:00 +0100", + "summary": "

Bevorzugtes Fortbewegungsmittel der promobil-Lesenden ist das Fahrrad \u2013 mit oder ohne elektrischen Antrieb. Ist das bei Ihnen auch so?

", + "text": "Bevorzugtes Fortbewegungsmittel der promobil-Lesenden ist das Fahrrad \u2013 mit oder ohne elektrischen Antrieb. Ist das bei Ihnen auch so?", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2053714.jpg", + "alt": "Lesermeinung Thema Mobilit\u00e4t", + "caption": "Lesermeinung Thema Mobilit\u00e4t", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2053716.jpg", + "alt": "Lesermeinung Thema Mobilit\u00e4t - Elke", + "caption": "Lesermeinung Thema Mobilit\u00e4t - Elke", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2053715.jpg", + "alt": "Lesermeinung Thema Mobilit\u00e4t - J\u00fcrgen", + "caption": "Lesermeinung Thema Mobilit\u00e4t - J\u00fcrgen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1835793.jpg", + "alt": "Gebraucht-Kauf Ratgeber", + "caption": "Gebraucht-Kauf Ratgeber", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1836156.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2149628.jpg", + "alt": "Gefuehrte Wohnmobilreisen i", + "caption": "Gefuehrte Wohnmobilreisen i", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1555475.jpg", + "alt": "Hagelsch\u00e4den am Wohnmobil", + "caption": "Hagelsch\u00e4den am Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2153790.jpg", + "alt": "Sanit\u00e4r-Autarkie - Frischwasser", + "caption": "Sanit\u00e4r-Autarkie - Frischwasser", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2078412.jpg", + "alt": "CMT 2024 Wohnmobil-Messekauf", + "caption": "CMT 2024 Wohnmobil-Messekauf", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2147777.jpg", + "alt": "Adria Super Twin etnh\u00fcllung auf der Messe", + "caption": "Adria Super Twin etnh\u00fcllung auf der Messe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/spielorte-em-2024-frankfurt/", + "title": "Camping-Tipps f\u00fcr EM-Spielorte 2024 : Frankfurt f\u00fcr Fu\u00dfball-Fans im Wohnmobil", + "date": "Mon, 06 Nov 2023 09:00:00 +0100", + "summary": "

Im kommenden Sommer ist die Mainmetropole Frankfurt einer von zehn Gastgebern bei der Fu\u00dfball-EM der M\u00e4nner. Dort findet am 23. Juni 2024 das dritte Vorrundenspiel der DFB-Elf statt.

", + "text": "Im kommenden Sommer ist die Mainmetropole Frankfurt einer von zehn Gastgebern bei der Fu\u00dfball-EM der M\u00e4nner. Dort findet am 23. Juni 2024 das dritte Vorrundenspiel der DFB-Elf statt.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/spielorte-em-2024-frankfurt/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2050071.jpg", + "alt": "Mainufer, Stadt, Sonnenuntergang, Sachsenhausen", + "caption": "Mainufer, Stadt, Sonnenuntergang, Sachsenhausen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2050074.jpg", + "alt": "Altstadt, Stra\u00dfencafe, Friedrich Stoltze Brunnen", + "caption": "Altstadt, Stra\u00dfencafe, Friedrich Stoltze Brunnen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2050076.jpg", + "alt": "Brot, K\u00e4se, Zwiebeln, Bembel, Hessen, Apfelwein", + "caption": "Brot, K\u00e4se, Zwiebeln, Bembel, Hessen, Apfelwein", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://imgsdb1.promobil.de/image/643abf81241b800008039999-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://imgsdb1.promobil.de/image/6488346058042f00086df924-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2050073.jpg", + "alt": "Deutsche Bank Park, Frankfurt Main, Stadion", + "caption": "Deutsche Bank Park, Frankfurt Main, Stadion", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/", + "title": "Spielorte und Stellpl\u00e4tze zur Fu\u00dfball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart", + "date": "Fri, 13 Oct 2023 09:00:00 +0200", + "summary": "

Wegen seiner topographischen Lage wird Stuttgart gerne als \"Kessel\" bezeichnet. Wer zur Fu\u00dfball-EM in die Stadt reist, darf sich auf ein vielf\u00e4ltiges Kultur- und Freizeitangebot freuen.

", + "text": "Wegen seiner topographischen Lage wird Stuttgart gerne als \"Kessel\" bezeichnet. Wer zur Fu\u00dfball-EM in die Stadt reist, darf sich auf ein vielf\u00e4ltiges Kultur- und Freizeitangebot freuen.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2037929.jpg", + "alt": "Wasen, Camping, Caravans, Stellplatz", + "caption": "Wasen, Camping, Caravans, Stellplatz", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2037932.jpg", + "alt": "Schlossplatz, Stuttgart, Innenstadt, Wiese", + "caption": "Schlossplatz, Stuttgart, Innenstadt, Wiese", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2037927.jpg", + "alt": "Stuttgart, S\u00fcd, Kessel,Fernsehturm, Panorama", + "caption": "Stuttgart, S\u00fcd, Kessel,Fernsehturm, Panorama", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://imgsdb1.promobil.de/image/60955efd94da1206001a7a09-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://imgsdb1.promobil.de/image/5e64a6cdcf50f309006f9b3c-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2037928.jpg", + "alt": "Fu\u00df\u00dfball, Fans, Vfb Stuttgart, MHP Arena", + "caption": "Fu\u00df\u00dfball, Fans, Vfb Stuttgart, MHP Arena", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/", + "title": "Professor f\u00fcr Tourismus-Management im Interview: Armin Brysch spricht \u00fcber virtuelle Reisen", + "date": "Mon, 18 Sep 2023 09:00:00 +0200", + "summary": "

Armin Brysch, Professor f\u00fcr Tourismus-Management an der Hochschule Kempten, spricht mit promobil \u00fcber das Reisen der Zukunft. Werden virtuelle Reisen die echten ersetzen?

", + "text": "Armin Brysch, Professor f\u00fcr Tourismus-Management an der Hochschule Kempten, spricht mit promobil \u00fcber das Reisen der Zukunft. Werden virtuelle Reisen die echten ersetzen?", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2032100.jpg", + "alt": "Armin Brysch im Interview.", + "caption": "Armin Brysch im Interview.", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/termine-veranstaltungen-juni-juli/", + "title": "Vanlife-Events im Juni bis November 2025: Events f\u00fcr Bulli-Lover und Campervan-Fans", + "date": "Fri, 06 Jun 2025 12:00:00 +0200", + "summary": "

Endlich wieder Zeit f\u00fcr Bulli-Treffen & Co! Entdecken Sie die besten Festivals und Events f\u00fcr Camper, Vanlife-Fans und Outdoor-Abenteurer in 2025.

", + "text": "Vanlife- und Bus-Treffen 2025: Events f\u00fcr Bulli-Lover und Campervan-Fans + Messen Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt Vanlife- und Bus-Treffen 2025: Events f\u00fcr Bulli-Lover und Campervan-Fans + Messen Vanlife-Events im Juni bis November 2025 : Events f\u00fcr Bulli-Lover und Campervan-Fans Endlich wieder Zeit f\u00fcr Bulli-Treffen & Co! Entdecken Sie die besten Festivals und Events f\u00fcr Camper, Vanlife-Fans und Outdoor-Abenteurer in 2025. Timo Gro\u00dfhans Ver\u00f6ffentlicht am 06.06.2025 Foto: Heiko p. Wacker 5 Bilder Nach einem langen Winter kommen nun endlich wieder die gro\u00dfen Treffen und Festivals \u2013 und wer das Abenteuer auf vier R\u00e4dern liebt, sollte sich die folgenden Events keinesfalls entgehen lassen. Ob Bulli-Festival, Offroad-Messe oder Vanlife-Treffen: In den kommenden Monaten stehen zahlreiche spannende Veranstaltungen f\u00fcr Camper, Vanlife-Enthusiasten und Outdoor-Fans auf dem Programm. Hier sind die wichtigsten Termine, die das Jahr 2025 zu einem unvergesslichen Erlebnis machen werden. Juni 2025 Midsummer Bulli Festival Datum: 19.\u201322. Juni 2025 Ort: Fehmarn Beschreibung: Deutschlands gr\u00f6\u00dftes Bullifestival direkt am Meer mit Show & Shine, Beachcamp und Live-Musik. Website: https://www.midsummerfestival.de Abenteuer & Allrad Datum: 19.\u201322. Juni 2025 Ort: Bad Kissingen Beschreibung: Europas gr\u00f6\u00dfte Offroad- und Overlanding-Messe mit \u00fcber 350 Ausstellern. Website: https://www.abenteuer-allrad.de Queer Summer Camp Datum: 19.\u201322. Juni 2025 Ort: Simmerath, Eifel Beschreibung: Ein queeres Campingerlebnis mit Community-Feeling am Rursee. Website: https://www.queer-summer-camp.de Juli 2025 California Festival Mimizan Datum: 4.\u20136. Juli 2025 Ort: Mimizan, Frankreich Beschreibung: Ein entspanntes Treffen f\u00fcr Bulli- und Vanlife-Enthusiasten an der franz\u00f6sischen Atlantikk\u00fcste mit Musik und Strandaktivit\u00e4ten. Website: Infos pratiques californiafestival.fr Kastenwagentreffen Datum: 4.\u20136. Juli 2025 Ort: Bad D\u00fcrrheim Beschreibung: Ein Treffen f\u00fcr alle Kastenwagen-Fans mit Fokus auf Gemeinschaft und Erfahrungsaustausch. Website: https://www.kastenwagentreffen.de Caravan & Vanlife Meetup Datum: 11.\u201313. Juli 2025 Ort: Stuttgart, B\u00f6blingen Beschreibung: Ein Event f\u00fcr alle Camper mit Vortr\u00e4gen, Offroad-Parcours und Live-Musik. Website: https://www.overlandvanlifefestival.com/ovfstuttgart Adventure Southside Datum: 18.\u201320. Juli 2025 Ort: Friedrichshafen Beschreibung: Outdoor- und Offroad-Messe mit Workshops, Kinderprogramm und Camping-Areal. Website: https://adventuresouthside.com/ Swiss Vanlife Festival Datum: 25.\u201327. Juli 2025 Ort: Yverdon-les-Bains, Schweiz Beschreibung: Vanlife & Outdoor Festival mit Fokus auf Nachhaltigkeit, Camping und Abenteuer. Website: https://www.vanlife.ch Busfestival G\u00f6ppingen Datum: 25.\u201327. Juli 2025 Ort: G\u00f6ppingen Beschreibung: Ein Festival f\u00fcr Busliebhaber mit Musik und Vanlife-Atmosph\u00e4re. Website: https://www.bus-festival.de August 2025 VW Bus Festival Berlin Datum: 14.\u201317. August 2025 Ort: Zossen, Deutschland Beschreibung: Treffen f\u00fcr VW Bus Begeisterte mit vielf\u00e4ltigem Programm und Community-Austausch. Website: www.vwbus-festival.de Vanlife Ferropolis Datum: 21.\u201324. August 2025 Ort: Ferropolis, Gr\u00e4fenhainichen Beschreibung: Ein Festival auf einer Halbinsel mit Workshops, Live-Acts und Strandaktivit\u00e4ten. Website: https://www.vanlife-ferropolis.de September 2025 VW Bus Treffen Hannover Datum: 5.\u20137. September 2025 Ort: Altwarmb\u00fcchener See, Hannover Beschreibung: Traditionelles Bulli-Treffen mit Flohmarkt, Lagerfeuer und Camping. Bullis auf R\u00fcgen Datum: 11. \u2013 14. September 2025 Ort: Altenkirchen. Beschreibung: Das Familien-Bustreffen auf Deutschlands gr\u00f6\u00dfter Insel. Bullis auf R\u00fcgen \u2013 Das Familienbustreffen auf Deutschlands gr\u00f6\u00dfter Insel \u2013 Das Familien-Bustreffen auf Deutschlands gr\u00f6\u00dfter Insel bullisaufruegen.de Bulli Summer Festival Datum: 4.\u20137. September 2025 Ort: Wesel Beschreibung: Ein gro\u00dfes Treffen f\u00fcr Bulli-Fans mit Musik, Foodtrucks und Gemeinschaftsgef\u00fchl. Website: Bulli Summer Festival \u2013 Dein Bulli, Dein Sommer. Busfest Datum: 12.\u201314. September 2025 Ort: Malvern, England Beschreibung: Das weltweit gr\u00f6\u00dfte Treffen der VW-Bus-Freunde mit Show & Shine, Offroad-Wettbewerben und mehr. Website: https://www.busfest.org Adventure Northside Datum: 12.\u201315. September 2025 Ort: Gut Basthorst bei Hamburg Beschreibung: Messe f\u00fcr Offroad- und Vanlife-Enthusiasten mit Ausstellern und Vortr\u00e4gen. Website: adventurenorthside.de Vanlife Treffen Allg\u00e4u Datum: 18.\u201321. September 2025 Ort: Lechbruck am See Beschreibung: Ein Treffen f\u00fcr Vanlife-Fans in malerischer Umgebung mit Workshops und Gemeinschaftsaktivit\u00e4ten. Website: http://www.allgaeu-vans-treffen.de Oktober 2025 Caravan Live Datum: 2.\u20135. Oktober 2025 Ort: Freiburg Beschreibung: Messe f\u00fcr Caravaning und Vanlife mit Ausstellern und Vortr\u00e4gen. Website: https://www.caravanlive.de Caravan Salon Austria Datum: 15.\u201319. Oktober 2025 Ort: Wels, \u00d6sterreich Beschreibung: Internationale Messe f\u00fcr Caravaning und Camping. Website: https://www.caravan-wels.al Suisse Caravan Salon Datum: 23.\u201327. Oktober 2025 Ort: Bern, Schweiz Beschreibung: Schweizer Messe f\u00fcr Caravaning und Vanlife. Website: https://www.suissecaravansalon.ch November 2025 Caravan Bremen Datum: 7.\u201310. November 2025 Ort: Bremen Beschreibung: Messe f\u00fcr Caravaning, Camping und Vanlife in Norddeutschland. Website: https://www.caravan-bremen.de TC Touristik & Caravaning Datum: 19.\u201323. November 2025 Ort: Leipzig Beschreibung: Gro\u00dfe Messe f\u00fcr Touristik, Caravaning und Vanlife mit vielen Ausstellern und Live-Vortr\u00e4gen. Website: https://www.tc-messe.de Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", + "tags": [], + "status": "New", + "link": "https://www.promobil.de/termine-veranstaltungen-juni-juli/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1024791.jpg", + "alt": "Bulli-Treffen", + "caption": "Bulli-Treffen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/", + "title": "Schutz vor Einbruch und Diebstahl f\u00fcrs Wohnmobil: Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl?", + "date": "Wed, 21 May 2025 11:00:00 +0200", + "summary": "

Einen Kriminalfall beim Camping? Braucht man nur in der Urlaubslekt\u00fcre. Wir zeigen nachr\u00fcstbare Ausr\u00fcstung, die Einbruch und Diebstahl erschwert.

", + "text": "Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl? Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Zubeh\u00f6r Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl? Alles \u00fcber Gasf\u00fcllst\u00e4nde und Co Gas im Wohnmobil Schutz vor Einbruch und Diebstahl f\u00fcrs Wohnmobil : Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl? Einen Kriminalfall beim Camping? Braucht man nur in der Urlaubslekt\u00fcre. Wir zeigen nachr\u00fcstbare Ausr\u00fcstung, die Einbruch und Diebstahl erschwert. Sophia Pfisterer , Ingo K\u00f6cher Ver\u00f6ffentlicht am 21.05.2025 Foto: Fiamma 27 Bilder Der gr\u00f6\u00dfte Albtraum ist, wenn man von einem Ausflug auf den Parkplatz oder Stellplatz zur\u00fcckkommt und das Wohnmobil verschwunden ist oder Diebe das Campingfahrzeug aufgebrochen haben, alles durchw\u00fchlt ist und Wertgegenst\u00e4nde gestohlen sind. Neben dem unguten Gef\u00fchl, dass Fremde in den privaten Bereich eingedrungen sind, dem \u00c4rger \u00fcber die Sch\u00e4den und Verluste, bleibt die Sorge, dass sich dies jederzeit wiederholen k\u00f6nnte. 5 Verhaltens-Tipps zum Schutz vor Diebstahl und Einbruch Eine einfache, technische L\u00f6sung des Problems sind verschiedene Zubeh\u00f6rkomponenten wie Zusatz-Sicherungen, Schl\u00f6sser, Parkkrallen, Verriegelungen, GPS-Trackern und Alarmanlagen. Diese stellen wir weiter unten ausf\u00fchrlich vor. Gleichzeitig k\u00f6nnen einfache Verhaltensregeln das Risiko minimieren, dass im Wohnmobil eingebrochen wird bzw. dass es geklaut wird. Denn: Gelegenheit macht Diebe. Immer abschlie\u00dfen \u2013 auch bei kurzer Abwesenheit: Selbst beim schnellen Br\u00f6tchenholen: T\u00fcren, Fenster und Dachluken verriegeln. Wertgegenst\u00e4nde au\u00dfer Sicht verstauen: Keine Handys, Laptops oder Kameras sichtbar liegen lassen \u2013 Vorh\u00e4nge oder Sichtschutz nutzen. Stellplatz mit Bedacht w\u00e4hlen: Bevorzugt auf offiziellen Campingpl\u00e4tzen oder gut beleuchteten, belebten Stellfl\u00e4chen \u00fcbernachten. Nachbarschaftliche Aufmerksamkeit : Kontakt zu Nachbarn am Stellplatz halten \u2013 gegenseitiges Beobachten erh\u00f6ht die Sicherheit. Fahrzeugpapiere separat und sicher aufbewahren : Niemals die Zulassungsbescheinigung Teil I (Fahrzeugschein) im Wohnmobil lassen \u2013 sonst wird Diebstahl f\u00fcr Profis noch einfacher. Besser: Im Geldbeutel oder an einem sicheren Ort au\u00dferhalb des Fahrzeugs aufbewahren. Zus\u00e4tzliche Schl\u00f6sser f\u00fcr T\u00fcren und Klappen Um das Aufbrechen des Fahrzeugs von au\u00dfen zu verhindern, lassen sich Fahrerhaus-, Aufbau- und Garagent\u00fcr sowie Serviceklappen von au\u00dfen durch zus\u00e4tzliche Schl\u00f6sser sichern. Entsprechende Systeme bieten unter anderem Fiamma und Thule mit den sogenannten Security-Handgriffen. Die au\u00dfen neben der T\u00fcr montierten B\u00fcgel sind \u00fcber das T\u00fcrblatt schwenk- und verschlie\u00dfbar. Auf diese Weise wird das Aufbrechen der T\u00fcr deutlich erschwert. Praktisch: Im offenen Zustand fungieren die B\u00fcgel als Handlauf und erleichtern das Ein- und Aussteigen. Zus\u00e4tzliche Riegelschl\u00f6sser zur Au\u00dfenmontage haben unter anderem Heosolution mit dem Heosafe Riegelschloss und Thule mit Universal Lock und Door Frame Lock im Programm. Thule Security-Handgriffe sichern die Aufbaut\u00fcr zus\u00e4tzlich. Auch innen im Fahrzeug lassen sich T\u00fcren und Klappen zus\u00e4tzlich sichern. F\u00fcr die Fahrerhaust\u00fcren bietet Fiamma mit Duo-Safe Pro eine Alustange , deren Enden unterhalb des Fensters in den T\u00fcrrahmen gesteckt werden. Die teleskopierbare Stange l\u00e4sst sich von 119 auf 190 Zentimeter verl\u00e4ngern und verhindert das \u00d6ffnen der beiden T\u00fcren. Die gleiche Wirkung erzielt man mit einer Kette, die in am T\u00fcrrahmen montierte Metall\u00f6sen eingeh\u00e4ngt wird. Wiederum von Fiamma ist das Sicherheitsschloss Safe Door Guardian. Der Riegel des komplett aus Aluminium gefertigten Schlosses verriegelt bzw. \u00f6ffnet per Drehbewegung Fahrerhaus-, Aufbau-, Garagent\u00fcren und Serviceklappen von innen. T\u00fcren und Klappen sichern Fiamma Safe Door Magnum , ab 87 Euro [Link auf https://www.awin1.com/cread.php?awinmid=70949&awinaffid=893807&clickref=pro-22102643-sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase&ued=https%3A%2F%2Fwww.fritz-berger.de%2Fartikel%2Ffiamma-einstiegshilfe-buegel-security-und-tuersicherung-1971] Fiamma Einstiegshilfe- und Sicherungsb\u00fcgel Security , Preis ab 123 Euro Fiamma Duo Safe Pro Sicherheitsleiste , Preis ab 69 Euro [Link auf https://www.awin1.com/cread.php?awinmid=70949&awinaffid=893807&clickref=pro-22102643-sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase&ued=https%3A%2F%2Fwww.fritz-berger.de%2Fartikel%2Ffiamma-safe-door-guardian-innerer-sicherheitsblock-266765] Fiamma Safe Door Guardian Sicherheitsblock , Preis ab 77 Euro Heosolution Heosafe Riegelschloss , Preis ab 135 Euro Thule Universal Lock , Preis ab 101 Euro Fenster und Dachhauben verriegeln Spezielle L\u00f6sungen zur Sicherung vorgeh\u00e4ngter Fenster als auch Rahmen- und Schiebefenster bietet Womo-Sicherheit. Das System f\u00fcr Ausstellfenster besteht aus einem Metall-U-Profil, das die Unterkante der Scheibe verst\u00e4rkt. Im Innenraum werden am Fensterrahmen zwei verschlie\u00dfbare Gegenst\u00fccke montiert, die das Fenster rechts und links mit jeweils einer R\u00e4ndelschraube halten. F\u00fcr die Sicherung von Schiebefenstern im Fahrerhaus und Aufbau sowie f\u00fcr Dachluken sind zudem teleskopierbare Stangen im Programm. Benjamin K\u00f6bler-Linsner Fenster und Dachhauben sichern Womo-Sicherheit Ausstell- u. Rahmenfenstersicherung , Preis ab 99 Euro Womo-Sicherheit Dachhaubensicherung , Preis ab 83 Euro Wolfshund Schiebefenstersicherung , Preis ab 159 Euro Safe f\u00fcrs Wohnmobil Wertsachen im Fahrzeug sichert man am besten in einem Tresor . Ein Safe l\u00e4sst sich in Schr\u00e4nken und Staur\u00e4umen, im Doppelboden, als T\u00fcrtresor oder in den Fahrerhaussitzkonsolen einbauen. Tresore in unterschiedlichen Gr\u00f6\u00dfen liefern unter anderem Alko, Mobile-Safe, Milenco und Mobil. Wertsachen, Dokumente sicher lagern Alko Tresor , Preis ab 187 Euro Mobile-Safe Sitzkonsolensafe f\u00fcr Mercedes Sprinter , Preis ab 249Euro Mobile-Safe T\u00fcrsafe f\u00fcr Fiat Ducato , Preis 249 Euro Milenco Sitzsockelsafe f\u00fcr Iveco Daily , Preis ab 199 Euro Mobil-Safe Standard Safe mit Doppelbartschloss , Preis ab 125 Euro Wegfahrschutz f\u00fcrs Wohnmobil Automatische Wegfahrsperren verhindern unbefugtes Starten des Motors, indem sie die Z\u00fcndung oder Kraftstoffzufuhr elektronisch unterbrechen. Sie funktionieren meist \u00fcber einen Transponder-Schl\u00fcssel oder eine codierte Verbindung zwischen Schl\u00fcssel und Steuerger\u00e4t, die nur bei korrekter Erkennung den Motorstart erm\u00f6glicht. Damit sch\u00fctzen sie vor Diebstahl, indem sie den Startvorgang ohne autorisierten Schl\u00fcssel blockieren. F\u00fcr Camper bedeutet das mehr Sicherheit, besonders bei l\u00e4ngeren Standzeiten oder an unbekannten Orten. Ist eine Wegfahrsperre nicht automatisch im Fahrzeug eingebaut, l\u00e4sst sich der Camper mechanisch nachr\u00fcsten. Um das unbefugte Wegfahren des Wohnmobils zu verhindern, leisten Lenkrad-, Pedal- und Radkrallen sowie Pedal- und Ganghebelsperren gute Dienste. Wegfahrschutz Alca AutoSafe Pedal-Sperre , Preis ab 20 Euro Berger Radkralle , Preis ab 30 Euro Milenco BD Loc Pedalsperre f\u00fcr Fiat Ducato und Peugeot Boxer , Preis ab 150 Euro MEM Lenkradkralle f\u00fcr Lkw und Transporter , Preis ab 284 Euro Alarmanlagen und Bewegungsmelder Einbruchschutz bieten auch Alarmanlagen , die, an Fenstern, Dachhauben und T\u00fcren angebracht, bei gewaltsamem Aufhebeln ordentlich L\u00e4rm machen und je nach Modell eine Nachricht an eine angeschlossene Sicherheitszentrale oder das Smartphone senden. Die Ger\u00e4te sind zum Teil mit Bewegungsmelder und Trackingsystem ausgestattet. Solche Systeme bekommt man ab 55 Euro. Anbieter sind unter anderem Bosch, Carbest, Dometic, Milenco und Thitronik. Tipp: Eine abschreckende Wirkung f\u00fcr Gelegenheitsdiebe haben oft auch schon entsprechende Warnaufkleber an den Scheiben. Alarmanlagen und Bewegungsmelder Bosch Spexor , Preis ab 230 Euro Carbest Protect-On Camper 849 f\u00fcr Fiat Ducato , Preis ab 259 Euro Dometic Magic Safe MS 660 , Preis ab 63 Euro Milenco Autoalarm , Preis ab 147 Euro Thitronik Funk-Alarmanlage WiPro III safe.lock , Preis ab 399 Euro Trackingsysteme f\u00fcrs Fahrzeug Zudem lassen sich gestohlene Wohnmobile mit GPS-Trackingsystemen orten. Hierzu wird ein Sender versteckt im Fahrzeug eingebaut, der dann \u00fcber das Mobilfunknetz und GPS die Auffindung des Fahrzeugs erm\u00f6glicht. Anbieter sind unter anderem Blaupunkt mit BPT 1500+, Dethleffs mit Vehicle Defence, Mc Ortung mit SP2+Z und PAJ GPS mit Power Finder. Die Systeme laufen mit eigener Batterie oder Starterbatteriestrom. Wichtig zu wissen: F\u00fcr die Ortung des Fahrzeugs k\u00f6nnen weitere Kosten durch die Nutzung der integrierten SIM-Karte entstehen. Trackingsysteme CaraSave Alarmsystem mit GPS-Version , Preis ab 599 Euro Blaupunkt: BT 1500+ , Preis ab 179 Euro Dethleffs Vehicle Defence , Preis ab 269 Euro Mc Ortung SP 2+Z, Preis ab 236 Euro PAJ-GPS Power Finder, Preis ab 140 Euro YUKAtrack Ortungssystem easyWire GPS , ab 115 Euro Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Mehr zum Thema Gas Gaspr\u00fcfung f\u00fcr Campingfahrzeuge Pflicht ab 2025 Ohne Gasplakette droht Campern eine Strafe Tipps & Tricks Gasbetrieb im Wohnmobil und Wohnwagen K\u00fchlschrank w\u00e4hrend der Fahrt laufen lassen? Tipps & Tricks Vorteile von Gastanks im Wohnmobil Gastank oder Gasflasche - Was ist besser? Zubeh\u00f6r Mobile Satelliten-Antennen f\u00fcrs Camping Tragbare Sat-Anlagen f\u00fcr fast unbegrenzten Empfang Zubeh\u00f6r Gas im Wohnmobil und Wohnwagen Gasflaschen, Filter, F\u00fcllstandsanzeige und Co Themen Gaswarner im Wohnmobil So sch\u00fctze Sie sich vor unsichtbaren Gasen Zubeh\u00f6r Truma-Chef Wottrich im Interview Wird Gas beim Campen von Alternativen abgel\u00f6st? Zubeh\u00f6r Mehr anzeigen Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", + "tags": [], + "status": "New", + "link": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1840128.jpg", + "alt": "Sicherheitszubeh\u00f6r - Einbruchs und Diebstahlschutz", + "caption": "Sicherheitszubeh\u00f6r - Einbruchs und Diebstahlschutz", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1840180.jpg", + "alt": "Sicherheitszubeh\u00f6r f\u00fcrs Wohnmobil", + "caption": "Sicherheitszubeh\u00f6r f\u00fcrs Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1840185.jpg", + "alt": "Sicherheitszubeh\u00f6r f\u00fcrs Wohnmobil", + "caption": "Sicherheitszubeh\u00f6r f\u00fcrs Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2211040.jpg", + "alt": "Gasplakette", + "caption": "Gasplakette", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2178259.jpg", + "alt": "Absorberk\u00fchlschrank, Carado T 471", + "caption": "Absorberk\u00fchlschrank, Carado T 471", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1798546.jpg", + "alt": "Gastank-Einbau", + "caption": "Gastank-Einbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2195898.jpg", + "alt": "Sat-Anlagen, Dom-Antenne, Flach-Antenne, mobile Sat-Anlage, feste Sat-Anlage", + "caption": "Sat-Anlagen, Dom-Antenne, Flach-Antenne, mobile Sat-Anlage, feste Sat-Anlage", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1934330.jpg", + "alt": "Vergleich Chausson vs. Hobby", + "caption": "Vergleich Chausson vs. Hobby", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1765700.jpg", + "alt": "Gaswarner im Wohnmobil", + "caption": "Gaswarner im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2135374.jpg", + "alt": "Alexander Wottrich Interview", + "caption": "Alexander Wottrich Interview", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/", + "title": "Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate f\u00fcr den Ducato 8?", + "date": "Thu, 20 Feb 2025 06:00:00 +0100", + "summary": "

Fiat verspricht, mit einem Software-Update die Probleme mit der Ducato 9-Gang-Automatik zu l\u00f6sen. Doch h\u00e4lt die Ma\u00dfnahme, was sie verspricht? Wir wollen es wissen und haben nach Ihren Erfahrungen gefragt.

", + "text": "Sie sind gefragt! Was bringt das Softwareupdate f\u00fcr den Fiat Ducato? Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Wohnmobile Sie sind gefragt! Was bringt das Softwareupdate f\u00fcr den Fiat Ducato? Leserstimmen zum Update der 9-Gang-Automatik : Was bringt das Softwareupdate f\u00fcr den Ducato 8? Fiat verspricht, mit einem Software-Update die Probleme mit der Ducato 9-Gang-Automatik zu l\u00f6sen. Doch h\u00e4lt die Ma\u00dfnahme, was sie verspricht? Wir wollen es wissen und haben nach Ihren Erfahrungen gefragt. Samira Matschinsky Ver\u00f6ffentlicht am 20.02.2025 Foto: Kohstall 3 Bilder Im vergangenen Jahr h\u00e4uften sich Probleme mit der 2019 von Fiat neu eingef\u00fchrten 9-Gang-Automatik, vor allem bei Wohnmobilen, die die 3,5 Tonnen \u00fcberschritten. Es erreichten uns zahlreiche Berichte von Leserinnen und Lesern, die im Urlaub mit ihrem Wohnmobil von gelb und rot aufleuchtenden Getriebel\u00e4mpchen und der Motorkontrollleuchte \u00fcberrascht wurden. Nach einem Softwareupdate oder einem \u00d6lwechsel wurden viele Besitzerinnen und Besitzer mit ihren Wohnmobilen wieder nach Hause geschickt, bis sie, teilweise nur wenige Tage sp\u00e4ter, wieder vor den Toren der Werkstatt standen. Die finale Diagnose in vielen F\u00e4llen: Getriebeschaden . Hier geht es zu den Erfahrungen unserer Leserinnen und Leser. Sie sind gefragt! Was bringt das Software-Update? Die aktuellste Entwicklung ist nun ein Update der Steuerungssoftware von Motor und Getriebe, das k\u00fcnftig Probleme bzw. Defekte verhindern soll. Vorgesehen ist das Update f\u00fcr mit der 9-Gang-Wandlerautomatik ausgestattete Ducato-Modelle der Generation 8, die mit den 2,2-Liter-Motoren mit 160 und 180 PS best\u00fcckt sind. Die Fiat-Professional-Werkst\u00e4tten wurden Anfang November des letzten Jahres \u00fcber das Update informiert und haben entsprechende Instruktionen erhalten. promobil m\u00f6chte dieser L\u00f6sung nun auf den Zahn f\u00fchlen und hat Sie, liebe Leserinnen und Leser, nach ihren Erfahrungen gefragt. Die Erfahrungen unserer Leserinnen und Leser! Das neue Software-Update f\u00fcr die 9-Gang-Wandlerautomatik des Fiat Ducato soll k\u00fcnftig Getriebesch\u00e4den verhindern und das Zusammenspiel von Motor und Getriebe verbessern \u2013 doch wie sieht es in der Praxis aus? Noch Wochen nach unserem ersten Aufruf melden sich immer noch Leserinnen und Leser per Mail bei uns und berichten von ihren Erfahrungen mit der 9-Gang-Automatik. Nicht wenige dieser Zuschriften erz\u00e4hlen noch immer von Getriebesch\u00e4den und Werkstatt-Odyssee. Hier kam das Update zu sp\u00e4t. Doch die ersten Wohnmobile haben nun auch das Software-Update erhalten, welches k\u00fcnftig Probleme mit dem Getriebe der 9-Gangautomatik verhindern soll. Keine langen Wartezeiten f\u00fcr den Termin Bei etwas \u00fcber 50 Zuschriften zum Software-Update berichtet der \u00fcberwiegende Teil von positiven Erfahrungen. \"Nach einer Wartezeit von 2 Wochen konnten wir den Wagen abgeben und haben ihn innerhalb einer Woche wieder bekommen\", schreibt beispielsweise Andreas Neubert am 10.01.2025. Das Schaltverhalten sei seither \"definitiv besser, aber nicht optimal\". Martin D\u00f6ller bekam innerhalb einer Woche einen Termin. Die Aktion habe dann genau 45 Minuten gedauert. Seither merke er \"keinen Unterschied beim Fahren\". Auch Gerry Sch\u00f6newolf bekam innerhalb weniger Tage einen Termin f\u00fcr das Update. Was genau gemacht wurde, habe man ihm nicht gesagt. Insgesamt f\u00fchle sich das Update aber \"nicht schlecht an\". Er habe aber das Gef\u00fchl, dass das Wohnmobil im unteren Drehzahlbereich mehr Drehmoment habe und fr\u00fcher schalte. \"Allerdings habe ich auch den Eindruck, dass beim Beschleunigen oberhalb von 80\u201390 km/h etwas Leistung fehlt und das Fahrzeug dort tr\u00e4ger wirkt\" schildert Sch\u00f6newolf. Peter Neye bekam f\u00fcr seinen Roller Team innerhalb einer Woche einen Termin. Der sei auf 2 Stunden angesetzt gewesen. \"Da aber noch ein paar Kleinigkeiten gepr\u00fcft werden sollten, blieb das Fahrzeug \u00fcber Nacht\", schreibt er. \"Bei der Abholung wurde mir erkl\u00e4rt, was alles gemacht wurde. Das Personal war kompetent und freundlich. Ich werde mein Fahrzeug also wieder dort zum Service hinbringen\". Zum Fahrverhalten nach dem Update schreibt er: \"Das Fahr- und Schaltverhalten hat mich vor dem Update schon begeistert und ich muss zugeben, dass ich keine Ver\u00e4nderung nach dem Update feststellen konnte\". Dauer: 45 Minuten bis 2 Stunden So oder so \u00e4hnlich ergeht es auch zahlreichen anderen Lesern und Leserinnen. Meist verl\u00e4uft der Termin zwischen 45 Minuten und zwei Stunden. Wenn das Update im Rahmen anderer Ma\u00dfnahmen durchgef\u00fchrt wird, bleibt das Fahrzeug auch mal \u00fcber Nacht oder sogar die ganze Woche. Nicht jede Werkstatt kl\u00e4rt dabei den Kunden \u00fcber Sinn und Zweck des Updates auf. Einige wenige LeserInnen berichten auch davon, dass ihre Werkstatt von dem Update nichts gewusst hat oder sie sogar aufgefordert wurden, eine Geb\u00fchr f\u00fcr das eigentlich kostenlose Update zu zahlen. \u00dcber das Update informierte die Werkstatt bei Vorstellung Von ihrer Werkstatt oder ihrem H\u00e4ndler informiert worden sind ebenfalls die wenigsten. H\u00e4ufiger kam das Update im Rahmen einer \u00dcberpr\u00fcfung oder eines Servicetermins zur Sprache. Einige sprachen die Werkstatt auch auf das Update an, nachdem sie bei uns oder in einem Forum davon gelesen hatten. Die meisten bekamen dann jedoch schnell einen Termin. Fahrverhalten nach dem Update unauff\u00e4llig Mit der Getriebe-Problematik im Hinterkopf horchen Wohnmobil-Besitzer nach einem solchen Termin nat\u00fcrlich ganz genau in ihr Fahrzeug hinein. Dabei stellen die meisten nach dem Update jedoch keine bis eher geringe Unterschiede fest. Vereinzelte Kunden glauben eher eine Verbesserung im Fahrverhalten ersp\u00fcren zu k\u00f6nnen, insbesondere bei h\u00f6heren Geschwindigkeiten. In Einzelf\u00e4llen wird allerdings von verminderter Leistung, einem h\u00f6heren Verbrauch oder \u2013 in einem Fall \u2013 sogar von einem Getriebeschaden kurz nach dem Update berichtet. Dieser k\u00f6nnte aber nat\u00fcrlich auch bereits in den Grundz\u00fcgen bestanden haben, bevor das Update aufgespielt wurde. Zudem erw\u00e4hnen einzelne LeserInnen, dass sie bereits mehrere tausend Kilometer mit dem Update gefahren sind, ohne dass sich Probleme bemerkbar gemacht h\u00e4tten. Diese Berichte sind ermutigend, liefern jedoch noch keinen endg\u00fcltigen Beweis daf\u00fcr, dass das Update fl\u00e4chendeckend wirkt und das Risiko von Getriebesch\u00e4den signifikant reduziert. Weitere Leserstimmen zum Software-Update Schreitter J\u00fcrgen , am 10.01.2025, per Mail : \"Wir haben einen gebrauchten Malibu T 430 LE mit 180PS Automatik gekauft (20.500 km). Auch ich hatte im Vorfeld von der Problematik geh\u00f6rt, allerdings erst, als ich den Kaufvertrag bereits unterschrieben hatte. Als ich die FIN mitgeteilt bekam, habe ich mich bei Fiat registriert und mich dort vorab informiert. Dann hab ich mir einen sehr guten Fiat H\u00e4ndler in der Gegend gesucht und \u00fcber ihn meine FIN zur \u00dcberpr\u00fcfung geschickt. Fahrverhalten vor dem Update : Sehr unruhig und viel zu hohe Drehzahlen im 1.-2. Gang zu sp\u00fcren, selbst bei sanftem Gasfu\u00df. Ebenfalls kam ich auf der Autobahn selbst bei 120+ km/h nicht in den 9. Gang. Fahrverhalten nach dem Update : Ein absoluter Traum, Schaltvorg\u00e4nge sind nicht zu sp\u00fcren, selbst mein DSG 7 von VW Tiguan schaltet ruppiger. Verbrauch ca. 1,5-2 Liter geringer, 9. Gang bereits ab Tempo 95 km/h in Gebrauch und das nicht nur auf der Autobahn, sondern auch auf Landstra\u00dfen. Gef\u00fchlt zieht er kultivierter und angenehmer die Steigungen hoch.\" Oliver \u00d6hlenberg , am 24.01.2025, per Mail : \"Wir wurden leider nicht von Fiat bzw. B\u00fcrstner kontaktiert, sondern haben \u00fcber verschiedene Camper Foren bzw. der Presse von dem Update erfahren. Wir haben unseren FIAT H\u00e4ndler darauf angesprochen und dieser hat gesagt, das liege daran, dass B\u00fcrstner einen Kaufvertrag mit FIAT eingegangen ist und daher FIAT den eigentlichen Endkunden nicht kennt. Er hat auch gesagt, dass bei gr\u00f6\u00dferen Problemen mit dem Fahrzeug es eigentlich so sein sollte, dass der Endkunde eigentlich zum B\u00fcrstner H\u00e4ndler gehen muss, damit dieser dann das Fahrzeug an eine FIAT-Werkstatt bringen muss. Er hatte gerade mit dem Getriebe immer wieder den Fall, dass FIAT bei einem Getriebeaustausch ihm nur die Stunden bezahlt, welche man ben\u00f6tigt, um das Getriebe bei einem normalen Ducato zu tauschen. Der Zeitaufwand, gerade bei einem Vollintegrierten, ist aber wesentlich h\u00f6her. Die Differenz muss entweder der Endkunde zahlen, oder der Aufbauhersteller. Da es in K\u00f6ln nur noch einen FIAT Professional H\u00e4ndler gibt, welcher gro\u00dfe Wohnmobile (\u00fcber 6m) bearbeiten kann, mussten wir ca. 2 Monate auf einen Termin warten. 2 Tage dauerte dann das Update, da am eigentlichen Tag es ein Problem bei FIAT am Server gab und kein Update heruntergeladen werden konnte. Bis jetzt f\u00e4hrt das Fahrzeug wie vorher.\" Claus Bergmann , am 11.01.2025, per Mail : \"Wir fahren einen Malibu T460 Baujahr 03/2024. Wir haben 180PS mit der 9-Gang-Automatik (bislang 7.000 km ohne Probleme). Aufmerksam geworden sind wir zum einen \u00fcber die Carthago Gruppe in Facebook, zum anderen \u00fcber den Artikel in ihrer Zeitung. Ich bin im Oktober dann zu Fiat bez\u00fcglich eines Termines wegen des Updates und konnte 4 Wochen danach hinfahren. Den Termin hatte ich um 7.30 Uhr und rollte um 8.10 Uhr wieder vom Platz. Das lief alles sehr problemlos. Was ich schade fand, dass man mir nicht sagen konnte, was das Update macht. Der Inhaber sagte, sie h\u00e4tten eine Update-Nummer, mehr auch nicht. Das fand ich schon verwunderlich, dass diese Informationen nicht vorlagen. Sprich, ich wei\u00df bis heute nicht, was genau gemacht wurde. Ich bin bislang nicht viel gefahren, jedoch merkte ich, dass es fr\u00fcher schaltet und der 9. Gang schneller erreicht wird als fr\u00fcher. Bei ca. 100 km/h schaltet er in den neunten Gang, das war fr\u00fcher definitiv nicht der Fall.\" Jens Birkenk\u00f6tter , per Mail: \"Die Abwicklung war sehr gut. Termin vereinbart, zwei Wochen sp\u00e4ter das neue Software Update bekommen.\" So haben wir gefragt: Haben Sie das Update schon gemacht? Wurden Sie aktiv von Fiat kontaktiert oder haben Sie auf anderen Wegen von dem Update erfahren? Wie schnell haben Sie einen Termin f\u00fcr das Update erhalten? Wie lange dauerte der Werkstattbesuch? Haben Sie Ver\u00e4nderungen im Fahrverhalten Ihres Ducato festgestellt \u2013 vor und nach dem Update? Haben Sie vorher Probleme mit dem Getriebe erlebt, und wenn ja, welche? Wurden Sie \u00fcber den Update-Vorgang und dessen Ziele ausreichend informiert? Wie bewerten Sie den Service von Fiat Professional und den Ablauf der Aktion insgesamt? Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", + "tags": [], + "status": "New", + "link": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1605269.jpg", + "alt": "Fiat Ducato 9 Speed Automatik", + "caption": "Fiat Ducato 9 Speed Automatik", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/", + "title": "Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das k\u00f6nnen Sie tun!", + "date": "Sat, 23 Nov 2024 12:00:00 +0100", + "summary": "

Die Versicherungspolicen f\u00fcr Wohnmobile werden 2025 deutlich teurer. Warum die Kosten steigen und wie Sie dennoch sparen k\u00f6nnen.

", + "text": "Preisschock f\u00fcr Wohnmobil-Besitzer: Warum Versicherungen 2025 teurer werden Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Weitere News Preisschock f\u00fcr Wohnmobil-Besitzer: Warum Versicherungen 2025 teurer werden Preisschock bei Wohnmobilversicherungen : Versicherung gestiegen? Das k\u00f6nnen Sie tun! Die Versicherungspolicen f\u00fcr Wohnmobile werden 2025 deutlich teurer. Warum die Kosten steigen und wie Sie dennoch sparen k\u00f6nnen. Samira Matschinsky Ver\u00f6ffentlicht am 23.11.2024 Foto: E+ 5 Bilder P\u00fcnktlich zum Ende des Versicherungsjahres flattern bei Wohnmobilbesitzern und -besitzerinnen die Briefe von HUK, Helvetia, RMV und Co. ins Haus. Und \u2013 Oh, Schreck! 2025 wird es teurer. Und zwar deutlich. Kolleginnen und Kollegen aus der Redaktion sowie vereinzelte Leserstimmen berichten von bis zu 60 % Preissteigerung ihrer Versicherungspr\u00e4mien , und auch das Internet ist voll der Klage. Doch warum ist das eigentlich so? Und was kann man tun, um die Mehrkosten abzumildern oder abzufangen? Sch\u00fctzen, was einem lieb und teuer ist \u2013 damit wirbt fast jede Versicherung. Im Falle eines Reisemobils, das oft einen nicht unbetr\u00e4chtlichen Wert darstellt, kommt der Versicherung eine wichtige Rolle zu \u2013 denn nur mit dem richtigen Schutz bleibt man im Schadensfall nicht im Regen stehen. Allzu oft muss man sich bei der Suche nach dem idealen Tarif jedoch durch einen Dschungel an Kleingedrucktem k\u00e4mpfen. In diesem Artikel beantwortet promobil die wichtigsten Fragen rund um die Reisemobil-Versicherung. So stark gehen die Versicherungen nach oben Ganz aktuell stellen sich die meisten Wohnmobilbesitzer und -besitzerinnen in Deutschland aber eine ganz andere Frage: \"Warum ist das pl\u00f6tzlich so viel teurer?\" Und das oft, obwohl die Schadensfreiheitsklasse ja steigt. Wir haben Beispiele aus dem Redaktionsumfeld gesammelt: Christian: \"Unser Dethleffs Trend (Baujahr 2015) h\u00e4tte zum neuen Jahr knapp 170 Euro mehr an Versicherung kosten sollen, also fast 30 % Steigerung. Nach einem Anruf bei der RMV/Kravag wurden mir 660 angeboten, nur noch 60 Euro mehr. Bei der Neueinstufung spielten mehrere Faktoren eine Rolle: Ich habe Schadensfreiheitsklasse 28, Vollkasko mit 1.000 Euro Selbstbeteiligung und Teilkasko mit 150 Euro SB. Das GFK-Dach hat noch einmal 20 % Rabatt eingebracht.\" Philipp: \"Meine Versicherung wird zum neuen Jahr fast 20 % teurer. Das Frustrierende daran ist, dass sich ja parallel meine SF verbessert hat, was eigentlich f\u00fcr einen sinkenden Preis sorgen sollte. Eine Neueinstufung lohnt sich f\u00fcr mich leider auch nicht. Das hat verschiedene Gr\u00fcnde, unter anderem, dass der gut ausgestattete Grand California einen hohen Neuwert hatte. Eine h\u00f6here Selbstbeteiligung w\u00e4re noch eine M\u00f6glichkeit, die Mehrkosten f\u00fcr den Moment abzufedern.\" Uli: \"Mein Makler hat mich k\u00fcrzlich kontaktiert. Meine Wohnmobilversicherung sollte 2025 um 60 % erh\u00f6ht werden, doch er hat von sich aus nach anderen M\u00f6glichkeiten geschaut und einen Wechsel vollzogen. Jetzt bin ich in etwa wieder bei meinem urspr\u00fcnglichen Tarif.\" Woher kommen die Preissteigerungen? Als Grund f\u00fcr die Teuerungen kommen auf der Makroebene verschiedene, wirtschalftliche Faktoren ins Spiel: gestiegene Reparaturkosten und Kosten f\u00fcr Ersatzteile, hohe Schadensquoten aus den vergangenen Jahren und inflationsbedingte Kostensteigerungen. Durch die drastischen Anpassungen versuchen Versicherer diese Verluste auszugleichen, was insbesondere Wohnmobilhalter trifft, da diese Fahrzeuge oft h\u00f6here Schadenskosten verursachen als Pkws. Diese Erh\u00f6hungen werden auf verschiedenen Wegen eingef\u00fchrt. In den Briefen der Versicherer werden unter anderem sogenannte Regional- und Typenklassen aufgef\u00fchrt. Diese Klassen erm\u00f6glichen Versicherern eine differenzierte Risikobewertung und tragen dazu bei, die Pr\u00e4mien individuell an bestimmte Risikoprofile anzupassen. Regionalklassen bewerten das Risiko, das mit dem Wohnort des Fahrzeughalters verbunden ist. Faktoren wie Unfallh\u00e4ufigkeit, Diebstahlquote oder das Wetterrisiko (z. B. Hagel- und Sturmgefahr) flie\u00dfen in diese Bewertung ein. Typenklassen ber\u00fccksichtigen das Schadens- und Reparaturrisiko eines bestimmten Fahrzeugs. F\u00fcr Wohnmobile spielen hier Faktoren wie die Bauart, technische Ausstattung, Reparaturkosten und die Schadenh\u00e4ufigkeit dieses Typs eine Rolle. Versicherer nutzen au\u00dferdem vermehrt neue, datenbasierte Tarifierungsmodelle , die detaillierte Faktoren wie Fahrverhalten oder Nutzungsintensit\u00e4t ber\u00fccksichtigen. Dies kann bedeuten, dass bestimmte Nutzergruppen, etwa Vielfahrer oder Wohnmobile mit hohem Risiko f\u00fcr Naturgefahren, st\u00e4rker belastet werden, auch wenn ihre Klasseneinstufung unver\u00e4ndert bleibt. 7 Tipps, um bei der Versicherung Kosten zu sparen Erste Ma\u00dfnahmen, die Sie ergreifen k\u00f6nnen, um eine Preissteigerung Ihrer Womo-Versicherungspr\u00e4mie abzumildern, klangen bereits mit. Rufen Sie Ihren Versicherer an. In dem einen oder anderen Fall f\u00fchrte das schon zu einer weniger saftigen Erh\u00f6hung im neuen Jahr. Auch der Wechsel zu einem Maklerb\u00fcro kann sich lohnen, da diese noch einmal ganz andere M\u00f6glichkeiten haben mit den Versicherern zu verhandeln. Doch welche Ma\u00dfnahmen kann man noch ergreifen, wenn der Anruf nicht gen\u00fcgt? Vergleichen Sie aktiv verschiedene Anbieter : Selbst bei einer allgemeinen Erh\u00f6hung gibt es deutliche Unterschiede zwischen den Versicherungen. Plattformen wie Verivox oder Check24 sowie spezialisierte Anbieter wie der ADAC oder RMV k\u00f6nnen helfen, einen \u00dcberblick zu erhalten. Pr\u00fcfen Sie dabei immer den Leistungsumfang. Selbstbeteiligung erh\u00f6hen : Eine h\u00f6here Selbstbeteiligung kann den Beitrag sp\u00fcrbar senken, ist aber nur sinnvoll, wenn Sie in der Lage sind, kleinere Sch\u00e4den selbst zu tragen. Leistungsumfang pr\u00fcfen : Verzichten Sie auf unn\u00f6tige Zusatzleistungen, die f\u00fcr Ihre Nutzung unwichtig sind, wie z. B. Camping-Inhaltsschutz, falls Sie diesen nicht ben\u00f6tigen. Risikofaktoren minimieren : Wenn m\u00f6glich, sollten Sie das Fahrzeug an einem sicheren Standort wie einer Garage abstellen, da dies positiv auf die Pr\u00e4mie wirken kann. Betreuung durch Makler : Ein Versicherungsmakler kann helfen, gezielt passende Angebote zu finden und die Vertragsbedingungen zu optimieren. Manche Versicherer bieten Rabatte, die direkt nur \u00fcber Makler verf\u00fcgbar sind. Au\u00dferdem sucht ein guter Versicherungsmakler proaktiv nach besseren Angeboten wenn eine unverh\u00e4ltnism\u00e4\u00dfige Beitragserh\u00f6hung kommt. Neueinstufung : \u00dcberpr\u00fcfen Sie, ob eine Neueinstufung sich lohnen kann. Manchmal profitiert man dann unter anderem von Neukunden-Rabatten der eigenen Versicherung und auch Faktoren wie ein GFK-Dach oder eine besser gesch\u00fctzter Standort k\u00f6nnen dann neuerlich ber\u00fccksichtigt werden. Eine Neueinstufung kann aber auch teurer ausfallen als der urspr\u00fcngliche Tarif. Wechsel zur Wechselsaison : Viele Versicherer bieten zum Jahresende spezielle Konditionen f\u00fcr Neukunden. Nutzen Sie diese Phase, um bessere Tarife zu sichern. Stichtag ist 2024 der 2.12 , da der 30.11. auf einen Samstag f\u00e4llt. Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", + "tags": [], + "status": "New", + "link": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2160053.jpg", + "alt": "Wohnmobil, Liegenbleiben, Motorschaden, Panne", + "caption": "Wohnmobil, Liegenbleiben, Motorschaden, Panne", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + } + ], + "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/", + "title": "Camper-Radio\u200b Caravan.fm : Radiosender speziell f\u00fcr Camping-Fans", + "date": "Mon, 02 Oct 2023 16:00:00 +0200", + "summary": "

Welcher Radiosender l\u00e4uft bei Ihnen im Reisemobil oder Campingbus? Seit Juli 2023 gibt es einen Radiosender speziell f\u00fcr Camperinnen und Camper.

", + "text": "Camper-Radio caravan.fm\u200b: Radiosender f\u00fcr Camping-Fans Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Camper-Radio caravan.fm\u200b: Radiosender f\u00fcr Camping-Fans Camper-Radio\u200b Caravan.fm : Radiosender speziell f\u00fcr Camping-Fans Welcher Radiosender l\u00e4uft bei Ihnen im Reisemobil oder Campingbus? Seit Juli 2023 gibt es einen Radiosender speziell f\u00fcr Camperinnen und Camper. Ver\u00f6ffentlicht am 02.10.2023 Foto: 375441151 Auf Caravan.fm l\u00e4uft abwechslungsreiche Mainstream-Musik f\u00fcr entspanntes Reisen, dazu st\u00fcndlich Kurznachrichten und europaweites Reisewetter. Ins Leben gerufen wurde der Sender, der sein Programm rund um die Uhr ausstrahlt, von Radio Hamburg. Das hei\u00dft nicht, dass man nur in und um Hamburg herum den Radiosender f\u00fcr Campingfans h\u00f6ren kann. Aktuell kann er als Stream \u00fcber die Webadresse www.caravan.fm und \u00fcber die Caravan.fm-App geh\u00f6rt werden. Laut den Verantwortlichen ist sogar ein Empfang \u00fcber DAB+ geplant. Das Programm von Caravan.fm Themen im Programm sind das Camping \u2013 egal ob im Wohnmobil, Campervan, Wohnwagen oder Zelt. Das Motto des Senders lautet: \"Im Hotel sind wir G\u00e4ste, auf dem Campingplatz zuhause.\" Linn MacKenzie (37) ist Moderatorin und Redaktionsleiterin von CARAVAN.fm: \"Ich liebe die Langsamkeit beim Campen, die totale Entschleunigung. Genau dieses Gef\u00fchl von Ruhe und Leidenschaft m\u00f6chten wir vermitteln. Wir machen das erste Radioprogramm in Deutschland speziell f\u00fcr Camper, um ihnen das perfekte musikalische Begleitprogramm f\u00fcr ihre Campingabenteuer zu bieten.\" Das t\u00e4gliche Programm gliedert sich derzeit in folgende Sendestrecken \"CARAVAN.fm-Br\u00f6tchenshow\" Mo-So von 7-11 Uhr \"CARAVAN.fm-Mittagspause\" Mo-So von 11-15 Uhr \"CARAVAN.fm-Happy Hours\" Mo-So von 17-20 Uhr von 20-7 Uhr Musik nonstop Freitag und Samstag von 20 bis 21 Uhr steht das \"CARAVAN.fm-Lagerfeuer\" auf dem Programm. Passend zum Thema Lagerfeuer-Romantik spielt der Sender eine Stunde lang stimmungsvolle Indie- und Akustiksongs. Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", + "tags": [], + "status": "New", + "link": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2035069.jpg", + "alt": "Camper-Radio\u200b", + "caption": "Camper-Radio\u200b", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", + "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220724.jpg", + "alt": "Crosscamp ADVTR 5.4", + "caption": "Crosscamp ADVTR 5.4", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219725.jpg", + "alt": "Ahorn", + "caption": "Ahorn", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220327.jpg", + "alt": "Fleurette Wellness Sonderedition 2030", + "caption": "Fleurette Wellness Sonderedition 2030", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2219414.jpg", + "alt": "Teaser Amazon Prime Day 2025", + "caption": "Teaser Amazon Prime Day 2025", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" + } + ], + "source": "https://www.promobil.de/rss/news" } ] \ No newline at end of file diff --git a/data/feeds.json b/data/feeds.json index e1d263e..87fd371 100644 --- a/data/feeds.json +++ b/data/feeds.json @@ -1,3 +1,14 @@ [ - "https://www.camping-news.de/rss/" + { + "url": "https://www.camping-news.de/rss/", + "name": "Camping News" + }, + { + "url": "https://www.promobil.de/rss/news", + "name": "Promobil News" + }, + { + "url": "https://www.promobil.de/rss/ratgeber", + "name": "Promobil Ratgeber" + } ] \ No newline at end of file diff --git a/logs/rss_tool.log b/logs/rss_tool.log index 01b220e..5ed7b3a 100644 --- a/logs/rss_tool.log +++ b/logs/rss_tool.log @@ -140,3 +140,81 @@ 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 +2025-07-11 08:22:15,359 - INFO - Lade Feed: https://www.camping-news.de/rss/ +2025-07-11 08:22:15,648 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ +2025-07-11 08:22:15,649 - INFO - Keine neuen Artikel gefunden. +2025-07-11 08:29:26,863 - INFO - Lade Feed: https://www.camping-news.de/rss/ +2025-07-11 08:29:27,225 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ +2025-07-11 08:29:27,225 - INFO - Lade Feed: https://www.promobil.de/rss/news +2025-07-11 08:29:27,464 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/termine-veranstaltungen-juni-juli/ +2025-07-11 08:29:27,618 - INFO - 13 Bilder gefunden bei https://www.promobil.de/termine-veranstaltungen-juni-juli/ +2025-07-11 08:29:27,618 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ +2025-07-11 08:29:27,782 - INFO - 22 Bilder gefunden bei https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ +2025-07-11 08:29:27,783 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ +2025-07-11 08:29:27,984 - INFO - 23 Bilder gefunden bei https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ +2025-07-11 08:29:27,985 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ +2025-07-11 08:29:28,132 - INFO - 21 Bilder gefunden bei https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ +2025-07-11 08:29:28,132 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ +2025-07-11 08:29:28,279 - INFO - 13 Bilder gefunden bei https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ +2025-07-11 08:29:28,280 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ +2025-07-11 08:29:28,422 - INFO - 14 Bilder gefunden bei https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ +2025-07-11 08:29:28,422 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/top-10-clever-campen-videos-2024/ +2025-07-11 08:29:28,572 - INFO - 14 Bilder gefunden bei https://www.promobil.de/top-10-clever-campen-videos-2024/ +2025-07-11 08:29:28,572 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ +2025-07-11 08:29:28,761 - INFO - 25 Bilder gefunden bei https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ +2025-07-11 08:29:28,761 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ +2025-07-11 08:29:28,945 - INFO - 33 Bilder gefunden bei https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ +2025-07-11 08:29:28,946 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ +2025-07-11 08:29:29,104 - INFO - 13 Bilder gefunden bei https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ +2025-07-11 08:29:29,105 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ +2025-07-11 08:29:29,257 - INFO - 15 Bilder gefunden bei https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ +2025-07-11 08:29:29,257 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/ +2025-07-11 08:29:29,436 - INFO - 24 Bilder gefunden bei https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/ +2025-07-11 08:29:29,436 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ +2025-07-11 08:29:29,593 - INFO - 16 Bilder gefunden bei https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ +2025-07-11 08:29:29,593 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ +2025-07-11 08:29:29,786 - INFO - 19 Bilder gefunden bei https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ +2025-07-11 08:29:29,786 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/can-kasim-dogan-interview-westfalia/ +2025-07-11 08:29:29,934 - INFO - 13 Bilder gefunden bei https://www.promobil.de/can-kasim-dogan-interview-westfalia/ +2025-07-11 08:29:29,934 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ +2025-07-11 08:29:30,103 - INFO - 22 Bilder gefunden bei https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ +2025-07-11 08:29:30,103 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/spielorte-em-2024-frankfurt/ +2025-07-11 08:29:30,276 - INFO - 18 Bilder gefunden bei https://www.promobil.de/spielorte-em-2024-frankfurt/ +2025-07-11 08:29:30,276 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ +2025-07-11 08:29:30,450 - INFO - 18 Bilder gefunden bei https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ +2025-07-11 08:29:30,451 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/camper-radio-radiosender-caravan-fm/ +2025-07-11 08:29:30,600 - INFO - 13 Bilder gefunden bei https://www.promobil.de/camper-radio-radiosender-caravan-fm/ +2025-07-11 08:29:30,600 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ +2025-07-11 08:29:30,750 - INFO - 13 Bilder gefunden bei https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ +2025-07-11 08:29:30,750 - INFO - 20 neue Artikel gefunden in https://www.promobil.de/rss/news +2025-07-11 08:29:30,759 - INFO - 20 neue Artikel gespeichert. +2025-07-11 08:34:46,453 - INFO - ✍️ Umschreiben von: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-07-11 08:34:50,280 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-11 08:34:51,815 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-11 08:34:51,819 - INFO - ✅ Artikel umgeschrieben: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-07-11 08:34:51,819 - INFO - ✍️ Umschreiben von: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-07-11 08:34:57,346 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-11 08:34:59,085 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-11 08:34:59,087 - INFO - ✅ Artikel umgeschrieben: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-07-11 08:34:59,087 - INFO - ✍️ Umschreiben von: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-07-11 08:35:05,071 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-11 08:35:07,789 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-11 08:35:07,792 - INFO - ✅ Artikel umgeschrieben: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-07-11 08:35:07,803 - INFO - Alle Artikel mit Status 'Rewrite' wurden verarbeitet. +2025-07-11 08:54:52,549 - INFO - Lade Feed: https://www.camping-news.de/rss/ +2025-07-11 08:54:53,036 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ +2025-07-11 08:54:53,036 - INFO - Lade Feed: https://www.promobil.de/rss/news +2025-07-11 08:54:53,402 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/termine-veranstaltungen-juni-juli/ +2025-07-11 08:54:53,558 - INFO - 13 Bilder gefunden bei https://www.promobil.de/termine-veranstaltungen-juni-juli/ +2025-07-11 08:54:53,731 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ +2025-07-11 08:54:53,908 - INFO - 22 Bilder gefunden bei https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ +2025-07-11 08:54:54,076 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ +2025-07-11 08:54:54,217 - INFO - 13 Bilder gefunden bei https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ +2025-07-11 08:54:54,376 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ +2025-07-11 08:54:54,537 - INFO - 13 Bilder gefunden bei https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ +2025-07-11 08:54:54,682 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/camper-radio-radiosender-caravan-fm/ +2025-07-11 08:54:54,826 - INFO - 13 Bilder gefunden bei https://www.promobil.de/camper-radio-radiosender-caravan-fm/ +2025-07-11 08:54:54,826 - INFO - 5 neue Artikel gefunden in https://www.promobil.de/rss/news +2025-07-11 08:54:54,834 - INFO - 5 neue Artikel gespeichert. +2025-07-11 09:34:42,951 - INFO - ❌ Feed gelöscht: Promobil Ratgeber (https://www.promobil.de/rss/ratgeber) +2025-07-11 09:35:05,863 - INFO - 🔗 Neuer Feed hinzugefügt: Promobil Ratgeber (https://www.promobil.de/rss/ratgeber) diff --git a/main.py b/main.py index a386c37..ff17f33 100644 --- a/main.py +++ b/main.py @@ -7,8 +7,9 @@ from bs4 import BeautifulSoup from datetime import datetime from dotenv import load_dotenv import logging -from utils.image_extractor import extract_images_with_metadata import openai +from utils.image_extractor import extract_images_with_metadata +from utils.article_extractor import extract_full_article load_dotenv() @@ -75,6 +76,12 @@ def fetch_and_process_feed(feed_url, existing_ids): soup = BeautifulSoup(content, "html.parser") clean_text = soup.get_text(" ", strip=True) + # Automatischer Volltext-Fetch bei zu wenig Wörtern + if len(clean_text.split()) < 50 and entry.get("link"): + fetched_text = extract_full_article(entry["link"]) + if len(fetched_text.split()) > len(clean_text.split()): + clean_text = fetched_text + images = extract_images_with_metadata(entry.link) new_articles.append({ @@ -86,7 +93,8 @@ def fetch_and_process_feed(feed_url, existing_ids): "tags": [], "status": "New", "link": entry.get("link", ""), - "images": images + "images": images, + "source": feed_url }) return new_articles diff --git a/pages/01_feed_manager.py b/pages/01_feed_manager.py new file mode 100644 index 0000000..ffe7d51 --- /dev/null +++ b/pages/01_feed_manager.py @@ -0,0 +1,71 @@ +# pages/01_feed_manager.py + +import streamlit as st +from main import load_feeds, save_feeds, load_articles +import logging + +# === Logging vorbereiten === +log_dir = "logs" +log_file = f"{log_dir}/rss_tool.log" +logging.basicConfig( + filename=log_file, + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s" +) + +st.set_page_config(page_title="📡 Feed-Verwaltung") + +st.title("📡 RSS Feed-Verwaltung") +feeds = load_feeds() +articles = load_articles() + +# === Neuen Feed hinzufügen === +st.subheader("➕ Neuen Feed hinzufügen") + +with st.form("add_feed_form"): + new_url = st.text_input("Feed URL", "") + new_name = st.text_input("Feed Name", "") + submitted = st.form_submit_button("Feed hinzufügen") + if submitted: + if new_url and new_name: + if not any(f.get("url") == new_url for f in feeds): + feeds.append({"url": new_url, "name": new_name}) + save_feeds(feeds) + logging.info(f"🔗 Neuer Feed hinzugefügt: {new_name} ({new_url})") + st.success(f"Feed '{new_name}' hinzugefügt.") + st.rerun() + else: + st.warning("⚠️ Dieser Feed existiert bereits.") + else: + st.error("❌ Bitte gib sowohl URL als auch Name ein.") + +# === Bestehende Feeds bearbeiten === +st.subheader("🛠️ Vorhandene Feeds bearbeiten oder löschen") + +for idx, feed in enumerate(feeds): + with st.expander(f"🔗 {feed.get('name')}"): + url = st.text_input(f"Feed-URL {idx}", value=feed.get("url"), key=f"url_{idx}") + name = st.text_input(f"Feed-Name {idx}", value=feed.get("name"), key=f"name_{idx}") + count = sum(1 for a in articles if a.get("source") == feed.get("url")) + + col1, col2 = st.columns(2) + + with col1: + if st.button("💾 Änderungen speichern", key=f"save_{idx}"): + old_url, old_name = feed.get("url"), feed.get("name") + feeds[idx]["url"] = url + feeds[idx]["name"] = name + save_feeds(feeds) + logging.info(f"✏️ Feed geändert: '{old_name}' ({old_url}) → '{name}' ({url})") + st.success("Änderungen gespeichert.") + st.rerun() + + with col2: + if st.button("🗑️ Feed löschen", key=f"delete_{idx}"): + deleted_feed = feeds.pop(idx) + save_feeds(feeds) + logging.info(f"❌ Feed gelöscht: {deleted_feed.get('name')} ({deleted_feed.get('url')})") + st.warning("Feed gelöscht.") + st.rerun() + + st.caption(f"📰 Verknüpfte Artikel: {count}") diff --git a/utils/article_extractor.py b/utils/article_extractor.py new file mode 100644 index 0000000..3e9bdc3 --- /dev/null +++ b/utils/article_extractor.py @@ -0,0 +1,27 @@ +# utils/article_extractor.py + +import requests +from bs4 import BeautifulSoup + +def extract_full_article(url: str) -> str: + try: + response = requests.get(url, timeout=10) + response.raise_for_status() + soup = BeautifulSoup(response.text, "html.parser") + + # Promobil & WordPress & allgemeine Fallbacks + candidates = [ + {"tag": "div", "class_": "article__text"}, # Promobil + {"tag": "div", "class_": "entry-content"}, # WordPress Standard + {"tag": "article", "class_": None}, # Generisch + ] + + for selector in candidates: + el = soup.find(selector["tag"], class_=selector["class_"]) + if el and len(el.get_text(strip=True).split()) > 50: + return el.get_text(" ", strip=True) + + # Fallback: ganzer Seiteninhalt + return soup.get_text(" ", strip=True) + except Exception: + return "" diff --git a/utils/article_utils.py b/utils/article_utils.py new file mode 100644 index 0000000..ee6f289 --- /dev/null +++ b/utils/article_utils.py @@ -0,0 +1,23 @@ +# utils/article_utils.py + +import hashlib + +def clean_text(text: str) -> str: + return text.strip() + +def generate_id(link: str) -> str: + return hashlib.md5(link.encode("utf-8")).hexdigest() + +def categorize_article(text: str) -> str: + # Dummy-Kategorie + return "Allgemein" + +def tag_article(text: str) -> list: + # Dummy-Tags + return ["tag1", "tag2"] + +def summarize_text(text: str) -> str: + return text[:200] + "..." + +def rewrite_text(text: str) -> str: + return text # Platzhalter, z. B. für GPT-Rewrite später From 1797f687cd44e3279bd021293948a1165ccfb400 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Fri, 11 Jul 2025 19:17:27 +0200 Subject: [PATCH 16/87] Update README.md --- README.md | 62 +++++++------------------------------------------------ 1 file changed, 8 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 830e554..0f3d86c 100644 --- a/README.md +++ b/README.md @@ -50,60 +50,6 @@ ss-news/ --- -## 🔐 Signierte Commits und Tags - -Dieses Projekt unterstützt **signierte Commits und Tags über SSH** (alternativ GPG). GitHub zeigt für signierte Beiträge ein ✅ **Verified**-Badge an. - -### 🛠 Voraussetzungen - -1. Ein SSH-Key (z. B. `~/.ssh/id_ed25519`) ist generiert: - - ```bash - ssh-keygen -t ed25519 -C "deine@email.de" - ``` - -2. Key bei GitHub an zwei Stellen hinterlegen: - * 🔏 Signing Keys (für Commit-Signatur) - * 🔐 SSH Keys (für Git-Push/Pull) - -3. Git-Konfiguration - - ```bash - git config --global gpg.format ssh - git config --global user.signingkey ~/.ssh/id_ed25519.pub - git config --global commit.gpgsign true - ``` - -4. Optional: SSH config zur Sicherheit: - - ```bash - # ~/.ssh/config - Host github.com - HostName github.com - User git - IdentityFile ~/.ssh/id_ed25519 - IdentitiesOnly yes - ``` ---- - -🧰 Nutzung von versioning.py -Die Datei versioning.py automatisiert: - - * ⬆️ Versionsnummer erhöhen - * 📄 CHANGELOG.md und __version__.py aktualisieren - * 🔒 Commit signieren (SSH oder GPG) - * 🏷 Git-Tag signieren - * ⬆️ Push zu GitHub - -Beispiel: - ```bash - python versioning.py --level minor --push - ``` - -* Wählt automatisch SSH oder GPG zur Signatur -* Optional --no-sign, um ohne Signatur zu arbeiten ---- - ## ⚙️ Installation ```bash @@ -116,6 +62,14 @@ pip install -r requirements.txt --- +## Update +Ein Update Script findest du hier: https://gist.github.com/OliverGiertz/ad33ae3de9aa1c1163dad5fe8affb6ca + +```bash +bash update.sh +``` + + ## ▶️ Starten der App streamlit run app.py From 79bdb57e98b40c22a4fc87f2b67b35464208c91d Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 14 Jul 2025 10:31:45 +0200 Subject: [PATCH 17/87] Create deploy.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🚀 Add GitHub Action for auto-deploy to Hetzner --- .github/workflows/deploy.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..5d55808 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,27 @@ +name: 🚀 Deploy to Hetzner + +on: + push: + branches: [main] + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Deploy via SSH + uses: appleboy/ssh-action@v1.0.0 + with: + host: 88.99.209.207 + username: oliver + key: ${{ secrets.HETZNER_SSH_KEY }} + port: 22 + script: | + cd rss-news + git pull origin main + source .venv/bin/activate + pip install -r requirements.txt + sudo systemctl restart rss-app From 9898964f00cd37f4c8fab51396035746824e16d2 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 14 Jul 2025 10:42:55 +0200 Subject: [PATCH 18/87] =?UTF-8?q?=F0=9F=94=81=20Trigger=20Deploy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 050e08859c3bb308531e8d48f36d4b1819d5040b Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 14 Jul 2025 10:43:47 +0200 Subject: [PATCH 19/87] =?UTF-8?q?=F0=9F=94=81=20Trigger=20Deploy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 0c84dd1a1a7751654689eb17cf0e4ddb0aee4fb8 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 16 Aug 2025 11:13:10 +0200 Subject: [PATCH 20/87] Grundfunktionen optimiert --- app.py | 750 ++++++++-- data/articles.json | 2653 +++++++++++++++++++++++++++++++++++- internal/git.sh | 20 + logs/rss_tool.log | 293 ++++ main.py | 491 +++++-- utils/article_extractor.py | 376 ++++- utils/image_extractor.py | 362 ++++- utils/ui_helpers.py | 236 ++++ 8 files changed, 4866 insertions(+), 315 deletions(-) create mode 100644 internal/git.sh create mode 100644 utils/ui_helpers.py diff --git a/app.py b/app.py index c9c33b8..4e499ca 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,4 @@ -# app.py (aktualisiert mit Feed-Dropdown) +# app.py import streamlit as st from datetime import datetime @@ -13,151 +13,659 @@ from main import ( from utils.dalle_generator import generate_dalle_image import os from collections import Counter +import time -st.set_page_config(page_title="📰 RSS Artikel Manager", layout="wide") -st.title("📰 RSS Artikel Manager") +# === Page Configuration === +st.set_page_config( + page_title="📰 RSS Artikel Manager", + layout="wide", + initial_sidebar_state="collapsed" +) -# === Sidebar: Feed-Verwaltung === -st.sidebar.header("📡 RSS Feeds verwalten") -feeds = load_feeds() -new_feed = st.sidebar.text_input("Neuen RSS Feed hinzufügen") -if st.sidebar.button("Feed hinzufügen"): - if new_feed and new_feed not in [f.get("url", f) for f in feeds]: - feeds.append({"url": new_feed, "name": "Neuer Feed"}) - save_feeds(feeds) - st.sidebar.success("Feed hinzugefügt") +# === Custom CSS für modernes Design === +st.markdown(""" + +""", unsafe_allow_html=True) -if st.sidebar.button("🔄 Alle Feeds neu laden"): - existing_ids = [a["id"] for a in load_articles()] - process_articles(existing_ids) - st.rerun() +# === Initialize Session State === +if 'selected_articles' not in st.session_state: + st.session_state.selected_articles = set() +if 'search_query' not in st.session_state: + st.session_state.search_query = "" +if 'status_filter' not in st.session_state: + st.session_state.status_filter = "New" +if 'feed_filter' not in st.session_state: + st.session_state.feed_filter = "Alle" -if st.sidebar.button("✍️ Artikel umschreiben (Rewrite)"): - rewrite_articles() - st.rerun() +# === Helper Functions === +def get_status_badge(status): + """Erstellt einen farbigen Status-Badge""" + status_classes = { + "New": "status-new", + "Rewrite": "status-rewrite", + "Process": "status-process", + "Online": "status-online", + "On Hold": "status-hold", + "Trash": "status-trash" + } + class_name = status_classes.get(status, "status-new") + return f'{status}' -# === Hauptbereich: Artikelübersicht === -st.header("📋 Artikelübersicht") -status_filter = st.selectbox("Status filtern", ["Alle", "New", "Rewrite", "Process", "Online", "On Hold", "Trash"], index=1) +def format_date(date_str): + """Formatiert Datum für bessere Lesbarkeit""" + try: + if "GMT" in date_str or "+" in date_str: + return datetime.strptime(date_str, "%a, %d %b %Y %H:%M:%S %z").strftime("%d.%m.%Y %H:%M") + else: + return date_str[:16].replace("T", " ") + except: + return date_str[:10] -all_articles = load_articles() -articles = all_articles +def get_word_count(text): + """Zählt Wörter im Text""" + return len(text.split()) if text else 0 -if status_filter != "Alle": - articles = [a for a in articles if a.get("status") == status_filter] +def show_notification(message, type="success"): + """Zeigt eine Benachrichtigung an""" + if type == "success": + st.success(message) + elif type == "error": + st.error(message) + elif type == "warning": + st.warning(message) + elif type == "info": + st.info(message) -# === Feed-Filter === -source_to_name = {f.get("url"): f.get("name", "unidentified") for f in feeds} -source_counter = Counter([a.get("source", "unidentified") for a in articles]) +# === Header === +st.markdown(""" +
+

📰 RSS Artikel Manager

+

Moderne Verwaltung deiner RSS-Feeds und Artikel

+
+""", unsafe_allow_html=True) -feed_options = ["Alle ({})".format(len(articles))] -feed_map = {} +# === Tab Navigation === +tab1, tab2, tab3, tab4, tab5 = st.tabs([ + "📋 Dashboard", + "📰 Artikel", + "📡 Feeds", + "🖼️ Bilder", + "📊 Statistiken" +]) -for source, count in source_counter.items(): - name = source_to_name.get(source, "unidentified") - label = f"{name} ({count})" - feed_options.append(label) - feed_map[label] = source +# === Dashboard Tab === +with tab1: + st.header("📊 Übersicht") + + # Lade Daten + all_articles = load_articles() + feeds = load_feeds() + + # Statistiken + col1, col2, col3, col4 = st.columns(4) + + with col1: + st.markdown(""" +
+
{}
+
Gesamt Artikel
+
+ """.format(len(all_articles)), unsafe_allow_html=True) + + with col2: + new_count = len([a for a in all_articles if a.get("status") == "New"]) + st.markdown(""" +
+
{}
+
Neue Artikel
+
+ """.format(new_count), unsafe_allow_html=True) + + with col3: + st.markdown(""" +
+
{}
+
RSS Feeds
+
+ """.format(len(feeds)), unsafe_allow_html=True) + + with col4: + online_count = len([a for a in all_articles if a.get("status") == "Online"]) + st.markdown(""" +
+
{}
+
Online
+
+ """.format(online_count), unsafe_allow_html=True) + + st.markdown("
", unsafe_allow_html=True) + + # Quick Actions + st.subheader("⚡ Schnellaktionen") + + col1, col2, col3 = st.columns(3) + + with col1: + if st.button("🔄 Alle Feeds aktualisieren", use_container_width=True): + with st.spinner("Feeds werden aktualisiert..."): + existing_ids = [a["id"] for a in all_articles] + process_articles(existing_ids) + show_notification("Feeds erfolgreich aktualisiert!") + time.sleep(1) + st.rerun() + + with col2: + if st.button("✍️ Artikel umschreiben", use_container_width=True): + rewrite_count = len([a for a in all_articles if a.get("status") == "Rewrite"]) + if rewrite_count > 0: + with st.spinner(f"{rewrite_count} Artikel werden umgeschrieben..."): + rewrite_articles() + show_notification(f"{rewrite_count} Artikel erfolgreich umgeschrieben!") + time.sleep(1) + st.rerun() + else: + show_notification("Keine Artikel zum Umschreiben gefunden.", "info") + + with col3: + if st.button("🧹 Aufräumen", use_container_width=True): + trash_count = len([a for a in all_articles if a.get("status") == "Trash"]) + if trash_count > 0: + show_notification(f"{trash_count} Artikel im Papierkorb gefunden.", "info") + else: + show_notification("Keine Artikel zum Aufräumen gefunden.", "info") + + # Neueste Artikel Preview + st.subheader("🕒 Neueste Artikel") + recent_articles = sorted(all_articles, key=lambda x: x.get("date", ""), reverse=True)[:5] + + for article in recent_articles: + st.markdown(f""" +
+
+
+ {article.get('title', 'Kein Titel')} +
+ {format_date(article.get('date', ''))} +
+
+ {get_status_badge(article.get('status', 'New'))} +
+
+
+ """, unsafe_allow_html=True) -selected_feed_label = st.selectbox("Feed-Auswahl", feed_options) - -if selected_feed_label != feed_options[0]: # nicht „Alle“ - selected_source = feed_map[selected_feed_label] - articles = [a for a in articles if a.get("source", "unidentified") == selected_source] - -# === Artikel-Tabelle === -if articles: - st.markdown("### 📄 Übersichtstabelle") - st.write("**Spaltenübersicht:** Auswahl | Datum | Titel | Zusammenfassung | Wörter | Tags | Status") - - for article in articles: +# === Artikel Tab === +with tab2: + st.header("📰 Artikel verwalten") + + # Filter Section + st.markdown('
', unsafe_allow_html=True) + st.subheader("🔍 Filter & Suche") + + col1, col2, col3 = st.columns(3) + + with col1: + status_options = ["Alle", "New", "Rewrite", "Process", "Online", "On Hold", "Trash"] + st.session_state.status_filter = st.selectbox( + "Status", + status_options, + index=status_options.index(st.session_state.status_filter) + ) + + with col2: + # Feed Filter + source_to_name = {f.get("url"): f.get("name", "Unbekannt") for f in feeds} + source_counter = Counter([a.get("source", "Unbekannt") for a in all_articles]) + + feed_options = ["Alle"] + feed_map = {"Alle": None} + + for source, count in source_counter.items(): + name = source_to_name.get(source, "Unbekannt") + label = f"{name} ({count})" + feed_options.append(label) + feed_map[label] = source + + selected_feed_label = st.selectbox("Feed", feed_options) + st.session_state.feed_filter = selected_feed_label + + with col3: + st.session_state.search_query = st.text_input( + "Suche", + value=st.session_state.search_query, + placeholder="Titel, Text oder Tags durchsuchen..." + ) + + st.markdown('
', unsafe_allow_html=True) + + # Filter anwenden + filtered_articles = all_articles + + # Status Filter + if st.session_state.status_filter != "Alle": + filtered_articles = [a for a in filtered_articles if a.get("status") == st.session_state.status_filter] + + # Feed Filter + if st.session_state.feed_filter != "Alle": + selected_source = feed_map[st.session_state.feed_filter] + filtered_articles = [a for a in filtered_articles if a.get("source") == selected_source] + + # Suche + if st.session_state.search_query: + query = st.session_state.search_query.lower() + filtered_articles = [ + a for a in filtered_articles + if query in a.get("title", "").lower() + or query in a.get("text", "").lower() + or any(query in tag.lower() for tag in a.get("tags", [])) + ] + + # Ergebnisse anzeigen + st.write(f"**{len(filtered_articles)} Artikel gefunden**") + + # Artikel Cards + for article in filtered_articles: has_incomplete_images = any( not all(k in img and img[k] for k in ("caption", "copyright", "copyright_url")) for img in article.get("images", []) ) - - cols = st.columns([0.05, 0.1, 0.2, 0.25, 0.05, 0.2, 0.15]) - with cols[0]: - st.checkbox("", key=f"select_{article['id']}") - with cols[1]: - date_str = article["date"] - if "GMT" in date_str or "+" in date_str: - date_str = datetime.strptime(date_str, "%a, %d %b %Y %H:%M:%S %z").strftime("%d.%m.%y") - else: - date_str = date_str[:10] - st.markdown(date_str) - with cols[2]: - title = f"**{article['title']}**" + + # Article Card + st.markdown('
', unsafe_allow_html=True) + + # Header + col1, col2 = st.columns([3, 1]) + + with col1: + title = article.get("title", "Kein Titel") if has_incomplete_images: title += " ⚠️" - st.markdown(title) - with cols[3]: - st.markdown(article.get("summary", "")[:150]) - with cols[4]: - st.markdown(str(len(article.get("text", "").split()))) - with cols[5]: - st.markdown(", ".join(article.get("tags", []))) - with cols[6]: + st.markdown(f"**{title}**") + st.markdown(f"📅 {format_date(article.get('date', ''))}") + + with col2: + st.markdown(get_status_badge(article.get("status", "New")), unsafe_allow_html=True) + + # Content Preview + summary = article.get("summary", "")[:200] + if len(summary) == 200: + summary += "..." + st.markdown(summary) + + # Meta Info + col1, col2, col3 = st.columns(3) + with col1: + st.markdown(f"📝 **{get_word_count(article.get('text', ''))} Wörter**") + with col2: + tags = article.get("tags", []) + if tags: + st.markdown(f"🏷️ {', '.join(tags[:3])}{'...' if len(tags) > 3 else ''}") + with col3: + source_name = source_to_name.get(article.get("source", ""), "Unbekannt") + st.markdown(f"📡 {source_name}") + + # Actions + col1, col2, col3, col4 = st.columns(4) + + with col1: + # Status ändern status_options = ["New", "Rewrite", "Process", "Online", "On Hold", "Trash"] current_status = article.get("status", "New") - new_status = st.selectbox("", status_options, index=status_options.index(current_status), key=f"status_{article['id']}") + new_status = st.selectbox( + "Status", + status_options, + index=status_options.index(current_status), + key=f"status_{article['id']}" + ) + if new_status != current_status: - article["status"] = new_status + # Artikel in der Liste finden und aktualisieren for idx, art in enumerate(all_articles): if art["id"] == article["id"]: - all_articles[idx] = article + all_articles[idx]["status"] = new_status break save_articles(all_articles) + show_notification(f"Status auf '{new_status}' geändert!") + time.sleep(0.5) st.rerun() - - with st.expander(f"🔍 {article['title']}"): - st.markdown("#### ✍️ Artikeltext") - st.code(f"{article['title']}\n\n{article['text']}\n\nQuelle: {article['link']}", language="markdown") - - st.markdown("#### 🌿 Tags") - st.code(", ".join(article.get("tags", [])), language="markdown") - - st.markdown("#### 🖼️ Bilder") - for i, img in enumerate(article.get("images", [])): - st.image(img["url"], caption=img.get("caption", "Kein Titel"), use_column_width=True) - - with st.form(f"edit_image_{article['id']}_{i}", clear_on_submit=False): - caption = st.text_input("Bildtitel", value=img.get("caption", "")) - copyright = st.text_input("Copyright", value=img.get("copyright", "")) - copyright_url = st.text_input("Quelle", value=img.get("copyright_url", "")) - if st.form_submit_button("Änderungen speichern"): - img["caption"] = caption or "Kein Bildtitel vorhanden" - img["copyright"] = copyright or "Unbekannt" - img["copyright_url"] = copyright_url or "#" - 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") - + + with col2: + if st.button("📋 Text kopieren", key=f"copy_{article['id']}"): + text_to_copy = f"{article['title']}\n\n{article['text']}\n\nQuelle: {article['link']}" + st.code(text_to_copy, language="markdown") + show_notification("Text bereit zum Kopieren!") + + with col3: + if st.button("🔗 Original öffnen", key=f"link_{article['id']}"): + st.markdown(f"[🔗 Artikel öffnen]({article.get('link', '#')})") + + with col4: + # Details anzeigen + if st.button("📖 Details", key=f"details_{article['id']}"): + st.session_state[f"show_details_{article['id']}"] = not st.session_state.get(f"show_details_{article['id']}", False) + + # Details Section (wenn erweitert) + if st.session_state.get(f"show_details_{article['id']}", False): + st.markdown("---") + + # Artikel Text + with st.expander("📝 Volltext", expanded=False): + st.code(article.get("text", ""), language="markdown") + + # Tags bearbeiten + with st.expander("🏷️ Tags bearbeiten", expanded=False): + current_tags = ", ".join(article.get("tags", [])) + new_tags = st.text_area("Tags (getrennt durch Komma)", value=current_tags, key=f"tags_{article['id']}") + + if st.button("Tags speichern", key=f"save_tags_{article['id']}"): + tag_list = [tag.strip() for tag in new_tags.split(",") if tag.strip()] + for idx, art in enumerate(all_articles): + if art["id"] == article["id"]: + all_articles[idx]["tags"] = tag_list + break + save_articles(all_articles) + show_notification("Tags gespeichert!") + st.rerun() + + # Bilder + if article.get("images"): + with st.expander("🖼️ Bilder verwalten", expanded=False): + for i, img in enumerate(article.get("images", [])): + col1, col2 = st.columns([1, 2]) + + with col1: + st.image(img["url"], width=200) + + with col2: + caption = st.text_input("Bildtitel", value=img.get("caption", ""), key=f"caption_{article['id']}_{i}") + copyright_text = st.text_input("Copyright", value=img.get("copyright", ""), key=f"copyright_{article['id']}_{i}") + copyright_url = st.text_input("Quelle URL", value=img.get("copyright_url", ""), key=f"copyright_url_{article['id']}_{i}") + + if st.button("Bilddaten speichern", key=f"save_img_{article['id']}_{i}"): + img["caption"] = caption or "Kein Bildtitel vorhanden" + img["copyright"] = copyright_text or "Unbekannt" + img["copyright_url"] = copyright_url or "#" + + for idx, art in enumerate(all_articles): + if art["id"] == article["id"]: + all_articles[idx] = article + break + save_articles(all_articles) + show_notification("Bilddaten gespeichert!") + st.rerun() + + # DALL-E Bildgenerierung 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.") + with st.spinner("Bild wird generiert..."): + 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) + show_notification("DALL·E-Bild erfolgreich hinzugefügt!") + st.rerun() + else: + show_notification("Fehler beim Erzeugen des Bildes.", "error") else: - st.info("Ein KI-generiertes Bild ist bereits vorhanden.") -else: - st.info("Keine Artikel für den gewählten Status gefunden.") + show_notification("Ein KI-generiertes Bild ist bereits vorhanden.", "info") + + st.markdown('
', unsafe_allow_html=True) + +# === Feeds Tab === +with tab3: + st.header("📡 RSS Feeds verwalten") + + # Feed hinzufügen + with st.expander("➕ Neuen Feed hinzufügen", expanded=False): + col1, col2 = st.columns(2) + + with col1: + new_url = st.text_input("Feed URL") + with col2: + new_name = st.text_input("Feed Name") + + if st.button("Feed hinzufügen", use_container_width=True): + if new_url and new_name: + if not any(f.get("url") == new_url for f in feeds): + feeds.append({"url": new_url, "name": new_name}) + save_feeds(feeds) + show_notification(f"Feed '{new_name}' hinzugefügt!") + st.rerun() + else: + show_notification("Dieser Feed existiert bereits.", "warning") + else: + show_notification("Bitte URL und Name eingeben.", "error") + + # Feeds anzeigen + for idx, feed in enumerate(feeds): + feed_url = feed.get("url", "") + feed_name = feed.get("name", "Unbekannt") + article_count = sum(1 for a in all_articles if a.get("source") == feed_url) + + st.markdown(f""" +
+
+
+ {feed_name} +
+ {feed_url} +
+ 📰 {article_count} Artikel +
+
+ {article_count} Artikel +
+
+
+ """, unsafe_allow_html=True) + + # Feed Actions + col1, col2, col3 = st.columns(3) + + with col1: + if st.button("✏️ Bearbeiten", key=f"edit_feed_{idx}"): + st.session_state[f"edit_feed_{idx}"] = not st.session_state.get(f"edit_feed_{idx}", False) + + with col2: + if st.button("🔄 Aktualisieren", key=f"refresh_feed_{idx}"): + with st.spinner("Feed wird aktualisiert..."): + existing_ids = [a["id"] for a in all_articles] + # Hier könntest du eine einzelne Feed-Update-Funktion implementieren + process_articles(existing_ids) + show_notification(f"Feed '{feed_name}' aktualisiert!") + st.rerun() + + with col3: + if st.button("🗑️ Löschen", key=f"delete_feed_{idx}"): + feeds.pop(idx) + save_feeds(feeds) + show_notification(f"Feed '{feed_name}' gelöscht!", "warning") + st.rerun() + + # Edit Form + if st.session_state.get(f"edit_feed_{idx}", False): + with st.form(f"edit_form_{idx}"): + new_feed_url = st.text_input("URL", value=feed_url) + new_feed_name = st.text_input("Name", value=feed_name) + + if st.form_submit_button("Änderungen speichern"): + feeds[idx]["url"] = new_feed_url + feeds[idx]["name"] = new_feed_name + save_feeds(feeds) + show_notification("Feed aktualisiert!") + st.session_state[f"edit_feed_{idx}"] = False + st.rerun() + +# === Bilder Tab === +with tab4: + st.header("🖼️ Bilderverwaltung") + + # Alle Bilder sammeln + all_images = [] + for article in all_articles: + for img in article.get("images", []): + img_data = img.copy() + img_data["article_title"] = article.get("title", "Unbekannt") + img_data["article_id"] = article.get("id") + all_images.append(img_data) + + if all_images: + st.write(f"**{len(all_images)} Bilder gefunden**") + + # Bilder in Spalten anzeigen + cols = st.columns(3) + for idx, img in enumerate(all_images): + with cols[idx % 3]: + st.image(img["url"], use_column_width=True) + st.markdown(f"**{img.get('caption', 'Kein Titel')}**") + st.markdown(f"📰 {img['article_title']}") + st.markdown(f"©️ {img.get('copyright', 'Unbekannt')}") + + if img.get("copyright_url") and img["copyright_url"] != "#": + st.markdown(f"[🔗 Quelle]({img['copyright_url']})") + else: + st.info("Keine Bilder gefunden.") + +# === Statistiken Tab === +with tab5: + st.header("📊 Detaillierte Statistiken") + + # Status Verteilung + status_counts = Counter([a.get("status", "New") for a in all_articles]) + + col1, col2 = st.columns(2) + + with col1: + st.subheader("📈 Status Verteilung") + for status, count in status_counts.items(): + percentage = (count / len(all_articles) * 100) if all_articles else 0 + st.markdown(f"{get_status_badge(status)} {count} ({percentage:.1f}%)", unsafe_allow_html=True) + + with col2: + st.subheader("📡 Artikel pro Feed") + feed_counts = Counter([source_to_name.get(a.get("source", ""), "Unbekannt") for a in all_articles]) + for feed_name, count in feed_counts.most_common(): + st.markdown(f"**{feed_name}:** {count} Artikel") + + # Weitere Statistiken + st.subheader("📝 Textstatistiken") + + word_counts = [get_word_count(a.get("text", "")) for a in all_articles] + if word_counts: + col1, col2, col3 = st.columns(3) + + with col1: + st.metric("Durchschnittliche Wortanzahl", f"{sum(word_counts) // len(word_counts)}") + + with col2: + st.metric("Längster Artikel", f"{max(word_counts)} Wörter") + + with col3: + st.metric("Kürzester Artikel", f"{min(word_counts)} Wörter") + + # Tag Cloud Simulation + st.subheader("🏷️ Häufigste Tags") + all_tags = [] + for article in all_articles: + all_tags.extend(article.get("tags", [])) + + if all_tags: + tag_counts = Counter(all_tags) + for tag, count in tag_counts.most_common(10): + st.markdown(f"**{tag}:** {count}x verwendet") + else: + st.info("Keine Tags gefunden.") \ No newline at end of file diff --git a/data/articles.json b/data/articles.json index 86ea8ac..0135109 100644 --- a/data/articles.json +++ b/data/articles.json @@ -176,7 +176,7 @@ "summary": "Zwei starke Charaktere für die Caravaning-Saison", "text": "Zwei Modelle, zwei Konzepte \u2013 und ein gemeinsamer Anspruch: Mit dem neuen Eriba Feeling und dem Eriba Novaline stellt Eriba zwei Neuheiten vor, die zukunftsf\u00e4higes, flexibles Reisen erm\u00f6glichen. Auf diesem gemeinsamen Weg bieten die beiden Neuheiten Antworten auf unterschiedliche Bed\u00fcrfnisse. \u201eMit dem neuen Eriba Feeling und Eriba Novaline haben wir eine neue Baureihe entwickelt, die in jeder Hinsicht neu durchdacht ist. Neben neuen Grundrissen und dem f\u00fcr Eriba typischen au\u00dfergew\u00f6hnlichen Design haben wir auch im Bereich der Funktionalit\u00e4t neue Ma\u00dfst\u00e4be gesetzt. Selbst in sehr kompakten Grundrissen finden sich Betten mit 2,10 m L\u00e4nge wieder. Hier hat das Entwicklungsteam einen erstklassigen Job gemacht\u201c, sagt Matthias Binder, Markenleitung bei Eriba. Eriba Feeling \u2013 f\u00fcr alle, die mehr mitnehmen wollen Der neue Eriba Feeling ist die perfekte Wahl f\u00fcr alle, die auf Reisen maximale Flexibilit\u00e4t und Raumkomfort suchen. Sein serienm\u00e4\u00dfiges Hubdach erm\u00f6glicht eine geringe Gesamth\u00f6he f\u00fcr bessere Aerodynamik und entspanntes Fahren, sorgt aber gleichzeitig f\u00fcr volle Stehh\u00f6he im Inneren. Wer mehr Platz zum Schlafen ben\u00f6tigt, kann den Feeling mit einem optionalen Schlafdach erweitern. Je nach Grundriss finden bis zu f\u00fcnf Personen Platz. Die intelligente Raumgestaltung kombiniert cleveren Stauraum mit multifunktionalen Sitzgruppen und durchdachten Details: Ein leistungsstarker Kompressork\u00fchlschrank, eine Eingangst\u00fcr mit integrierter Hakenleiste und Multifunktionsschienen sowie eine dimmbare, magnetisch befestigte Multifunktionsleuchte schaffen vielseitige Nutzungsm\u00f6glichkeiten und Komfort auf h\u00f6chstem Niveau. Der Eriba Feeling ist in Deutschland ab einem Grundpreis von 27.990 Euro erh\u00e4ltlich. Eriba Novaline \u2013 gro\u00dfz\u00fcgig, elegant und komfortabel Reisekomfort hat einen neuen Namen: Eriba Novaline. Frische Designs, durchdachte Grundrisse und eine Ausstattung auf h\u00f6chstem Niveau heben das Caravaning-Erlebnis auf die n\u00e4chste Stufe. Die durchg\u00e4ngige Stehh\u00f6he von 198 Zentimetern sorgt f\u00fcr ein offenes Raumgef\u00fchl, das in Kombination mit cleveren Grundrissen, bis zu f\u00fcnf Schlafpl\u00e4tzen und eleganten Sitzgruppen \u00fcberzeugt. Wer sein Reisevergn\u00fcgen noch weiter steigern m\u00f6chte, erg\u00e4nzt sein Modell um optionale Features wie eine Dachklimaanlage, ein hagelresistentes GFK-Dach oder ein voll integriertes Entertainmentsystem mit 22-Zoll-TV. Der Eriba Novaline ist in Deutschland ab einem Grundpreis von 29.490 Euro verf\u00fcgbar. Markentypisches Design au\u00dfen, wohnliches Ambiente innen Beide Modelle folgen der neuen Designsprache von Eriba: Klare Linien, moderne LED-Heckleuchten mit angedeutetem Bridge-Light und Glattblech in Carrara White oder optional Crystal Silver pr\u00e4gen das Exterieur. Im Inneren erwartet Reisende ein wohnliches Ambiente, das Funktion und Design vereint: Vier Stoffwelten \u2013 Seattle Stone, Asmara Cinnamon, Treviso Lake und Lulea Leaf \u2013 sowie das neue M\u00f6beldekor Biarritz in Holzoptik schaffen ein harmonisches Raumgef\u00fchl. Abgerundet wird das Interieur durch Marmor- und Betonoptiken in K\u00fcche und Bad, mattschwarze Armaturen und stoffbezogene Seitenw\u00e4nde. Die indirekt beleuchteten Dachstauschr\u00e4nke unterstreichen den hohen Anspruch an \u00c4sthetik und Wohnlichkeit. Digital und autark: Technik, die mitdenkt Sowohl der Eriba Feeling als auch der Eriba Novaline bieten zahlreiche technologische Highlights, die das Reisen entspannter machen, und lassen sich auf Wunsch mit digitalen und autarken Features ausstatten. Die serienm\u00e4\u00dfig integrierte Eriba Connect App erm\u00f6glicht eine intuitive \u00dcberwachung von Wasserstand und Batteriestatus via Smartphone. Wer unabh\u00e4ngig reisen m\u00f6chte, kann zwischen verschiedenen Autarkiepaketen mit Lithium- oder AGM-Batterie w\u00e4hlen. Serienm\u00e4\u00dfig sorgt die Truma Vario Heat Heizung mit digitalem Bedienpanel f\u00fcr wohlige W\u00e4rme an k\u00fchleren Tagen. Beide Modellreihen sind ab Juli 2025 im Handel verf\u00fcgbar. Mehr Infos auf www.eriba.com .", "tags": [], - "status": "On Hold", + "status": "Trash", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5928", "images": [ { @@ -531,7 +531,7 @@ "CARAVAN SALON", "Reisemobile" ], - "status": "Process", + "status": "Trash", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5926", "images": [ { @@ -704,7 +704,7 @@ "summary": "Auch 2025 gibt es viel Spannendes auf dem Campingplatz", "text": "Der Klaukenhof bietet die ganze Saison \u00fcber ein umfangreiches Angebot. Hier nun einige Highlights: 01. Mai 2025 - Maifest Das Maifest findet auf dem Vorplatz und im Biergarten statt. Das Fest ist die perfekte Gelegenheit, um den Fr\u00fchling zu begr\u00fc\u00dfen und um unter Campern ausgiebig zu fachsimpeln. Tauschen Sie mit anderen Campern die besten \u201eCamping-Hacks\u201d aus, um das Leben im Wohnwagen noch angenehmer zu machen und genie\u00dfen Sie nebenbei k\u00fchle Getr\u00e4nke unter der alten Eiche! Keine Anmeldung n\u00f6tig! 02. Mai 2025 - Clevere Camper nutzen Br\u00fcckentage Der 02.05.2025 ist ein Br\u00fcckentag! Geschickt genutzt wird daraus ein langes Wochenende in der Natur. Entspannen, Grillen mit Freunden und die frische Luft genie\u00dfen. Einfach online buchen \u00fcber https://campbuchung.de/anfrage/10180/ 29. Mai 2025 - Vatertag Am Vatertag gilt das Motto \u201ePapa, mach mal Pause!\u201d. Der Vorplatz und der Biergarten sind f\u00fcr alle V\u00e4ter reserviert, die ausgelassen feiern m\u00f6chten. Auf jeden Vater wartet ein k\u00fchles Bier und auf den Bollerwagen wartet ein schattiger Parkplatz. Lassen Sie es also krachen und feiern Sie gemeinsam mit anderen V\u00e4tern diesen besonderen Tag. Keine Anmeldung n\u00f6tig! 07. Dezember 2025 \u2013 Gef\u00fchrte Wanderung am Klaukenhof \u2013 Gemeinsam f\u00fcr den guten Zweck! Am 7. Dezember 2025 l\u00e4dt der Klaukenhof ab 10:00 Uhr zu einer gef\u00fchrten Wanderung ein. Alle Interessierten sind herzlich willkommen, die Natur zu genie\u00dfen und dabei Gutes zu tun. Die Veranstaltung dient dazu, Spenden f\u00fcr \u201eLichtblicke\u201c zu sammeln. Ein weiteres Highlight: Radio Vest wird die Wanderung begleiten und f\u00fcr spannende Einblicke sorgen. Seien Sie dabei und erleben Sie einen Tag voller Bewegung, Gemeinschaft und Unterst\u00fctzung f\u00fcr einen wertvollen Zweck. Anmeldung: info@freizeitpark-klaukenhof.de 31. Dezember 2025 - Silvester Wir verabschieden das Jahr mit einer gro\u00dfen Silvesterparty! Freuen Sie sich auf eine fr\u00f6hliche Veranstaltung mit tollem Essen und Sekt im Biergarten. Bitte beachten Sie, dass eine rechtzeitige Anmeldung erforderlich ist, um an der Feier teilzunehmen. Anmeldungen bei Jutta Hahn unter 02363-365037.", "tags": [], - "status": "On Hold", + "status": "Trash", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5922", "images": [ { @@ -3259,7 +3259,7 @@ "summary": "

Endlich wieder Zeit f\u00fcr Bulli-Treffen & Co! Entdecken Sie die besten Festivals und Events f\u00fcr Camper, Vanlife-Fans und Outdoor-Abenteurer in 2025.

", "text": "Vanlife- und Bus-Treffen 2025: Events f\u00fcr Bulli-Lover und Campervan-Fans + Messen Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt Vanlife- und Bus-Treffen 2025: Events f\u00fcr Bulli-Lover und Campervan-Fans + Messen Vanlife-Events im Juni bis November 2025 : Events f\u00fcr Bulli-Lover und Campervan-Fans Endlich wieder Zeit f\u00fcr Bulli-Treffen & Co! Entdecken Sie die besten Festivals und Events f\u00fcr Camper, Vanlife-Fans und Outdoor-Abenteurer in 2025. Timo Gro\u00dfhans Ver\u00f6ffentlicht am 06.06.2025 Foto: Heiko p. Wacker 5 Bilder Nach einem langen Winter kommen nun endlich wieder die gro\u00dfen Treffen und Festivals \u2013 und wer das Abenteuer auf vier R\u00e4dern liebt, sollte sich die folgenden Events keinesfalls entgehen lassen. Ob Bulli-Festival, Offroad-Messe oder Vanlife-Treffen: In den kommenden Monaten stehen zahlreiche spannende Veranstaltungen f\u00fcr Camper, Vanlife-Enthusiasten und Outdoor-Fans auf dem Programm. Hier sind die wichtigsten Termine, die das Jahr 2025 zu einem unvergesslichen Erlebnis machen werden. Juni 2025 Midsummer Bulli Festival Datum: 19.\u201322. Juni 2025 Ort: Fehmarn Beschreibung: Deutschlands gr\u00f6\u00dftes Bullifestival direkt am Meer mit Show & Shine, Beachcamp und Live-Musik. Website: https://www.midsummerfestival.de Abenteuer & Allrad Datum: 19.\u201322. Juni 2025 Ort: Bad Kissingen Beschreibung: Europas gr\u00f6\u00dfte Offroad- und Overlanding-Messe mit \u00fcber 350 Ausstellern. Website: https://www.abenteuer-allrad.de Queer Summer Camp Datum: 19.\u201322. Juni 2025 Ort: Simmerath, Eifel Beschreibung: Ein queeres Campingerlebnis mit Community-Feeling am Rursee. Website: https://www.queer-summer-camp.de Juli 2025 California Festival Mimizan Datum: 4.\u20136. Juli 2025 Ort: Mimizan, Frankreich Beschreibung: Ein entspanntes Treffen f\u00fcr Bulli- und Vanlife-Enthusiasten an der franz\u00f6sischen Atlantikk\u00fcste mit Musik und Strandaktivit\u00e4ten. Website: Infos pratiques californiafestival.fr Kastenwagentreffen Datum: 4.\u20136. Juli 2025 Ort: Bad D\u00fcrrheim Beschreibung: Ein Treffen f\u00fcr alle Kastenwagen-Fans mit Fokus auf Gemeinschaft und Erfahrungsaustausch. Website: https://www.kastenwagentreffen.de Caravan & Vanlife Meetup Datum: 11.\u201313. Juli 2025 Ort: Stuttgart, B\u00f6blingen Beschreibung: Ein Event f\u00fcr alle Camper mit Vortr\u00e4gen, Offroad-Parcours und Live-Musik. Website: https://www.overlandvanlifefestival.com/ovfstuttgart Adventure Southside Datum: 18.\u201320. Juli 2025 Ort: Friedrichshafen Beschreibung: Outdoor- und Offroad-Messe mit Workshops, Kinderprogramm und Camping-Areal. Website: https://adventuresouthside.com/ Swiss Vanlife Festival Datum: 25.\u201327. Juli 2025 Ort: Yverdon-les-Bains, Schweiz Beschreibung: Vanlife & Outdoor Festival mit Fokus auf Nachhaltigkeit, Camping und Abenteuer. Website: https://www.vanlife.ch Busfestival G\u00f6ppingen Datum: 25.\u201327. Juli 2025 Ort: G\u00f6ppingen Beschreibung: Ein Festival f\u00fcr Busliebhaber mit Musik und Vanlife-Atmosph\u00e4re. Website: https://www.bus-festival.de August 2025 VW Bus Festival Berlin Datum: 14.\u201317. August 2025 Ort: Zossen, Deutschland Beschreibung: Treffen f\u00fcr VW Bus Begeisterte mit vielf\u00e4ltigem Programm und Community-Austausch. Website: www.vwbus-festival.de Vanlife Ferropolis Datum: 21.\u201324. August 2025 Ort: Ferropolis, Gr\u00e4fenhainichen Beschreibung: Ein Festival auf einer Halbinsel mit Workshops, Live-Acts und Strandaktivit\u00e4ten. Website: https://www.vanlife-ferropolis.de September 2025 VW Bus Treffen Hannover Datum: 5.\u20137. September 2025 Ort: Altwarmb\u00fcchener See, Hannover Beschreibung: Traditionelles Bulli-Treffen mit Flohmarkt, Lagerfeuer und Camping. Bullis auf R\u00fcgen Datum: 11. \u2013 14. September 2025 Ort: Altenkirchen. Beschreibung: Das Familien-Bustreffen auf Deutschlands gr\u00f6\u00dfter Insel. Bullis auf R\u00fcgen \u2013 Das Familienbustreffen auf Deutschlands gr\u00f6\u00dfter Insel \u2013 Das Familien-Bustreffen auf Deutschlands gr\u00f6\u00dfter Insel bullisaufruegen.de Bulli Summer Festival Datum: 4.\u20137. September 2025 Ort: Wesel Beschreibung: Ein gro\u00dfes Treffen f\u00fcr Bulli-Fans mit Musik, Foodtrucks und Gemeinschaftsgef\u00fchl. Website: Bulli Summer Festival \u2013 Dein Bulli, Dein Sommer. Busfest Datum: 12.\u201314. September 2025 Ort: Malvern, England Beschreibung: Das weltweit gr\u00f6\u00dfte Treffen der VW-Bus-Freunde mit Show & Shine, Offroad-Wettbewerben und mehr. Website: https://www.busfest.org Adventure Northside Datum: 12.\u201315. September 2025 Ort: Gut Basthorst bei Hamburg Beschreibung: Messe f\u00fcr Offroad- und Vanlife-Enthusiasten mit Ausstellern und Vortr\u00e4gen. Website: adventurenorthside.de Vanlife Treffen Allg\u00e4u Datum: 18.\u201321. September 2025 Ort: Lechbruck am See Beschreibung: Ein Treffen f\u00fcr Vanlife-Fans in malerischer Umgebung mit Workshops und Gemeinschaftsaktivit\u00e4ten. Website: http://www.allgaeu-vans-treffen.de Oktober 2025 Caravan Live Datum: 2.\u20135. Oktober 2025 Ort: Freiburg Beschreibung: Messe f\u00fcr Caravaning und Vanlife mit Ausstellern und Vortr\u00e4gen. Website: https://www.caravanlive.de Caravan Salon Austria Datum: 15.\u201319. Oktober 2025 Ort: Wels, \u00d6sterreich Beschreibung: Internationale Messe f\u00fcr Caravaning und Camping. Website: https://www.caravan-wels.al Suisse Caravan Salon Datum: 23.\u201327. Oktober 2025 Ort: Bern, Schweiz Beschreibung: Schweizer Messe f\u00fcr Caravaning und Vanlife. Website: https://www.suissecaravansalon.ch November 2025 Caravan Bremen Datum: 7.\u201310. November 2025 Ort: Bremen Beschreibung: Messe f\u00fcr Caravaning, Camping und Vanlife in Norddeutschland. Website: https://www.caravan-bremen.de TC Touristik & Caravaning Datum: 19.\u201323. November 2025 Ort: Leipzig Beschreibung: Gro\u00dfe Messe f\u00fcr Touristik, Caravaning und Vanlife mit vielen Ausstellern und Live-Vortr\u00e4gen. Website: https://www.tc-messe.de Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", "tags": [], - "status": "New", + "status": "Trash", "link": "https://www.promobil.de/termine-veranstaltungen-juni-juli/", "images": [ { @@ -3363,7 +3363,7 @@ "summary": "

Einen Kriminalfall beim Camping? Braucht man nur in der Urlaubslekt\u00fcre. Wir zeigen nachr\u00fcstbare Ausr\u00fcstung, die Einbruch und Diebstahl erschwert.

", "text": "Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl? Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Zubeh\u00f6r Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl? Alles \u00fcber Gasf\u00fcllst\u00e4nde und Co Gas im Wohnmobil Schutz vor Einbruch und Diebstahl f\u00fcrs Wohnmobil : Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl? Einen Kriminalfall beim Camping? Braucht man nur in der Urlaubslekt\u00fcre. Wir zeigen nachr\u00fcstbare Ausr\u00fcstung, die Einbruch und Diebstahl erschwert. Sophia Pfisterer , Ingo K\u00f6cher Ver\u00f6ffentlicht am 21.05.2025 Foto: Fiamma 27 Bilder Der gr\u00f6\u00dfte Albtraum ist, wenn man von einem Ausflug auf den Parkplatz oder Stellplatz zur\u00fcckkommt und das Wohnmobil verschwunden ist oder Diebe das Campingfahrzeug aufgebrochen haben, alles durchw\u00fchlt ist und Wertgegenst\u00e4nde gestohlen sind. Neben dem unguten Gef\u00fchl, dass Fremde in den privaten Bereich eingedrungen sind, dem \u00c4rger \u00fcber die Sch\u00e4den und Verluste, bleibt die Sorge, dass sich dies jederzeit wiederholen k\u00f6nnte. 5 Verhaltens-Tipps zum Schutz vor Diebstahl und Einbruch Eine einfache, technische L\u00f6sung des Problems sind verschiedene Zubeh\u00f6rkomponenten wie Zusatz-Sicherungen, Schl\u00f6sser, Parkkrallen, Verriegelungen, GPS-Trackern und Alarmanlagen. Diese stellen wir weiter unten ausf\u00fchrlich vor. Gleichzeitig k\u00f6nnen einfache Verhaltensregeln das Risiko minimieren, dass im Wohnmobil eingebrochen wird bzw. dass es geklaut wird. Denn: Gelegenheit macht Diebe. Immer abschlie\u00dfen \u2013 auch bei kurzer Abwesenheit: Selbst beim schnellen Br\u00f6tchenholen: T\u00fcren, Fenster und Dachluken verriegeln. Wertgegenst\u00e4nde au\u00dfer Sicht verstauen: Keine Handys, Laptops oder Kameras sichtbar liegen lassen \u2013 Vorh\u00e4nge oder Sichtschutz nutzen. Stellplatz mit Bedacht w\u00e4hlen: Bevorzugt auf offiziellen Campingpl\u00e4tzen oder gut beleuchteten, belebten Stellfl\u00e4chen \u00fcbernachten. Nachbarschaftliche Aufmerksamkeit : Kontakt zu Nachbarn am Stellplatz halten \u2013 gegenseitiges Beobachten erh\u00f6ht die Sicherheit. Fahrzeugpapiere separat und sicher aufbewahren : Niemals die Zulassungsbescheinigung Teil I (Fahrzeugschein) im Wohnmobil lassen \u2013 sonst wird Diebstahl f\u00fcr Profis noch einfacher. Besser: Im Geldbeutel oder an einem sicheren Ort au\u00dferhalb des Fahrzeugs aufbewahren. Zus\u00e4tzliche Schl\u00f6sser f\u00fcr T\u00fcren und Klappen Um das Aufbrechen des Fahrzeugs von au\u00dfen zu verhindern, lassen sich Fahrerhaus-, Aufbau- und Garagent\u00fcr sowie Serviceklappen von au\u00dfen durch zus\u00e4tzliche Schl\u00f6sser sichern. Entsprechende Systeme bieten unter anderem Fiamma und Thule mit den sogenannten Security-Handgriffen. Die au\u00dfen neben der T\u00fcr montierten B\u00fcgel sind \u00fcber das T\u00fcrblatt schwenk- und verschlie\u00dfbar. Auf diese Weise wird das Aufbrechen der T\u00fcr deutlich erschwert. Praktisch: Im offenen Zustand fungieren die B\u00fcgel als Handlauf und erleichtern das Ein- und Aussteigen. Zus\u00e4tzliche Riegelschl\u00f6sser zur Au\u00dfenmontage haben unter anderem Heosolution mit dem Heosafe Riegelschloss und Thule mit Universal Lock und Door Frame Lock im Programm. Thule Security-Handgriffe sichern die Aufbaut\u00fcr zus\u00e4tzlich. Auch innen im Fahrzeug lassen sich T\u00fcren und Klappen zus\u00e4tzlich sichern. F\u00fcr die Fahrerhaust\u00fcren bietet Fiamma mit Duo-Safe Pro eine Alustange , deren Enden unterhalb des Fensters in den T\u00fcrrahmen gesteckt werden. Die teleskopierbare Stange l\u00e4sst sich von 119 auf 190 Zentimeter verl\u00e4ngern und verhindert das \u00d6ffnen der beiden T\u00fcren. Die gleiche Wirkung erzielt man mit einer Kette, die in am T\u00fcrrahmen montierte Metall\u00f6sen eingeh\u00e4ngt wird. Wiederum von Fiamma ist das Sicherheitsschloss Safe Door Guardian. Der Riegel des komplett aus Aluminium gefertigten Schlosses verriegelt bzw. \u00f6ffnet per Drehbewegung Fahrerhaus-, Aufbau-, Garagent\u00fcren und Serviceklappen von innen. T\u00fcren und Klappen sichern Fiamma Safe Door Magnum , ab 87 Euro [Link auf https://www.awin1.com/cread.php?awinmid=70949&awinaffid=893807&clickref=pro-22102643-sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase&ued=https%3A%2F%2Fwww.fritz-berger.de%2Fartikel%2Ffiamma-einstiegshilfe-buegel-security-und-tuersicherung-1971] Fiamma Einstiegshilfe- und Sicherungsb\u00fcgel Security , Preis ab 123 Euro Fiamma Duo Safe Pro Sicherheitsleiste , Preis ab 69 Euro [Link auf https://www.awin1.com/cread.php?awinmid=70949&awinaffid=893807&clickref=pro-22102643-sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase&ued=https%3A%2F%2Fwww.fritz-berger.de%2Fartikel%2Ffiamma-safe-door-guardian-innerer-sicherheitsblock-266765] Fiamma Safe Door Guardian Sicherheitsblock , Preis ab 77 Euro Heosolution Heosafe Riegelschloss , Preis ab 135 Euro Thule Universal Lock , Preis ab 101 Euro Fenster und Dachhauben verriegeln Spezielle L\u00f6sungen zur Sicherung vorgeh\u00e4ngter Fenster als auch Rahmen- und Schiebefenster bietet Womo-Sicherheit. Das System f\u00fcr Ausstellfenster besteht aus einem Metall-U-Profil, das die Unterkante der Scheibe verst\u00e4rkt. Im Innenraum werden am Fensterrahmen zwei verschlie\u00dfbare Gegenst\u00fccke montiert, die das Fenster rechts und links mit jeweils einer R\u00e4ndelschraube halten. F\u00fcr die Sicherung von Schiebefenstern im Fahrerhaus und Aufbau sowie f\u00fcr Dachluken sind zudem teleskopierbare Stangen im Programm. Benjamin K\u00f6bler-Linsner Fenster und Dachhauben sichern Womo-Sicherheit Ausstell- u. Rahmenfenstersicherung , Preis ab 99 Euro Womo-Sicherheit Dachhaubensicherung , Preis ab 83 Euro Wolfshund Schiebefenstersicherung , Preis ab 159 Euro Safe f\u00fcrs Wohnmobil Wertsachen im Fahrzeug sichert man am besten in einem Tresor . Ein Safe l\u00e4sst sich in Schr\u00e4nken und Staur\u00e4umen, im Doppelboden, als T\u00fcrtresor oder in den Fahrerhaussitzkonsolen einbauen. Tresore in unterschiedlichen Gr\u00f6\u00dfen liefern unter anderem Alko, Mobile-Safe, Milenco und Mobil. Wertsachen, Dokumente sicher lagern Alko Tresor , Preis ab 187 Euro Mobile-Safe Sitzkonsolensafe f\u00fcr Mercedes Sprinter , Preis ab 249Euro Mobile-Safe T\u00fcrsafe f\u00fcr Fiat Ducato , Preis 249 Euro Milenco Sitzsockelsafe f\u00fcr Iveco Daily , Preis ab 199 Euro Mobil-Safe Standard Safe mit Doppelbartschloss , Preis ab 125 Euro Wegfahrschutz f\u00fcrs Wohnmobil Automatische Wegfahrsperren verhindern unbefugtes Starten des Motors, indem sie die Z\u00fcndung oder Kraftstoffzufuhr elektronisch unterbrechen. Sie funktionieren meist \u00fcber einen Transponder-Schl\u00fcssel oder eine codierte Verbindung zwischen Schl\u00fcssel und Steuerger\u00e4t, die nur bei korrekter Erkennung den Motorstart erm\u00f6glicht. Damit sch\u00fctzen sie vor Diebstahl, indem sie den Startvorgang ohne autorisierten Schl\u00fcssel blockieren. F\u00fcr Camper bedeutet das mehr Sicherheit, besonders bei l\u00e4ngeren Standzeiten oder an unbekannten Orten. Ist eine Wegfahrsperre nicht automatisch im Fahrzeug eingebaut, l\u00e4sst sich der Camper mechanisch nachr\u00fcsten. Um das unbefugte Wegfahren des Wohnmobils zu verhindern, leisten Lenkrad-, Pedal- und Radkrallen sowie Pedal- und Ganghebelsperren gute Dienste. Wegfahrschutz Alca AutoSafe Pedal-Sperre , Preis ab 20 Euro Berger Radkralle , Preis ab 30 Euro Milenco BD Loc Pedalsperre f\u00fcr Fiat Ducato und Peugeot Boxer , Preis ab 150 Euro MEM Lenkradkralle f\u00fcr Lkw und Transporter , Preis ab 284 Euro Alarmanlagen und Bewegungsmelder Einbruchschutz bieten auch Alarmanlagen , die, an Fenstern, Dachhauben und T\u00fcren angebracht, bei gewaltsamem Aufhebeln ordentlich L\u00e4rm machen und je nach Modell eine Nachricht an eine angeschlossene Sicherheitszentrale oder das Smartphone senden. Die Ger\u00e4te sind zum Teil mit Bewegungsmelder und Trackingsystem ausgestattet. Solche Systeme bekommt man ab 55 Euro. Anbieter sind unter anderem Bosch, Carbest, Dometic, Milenco und Thitronik. Tipp: Eine abschreckende Wirkung f\u00fcr Gelegenheitsdiebe haben oft auch schon entsprechende Warnaufkleber an den Scheiben. Alarmanlagen und Bewegungsmelder Bosch Spexor , Preis ab 230 Euro Carbest Protect-On Camper 849 f\u00fcr Fiat Ducato , Preis ab 259 Euro Dometic Magic Safe MS 660 , Preis ab 63 Euro Milenco Autoalarm , Preis ab 147 Euro Thitronik Funk-Alarmanlage WiPro III safe.lock , Preis ab 399 Euro Trackingsysteme f\u00fcrs Fahrzeug Zudem lassen sich gestohlene Wohnmobile mit GPS-Trackingsystemen orten. Hierzu wird ein Sender versteckt im Fahrzeug eingebaut, der dann \u00fcber das Mobilfunknetz und GPS die Auffindung des Fahrzeugs erm\u00f6glicht. Anbieter sind unter anderem Blaupunkt mit BPT 1500+, Dethleffs mit Vehicle Defence, Mc Ortung mit SP2+Z und PAJ GPS mit Power Finder. Die Systeme laufen mit eigener Batterie oder Starterbatteriestrom. Wichtig zu wissen: F\u00fcr die Ortung des Fahrzeugs k\u00f6nnen weitere Kosten durch die Nutzung der integrierten SIM-Karte entstehen. Trackingsysteme CaraSave Alarmsystem mit GPS-Version , Preis ab 599 Euro Blaupunkt: BT 1500+ , Preis ab 179 Euro Dethleffs Vehicle Defence , Preis ab 269 Euro Mc Ortung SP 2+Z, Preis ab 236 Euro PAJ-GPS Power Finder, Preis ab 140 Euro YUKAtrack Ortungssystem easyWire GPS , ab 115 Euro Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Mehr zum Thema Gas Gaspr\u00fcfung f\u00fcr Campingfahrzeuge Pflicht ab 2025 Ohne Gasplakette droht Campern eine Strafe Tipps & Tricks Gasbetrieb im Wohnmobil und Wohnwagen K\u00fchlschrank w\u00e4hrend der Fahrt laufen lassen? Tipps & Tricks Vorteile von Gastanks im Wohnmobil Gastank oder Gasflasche - Was ist besser? Zubeh\u00f6r Mobile Satelliten-Antennen f\u00fcrs Camping Tragbare Sat-Anlagen f\u00fcr fast unbegrenzten Empfang Zubeh\u00f6r Gas im Wohnmobil und Wohnwagen Gasflaschen, Filter, F\u00fcllstandsanzeige und Co Themen Gaswarner im Wohnmobil So sch\u00fctze Sie sich vor unsichtbaren Gasen Zubeh\u00f6r Truma-Chef Wottrich im Interview Wird Gas beim Campen von Alternativen abgel\u00f6st? Zubeh\u00f6r Mehr anzeigen Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", "tags": [], - "status": "New", + "status": "Trash", "link": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/", "images": [ { @@ -3530,7 +3530,7 @@ "summary": "

Fiat verspricht, mit einem Software-Update die Probleme mit der Ducato 9-Gang-Automatik zu l\u00f6sen. Doch h\u00e4lt die Ma\u00dfnahme, was sie verspricht? Wir wollen es wissen und haben nach Ihren Erfahrungen gefragt.

", "text": "Sie sind gefragt! Was bringt das Softwareupdate f\u00fcr den Fiat Ducato? Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Wohnmobile Sie sind gefragt! Was bringt das Softwareupdate f\u00fcr den Fiat Ducato? Leserstimmen zum Update der 9-Gang-Automatik : Was bringt das Softwareupdate f\u00fcr den Ducato 8? Fiat verspricht, mit einem Software-Update die Probleme mit der Ducato 9-Gang-Automatik zu l\u00f6sen. Doch h\u00e4lt die Ma\u00dfnahme, was sie verspricht? Wir wollen es wissen und haben nach Ihren Erfahrungen gefragt. Samira Matschinsky Ver\u00f6ffentlicht am 20.02.2025 Foto: Kohstall 3 Bilder Im vergangenen Jahr h\u00e4uften sich Probleme mit der 2019 von Fiat neu eingef\u00fchrten 9-Gang-Automatik, vor allem bei Wohnmobilen, die die 3,5 Tonnen \u00fcberschritten. Es erreichten uns zahlreiche Berichte von Leserinnen und Lesern, die im Urlaub mit ihrem Wohnmobil von gelb und rot aufleuchtenden Getriebel\u00e4mpchen und der Motorkontrollleuchte \u00fcberrascht wurden. Nach einem Softwareupdate oder einem \u00d6lwechsel wurden viele Besitzerinnen und Besitzer mit ihren Wohnmobilen wieder nach Hause geschickt, bis sie, teilweise nur wenige Tage sp\u00e4ter, wieder vor den Toren der Werkstatt standen. Die finale Diagnose in vielen F\u00e4llen: Getriebeschaden . Hier geht es zu den Erfahrungen unserer Leserinnen und Leser. Sie sind gefragt! Was bringt das Software-Update? Die aktuellste Entwicklung ist nun ein Update der Steuerungssoftware von Motor und Getriebe, das k\u00fcnftig Probleme bzw. Defekte verhindern soll. Vorgesehen ist das Update f\u00fcr mit der 9-Gang-Wandlerautomatik ausgestattete Ducato-Modelle der Generation 8, die mit den 2,2-Liter-Motoren mit 160 und 180 PS best\u00fcckt sind. Die Fiat-Professional-Werkst\u00e4tten wurden Anfang November des letzten Jahres \u00fcber das Update informiert und haben entsprechende Instruktionen erhalten. promobil m\u00f6chte dieser L\u00f6sung nun auf den Zahn f\u00fchlen und hat Sie, liebe Leserinnen und Leser, nach ihren Erfahrungen gefragt. Die Erfahrungen unserer Leserinnen und Leser! Das neue Software-Update f\u00fcr die 9-Gang-Wandlerautomatik des Fiat Ducato soll k\u00fcnftig Getriebesch\u00e4den verhindern und das Zusammenspiel von Motor und Getriebe verbessern \u2013 doch wie sieht es in der Praxis aus? Noch Wochen nach unserem ersten Aufruf melden sich immer noch Leserinnen und Leser per Mail bei uns und berichten von ihren Erfahrungen mit der 9-Gang-Automatik. Nicht wenige dieser Zuschriften erz\u00e4hlen noch immer von Getriebesch\u00e4den und Werkstatt-Odyssee. Hier kam das Update zu sp\u00e4t. Doch die ersten Wohnmobile haben nun auch das Software-Update erhalten, welches k\u00fcnftig Probleme mit dem Getriebe der 9-Gangautomatik verhindern soll. Keine langen Wartezeiten f\u00fcr den Termin Bei etwas \u00fcber 50 Zuschriften zum Software-Update berichtet der \u00fcberwiegende Teil von positiven Erfahrungen. \"Nach einer Wartezeit von 2 Wochen konnten wir den Wagen abgeben und haben ihn innerhalb einer Woche wieder bekommen\", schreibt beispielsweise Andreas Neubert am 10.01.2025. Das Schaltverhalten sei seither \"definitiv besser, aber nicht optimal\". Martin D\u00f6ller bekam innerhalb einer Woche einen Termin. Die Aktion habe dann genau 45 Minuten gedauert. Seither merke er \"keinen Unterschied beim Fahren\". Auch Gerry Sch\u00f6newolf bekam innerhalb weniger Tage einen Termin f\u00fcr das Update. Was genau gemacht wurde, habe man ihm nicht gesagt. Insgesamt f\u00fchle sich das Update aber \"nicht schlecht an\". Er habe aber das Gef\u00fchl, dass das Wohnmobil im unteren Drehzahlbereich mehr Drehmoment habe und fr\u00fcher schalte. \"Allerdings habe ich auch den Eindruck, dass beim Beschleunigen oberhalb von 80\u201390 km/h etwas Leistung fehlt und das Fahrzeug dort tr\u00e4ger wirkt\" schildert Sch\u00f6newolf. Peter Neye bekam f\u00fcr seinen Roller Team innerhalb einer Woche einen Termin. Der sei auf 2 Stunden angesetzt gewesen. \"Da aber noch ein paar Kleinigkeiten gepr\u00fcft werden sollten, blieb das Fahrzeug \u00fcber Nacht\", schreibt er. \"Bei der Abholung wurde mir erkl\u00e4rt, was alles gemacht wurde. Das Personal war kompetent und freundlich. Ich werde mein Fahrzeug also wieder dort zum Service hinbringen\". Zum Fahrverhalten nach dem Update schreibt er: \"Das Fahr- und Schaltverhalten hat mich vor dem Update schon begeistert und ich muss zugeben, dass ich keine Ver\u00e4nderung nach dem Update feststellen konnte\". Dauer: 45 Minuten bis 2 Stunden So oder so \u00e4hnlich ergeht es auch zahlreichen anderen Lesern und Leserinnen. Meist verl\u00e4uft der Termin zwischen 45 Minuten und zwei Stunden. Wenn das Update im Rahmen anderer Ma\u00dfnahmen durchgef\u00fchrt wird, bleibt das Fahrzeug auch mal \u00fcber Nacht oder sogar die ganze Woche. Nicht jede Werkstatt kl\u00e4rt dabei den Kunden \u00fcber Sinn und Zweck des Updates auf. Einige wenige LeserInnen berichten auch davon, dass ihre Werkstatt von dem Update nichts gewusst hat oder sie sogar aufgefordert wurden, eine Geb\u00fchr f\u00fcr das eigentlich kostenlose Update zu zahlen. \u00dcber das Update informierte die Werkstatt bei Vorstellung Von ihrer Werkstatt oder ihrem H\u00e4ndler informiert worden sind ebenfalls die wenigsten. H\u00e4ufiger kam das Update im Rahmen einer \u00dcberpr\u00fcfung oder eines Servicetermins zur Sprache. Einige sprachen die Werkstatt auch auf das Update an, nachdem sie bei uns oder in einem Forum davon gelesen hatten. Die meisten bekamen dann jedoch schnell einen Termin. Fahrverhalten nach dem Update unauff\u00e4llig Mit der Getriebe-Problematik im Hinterkopf horchen Wohnmobil-Besitzer nach einem solchen Termin nat\u00fcrlich ganz genau in ihr Fahrzeug hinein. Dabei stellen die meisten nach dem Update jedoch keine bis eher geringe Unterschiede fest. Vereinzelte Kunden glauben eher eine Verbesserung im Fahrverhalten ersp\u00fcren zu k\u00f6nnen, insbesondere bei h\u00f6heren Geschwindigkeiten. In Einzelf\u00e4llen wird allerdings von verminderter Leistung, einem h\u00f6heren Verbrauch oder \u2013 in einem Fall \u2013 sogar von einem Getriebeschaden kurz nach dem Update berichtet. Dieser k\u00f6nnte aber nat\u00fcrlich auch bereits in den Grundz\u00fcgen bestanden haben, bevor das Update aufgespielt wurde. Zudem erw\u00e4hnen einzelne LeserInnen, dass sie bereits mehrere tausend Kilometer mit dem Update gefahren sind, ohne dass sich Probleme bemerkbar gemacht h\u00e4tten. Diese Berichte sind ermutigend, liefern jedoch noch keinen endg\u00fcltigen Beweis daf\u00fcr, dass das Update fl\u00e4chendeckend wirkt und das Risiko von Getriebesch\u00e4den signifikant reduziert. Weitere Leserstimmen zum Software-Update Schreitter J\u00fcrgen , am 10.01.2025, per Mail : \"Wir haben einen gebrauchten Malibu T 430 LE mit 180PS Automatik gekauft (20.500 km). Auch ich hatte im Vorfeld von der Problematik geh\u00f6rt, allerdings erst, als ich den Kaufvertrag bereits unterschrieben hatte. Als ich die FIN mitgeteilt bekam, habe ich mich bei Fiat registriert und mich dort vorab informiert. Dann hab ich mir einen sehr guten Fiat H\u00e4ndler in der Gegend gesucht und \u00fcber ihn meine FIN zur \u00dcberpr\u00fcfung geschickt. Fahrverhalten vor dem Update : Sehr unruhig und viel zu hohe Drehzahlen im 1.-2. Gang zu sp\u00fcren, selbst bei sanftem Gasfu\u00df. Ebenfalls kam ich auf der Autobahn selbst bei 120+ km/h nicht in den 9. Gang. Fahrverhalten nach dem Update : Ein absoluter Traum, Schaltvorg\u00e4nge sind nicht zu sp\u00fcren, selbst mein DSG 7 von VW Tiguan schaltet ruppiger. Verbrauch ca. 1,5-2 Liter geringer, 9. Gang bereits ab Tempo 95 km/h in Gebrauch und das nicht nur auf der Autobahn, sondern auch auf Landstra\u00dfen. Gef\u00fchlt zieht er kultivierter und angenehmer die Steigungen hoch.\" Oliver \u00d6hlenberg , am 24.01.2025, per Mail : \"Wir wurden leider nicht von Fiat bzw. B\u00fcrstner kontaktiert, sondern haben \u00fcber verschiedene Camper Foren bzw. der Presse von dem Update erfahren. Wir haben unseren FIAT H\u00e4ndler darauf angesprochen und dieser hat gesagt, das liege daran, dass B\u00fcrstner einen Kaufvertrag mit FIAT eingegangen ist und daher FIAT den eigentlichen Endkunden nicht kennt. Er hat auch gesagt, dass bei gr\u00f6\u00dferen Problemen mit dem Fahrzeug es eigentlich so sein sollte, dass der Endkunde eigentlich zum B\u00fcrstner H\u00e4ndler gehen muss, damit dieser dann das Fahrzeug an eine FIAT-Werkstatt bringen muss. Er hatte gerade mit dem Getriebe immer wieder den Fall, dass FIAT bei einem Getriebeaustausch ihm nur die Stunden bezahlt, welche man ben\u00f6tigt, um das Getriebe bei einem normalen Ducato zu tauschen. Der Zeitaufwand, gerade bei einem Vollintegrierten, ist aber wesentlich h\u00f6her. Die Differenz muss entweder der Endkunde zahlen, oder der Aufbauhersteller. Da es in K\u00f6ln nur noch einen FIAT Professional H\u00e4ndler gibt, welcher gro\u00dfe Wohnmobile (\u00fcber 6m) bearbeiten kann, mussten wir ca. 2 Monate auf einen Termin warten. 2 Tage dauerte dann das Update, da am eigentlichen Tag es ein Problem bei FIAT am Server gab und kein Update heruntergeladen werden konnte. Bis jetzt f\u00e4hrt das Fahrzeug wie vorher.\" Claus Bergmann , am 11.01.2025, per Mail : \"Wir fahren einen Malibu T460 Baujahr 03/2024. Wir haben 180PS mit der 9-Gang-Automatik (bislang 7.000 km ohne Probleme). Aufmerksam geworden sind wir zum einen \u00fcber die Carthago Gruppe in Facebook, zum anderen \u00fcber den Artikel in ihrer Zeitung. Ich bin im Oktober dann zu Fiat bez\u00fcglich eines Termines wegen des Updates und konnte 4 Wochen danach hinfahren. Den Termin hatte ich um 7.30 Uhr und rollte um 8.10 Uhr wieder vom Platz. Das lief alles sehr problemlos. Was ich schade fand, dass man mir nicht sagen konnte, was das Update macht. Der Inhaber sagte, sie h\u00e4tten eine Update-Nummer, mehr auch nicht. Das fand ich schon verwunderlich, dass diese Informationen nicht vorlagen. Sprich, ich wei\u00df bis heute nicht, was genau gemacht wurde. Ich bin bislang nicht viel gefahren, jedoch merkte ich, dass es fr\u00fcher schaltet und der 9. Gang schneller erreicht wird als fr\u00fcher. Bei ca. 100 km/h schaltet er in den neunten Gang, das war fr\u00fcher definitiv nicht der Fall.\" Jens Birkenk\u00f6tter , per Mail: \"Die Abwicklung war sehr gut. Termin vereinbart, zwei Wochen sp\u00e4ter das neue Software Update bekommen.\" So haben wir gefragt: Haben Sie das Update schon gemacht? Wurden Sie aktiv von Fiat kontaktiert oder haben Sie auf anderen Wegen von dem Update erfahren? Wie schnell haben Sie einen Termin f\u00fcr das Update erhalten? Wie lange dauerte der Werkstattbesuch? Haben Sie Ver\u00e4nderungen im Fahrverhalten Ihres Ducato festgestellt \u2013 vor und nach dem Update? Haben Sie vorher Probleme mit dem Getriebe erlebt, und wenn ja, welche? Wurden Sie \u00fcber den Update-Vorgang und dessen Ziele ausreichend informiert? Wie bewerten Sie den Service von Fiat Professional und den Ablauf der Aktion insgesamt? Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", "tags": [], - "status": "New", + "status": "Trash", "link": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/", "images": [ { @@ -3632,9 +3632,13 @@ "title": "Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das k\u00f6nnen Sie tun!", "date": "Sat, 23 Nov 2024 12:00:00 +0100", "summary": "

Die Versicherungspolicen f\u00fcr Wohnmobile werden 2025 deutlich teurer. Warum die Kosten steigen und wie Sie dennoch sparen k\u00f6nnen.

", - "text": "Preisschock f\u00fcr Wohnmobil-Besitzer: Warum Versicherungen 2025 teurer werden Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Weitere News Preisschock f\u00fcr Wohnmobil-Besitzer: Warum Versicherungen 2025 teurer werden Preisschock bei Wohnmobilversicherungen : Versicherung gestiegen? Das k\u00f6nnen Sie tun! Die Versicherungspolicen f\u00fcr Wohnmobile werden 2025 deutlich teurer. Warum die Kosten steigen und wie Sie dennoch sparen k\u00f6nnen. Samira Matschinsky Ver\u00f6ffentlicht am 23.11.2024 Foto: E+ 5 Bilder P\u00fcnktlich zum Ende des Versicherungsjahres flattern bei Wohnmobilbesitzern und -besitzerinnen die Briefe von HUK, Helvetia, RMV und Co. ins Haus. Und \u2013 Oh, Schreck! 2025 wird es teurer. Und zwar deutlich. Kolleginnen und Kollegen aus der Redaktion sowie vereinzelte Leserstimmen berichten von bis zu 60 % Preissteigerung ihrer Versicherungspr\u00e4mien , und auch das Internet ist voll der Klage. Doch warum ist das eigentlich so? Und was kann man tun, um die Mehrkosten abzumildern oder abzufangen? Sch\u00fctzen, was einem lieb und teuer ist \u2013 damit wirbt fast jede Versicherung. Im Falle eines Reisemobils, das oft einen nicht unbetr\u00e4chtlichen Wert darstellt, kommt der Versicherung eine wichtige Rolle zu \u2013 denn nur mit dem richtigen Schutz bleibt man im Schadensfall nicht im Regen stehen. Allzu oft muss man sich bei der Suche nach dem idealen Tarif jedoch durch einen Dschungel an Kleingedrucktem k\u00e4mpfen. In diesem Artikel beantwortet promobil die wichtigsten Fragen rund um die Reisemobil-Versicherung. So stark gehen die Versicherungen nach oben Ganz aktuell stellen sich die meisten Wohnmobilbesitzer und -besitzerinnen in Deutschland aber eine ganz andere Frage: \"Warum ist das pl\u00f6tzlich so viel teurer?\" Und das oft, obwohl die Schadensfreiheitsklasse ja steigt. Wir haben Beispiele aus dem Redaktionsumfeld gesammelt: Christian: \"Unser Dethleffs Trend (Baujahr 2015) h\u00e4tte zum neuen Jahr knapp 170 Euro mehr an Versicherung kosten sollen, also fast 30 % Steigerung. Nach einem Anruf bei der RMV/Kravag wurden mir 660 angeboten, nur noch 60 Euro mehr. Bei der Neueinstufung spielten mehrere Faktoren eine Rolle: Ich habe Schadensfreiheitsklasse 28, Vollkasko mit 1.000 Euro Selbstbeteiligung und Teilkasko mit 150 Euro SB. Das GFK-Dach hat noch einmal 20 % Rabatt eingebracht.\" Philipp: \"Meine Versicherung wird zum neuen Jahr fast 20 % teurer. Das Frustrierende daran ist, dass sich ja parallel meine SF verbessert hat, was eigentlich f\u00fcr einen sinkenden Preis sorgen sollte. Eine Neueinstufung lohnt sich f\u00fcr mich leider auch nicht. Das hat verschiedene Gr\u00fcnde, unter anderem, dass der gut ausgestattete Grand California einen hohen Neuwert hatte. Eine h\u00f6here Selbstbeteiligung w\u00e4re noch eine M\u00f6glichkeit, die Mehrkosten f\u00fcr den Moment abzufedern.\" Uli: \"Mein Makler hat mich k\u00fcrzlich kontaktiert. Meine Wohnmobilversicherung sollte 2025 um 60 % erh\u00f6ht werden, doch er hat von sich aus nach anderen M\u00f6glichkeiten geschaut und einen Wechsel vollzogen. Jetzt bin ich in etwa wieder bei meinem urspr\u00fcnglichen Tarif.\" Woher kommen die Preissteigerungen? Als Grund f\u00fcr die Teuerungen kommen auf der Makroebene verschiedene, wirtschalftliche Faktoren ins Spiel: gestiegene Reparaturkosten und Kosten f\u00fcr Ersatzteile, hohe Schadensquoten aus den vergangenen Jahren und inflationsbedingte Kostensteigerungen. Durch die drastischen Anpassungen versuchen Versicherer diese Verluste auszugleichen, was insbesondere Wohnmobilhalter trifft, da diese Fahrzeuge oft h\u00f6here Schadenskosten verursachen als Pkws. Diese Erh\u00f6hungen werden auf verschiedenen Wegen eingef\u00fchrt. In den Briefen der Versicherer werden unter anderem sogenannte Regional- und Typenklassen aufgef\u00fchrt. Diese Klassen erm\u00f6glichen Versicherern eine differenzierte Risikobewertung und tragen dazu bei, die Pr\u00e4mien individuell an bestimmte Risikoprofile anzupassen. Regionalklassen bewerten das Risiko, das mit dem Wohnort des Fahrzeughalters verbunden ist. Faktoren wie Unfallh\u00e4ufigkeit, Diebstahlquote oder das Wetterrisiko (z. B. Hagel- und Sturmgefahr) flie\u00dfen in diese Bewertung ein. Typenklassen ber\u00fccksichtigen das Schadens- und Reparaturrisiko eines bestimmten Fahrzeugs. F\u00fcr Wohnmobile spielen hier Faktoren wie die Bauart, technische Ausstattung, Reparaturkosten und die Schadenh\u00e4ufigkeit dieses Typs eine Rolle. Versicherer nutzen au\u00dferdem vermehrt neue, datenbasierte Tarifierungsmodelle , die detaillierte Faktoren wie Fahrverhalten oder Nutzungsintensit\u00e4t ber\u00fccksichtigen. Dies kann bedeuten, dass bestimmte Nutzergruppen, etwa Vielfahrer oder Wohnmobile mit hohem Risiko f\u00fcr Naturgefahren, st\u00e4rker belastet werden, auch wenn ihre Klasseneinstufung unver\u00e4ndert bleibt. 7 Tipps, um bei der Versicherung Kosten zu sparen Erste Ma\u00dfnahmen, die Sie ergreifen k\u00f6nnen, um eine Preissteigerung Ihrer Womo-Versicherungspr\u00e4mie abzumildern, klangen bereits mit. Rufen Sie Ihren Versicherer an. In dem einen oder anderen Fall f\u00fchrte das schon zu einer weniger saftigen Erh\u00f6hung im neuen Jahr. Auch der Wechsel zu einem Maklerb\u00fcro kann sich lohnen, da diese noch einmal ganz andere M\u00f6glichkeiten haben mit den Versicherern zu verhandeln. Doch welche Ma\u00dfnahmen kann man noch ergreifen, wenn der Anruf nicht gen\u00fcgt? Vergleichen Sie aktiv verschiedene Anbieter : Selbst bei einer allgemeinen Erh\u00f6hung gibt es deutliche Unterschiede zwischen den Versicherungen. Plattformen wie Verivox oder Check24 sowie spezialisierte Anbieter wie der ADAC oder RMV k\u00f6nnen helfen, einen \u00dcberblick zu erhalten. Pr\u00fcfen Sie dabei immer den Leistungsumfang. Selbstbeteiligung erh\u00f6hen : Eine h\u00f6here Selbstbeteiligung kann den Beitrag sp\u00fcrbar senken, ist aber nur sinnvoll, wenn Sie in der Lage sind, kleinere Sch\u00e4den selbst zu tragen. Leistungsumfang pr\u00fcfen : Verzichten Sie auf unn\u00f6tige Zusatzleistungen, die f\u00fcr Ihre Nutzung unwichtig sind, wie z. B. Camping-Inhaltsschutz, falls Sie diesen nicht ben\u00f6tigen. Risikofaktoren minimieren : Wenn m\u00f6glich, sollten Sie das Fahrzeug an einem sicheren Standort wie einer Garage abstellen, da dies positiv auf die Pr\u00e4mie wirken kann. Betreuung durch Makler : Ein Versicherungsmakler kann helfen, gezielt passende Angebote zu finden und die Vertragsbedingungen zu optimieren. Manche Versicherer bieten Rabatte, die direkt nur \u00fcber Makler verf\u00fcgbar sind. Au\u00dferdem sucht ein guter Versicherungsmakler proaktiv nach besseren Angeboten wenn eine unverh\u00e4ltnism\u00e4\u00dfige Beitragserh\u00f6hung kommt. Neueinstufung : \u00dcberpr\u00fcfen Sie, ob eine Neueinstufung sich lohnen kann. Manchmal profitiert man dann unter anderem von Neukunden-Rabatten der eigenen Versicherung und auch Faktoren wie ein GFK-Dach oder eine besser gesch\u00fctzter Standort k\u00f6nnen dann neuerlich ber\u00fccksichtigt werden. Eine Neueinstufung kann aber auch teurer ausfallen als der urspr\u00fcngliche Tarif. Wechsel zur Wechselsaison : Viele Versicherer bieten zum Jahresende spezielle Konditionen f\u00fcr Neukunden. Nutzen Sie diese Phase, um bessere Tarife zu sichern. Stichtag ist 2024 der 2.12 , da der 30.11. auf einen Samstag f\u00e4llt. Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", - "tags": [], - "status": "New", + "text": "Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das k\u00f6nnen Sie tun!\n\nWohnmobilbesitzer erleben 2025 einen Preisschock: Versicherungspolicen f\u00fcr Wohnmobile werden deutlich teurer. Im Allgemeinen berichten Camper von Preiserh\u00f6hungen um bis zu 60 % f\u00fcr ihre Versicherungspr\u00e4mien. Ausl\u00f6ser sind gestiegene Reparatur- und Ersatzteilkosten, hohe Schadensquoten aus den letzten Jahren und Inflation.\n\nVersicherungsunternehmen f\u00fchren diese Preiserh\u00f6hungen durch, um Verluste auszugleichen und ihre Risiken anzupassen. So werten Regional- und Typenklassen das Risiko des Wohnortes des Halters sowie das Schaden-und Reparaturrisiko eines bestimmten Fahrzeugtyps. Weiterhin tragen datenbasierte Tarifmodelle, die u.a. das Fahrverhalten oder die Nutzungsh\u00e4ufigkeit des Wohnmobils ber\u00fccksichtigen, zur Erh\u00f6hung bei. \n\nTrotzdem gibt es M\u00f6glichkeiten, die erh\u00f6hten Kosten zu kompensieren, z. B. durch den Vergleich verschiedener Anbieter, die Erh\u00f6hung der Selbstbeteiligung, die Pr\u00fcfung des Leistungsumfangs, die Minimierung von Risikofaktoren, die Betreuung durch Makler, eine Neueinstufung oder den Wechsel w\u00e4hrend der Wechselsaison. \n\nJe nachdem k\u00f6nnte es sich lohnen, einen Versicherer anzurufen oder zu einem Maklerb\u00fcro zu wechseln, der bessere M\u00f6glichkeiten zur Verhandlung mit den Versicherern hat.", + "tags": [ + "1. \"Versicherungserh\u00f6hung 2025\"", + "2. \"Wohnmobilversicherung\"", + "3. \"Kosten sparen bei Versicherungen\"" + ], + "status": "Online", "link": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/", "images": [ { @@ -3727,6 +3731,13 @@ "caption": "Social Icon Twitter", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" + }, + { + "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-yKWdGDCQJZBOCQ4V4HoD40A0.png?st=2025-07-28T06%3A27%3A26Z&se=2025-07-28T08%3A27%3A26Z&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-27T22%3A07%3A39Z&ske=2025-07-28T22%3A07%3A39Z&sks=b&skv=2024-08-04&sig=HUMRhg2FbaKnLil%2BMbyvNemVeBcrvTODpctkfQyFHPc%3D", + "alt": "KI-generiertes Titelbild zu: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das k\u00f6nnen Sie tun!", + "caption": "KI-generiertes Titelbild zu: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das k\u00f6nnen Sie tun!", + "copyright": "OpenAI DALL\u00b7E", + "copyright_url": "https://openai.com/dall-e" } ], "source": "https://www.promobil.de/rss/news" @@ -3736,9 +3747,13 @@ "title": "Camper-Radio\u200b Caravan.fm : Radiosender speziell f\u00fcr Camping-Fans", "date": "Mon, 02 Oct 2023 16:00:00 +0200", "summary": "

Welcher Radiosender l\u00e4uft bei Ihnen im Reisemobil oder Campingbus? Seit Juli 2023 gibt es einen Radiosender speziell f\u00fcr Camperinnen und Camper.

", - "text": "Camper-Radio caravan.fm\u200b: Radiosender f\u00fcr Camping-Fans Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Camper-Radio caravan.fm\u200b: Radiosender f\u00fcr Camping-Fans Camper-Radio\u200b Caravan.fm : Radiosender speziell f\u00fcr Camping-Fans Welcher Radiosender l\u00e4uft bei Ihnen im Reisemobil oder Campingbus? Seit Juli 2023 gibt es einen Radiosender speziell f\u00fcr Camperinnen und Camper. Ver\u00f6ffentlicht am 02.10.2023 Foto: 375441151 Auf Caravan.fm l\u00e4uft abwechslungsreiche Mainstream-Musik f\u00fcr entspanntes Reisen, dazu st\u00fcndlich Kurznachrichten und europaweites Reisewetter. Ins Leben gerufen wurde der Sender, der sein Programm rund um die Uhr ausstrahlt, von Radio Hamburg. Das hei\u00dft nicht, dass man nur in und um Hamburg herum den Radiosender f\u00fcr Campingfans h\u00f6ren kann. Aktuell kann er als Stream \u00fcber die Webadresse www.caravan.fm und \u00fcber die Caravan.fm-App geh\u00f6rt werden. Laut den Verantwortlichen ist sogar ein Empfang \u00fcber DAB+ geplant. Das Programm von Caravan.fm Themen im Programm sind das Camping \u2013 egal ob im Wohnmobil, Campervan, Wohnwagen oder Zelt. Das Motto des Senders lautet: \"Im Hotel sind wir G\u00e4ste, auf dem Campingplatz zuhause.\" Linn MacKenzie (37) ist Moderatorin und Redaktionsleiterin von CARAVAN.fm: \"Ich liebe die Langsamkeit beim Campen, die totale Entschleunigung. Genau dieses Gef\u00fchl von Ruhe und Leidenschaft m\u00f6chten wir vermitteln. Wir machen das erste Radioprogramm in Deutschland speziell f\u00fcr Camper, um ihnen das perfekte musikalische Begleitprogramm f\u00fcr ihre Campingabenteuer zu bieten.\" Das t\u00e4gliche Programm gliedert sich derzeit in folgende Sendestrecken \"CARAVAN.fm-Br\u00f6tchenshow\" Mo-So von 7-11 Uhr \"CARAVAN.fm-Mittagspause\" Mo-So von 11-15 Uhr \"CARAVAN.fm-Happy Hours\" Mo-So von 17-20 Uhr von 20-7 Uhr Musik nonstop Freitag und Samstag von 20 bis 21 Uhr steht das \"CARAVAN.fm-Lagerfeuer\" auf dem Programm. Passend zum Thema Lagerfeuer-Romantik spielt der Sender eine Stunde lang stimmungsvolle Indie- und Akustiksongs. Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", - "tags": [], - "status": "New", + "text": "Camper-Radio\u200b Caravan.fm : Radiosender speziell f\u00fcr Camping-Fans\n\nCaravan.fm ist ein neuer Radiosender exklusiv f\u00fcr Camping-Fans. Dieser Sender, der im Juli 2023 startete, sendet rund um die Uhr ein programm, das auf die Bed\u00fcrfnisse von Campern abgestimmt ist. Neben Mainstream-Musik bietet der Sender Kurznachrichten und europaweites Reisewetter. Zudem behandelt das Programm verschiedene Themen rund um das Camping. Caravan.fm, initiiert von Radio Hamburg, kann weltweit per Stream \u00fcber die Webadresse www.caravan.fm und \u00fcber die dazugeh\u00f6rige App empfangen werden. Zuk\u00fcnftig soll der Sender auch \u00fcber DAB+ empfangbar sein. \n\nDas t\u00e4gliche Programm umfasst die \"CARAVAN.fm-Br\u00f6tchenshow\" am Morgen, die \"CARAVAN.fm-Mittagspause\" und die \"CARAVAN.fm-Happy Hours\" am Abend. Nachts gibt es ununterbrochen Musik. Zudem bietet der Sender freitags und samstags eine Sendung mit dem Namen \"CARAVAN.fm-Lagerfeuer\", bei der stimmungsvolle Indie- und Akustiksongs passend zur Lagerfeuer-Romantik gespielt werden. \n\nDie Redaktionsleiterin des Senders, Linn MacKenzie, sieht in ihrem Job die M\u00f6glichkeit, das Gef\u00fchl von Ruhe und Leidenschaft, das sie beim Campen empfindet, an die Zuh\u00f6rer weiterzugeben und somit das perfekte musikalische Begleitprogramm f\u00fcr ihre Campingabenteuer zu bieten.", + "tags": [ + "1. Camping-Radio", + "2. Caravan.fm", + "3. Outdoor-Unterhaltung" + ], + "status": "Online", "link": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/", "images": [ { @@ -3834,5 +3849,2619 @@ } ], "source": "https://www.promobil.de/rss/news" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/", + "title": "Film-Stunt mit Caravan \u2013 wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen", + "date": "Thu, 24 Jul 2025 18:00:00 +0200", + "summary": "

F\u00fcr die Serie \"Countdown\" risikiert Schauspieler Jensen Ackles einen waghalsigen Stunt. Warum Sie das nicht nachmachen sollten.

", + "text": "Jensen Ackles d\u00fcrfte sp\u00e4testens seit seiner Rolle als Soldier Boy in der Amazon-Prime-Serie \"The Boys\" ein Begriff sein. Zum Staffelstart haben sein blanker Hintern und die enormen Views am ersten Tag mal kurz den Streamingdienst zum Erliegen gebracht. Hartgesottene Fans kennen ihn noch aus seiner Rolle als Dean Winchester in der Serie Supernatural. Stunt mit Wohnwagen Momentan l\u00e4uft er mit seiner neuen Serie \"Countdown\" auf Amazon Prime, in der unter anderem Schauspieler Eric Dane mitspielt (bekannt aus Grey's Anatomy). In dieser Serie wagt er in Folge sechs einen verr\u00fcckten Stunt auf einem Wohnwagen. Die Verfolgung eines Verd\u00e4chtigen f\u00fchrt die Taskforce, der Jensen Ackles Charakter Mark Meachum angeh\u00f6rt, zu einem Trailerpark in der W\u00fcste Kaliforniens. Bei der \u00dcberpr\u00fcfung eines Wohnwagens setzt sich dieser pl\u00f6tzlich in Bewegung. Jensen Ackles, im Inneren des Caravans gefangen, wagt w\u00e4hrend der Fahrt ein riskantes Man\u00f6ver, um vom Wohnwagen auf das Zugfahrzeug zu gelangen. Nat\u00fcrlich erh\u00e4lt der Schauspieler dabei Unterst\u00fctzung von einem Stuntdouble. Die Szenen zeigen dabei auf, wie gef\u00e4hrlich es w\u00e4re, wenn jemand sich w\u00e4hrend der Fahrt im Inneren eines Wohnwagens aufhalten w\u00fcrde. Nat\u00fcrlich ist die rasante Verfolgung mit dem Wohnwagen-Gespann in der Serie ein \u00fcbertriebenes Beispiel. Im wahren Leben w\u00fcrden leichte Kurven ausreichen, um Insassen und lose Gegenst\u00e4nde durch den Innenraum fliegen zu lassen. Vor allem, da vom Wohnwagen aus nicht ersichtlich ist, in welche Richtung das Zugfahrzeug f\u00e4hrt, anders als im Wohnmobil. Riskante Fahrman\u00f6ver mit Wohnwagen Dass nicht nur der Stunt riskant ist, sondern auch die wilde Fahrt mit dem Gespann, kann wohl jeder Wohnwagen-Fahrende verstehen. Wohnwagen angeh\u00e4ngt am Pkw k\u00f6nnen \u00e4hnlich einem Pendel schnell unkontrolliert von einer zur anderen Seite schwenken. Schnell schaukelt sich das Gespann so auf, bis der Wohnwagen kippt. Solche Unf\u00e4lle passieren regelm\u00e4\u00dfig auf der Autobahn. Drei einfache Tipps helfen gegen Pendeln Gewichte richtig verteilen : M\u00f6glichst tief und unter Einhaltung der St\u00fctzlast nahe der Achse packen. Gewicht reduzieren : Schwere Gegenst\u00e4nde besser in den Zugwagen packen. Fahrgeschwindigkeit anpassen . In der Serie Countdown ist nat\u00fcrlich alles nur Show. In der Realit\u00e4t sollten Sie Ihre Fahrweise stets an die Umgebung anpassen. Au\u00dferdem sind auf deutschen Autobahnen ohnehin maximal 100 km/h mit dem Gespann erlaubt. Wohnwagen als Nebenrollen in weiteren Serien Jensen Ackles liefert \u00fcbrigens eine weitere Verbindung zu Wohnwagen in Serien. In seiner Rolle als Beau Arlen spielte er den Sheriff in der Serie \"Big Skys\", der in einem Airstream wohnte. Einen solchen bewohnt auch sein Serien-Bruder Colter Shaw (Justin Hartley) in der Serie Tracker (Disney+).", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://www.promobil.de/_next/static/img/logos/car.svg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2224948.jpg", + "alt": "Jensen Ackles Wohnwagen Stunt", + "caption": "Jensen Ackles Wohnwagen Stunt", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/", + "title": "CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping \u2013 die beste Kombi?", + "date": "Tue, 22 Jul 2025 14:10:00 +0200", + "summary": "

Gravelbikes und Camping: die perfekte Symbiose aus Freizeitsport, Abenteuergeist und Komfortbed\u00fcrfnis. Warum diese beiden so gut zusammenpassen und welche Hindernisse es zu \u00fcberkommen gilt, lesen und h\u00f6ren Sie hier.

", + "text": "Wer bei uns auf promobil.de unterwegs ist, wird bereits verstanden haben, dass Camping f\u00fcr uns die ultimative Urlaubsform ist. Vielleicht teilen Sie dieses Hobby sogar und k\u00f6nnen ebenso leidenschaftliche Pl\u00e4doyers f\u00fcr oder gegen private B\u00e4der auf Campingpl\u00e4tzen halten, wie unsere Redakteurinnen und Redakteure. Oder Sie schnuppern gerade frisch die erste Campingluft. Dann garantieren wir Ihnen: Camping wird Sie nie wieder loslassen . Doch wie steht es eigentlich um die sportlichen Hobbys der CamperInnen? Jeder kennt das Klischee des Campers , der in Flipflops und Badehose vor seinem Wohnmobil oder Wohnwagen im Liegestuhl liegt. Meist mit einer ordentlichen Plauze und einem beginnenden Sonnenbrand. Doch ist dieses Bild nicht vielleicht genau das: ein Klischee? Schauen wir uns auf den Stra\u00dfen um, hat inzwischen jeder dritte Camper die Fahrr\u00e4der dabei: am Heck, im Heck, auf der Deichsel oder dem Dach des Zugwagens. Sie sind das zweitliebste Fortbewegungsmittel der CamperInnen. Um hier gleich ein weiteres Klischee vorzubeugen: Nicht jeder Campende ist dabei mit Tiefeinsteiger-Rahmen und E-Motor am Zweirad unterwegs \u2013 auch wenn daran nat\u00fcrlich nichts Falsches zu finden ist. Im Jahr 2024 verkaufte der Fachhandel in Deutschland insgesamt 3,85 Millionen Fahrr\u00e4der , davon 53 Prozent Elektrofahrr\u00e4der (Quelle: ADFC). Elektrische Mountainbikes sind dabei immer noch der absolute Spitzenreiter, doch der Trend (vor allem in den St\u00e4dten) geht zum Gravelbike oder sogar Rennrad . Wer etwas auf sich und sein Image h\u00e4lt, hat so ein sportliches, schlankes Fahrrad mit gebogenem Lenker zumindest im Keller stehen. Und so stellen wir uns die Frage: Geh\u00f6rt ein Gravelbike bald in jede Heckgarage? Da wir Camping-ExpertInnen sind, die sich eher mit den Klischees \u00fcber Camping auseinandersetzen, haben wir uns f\u00fcr ein paar Antworten Felix und Moritz vom Podcast \"Faszination Rennrad\" eingeladen. Die beiden sollten uns erkl\u00e4ren, was es mit dem Trendsport bzw. dem Trend-Rad auf sich hat und warum wir unbedingt Teil des Trends sein sollten. Im Gegenzug beantworten wir den beiden ihre Fragen zum Thema Camping. Hier geht es zur Podcastfolge auf Spotify und hier k\u00f6nnen Sie direkt reinh\u00f6ren: Unsere Erkenntnisse: 7 Fragen, 7 Antworten Wir haben in diesem Podcast einige sehr grundlegende Fragen gestellt, die uns besch\u00e4ftigt haben. Hier haben wir sieben Fragen und deren Antworten kurz zusammengefasst: Warum sehen Rennrads\u00e4ttel so unbequem aus \u2013 und was bringen die \"Windelhosen\" wirklich? Rennrads\u00e4ttel sind so geformt, dass sie die Sitzposition des Fahrers unterst\u00fctzen und die Belastung optimieren. Die speziellen Radhosen verhindern Druckstellen und erh\u00f6hen den Komfort bei langen Fahrten. Was kostet der Einstieg ins Gravelbiken \u2013 und ab wann macht\u2019s wirklich Spa\u00df? Ein gutes Gravelbike startet bei etwa 1.000 Euro, f\u00fcr den optimalen Fahrspa\u00df empfiehlt sich ein Budget von 3.000 bis 5.000 Euro. Hier bekommst du ein leichteres Rad mit besserer Ausstattung und Komfort. Wie viele Kilometer f\u00e4hrt man am Anfang \u2013 und geh\u00f6ren H\u00f6henmeter gleich dazu? Einsteiger k\u00f6nnen mit 20-30 km beginnen und die Strecke langsam steigern. Wenn man sich fit f\u00fchlt, k\u00f6nnen ein paar H\u00f6henmeter hinzukommen, aber es geht zuerst um die Distanz. Was mache ich eigentlich drei Stunden lang im Sattel \u2013 au\u00dfer treten? Neben dem Treten kann man Musik h\u00f6ren, Podcasts genie\u00dfen oder sich einfach in der Umgebung verlieren. Der Fokus liegt auf der Bewegung und dem Naturerlebnis, obwohl es manchmal anstrengend wird. Gibt es Gravelbike-Strecken abseits von Stra\u00dfen und Verkehr? Ja, viele Gravelbike-Strecken f\u00fchren \u00fcber unbefestigte Wege wie Waldautobahnen, Wirtschaftswege und Feldwege, die einen gro\u00dfartigen Mix aus Abenteuer und Natur bieten. Was soll dieser gebogene Lenker am Rennrad \u2013 und wo greift man da \u00fcberhaupt hin? Der gebogene Lenker erm\u00f6glicht verschiedene Griffpositionen: flacher f\u00fcr Geschwindigkeit, mittig f\u00fcr mehr Komfort und oben f\u00fcr eine entspannte Haltung \u2013 ideal f\u00fcr l\u00e4ngere Fahrten. Wo zeigt sich die Verbindung von Rennrad und Camper am besten? F\u00fcr Felix und Moritz zeigt sich die Synergie zwischen Camping und dem Radsport besonders w\u00e4hrend der Tour de France, wo Fans in ihren Campern schon Tage vorher anreisen, um die Radrenn-Action hautnah direkt an der Strecke zu erleben \u2013 ein gro\u00dfes Event, das Menschen aus aller Welt zusammenbringt. Unsere Tipps f\u00fcr Gravelbike-Camping-Touren Wenn Sie den perfekten Camping-Ausflug mit dem Gravelbike planen, gibt es ein paar Dinge zu beachten: Die richtige Region w\u00e4hlen: Gravelbiken und Campen passen perfekt zusammen, vor allem in Regionen wie S\u00fcdtirol, die nicht nur fantastische Fahrradstrecken bieten, sondern auch eine ausgezeichnete Campinginfrastruktur. Diese Regionen sind bestens auf Radreisende vorbereitet, mit speziellen Unterstellm\u00f6glichkeiten und Fahrradwaschstationen. In Frankreich gibt es Regionen, die bekannt daf\u00fcr sind, Radsportler anzuziehen und eine angenehme Mischung aus sanften Steigungen und atemberaubenden Ausblicken zu bieten. Den richtigen Campingplatz ansteuern Neben der Region ist auch die Wahl des Campingplatzes entscheidend. Vom Stellplatz mit minimaler Infrastruktur bis hin zu speziell auf Mountainbiker und Outdoor-Freaks vorbereiteten Pl\u00e4tzen, die Fahrradwaschstationen und SUP-Verleih anbieten, gibt es viele Optionen. F\u00fcr die Entspannung nach der anstrengenden Tour k\u00f6nnen a Wellness-Campingpl\u00e4tze eine \u00dcberlegung wert sein. \u00dcberlegen Sie sich im Vorfeld, was Sie ben\u00f6tigen, was Sie mitbringen k\u00f6nnen und wollen, und welche zus\u00e4tzlichen Bed\u00fcrfnisse Ihre Mitreisenden haben. Wer mit Kindern reist, sollte vielleicht auf ein gutes Freizeitangebot achten. Und wer gerne schwimmt, sollte einen Campingplatz mit Seezugang in Betracht ziehen. Wahl des richtigen Fahrzeugs F\u00fcr Gravelbikende, die flexibel unterwegs sein wollen, ist die Wahl des richtigen Fahrzeugs entscheidend. Wer minimalistisch reist und viel drau\u00dfen unterwegs ist, wird mit einem Campervan in VW-Bus-Gr\u00f6\u00dfe gut zurechtkommen. Wenn mehr Komfort gew\u00fcnscht wird und man mit guten Stra\u00dfen erschlossenen Regionen reist oder gr\u00f6\u00dfere Ausr\u00fcstung dabei hat, kann ein kompakter Selim-Teilintegrierter eine gute Wahl sein. F\u00fcr diejenigen, die ein Zwischending suchen, ist ein Campingbus in Transportergr\u00f6\u00dfe ideal \u2013 hier gibt es oft ein kleines Bad und gen\u00fcgend Platz, um Fahrr\u00e4der (bis zu vier St\u00fcck) zu transportieren. Ein Camperbad eignet sich auch gut f\u00fcr das Aufh\u00e4ngen von schmutziger Ausr\u00fcstung nach einer langen Tour \u2013 selbst wenn man lieber in den Sanit\u00e4reinrichtungen des Campingplatzes duscht.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2220083.jpg", + "alt": "Salsa Cutthroat,Gravelbike,Test,Gesamtansicht", + "caption": "Salsa Cutthroat,Gravelbike,Test,Gesamtansicht", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/", + "title": "Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen", + "date": "Mon, 21 Jul 2025 09:55:00 +0200", + "summary": "

Jetzt Gutscheincode einl\u00f6sen und die App Stellplatz-Radar 30 Tage lang kostenfrei mit allen Funktionen nutzen. Und so geht\u2019s!

", + "text": "P\u00fcnktlich zum Sommer startet die Stellplatz-Radar-App eine exklusive Sonderaktion: Neue Nutzerinnen und Nutzer haben jetzt die M\u00f6glichkeit, 30 Tage lang alle Plus-Funktionen der App komplett kostenlos zu nutzen! L\u00f6se hierzu einfach den Gutscheincode SOMMER25 in der Stellplatz-Radar App ein. Die Stellplatz-Radar PLUS Features Spare mit dem Code SOMMER25 * und profitiere 30 Tage lang von den erweiterten Funktionen wie: Erweiterte Suche & Filter Suche gezielt nach Ausstattung (z. Strom, WLAN, Ver- & Entsorgung) Filtere beispielsweise nach Preis, Entfernung oder Bewertung Routenplanung f\u00fcr Camper Plane individuelle Routen f\u00fcr Wohnmobile & Campervans Integration von Stellpl\u00e4tzen direkt entlang der Route Favoriten & Merklisten Speichere Stellpl\u00e4tze in eigenen Listen f\u00fcr sp\u00e4tere Reisen Werbefreie Nutzung Keine Banner oder Popups \u2013 volle Konzentration auf die Stellplatzsuche Schnellere Ladezeiten & bessere Performance Optimiertes Nutzererlebnis ohne Wartezeiten Ideal f\u00fcr alle, die unterwegs komfortabel und entspannt reisen m\u00f6chten. So l\u00f6st du den Gutscheincode SOMMER25* direkt in deiner App ein App \u00fcber den QR-Code downloaden App \u00f6ffnen Melde dich \u00fcber das Men\u00fc an oder registriere dich neu und kostenlos \u00d6ffne den Men\u00fcpunkt \"Plus-Upgrade\" L\u00f6se den Code SOMMER25* \u00fcber die Schaltfl\u00e4che \"Gutscheincode einl\u00f6sen\" ein", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2222499.jpg", + "alt": "30 Tage Stellplatz-Radar PLUS gratis testen", + "caption": "30 Tage Stellplatz-Radar PLUS gratis testen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2222501.jpg", + "alt": "Stellplatz-Radar-App QR Code", + "caption": "Stellplatz-Radar-App QR Code", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2222500.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/", + "title": "Digitaler Fahrzeugschein f\u00fcr Camper: promobil testet den digitalen Fahrzeugschein", + "date": "Tue, 15 Jul 2025 16:20:00 +0200", + "summary": "

Der digitale Fahrzeugschein soll endlich Realit\u00e4t werden. Die Pilotphase l\u00e4uft seit April, im zweiten Halbjahr 2025 soll die App f\u00fcr alle Kfz-Inhaber nutzbar sein.

", + "text": "Seit Ende April l\u00e4uft die offizielle Pilotphase des digitalen Fahrzeugscheins in der i-Kfz-App des Bundesministeriums f\u00fcr Verkehr und des Kraftfahrt-Bundesamts. 2.500 Nutzer testen auf ihren Smartphones die Anwendung und ihre Kernfunktionen, geben Feedback und helfen, die Prozesse zu optimieren. promobil geh\u00f6rt zum exklusiven Kreis der Pilotnutzer. Der in der App hinterlegte digitale Fahrzeugschein bietet viele Vorteile: vereinfachte, \u00fcbersichtliche Darstellung der hinterlegten Werte automatische Erinnerung an f\u00e4llige HU-Termine M\u00f6glichkeit, den Fahrzeugschein digital und ortsunabh\u00e4ngig zu teilen. Halter mehrerer Fahrzeuge k\u00f6nnen immer alle Fahrzeugscheine mitf\u00fchren Fahrzeugschein kann \u00fcber weite Distanzen in der App geteilt werden, falls er in geliehenen Fahrzeugen fehlt So gut ist die i-Kfz-App abgesichert Die Sicherheitsvorkehrungen der i-Kfz-App \u00e4hneln denen moderner Banking-Apps. Um einen digitalen Fahrzeugschein in die App zu laden, ist die sichere Identifikation als Halter mittels E-ID \u00fcber den neuen Personalausweis notwendig. Erst wenn man sich als Halter ausgewiesen hat, werden die Fahrzeugdaten des jeweiligen Fahrzeuges vom Kraftfahrt-Bundesamt abgefragt und als digitaler Fahrzeugschein in der i-Kfz-App hinterlegt. Es wird den digitalen Fahrzeugschein f\u00fcr alle Fahrzeuge und Anh\u00e4nger geben. Das schlie\u00dft Wohnmobile, Campingbusse, Wohnwagen, Motorr\u00e4der, Roller oder Autos mit ein. Halter k\u00f6nnen sich alle Fahrzeugscheine f\u00fcr ihren Fuhrpark in die App laden und sie dort mit anderen Nutzern teilen. Das funktioniert in n\u00e4herem Umfeld per QR-Code oder \u00fcber gr\u00f6\u00dfere Distanzen mithilfe eines Links, der sich verschicken l\u00e4sst. Der Halter kann dabei festlegen, wie lange er den Fahrzeugschein teilen will, oder ihn unbegrenzt freigeben. Digitaler Fahrzeugschein f\u00fcr Campende Sein Funktionsumfang macht den digitalen Fahrzeugschein zum perfekten Werkzeug f\u00fcr Camperinnen und Camper. Wer die digitalen Dokumente f\u00fcr alle Fahrzeuge auf dem Smartphone dabei hat, kann beruhigt ins Wohnmobil steigen, auf dessen Hecktr\u00e4ger der Roller steht. Vorn im Zugfahrzeug m\u00fcssen sich Reisende nicht mehr fragen, wo hinten die Papiere f\u00fcr den Wohnwagen deponiert sind. Privates Verleihen von Campingfahrzeugen wird durch den digitalen Fahrzeugschein sorgenfreier. Noch befindet sich der digitale Fahrzeugschein in der Pilotphase. Doch laut dem Bundesministerium f\u00fcr Verkehr soll die i-Kfz-App nach Abschluss der Pilotphase voraussichtlich im Verlauf des zweiten Halbjahrs 2025 f\u00fcr die \u00f6ffentliche Nutzung angeboten werden. Dann soll diese f\u00fcr IOS und Android-Ger\u00e4te in den jeweiligen App-Stores erh\u00e4ltlich sein. G\u00fcltig ist der digitale Fahrzeugschein vorerst nur in Deutschland. Wer die Bundesrepublik verl\u00e4sst, sollte die Fahrzeugpapiere weiterhin mitf\u00fchren. Integration des digitalen F\u00fchrerscheins geplant In der ersten Phase l\u00e4sst sich in der i-Kfz-App nur der digitale Fahrzeugschein hinterlegen. Das Bundesministerium f\u00fcr Verkehr m\u00f6chte zuk\u00fcnftig auch den digitalen F\u00fchrerschein in die Anwendung integrieren. Er befindet sich in der Vorbereitungsphase f\u00fcr die nationale Einf\u00fchrung. Wann es den EU-weit g\u00fcltigen digitalen F\u00fchrerschein geben wird, h\u00e4ngt von der Verabschiedung und Umsetzung der vierten EU-F\u00fchrerscheinrichtlinie ab. Die Abstimmungsarbeiten zwischen Europ\u00e4ischem Rat und EU-Parlament sind mittlerweile abgeschlossen. Die neuen EU-F\u00fchrerscheinregeln werden derzeit rechtskonform in die Sprachen der 27 Mitgliedsl\u00e4nder \u00fcbersetzt, bevor Rat und Parlament dar\u00fcber offiziell abstimmen k\u00f6nnen. Inhalt der neuen Richtlinie ist auch die Erweiterung des B-F\u00fchrerscheins f\u00fcr Wohnmobile bis 4,25 Tonnen.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2216772.jpg", + "alt": "Happy older man traveler sitting in camper van using mobile in camping.", + "caption": "Happy older man traveler sitting in camper van using mobile in camping.", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1834994.jpg", + "alt": "Digitaler F\u00fchrerschein", + "caption": "Digitaler F\u00fchrerschein", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/", + "title": "Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil?", + "date": "Sun, 13 Jul 2025 14:00:00 +0200", + "summary": "

Wie viel Bad ben\u00f6tigen Sie im Wohnmobil und wie intensiv nutzen Sie Waschbecken, Dusche und WC? Sind Sie mit Ihrem Bad zufrieden?

", + "text": "F\u00fcr viele Reisemobilisten ist das gut ausgestattete Bad ein wichtiges Kaufkriterium. Denn: Eine vollst\u00e4ndige Nasszelle mit Waschbecken, Dusche und Toilette macht Wohnmobilreisende autark. Der Luxus, eine Toilette und ein Waschbecken dabeizuhaben, geh\u00f6rt f\u00fcr die meisten zum Wohnmobilurlaub dazu. Doch schon bei der Dusche scheiden sich die Geister. Die einen sehen sie als Platzverschwendung, andere dagegen genie\u00dfen die Freiheit, die sich durch ein vollst\u00e4ndiges Bad im Wohnmobil bietet. Welches Bad hat Ihr Wohnmobil und wie nutzen Sie es? Wirklich bequem duschen l\u00e4sst sich nicht in jedem Wohnmobil. Oft ist die Nasszelle in einem Raum auf der Fahrerseite zwischen Sitzgruppe und Bett positioniert. Darin ist die Duschtasse gleichzeitig der Boden. H\u00e4ufig wird so der ganze Raum zur Dusche, mit einer Faltwand oder einem Duschvorhang als Spritzschutz. Eine clevere L\u00f6sung f\u00fcr mehr Platz beim Duschen bietet das Schwenkbad: Darin wird meist das an einer Wand montierte Waschbecken zum Duschen seitlich \u00fcber die Toilette geschoben. An der R\u00fcckseite der Wand befindet sich die Duscharmatur, und sie dient gleichzeitig als Duschabtrennung. Erg\u00e4nzend gibt es h\u00e4ufig noch eine Klappwand oder einen Duschvorhang, der die \u00fcbrigen W\u00e4nde und die Badt\u00fcr vor Feuchtigkeit sch\u00fctzt. Deutlich mehr Komfort bieten Wohnmobile mit einer abgetrennten Duschkabine im Bad oder separat, etwa auf der gegen\u00fcberliegenden Fahrzeugseite. Luxuri\u00f6s sind Raumb\u00e4der mit eigenem Toilettenraum und Duschkabine. Oft haben diese einen direkten Zugang zum Schlafzimmer. Neben den genannten Varianten gibt es unz\u00e4hlige weitere Badl\u00f6sungen im Wohnmobil: vom platzsparenden Kompaktbad mit Duscherweiterung in den Flur hinein bis zum Heckbad \u00fcber die gesamte Fahrzeugbreite. Wie nutzen Sie das Bad in Ihrem Wohnmobil? Dienen Waschbecken, Toilette und Dusche nur als Backup, nutzen Sie nur einzelne Einrichtungen oder ausschlie\u00dflich die eigene Nasszelle? Mehr zu den Badvarianten in Wohnmobilen lesen Sie hier: B\u00e4der im Wohnmobil . Wie zufrieden sind Sie mit dem Bad in Ihrem Wohnmobil? Das Waschbecken ist zu klein, der Duschvorhang klebt am K\u00f6rper und auf dem Klo baumeln die Beine. Was f\u00fcr den einen Camper wie gemacht ist, sorgt beim anderen f\u00fcr Verdruss. Meist erkennt man die Schwachstellen im Wohnmobilbad erst dann, wenn man zum ersten Mal mit dem zu kurzen Duschschlauch k\u00e4mpft oder sich vom Thron aus zur Klopapierrolle verrenkt. Auch fehlende Handtuchhaken und L\u00fcftungs\u00f6ffnungen, knapper Stauraum oder windige Armaturen k\u00f6nnen f\u00fcr Unmut im Wohnmobilbad sorgen. Was nervt Sie am Bad in Ihrem Wohnmobil? Haben Sie Dinge selbst optimiert oder war alles von Anfang an in Ordnung f\u00fcr Ihren Anspruch? F\u00fcr welches Bad w\u00fcrden Sie sich beim Neukauf entscheiden? Bei der Entscheidung f\u00fcr ein neues Wohnmobil spielt die Frage nach dem Bad und seiner Gr\u00f6\u00dfe eine ma\u00dfgebliche Rolle. Erfahrenen Campern f\u00e4llt die Auswahl deutlich leichter als Neueinsteigern ohne einschl\u00e4gige Erfahrungen. Doch auch wer sich schon zu den alten Hasen z\u00e4hlt, sollte seine aktuellen Bed\u00fcrfnisse reflektieren und gleichzeitig an die Zukunft denken: Reisegewohnheiten k\u00f6nnen sich \u00e4ndern und damit kann auch das Bad einen neuen Stellenwert bekommen. Wer etwa irgendwann von der Hauptsaison auf die Nebensaison umschwenkt, kann in manchen Regionen schon Mitte September vor verschlossenen Campingplatzt\u00fcren stehen und ist pl\u00f6tzlich mit Stellpl\u00e4tzen ohne Sanit\u00e4rinfrastruktur konfrontiert. Oder man entdeckt St\u00e4dtereisen mit dem Wohnmobil f\u00fcr sich und \u00fcbernachtet gern mitten im Zentrum auf einfachen Stellpl\u00e4tzen. promobil will herausfinden: Welchen Stellenwert hatte das Bad f\u00fcr Sie bei der Auswahl Ihres Wohnmobils? F\u00fcr welche Badl\u00f6sung w\u00fcrden Sie sich heute beim Kauf eines Wohnmobils entscheiden? Schreiben Sie uns! Bei der Umfrage mitmachen und gewinnen! Senden Sie uns Ihre Meinung bis zum 21. Juli 2025 per E-Mail an thema-des-monats@promobil.de . Unter allen Einsendungen verlosen wir eines unserer aktuellen promobil-Sonderhefte nach Wunsch und Verf\u00fcgbarkeit. Bitte f\u00fcgen Sie Ihrer Einsendung m\u00f6glichst ein Portr\u00e4tfoto von sich bei, das wir zusammen mit Ihrem Meinungsbeitrag in promobil ver\u00f6ffentlichen d\u00fcrfen; Ihre Chance auf Ver\u00f6ffentlichung erh\u00f6ht sich dadurch. Datenschutzhinweis : Wenn Sie uns eine Anfrage stellen oder ein Feedback geben, speichern wir Ihre Kontaktdaten und Ihren Text (Art. 6 Abs. 1 lit. f DSGVO). Ihre Zuschrift hilft uns, unser Informationsangebot in unseren Medien zu verbessern. Wir geben Ihre Daten nicht an Dritte weiter. Wir behalten uns vor, Ihre Zuschrift zusammen mit Ihrem Namen in unseren Zeitschriften promobil und CARAVANING und gegebenenfalls auch auf unserer Website www.promobil.de, sowie unseren Social-Media-Kan\u00e4len zu ver\u00f6ffentlichen. Sie k\u00f6nnen der Speicherung Ihrer Daten jederzeit mit Wirkung f\u00fcr die Zukunft widersprechen ( datenschutz@motorpresse.de ). Wir werden dann die gespeicherten Daten umgehend l\u00f6schen. Im \u00dcbrigen l\u00f6schen wir Ihre Daten sp\u00e4testens nach Ablauf eines halben Jahres bzw. im Falle einer Ver\u00f6ffentlichung im Internet, wenn wir der Ansicht sind, dass die Frage nicht mehr interessant f\u00fcr unsere NutzerInnen ist. Mehr zum Datenschutz unter www.promobil.de/datenschutz .", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2220868.jpg", + "alt": "Dethleffs Family XL", + "caption": "Dethleffs Family XL", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2220871.jpg", + "alt": "Schwenkwand", + "caption": "Schwenkwand", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2220869.jpg", + "alt": "Sunliving S 72 DL", + "caption": "Sunliving S 72 DL", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1835793.jpg", + "alt": "Gebraucht-Kauf Ratgeber", + "caption": "Gebraucht-Kauf Ratgeber", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1836156.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2149628.jpg", + "alt": "Gefuehrte Wohnmobilreisen i", + "caption": "Gefuehrte Wohnmobilreisen i", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1555475.jpg", + "alt": "Hagelsch\u00e4den am Wohnmobil", + "caption": "Hagelsch\u00e4den am Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2153790.jpg", + "alt": "Sanit\u00e4r-Autarkie - Frischwasser", + "caption": "Sanit\u00e4r-Autarkie - Frischwasser", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2078412.jpg", + "alt": "CMT 2024 Wohnmobil-Messekauf", + "caption": "CMT 2024 Wohnmobil-Messekauf", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2147777.jpg", + "alt": "Adria Super Twin etnh\u00fcllung auf der Messe", + "caption": "Adria Super Twin etnh\u00fcllung auf der Messe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/", + "title": "Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee", + "date": "Sat, 12 Jul 2025 14:00:00 +0200", + "summary": "

F\u00fcr viele Camperinnen und Camper kann der Tag erst nach einer guten Tasse Kaffee beginnen. So bereiten Sie Ihren Kaffee im Wohnmobil zu!

", + "text": "Kaffee ist f\u00fcr viele der Wachmacher Nummer Eins. Auf dem Camping- oder Stellplatz kann er auch zur Kontaktaufnahme dienen. Wohl dem, der seinen Camping- oder Stellplatznachbarn einen Espresso, einen Cappuccino oder einen gepflegten Filterkaffee anbieten kann. Doch wie bei vielem sind auch beim Kaffeegenuss die Geschm\u00e4cker verschieden. Wir haben Sie gefragt, welches Ihr bevorzugtes Hei\u00dfgetr\u00e4nk im Campingurlaub ist und wie Sie es zubereiten. Die Antworten finden Sie unten . Haben Sie eine Kaffeemaschine im Wohnmobil? Die einen schw\u00f6ren auf technisch ausgefeiltes Equipment mit automatischem Milchaufsch\u00e4umer, andere vertrauen auf die gute alte Filtermaschine oder den Perlator von Bialetti und Co. Puristen br\u00fchen mit hei\u00dfem Wasser in der French Press oder mit einem Filterhalter selbst auf. Ganz Abgebr\u00fchte machen sich das Leben mit Instant-Pulver leicht. Welche Methoden zum Kaffeekochen nutzen Sie im Campingurlaub? Wo verstauen Sie Ihr Kaffee-Equipment w\u00e4hrend der Fahrt im Wohnmobil? Viele Wohnmobilhersteller bieten inzwischen clevere L\u00f6sungen, um eine Kaffeemaschine im Wohnmobil gut zu verstauen. Absenkbare Schr\u00e4nke oder spezielle Regale erleichtern Kaffeeliebhabern das Leben im Wohnmobil. Zum Teil kann man die Kapselmaschine samt Kapselhalter gleich mitbestellen. Haben Sie eine spezielle L\u00f6sung f\u00fcr den Kaffeemaschinentransport im Wohnmobil? Oder haben Sie sich selbst einen geeigneten Ort f\u00fcr die Unterbringung w\u00e4hrend der Fahrt gesucht? Ihre Antworten zum Kaffeegenuss Karin und Harald Pauler: Ein Wasserkessel f\u00fcr den Gasherd, Filter und Filtert\u00fcte; so bereiten wir unseren Kaffee im Wohnmobil seit mehr als 30 Jahren zu. Und am Nachmittag gerne auch mal einen Espresso aus der alten Espressokanne. Ingrid und Hannes Drechsler: F\u00fcr eine schmale Kapselmaschine mit integriertem Milchsch\u00e4umer haben wir auf Arbeitsh\u00f6he im Apothekerschrank einen Auszug montiert. W\u00e4hrend der Fahrt dient Schaumstoff zum Schutz und das Fach wird mit einem Schieber fixiert. Utz Graafmann: Mit einem Briki, einem kleinen Mokkak\u00e4nnchen, bereiten wir auf dem Gasherd griechischen Kaffee zu. Er hat ein tolles Aroma und einen perfekten Kaimaki, also die \"Crema\" beim griechischen Kaffee. Urlaubserinnerungen an Griechenland inklusive. Gertrudis Laggai: Meinen Espressokocher verwende ich f\u00fcr normalen Kaffee mit Kaffeepads. Das schmeckt hervorragend und der Kocher ist schnell zu reinigen, da sich kein loses Kaffeepulver darin befindet. So habe ich einen Kocher f\u00fcr normalen Kaffee und f\u00fcr Espresso dabei. Allerdings gibt es nicht in allen L\u00e4ndern Kaffeepads, daher informieren und gen\u00fcgend Pads mitnehmen. Urs Bichler: Als echte Kaffeeliebhaber haben wir viele M\u00f6glichkeiten ausprobiert. Heute genie\u00dfen wir unseren Kaffee aus einer Mini-Nespresso-Maschine, die wir mit Landstrom oder mit einer Eco-Flow-Powerstation betreiben. Sie hat ihren festen Platz an der K\u00fcchenwand in einer Halterung von K\u00e4psele. Margret und Werner: Unsere Coffee B Maschine betreiben wir mit Landstrom, ansonsten gibt es zur Not l\u00f6slichen Kaffee. Die Kaffee-Kugeln sind kompostierbar und somit nachhaltig. Carsten Languth: Wir benutzen ein Kaffeekonzentrat von Moin. Wasser kochen, einen Messl\u00f6ffel hinzuf\u00fcgen und fertig. Es gibt viele Sorten und die kleinen Fl\u00e4schchen sind leicht zu verstauen. Kerstin Anders: Vor drei Jahren waren wir noch mit Instantkaffee unterwegs. Inzwischen kaufen wir unterwegs bei kleinen, lokalen R\u00f6stereien Kaffee. Der wird in der French Press mit Thermofunktion zubereitet. Manche R\u00f6sterei bietet auch Tassenkaffeefilter an. Die klemmt man in die Tasse und \u00fcbergie\u00dft sie mit hei\u00dfem Wasser. Gerd Lowig: Ich mahle den Kaffee in einer Handm\u00fchle und bereite ihn in der French Press zu. Harald Homm: Mit Landstrom ist unser Saeco-Vollautomat die erste Wahl. Stehen wir autark, wird die French Press von Waldwerk ausgepackt. Walter Kaiser: Als Gourmet-Banausen (in Bezug auf die Kaffeezubereitung im Camper-Van) verwenden wir Nescaf\u00e9 Gold. Ganz so \u00fcbel ist das Gebr\u00e4u nicht, kochendes Wasser gibt es immer und es steht nichts herum und man muss keine Kaffeereste entsorgen. Birte und Rainer: Echten Kaffee wie bei Oma gibt es bei uns. Kessel, Wasser kochen, Filter auf Thermoskanne, Kaffeepulver aufgie\u00dfen. Der Vorteil ist, dass so gleich ein Liter Kaffee fertig ist und der Nachbar gerne einen Becher mittrinken darf.", + "tags": [], + "status": "Online", + "link": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2198084.jpg", + "alt": "Kaffeemaschinen", + "caption": "Kaffeemaschinen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/", + "title": "Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt", + "date": "Sat, 12 Jul 2025 11:00:00 +0200", + "summary": "

Privates Bad am Stellplatz: Komfort pur oder Verrat am Camping? Zwei Redakteur:innen diskutieren, was das Mietbad wirklich bedeutet.

", + "text": "Ein privates Mietbad auf der Campingplatz-Parzelle ist wie ein VIP-Bereich f\u00fcrs Z\u00e4hneputzen \u2013 nur ohne T\u00fcrsteher. Statt Flipflop-Marsch durchs Morgengrauen geht\u2019s direkt von der Matratze aufs eigene WC. Dusche, Spiegel, Klobrille \u2013 alles da, alles sauber, alles zur alleinigen Nutzung. Privatbad auf dem Campingplatz \u2013 ja oder nein? Die einen feiern die neue Form des Komforts als zeitgem\u00e4\u00dfes Angebot. Die anderen kritisieren: Mietb\u00e4der f\u00f6rdern das Eigenbr\u00f6tlertum, steigern Kosten und entfremden vom klassischen Campinggef\u00fchl. Ist ein privates Bad direkt an der Parzelle ein Fortschritt oder ein R\u00fcckschritt f\u00fcrs Camping? An kaum einem Thema scheiden sich die Geister unter Camperinnen und Campern so sehr wie an dieser Frage. Zwischen Naturn\u00e4he und Komfortanspruch, Gemeinschaft und R\u00fcckzug \u2013 Zwei Redaktionsmeinungen, zwei Perspektiven, ein Thema: Wie viel Privat-Bad vertr\u00e4gt das Camping? Philipp Heise: Klare Kante gegen Mietb\u00e4der! Die Campingwelt ver\u00e4ndert sich \u2013 und nicht jede Entwicklung ist ein Fortschritt. Mietb\u00e4der auf der eigenen Parzelle versprechen auf den ersten Blick Komfort, doch sie werfen auch grundlegende Fragen auf, wohin sich Camping entwickelt. Als Fachredakteur, der sein Hobby lebt, sehe ich den Trend zu privaten Sanit\u00e4rkabinen mit Sorge \u2013 und das nicht nur, weil ich am liebsten unparzelliert oder bestenfalls frei stehe beim Campen. Warum? Weil Mietb\u00e4der f\u00fcr mich eine Abkehr vom eigentlichen Wesen des Campings bedeuten. Verlust des Camping-Gef\u00fchls Camping war immer mehr als nur eine Urlaubsform. Es ist ein Lebensgef\u00fchl. Es geht um Naturverbundenheit und auch um eine materielle Reduktion, die hilft, dem Alltag in einer \u00dcberflussgesellschaft zu entfliehen. Wer sich ein eigenes abgeschlossenes Bad direkt an die Parzelle mietet, grenzt sich ab. Der Schritt zur abgeschotteten Ferienwohnung im Gr\u00fcnen ist dann nicht mehr weit. Es entsteht ein k\u00fcnstlicher Komfortraum, der mit klassischem Camping wenig zu tun hat. Warum noch mit dem Freizeitmobil verreisen, wenn man sich vor Ort dann die Annehmlichkeiten eines Ferienapartments nachbaut? Weniger Gemeinschaft Camping lebt von Begegnung. Der morgendliche Plausch am Waschhaus, das Z\u00e4hneputzen neben anderen Reisenden aus aller Welt \u2013 das sind die kleinen Momente, die verbinden. Mietb\u00e4der f\u00f6rdern jedoch die Abschottung. Wer alles privat hat, begegnet niemandem mehr zuf\u00e4llig. Der Campingplatz verkommt so zur Parzellenansammlung mit eigenem Sanit\u00e4rtrakt. H\u00f6here Kosten \u2013 f\u00fcr Camper und Betreiber Mietb\u00e4der treiben die Preise hoch \u2013 f\u00fcr Stellpl\u00e4tze wie f\u00fcr deren Wartung. Camper, die auf diese Form der \"Luxus-Parzelle\" verzichten m\u00f6chten, zahlen oft mit dank insgesamt h\u00f6herer Gesamtpreise. F\u00fcr Betreiber bedeuten der Unterhalt und die Reinigung privater Sanit\u00e4ranlagen einen erheblichen Mehraufwand. Widerspruch zur Naturverbundenheit Camping steht f\u00fcr Reduktion, f\u00fcr bewusstes Leben in und mit der Natur. Die Errichtung privater B\u00e4der auf jeder Parzelle wirkt diesem Gedanken entgegen: versiegelte Fl\u00e4chen, zus\u00e4tzliche Infrastruktur, h\u00f6herer Wasser- und Energieverbrauch. Und zu guter Letzt wandeln sie das optische Erscheinungsbild eines Campingplatzes stark hin zu einer Mini-Reihenhaussiedlung. Fazit : Mietb\u00e4der m\u00f6gen bequem sein \u2013 aber sie sind ein Komfort, der das Camping einen Teil seiner Essenz raubt. Statt naturnah und gemeinschaftlich wird es individuell und abgeschottet. Es entsteht eine Art Zweiklassengesellschaft, die das Kn\u00fcpfen neuer Kontakte weiter erschwert. Wenn wir nicht aufpassen, verwandeln sich unsere Campingpl\u00e4tze schleichend in Reihenhaussiedlungen mit Urlaubsanstrich. Sophia Pfisterer: Privates Mietbad, g\u00f6nn ich mir! Ich habe viele N\u00e4chte in Stockbetten verbracht. Habe mit Stirnlampe auf Festivals das Zelt gesucht, mit nassen Flipflops in Gemeinschaftsduschen gestanden und w\u00e4hrend Corona die H\u00e4nde vor und nach dem Klogang desinfiziert. Entgegenkommende Camperinnen und Camper nickten mir zu. Es war intensiv \u2013 und irgendwie sch\u00f6n. Aber heute w\u00fcnsche ich mir etwas mehr \"Chill Pill\". Seitdem ich mit kleinem Kind reise, stelle ich fest: Nicht jede Situation l\u00e4sst sich mit einem Schulterzucken und einem fr\u00f6hlichen \"Das geh\u00f6rt dazu\" l\u00f6sen. Heute freue ich mich \u00fcber Mietb\u00e4der auf der Parzelle \u2013 nicht aus Bequemlichkeit, sondern aus dem Bed\u00fcrfnis nach Routine und Verl\u00e4sslichkeit. Glamping ist kein Verrat an der Idee \u2013 sondern ihre Weiterentwicklung Camping ist nicht nur wild und reduziert. Es ist das, was wir daraus machen. Ich sehe Mietb\u00e4der nicht als Abschottung, sondern als Wahlfreiheit. Glamping ist f\u00fcr mich der Beweis, dass Camping mitwachsen kann \u2013 mit dem Leben, mit der Familie, mit den Anspr\u00fcchen. Wer eine atomare Windelexplosion nachts eind\u00e4mmen oder einem Kleinkind (sprich: zappeligem Dinosaurier) die Z\u00e4hne putzen muss, lernt ein sauberes, privates Bad zu sch\u00e4tzen. Und wenn ich nach einem langen Campingtag 5 Minuten ungest\u00f6rt mit warmem Wasser duschen kann, habe ich schlicht mehr Energie f\u00fcr das, was drau\u00dfen z\u00e4hlt: das Lagerfeuer, die Natur, die Begegnung. Gemeinschaft braucht Raum \u2013 auch R\u00fcckzugsraum In S\u00fcdspanien stand ich einmal auf einem wundersch\u00f6nen Campingplatz, weitl\u00e4ufige Parzellen unter B\u00e4umen, direkt am Strand. Doch irgendwas mit der Wasserversorgung war faul. Die Toiletten liefen \u00fcber, teilweise waren sie so randvoll, dass wir schnell das Weite gesucht haben. Der Angestellte an der Rezeption schaute nur mitleidig: \"Si, claro\", sagte er, und wir bekamen unser Geld zur\u00fcck. Es war schon so ein Albtraum \u2013 mit kleinem Kindosauraus rex, das alles ableckt? Der blanke Bakterien-Horror! Die Begegnungen auf Campingpl\u00e4tzen geh\u00f6ren f\u00fcr mich dazu: das kurze Schw\u00e4tzchen am Sp\u00fclbecken, die Urlaubsfreundschaften bei den Gro\u00dfen wie Kleinen. Und genauso genie\u00dfe ich es, abends die T\u00fcr hinter mir zu schlie\u00dfen \u2013 und mein Buch zu lesen. Gemeinschaft darf f\u00fcr mich nicht bedeuten, dass ich meinen Wunsch nach Ruhe und R\u00fcckzug komplett aufgeben muss. Gemeinschaft entsteht nicht im Mangel, sondern im geteilten Erleben \u2013 gerne drau\u00dfen, gerne am Grill, aber nicht zwangsl\u00e4ufig in der Duschkabine. Ja zu Vielfalt auf dem Platz Nicht jeder Camper und jede Camperin ist gleich. Manche reisen minimalistisch, andere mit Komfortanspruch. Das Sch\u00f6ne an modernen Campingpl\u00e4tzen: Sie k\u00f6nnen beides. Mietb\u00e4der sind ein Angebot, kein Zwang. Das Gemeinschaftsbad wird's weiterhin geben. Vielleicht nutze ich es sogar irgendwann mal wieder. Gleichwohl empfinde ich es als Gewinn, wenn Menschen mit besonderen Bed\u00fcrfnissen \u2013 Familien mit kleinen Kindern, Senioren, Menschen mit Mobilit\u00e4tseinschr\u00e4nkung \u2013 sich auf dem Campingplatz willkommen und wohl f\u00fchlen. Komfort ist keine Bedrohung, sondern eine Einladung. Fazit : Mietb\u00e4der rauben dem Camping nicht die Seele \u2013 sie geben der Urlaubsform neue M\u00f6glichkeiten. Wer diesen Komfort ablehnt, soll das tun. Aber wer ihn braucht, sollte sich nicht sch\u00e4men m\u00fcssen. Denn wahres Campinggef\u00fchl entsteht nicht im Bad \u2013 sondern drau\u00dfen, wo wir uns begegnen.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2221475.jpg", + "alt": "Emsland Camp, Stellplatz", + "caption": "Emsland Camp, Stellplatz", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2200233.jpg", + "alt": "LMC Edero 400 C (2025) Sofa", + "caption": "LMC Edero 400 C (2025) Sofa", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2221474.jpg", + "alt": "Ferienpark Beerze Bulten, Privatbad", + "caption": "Ferienpark Beerze Bulten, Privatbad", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1928382.jpg", + "alt": "Mercedes Marco Polo 300 d AMG-Line (2023) Test", + "caption": "Mercedes Marco Polo 300 d AMG-Line (2023) Test", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2221472.jpg", + "alt": "Ferienpark Beerze Bulten, Privatbad", + "caption": "Ferienpark Beerze Bulten, Privatbad", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/", + "title": "Zubeh\u00f6r auf der gr\u00f6\u00dften Campingmesse kaufen: Deshalb m\u00fcssen Zubeh\u00f6r-Shopper zum Caravan Salon", + "date": "Mon, 07 Jul 2025 14:03:00 +0200", + "summary": "

Zubeh\u00f6r gibt\u2019s \u00fcberall \u2013 aber nur auf dem Caravan Salon gibt\u2019s den vollen \u00dcberblick. Camper, die gezielt nachr\u00fcsten oder ihr Fahrzeug optimieren wollen, finden hier nicht nur g\u00fcnstige Messepreise, sondern auch Beratung, Live-Tests und echte Neuheiten.

", + "text": "Der beliebteste Gegenstand mit R\u00e4dern auf dem Caravan Salon ist der Fritz Berger Einkaufstrolley. Wer auf der gr\u00f6\u00dften Messe f\u00fcr Reisemobile, Wohnwagen oder Campingbusse unterwegs ist, sieht immer wieder Besucher, die die kleine blaue Kiste hinter sich herziehen. Nat\u00fcrlich ist die vollgestopft mit Camping-Ausr\u00fcstung. Wer m\u00f6chte schon die ganzen Schn\u00e4ppchen, die er gerade in den Zubeh\u00f6r-Hallen 3, 13 und 14 gemacht hat, herumtragen. Also gibt es f\u00fcr 20 Euro den Trolley als Extra dazu. Auf der riesigen Neuheiten-Show geht im Glanz der Campingfahrzeuge unter, dass es kaum eine bessere Gelegenheit gibt, um sich \u00fcber Camping-Zubeh\u00f6r zu informieren, es einzukaufen und alles \u00fcber Neuheiten zu erfahren. Warum das so ist, erz\u00e4hlen wir Ihnen hier. 1. Markt\u00fcbersicht an einem Ort Auf dem Caravan Salon finden Camper eine riesige Auswahl an Zubeh\u00f6r \u2013 von Solarmodulen \u00fcber automatische Hubst\u00fctzen, Batterien, Vorzelten, Markisen bis zu cleveren Campingst\u00fchlen oder K\u00fcchenhelfern. Es sind nicht nur alle Kategorien aus den Bereichen Camping-Zubeh\u00f6r, Wohnmobil- oder Wohnwagen-Technik oder Ausr\u00fcstung auf der Messe, sondern in der Regel auch alle relevanten Hersteller. Dazwischen schleicht sich gelegentlich ein kleines Start-up mit einer neuen Idee. Camperinnen und Camper k\u00f6nnen sich also schnell einen \u00dcberblick \u00fcber den Markt verschaffen und die konkurrierenden Produkte gleich miteinander vergleichen. Das klappt im Internet gar nicht und bei Zubeh\u00f6r-Shops am Wohnort nur bedingt, weil die nicht alle Marken verkaufen. 2. Produkte direkt ausprobieren Probieren geht \u00fcber Studieren: Die Chance dazu haben Camperinnen und Camper auf dem Caravan Salon oft ziemlich exklusiv. In Online-Shops m\u00fcssen sie sich auf Bewertungen anderer K\u00e4ufer verlassen und station\u00e4re H\u00e4ndler haben die Ware oft nur verpackt im Regal liegen. Auf dem Caravan Salon haben die Hersteller in der Regel eigene St\u00e4nde und bauen dort so viele Produkte wie m\u00f6glich auf \u2013 vorrangig die Neuheiten. Besucher k\u00f6nnen sich die Vorzelte anschauen oder auf Campingst\u00fchlen Probe sitzen. Sie k\u00f6nnen ausprobieren, ob sie mit der Bedienung des Reich easydriver oder des Truma Mover besser klarkommen und sich danach f\u00fcr einen Rangierantrieb f\u00fcr den Wohnwagen entscheiden. 4. Fragen direkt kl\u00e4ren \u2013 bei den besten Experten Wer auf dem Caravan Salon ein Zubeh\u00f6r-Produkt entdeckt und Fragen dazu hat, kann sie gleich kl\u00e4ren. Die Antworten geben oft die Mitarbeiterinnen und Mitarbeiter der Hersteller. Bessere Experten gibt es nicht. Wer direkt f\u00fcr ein Unternehmen arbeitet, wei\u00df oft mehr \u00fcber das Produktportfolio als Einzelh\u00e4ndler. Nat\u00fcrlich geht das nicht auf, wenn Camperinnen und Camper in der Zubeh\u00f6r-Halle 3 am gro\u00dfen Verkaufsstand von Fritz-Berger vor Toiletten-Zus\u00e4tzen von Thetford, Geschirr von Brunner oder K\u00fchlboxen von Dometic stehen. Dann gibt es aber auch eine L\u00f6sung: Die Frage einfach mitnehmen in die Hallen 13 und 14, wo die drei Hersteller ihre St\u00e4nde haben. Denn die geh\u00f6ren zur Kategorie Fahrzeugtechnik und Ausstattung, f\u00fcr die es eigene Hallen gibt. 5. Schn\u00e4ppchen machen dank Messepreisen Viele Hersteller oder Zubeh\u00f6r-H\u00e4ndler machen auf dem Caravan Salon Sonderangebote. Preise liegen dabei oft 10 bis 20 Prozent unter dem regul\u00e4ren Marktwert. Gerade bei hochpreisigen Teilen wie Wechselrichtern, Batterien oder Klimaanlagen kann sich das lohnen. 6. Zubeh\u00f6r-Neuheiten zuerst sehen Auch die gro\u00dfen Hersteller von Camping-Zubeh\u00f6r, Fahrzeug- und Aufbautechnik stellen in der Regel in D\u00fcsseldorf ihre Neuheiten f\u00fcr die kommende Saison vor. Nirgends in Europa k\u00f6nnen Camperinnen und Camper die technischen Highlights der Zukunft fr\u00fcher live aufgebaut sehen. Zubeh\u00f6r in Halle 3, Ausstattung und Technik in Hallen 13 und 14 Eigentlich liegen die Kategorien Camping-Zubeh\u00f6r und Fahrzeug-Ausstattung und Technik relativ nah zusammen. Manche Camperinnen und Camper w\u00fcrden Ausstattungs-Komponenten wie Klimaanlagen oder Markisen vermutlich sogar zum Zubeh\u00f6r z\u00e4hlen. Auf dem Caravan Salon liegen die drei Kategorien maximal weit auseinander. Zubeh\u00f6r wie Vorzelte, Campingst\u00fchle oder Geschirr finden die Besucher n\u00e4mlich eher in Halle 3 an der s\u00fcdwestlichen Ecke des Gel\u00e4ndes. Die Hersteller von Klima-Technik, Wechselrichter, Markisen oder Sat-Anlagen sind in den Hallen 13 und 14 untergebracht \u2013 also am Ostende des Gel\u00e4ndes.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2030929.jpg", + "alt": "Xcabin", + "caption": "Xcabin", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2222273.jpg", + "alt": "Mobilvetta Kea, Wohnraum", + "caption": "Mobilvetta Kea, Wohnraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2219705.jpg", + "alt": "Weinsberg, Carsuite, Wohnmobil", + "caption": "Weinsberg, Carsuite, Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2030129.jpg", + "alt": "Caravan Salon 2024", + "caption": "Caravan Salon 2024", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2216820.jpg", + "alt": "Corigon CV 60 D, von vorne", + "caption": "Corigon CV 60 D, von vorne", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2216768.jpg", + "alt": "B\u00fcrster Papillon Rendering", + "caption": "B\u00fcrster Papillon Rendering", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2215467.jpg", + "alt": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", + "caption": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/", + "title": "Tipps f\u00fcr die gr\u00f6\u00dfte Camping-Messe Deutschlands: Darum d\u00fcrfen Sie den Caravan Salon nicht verpassen", + "date": "Thu, 03 Jul 2025 06:00:00 +0200", + "summary": "

Der Caravan Salon in D\u00fcsseldorf ist die gr\u00f6\u00dfte Messe f\u00fcr Wohnmobile, Wohnwagen und Camping-Zubeh\u00f6r. Wir verraten Ihnen, warum Sie unbedingt einmal hingehen m\u00fcssen!

", + "text": "Die mit Abstand gr\u00f6\u00dfte und wichtigste Messe f\u00fcr Wohnmobile, Wohnwagen und Camping-Zubeh\u00f6r ist ohne Zweifel der Caravan Salon in D\u00fcsseldorf. Er findet jedes Jahr Ende August statt \u2013 2025 vom 30. August bis zum 7. September. Was Sie dort erwartet, lesen Sie in unserem Themenspecial. Warum Sie unbedingt auf den Caravan Salon gehen sollten, erfahren Sie hier. 1. Wohnmobile/Wohnwagen anschauen Ganz oben auf der Liste der Messe-Highlights stehen nat\u00fcrlich die unz\u00e4hligen Wohnmobile, Campingbusse und Wohnwagen, die Sie dort nicht nur aus der Ferne, sondern ganz genau von au\u00dfen und innen unter die Lupe nehmen k\u00f6nnen. Nirgendwo sonst haben Sie die Chance, einmal so viele Modelle unterschiedlicher Hersteller auf einem Fleck zu sehen. Das lohnt sich, wenn Sie: A: Noch nie ein Campingfahrzeug von innen gesehen haben. Treten Sie ruhig ein und schauen Sie sich einmal die unterschiedlichen Gattungen von innen an. Meist wirken die Fahrzeuge auf Bildern gr\u00f6\u00dfer, als sie es tats\u00e4chlich sind. Nehmen Sie Ihren Partner/Ihre Partnerin und Kinder mit rein, um zu sehen, wie sich die Platzverh\u00e4ltnisse auf sie auswirken. B: Ein Fahrzeug kaufen m\u00f6chten, aber noch nicht so genau wissen, was oder von welcher Marke. Hier haben Sie die Chance, die unterschiedlichen Hersteller auszuchecken. Seien es die Big Player auf dem Markt, wie Hymer, Knaus oder P\u00f6ssl, oder unbekanntere, kleine Manufakturen \u2013 auf dem Caravan Salon sind sie alle vertreten. 2. Wohnmobil, Campingbus oder Wohnwagen kaufen Nat\u00fcrlich animiert die Messe auch zum Kauf eines Freizeitfahrzeugs, mit Rabatten und attraktiven Preisen. Allerdings sollten Sie von Spontank\u00e4ufen absehen und nur zuschlagen, wenn Sie sich wirklich sicher sind. Wichtig ist es, sich vorher Gedanken dar\u00fcber zu machen: Was ist mir beim Camping wichtig? Eine grobe Idee von der Fahrzeugkategorie, dem Platz und der Bettenaufteilung sollten Sie immerhin haben. Alles, was sonst f\u00fcr den Messekauf wichtig ist, erfahren Sie hier. Wohnmobile, Campingbusse und Wohnwagen gibt es in den Hallen: 1, 4-7a, 10\u201312 und 15 bis 17. 3. Zubeh\u00f6r durchforsten Im Zubeh\u00f6r-Bereich des Caravan Salons \u2013 in den Hallen 3, 13 und 14 \u2013 finden Sie alles, was das Camperleben angenehmer macht. Ob praktische Alltagshelfer, clevere Technik oder stilvolle Einrichtung: Hier k\u00f6nnen Sie st\u00f6bern, vergleichen und entdecken, was zu Ihrem Fahrzeug passt. Vielleicht ahnen Sie noch gar nicht, wie viel Potenzial in Ihrem mobilen Zuhause steckt. 4. \u00dcber Selbstausbau informieren Zum Thema Zubeh\u00f6r passt auch die Sonderschau \"Abenteuer Selbstausbau\" auf dem Freigel\u00e4nde vor den Hallen 13 und 14. Hier erfahren Sie nicht nur, welches Zubeh\u00f6r Sie f\u00fcr einen Selbstausbau ben\u00f6tigen, sondern auch, wie Sie diesen planen und durchf\u00fchren. Dort gibt es t\u00e4glich Vortr\u00e4ge f\u00fcr Anf\u00e4nger, Fortgeschrittene und Profis zum Thema Selbstausbau und ebenso fertige Ausbauten, die beispielhaft zeigen, was m\u00f6glich ist. Dass ein Selbstausbau n\u00e4mlich nicht nur cool aussieht, sondern vor allem einiges an Blut, Schwei\u00df und Tr\u00e4nen einfordert, lernen Sie sp\u00e4testens im Gespr\u00e4ch mit den Experten. 5. Starter-Welt f\u00fcr Neulinge Alle Camping-Neulinge sollten unbedingt bei der Starter-Welt vorbeischauen. Hier gibt es spannende Vortr\u00e4ge von Expertinnen und Experten aus der Camping-Branche zum Thema \"das erste Mal Camping\". Wenn Sie noch nie campen waren, k\u00f6nnen Sie sich hier \u00fcber die unterschiedlichen Fahrzeugarten informieren und was unterwegs wichtig ist. Au\u00dferdem k\u00f6nnen Sie Ihre brennendsten Fragen loswerden. Die Starter-Welt kommt 2025 an einen neuen Platz und befindet sich zwischen den Hallen 5 und 9. 6. Ungest\u00f6rt am Preview Day Wer sich intensiv mit den Fahrzeugen und Co. auseinandersetzen will, kann schon am Freitag, 29. August, ein Ticket f\u00fcr den \"Preview Day\" erwerben. Die St\u00fcckzahlen der Tickets sind limitiert und so schafft es nur eine begrenzte Besuchermenge auf das Gel\u00e4nde. An diesem Tag k\u00f6nnen Sie sich in entspannter Atmosph\u00e4re umschauen. Am Wochenende wird es jedes Jahr gerammelt voll auf dem Caravan Salon. Wer am Preview Day kein Ticket mehr bekommt, es aber unter der Woche einrichten kann, profitiert ebenfalls von mehr Ruhe und hat mehr Gelegenheit, mit den Beratern an den Herstellerst\u00e4nden ins Gespr\u00e4ch zu kommen.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2030129.jpg", + "alt": "Caravan Salon 2024", + "caption": "Caravan Salon 2024", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2222273.jpg", + "alt": "Mobilvetta Kea, Wohnraum", + "caption": "Mobilvetta Kea, Wohnraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2219705.jpg", + "alt": "Weinsberg, Carsuite, Wohnmobil", + "caption": "Weinsberg, Carsuite, Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2030929.jpg", + "alt": "Xcabin", + "caption": "Xcabin", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2216820.jpg", + "alt": "Corigon CV 60 D, von vorne", + "caption": "Corigon CV 60 D, von vorne", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2216768.jpg", + "alt": "B\u00fcrster Papillon Rendering", + "caption": "B\u00fcrster Papillon Rendering", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2215467.jpg", + "alt": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", + "caption": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/", + "title": "Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper", + "date": "Sun, 29 Jun 2025 14:00:00 +0200", + "summary": "

Die erste Hitzewelle ist in vollem Gange. Wir verraten die besten Tipps und Tricks, wie es im Camper k\u00fchl bleibt.

", + "text": "Es wird richtig hei\u00df! Wenn die Temperaturen im Sommer steigen, kann es im Wohnmobil schnell unangenehm hei\u00df werden. Besonders bei Reisen nach S\u00fcdeuropa oder w\u00e4hrend Hitzewellen in Deutschland heizt sich der Innenraum von Wohnmobilen, Campingbussen oder Wohnwagen tags\u00fcber stark auf. Und wir alle fragen uns: Was tun, wenn es zu hei\u00df wird im Campingfahrzeug? Keine Sorge, es gibt zahlreiche M\u00f6glichkeiten, wie Sie die hei\u00dfen Tage angenehmer gestalten k\u00f6nnen. Wir haben die besten K\u00fchl-Tipps f\u00fcr Sie zusammengestellt, damit Sie auch bei hohen Temperaturen einen k\u00fchlen Kopf bewahren k\u00f6nnen. Wer sehr temperaturempfindlich ist, sollte auch bei der Wahl des Urlaubsortes das Klima im Kopf behalten. Vor allem f\u00fcr Menschen mit Vorerkrankungen, kleine Kinder, Schwangere und \u00e4ltere Reisende ist der Trend Coolcation im Hochsommer wahrscheinlich die beste Wahl \u2013 Sprich: Ein Sommerurlaub an einem k\u00fchlen Ort. Sie wollen trotzdem in den S\u00fcden oder lieben es einfach, wenn es drau\u00dfen warm ist? Mit den folgenden Ma\u00dfnahmen k\u00f6nnen Sie auch bei hohen Temperaturen einen angenehmen und erholsamen Campingurlaub genie\u00dfen. Richtig l\u00fcften Sobald die ersten Sonnenstrahlen die Luft aufheizen, werden die Schotten dicht gemacht. Im Reisemobil oder Wohnwagen bedeutet das: Fenster und Luken zu. L\u00fcften mittels Dachluken und Fenster ergibt nur Sinn, wenn es drau\u00dfen k\u00fchler ist. Und genau die S\u00fcdeurop\u00e4er machen uns vor, wie es geht: Sie l\u00fcften dann, wenn es drau\u00dfen k\u00fchler ist als drin \u2013 und zwar von sp\u00e4tabends bis fr\u00fchmorgens . Auch wenn drau\u00dfen ein kleines L\u00fcftchen weht, ergibt das L\u00fcften Sinn. Dann entsteht auch drinnen ein Luftstrom , der zwar die Temperatur real nicht senkt, sie jedoch ertr\u00e4glicher macht. Kastenwagen heizen sich st\u00e4rker auf, weshalb hier offene Fenster und T\u00fcren auch tags\u00fcber Linderung bringen k\u00f6nnen. Fensterschutz Wer denkt, das Schlie\u00dfen aller Rollos w\u00fcrde dem rasanten Temperaturanstieg entgegenwirken, liegt nicht ganz richtig. Zwar versprechen die silbrig folierten Rollo-Au\u00dfenseiten eine gewisse Abschirmung, doch wenn das Sonnenlicht auf die Rollos trifft, ist die W\u00e4rme schon hinter den Fensterscheiben \u2013 also im Fahrzeug. Fenster, Luken und T\u00fcren sind die eigentlichen Hitzeschleusen. Spezielle Funktionstextilien , die man au\u00dfen anbringt, helfen, sie besser zu isolieren. Die gr\u00f6\u00dfte Wirksamkeit entwickeln sie in Kombination mit geschlossenen Rollos innen. F\u00fcr Dachhauben und Seitenfenster haben verschiedene Firmen ma\u00dfgeschneiderte Sonnenschutz-\u00dcberz\u00fcge im Programm. Die Beschaffenheit der \u00dcberz\u00fcge ist unterschiedlich: Durch die Dometic \" Sunshades \" dringt immer noch ein wenig Tageslicht, die Thermomatte von Hindermann ist dagegen komplett undurchsichtig. Die Hindermann Thermomatte k\u00f6nnen Sie hier direkt bei unserem Partnershop Fritz Berger bestellen. Cockpit-Schutz Vor allem f\u00fcr das gr\u00f6\u00dfte Fenster im Fahrzeug, die Frontscheibe, eignet sich zus\u00e4tzlich eine Thermofolie au\u00dfen, erh\u00e4ltlich beispielsweise bei Fritz Berger. Der Zubeh\u00f6rhandel hat eine Vielzahl ma\u00dfgeschneiderter silber bedampfter D\u00e4mmmatten im Angebot. Die Preisspannen sind enorm. Je nach technischer Finesse und Ausstattung kosten sie zwischen 100 und 900 Euro. Die Frontscheiben-Thermofolie von Fritz Berger k\u00f6nnen Sie direkt bei Fritz Berger bestellen, einfach hier klicken. Noch mehr Thermomatten f\u00fcr die Frontscheibe gibt es hier bei Camping Wagner. Ventilatoren Dem Luftzug auf die Spr\u00fcnge helfen Ventilator-Dachhauben . Bei Fiamma hei\u00dfen sie Turbo Vent und Turbo Vent Premium, passen in Dachlukenausschnitte von 36 mal 36 und 40 mal 40 Zentimeter Gr\u00f6\u00dfe und verf\u00fcgen \u00fcber zwei Laufrichtungen sowie stufenlose Drehzahlregelung. Damit kann k\u00fchle Au\u00dfenluft zu- oder hei\u00dfe Innenluft abgef\u00fchrt werden. Beim Luftverkehr von drinnen nach drau\u00dfen dienen Ventilator-Dachhauben je nach Einbaulage auch als Dunstabzug f\u00fcr K\u00fcche oder Bad. Hier gibt es noch mehr Informationen \u00fcber Ventilatoren f\u00fcrs Camping. Hier gibt es die Fiamma-Ventilator-Dachhauben in unserem Partnershop Fritz Berger. Ebenfalls erh\u00e4ltlich ist der Universal-Ventilator Fritz Berger Turbo-Kit, der mit Querstreben unter herk\u00f6mmlichen Dachhauben montiert werden kann. Seinen Strom bezieht er \u00fcber eine handwerklich aufwendige Verkabelung mit dem Bordnetz oder acht 1,5-Volt-Batterien. Nat\u00fcrlich funktioniert auch jeder normale Tischventilator . Dagegen sprechen jedoch der Platzbedarf, den er im Wohnmobil und beim Transport beansprucht, und dass ein Kabel durch den Raum f\u00fchrt. Schatten suchen Effektiver Hitzeschutz f\u00e4ngt au\u00dfen an. Die simpelste L\u00f6sung hei\u00dft: Einen schattigen Stellplatz unter B\u00e4umen suchen. In die dunkle R\u00f6hre schaut dann nur der, der seine Satellitensch\u00fcssel fest auf dem Dach montiert hat. Wer h\u00e4ufig hei\u00dfe Regionen aufsucht und trotzdem nicht aufs Fernsehen verzichten mag, greift besser zu transportablen Sat-Sch\u00fcsseln. Oder hat einfach einen Router dabei und streamt das Fernseh-Programm. Hier finden Sie mehr zum Thema Internet im Reisemobil: Aktuelle Router haben wir hier getestet. Noch mehr dazu gibt es hier: Router f\u00fcr unterwegs. Aber auch das Bier bleibt auf Schattenpl\u00e4tzen l\u00e4nger k\u00fchl, weil Absorberk\u00fchlschr\u00e4nke systembedingt nur 30 Grad Celsius unter die Au\u00dfentemperatur kommen. Knallt die Sonne durch die Abluftgitter auf die K\u00fchlschrankr\u00fcckseite, kann es kritisch werden. Spezielle 12-Volt- K\u00fchlschrankventilatoren mildern oder beheben dieses Problem. Sowohl Dometic als auch Thetford haben einbaufertige Ventilator-Sets f\u00fcr rund 45 bzw. 53 Euro im Programm. Hier k\u00f6nnen Sie solche Ventilatoren direkt bei unserem Partnershop Fritz Berger bestellen. Markise Selbst auf dem lauschigsten Schattenplatz scheint irgendwann die Sonne. Dann schl\u00e4gt die Stunde von Markise und Sonnendach. Planen mit UV-Blocker sch\u00fctzen Haut und Fahrzeug. Eine vom textilen Vordach beschattete Seitenwand bleibt deutlich k\u00fchler als eine direkt bestrahlte. Das Angebot an Markisen ist enorm. Es reicht vom einfachen Sonnensegel (ab ca. 180 Euro) \u00fcber in die Kederleiste eingezogene Sackmarkisen , die von Hand entrollt und aufgestellt werden m\u00fcssen, bis zu klassischen Kassettenmarkisen , die per Handkurbel oder elektrisch ausfahren. Viele Sack- und Kassettenmarkisen lassen sich durch Front- und Seitenteile zu Windf\u00e4ngen und geschlossenen Vorzelten erweitern \u2013 eine variable L\u00f6sung f\u00fcr die meisten Eins\u00e4tze mit Ausnahme von extremem Wintercamping. Sonnensegel k\u00f6nnen Sie hier bei unserem Partnershop Fritz Berger direkt bestellen. Tipps und alles rund ums Thema Markise finden Sie hier. Bel\u00fcftete Sitzmatte Wer keine Klimaanlage f\u00fcrs Fahrerhaus hat, kann w\u00e4hrend der Fahrt zwar das Fenster einen Spalt \u00f6ffnen. Allerdings riskiert man damit im schlimmsten Fall, sich durch den kalten Luftstrom im Nacken einen \"Zug\" zu holen, eine Muskelverspannung. Eine nachr\u00fcstbare Alternative f\u00fcr lange Strecken bei praller Sonne ist eine bel\u00fcftete Sitzauflage. Diese k\u00fchlenden Sitzmatten tragen an mehreren Stellen im Polster einen Luftauslass. Matten wie die von Westfalia werden via 12-Volt-Anschluss betrieben. K\u00fchlmatten Ganz ohne Strom funktionieren K\u00fchlmatten, die es ebenfalls f\u00fcr die Sitze gibt, aber f\u00fcrs Bett. Gehen die Temperaturen auch nachts nicht in den Keller, k\u00f6nnte beispielsweise die Freshmat von Wiegel f\u00fcr Linderung sorgen. Die K\u00fchlkissen, die es als 30 mal 40 Zentimeter gro\u00dfe Sitz- sowie als 90 mal 90 Zentimeter gro\u00dfe faltbare Matratzenauflage gibt, haben einen Gelkern, der bei Druck K\u00fchle erzeugt. Sobald Druck fehlt, regeneriert sich das Gel ohne Strom- oder K\u00e4ltezufuhr. Die Matten gibt es auch f\u00fcr das Haustier. K\u00fchlmatten f\u00fcr Haustiere gibt es hier bei Fritz Berger. Hier gibt es verschiedene K\u00fchlmatten bei Amazon. Schutzfarbe Der Aufbau des Wohnmobils bleibt durch einen UV-Schutzanstrich auf dem Dach k\u00fchler, beispielsweise von der Marke Cooldry. Die Dispersionsfarbe enth\u00e4lt Reflexionskomponenten, die bis zu 90 Prozent der Sonnenenergie reflektieren sollen. Des Weiteren gibt der Hersteller an, dass sich die Oberfl\u00e4chentemperatur des nach dem Anstrich mattwei\u00dfen oder -beigen Dachs bei direkter Sonnenbestrahlung bei Tests von 45,4 auf 31,4 Grad reduziert. Die Schutzfarbe kann direkt auf das lackierte Blech bzw. GFK aufgetragen werden. Der Originallack kann, muss aber nicht angeschliffen werden. Laut Hersteller gen\u00fcgt ein Liter Cooldry f\u00fcr ca. 1,5 m\u00b2 bei zwei Schichten. Das hei\u00dft: zehn Liter reichen f\u00fcr ca. 15 m\u00b2, der Literpreis liegt aktuell bei rund 20,40 Euro. Nach rund einer Stunde klebt der Schutzanstrich nicht mehr, nach zw\u00f6lf bis 16 Stunden kann eine zweite Schicht aufgetragen werden. Klimaanlagen Klimaanlagen sind die Hightech-Ger\u00e4te gegen Hitze. Die Anlagen unterscheiden sich durch ihre Wirkungsweise und den Einbauort. Die effektivste K\u00fchlung, jedoch unter intensivem Einsatz von 230-Volt-Strom, versprechen Kompressor-Klimaanlagen . Diese gibt es f\u00fcr die Montage auf dem Dach in einem Dachlukenausschnitt von 40 mal 40 Zentimeter Gr\u00f6\u00dfe. Unsere gro\u00dfe Kaufberatung mit Markt\u00fcbersicht zum Thema Klimaanalgen finden Sie hier. Die wichtigsten Hersteller von Dachklimaanlagen mit 1100 bis 3200 Watt K\u00fchlleistung sind Dometic, Truma, Telair und Coleman. Eine Sonderform der Kompressor-Anlage ist die Saphir-Baureihe von Truma f\u00fcr den Einbau im Fahrzeug. Sie findet Platz im Doppelboden oder in einem anderen Staufach. Alle Kompressor-Klimaanlagen haben \u00e4hnliche Nachteile: Ger\u00e4uschloser Betrieb ist nicht m\u00f6glich \u2013 sowohl innen als auch au\u00dfen ist stets ein leichtes Brummen vernehmbar. Au\u00dferdem wiegen die Ger\u00e4te zwischen 18 und 24 Kilogramm und brauchen Landstrom. Wer autark stehen m\u00f6chte, muss einen Generator an Bord haben, der ebenfalls teuer ist, Energie verbraucht und Ger\u00e4usche emittiert. Ohne Kompressor und deshalb mit 12 Volt kommt die Verdunster-Klimaanlage Ebercool von Ebersp\u00e4cher zurecht. Das 25 Kilogramm schwere Dachger\u00e4t verdampft zwischen einem und drei Liter Wasser pro Stunde, um die Luft um etwas mehr als zehn Grad Celsius im Verh\u00e4ltnis zur Au\u00dfentemperatur abzuk\u00fchlen und in den Innenraum zu blasen. Grunds\u00e4tzlich sind Dachklimaanlagen leichter nachzur\u00fcsten als Exemplare f\u00fcr den Einbau innen. Noch mehr Tipps Drau\u00dfen kochen Wer an hei\u00dfen Tagen die K\u00fcche nach drau\u00dfen verlegt, heizt das Wohnmobil nicht noch zus\u00e4tzlich auf. Salate oder kalte Gerichte funktionieren nat\u00fcrlich ohne Herd, man kann aber auch die K\u00fcche nach drau\u00dfen verlegen. Dazu ist es praktisch einen Gaskocher f\u00fcr drau\u00dfen dabeizuhaben. Unsere KollegInnen haben erst k\u00fcrzlich verschiedene Modelle getestet, die sich f\u00fcr die Au\u00dfenk\u00fcche eignen. Hier finden Sie alle Modelle und den ganzen Test. Erfrischungen Nat\u00fcrlich gilt beim Campingurlaub wie auch sonst an hei\u00dfen Tagen, immer genug trinken! Wer sich schon beim Cremen abk\u00fchlen will, kann die Sonnencreme in den K\u00fchlschrank stellen. Frische bringt zu Beispiel auch ein Bodyspray mit Pfefferminz\u00f6l oder einfach eine Spr\u00fchflasche mit Wasser.", + "tags": [], + "status": "Online", + "link": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1918478.jpg", + "alt": "Abk\u00fchlung bei Hitze im Wohnmobil", + "caption": "Abk\u00fchlung bei Hitze im Wohnmobil", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1090711.jpg", + "alt": "Thema des Monats: Schutz gegen Sommerhitze", + "caption": "Thema des Monats: Schutz gegen Sommerhitze", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1036072.jpg", + "alt": "Ratgeber: Schutz gegen Sommerhitze", + "caption": "Ratgeber: Schutz gegen Sommerhitze", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1036092.jpg", + "alt": "Ratgeber: Schutz gegen Sommerhitze", + "caption": "Ratgeber: Schutz gegen Sommerhitze", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1090704.jpg", + "alt": "Thema des Monats: Schutz gegen Sommerhitze", + "caption": "Thema des Monats: Schutz gegen Sommerhitze", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1900143.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2033268.jpg", + "alt": "Klimaanlage Zubehoer f", + "caption": "Klimaanlage Zubehoer f", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1986977.jpg", + "alt": "Klimaanlage von Dometic? - K\u00fchlen", + "caption": "Klimaanlage von Dometic? - K\u00fchlen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1013077.jpg", + "alt": "Dachklimaanlagen im Test", + "caption": "Dachklimaanlagen im Test", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1025681.jpg", + "alt": "Im Sommer schwitzen die hinteren Passagiere oft.", + "caption": "Im Sommer schwitzen die hinteren Passagiere oft.", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1027262.jpg", + "alt": "Tablet", + "caption": "Tablet", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1052520.jpg", + "alt": "Zubeh\u00f6rspezialist Truma bietet neue Dachklimaanlage Aventa comfort mit speziellem Dichtkonzept an", + "caption": "Zubeh\u00f6rspezialist Truma bietet neue Dachklimaanlage Aventa comfort mit speziellem Dichtkonzept an", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/", + "title": "Dethleffs Reiselust-Pr\u00e4mie: Bis zu 20.000 Euro Rabatt auf Wohnmobile", + "date": "Sat, 28 Jun 2025 12:00:00 +0200", + "summary": "

Dethleffs geht in die Rabattschlacht: bis zu 10.000 Euro Rabatt auf Neufahrzeuge und bis zu 20.000 Euro auf junge Gebrauchte!

", + "text": "Dethleffs startet eine attraktive Rabattaktion und bietet K\u00e4ufern bis zu 20.000 Euro Preisvorteil auf junge gebrauchte Wohnmobile und Campingbusse und bis zu 10.000 Euro auf neue. Mit der \"Reiselust-Pr\u00e4mie\" sorgt der Hersteller daf\u00fcr, dass der Traum vom eigenen Fahrzeug f\u00fcr viele Camper noch greifbarer wird. Vor allem zeitnah: Denn die Rabatte gelten nur f\u00fcr Fahrzeuge, die bereits produziert sind und schon in den H\u00f6fen der H\u00e4ndler stehen. Wer zugreift, spart bis zum 31. Juli 2025 \u2013 eine Gelegenheit, die sich viele nicht entgehen lassen sollten. Reiselust-Pr\u00e4mie f\u00fcr Neufahrzeuge und junge Gebrauchte Das Angebot gilt nur f\u00fcr ausgew\u00e4hlte Modelle, und die Rabatth\u00f6he ist abh\u00e4ngig vom Modelljahr. Besonders hervorzuheben ist, dass auch junge Gebrauchtfahrzeuge Teil der Aktion sind. Diese M\u00f6glichkeit ist besonders f\u00fcr Camper von Interesse, die ein nahezu neues Fahrzeug zu einem deutlich g\u00fcnstigeren Preis erwerben m\u00f6chten. Zu den rabattierten Fahrzeugen geh\u00f6rt etwa der Dethleffs Trend , der f\u00fcr seine Kombination aus modernem Design und cleverem Komfort bekannt ist. Als Integrierter (Trend I ) oder Teilintegrierter (Trend T ) mit \"Reiselust-Pr\u00e4mie\" erh\u00e4ltlich, bietet das Wohnmobil alles, was das Herz eines Camper-Fans h\u00f6her schlagen l\u00e4sst \u2013 vom gro\u00dfz\u00fcgigen Wohnraum bis zu praktischen Details f\u00fcr den Alltag unterwegs. K\u00e4uferinnen und K\u00e4ufer k\u00f6nnen beim Kauf des Bestsellers direkt vom Hof eines H\u00e4ndlers bis zu 6.000 Euro sparen. Auch der Dethleffs Just Camp ist Teil der Rabattaktion. Kompakt, modern und preislich fair, ist dieses Wohnmobil perfekt f\u00fcr Einsteiger und alle, die unkompliziert und ohne viel Aufwand losfahren m\u00f6chten. Wer sich f\u00fcr ein neues Modell entscheidet, profitiert von bis zu 6.000 Euro Rabatt. Die Rabatte f\u00fcr neue aufgebaute Wohnmobile sind jeweils gestaffelt: Modelljahr 2023: 6.000 Euro Modelljahr 2024: 4.000 Euro Modelljahr 2025: 2.000 Euro Bis zu 10.000 Euro Rabatt bekommen Camperinnen und Camper auf neue Globetrail Campingbusse . Auch hier gibt es wieder eine Staffelung: Modelljahr 2023: 10.000 Euro Modelljahr 2024: 8.000 Euro Modelljahr 2025: 6.000 Euro F\u00fcr Gebrauchtfahrzeuge der Baujahre 2022 bis 2025 gibt es ebenfalls hohe Rabatte, die aber an bestimmte Fahrzeuge gebunden sind. Globetrail (ausgenommen Globetrail Performance), Globebus (ausgenommen Active), Just (ausgenommen Active): je 8.000 Euro Pr\u00e4mie Trend (ausgenommen Alkoven): 10.000 Euro Pr\u00e4mie Esprit : 15.000 Euro Pr\u00e4mie Globetrotter XLI & XXL A: je 20.000 Euro Pr\u00e4mie Vorteile der Aktion f\u00fcr Camper Warum gerade jetzt ein Dethleffs Wohnmobil oder Campervan? Die Antwort ist einfach: Die \"Reiselust-Pr\u00e4mie\" macht den Kauf eines neuen oder jungen gebrauchten Fahrzeugs attraktiver denn je. Wer ein Wohnmobil oder einen Campervan von Dethleffs ins Auge fasst, spart nicht nur durch den Rabatt, sondern erh\u00e4lt auch ein Fahrzeug, das mit guter Qualit\u00e4t und praktischen Funktionen \u00fcberzeugt. F\u00fcr all diejenigen, die sich von den Fahrzeugen pers\u00f6nlich \u00fcberzeugen m\u00f6chten, bieten Dethleffs' Handelspartner zahlreiche Hausmessen an. Hier k\u00f6nnen Interessierte die Fahrzeuge anschauen. Die genaue Liste der Veranstaltungen und Termine ist online einsehbar. Alternativ k\u00f6nnen Kunden online einen Termin bei einem H\u00e4ndler in der N\u00e4he anfragen, bei dem Rabatt-Modelle verf\u00fcgbar sind. Einschr\u00e4nkungen und Details zur Aktion Die \"Reiselust-Pr\u00e4mie\" gilt nur bis zum 31. Juli 2025 und nur f\u00fcr Fahrzeuge, die bei teilnehmenden H\u00e4ndlern jetzt schon verf\u00fcgbar sind \u2013 nicht auf Neubestellungen. Wer sich also f\u00fcr ein Modell interessiert, sollte nicht zu lange warten. Das Angebot gilt, solange der Vorrat reicht. Dethleffs schafft Platz f\u00fcr Neuheiten Von der Rabattaktion profitieren die Kunden. Sie schafft auf den H\u00f6fen der H\u00e4ndler nebenbei Platz f\u00fcr Neuheiten und hilft den Betrieben aus der Krise. Denn die Branche hat bedingt durch eine deutliche \u00dcberproduktion und anziehende Absatzschwierigkeiten mit einem \u00dcberbestand zu k\u00e4mpfen, der das Kapital der Handelsbetriebe bindet und die ihre Gewinne mindert.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2083933.jpg", + "alt": "Dethleffs Trend i", + "caption": "Dethleffs Trend i", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2087105.jpg", + "alt": "Dethleffs Trend T (2024)", + "caption": "Dethleffs Trend T (2024)", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2071456.jpg", + "alt": "Dethleffs Trend I 7057 EBL (2024) f", + "caption": "Dethleffs Trend I 7057 EBL (2024) f", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1819971.jpg", + "alt": "Dethleffs Globetrotter XLI (2022)", + "caption": "Dethleffs Globetrotter XLI (2022)", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/", + "title": "Der neue promobil-Newsletter - gratis!: Zum Fr\u00fchst\u00fcck die spannendsten Camping-Themen", + "date": "Fri, 27 Jun 2025 13:00:00 +0200", + "summary": "

Den promobil-Newsletter gibt es ab sofort auch Samstagmorgens: Zum Fr\u00fchst\u00fcck servieren wir die frischesten Camping-News.

", + "text": "Melden Sie sich f\u00fcr unseren gratis promobil-Newsletter an und verpassen Sie keine Neuigkeiten mehr. Jetzt sogar zwei Mal die Woche. Warum? Weil wir nicht wollen, dass Sie etwas verpassen. +++ Hier zum Newsletter anmelden .+++ Mehr Reisetipps, Zubeh\u00f6r-Highlights und Wohnmobil-Neuheiten \u2013 direkt ins Postfach Camping ist mehr als ein Hobby \u2013 es ist eine Leidenschaft. Wer unterwegs ist, plant, umbaut oder tr\u00e4umt, braucht vor allem eines: aktuelle Infos, die wirklich weiterhelfen. Genau deshalb gibt\u2019s den promobil-Newsletter \u2013 und jetzt sogar zweimal pro Woche! Neu: Ihr Samstags-Update zum Fr\u00fchst\u00fcck Ab dem 5. Juli 2025 schicken wir Ihnen den promobil-Newsletter zus\u00e4tzlich samstags um 9 Uhr \u2013 p\u00fcnktlich zum ersten Kaffee. Warum? Weil wir jede Woche so viele spannende Themen haben, dass ein einziger Newsletter einfach nicht mehr reicht. Modellneuheiten, clevere Techniktrends, Zubeh\u00f6r, das den Camping-Alltag leichter macht \u2013 dazu Ratgeber, Tourentipps und Stellplatz-Geheimtipps aus der Redaktion. Wohin am Wochenende? Was ist neu auf dem Markt? Wir liefern Antworten. Mit dem neuen Samstags-Newsletter bleiben Sie am Puls der Camping-Welt. Egal, ob Sie Ihre erste Reise planen oder schon seit Jahren unterwegs sind \u2013 unsere Inhalte richten sich an alle, die Camping leben. Kuratiert von der promobil-Redaktion, geschrieben mit Blick auf die Praxis. Doppelt informiert, doppelt inspiriert Unsere Newsletter-Abonnentinnen und -Abonennten bekommen jetzt mittwochs und samstags alles Wichtige aus der Welt der Wohnmobile, Vans und Campingpl\u00e4tze \u2013 ohne langes Suchen, ohne Umwege. So starten Sie nicht nur bestens informiert in die Woche, sondern auch mit frischer Inspiration ins Wochenende . Jetzt anmelden und dabei sein Ob im Camper, zu Hause oder auf der Suche nach der n\u00e4chsten Idee \u2013 der promobil-Newsletter liefert, was z\u00e4hlt. Jetzt einfach anmelden und keinen Reisetipp, kein neues Zubeh\u00f6r und keine spannende Story mehr verpassen! Hier f\u00fcr den promobil-Newsletter anmelden . \u00dcbrigens k\u00f6nnen Sie nicht nur den promobil-Newsletter mit allen Themen rund um Wohnmobile abonnieren, sondern auch den CARAVANING-Newsletter mit allen Infos rund um Wohnwagen und Zugfahrzeug. Jede Woche die neuesten Caravans, Zugfahrzeugtests sowie n\u00fctzliches Zubeh\u00f6r, Campingplatz-Tipps und die aktuellen Ratgeber f\u00fcr die Pflege und Optimierung Ihres eigenen Wohnwagens \u2013 hier finden Sie alle News! Damit Sie alle spannenden Artikel lesen k\u00f6nnen und Ihnen nichts vorenthalten bleibt, schlie\u00dfen Sie gleich unser Plus-Abo mit ab. Die neuesten Insider-Informationen rund um neue Wohnmobile, ausf\u00fchrliche Ratgeber f\u00fcr Ihr liebstes Gef\u00e4hrt zu Hause oder die besten getesteten Stellpl\u00e4tze schalten Sie mit einem promobil-Plus-Abo frei. Hier das promobil-Plus-Abo abschlie\u00dfen .", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2217158.jpg", + "alt": "adult couple making a video call with their iPad in a camper van", + "caption": "adult couple making a video call with their iPad in a camper van", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/", + "title": "Drittes Camping-Rekordjahr in Folge: S\u00fcd schl\u00e4gt Nord \u2013 Hier wird am h\u00e4ufigsten gecampt", + "date": "Tue, 24 Jun 2025 14:00:00 +0200", + "summary": "

Camping ist weiterhin im Trend: 2024 stieg die Zahl der Camping\u00fcbernachtungen in Deutschland im Vergleich zum Vorjahr. Doch wo campt man am h\u00e4ufigsten?

", + "text": "Die aktuellen \u00dcbernachtungszahlen aus dem vergangenen Jahr zeigen: Campingtourismus boomt weiterhin! Die deutsche Campingbranche verzeichnete im vergangenen Jahr einen Zuwachs. Mit 42,9 Millionen \u00dcbernachtungen z\u00e4hlt der Urlaub auf Campingpl\u00e4tzen zu den am st\u00e4rksten wachsenden Segmenten in der deutschen Tourismusbranche. Fast jede zw\u00f6lfte (8,6 %) der insgesamt 496,0 Millionen G\u00e4ste\u00fcbernachtungen im Jahr 2024 fand auf einem Campingplatz statt. Das sind die beliebtesten Bundesl\u00e4nder f\u00fcr Camping Wir berichteten bereits \u00fcber die beliebtesten deutschen Regionen 2024 f\u00fcr Campingurlaub . Sehr aufschlussreich ist der Blick auf die beliebtesten Bundesl\u00e4nder f\u00fcr Camping \u2013 dort ist seit vielen Jahren Bayern der ungeschlagene Camping-Champion. 2024 z\u00e4hlte das Bundesland mit \u00fcber 8,3 Millionen die meisten Camping\u00fcbernachtungen in ganz Deutschland. Insgesamt stieg die Anzahl um 1,3 Prozent. Die beliebteste bayerische Campingregion ist \u00fcbrigens das Allg\u00e4u \u2013 doch auch im Bayerischen Wald oder im Fr\u00e4nkischen Seenland lohnt sich ein Besuch. Auf Platz 2 h\u00e4lt sich das Bundesland Niedersachsen mit \u00fcber 6 Millionen Camping\u00fcbernachtungen. Das Bundesland im Norden trendet dabei mehr als Bayern und kann 5,1 Prozent im Vergleich zum Vorjahr dazugewinnen. Die beliebteste Region hier ist nat\u00fcrlich die Nordseek\u00fcste. Doch auch das Harz, die L\u00fcneburger Heide oder das Weserbergland haben ihren ganz eigenen Reiz. Ganz neu auf Platz 3 kommt 2024 das Bundesland Mecklenburg-Vorpommern , da Schleswig-Holstein (-2,3 Prozent) auf Platz 5 absteigt. Das Bundesland im Osten gewinnt 1,9 Prozent dazu und z\u00e4hlt insgesamt 5,53 Millionen Camping\u00fcbernachtungen. Die beliebteste Campingregion in Meck-Pomm ist die Ostseek\u00fcste \u2013 doch auch die Mecklenburgische Seenplatte hat viele Fans. Platz 4 geht an Baden-W\u00fcrttemberg mit 5,41 Millionen Camping\u00fcbernachtungen und einem kleinen Minus von 0,1 Prozent. Der Schwarzwald ist hier der gr\u00f6\u00dfte Camping-Magnet. Top-Campingpl\u00e4tze in den Top 3 Bundesl\u00e4ndern Bleibt die Frage: Welcher Campingplatz ist in den Top 3 Camping-Bundesl\u00e4ndern besonders beliebt? Auf Camping.info haben wir die bestbewerteten Campingpl\u00e4tze der Top 3 Bundesl\u00e4nder herausgefiltert. Voraussetzung: Mehr als 1.000 Bewertungen. Bayern: Campingplatz Demmelhof in Bad T\u00f6lz Ruhe am Alpenrand bietet der Campingplatz Demmelhof. Er liegt idyllisch in der Region Bad T\u00f6lz-Wolfratshausen. Mit seinen gro\u00dfz\u00fcgigen Stellpl\u00e4tzen und modernen Sanit\u00e4ranlagen ist er besonders f\u00fcr Familien und Naturfreunde geeignet. Freizeiteinrichtungen wie ein gro\u00dfz\u00fcgiger Spielplatz und Wanderm\u00f6glichkeiten in den umliegenden Bergen machen ihn zu einem idealen Ausgangspunkt f\u00fcr Outdoor-Aktivit\u00e4ten. Die j\u00fcngste Bewertung in der Stellplatz-Radar-App beschreibt den Platz wie folgt: \"Sehr ehrlicher und menschlicher Bauernhof-Campingplatz mit toller zentraler Lage. Der See war eine willkommene Abk\u00fchlung.\" Niedersachsen: Campingplatz S\u00fcdheide in Winsen Inmitten der malerischen S\u00fcdheide bei Winsen (Luhe) gelegen, \u00fcberzeugt dieser Campingplatz mit seiner naturnahen Atmosph\u00e4re. Der Platz bietet gro\u00dfz\u00fcgige Stellfl\u00e4chen und moderne Einrichtungen f\u00fcr Camper und hat sich besonders als familienfreundlich etabliert. Ein umfangreiches Freizeitangebot mit Rad- und Wanderrouten sowie einem Pool sorgt f\u00fcr abwechslungsreiche Erholung. Eine Bewertung aus dem Stellplatz-Radar lautet: \"Sehr sch\u00f6ner Campingplatz mit neuem Sanit\u00e4rgeb\u00e4ude, sehr gepflegt und sauber. Toller Naturschwimmteich.\" Mecklenburg-Vorpommern: Campingpark K\u00fchlungsborn Direkt an der Ostsee in K\u00fchlungsborn gelegen, besticht dieser Campingplatz durch seine N\u00e4he zum Strand und die vielf\u00e4ltigen Freizeitm\u00f6glichkeiten. Der Campingpark ist ideal f\u00fcr einen aktiven Strandurlaub. Daf\u00fcr sorgt eine breite Auswahl an sportlichen Aktivit\u00e4ten wie Surfen und Beachvolleyball. Die Anlage ist gro\u00dfz\u00fcgig, genauso wie die Stellpl\u00e4tze f\u00fcr Wohnmobile und Zelte. Zur Ausstattung geh\u00f6ren moderne Sanit\u00e4ranlagen und ein Restaurant. Im Stellplatz-Radar schreibt im User: \"Luxus Campingplatz mit dementsprechendem Preis. Wer bucht, sollte das wissen. Sehr sauber, problemlose Anreise.\" Dauerbrenner: Camping gewinnt konstant Beliebtheit Die Auswertungen des Portals Camping.info zeigen dar\u00fcber hinaus, dass der Boom dieser Urlaubsform nicht allein ein Corona-Effekt ist. Seit zehn Jahren steigen die \u00dcbernachtungszahlen kontinuierlich und wurden nur 2020 und 2021 durch Corona-Beschr\u00e4nkungen vor\u00fcbergehend gebremst.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2149829.jpg", + "alt": "Bayern, Campingplatz Grafenlehen", + "caption": "Bayern, Campingplatz Grafenlehen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2194877.jpg", + "alt": "Campingtourismus", + "caption": "Campingtourismus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://imgsdb1.promobil.de/image/66e7374674eac60008479824-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://imgsdb1.promobil.de/image/6334afd1fc5fef00087dcca2-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://imgsdb1.promobil.de/image/5d7d0c0ab79f8d08001e5b92-websiteListThumb.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2194876.jpg", + "alt": "Campingtourismus", + "caption": "Campingtourismus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/", + "title": "Wohnmobil-Handel treibt Vorzelt-Profi in Insolvenz: Camping-Ausr\u00fcster Herzog beantragt Insolvenz", + "date": "Mon, 23 Jun 2025 14:00:00 +0200", + "summary": "

Herzog, einer der f\u00fchrenden Vorzelthersteller, k\u00e4mpft mit der Insolvenz. Dabei schw\u00e4chelt auch der angeschlossene Wohnmobil- und Wohnwagenhandel. Ein Lehrst\u00fcck \u00fcber die aktuellen T\u00fccken des Caravaning-Marktes.

", + "text": "Der Vorzelthersteller und Caravaning-H\u00e4ndler Herzog ist insolvent. Laut einer Pressemitteilung arbeitet das Unternehmen gemeinsam mit Insolvenzverwalter Holger Bl\u00fcmle von der Kanzlei Schultze und Braun an einer tragf\u00e4higen Sanierung. In Kirchheim am Neckar, 40 Kilometer n\u00f6rdlich von Stuttgart, steht nicht nur ein Traditionsunternehmen vor gro\u00dfen wirtschaftlichen Problemen \u2013 sondern ein exemplarisches Gesch\u00e4ftsmodell. Die Insolvenz von Herzog zeigt, wie problematisch die Marktbedingungen f\u00fcr die H\u00e4ndler in der Caravaning-Branche unter den derzeitigen Bedingungen sind. Das Zwei-S\u00e4ulen-Modell steht unter Druck Herzog ist eine der Top-Adressen Deutschlands f\u00fcr die Produktion ma\u00dfgefertigter Vorzelte. Parallel dazu wurde \u00fcber Jahre ein Handelsbereich mit Wohnwagen, Campingbussen und Wohnmobilen mit angeschlossener Werkstatt aufgebaut. Die Marken: Fendt, Knaus, Tabbert, Weinsberg. Doch genau dieses Gesch\u00e4ftsmodell, das Produktion von Vorzelten und Handel von Campingfahrzeugen vereint, wurde Herzog zum Verh\u00e4ngnis. Anders als bei Kommissionsmodellen kaufen H\u00e4ndler Wohnmobile und Wohnwagen vom Hersteller \u2013 auf eigenes Risiko. Ausgel\u00f6st vom Pandemie-Boom entstand ein Nachfragestau. Die Hersteller kamen mit der Auslieferung nicht hinterher und drehten deshalb ihre Produktions-Kapazit\u00e4ten deutlich hoch. Nach der Pandemie legte sich der Kaufrausch. Die Lebenshaltungskosten erh\u00f6hen sich, die Preise steigen. Die Kundinnen und Kunden nehmen weniger Wohnmobile und Wohnwagen ab, als die Hersteller produzieren und die Handelsbetriebe geordert haben. Die Folge: Viele H\u00e4ndler bleiben auf den Wohnwagen und Wohnmobilen und ihren Finanzierungskosten sitzen, was Liquidit\u00e4t bindet. Gegen\u00fcber der Stuttgarter Zeitung skizzierte Ingo Schorlemmer, Pressesprecher von Schultze und Braun, diese Marktbedingungen als Kernproblem der Branche. Denn sie treiben nicht nur Herzog in Probleme. In den vergangenen Monaten mussten mehrere Caravaning-H\u00e4ndler Insolvenz anmelden oder den Betrieb einstellen . Vorzeltproduktion l\u00e4ngst gedrosselt Mit den Absatzproblemen am Fahrzeugmarkt gingen die Verkaufszahlen von Vorzelten zur\u00fcck. Parallel stiegen die Materialpreise f\u00fcr die hauseigene Zeltproduktion. Schon lange bevor das Insolvenzverfahren eingeleitet wurde, hatte Herzog begonnen, auf die ver\u00e4nderten Marktbedingungen zu reagieren. \"Wir haben schon fr\u00fch damit begonnen, unsere Produktionskapazit\u00e4ten und -prozesse an die ver\u00e4nderten Rahmenbedingungen anzupassen\", erkl\u00e4rt Gesch\u00e4ftsf\u00fchrer Erich Eugen Herzog. Produktionsmengen wurden gestrafft, Abl\u00e4ufe optimiert, alternative Auftr\u00e4ge akquiriert. Auch im Vertrieb setzte Herzog verst\u00e4rkt auf Direktvermarktung und digitale Kan\u00e4le. Dennoch gelang es nicht, die entstandene L\u00fccke in der Auslastung vollst\u00e4ndig zu schlie\u00dfen. Das Unternehmen hat also nicht abgewartet \u2013 sondern gehandelt. Doch die strukturellen Belastungen im Markt waren st\u00e4rker. \"Die Kombination aus Herausforderungen war und ist auch f\u00fcr uns als vorsichtig planendes und agierendes Familienunternehmen \u00fcber einen Zeitraum von inzwischen \u00fcber drei Jahren nicht durchzuhalten\", so Herzog. Das Insolvenzverfahren l\u00e4uft seit Mitte Juni 2025. Herzog f\u00fchrt den Gesch\u00e4ftsbetrieb derzeit regul\u00e4r fort. Die Geh\u00e4lter der Mitarbeitenden sind durch das Insolvenzgeld \u00fcber drei Monate gedeckt. Investoren gesucht Der Insolvenzverwalter Holger Bl\u00fcmle pr\u00fcft derzeit gemeinsam mit der Gesch\u00e4ftsf\u00fchrung Sanierungsoptionen. Das Unternehmen soll unter Mitwirkung der Familie Herzog zukunftsf\u00e4hig aufgestellt werden, um m\u00f6glichst viele Arbeitspl\u00e4tze zu erhalten. Die Neuausrichtung soll insbesondere die St\u00e4rken des Unternehmens nutzen: ma\u00dfgeschneiderte Zeltl\u00f6sungen, ISO-zertifizierte Produktion und einen starken Servicefokus. Zusammen mit den Eigent\u00fcmern und der Unternehmensberatung sucht der Insolvenzverwalter nach Investoren, die in das bestehende Unternehmen einsteigen wolle oder es in ihre Unternehmensgruppe eingliedern m\u00f6chten. Bisher seien die R\u00fcckmeldungen durchweg positiv, hei\u00dft es in der Pressemitteilung der Kanzlei Schulze und Braun. \"Wir werden aber auch noch weitere potenzielle Kandidaten ansprechen. Interessenten f\u00fcr einen Einstieg k\u00f6nnen sich gerne bei mir melden. Der Prozess ist offen f\u00fcr alle ernsthaften Investoren\", sagt Bl\u00fcmel. Was Camper zur Insolvenz wissen m\u00fcssen F\u00fcr Kunden \u00e4ndert sich vorerst wenig. Serviceleistungen bleiben bestehen, Lieferketten sind gesichert. Bestellungen \u00fcber den Online-Shop sind m\u00f6glich, Service und Werkstatt bleiben aktiv. Wer gerade \u00fcber einen Vorzeltkauf oder eine Reparatur nachdenkt, kann das weiterhin mit gutem Gewissen bei Herzog tun. Herzog: Kurze Firmenhistorie Herzog entstand 1902 als Hersteller von Pferdedecken und Rucks\u00e4cken, verlagerte seinen Schwerpunkt mit der Zeit auf Vorzelte f\u00fcr Wohnwagen und Wohnmobile. In diesem Segment geh\u00f6rt das Familienunternehmen zu den Marktf\u00fchrern in Europa. \"Wir produzieren auf \u00fcber 16.000 m\u00b2 mit einem hochmodernen Maschinenpark\", sagt Gesch\u00e4ftsf\u00fchrer Erich Eugen Herzog. Das Unternehmen ist bekannt f\u00fcr seine flexiblen Zeltl\u00f6sungen \u2013 auch als Ma\u00dfanfertigung. Abgerundet wird das umfassende Produktportfolio im Shop von Herzog durch ein breites Camping-, Trekking-, Freizeit- und Outdoor-Sortiment anderer Hersteller.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1090697.jpg", + "alt": "Thema des Monats: Schutz gegen Sommerhitze", + "caption": "Thema des Monats: Schutz gegen Sommerhitze", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/", + "title": "Pannen und Probleme im Wohnmobil & Wohnwagen: Erste Hilfe f\u00fcr die Camper-Bordtechnik", + "date": "Sat, 21 Jun 2025 14:00:00 +0200", + "summary": "

Was tun, wenn die Technik streikt? Wir verraten Ihnen, wie Sie Pannen im Wohnmobilurlaub meistern \u2013 mit Tipps f\u00fcr Strom, Wasser, Gas & Co.

", + "text": "Pannen und Probleme im Wohnmobil & Wohnwagen: Erste Hilfe f\u00fcr die Camper-Bordtechnik\n\nCamping kann eine angenehme Weinachtsreise sein, aber man sollte immer f\u00fcr unvorhergesehene Situationen vorbereitet sein. Von leerer Bordbatterie bis hin zur Gasflasche, es kann einige Herausforderungen geben, auf die Camper sto\u00dfen can. Wisse z.B., wie man die Bordbatterie l\u00e4dt und den Zustand der Batterie erkennt. F\u00fchre immer eine Ersatzbatterie mit und pr\u00fcfe in regelm\u00e4\u00dfigen Abst\u00e4nden die Funkion der Sicherungen. Sorge au\u00dferdem daf\u00fcr, da\u00df du die Funkionsweise der Heizung kennst, damit du nicht kalt erwischt wirst, wenn du sie wirklich brauchst.\n\nEbenso ist die Kenntniss \u00fcber deinen K\u00fchlschrank wichtig. Wei\u00dft du, wie man pr\u00fcft, ob Gas oder Strom das Problem ist, wenn der K\u00fchlschrank nicht funktioniert?\n\nEs ist auch wichtig zu wissen, wo und wie man die Gasflaschen austauscht, um einen Gastmangel zu vermeiden. Lerne die verschiedenen Flaschen- und Anschlusstypen kennen, die in den verschiedenen L\u00e4ndern gelten. \n\nIn Sachen Wasser, wei\u00dft du was zu tun ist, wenn kein Wasser aus dem Hahn kommt? Wie kannst du eine defekte Tauchpumpe ersetzen oder eine blockierte Wasserleitung finden?\n\nDenke dar\u00fcber nach, was zu tun ist, wenn die Toilettenkassette voll ist und wie du sie richtig entsorgst. Hast du dar\u00fcber nachgedacht, was zu tun ist, wenn du einen Kratzer oder eine Beule in deinem Wohnmobil hast?\n\nUnd schlie\u00dflich, hast du einen Notfallplan f\u00fcr den Fall eines platten Reifens? Bist du ausger\u00fcstet, um einen Reifen selbst zu wechseln, oder m\u00fcsstest du auf einen Pannendienst warten? Sei bewusst, dass Camping-Urlauber auf einige Probleme sto\u00dfen k\u00f6nnen und sei gut darauf vorbereitet, diese selbst zu l\u00f6sen.", + "tags": [ + "#CampingVorbereitung", + "#WohnmobilTipps", + "#WeihnachtsCamping" + ], + "status": "Trash", + "link": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2215422.jpg", + "alt": "Young couple with broken down van on roadside", + "caption": "Young couple with broken down van on roadside", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/", + "title": "Gotthard, Brenner & Reschenpass: Wo Wohnmobile und Camper heute Geduld brauchen", + "date": "Sat, 21 Jun 2025 11:25:00 +0200", + "summary": "

Am Gotthard ist am Vormittag bereits mit bis zu 50 Minuten Verz\u00f6gerung zu rechnen. San Bernardino lockt als Ausweichroute ohne Baustellen. Am Reschenpass bleibt die Ampelregelung ganzj\u00e4hrig aktiv. F\u00fcr Wohnmobile und Gespanne auf dem Heimweg aus Italien, Kroatien und Co bedeutet das heute Wartezeiten.

", + "text": "Zum Ferienende sind Megastaus leider oft vorgezeichnet. Insbesondere aus dem S\u00fcden, also Italien, Slowenien, Kroatien, kommen an diesem Wochenende tausende Urlauber zur\u00fcck. Engstellen mit Grenzkontrollen, Blockabfertigung am Gotthard und zahlreiche Baustellen \u2013 etwa an der Luegbr\u00fccke auf dem Weg nach \u00d6sterreich zum Brenner \u2013 versch\u00e4rfen die Lage zus\u00e4tzlich. Bereits vergangenes Wochenende und am Feiertag kam es vielerorts zu langen Staus. Staus auf der Gotthard-Route (Schweiz) Heute (am 21.06.2025) m\u00fcssen sich Camperinnen und Camper erneut auf l\u00e4ngere Wartezeiten einstellen. In den kritischen Zonen, insbesondere vor dem Gotthard-Stra\u00dfentunnel , zeigen sich bereits am Morgen erste R\u00fcckstaus. Jetzt am Mittag sind es laut der Verkehrs\u00fcberwachung am Gotthardtunnel (www.gotthard-traffic.ch) bereits 5 Kilometer und bis zu 50 Minuten Wartezeit. Betrachtet man die Webcam Aufnahmen 8 Kilometer vor dem S\u00fcdportal l\u00e4uft der Verkehr jedoch noch gem\u00e4chlich. Erfahrungsgem\u00e4\u00df versch\u00e4rft sich die Lage ab den sp\u00e4ten Vormittagsstunden bis in den sp\u00e4ten Nachmittag hinein deutlich. Neben der Tunnelpassage selbst sorgt auch die Blockabfertigung f\u00fcr Lkw immer wieder f\u00fcr Verz\u00f6gerungen. Reisende weichen bei ersten Anzeichen von Stillstand h\u00e4ufig auf den Gotthardpass aus \u2013 eine landschaftlich reizvolle, aber zeitaufw\u00e4ndige Ausweichroute, die gerade mit Wohnmobilen nur eingeschr\u00e4nkt empfohlen werden kann. Am Pass stauen sich Fahrzeuge regelm\u00e4\u00dfig an engen Baustellenbereichen sowie an den Kreisverkehren und am Bahn\u00fcbergang auf der Nordseite. Alternative: San-Bernardino-Route Als Ausweichm\u00f6glichkeit bietet sich die Route \u00fcber den San-Bernardino-Tunnel (A13) an. Die Strecke ist aktuell ohne gr\u00f6\u00dfere Baustellen und bislang (21.06.2025, 11:19) staufrei befahrbar. Allerdings nutzen immer mehr R\u00fcckreisende diese Option, was im Tagesverlauf zu wachsendem Verkehrsaufkommen f\u00fchren d\u00fcrfte. Wer fr\u00fch startet oder besonders flexibel ist, hat \u00fcber diese Nord-S\u00fcd-Achse durch Graub\u00fcnden eine realistische Chance, gr\u00f6\u00dfere Verz\u00f6gerungen zu vermeiden. Staus auf der Brenner-Route (\u00d6sterreich) Auch auf der Brennerstrecke ist am heutigen Samstag mit massiven R\u00fcckstaus zu rechnen. Bereits fr\u00fchmorgens beginnt in Tirol die Blockabfertigung f\u00fcr Lkw , die regelm\u00e4\u00dfig R\u00fcckstauungen auf der Inntalautobahn (A12) und Brennerautobahn (A13) verursacht. Die Dauerbaustelle an der Luegbr\u00fccke zwischen Innsbruck und dem Brenner bleibt dabei ein neuralgischer Punkt. Immerhin: Im Sommer 2025 greift eine Ausnahmeregelung , die f\u00fcr etwas Entlastung sorgt. Zwischen Juni und Anfang September wird der Verkehr dort zeitweise zweispurig gef\u00fchrt , um den Urlaubsreiseverkehr besser zu bew\u00e4ltigen. Dennoch ist mit R\u00fcckstaus zu rechnen \u2013 vor allem, wenn sich Urlauberstr\u00f6me mit Lkw-Abfertigung \u00fcberlagern. Aktuell (21.06.2025, 11:20) sind auf der Verkehrs\u00fcberwachung des Brenner (www.autobrennero.it) noch keine Staus zu erkennen. F\u00fcr den Nachmittag und den morgigen Sonntag sagt die Verkehrsprognose jedoch starken bis sehr starken Verkehr voraus. Alternative: Reschenpass-Route \u00fcber S\u00fcdtirol Weniger frequentiert, aber landschaftlich reizvoll und aktuell vergleichsweise fl\u00fcssig befahrbar ist die Route \u00fcber den Reschenpass (SS40/B180) . Diese Verbindung f\u00fchrt von S\u00fcdtirol \u00fcber Nauders ins \u00f6sterreichische Inntal \u2013 und weiter zur A12 Richtung Deutschland. Allerdings wird der Verkehr im Bereich der Kanzelgalerie bei Pfunds seit Mai 2025 einspurig per Ampel geregelt \u2013 ganzj\u00e4hrig, auch im Sommer . Eine Ausnahmeregelung, wie sie etwa bei der Luegbr\u00fccke greift, gibt es hier nicht . Die Baustelle bleibt bis Ende 2026 bestehen. Wartezeiten halten sich bislang im Rahmen, k\u00f6nnen aber im Tagesverlauf anwachsen. Eine Umfahrung \u00fcber das Engadin ist f\u00fcr Pkw m\u00f6glich, f\u00fcr gr\u00f6\u00dfere Gespanne allerdings nicht zugelassen. R\u00fcckreise durch S\u00fcddeutschland: A8 und A81 besonders belastet Wer \u00fcber die A8 (Salzburg \u2013 M\u00fcnchen \u2013 Stuttgart) oder die A81 (Singen \u2013 Stuttgart) unterwegs ist, sollte sich ebenfalls auf dichten Verkehr einstellen. Die A8 ist traditionell eine der am st\u00e4rksten belasteten Autobahnen bei R\u00fcckreiseverkehr. Baustellenbereiche und Engstellen, etwa rund um Ulm und bei Pforzheim, wirken sich regelm\u00e4\u00dfig stauversch\u00e4rfend aus. In den Nachmittagsstunden kann es auch auf der A7 (F\u00fcssen \u2013 Ulm \u2013 W\u00fcrzburg) und auf der A96 (Memmingen \u2013 Lindau \u2013 M\u00fcnchen) zu erheblichen Verz\u00f6gerungen kommen, wenn die Urlaubsr\u00fcckkehrer aus dem Allg\u00e4u, Tirol und Vorarlberg zustr\u00f6men.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2215558.jpg", + "alt": "Stau in der Schweiz mit Wohnmobilen und Wohnwagen", + "caption": "Stau in der Schweiz mit Wohnmobilen und Wohnwagen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/", + "title": "Leichtbau in der Caravaning-Industrie: Mit diesen Tricks sparen die Hersteller Gewicht", + "date": "Thu, 19 Jun 2025 14:00:00 +0200", + "summary": "

Ein leichtes Reisemobil schafft Reserven bei der Zuladung und sorgt f\u00fcr einen geringeren Verbrauch. promobil verr\u00e4t, was Hersteller in Sachen Leichtbau unternehmen \u2013 und wo die Grenzen liegen.

", + "text": "Ich packe meine Sachen und nehme mit: die E-Bikes, die Kaffeemaschine, den Grill \u2026 Und die Markise, die Klimaanlage und die Solaranlage d\u00fcrfen nat\u00fcrlich auch nicht fehlen. Gerade in der 3,5-Tonnen-Klasse setzt der Wunsch vieler Reisemobilisten nach \u00fcppiger Zuladung und reichlich Komfort die Hersteller teils heftig unter Druck. Mit einem leichten Auf- und Ausbau sorgen Reisemobilhersteller daf\u00fcr, dass m\u00f6glichst viel Gep\u00e4ck auf Reisen mitgenommen werden kann. Gleichzeitig bringt ein leichtes Mobil weitere Vorteile \u2013 etwa einen geringeren Kraftstoffverbrauch und dadurch eine h\u00f6here Reichweite und weniger CO2-Aussto\u00df. Was unterschiedliche Hersteller beim Thema Leichtbau tun, k\u00f6nnen sie hier liesen. Vanyx: Leichtbau mit viel Carbon Vanyx fertigt edle Kastenwagen-Ausbauten auf Basis des allradgetriebenen MAN TGE. Um die Busse m\u00f6glichst leicht zu halten, setzen die S\u00fcdbadener auf den Werkstoff Carbon \u2013 etwa beim Hochdach. Das ist in Sandwichbauweise gefertigt und wiegt laut Hersteller 89 Kilogramm. Durch den Einsatz von Carbon kann Vanyx nach eigenen Angaben 50 Prozent an Gewicht gegen\u00fcber einem GfK-Hochdach einsparen. Das Dach hat Vanyx gemeinsam mit dem Fraunhofer Institut entwickelt, dort wird das Dach auch hergestellt. Auch beim Ausbau des Campers setzt Vanyx auf Kohlefaser. Unter anderem besteht der Lattenrost sowie die Unterkonstruktion der Betten aus CfK (Carbonfaser-verst\u00e4rkter Kunststoff). Auch beim Tisch, Waschbecken, der Klosch\u00fcssel, Dusche und Bodenplatte verwendet Vanyx CfK. Dank Carbon kommt der Vanyx laut Hersteller auf ein Leergewicht von etwa drei Tonnen \u2013 und das trotz \u00fcppiger Ausstattung mit Vollluftfahrwerk oder Solarpanels auf dem Dach. Der Preis f\u00fcr den edlen und leichten Campingbus beginnt allerdings bei 340.000 Euro. LMC Tracer: Reduzierung aufs Wesentliche Beim neuen Tracer konnte LMC im Vergleich zu den bestehenden Tourer-Teilintegrierten bis zu 100 Kilogramm einsparen. Den Sassenbergern gelang das unter anderem durch Einsatz von Leichtbaumaterialien und die Optimierung der Materialst\u00e4rken beim M\u00f6belbau. So wurde etwa die T-Haube durch einen verbesserten Faservolumengehalt des GfK-Laminats um 4,5 Kilo leichter. Am Fahrgestell kommen leichte Blattfedern aus GfK zum Einsatz, au\u00dferdem eine gewichtsoptimierte Rahmenverl\u00e4ngerung. Auch bei der Elektro- und Gasinstallation konnten Kilos eingespart werden. Aber nicht nur das Gewicht der f\u00fcnf Tracer- Modelle \u2013 zwei schmale Vans und drei normalbreite Modelle \u2013 hat LMC nach unten gedr\u00fcckt, auch die Preise konnten attraktiv gehalten werden. Die starten f\u00fcr die breiteren Modelle bei 65.200 Euro. Niesmann+Bischoff: Leichtbau bei Integrierten Auch Hersteller von Luxus-Integrierten setzen auf Leichtbau. Niesmann+ Bischoff beispielsweise hat zum Modelljahr 2025 den Arto nach eigenen Angaben um mehr als 300 Kilogramm leichter gemacht als den Vorg\u00e4nger. Das ist umso bemerkenswerter angesichts dessen, dass der Arto nun auf dem Mercedes Sprinter aufbaut, der etwa 80 Kilogramm schwerer ist als der Fiat Ducato, der bislang als Basis diente. Die Ma\u00dfnahmen zur Gewichtsreduzierung: Beim Boden, einer Sandwichkonstruktion mit Aluminium-Deckschichten und XPS-Kern, hat Niesmann+Bischoff das Fl\u00e4chengewicht um 39 Prozentreduzieren k\u00f6nnen \u2013 und das, obwohl er in Summe dicker geworden ist (42 statt bisher 23 Millimeter). Die Isolierung des Bodens soll viermal so gut sein wie beim Vorg\u00e4nger, die Biegesteifigkeit hat Niesmann+Bischoff nach eigenen Angaben um den Faktor 6,3 verbessert. Carthago: Gewicht sparen durch intelligentes Weglassen Gewichtsparen durch intelligentes Weglassen: Mit dieser Methode senkt Carthago das Gewicht in seiner neuen Integrierten-Baureihe C2-Tourer. Etwa in den Kleiderschr\u00e4nken unter den Betten sind im Regalboden sowie in den Seitenw\u00e4nden Teile ausgefr\u00e4st. Beim Regalbrett befindet sich die Ausfr\u00e4sung an der Unterseite und st\u00f6rt damit weder optisch noch bei der Nutzung. Auch die Ausschnitte in der Seitenwand bergen keine funktionalen Nachteile, sind zwar sichtbar, aber nicht st\u00f6rend \u2013 und vermindern das Gewicht wiederum etwas. Aus der Holz-Einlegeplatte in der Dusche hat Carthago ebenfalls einen Teil ausgefr\u00e4st und spart auch hier Gewicht. Eine weitere Ma\u00dfnahme in Sachen Leichtbau beim C2-Tourer: Die Sandwich-Seitenw\u00e4nde laufen nun bis zu den A-S\u00e4ulen vorn plan durch. Die vergleichsweise schwere GfK-Frontmaske, die sich bei der Vorg\u00e4ngerversion des C-Tourer noch bis zum ersten seitlichen Fenstersteg herumw\u00f6lbte, endet nun an der A-S\u00e4ule. Im Vergleich zum C1-Tourer, der die bisherige Bauweise weiterf\u00fchrt, ist der neue C2-Tourer au\u00dferdem um etwa zehn Zentimeter schmaler, was ebenfalls Gewicht einspart. Die Integrierten C1- und C2-Tourer sowie den Teilintegrierten C1-Tourer T bietet Carthago sowohl in einer Comfort-Version mit 4,2 Tonnen Gesamtgewicht als auch in einer Lightweight-Variante mit 3,5 Tonnen an. Um zus\u00e4tzlich Gewicht zu sparen, verzichtet die Lightweight-Version in der Serienausf\u00fchrung auf Ausstattungsdetails wie etwa die Zusatzpolster zur Betterweiterung. Au\u00dferdem kommen teils leichtere Komponenten zum Einsatz, z.B. ein Herd mit emailliertem Drahtrost und Edelstahlboden statt Gussrost und Glasboden. Weinsberg: Zwei Superlight-Baureihen Das schw\u00e4bische Unternehmen hat sich auf M\u00f6bel- und Innenausbau in Leichtbauweise spezialisiert. F\u00fcr unterschiedliche Bereiche im Mobil stehen eigens entwickelte Materialkompositionen bereit: f\u00fcr den M\u00f6belbau beispielsweise Sandwichplatten mit leichten EPS-, XPS- oder PET-Kernen. Die sind laut Hersteller nicht nur bis zu 45 Prozent leichter als Pappelsperrholz, sondern teils auch g\u00fcnstiger. Teilweise sind Kern und Decklagen an den Seiten durch Polyurethan miteinander vergossen, was f\u00fcr zus\u00e4tzliche Stabilit\u00e4t sorgt. F\u00fcr den Boden, der eine hohe Biegefestigkeit und Wasserresistenz ben\u00f6tigt, hat V\u00f6hringer eine spezielle Leichtbauplatte entwickelt. Den Kern dieser Platte bilden Sch\u00e4ume bzw. Waben, die aus unterschiedlichen Materialien bestehen k\u00f6nnen. Die Deckschicht besteht aus einem Glasfaser-Polypropylen-Gelege. Auch f\u00fcr die Verkleidung von W\u00e4nden und Decken hat V\u00f6hringer verschiedene Leichtbaumaterialien im Angebot. Die sind atmungsaktiv, schallisolierend und k\u00f6nnen f\u00fcr eine angenehme Optik und Haptik teilweise mit Stoffen kaschiert werden. Zu den Kunden von V\u00f6hringer z\u00e4hlen zahlreiche kleinere und gr\u00f6\u00dfere Hersteller aus der Reisemobil-Branche. F\u00fcr die Campingbus-Marke Alphavan hat V\u00f6hringer beispielsweise den kompletten M\u00f6bel- und Innenausbau ausgef\u00fchrt. V\u00f6hringer: Auf Leichtbaum\u00f6bel spezialisiert Bei zwei seiner aktuellen Baureihen, dem Alkovenmobil Carahome und dem Integrierten Caracore, setzt Weinsberg die sogenannte Superlight-Technologie ein. Beide Baureihen sind in unterschiedlichen Grundrissen erh\u00e4ltlich, das Gesamtgewicht liegt bei allen Grundrissvarianten bei 3,5 Tonnen. Durch die Superlight-Bauweise verspricht Weinsberg fast 30 Prozent mehr Zuladung. Um das zu erreichen, kommen beim M\u00f6belbau Leichtbauplatten der Marke Lisocore zum Einsatz. Die bestehen aus einer gewellten Kernschicht aus Holz- und Pflanzenfaservlies, die mit den Deckschichten aus Furniersperrholz verklebt sind. Der Fahrzeugboden besteht aus einer 52 Millimeter starken Sandwichplatte mit XPS-Schaum. Auch die Sitzbank in den Carahome- und Caracore-Modellen hat Weinsberg nach eigenen Angaben besonders leicht gestaltet. Zudem sind die Fahrzeuge mit leichten Blattfedern aus GfK ausgestattet, optional sind Lithium-Batterien statt Blei-Akkus erh\u00e4ltlich. Leichtbau ist in der Caravaning-Industrie seit jeher wichtig. Das wird auch so bleiben, wenn der B-F\u00fchrerschein f\u00fcr Wohnmobile bis 4,25 Tonnen den Druck etwas von den Herstellern nimmt. Die haben aber gerade erst angefangen mit den modernsten Leichtbaumaterialien wie EPP (expandiertes Polypropylen) zu arbeiten. Vorreiter sind hier Adria mit Einzelelementen und Knaus, die ab 2026 in allen Campingbussen auf gro\u00dfe EPP-Bauteile setzen.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2207575.jpg", + "alt": "Leichtbau Reisemobile XPS-Kern", + "caption": "Leichtbau Reisemobile XPS-Kern", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/", + "title": "5 Camper-Marken aus Slowenien: Ernstzunehmende Alternativen zu Hymer und Co", + "date": "Thu, 19 Jun 2025 11:00:00 +0200", + "summary": "

Slowenische Camper-Marken wie Adria und Robeta haben sich l\u00e4ngst als zuverl\u00e4ssige Anbieter etabliert. Sie stehen f\u00fcr exzellente Technik, hochwertiges Design und konkurrenzf\u00e4hige Preise. F\u00fcnf slowenische Marken im kurzen Portr\u00e4t.

", + "text": "In der deutschen Campingszene w\u00e4chst das Interesse an Marken aus L\u00e4ndern wie Polen , Slowenien und sogar China . Oft wird ihnen prim\u00e4r eines zugeschrieben: g\u00fcnstige Preise. Doch diese Vorstellung trifft so nicht immer zu. Vielmehr bieten diese Marken h\u00e4ufig ein \u00fcberzeugendes Preis-Leistungs-Verh\u00e4ltnis. Besonders spannend sind dabei die slowenischen Hersteller, die keineswegs Neulinge am Markt sind: Einige von ihnen produzieren bereits seit den 1970er und 1980er Jahren, lange bevor Wohnmobile hierzulande ein Boomsegment wurden. Die bekannteste slowenische Marke auf dem deutschen Markt ist Adria , die mit ihrer Tochtermarke Sun Living eine breite Palette, von Einsteiger- bis Premiumfahrzeugen, abdeckt. Und auch wenn die Marke Robeta hierzulande erst in den letzten Jahren f\u00fcr Aufsehen sorgte, gibt es sie schon seit 2011. Slowenien bietet im hei\u00df umk\u00e4mpften Markt der Wohnmobile und Wohnwagen f\u00fcr fast jeden Geschmack und Geldbeutel etwas: von robusten Einsteigermodellen \u00fcber stylische Campervans bis zu exklusiven Luxus-Campern im Boutique-Stil. Sogar der Offroad- und Allrad-Trend spiegelt sich mit der Marke Megamobil wider, die einige besonders gel\u00e4ndetauglich anmutende Kastenwagen produziert. Kurz gesagt: Slowenische Camper \u00fcberzeugen nicht mit Billigpreisen, sondern mit einer ausgewogenen Mischung aus Qualit\u00e4t, Design, Ausstattung und einem konkurrenzf\u00e4higen Preis \u2013 eine spannende Alternative zu den klassischen deutschen Herstellern. Wir stellen f\u00fcnf slowenische Hersteller und ihre Modellpalette vor. 1. Adria \u2013 Premium-Marke mit Geschichte Adria ist das Flaggschiff unter Sloweniens Freizeitfahrzeugmarken. Seit der Gr\u00fcndung 1965 produziert das Unternehmen durchg\u00e4ngig in Novo Mesto \u2013 heute in einem der modernsten Werke Europas. \u00dcber 600.000 Fahrzeuge haben die Slowenen bislang gefertigt, darunter Caravans, teil- und vollintegrierte Wohnmobile (Coral, Matrix, Sonic) sowie Campervans (Twin Supreme u. a.). Die Produktion setzt dabei auf hochmoderne und ISO-zertifizierte Prozesse sowie umfangreiche Qualit\u00e4tspr\u00fcfungen \u2013 inklusive Dichtigkeit-Checks in Monsunkammern und Extremtests in Klimakammern bei bis zu \u201340 \u00b0C. Die Marke geh\u00f6rt seit 2017 zur franz\u00f6sischen Trigano-Gruppe, produziert aber weiterhin eigenst\u00e4ndig in Slowenien. Adria verbindet Premium-Design und zuverl\u00e4ssige Technik mit industrieller St\u00e4rke \u2013 und besetzt so den europ\u00e4ischen Mittel- bis Oberklassemarkt. Segmente: Caravans, Vans, teilintegrierte und integrierte Wohnmobile, Alkoven Baureihen: Caravans: Aviva (Lite), Action, Altea , Adora, Alpina , Astella; Vans: Twin (Sports, Supreme, Max, Supertwin ); Teilintegrierte: Compact (Max), Coral, Matrix, Coral XL (Alkoven); Integrierte: Sonic, Supersonic Basispreise : ab circa 10.000 bis 50.000 Euro (Caravans); ab circa 60.000 bis 150.000 Euro (Vans, TIs und Integrierte) Besonderheiten: ISO-zertifizierte Fertigung mit Monsun- und Klimakammern, digitales MACH-System, Panorama-Design, mehrfach ausgezeichnet Hier geht es zum Test des Adria Twin 640 SGX 2. Robeta \u2013 Boutique-Luxus aus Slowenien Robeta hat sich seit der Gr\u00fcndung 2011 in den oberen R\u00e4ngen des Segments der Luxus-Campingbusse auf dem europ\u00e4ischen Markt etabliert. Mit individualisierbaren Serienmodellen (\" Adonis \", \"Apollo\", \" Ares \" u. v. a.) bietet Robeta \u00fcber 15.000 m\u00f6gliche Konfigurationen f\u00fcr Kundinnen und Kunden. Jedes Fahrzeug kommt dabei handsigniert direkt vom Monteur. Ein besonderer Hingucker: die Robeta Schumacher Edition \u2013 pr\u00e4sentiert mit Ex-Formel-1-Star Ralf Schumacher auf dem Caravan Salon 2022. Basierend auf dem Mercedes Sprinter (7,36 m, 190 PS), ausgestattet mit Yacht-inspiriertem Interieur, Solaranlage, JL\u2011Audio-Soundsystem und luxuri\u00f6sem Sanit\u00e4rbereich \u2013 und einem Preis von rund 279.000 Euro . Eine weitere Besonderheit der Slowenen sind die Leichtbaum\u00f6bel aus recyceltem Kunststoff, mit denen sie nach eigenen Angaben bis zu 220 kg Gewichtsersparnis pro Fahrzeug erreichen. Robeta richtet sich damit an Premiumk\u00e4uferinnen und -k\u00e4ufer mit Stilbewusstsein, die Individualit\u00e4t statt Massenware, luxuri\u00f6ses Design und technische High-End-Ausstattung zu Listenpreisen suchen. Segmente: ausschlie\u00dflich Kastenwagen Baureihen: drei Serienmodelle (\" Adonis \", \"Apollo\", \" Ares \") plus Sonder-Editionen wie die Schumacher Edition Basispreise : ab ca. 80.000 bis 279.000 Euro Besonderheiten: Leichtbaum\u00f6bel aus recyceltem Kunststoff mit bis zu 220 kg Gewichtsersparnis, handsignierte Fahrzeuge, rund 15.000 Konfigurationsoptionen Hier geht es zum Test des Robeta Adonis 3. Sun Living \u2013 budgetfreundlicher Einstieg Als Schwester-Marke von Adria und Teil der Trigano-Gruppe (seit 2017) zielt Sun Living gezielt auf Einsteiger- und Mittelklasse ab. Weil Sun Living im gleichen Werk wie Adria gebaut wird, kann die Marke hochwertige Ausstattungen wie GFK-Boden, Kompressor-K\u00fchlschrank und digitale Steuerung auch in g\u00fcnstigeren Modellen anbieten. Ein Marktvorteil. Auch die hohen Qualit\u00e4tsstandards und das technische Know-how im Werk in Novo Mesto kommen den Einsteigermodellen von Sun Living zugute. Die aktuelle Modellpalette umfasst Kastenwagen (V-Serie) , teilintegrierte Modelle (S-Serie) sowie klassische Alkovenmobile (A-Serie) \u2013 alle auf Citro\u00ebn Jumper oder Fiat Ducato. Besonders beliebt: der kompakte V 60 SP mit Aufstelldach oder der S 70 SP , ein clever konzipierter Teilintegrierter mit Querbett. Einstiegspreise liegen meist zwischen 57.000 und 70.000 Euro , je nach Modell und Ausstattung. Innen dominiert ein funktionales, helles Design mit pflegeleichten Materialien, das vor allem Camping-Neulinge und Familien anspricht. Wer auf Individualisierungsoptionen verzichten kann, bekommt hier viel Technik und Raum zum attraktiven Preis \u2013 ohne auf Solidit\u00e4t und durchdachte Details zu verzichten. Segmente/Baureihen: Vans (V-Serie), Teilintegrierte (S-Serie), Alkoven (A-Serie) Basispreise: ab ca. 57.000 bis 70.000 Euro Besonderheiten: Ausstattung wie GFK-Boden, Kompressor-K\u00fchlschrank, digitale Steuerung aus Adria-Fertigung 4. Tourne \u2013 Der schicke Au\u00dfenseiter Tourne fertigt ebenfalls in Slowenien und baut ausschlie\u00dflich kompakte Campervans. Preislich ist die kleine Marke zwischen Sun Living und Robeta angesiedelt \u2013 kein \u00fcbertrieben luxuri\u00f6s, aber hochwertig, individuell und klar positioniert. Das Unternehmen kombiniert skandinavisch inspirierte Innenraumgestaltung \u2013 helle Holzdekore, klare Strukturen, dezente LED-Beleuchtung \u2013 mit praxisnaher Technik. Besonders hervorzuheben ist die effektive Wintertauglichkeit: Alle Fahrzeuge verf\u00fcgen \u00fcber eine vollst\u00e4ndige Isolierung, Fu\u00dfboden- und Dieselheizung sowie ein durchg\u00e4ngiges Bel\u00fcftungssystem. Die Modellpalette umfasst aktuell die Baureihen Cruise und Select , jeweils in den L\u00e4ngen 6,00 und 6,36 Metern \u2013 alle auf Citro\u00ebn Jumper mit optionalem Allrad und Automatikgetriebe. Der Einstiegspreis liegt bei rund 58.700 Euro (Cruise 6.0), die Topmodelle wie der Select 6.4 kosten ab 83.000 Euro . Ein besonderes Merkmal ist das patentierte \"Dream4\"-System, mit dem sich vier vollwertige Schlafpl\u00e4tze im Kastenwagen realisieren lassen \u2013 ganz ohne Aufstelldach. Segmente: ausschlie\u00dflich kompakte Campingbusse (Kastenwagen) Baureihen: Cruise und Select (je in 6,00 m & 6,36 m) Basispreise : ab ca. 59.000 bis 83.000 Euro Besonderheiten: Skandinavisch inspiriertes Interieur, l\u00fcckenlose Isolation (Fu\u00dfboden- & Dieselheizung), patentiertes Dream4 -Schlafsystem f\u00fcr vier Personen Hier geht es zum Test des Tourne 6.4 5. Megamobil \u2013 Alternative Gr\u00f6\u00dfe mit Komfort Megamobil produziert ausschlie\u00dflich Kastenwagen \u2013 und das in sorgf\u00e4ltiger Handarbeit. Das slowenische Familienunternehmen mit Sitz in Slovenska Bistrica hat seine Wurzeln in den 1960er-Jahren, der Ausbau von Campervans erfolgt seit rund 15 Jahren. Heute fertigen rund 80 Mitarbeiter j\u00e4hrlich etwa 500 Fahrzeuge \u2013 mit viel Sorgfalt, robusten Materialien und einem klaren Fokus auf Praxistauglichkeit und ganzj\u00e4hrige Nutzbarkeit. Alle Modelle entstehen auf Basis von Fiat Ducato, Citro\u00ebn Jumper, MAN TGE oder VW Crafter \u2013 und unterscheiden sich in L\u00e4nge (von 5,40 bis 6,80 m), Raumaufteilung und Technik. Die M\u00f6bel bestehen aus 15 mm starkem Pappelsperrholz mit pflegeleichter CPL-Oberfl\u00e4che, die Fahrzeuge sind rundum isoliert und mit Armaflex ged\u00e4mmt. Jedes Exemplar durchl\u00e4uft nach Angaben des Herstellers vor der Auslieferung umfangreiche Funktions- und Dichtheitspr\u00fcfungen. Besonders beliebt ist der Mega Sport 640 : ein clever konzipierter Campervan mit elektrischem Hubbett \u00fcber einem gro\u00dfen Stauraum im Heck \u2013 dort lassen sich selbst zwei Fahrr\u00e4der unterbringen. Im promobil-Test lobten wir prim\u00e4r das flexible Bettkonzept, die gute Familiennutzung und die hochwertige Verarbeitung. Kritik gab es nur f\u00fcr kleinere Komfortdetails wie fehlende Ablagefl\u00e4chen im Bettbereich. Zum vollst\u00e4ndigen Test des Mega Sport 640 geht es hier. Segmente: ausschlie\u00dflich Kastenwagen Baureihen: Lounge, Classic, Sport, Revolution , Twin, Re-Aktiv , 4x4 Basispreise : ab ca. 70.000 Euro", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2051250.jpg", + "alt": "Tourne Mobil 6.0 (2024)Campingbus i", + "caption": "Tourne Mobil 6.0 (2024)Campingbus i", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/", + "title": "\u201eBella Italia \u2013 Camping auf Deutsch\u201c Recap Folge 2: Sascha und Dennis vom Bodensee als Italiener", + "date": "Tue, 17 Jun 2025 16:00:00 +0200", + "summary": "

Endlich geht es wieder los: die neue Staffel \"Bella Italia \u2013 Camping auf Deutsch\" ist auf RTL II gestartet. In Folge 2 wollen die Bodensee-Boys als Italiener durchgehen \u2013 ohne Italienisch-Kenntnisse. Wie das klappt?!

", + "text": "Gestern (16.06.2025) lief nun schon die zweite Folge der neuen Staffel \"Bella Italia \u2013 Camping auf Deutsch\" auf RTL II. Mit dabei sind nat\u00fcrlich die Fingerhuths und die Bodensee-Boys, aber auch ein paar neue Gesichter. Eines vereint sie alle: sie machen Urlaub auf dem ber\u00fchmten italienischen Campingplatz \" Marina di Venezia \". Fingerhuths gehen dem Marina fremd Naja fast! Sascha und Nicole Fingerhuth und Clique scheinen dieses Mal dem Mega-Campingplatz fremdzugehen und urlauben lieber an der Costa Brava in Spanien. Das Filmteam ist trotzdem dabei. Ob sie diese Staffel noch auf dem Marina zu sehen sind? Es bleibt spannend. F\u00fcr mich ist es immer wieder erstaunlich, was die Camperinnen und Camper alles aus ihren Wohnmobilen und Wohnwagen zaubern. Sei es Micha, der ein Sammelsurium an bunten Strasssteinchen aus seinem Wohnwagen zaubert, mit dem er uns seine Kumpels Horst und Sascha ihre K\u00fchlboxen verzieren oder Hypnotiseur Peter und seine Frau Angelika f\u00fcr die ein Eierkocher zur Standardausr\u00fcstung geh\u00f6rt. Folge 2 \"Bella Italia\": Was ist passiert? Einen liebenswerten Moment gab es bei den Camping-Neulingen Maysofie und Tochter Mia, die zum allerersten Mal die Wohnwagen-Toilette ausleeren gehen mussten. Sicher erinnern sich die meisten langj\u00e4hrigen Camping-Fans an ihr eigenes erstes Mal. Die Kassette der Toilette \u00fcber den Platz ziehen \u2013 das kostet zun\u00e4chst einmal \u00dcberwindung. Maysofie opfert sich dann tapfer und leert die Br\u00fche in den Ausguss. Unter W\u00fcrgen und Jammern haben die beiden es hinter sich gebracht. Die Bondesee-Boys Sascha und Dennis sind wieder auf einer Mission: Sie wollen als waschechte Italiener durchgehen und das nahegelegene Venedig unsicher machen. Das Problem ist nur: Italienisch sprechen sie noch schlechter als Englisch. Das macht aber gar nichts. Das Liebenswerte an den beiden M\u00e4nnern ist ja, dass sie sich mit Hand und Fu\u00df verst\u00e4ndigen k\u00f6nnen und zusammen immer Spa\u00df haben. Nach so einigen Aperol-Spritz l\u00e4uft es dann mit der Kontaktaufnahme auf Italienischen auch gar nicht so schlecht. Nat\u00fcrlich alles nur freundschaftlich. Mittlerweile sind beide Schwaben vergeben und Flirts suchen sie auf dem Marina di Venezia nicht mehr. Ehepaar kehrt zur\u00fcck Gegen Ende der Folge reist dann noch ein weiteres Kult-P\u00e4rchen an. Lex und seine frisch angetraute Annika \u2013 sie haben sich in der letzten Staffel das Ja-Wort am Strand des Campingplatzes gegeben \u2013 reisen mit ihren beiden M\u00fcttern an. Das verspricht Unterhaltung. Das Ehepaar w\u00fcnscht sich Zweisamkeit. Und die M\u00fctter? Familienzeit. Ob das gut geht?! Wir k\u00f6nnen gespannt sein auf die n\u00e4chste unterhaltsame Folge der Doku-Soap \"Bella Italia \u2013 Camping auf Deutsch\" am 23.06.2025.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2214454.jpg", + "alt": "Bella Italia - Camping auf Deutsch", + "caption": "Bella Italia - Camping auf Deutsch", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2214455.jpg", + "alt": "Bella Italia - Camping auf Deutsch", + "caption": "Bella Italia - Camping auf Deutsch", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/", + "title": "Tipps f\u00fcr die Reiseplanung: Diese kostenlosen Apps m\u00fcssen Camper kennen", + "date": "Sat, 14 Jun 2025 14:00:00 +0200", + "summary": "

Diese Apps retten den Urlaub: Ob Krankheit, Notfall oder Sprachbarriere \u2013 hier sind 5 App-Kategorien, die im Ausland helfen.

", + "text": "Im Urlaub will man zwar nicht st\u00e4ndig am Mobiltelefon h\u00e4ngen, doch in vielen Situationen kann es ein n\u00fctzlicher Helfer sein. W\u00e4hrend die Internetrecherche schnell vom eigentlichen Ziel ablenkt, bieten spezialisierte Apps einen klaren Fokus. Sie lenken nicht ab, sondern konzentrieren sich auf ein Thema \u2013 und genau das macht sie so praktisch. Ein gutes Beispiel ist die promobil Stellplatz-Radar-App , die gezielt bei der Suche nach Camping- und Stellpl\u00e4tzen oder Entsorgungsstationen unterst\u00fctzt. Doch nicht nur \u00dcbernachtungspl\u00e4tze und Entsorgungsm\u00f6glichkeiten sind im Campingurlaub unverzichtbar. Wir haben kostenlose Apps aus f\u00fcnf Kategorien zusammengestellt, die im Krankheitsfall, bei Sprachbarrieren oder in Notf\u00e4llen in fremder Umgebung weiterhelfen. 1. Mobile Daten im Blick behalten Viele Apps funktionieren nicht nur offline, sondern verbrauchen auch mobile Daten. Daher steht am Anfang jeder Auslandsreise der Blick auf den Mobilfunktarif und das verf\u00fcgbare Datenvolumen in EU und Nicht-EU. Besonders in Grenzregionen zu Nicht-EU-Staaten wie etwa der Schweiz kann es vorkommen, dass sich das Mobiltelefon in das Netz des Nachbarlands einw\u00e4hlt und je nach Tarif hohe Roaming-Geb\u00fchren anfallen. Abhilfe bieten die Apps der Mobilfunkanbieter, \u00fcber die man die pers\u00f6nlichen Tarifdetails einsehen, sein verbrauchtes Datenguthaben kontrollieren und gegebenenfalls erweitern kann. Die Telekom bietet diesen Service in der \"Magenta-App\" : Apple Store: MeinMagenta: Handy & Festnetz im App Store Google-Play-Store: MeinMagenta: Handy & Festnetz \u2013 Apps bei Google Play Bei Telef\u00f3nica findet man die entsprechenden Funktionen in der \" Mein O2-App \": Apple Store: Mein o2 im App Store Google-Play-Store: Mein o2 \u2013 Apps bei Google Play Bei Vodafone in der App \" Mein Vodafone \": Apple Store: MeinVodafone \u2013 Apps bei Google Play Google-Play-Store: MeinVodafone im App Store Bei 1&1 gibt es daf\u00fcr die App \" Control-Center \": Apple Store: 1&1 Control-Center im App Store Google-Play-Store: 1&1 Control-Center \u2013 Apps bei Google Play 2. Sicherheitshinweise immer auf dem Schirm Je nach Reiseland sollte man sich schon vor dem Losfahren \u00fcber aktuelle Entwicklungen am Zielort informieren. Mit der App \"Sicher Reisen\" vom Ausw\u00e4rtigen Amt kann man im Vorfeld und unterwegs die Reise- und Sicherheitshinweise des Urlaubslands im Blick behalten. Bei aktuellen \u00c4nderungen wird man auf Wunsch automatisch informiert. Au\u00dferdem findet man in der App detaillierte Informationen zu Ansprechpartnern der deutschen Auslandsvertretungen. Die App enth\u00e4lt zudem Hinweise, wie man im Urlaub vorgeht, falls der Ausweis verloren geht oder der Zugang zum Konto oder zur Kreditkarte nicht mehr m\u00f6glich ist. Die App \" Sicher Reisen \" gibt es in den Stores von Apple und Google: Apple Store: Sicher Reisen im App Store Google-Play-Store: Sicher Reisen \u2013 Apps bei Google Play Sogenannte Notfall-Informations-Apps senden bei Unwettern und anderen Katastrophenlagen Push-Nachrichten aufs Mobiltelefon. Sie warnen vor Gefahren wie etwa Hochwasser, Feuer oder auch bei Gef\u00e4hrdungslagen, etwa nach Anschl\u00e4gen. Wer innerhalb Deutschlands unterwegs ist, wird \u00fcber die App \"Nina\" vom Bundesamt f\u00fcr Bev\u00f6lkerungsschutz bei Gefahrenlagen an heimischen Standorten gewarnt. Die App \" Nina \" gibt es in den Stores von Apple und Google: Apple Store: NINA im App Store Google-Play-Store: NINA - Die Warn-App des BBK \u2013 Apps bei Google Play Bei Reisen innerhalb von Europa empfiehlt sich eine international vernetzte Warn-App wie \"Katwarn\". Dank der sogenannten \"Katwarn-Roaming-Technologie\" erh\u00e4lt man \u2013 bei entsprechender Einstellung \u2013 auch im Ausland Warnmeldungen f\u00fcr den aktuellen Aufenthaltsort, ohne die App des jeweiligen Landes installieren zu m\u00fcssen. Die App \" Katwarn \" gibt es in den Stores von Apple und Google: Apple Store: KATWARN im App Store Google-Play-Store: KATWARN \u2013 Apps bei Google Play 3. Bei Krankheit \u00e4rztlichen Rat suchen Gerade im Urlaub und wom\u00f6glich noch im Ausland kann es herausfordernd sein, einen Arzt oder ein Krankenhaus zu finden. Da ist es beruhigend, wenn man sich im Vorfeld bereits auf eine solche Situation vorbereitet hat. Viele nutzen auch im Alltag schon Apps, um Arzttermine zu buchen oder sich per Videosprechstunde von einem Arzt beraten zu lassen. Unabh\u00e4ngig von einer bestimmten Krankenversicherung kann man beispielsweise \u00fcber die App des M\u00fcnchner Unternehmens Teleclinic Online-Arztgespr\u00e4che vereinbaren, ggf. sogar beim eigenen Arzt, wenn er dort gelistet ist. Die App von Teleclinic gibt es hier zum Download: Apple Store: TeleClinic - Online Arzt im App Store Google-Play-Store TeleClinic - Online Arzt - Apps on Google Play Auch der ADAC bietet diesen Service in Kooperation mit Teleclinic und Doctolib an. Daf\u00fcr kann man den ADAC-Onlinezugang nutzen. F\u00fcr die Online-Sprechstunde ist eine ADAC-Mitgliedschaft oder ein Auslandskrankenschutz des ADAC notwendig. Hier geht es zur ADAC \" Medical App \" in den Stores von Apple und Google: Apple Store: ADAC Medical: Gesundheitsapp im App Store Google-Play-Store: ADAC Medical: Gesundheitsapp \u2013 Apps bei Google Play Auch viele Krankenversicherungen bieten ihren Versicherten den Service der Telesprechstunde in eigenen Apps. Hier einige Beispiele der gr\u00f6\u00dften gesetzlichen Krankenversicherungen: Die AOK mit der App \" AOK NAVIDA \": Apple-Store: AOK NAVIDA im App Store Google-Play-Store: AOK NAVIDA \u2013 Apps bei Google Play Die Barmer mit der \" Teledoktor-App \": Apple-Store: BARMER Teledoktor-App im App Store Google-Play-Store: BARMER Teledoktor-App \u2013 Apps bei Google Play Die DAK mit der \" DAK-App \": Apple-Store: DAK App im App Store Google-Play-Store: DAK App \u2013 Apps bei Google Play Techniker Krankenkasse mit ihrer \" App TK-Doc \": Apple-Store: TK-Doc im App Store Google-Play-Store: TK-App \u2013 Apps bei Google Play Viele private Krankenversicherer bieten ihren Versicherten ebenfalls Apps f\u00fcr den Krankheits- oder Notfall an, wie etwa der K\u00f6lner Krankenversicherer Debeka mit der App \"Auslands SOS\". Zum Download von \"Auslands-SOS\" geht es hier: Apple-Store: Debeka Auslands-SOS \u2013 Apps bei Google Play Google-Play-Store: Debeka Auslands-SOS im App Store Vor-Ort und Onlinetermine buchen kann man auch \u00fcber die Apps von Doctolib oder Jameda. Bei Doctolib findet man neben Arztpraxen in Deutschland auch \u00c4rztinnen und \u00c4rzte in Frankreich und Italien. Zum Download von \"Dictolib\" geht es hier: Apple-Store: Doctolib - Die Gesundheits-App im App Store Google-Play-Store: Doctolib - Die Gesundheits-App \u2013 Apps bei Google Play Hier gibt es die App von Jameda zum Download: Apple-Store: jameda: \u00c4rzte finden & buchen im App Store Google-Play-Store: jameda: \u00c4rzte finden & buchen \u2013 Apps bei Google Play 4. Sprachprobleme \u00fcberwinden Wer in Europa reist, trifft unweigerlich auf Situationen, in denen er sich in einer fremden Sprache nur schwer oder gar nicht verst\u00e4ndigen kann. Statt eines klassischen W\u00f6rterbuchs greifen viele inzwischen zu \u00dcbersetzungsapps. Eine empfehlenswerte Alternative zu den US-Anbietern Google und Microsoft ist die App von DeepL die in K\u00f6ln entwickelt wird. DeepL gilt dabei als besonders pr\u00e4zise bei europ\u00e4ischen Sprachen, w\u00e4hrend Google Translate die meisten Sprachen unterst\u00fctzt. Alle drei Apps entwickeln sich laufend weiter und unterst\u00fctzen auch die Kamera- und Bild\u00fcbersetzung. So kann man etwa fremdsprachige Speisekarten oder die Beschreibung von Sehensw\u00fcrdigkeiten direkt \u00fcbersetzen lassen. Auch die Spracheingabe und -ausgabe unterst\u00fctzen alle drei. Der Vorteil der \u00dcbersetzungs-App von Microsoft ist die Offline-Nutzung, wenn man sich eine bestimmte Sprache in der App im Vorfeld heruntergeladen hat. Zur App von DeepL geht es hier: Apple-Store: DeepL Translate on the App Store Google-Play-Store: DeepL \u00dcbersetzer \u2013 Apps bei Google Play Der \"Google \u00dcbersetzer\" in den App-Stores: Apple-Store: Google \u00dcbersetzer im App Store Google-Play-Store: Google \u00dcbersetzer \u2013 Apps bei Google Play Hier geht es zum Microsoft \u00dcbersetzer: Apple-Store: Microsoft Translator im App Store Google-Play-Store: Microsoft \u00dcbersetzer \u2013 Apps bei Google Play 5. Im Notfall Hilfe rufen In Ausnahmesituationen vergisst man oft die einfachsten Dinge. Die Rufnummer 112 ist in Deutschland und Europa die Notrufnummer f\u00fcr lebensbedrohliche Notf\u00e4lle wie Br\u00e4nde, Unf\u00e4lle und medizinische Notf\u00e4lle. Sie ist ohne Vorwahl und kostenlos erreichbar. In Deutschland kann man einen Notruf auch \u00fcber die App \"Nora\" absetzen. Sie ist in Kooperation der Bundesl\u00e4nder entstanden. Zuvor muss man sich mit der eigenen Mobilfunknummer registrieren und per Postident mit seinem Ausweis identifizieren. So soll unter anderem Missbrauch verhindert werden. Nach der Verifizierung kann man \u00fcber einen Button in der App bei Notf\u00e4llen die Polizei, die Feuerwehr und den Rettungsdienst \u00fcberall in Deutschland alarmieren. Mit der Standort-Funktion des Mobiltelefons wird der genaue Standort an die Leitstelle \u00fcbermittelt. \u00dcber die App k\u00f6nnen auch Notrufe abgesetzt werden, ohne sprechen zu m\u00fcssen. Zum Download der \" Nora \"-App: Apple-Store: nora - Notruf-App im App Store Google-Play-Store: nora - Notruf-App \u2013 Apps bei Google Play Die in der Schweiz entwickelte Notruf-App \"EchoSOS\" funktioniert im Gegensatz zu \"Nora\" weltweit. Auch sie erkennt den Standort und zeigt die Notrufnummer des entsprechenden Landes an. Der Notruf kann dann wie bei \"Nora\" aus der App heraus automatisch gestartet werden. Dabei wird auch der Standort an die Leitstelle \u00fcbertragen. Ist am Notrufort kein mobiles Internet verf\u00fcgbar, dann wird \u00fcber die App automatisch eine SMS verschickt an die Leitstelle verschickt. Hier geht es zum Download von \" EchoSOS \": Apple-Store: EchoSOS on the App Store Google-Play-Store: EchoSOS \u2013 Apps bei Google Play In beiden Apps kann man sich auf die Nutzung der Anwendung im Notfall vorbereiten und \u00fcber eine Demo den Notfall simulieren.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/", + "images": [ + { + "url": "https://matomo.promobil.de/matomo.php?idsite=5&rec=1&e_c=Custom%20Events&e_a=JavaScript%20disabled&e_n=true", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2213667.jpg", + "alt": "Kostenlose_Apps_Datenvolumen", + "caption": "Kostenlose_Apps_Datenvolumen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2213668.jpg", + "alt": "Kostenlose-Apps_Notfall-App", + "caption": "Kostenlose-Apps_Notfall-App", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2213669.jpg", + "alt": "Kostenlose-Apps_Arztgespr\u00e4ch", + "caption": "Kostenlose-Apps_Arztgespr\u00e4ch", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2213670.jpg", + "alt": "Kostenlose-Apps_\u00dcbersetzer", + "caption": "Kostenlose-Apps_\u00dcbersetzer", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2213671.jpg", + "alt": "Kostenlose-Apps_Krankenwagen", + "caption": "Kostenlose-Apps_Krankenwagen", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225218.jpg", + "alt": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "caption": "Ahorn Camp, CV 630, Campingbus, Innenraum", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/1992117.jpg", + "alt": "MAN-Campingbus-Ausbau", + "caption": "MAN-Campingbus-Ausbau", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225495.jpg", + "alt": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "caption": "Motorhome Exclusiv, Adventure Pro, 4x4-Campingbus", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2225200.jpg", + "alt": "Gut Damp", + "caption": "Gut Damp", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2216436.jpg", + "alt": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "caption": "f_Weinsberg-Carabus_540_MQ_Sitzgruppe", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://www.promobil.de/_next/static/media/newsletter.a6565611.jpg", + "alt": "", + "caption": "Bild aus Originalartikel", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-ig.svg", + "alt": "Social Icon instagram", + "caption": "Social Icon instagram", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-fb.svg", + "alt": "Social Icon facebook", + "caption": "Social Icon facebook", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-rss.svg", + "alt": "Social Icon RSS", + "caption": "Social Icon RSS", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-yt.svg", + "alt": "Social Icon youtube", + "caption": "Social Icon youtube", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + }, + { + "url": "https://www.promobil.de/_next/static/img/icon-x.svg", + "alt": "Social Icon Twitter", + "caption": "Social Icon Twitter", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/frankreichs-autobahnen-kein-adac-schutz-bei-pannen/", + "title": "Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen", + "date": "Mon, 04 Aug 2025 16:00:00 +0200", + "summary": "

ADAC & Co. d\u00fcrfen bei Pannen in Frankreich nicht helfen \u2013 was Camperinnen und Camper auf Autobahnen wissen und beachten m\u00fcssen.

", + "text": "Wer mit dem Wohnmobil durch Frankreich reist und auf der Autobahn liegenbleibt, kann von seinem Schutzbriefanbieter keine Hilfe erwarten. W\u00e4hrend etwa in Deutschland oder Italien Automobilclubs und Schutzbriefversicherungen Hilfe organisieren, greifen auf Frankreichs Autobahnen andere Regeln. Nur Notrufs\u00e4ule oder 112 \u2013 sonst nichts Im Fall einer Panne auf der franz\u00f6sischen Autobahn d\u00fcrfen Dienstleister wie etwa der ADAC keine Hilfe organisieren. Stattdessen muss die Panne \u00fcber eine der Notrufs\u00e4ulen oder \u00fcber die Notrufnummer 112 gemeldet werden. Nach der Meldung koordiniert der private Autobahnbetreiber den daf\u00fcr autorisierten Pannendienst, der binnen rund 30 Minuten eintreffen sollte. Abschleppen oder Reparatur vor Ort Der Pannenhelfer pr\u00fcft, ob das Wohnmobil vor Ort repariert werden kann oder in eine Werkstatt abgeschleppt werden muss. Beim Abschleppen hat man die Wahl zwischen zwei Optionen: Man l\u00e4sst sich in die n\u00e4chste Werkstatt abschleppen oder l\u00e4sst das Wohnmobil auf Wunsch zu einem anderen Ort bringen, allerdings maximal f\u00fcnf Kilometer abseits der n\u00e4chsten Autobahnausfahrt. Gesetzlich geregelte Abschleppkosten bis 3,5 Tonnen Doch zumindest Fahrer von Wohnmobilen bis 3,5 Tonnen k\u00f6nnen aufatmen: F\u00fcr das Abschleppen auf Frankreichs Autobahnen gelten gesetzlich festgelegte Tarife. So d\u00fcrfen aktuell f\u00fcr das Abschleppen eines Wohnmobils unter 3,5 Tonnen tags\u00fcber pauschal 148,67 Euro berechnet werden (Montag bis Freitag zwischen 8 und 18 Uhr). In den \u00fcbrigen Zeiten sowie an Wochenenden und Feiertagen gilt eine Pauschale von 223,01 Euro. Zur besseren Transparenz m\u00fcssen diese Preise im Pannenhilfefahrzeug ausgeh\u00e4ngt sein. Bezahlt werden muss die Rechnung direkt vor Ort. Schutzbriefversicherungen erstatten oft im Nachhinein die Kosten f\u00fcrs Abschleppen, der ADAC etwa bis zu 300 Euro. Reparaturen zahlt man selbst Die Kosten f\u00fcr eine Reparatur durch die Pannenhilfe m\u00fcssen Wohnmobilfahrer im Gegensatz zu den Abschleppkosten auch mit Schutzbrief selbst tragen. Dabei sollte man unbedingt darauf achten, dass man eine Rechnung bekommt. Wie auch beim Abschleppen ist der Pannenhelfer verpflichtet, eine Rechnung auszustellen, auf der alle erbrachten Leistungen und deren Preis aufgef\u00fchrt sind. Schwerer als 3,5 Tonnen? Dann wird's teuer Kritischer wird es f\u00fcr Besitzer schwererer Wohnmobile: Ab einem zul\u00e4ssigen Gesamtgewicht von \u00fcber 3,5 Tonnen gibt es keine regulierten Tarife auf Frankreichs Autobahnen. Die Preise richten sich nach den Vorgaben des gerufenen Abschleppdienstes \u2013 vierstellige Betr\u00e4ge sind keine Seltenheit. Wer ein gro\u00dfes Wohnmobil f\u00e4hrt, sollte daher unbedingt vor Reiseantritt \u00fcberpr\u00fcfen, ob und in welcher H\u00f6he der Versicherungsschutz greift, und sich beim jeweiligen Versicherer r\u00fcckversichern, wie er im Pannenfall vorgehen soll. So verhalten Sie sich bei einer Panne richtig In Frankreich ist es nicht erlaubt, sich zu Fu\u00df auf der Autobahn (einschlie\u00dflich Pannenstreifen) zu bewegen. Alle Insassen des Wohnmobils m\u00fcssen bei einer Panne oder einem Unfall au\u00dferhalb des Fahrzeugs eine Warnweste tragen und unverz\u00fcglich die Fahrbahn und den Standstreifen verlassen. Auf das Aufstellen eines Warndreiecks auf Autobahnen kann laut ADAC verzichtet werden, wenn der Fahrer sich dadurch in Gefahr bringt. Dagegen ist auf Landstra\u00dfen und innerorts das Aufstellen eines Warndreiecks vorgeschrieben. Wer sein Fahrzeug noch aus eigener Kraft bewegen kann, sollte unbedingt versuchen, die n\u00e4chste Autobahnausfahrt zu erreichen. Auf Landstra\u00dfen kann man dann wieder frei entscheiden, welchen Pannenhelfer man beauftragen m\u00f6chte.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/frankreichs-autobahnen-kein-adac-schutz-bei-pannen/", + "images": [], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/weitere-ratgeber/warntafel-wahnsinn-in-italien-anbringen-an-fahrradtraegern-trotz-neuer-gesetze-empfohlen/", + "title": "Fahrradtransport in Italien: Warntafel bei Fahrradtr\u00e4gern doch wieder Pflicht?", + "date": "Thu, 31 Jul 2025 10:38:00 +0200", + "summary": "

Chaos beim Fahrradtransport in Italien: Seit Januar 2025 ist die Warntafel an Kupplungstr\u00e4gern mit Kennzeichen und Licht offiziell nicht mehr vorgeschrieben. Doch ADAC und \u00d6AMTC empfehlen, die Warntafel besser weiterhin zu montieren.

", + "text": "Fahrradtransport in Italien: Warntafel bei Fahrradtr\u00e4gern doch wieder Pflicht?\n\nItalienische und internationale Automobilclubs empfehlen Reisenden, trotz neuer Regelungen, Warntafeln an Fahrrad- und Transporttr\u00e4gern ihrer Fahrzeuge anzubringen, um Bu\u00dfgelder zu vermeiden. Seit Januar 2025 hat Italien eine Gesetzes\u00e4nderung eingef\u00fchrt, die besagt, dass diese Tafeln nicht mehr notwendig sind, solange die Beleuchtung sichtbar ist oder der Tr\u00e4ger eine eigene Beleuchtung und ein Wiederholungskennzeichen hat. Dies betr\u00e4fe Fahrzeuge der Klassen M1 und N1, zu denen Wohnmobile und Campingbusse z\u00e4hlen. In der Praxis wird diese Regelung jedoch anscheinend nicht konsequent umgesetzt, und es gibt lokal unterschiedliche Interpretationen, was zu Unsicherheit unter den Reisenden f\u00fchrt. Deshalb raten Automobilclubs, sich weiterhin an die alte Regelung zu halten. Bei Wohnmobilen, bei denen der Fahrradtr\u00e4ger direkt an der Heckwand montiert ist, bleibt die Pflicht zur Warntafel bestehen. Jede Warntafel in Italien muss rot-wei\u00df gestreift sein, Mindestma\u00dfe von 50 cm x 50 cm haben und aus Metallblech bestehen. Wenn die Ladung am Heck breiter als das Fahrzeug ist, muss an jeder Seite eine Tafel montiert werden.", + "tags": [ + "\"Italien Reisebestimmungen\"", + "\"Automobilclubs Empfehlungen\"", + "\"Fahrzeug Warntafeln\"" + ], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/warntafel-wahnsinn-in-italien-anbringen-an-fahrradtraegern-trotz-neuer-gesetze-empfohlen/", + "images": [ + { + "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-Ksiks2ssSZxpEFf1MQedlap1.png?st=2025-08-15T06%3A48%3A42Z&se=2025-08-15T08%3A48%3A42Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=8b33a531-2df9-46a3-bc02-d4b1430a422c&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-08-14T16%3A59%3A16Z&ske=2025-08-15T16%3A59%3A16Z&sks=b&skv=2024-08-04&sig=e0/ULpNgNLwixo3UapqnxHgR18t4HCpyEtnbmik33yA%3D", + "alt": "KI-generiertes Titelbild zu: Fahrradtransport in Italien: Warntafel bei Fahrradtr\u00e4gern doch wieder Pflicht?", + "caption": "KI-generiertes Titelbild zu: Fahrradtransport in Italien: Warntafel bei Fahrradtr\u00e4gern doch wieder Pflicht?", + "copyright": "OpenAI DALL\u00b7E", + "copyright_url": "https://openai.com/dall-e" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", + "title": "Neue Mautregeln f\u00fcr Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box", + "date": "Wed, 30 Jul 2025 16:00:00 +0200", + "summary": "

Ab 2029 gilt f\u00fcr Wohnmobile mit hoher \"tzGm\" die GO-Box-Pflicht \u2013 trotz 3,5 Tonnen \"zGG\" im Fahrzeugschein. promobil erkl\u00e4rt, was das bedeutet.

", + "text": "Neue Mautregeln f\u00fcr Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box\n\nAb dem 1. Februar 2029 gelten neue Vorschriften f\u00fcr die Mautzahlung auf \u00f6sterreichischen Autobahnen und Schnellstra\u00dfen f\u00fcr Wohnmobile. Statt der bisherigen Regelung, nach der sich die Mautpflicht nach dem im Fahrzeugschein eingetragenen zul\u00e4ssigen Gesamtgewicht des Fahrzeugs richtete, ist nun die technisch m\u00f6gliche Gesamtmasse des Fahrzeugs ausschlaggebend. Das bedeutet, dass alle Wohnmobile, die gem\u00e4\u00df Herstellerangaben mehr als 3,5 Tonnen tragen k\u00f6nnten, eine sogenannte GO-Box ben\u00f6tigen, ein elektronisches Ger\u00e4t f\u00fcr die Mautabrechnung. Diese Ger\u00e4te sind an speziellen Vertriebsstellen erh\u00e4ltlich und werden an der Windschutzscheibe des Fahrzeugs montiert. Sie registrieren automatisch, wenn das Fahrzeug eine mautpflichtige Strecke bef\u00e4hrt und berechnen die Maut dann streckenabh\u00e4ngig.\n\nDie \u00c4nderung ist insbesondere f\u00fcr Fahrzeuge relevant, die technisch mehr als 3,5 Tonnen tragen k\u00f6nnten, aber auf ein tats\u00e4chliches Gesamtgewicht von 3,5 Tonnen \"abgelastet\" wurden. Kamen solche Fahrzeuge bislang ohne die GO-Box aus, werden sie ab Februar 2029 mautpflichtig, wenn ihre technisch m\u00f6gliche Gesamtmasse mehr als 3,5 Tonnen betr\u00e4gt. Bereits seit dem 1. Dezember 2023 galt diese Regelung f\u00fcr alle nach diesem Datum neu zugelassenen Wohnmobile.\n\nF\u00fcr die Anmeldung und Einrichtung der GO-Box werden die Fahrzeugdaten (einschlie\u00dflich der Anzahl der Achsen und der Schadstoffklasse, die den Mautpreis beeinflussen), pers\u00f6nliche Daten sowie der Fahrzeugschein ben\u00f6tigt. Nach der Anmeldung erh\u00e4lt der Fahrzeughalter eine Fahrzeugdeklaration, die er bei Fahrten auf mautpflichtigen Strecken in \u00d6sterreich immer dabei haben muss.", + "tags": [ + "\"Mautvorschriften \u00d6sterreich\"", + "\"Wohnmobile\"", + "\"GO-Box\"" + ], + "status": "Online", + "link": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", + "images": [ + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1102576.jpg", + "alt": "Go-Box", + "caption": "Maut, Basis, Wissen, \u00d6sterreich, Vignette, Go-Box,", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", + "width": 430, + "height": 243, + "title": "Maut, Basis, Wissen, \u00d6sterreich, Vignette, Go-Box," + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2202648.jpg", + "alt": "Wohnmobil, K\u00fcste, Parkplatz, Wohnmobil, Mann", + "caption": "Wohnmobil, K\u00fcste, Parkplatz, Wohnmobil, Mann", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", + "width": 249, + "height": 140, + "title": "Wohnmobil, K\u00fcste, Parkplatz, Wohnmobil, Mann" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2203732.jpg", + "alt": "Spanien Polizei Verkehr", + "caption": "05/2025, Spanien Polizei Verkehr", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", + "width": 249, + "height": 140, + "title": "05/2025, Spanien Polizei Verkehr" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2201001.jpg", + "alt": "f_Autohof_estaurant_Verpflegung", + "caption": "f_Autohof, Restaurant, essen, vegetarisch", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", + "width": 249, + "height": 140, + "title": "f_Autohof, Restaurant, essen, vegetarisch" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1107089.jpg", + "alt": "Die Seitensitztruhe bietet sich als Schuhfach an.", + "caption": "Supercheck, Dethleffs Magic Edition T 2 EB, Seitensitztruhe, Schuhfach, Feuerl\u00f6scher", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", + "width": 249, + "height": 140, + "title": "Supercheck, Dethleffs Magic Edition T 2 EB, Seitensitztruhe, Schuhfach, Feuerl\u00f6scher" + }, + { + "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-Pl4ik6W7mTrv2MhIbdWlwgOL.png?st=2025-08-15T06%3A51%3A53Z&se=2025-08-15T08%3A51%3A53Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=b1a0ae1f-618f-4548-84fd-8b16cacd5485&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-08-14T15%3A09%3A17Z&ske=2025-08-15T15%3A09%3A17Z&sks=b&skv=2024-08-04&sig=RHIFlJLMumrcr/jEskOVfqJ%2Bns0pDS2HM8l5siBfLmM%3D", + "alt": "KI-generiertes Titelbild zu: Neue Mautregeln f\u00fcr Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box", + "caption": "KI-generiertes Titelbild zu: Neue Mautregeln f\u00fcr Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box", + "copyright": "OpenAI DALL\u00b7E", + "copyright_url": "https://openai.com/dall-e" + } + ], + "source": "https://www.promobil.de/rss/ratgeber" } ] \ No newline at end of file diff --git a/internal/git.sh b/internal/git.sh new file mode 100644 index 0000000..f79f0d3 --- /dev/null +++ b/internal/git.sh @@ -0,0 +1,20 @@ +# Aktuellen Stand vom main/master holen +git checkout main +git pull origin main + +# Neuen Feature-Branch erstellen +git checkout -b feature/neue-funktion + +# Entwickeln und committen +git add . +git commit -m "Neue Funktion implementiert" + +# Branch auf Remote-Repository pushen +git push -u origin feature/neue-funktion + + +# Alle Branches anzeigen +git branch -a + +# Aktuellen Branch anzeigen +git branch --show-current \ No newline at end of file diff --git a/logs/rss_tool.log b/logs/rss_tool.log index 5ed7b3a..c4cd20e 100644 --- a/logs/rss_tool.log +++ b/logs/rss_tool.log @@ -218,3 +218,296 @@ 2025-07-11 08:54:54,834 - INFO - 5 neue Artikel gespeichert. 2025-07-11 09:34:42,951 - INFO - ❌ Feed gelöscht: Promobil Ratgeber (https://www.promobil.de/rss/ratgeber) 2025-07-11 09:35:05,863 - INFO - 🔗 Neuer Feed hinzugefügt: Promobil Ratgeber (https://www.promobil.de/rss/ratgeber) +2025-07-28 09:17:09,355 - INFO - ✍️ Umschreiben von: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-07-28 09:17:19,759 - INFO - Retrying request to /chat/completions in 0.484478 seconds +2025-07-28 09:17:30,386 - INFO - Retrying request to /chat/completions in 0.765465 seconds +2025-07-28 09:17:41,238 - ERROR - ❌ Fehler beim Umschreiben von 'Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun!': +Traceback (most recent call last): + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 101, in map_httpcore_exceptions + yield + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 250, in handle_request + resp = self._pool.handle_request(req) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection_pool.py", line 256, in handle_request + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection_pool.py", line 236, in handle_request + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection.py", line 101, in handle_request + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection.py", line 78, in handle_request + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection.py", line 124, in _connect + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_backends/sync.py", line 207, in connect_tcp + File "/opt/homebrew/Cellar/python@3.13/3.13.5/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py", line 162, in __exit__ + self.gen.throw(value) + ~~~~~~~~~~~~~~^^^^^^^ + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_exceptions.py", line 14, in map_exceptions +httpcore.ConnectError: [Errno 8] nodename nor servname provided, or not known + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/_base_client.py", line 972, in request + response = self._client.send( + request, + stream=stream or self._should_stream_response_body(request=request), + **kwargs, + ) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_client.py", line 914, in send + response = self._send_handling_auth( + request, + ...<2 lines>... + history=[], + ) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_client.py", line 942, in _send_handling_auth + response = self._send_handling_redirects( + request, + follow_redirects=follow_redirects, + history=history, + ) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_client.py", line 979, in _send_handling_redirects + response = self._send_single_request(request) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_client.py", line 1014, in _send_single_request + response = transport.handle_request(request) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 249, in handle_request + with map_httpcore_exceptions(): + ~~~~~~~~~~~~~~~~~~~~~~~^^ + File "/opt/homebrew/Cellar/python@3.13/3.13.5/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py", line 162, in __exit__ + self.gen.throw(value) + ~~~~~~~~~~~~~~^^^^^^^ + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 118, in map_httpcore_exceptions + raise mapped_exc(message) from exc +httpx.ConnectError: [Errno 8] nodename nor servname provided, or not known + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "/Users/oliver/Documents/rss-news/main.py", line 145, in rewrite_articles + response = openai.chat.completions.create( + model="gpt-4", + ...<3 lines>... + ] + ) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/_utils/_utils.py", line 287, in wrapper + return func(*args, **kwargs) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/resources/chat/completions/completions.py", line 1087, in create + return self._post( + ~~~~~~~~~~^ + "/chat/completions", + ^^^^^^^^^^^^^^^^^^^^ + ...<43 lines>... + stream_cls=Stream[ChatCompletionChunk], + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/_base_client.py", line 1249, in post + return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)) + ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/_base_client.py", line 1004, in request + raise APIConnectionError(request=request) from err +openai.APIConnectionError: Connection error. +2025-07-28 09:18:02,091 - INFO - ✍️ Umschreiben von: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-07-28 09:18:02,094 - INFO - Retrying request to /chat/completions in 0.415304 seconds +2025-07-28 09:18:02,517 - INFO - Retrying request to /chat/completions in 0.899018 seconds +2025-07-28 09:18:03,419 - ERROR - ❌ Fehler beim Umschreiben von 'Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans': +Traceback (most recent call last): + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 101, in map_httpcore_exceptions + yield + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 250, in handle_request + resp = self._pool.handle_request(req) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection_pool.py", line 256, in handle_request + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection_pool.py", line 236, in handle_request + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection.py", line 101, in handle_request + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection.py", line 78, in handle_request + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_sync/connection.py", line 124, in _connect + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_backends/sync.py", line 207, in connect_tcp + File "/opt/homebrew/Cellar/python@3.13/3.13.5/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py", line 162, in __exit__ + self.gen.throw(value) + ~~~~~~~~~~~~~~^^^^^^^ + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpcore/_exceptions.py", line 14, in map_exceptions +httpcore.ConnectError: [Errno 8] nodename nor servname provided, or not known + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/_base_client.py", line 972, in request + response = self._client.send( + request, + stream=stream or self._should_stream_response_body(request=request), + **kwargs, + ) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_client.py", line 914, in send + response = self._send_handling_auth( + request, + ...<2 lines>... + history=[], + ) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_client.py", line 942, in _send_handling_auth + response = self._send_handling_redirects( + request, + follow_redirects=follow_redirects, + history=history, + ) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_client.py", line 979, in _send_handling_redirects + response = self._send_single_request(request) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_client.py", line 1014, in _send_single_request + response = transport.handle_request(request) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 249, in handle_request + with map_httpcore_exceptions(): + ~~~~~~~~~~~~~~~~~~~~~~~^^ + File "/opt/homebrew/Cellar/python@3.13/3.13.5/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py", line 162, in __exit__ + self.gen.throw(value) + ~~~~~~~~~~~~~~^^^^^^^ + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/httpx/_transports/default.py", line 118, in map_httpcore_exceptions + raise mapped_exc(message) from exc +httpx.ConnectError: [Errno 8] nodename nor servname provided, or not known + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "/Users/oliver/Documents/rss-news/main.py", line 145, in rewrite_articles + response = openai.chat.completions.create( + model="gpt-4", + ...<3 lines>... + ] + ) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/_utils/_utils.py", line 287, in wrapper + return func(*args, **kwargs) + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/resources/chat/completions/completions.py", line 1087, in create + return self._post( + ~~~~~~~~~~^ + "/chat/completions", + ^^^^^^^^^^^^^^^^^^^^ + ...<43 lines>... + stream_cls=Stream[ChatCompletionChunk], + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/_base_client.py", line 1249, in post + return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)) + ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/oliver/Documents/rss-news/.venv/lib/python3.13/site-packages/openai/_base_client.py", line 1004, in request + raise APIConnectionError(request=request) from err +openai.APIConnectionError: Connection error. +2025-07-28 09:18:43,426 - INFO - ✍️ Umschreiben von: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-07-28 09:19:04,744 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-28 09:19:09,962 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-28 09:19:09,964 - INFO - ✅ Artikel umgeschrieben: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-07-28 09:19:09,964 - INFO - ✍️ Umschreiben von: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-07-28 09:19:23,989 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-28 09:19:27,267 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-28 09:19:27,269 - INFO - ✅ Artikel umgeschrieben: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-07-28 09:19:27,276 - INFO - Alle Artikel mit Status 'Rewrite' wurden verarbeitet. +2025-07-28 09:27:10,258 - INFO - 🧠 Generiere DALL·E-Bild für Prompt: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-07-28 09:27:26,502 - INFO - HTTP Request: POST https://api.openai.com/v1/images/generations "HTTP/1.1 200 OK" +2025-07-28 09:27:26,514 - INFO - ✅ Bild generiert: https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-yKWdGDCQJZBOCQ4V4HoD40A0.png?st=2025-07-28T06%3A27%3A26Z&se=2025-07-28T08%3A27%3A26Z&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-27T22%3A07%3A39Z&ske=2025-07-28T22%3A07%3A39Z&sks=b&skv=2024-08-04&sig=HUMRhg2FbaKnLil%2BMbyvNemVeBcrvTODpctkfQyFHPc%3D +2025-07-28 09:39:35,087 - INFO - Lade Feed: https://www.camping-news.de/rss/ +2025-07-28 09:39:35,473 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ +2025-07-28 09:39:35,473 - INFO - Lade Feed: https://www.promobil.de/rss/news +2025-07-28 09:39:35,914 - INFO - 0 neue Artikel gefunden in https://www.promobil.de/rss/news +2025-07-28 09:39:35,915 - INFO - Lade Feed: https://www.promobil.de/rss/ratgeber +2025-07-28 09:39:36,365 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/ +2025-07-28 09:39:36,584 - INFO - 16 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/ +2025-07-28 09:39:36,585 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/ +2025-07-28 09:39:36,793 - INFO - 13 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/ +2025-07-28 09:39:36,794 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/ +2025-07-28 09:39:36,999 - INFO - 15 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/ +2025-07-28 09:39:36,999 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/ +2025-07-28 09:39:37,219 - INFO - 14 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/ +2025-07-28 09:39:37,220 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/ +2025-07-28 09:39:37,439 - INFO - 22 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/ +2025-07-28 09:39:37,440 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/ +2025-07-28 09:39:37,744 - INFO - 13 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/ +2025-07-28 09:39:37,746 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/ +2025-07-28 09:39:37,983 - INFO - 17 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/ +2025-07-28 09:39:37,984 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/ +2025-07-28 09:39:38,242 - INFO - 20 Bilder gefunden bei https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/ +2025-07-28 09:39:38,244 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/ +2025-07-28 09:39:38,476 - INFO - 20 Bilder gefunden bei https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/ +2025-07-28 09:39:38,479 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/ +2025-07-28 09:39:38,758 - INFO - 24 Bilder gefunden bei https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/ +2025-07-28 09:39:38,759 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/ +2025-07-28 09:39:39,019 - INFO - 16 Bilder gefunden bei https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/ +2025-07-28 09:39:39,021 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/ +2025-07-28 09:39:39,254 - INFO - 13 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/ +2025-07-28 09:39:39,256 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/ +2025-07-28 09:39:39,516 - INFO - 18 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/ +2025-07-28 09:39:39,517 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/ +2025-07-28 09:39:39,729 - INFO - 13 Bilder gefunden bei https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/ +2025-07-28 09:39:39,731 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/ +2025-07-28 09:39:39,951 - INFO - 13 Bilder gefunden bei https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/ +2025-07-28 09:39:39,952 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/ +2025-07-28 09:39:40,197 - INFO - 13 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/ +2025-07-28 09:39:40,199 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/ +2025-07-28 09:39:40,458 - INFO - 13 Bilder gefunden bei https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/ +2025-07-28 09:39:40,462 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/ +2025-07-28 09:39:40,695 - INFO - 16 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/ +2025-07-28 09:39:40,697 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/ +2025-07-28 09:39:40,919 - INFO - 14 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/ +2025-07-28 09:39:40,922 - INFO - 📷 Extrahiere Bilder von https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/ +2025-07-28 09:39:41,210 - INFO - 17 Bilder gefunden bei https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/ +2025-07-28 09:39:41,210 - INFO - 20 neue Artikel gefunden in https://www.promobil.de/rss/ratgeber +2025-07-28 09:39:41,211 - INFO - Lade Feed: https://caravan.fm/ +2025-07-28 09:39:44,233 - INFO - 0 neue Artikel gefunden in https://caravan.fm/ +2025-07-28 09:39:44,238 - INFO - 20 neue Artikel gespeichert. +2025-07-28 09:42:36,590 - INFO - ❌ Feed gelöscht: Neuer Feed (https://caravan.fm/) +2025-07-28 09:44:53,801 - INFO - ✍️ Umschreiben von: Pannen und Probleme im Wohnmobil & Wohnwagen: Erste Hilfe für die Camper-Bordtechnik +2025-07-28 09:45:18,500 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-28 09:45:21,113 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-07-28 09:45:21,126 - INFO - ✅ Artikel umgeschrieben: Pannen und Probleme im Wohnmobil & Wohnwagen: Erste Hilfe für die Camper-Bordtechnik +2025-07-28 09:45:21,146 - INFO - Alle Artikel mit Status 'Rewrite' wurden verarbeitet. +2025-07-28 10:29:47,016 - INFO - Lade Feed: https://www.camping-news.de/rss/ +2025-07-28 10:29:47,407 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ +2025-07-28 10:29:47,407 - INFO - Lade Feed: https://www.promobil.de/rss/news +2025-07-28 10:29:47,719 - INFO - 0 neue Artikel gefunden in https://www.promobil.de/rss/news +2025-07-28 10:29:47,719 - INFO - Lade Feed: https://www.promobil.de/rss/ratgeber +2025-07-28 10:29:48,183 - INFO - 0 neue Artikel gefunden in https://www.promobil.de/rss/ratgeber +2025-07-28 10:29:48,183 - INFO - Keine neuen Artikel gefunden. +2025-07-29 19:30:44,481 - INFO - Lade Feed: https://www.camping-news.de/rss/ +2025-07-29 19:30:44,923 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ +2025-07-29 19:30:44,923 - INFO - Lade Feed: https://www.promobil.de/rss/news +2025-07-29 19:30:45,348 - INFO - 0 neue Artikel gefunden in https://www.promobil.de/rss/news +2025-07-29 19:30:45,348 - INFO - Lade Feed: https://www.promobil.de/rss/ratgeber +2025-07-29 19:30:45,899 - INFO - 0 neue Artikel gefunden in https://www.promobil.de/rss/ratgeber +2025-07-29 19:30:45,899 - INFO - Keine neuen Artikel gefunden. +2025-08-15 09:44:18,677 - INFO - Lade Feed: https://www.camping-news.de/rss/ +2025-08-15 09:44:18,993 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ +2025-08-15 09:44:18,993 - INFO - Lade Feed: https://www.promobil.de/rss/news +2025-08-15 09:44:19,241 - INFO - 0 neue Artikel gefunden in https://www.promobil.de/rss/news +2025-08-15 09:44:19,241 - INFO - Lade Feed: https://www.promobil.de/rss/ratgeber +2025-08-15 09:44:19,550 - INFO - 🖼️ Starte Bildextraktion von: https://www.promobil.de/weitere-ratgeber/frankreichs-autobahnen-kein-adac-schutz-bei-pannen/ +2025-08-15 09:44:19,709 - INFO - 🔍 12 img-Tags gefunden +2025-08-15 09:44:19,710 - INFO - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-15 09:44:19,710 - ERROR - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.promobil.de/weitere-ratgeber/frankreichs-autobahnen-kein-adac-schutz-bei-pannen/: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-15 09:44:19,710 - INFO - 🖼️ Starte Bildextraktion von: https://www.promobil.de/weitere-ratgeber/warntafel-wahnsinn-in-italien-anbringen-an-fahrradtraegern-trotz-neuer-gesetze-empfohlen/ +2025-08-15 09:44:19,856 - INFO - 🔍 13 img-Tags gefunden +2025-08-15 09:44:19,856 - INFO - ✅ Bild hinzugefügt: 02/2024, Fahrradträger mit Warntafel... +2025-08-15 09:44:19,856 - INFO - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-15 09:44:19,857 - ERROR - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.promobil.de/weitere-ratgeber/warntafel-wahnsinn-in-italien-anbringen-an-fahrradtraegern-trotz-neuer-gesetze-empfohlen/: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-15 09:44:19,859 - INFO - 🖼️ Starte Bildextraktion von: https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/ +2025-08-15 09:44:20,025 - INFO - 🔍 20 img-Tags gefunden +2025-08-15 09:44:20,025 - INFO - ✅ Bild hinzugefügt: Maut, Basis, Wissen, Österreich, Vignette, Go-Box,... +2025-08-15 09:44:20,025 - INFO - ✅ Bild hinzugefügt: Wohnmobil, Küste, Parkplatz, Wohnmobil, Mann... +2025-08-15 09:44:20,026 - INFO - ✅ Bild hinzugefügt: 05/2025, Spanien Polizei Verkehr... +2025-08-15 09:44:20,026 - INFO - ✅ Bild hinzugefügt: f_Autohof, Restaurant, essen, vegetarisch... +2025-08-15 09:44:20,026 - INFO - ✅ Bild hinzugefügt: Supercheck, Dethleffs Magic Edition T 2 EB, Seiten... +2025-08-15 09:44:20,026 - INFO - 🎉 5 Bilder erfolgreich extrahiert von https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/ +2025-08-15 09:44:20,026 - INFO - 3 neue Artikel gefunden in https://www.promobil.de/rss/ratgeber +2025-08-15 09:44:20,038 - INFO - 3 neue Artikel gespeichert. +2025-08-15 09:45:55,607 - INFO - ✍️ Umschreiben von: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-15 09:46:09,158 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-15 09:46:11,508 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-15 09:46:11,564 - INFO - ✅ Artikel umgeschrieben: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-15 09:46:11,565 - INFO - ✍️ Umschreiben von: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-15 09:46:32,092 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-15 09:46:34,549 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-15 09:46:34,552 - INFO - ✅ Artikel umgeschrieben: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-15 09:46:34,571 - INFO - Alle Artikel mit Status 'Rewrite' wurden verarbeitet. +2025-08-15 09:48:30,972 - INFO - 🧠 Generiere DALL·E-Bild für Prompt: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-15 09:48:42,548 - INFO - HTTP Request: POST https://api.openai.com/v1/images/generations "HTTP/1.1 200 OK" +2025-08-15 09:48:42,559 - INFO - ✅ Bild generiert: https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-Ksiks2ssSZxpEFf1MQedlap1.png?st=2025-08-15T06%3A48%3A42Z&se=2025-08-15T08%3A48%3A42Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=8b33a531-2df9-46a3-bc02-d4b1430a422c&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-08-14T16%3A59%3A16Z&ske=2025-08-15T16%3A59%3A16Z&sks=b&skv=2024-08-04&sig=e0/ULpNgNLwixo3UapqnxHgR18t4HCpyEtnbmik33yA%3D +2025-08-15 09:51:43,090 - INFO - 🧠 Generiere DALL·E-Bild für Prompt: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-15 09:51:53,907 - INFO - HTTP Request: POST https://api.openai.com/v1/images/generations "HTTP/1.1 200 OK" +2025-08-15 09:51:53,914 - INFO - ✅ Bild generiert: https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-Pl4ik6W7mTrv2MhIbdWlwgOL.png?st=2025-08-15T06%3A51%3A53Z&se=2025-08-15T08%3A51%3A53Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=b1a0ae1f-618f-4548-84fd-8b16cacd5485&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-08-14T15%3A09%3A17Z&ske=2025-08-15T15%3A09%3A17Z&sks=b&skv=2024-08-04&sig=RHIFlJLMumrcr/jEskOVfqJ%2Bns0pDS2HM8l5siBfLmM%3D +2025-08-15 09:55:42,370 - INFO - Lade Feed: https://www.camping-news.de/rss/ +2025-08-15 09:55:42,639 - INFO - 0 neue Artikel gefunden in https://www.camping-news.de/rss/ +2025-08-15 09:55:42,640 - INFO - Lade Feed: https://www.promobil.de/rss/news +2025-08-15 09:55:42,843 - INFO - 0 neue Artikel gefunden in https://www.promobil.de/rss/news +2025-08-15 09:55:42,843 - INFO - Lade Feed: https://www.promobil.de/rss/ratgeber +2025-08-15 09:55:43,180 - INFO - 0 neue Artikel gefunden in https://www.promobil.de/rss/ratgeber +2025-08-15 09:55:43,180 - INFO - Keine neuen Artikel gefunden. diff --git a/main.py b/main.py index ff17f33..c0a0221 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,8 @@ import logging import openai from utils.image_extractor import extract_images_with_metadata from utils.article_extractor import extract_full_article +import hashlib +import time load_dotenv() @@ -17,10 +19,15 @@ load_dotenv() log_dir = "logs" os.makedirs(log_dir, exist_ok=True) log_file = os.path.join(log_dir, "rss_tool.log") + +# Logging-Format verbessern logging.basicConfig( - filename=log_file, level=logging.INFO, - format="%(asctime)s - %(levelname)s - %(message)s" + format="%(asctime)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s", + handlers=[ + logging.FileHandler(log_file, encoding='utf-8'), + logging.StreamHandler() # Auch in Konsole ausgeben + ] ) openai.api_key = os.getenv("OPENAI_API_KEY") @@ -29,156 +36,412 @@ ARTICLES_FILE = "data/articles.json" FEEDS_FILE = "data/feeds.json" VALID_STATUSES = ["New", "Rewrite", "Process", "Online", "On Hold", "Trash"] +# === Datenordner erstellen === +os.makedirs("data", exist_ok=True) + +def generate_article_id(title, link, date): + """Generiert eine eindeutige ID für einen Artikel basierend auf mehreren Attributen""" + identifier = f"{title}_{link}_{date}" + return hashlib.md5(identifier.encode('utf-8')).hexdigest() + +def is_duplicate_article(new_article, existing_articles): + """Prüft ob ein Artikel bereits existiert (erweiterte Duplikatserkennung)""" + new_title = new_article.get("title", "").lower().strip() + new_link = new_article.get("link", "").strip() + + for existing in existing_articles: + existing_title = existing.get("title", "").lower().strip() + existing_link = existing.get("link", "").strip() + + # Exakte URL-Übereinstimmung + if new_link and existing_link and new_link == existing_link: + return True + + # Sehr ähnliche Titel (mindestens 90% Übereinstimmung) + if new_title and existing_title: + similarity = calculate_similarity(new_title, existing_title) + if similarity > 0.9: + return True + + return False + +def calculate_similarity(text1, text2): + """Berechnet die Ähnlichkeit zwischen zwei Texten (vereinfachte Methode)""" + words1 = set(text1.split()) + words2 = set(text2.split()) + + if not words1 and not words2: + return 1.0 + if not words1 or not words2: + return 0.0 + + intersection = len(words1.intersection(words2)) + union = len(words1.union(words2)) + + return intersection / union if union > 0 else 0.0 def load_feeds(): - if not os.path.exists(FEEDS_FILE): + """Lädt RSS-Feeds aus der JSON-Datei""" + try: + if not os.path.exists(FEEDS_FILE): + logging.info("Feeds-Datei existiert nicht, erstelle leere Liste") + return [] + + with open(FEEDS_FILE, "r", encoding='utf-8') as f: + feeds = json.load(f) + logging.info(f"✅ {len(feeds)} Feeds geladen") + return feeds + except Exception as e: + logging.error(f"❌ Fehler beim Laden der Feeds: {e}") return [] - with open(FEEDS_FILE, "r") as f: - return json.load(f) - def save_feeds(feeds): - with open(FEEDS_FILE, "w") as f: - json.dump(feeds, f, indent=2) - + """Speichert RSS-Feeds in die JSON-Datei""" + try: + with open(FEEDS_FILE, "w", encoding='utf-8') as f: + json.dump(feeds, f, indent=2, ensure_ascii=False) + logging.info(f"✅ {len(feeds)} Feeds gespeichert") + except Exception as e: + logging.error(f"❌ Fehler beim Speichern der Feeds: {e}") def load_articles(): - if not os.path.exists(ARTICLES_FILE): + """Lädt Artikel aus der JSON-Datei""" + try: + if not os.path.exists(ARTICLES_FILE): + logging.info("Artikel-Datei existiert nicht, erstelle leere Liste") + return [] + + with open(ARTICLES_FILE, "r", encoding='utf-8') as f: + articles = json.load(f) + + # Status-Validierung + for article in articles: + if article.get("status") not in VALID_STATUSES: + article["status"] = "New" + logging.warning(f"⚠️ Ungültiger Status für Artikel '{article.get('title', 'Unbekannt')}' korrigiert") + + logging.info(f"✅ {len(articles)} Artikel geladen") + return articles + except Exception as e: + logging.error(f"❌ Fehler beim Laden der Artikel: {e}") return [] - with open(ARTICLES_FILE, "r") as f: - articles = json.load(f) - - for article in articles: - if article.get("status") not in VALID_STATUSES: - article["status"] = "New" - return articles - def save_articles(articles): - with open(ARTICLES_FILE, "w") as f: - json.dump(articles, f, indent=2) - - -def fetch_and_process_feed(feed_url, existing_ids): - feed = feedparser.parse(feed_url) - new_articles = [] - - for entry in feed.entries: - article_id = entry.get("id") or entry.get("link") - if not article_id or article_id in existing_ids: - continue - - title = entry.get("title", "Kein Titel") - date = entry.get("published", datetime.now().isoformat()) - summary = entry.get("summary", "") - content = entry.get("content", [{}])[0].get("value") or entry.get("description", "") + """Speichert Artikel in die JSON-Datei""" + try: + # Validierung vor dem Speichern + valid_articles = [] + for article in articles: + if "id" in article and "title" in article: + valid_articles.append(article) + else: + logging.warning(f"⚠️ Ungültiger Artikel übersprungen: {article}") + + with open(ARTICLES_FILE, "w", encoding='utf-8') as f: + json.dump(valid_articles, f, indent=2, ensure_ascii=False) + + logging.info(f"✅ {len(valid_articles)} Artikel gespeichert") + except Exception as e: + logging.error(f"❌ Fehler beim Speichern der Artikel: {e}") +def clean_html_content(content): + """Bereinigt HTML-Inhalt und extrahiert Text""" + try: soup = BeautifulSoup(content, "html.parser") + + # Entferne Script- und Style-Tags + for script in soup(["script", "style"]): + script.decompose() + + # Hole sauberen Text clean_text = soup.get_text(" ", strip=True) + + # Entferne überschüssige Leerzeichen + clean_text = " ".join(clean_text.split()) + + return clean_text + except Exception as e: + logging.error(f"❌ Fehler beim Bereinigen des HTML-Inhalts: {e}") + return content - # Automatischer Volltext-Fetch bei zu wenig Wörtern - if len(clean_text.split()) < 50 and entry.get("link"): - fetched_text = extract_full_article(entry["link"]) - if len(fetched_text.split()) > len(clean_text.split()): - clean_text = fetched_text +def fetch_and_process_feed(feed_url, existing_articles): + """Lädt und verarbeitet einen einzelnen RSS-Feed""" + new_articles = [] + feed_name = "Unbekannt" + + try: + logging.info(f"🔄 Verarbeite Feed: {feed_url}") + + # Feed parsen + feed = feedparser.parse(feed_url) + + if hasattr(feed, 'feed') and hasattr(feed.feed, 'title'): + feed_name = feed.feed.title + logging.info(f"📡 Feed-Name: {feed_name}") + + if not feed.entries: + logging.warning(f"⚠️ Keine Einträge in Feed gefunden: {feed_url}") + return [] + + logging.info(f"📰 {len(feed.entries)} Einträge gefunden") + + for entry in feed.entries: + try: + # Basis-Informationen extrahieren + title = entry.get("title", "Kein Titel") + date = entry.get("published", datetime.now().isoformat()) + link = entry.get("link", "") + summary = entry.get("summary", "") + + # Content extrahieren + content = "" + if hasattr(entry, 'content') and entry.content: + content = entry.content[0].get("value", "") + elif hasattr(entry, 'description'): + content = entry.description + else: + content = summary + + # HTML bereinigen + clean_text = clean_html_content(content) + + # Volltext-Extraktion bei kurzen Artikeln + if len(clean_text.split()) < 50 and link: + logging.info(f"🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: {title}") + fetched_text = extract_full_article(link) + if len(fetched_text.split()) > len(clean_text.split()): + clean_text = fetched_text + logging.info(f"✅ Volltext extrahiert: {len(clean_text.split())} Wörter") + + # Artikel-ID generieren + article_id = generate_article_id(title, link, date) + + # Neuen Artikel erstellen + new_article = { + "id": article_id, + "title": title, + "date": date, + "summary": summary[:300] + "..." if len(summary) > 300 else summary, + "text": clean_text, + "tags": [], + "status": "New", + "link": link, + "images": [], + "source": feed_url, + "source_name": feed_name, + "created_at": datetime.now().isoformat(), + "word_count": len(clean_text.split()) + } + + # Duplikatsprüfung + if not is_duplicate_article(new_article, existing_articles): + # Bilder extrahieren + if link: + try: + images = extract_images_with_metadata(link) + new_article["images"] = images + logging.info(f"🖼️ {len(images)} Bilder für '{title}' extrahiert") + except Exception as e: + logging.error(f"❌ Fehler bei Bildextraktion für '{title}': {e}") + + new_articles.append(new_article) + logging.info(f"✅ Neuer Artikel hinzugefügt: {title}") + else: + logging.info(f"🔄 Duplikat übersprungen: {title}") + + except Exception as e: + logging.error(f"❌ Fehler beim Verarbeiten des Eintrags '{entry.get('title', 'Unbekannt')}': {e}") + continue + + logging.info(f"✅ Feed verarbeitet: {len(new_articles)} neue Artikel aus {feed_url}") + return new_articles + + except Exception as e: + logging.error(f"❌ Kritischer Fehler beim Verarbeiten von {feed_url}: {e}") + return [] - images = extract_images_with_metadata(entry.link) - - new_articles.append({ - "id": article_id, - "title": title, - "date": date, - "summary": summary, - "text": clean_text, - "tags": [], - "status": "New", - "link": entry.get("link", ""), - "images": images, - "source": feed_url - }) - - return new_articles - - -def process_articles(existing_ids): - feeds = load_feeds() - all_articles = load_articles() - articles_by_id = {article["id"]: article for article in all_articles if "id" in article} - new_entries = [] - - for feed in feeds: - url = feed.get("url") if isinstance(feed, dict) else feed - if not url: - continue - try: - logging.info(f"Lade Feed: {url}") - entries = fetch_and_process_feed(url, existing_ids) - new_entries.extend(entries) - logging.info(f"{len(entries)} neue Artikel gefunden in {url}") - except Exception as e: - logging.exception(f"Fehler beim Verarbeiten von {url}:") - - added = 0 - for entry in new_entries: - if entry["id"] not in articles_by_id: - articles_by_id[entry["id"]] = entry - added += 1 +def process_articles(existing_ids=None): + """Verarbeitet alle RSS-Feeds und fügt neue Artikel hinzu""" + try: + start_time = time.time() + logging.info("🚀 Starte Artikel-Verarbeitung") + + feeds = load_feeds() + all_articles = load_articles() + + if not feeds: + logging.warning("⚠️ Keine RSS-Feeds konfiguriert") + return + + # Bestehende Artikel für Duplikatsprüfung + existing_articles = all_articles.copy() + + total_new_articles = 0 + + for feed in feeds: + feed_url = feed.get("url") if isinstance(feed, dict) else feed + + if not feed_url: + logging.warning("⚠️ Feed ohne URL übersprungen") + continue + + try: + new_articles = fetch_and_process_feed(feed_url, existing_articles) + + # Neue Artikel zur Gesamtliste hinzufügen + for article in new_articles: + all_articles.append(article) + existing_articles.append(article) # Für weitere Duplikatsprüfung + + total_new_articles += len(new_articles) + + # Kurze Pause zwischen Feeds + time.sleep(1) + + except Exception as e: + logging.error(f"❌ Fehler beim Verarbeiten von Feed {feed_url}: {e}") + continue + + # Artikel speichern + if total_new_articles > 0: + save_articles(all_articles) + processing_time = time.time() - start_time + logging.info(f"🎉 Verarbeitung abgeschlossen: {total_new_articles} neue Artikel in {processing_time:.2f}s hinzugefügt") else: - logging.info(f"Artikel bereits vorhanden, wird übersprungen: {entry['title']}") - - if added > 0: - save_articles(list(articles_by_id.values())) - logging.info(f"{added} neue Artikel gespeichert.") - else: - logging.info("Keine neuen Artikel gefunden.") - + logging.info("ℹ️ Keine neuen Artikel gefunden") + + except Exception as e: + logging.error(f"❌ Kritischer Fehler bei der Artikel-Verarbeitung: {e}") def rewrite_articles(): - articles = load_articles() - changed = False - - for article in articles: - if article.get("status") == "Rewrite": + """Schreibt Artikel mit Status 'Rewrite' um""" + try: + logging.info("✍️ Starte Artikel-Umschreibung") + + articles = load_articles() + rewrite_articles_list = [a for a in articles if a.get("status") == "Rewrite"] + + if not rewrite_articles_list: + logging.info("ℹ️ Keine Artikel zum Umschreiben gefunden") + return + + if not openai.api_key: + logging.error("❌ OpenAI API-Key nicht konfiguriert") + return + + changed = False + + for article in rewrite_articles_list: try: logging.info(f"✍️ Umschreiben von: {article['title']}") - prompt = f"Schreibe folgenden Artikel um und fasse ihn verständlich zusammen:\n\n{article['text']}" + + # Artikel umschreiben + prompt = f"""Schreibe den folgenden Artikel um und fasse ihn verständlich zusammen. + Behalte die wichtigsten Informationen bei, aber formuliere alles neu: + + {article['text']}""" + response = openai.chat.completions.create( model="gpt-4", messages=[ - {"role": "system", "content": "Du bist ein professioneller Redakteur."}, + {"role": "system", "content": "Du bist ein professioneller Redakteur, der Artikel umschreibt und verbessert."}, {"role": "user", "content": prompt} - ] + ], + max_tokens=1500, + temperature=0.7 ) + new_text = response.choices[0].message.content.strip() - article["text"] = f"{article['title']}\n\n{new_text}" - article["status"] = "Process" + + # Tags generieren + tag_prompt = f"""Erstelle 3-5 passende, kurze Stichwörter (Tags) für diesen Artikel. + Gib nur die Tags zurück, getrennt durch Kommas: - tag_prompt = f"Erstelle 3 passende, kurze Stichwörter (Tags) für diesen Artikel:\n\n{new_text}" + {new_text}""" + tag_response = openai.chat.completions.create( model="gpt-4", messages=[ - {"role": "system", "content": "Du bist ein Blog-Tag-Generator."}, + {"role": "system", "content": "Du generierst präzise Tags für Blog-Artikel."}, {"role": "user", "content": tag_prompt} - ] + ], + max_tokens=100, + temperature=0.5 ) + tags_raw = tag_response.choices[0].message.content.strip() - tags = [tag.strip(" ,") for tag in tags_raw.replace("\n", ",").split(",") if tag.strip()] + tags = [tag.strip().strip(',') for tag in tags_raw.split(",") if tag.strip()] + + # Artikel aktualisieren + article["text"] = new_text article["tags"] = tags - + article["status"] = "Process" + article["rewritten_at"] = datetime.now().isoformat() + article["word_count"] = len(new_text.split()) + + # Bildmetadaten vervollständigen falls nötig for img in article.get("images", []): - if "caption" not in img: + if "caption" not in img or not img["caption"]: img["caption"] = "Kein Bildtitel vorhanden" - if "copyright" not in img: + if "copyright" not in img or not img["copyright"]: img["copyright"] = "Unbekannt" - if "copyright_url" not in img: + if "copyright_url" not in img or not img["copyright_url"]: img["copyright_url"] = "#" - - logging.info(f"✅ Artikel umgeschrieben: {article['title']}") + + logging.info(f"✅ Artikel erfolgreich umgeschrieben: {article['title']}") changed = True - + + # Kurze Pause zwischen API-Calls + time.sleep(2) + except Exception as e: - logging.exception(f"❌ Fehler beim Umschreiben von '{article['title']}':") + logging.error(f"❌ Fehler beim Umschreiben von '{article['title']}': {e}") + continue + + if changed: + save_articles(articles) + logging.info(f"🎉 {len(rewrite_articles_list)} Artikel erfolgreich umgeschrieben") + + except Exception as e: + logging.error(f"❌ Kritischer Fehler beim Umschreiben: {e}") - if changed: - save_articles(articles) - logging.info("Alle Artikel mit Status 'Rewrite' wurden verarbeitet.") +def get_article_stats(): + """Gibt Statistiken über die Artikel zurück""" + try: + articles = load_articles() + + stats = { + "total_articles": len(articles), + "status_distribution": {}, + "word_count_stats": {}, + "source_distribution": {}, + "images_count": 0 + } + + # Status-Verteilung + for article in articles: + status = article.get("status", "New") + stats["status_distribution"][status] = stats["status_distribution"].get(status, 0) + 1 + + # Wortanzahl-Statistiken + word_counts = [article.get("word_count", 0) for article in articles if article.get("word_count")] + if word_counts: + stats["word_count_stats"] = { + "average": sum(word_counts) // len(word_counts), + "min": min(word_counts), + "max": max(word_counts) + } + + # Quellen-Verteilung + for article in articles: + source = article.get("source_name", "Unbekannt") + stats["source_distribution"][source] = stats["source_distribution"].get(source, 0) + 1 + + # Bilder zählen + stats["images_count"] = sum(len(article.get("images", [])) for article in articles) + + return stats + + except Exception as e: + logging.error(f"❌ Fehler beim Erstellen der Statistiken: {e}") + return {} \ No newline at end of file diff --git a/utils/article_extractor.py b/utils/article_extractor.py index 3e9bdc3..346a07f 100644 --- a/utils/article_extractor.py +++ b/utils/article_extractor.py @@ -2,26 +2,362 @@ import requests from bs4 import BeautifulSoup +import logging +import time +from typing import Optional + +# Konfiguration +REQUEST_TIMEOUT = 15 +MAX_RETRIES = 3 +USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + +# Website-spezifische Selektoren +CONTENT_SELECTORS = { + # Promobil & Camping-spezifisch + 'promobil.de': [ + {'tag': 'div', 'class': 'article__text'}, + {'tag': 'div', 'class': 'article-content'}, + {'tag': 'div', 'class': 'content-text'} + ], + 'camping.info': [ + {'tag': 'div', 'class': 'article-body'}, + {'tag': 'div', 'class': 'post-content'} + ], + 'caravaning.de': [ + {'tag': 'div', 'class': 'article__content'}, + {'tag': 'div', 'class': 'entry-content'} + ], + + # WordPress Standard-Selektoren + 'wordpress': [ + {'tag': 'div', 'class': 'entry-content'}, + {'tag': 'div', 'class': 'post-content'}, + {'tag': 'div', 'class': 'content'}, + {'tag': 'main', 'class': 'main-content'}, + {'tag': 'article', 'class': None} + ], + + # Allgemeine Fallbacks + 'generic': [ + {'tag': 'article', 'class': None}, + {'tag': 'div', 'class': 'content'}, + {'tag': 'div', 'class': 'post'}, + {'tag': 'div', 'class': 'entry'}, + {'tag': 'main', 'class': None}, + {'tag': 'div', 'id': 'content'}, + {'tag': 'div', 'id': 'main'} + ] +} + +def get_domain_from_url(url: str) -> str: + """ + Extrahiert die Domain aus einer URL + """ + try: + from urllib.parse import urlparse + parsed = urlparse(url) + return parsed.netloc.lower() + except: + return "" + +def get_selectors_for_domain(domain: str) -> list: + """ + Gibt die passenden Selektoren für eine Domain zurück + """ + # Direkte Domain-Matches + for known_domain in CONTENT_SELECTORS: + if known_domain != 'wordpress' and known_domain != 'generic' and known_domain in domain: + return CONTENT_SELECTORS[known_domain] + + # WordPress erkennen (wird später durch Meta-Tags erkannt) + return CONTENT_SELECTORS['generic'] + +def is_wordpress_site(soup: BeautifulSoup) -> bool: + """ + Erkennt WordPress-Websites anhand von Meta-Tags + """ + try: + # WordPress Generator Meta-Tag + generator = soup.find('meta', attrs={'name': 'generator'}) + if generator and 'wordpress' in generator.get('content', '').lower(): + return True + + # WordPress-spezifische Link-Tags + wp_links = soup.find_all('link', href=lambda x: x and '/wp-' in x) + if wp_links: + return True + + # WordPress REST API + rest_api = soup.find('link', attrs={'rel': 'https://api.w.org/'}) + if rest_api: + return True + + return False + except: + return False + +def clean_extracted_text(text: str) -> str: + """ + Bereinigt extrahierten Text von unerwünschten Elementen + """ + if not text: + return "" + + lines = text.split('\n') + cleaned_lines = [] + + for line in lines: + line = line.strip() + + # Überspringe sehr kurze Zeilen (wahrscheinlich Navigation/Werbung) + if len(line) < 10: + continue + + # Überspringe typische Navigation/Footer-Texte + skip_patterns = [ + 'cookie', 'datenschutz', 'impressum', 'agb', 'newsletter', + 'folgen sie uns', 'social media', 'teilen', 'weiterlesen', + 'mehr zum thema', 'ähnliche artikel', 'kommentare', + 'anzeige', 'werbung', 'advertisement' + ] + + if any(pattern in line.lower() for pattern in skip_patterns): + continue + + # Überspringe Zeilen mit zu vielen Sonderzeichen (Navigation) + if len([c for c in line if c in '|•→←↑↓']) > 3: + continue + + cleaned_lines.append(line) + + # Text zusammenfügen + cleaned_text = ' '.join(cleaned_lines) + + # Mehrfache Leerzeichen entfernen + cleaned_text = ' '.join(cleaned_text.split()) + + return cleaned_text + +def extract_with_selectors(soup: BeautifulSoup, selectors: list) -> str: + """ + Versucht Text mit einer Liste von Selektoren zu extrahieren + """ + for selector in selectors: + try: + element = None + + if selector.get('class'): + element = soup.find(selector['tag'], class_=selector['class']) + elif selector.get('id'): + element = soup.find(selector['tag'], id=selector['id']) + else: + element = soup.find(selector['tag']) + + if element: + # Entferne Script- und Style-Tags + for script in element(['script', 'style', 'nav', 'header', 'footer', 'aside']): + script.decompose() + + text = element.get_text(' ', strip=True) + + # Nur zurückgeben wenn genügend Text vorhanden + if len(text.split()) > 50: + logging.info(f"✅ Erfolgreiche Extraktion mit Selektor: {selector}") + return clean_extracted_text(text) + + except Exception as e: + logging.debug(f"Selektor {selector} fehlgeschlagen: {e}") + continue + + return "" + +def extract_from_paragraphs(soup: BeautifulSoup) -> str: + """ + Fallback: Extrahiert Text aus allen Paragraph-Tags + """ + try: + paragraphs = soup.find_all('p') + + if not paragraphs: + return "" + + # Sammle alle Paragraph-Texte + texts = [] + for p in paragraphs: + text = p.get_text(strip=True) + if len(text) > 20: # Nur längere Absätze + texts.append(text) + + combined_text = ' '.join(texts) + + if len(combined_text.split()) > 30: + logging.info(f"✅ Fallback-Extraktion aus {len(paragraphs)} Paragraphen") + return clean_extracted_text(combined_text) + + return "" + + except Exception as e: + logging.error(f"Fehler bei Paragraph-Extraktion: {e}") + return "" def extract_full_article(url: str) -> str: - try: - response = requests.get(url, timeout=10) - response.raise_for_status() - soup = BeautifulSoup(response.text, "html.parser") - - # Promobil & WordPress & allgemeine Fallbacks - candidates = [ - {"tag": "div", "class_": "article__text"}, # Promobil - {"tag": "div", "class_": "entry-content"}, # WordPress Standard - {"tag": "article", "class_": None}, # Generisch - ] - - for selector in candidates: - el = soup.find(selector["tag"], class_=selector["class_"]) - if el and len(el.get_text(strip=True).split()) > 50: - return el.get_text(" ", strip=True) - - # Fallback: ganzer Seiteninhalt - return soup.get_text(" ", strip=True) - except Exception: + """ + Hauptfunktion: Extrahiert den vollständigen Artikeltext von einer URL + """ + if not url: return "" + + retries = 0 + + while retries < MAX_RETRIES: + try: + logging.info(f"📰 Starte Volltextextraktion von: {url} (Versuch {retries + 1})") + + # HTTP-Request mit verbessertem Header + headers = { + 'User-Agent': USER_AGENT, + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'de,en-US;q=0.7,en;q=0.3', + 'Accept-Encoding': 'gzip, deflate', + 'Connection': 'keep-alive', + 'Upgrade-Insecure-Requests': '1', + } + + response = requests.get(url, timeout=REQUEST_TIMEOUT, headers=headers) + response.raise_for_status() + + # Encoding sicherstellen + if response.encoding.lower() in ['iso-8859-1', 'windows-1252']: + response.encoding = 'utf-8' + + soup = BeautifulSoup(response.text, "html.parser") + + # Domain-spezifische Selektoren ermitteln + domain = get_domain_from_url(url) + selectors = get_selectors_for_domain(domain) + + # WordPress erkennen und entsprechende Selektoren verwenden + if is_wordpress_site(soup): + logging.info("🔧 WordPress-Site erkannt") + selectors = CONTENT_SELECTORS['wordpress'] + selectors + + # 1. Versuch: Domain-spezifische Selektoren + extracted_text = extract_with_selectors(soup, selectors) + + if extracted_text and len(extracted_text.split()) > 50: + logging.info(f"🎉 Erfolgreiche Extraktion: {len(extracted_text.split())} Wörter") + return extracted_text + + # 2. Versuch: Generische Selektoren + if not extracted_text: + logging.info("🔄 Fallback auf generische Selektoren") + extracted_text = extract_with_selectors(soup, CONTENT_SELECTORS['generic']) + + if extracted_text and len(extracted_text.split()) > 50: + logging.info(f"🎉 Erfolgreiche Extraktion (generisch): {len(extracted_text.split())} Wörter") + return extracted_text + + # 3. Versuch: Paragraph-Extraktion + if not extracted_text: + logging.info("🔄 Fallback auf Paragraph-Extraktion") + extracted_text = extract_from_paragraphs(soup) + + if extracted_text and len(extracted_text.split()) > 30: + logging.info(f"🎉 Erfolgreiche Extraktion (Paragraphen): {len(extracted_text.split())} Wörter") + return extracted_text + + # 4. Letzter Versuch: Gesamter Body-Text + if not extracted_text: + logging.info("🔄 Letzter Fallback: Body-Text") + body = soup.find('body') + if body: + # Entferne Navigation, Header, Footer + for element in body(['nav', 'header', 'footer', 'aside', 'script', 'style']): + element.decompose() + + body_text = body.get_text(' ', strip=True) + if len(body_text.split()) > 100: + extracted_text = clean_extracted_text(body_text) + logging.info(f"⚠️ Body-Extraktion: {len(extracted_text.split())} Wörter") + return extracted_text + + # Kein brauchbarer Text gefunden + if not extracted_text: + logging.warning(f"⚠️ Keine verwertbaren Inhalte gefunden bei: {url}") + return "" + + return extracted_text + + except requests.RequestException as e: + retries += 1 + logging.warning(f"🌐 Netzwerkfehler bei {url} (Versuch {retries}): {e}") + + if retries < MAX_RETRIES: + time.sleep(2 ** retries) # Exponential backoff + continue + else: + logging.error(f"❌ Maximale Anzahl Versuche erreicht für: {url}") + return "" + + except Exception as e: + logging.error(f"❌ Unerwarteter Fehler bei Volltextextraktion von {url}: {e}") + return "" + + return "" + +def extract_article_summary(full_text: str, max_length: int = 300) -> str: + """ + Erstellt eine intelligente Zusammenfassung aus dem Volltext + """ + if not full_text: + return "" + + sentences = full_text.split('.') + + # Erste 2-3 sinnvolle Sätze als Summary verwenden + summary_sentences = [] + current_length = 0 + + for sentence in sentences[:5]: # Maximal erste 5 Sätze prüfen + sentence = sentence.strip() + + if len(sentence) < 20: # Zu kurze Sätze überspringen + continue + + if current_length + len(sentence) > max_length: + break + + summary_sentences.append(sentence) + current_length += len(sentence) + + summary = '. '.join(summary_sentences) + + if summary and not summary.endswith('.'): + summary += '.' + + return summary[:max_length] + +def validate_extracted_content(text: str) -> bool: + """ + Validiert ob der extrahierte Inhalt brauchbar ist + """ + if not text or len(text.strip()) < 100: + return False + + words = text.split() + + # Mindestens 50 Wörter + if len(words) < 50: + return False + + # Nicht zu viele Sonderzeichen (Navigation etc.) + special_chars = len([c for c in text if c in '|•→←↑↓']) + if special_chars > len(text) * 0.05: # Mehr als 5% Sonderzeichen + return False + + # Durchschnittliche Wortlänge prüfen (zu kurz = Navigation) + avg_word_length = sum(len(word) for word in words) / len(words) + if avg_word_length < 3: + return False + + return True \ No newline at end of file diff --git a/utils/image_extractor.py b/utils/image_extractor.py index 597ea3b..6ffddca 100644 --- a/utils/image_extractor.py +++ b/utils/image_extractor.py @@ -2,59 +2,325 @@ import requests from bs4 import BeautifulSoup -from urllib.parse import urljoin +from urllib.parse import urljoin, urlparse import logging +import time +from typing import List, Dict +# Konfiguration +MAX_IMAGES = 5 +MIN_IMAGE_SIZE = 100 # Mindestgröße in Pixeln +ALLOWED_EXTENSIONS = {'.jpg', '.jpeg', '.png', '.webp', '.gif'} +REQUEST_TIMEOUT = 10 +USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' -def extract_images_with_metadata(article_url): +def is_valid_image_url(url: str) -> bool: """ - Versucht, Bilder mit Bildunterschrift und Copyright aus dem Originalartikel zu extrahieren. - Gibt eine Liste mit Dictionaries zurück: {url, alt, copyright, copyright_url, caption} + Prüft ob eine URL auf ein gültiges Bild zeigt + """ + try: + parsed = urlparse(url) + path = parsed.path.lower() + + # Prüfe Dateiendung + if not any(path.endswith(ext) for ext in ALLOWED_EXTENSIONS): + return False + + # Prüfe ob URL vollständig ist + if not parsed.scheme or not parsed.netloc: + return False + + # Blacklist für unerwünschte Bilder + blacklist_patterns = [ + 'avatar', 'profile', 'icon', 'logo', 'banner', + 'advertisement', 'ads', 'tracking', 'pixel', 'social' + ] + + return not any(pattern in url.lower() for pattern in blacklist_patterns) + + except Exception: + return False + +def get_image_dimensions(img_tag) -> tuple: + """ + Versucht die Bildabmessungen aus HTML-Attributen zu ermitteln + """ + try: + width = img_tag.get('width') + height = img_tag.get('height') + + if width and height: + return int(width), int(height) + + # Aus Style-Attribut extrahieren + style = img_tag.get('style', '') + if 'width:' in style or 'height:' in style: + # Vereinfachte Extraktion - könnte erweitert werden + pass + + return None, None + except: + return None, None + +def extract_image_metadata(img_tag, base_url: str) -> Dict: + """ + Extrahiert alle verfügbaren Metadaten eines Bildes + """ + try: + # Basis-URL + src = img_tag.get('src') or img_tag.get('data-src') or img_tag.get('data-lazy-src') + if not src: + return None + + img_url = urljoin(base_url, src) + + if not is_valid_image_url(img_url): + return None + + # Alt-Text + alt_text = img_tag.get('alt', '').strip() + + # Titel + title = img_tag.get('title', '').strip() + + # Bildabmessungen + width, height = get_image_dimensions(img_tag) + + # Überspringe sehr kleine Bilder + if width and height and (width < MIN_IMAGE_SIZE or height < MIN_IMAGE_SIZE): + return None + + # Caption und Copyright aus Parent-Elementen suchen + caption = "" + copyright_text = "Unbekannt" + copyright_url = base_url + + # Suche in Parent-Elementen nach Caption + parent = img_tag.find_parent(['figure', 'div', 'span', 'p']) + if parent: + # Figcaption + figcaption = parent.find('figcaption') + if figcaption: + caption = figcaption.get_text(strip=True) + + # Copyright-Link in Figcaption suchen + copyright_link = figcaption.find('a') + if copyright_link: + copyright_url = urljoin(base_url, copyright_link.get('href', '')) + copyright_text = copyright_link.get_text(strip=True) + + # Alternative: Caption in kleinen Texten unter dem Bild + caption_candidates = parent.find_all(['small', 'em', 'i'], limit=3) + for candidate in caption_candidates: + text = candidate.get_text(strip=True) + if len(text) > 10 and len(text) < 200: # Plausible Caption-Länge + if not caption: # Nur wenn noch keine Caption gefunden + caption = text + + # Fallback für Caption + if not caption: + caption = title or alt_text or "Bild aus Originalartikel" + + return { + "url": img_url, + "alt": alt_text, + "caption": caption[:300] if caption else "Kein Bildtitel vorhanden", + "copyright": copyright_text or "Unbekannt", + "copyright_url": copyright_url or base_url, + "width": width, + "height": height, + "title": title + } + + except Exception as e: + logging.error(f"Fehler bei Metadaten-Extraktion: {e}") + return None + +def extract_images_with_metadata(article_url: str) -> List[Dict]: + """ + Hauptfunktion: Extrahiert Bilder mit Metadaten aus einem Artikel """ images = [] - try: - logging.info(f"📷 Extrahiere Bilder von {article_url}") - response = requests.get(article_url, timeout=10) - if response.status_code != 200: - logging.warning(f"Keine gültige Antwort von {article_url} (Status {response.status_code})") - return [] - - soup = BeautifulSoup(response.content, "html.parser") - - for img_tag in soup.find_all("img"): - src = img_tag.get("src") - if not src: - continue - - img_url = urljoin(article_url, src) - alt_text = img_tag.get("alt", "").strip() - - copyright_text = "Unbekannt" - copyright_link = article_url - caption = alt_text or "Bild aus Originalartikel" - - parent = img_tag.find_parent(["figure", "div"]) - if parent: - figcaption = parent.find("figcaption") - if figcaption: - caption = figcaption.get_text(strip=True) - link_tag = figcaption.find("a") - if link_tag and link_tag.has_attr("href"): - copyright_link = link_tag["href"] - copyright_text = link_tag.get_text(strip=True) - - image_data = { - "url": img_url, - "alt": alt_text, - "caption": caption or "Kein Bildtitel vorhanden", - "copyright": copyright_text or "Unbekannt", - "copyright_url": copyright_link or article_url - } - images.append(image_data) - - logging.info(f"{len(images)} Bilder gefunden bei {article_url}") + + if not article_url: return images - + + try: + logging.info(f"🖼️ Starte Bildextraktion von: {article_url}") + + # HTTP-Request mit verbessertem Header + headers = { + 'User-Agent': USER_AGENT, + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', + 'Accept-Language': 'de,en-US;q=0.7,en;q=0.3', + 'Accept-Encoding': 'gzip, deflate', + 'Connection': 'keep-alive', + } + + response = requests.get(article_url, timeout=REQUEST_TIMEOUT, headers=headers) + response.raise_for_status() + + soup = BeautifulSoup(response.content, "html.parser") + + # Alle img-Tags finden + img_tags = soup.find_all("img") + logging.info(f"🔍 {len(img_tags)} img-Tags gefunden") + + processed_urls = set() # Duplikate vermeiden + + for img_tag in img_tags: + try: + # Metadaten extrahieren + image_data = extract_image_metadata(img_tag, article_url) + + if image_data and image_data["url"] not in processed_urls: + images.append(image_data) + processed_urls.add(image_data["url"]) + + logging.info(f"✅ Bild hinzugefügt: {image_data['caption'][:50]}...") + + # Maximum erreicht? + if len(images) >= MAX_IMAGES: + break + + except Exception as e: + logging.error(f"❌ Fehler beim Verarbeiten eines Bildes: {e}") + continue + + # Bilder nach Größe sortieren (größere zuerst) + images.sort(key=lambda x: (x.get('width', 0) * x.get('height', 0)), reverse=True) + + logging.info(f"🎉 {len(images)} Bilder erfolgreich extrahiert von {article_url}") + return images[:MAX_IMAGES] # Sicherheitshalber nochmal begrenzen + + except requests.RequestException as e: + logging.error(f"🌐 Netzwerkfehler bei {article_url}: {e}") + return [] except Exception as e: - logging.exception(f"Fehler bei der Bildextraktion aus {article_url}:") - return [] \ No newline at end of file + logging.error(f"❌ Unerwarteter Fehler bei Bildextraktion von {article_url}: {e}") + return [] + +def validate_image_url(url: str) -> bool: + """ + Prüft ob ein Bild tatsächlich erreichbar ist + """ + try: + response = requests.head(url, timeout=5) + content_type = response.headers.get('content-type', '').lower() + return response.status_code == 200 and 'image' in content_type + except: + return False + +def extract_featured_image(article_url: str) -> Dict: + """ + Versucht das Hauptbild/Featured Image eines Artikels zu finden + """ + try: + headers = {'User-Agent': USER_AGENT} + response = requests.get(article_url, timeout=REQUEST_TIMEOUT, headers=headers) + response.raise_for_status() + + soup = BeautifulSoup(response.content, "html.parser") + + # OpenGraph Image + og_image = soup.find('meta', property='og:image') + if og_image and og_image.get('content'): + img_url = urljoin(article_url, og_image['content']) + if is_valid_image_url(img_url): + return { + "url": img_url, + "alt": "Featured Image", + "caption": "Hauptbild des Artikels", + "copyright": "Unbekannt", + "copyright_url": article_url, + "type": "featured" + } + + # Twitter Card Image + twitter_image = soup.find('meta', attrs={'name': 'twitter:image'}) + if twitter_image and twitter_image.get('content'): + img_url = urljoin(article_url, twitter_image['content']) + if is_valid_image_url(img_url): + return { + "url": img_url, + "alt": "Featured Image", + "caption": "Hauptbild des Artikels", + "copyright": "Unbekannt", + "copyright_url": article_url, + "type": "featured" + } + + return None + + except Exception as e: + logging.error(f"Fehler bei Featured Image Extraktion: {e}") + return None + +def clean_image_metadata(images: List[Dict]) -> List[Dict]: + """ + Bereinigt und normalisiert Bildmetadaten + """ + cleaned_images = [] + + for img in images: + try: + # URL validieren + if not img.get("url") or not is_valid_image_url(img["url"]): + continue + + # Metadaten bereinigen + cleaned_img = { + "url": img["url"].strip(), + "alt": (img.get("alt") or "").strip()[:200], + "caption": (img.get("caption") or "Kein Bildtitel vorhanden").strip()[:300], + "copyright": (img.get("copyright") or "Unbekannt").strip()[:100], + "copyright_url": (img.get("copyright_url") or "#").strip(), + "width": img.get("width"), + "height": img.get("height"), + "title": (img.get("title") or "").strip()[:200] + } + + # Leere Felder mit Standardwerten füllen + if not cleaned_img["caption"]: + cleaned_img["caption"] = "Kein Bildtitel vorhanden" + if not cleaned_img["copyright"]: + cleaned_img["copyright"] = "Unbekannt" + if not cleaned_img["copyright_url"] or cleaned_img["copyright_url"] == "#": + cleaned_img["copyright_url"] = img["url"] # Bild-URL als Fallback + + cleaned_images.append(cleaned_img) + + except Exception as e: + logging.error(f"Fehler beim Bereinigen der Bildmetadaten: {e}") + continue + + return cleaned_images + +# Hauptfunktion für bessere Kompatibilität mit dem bestehenden Code +def extract_images_with_metadata_enhanced(article_url: str) -> List[Dict]: + """ + Erweiterte Bildextraktion mit Fallback-Strategien + """ + all_images = [] + + # 1. Featured Image versuchen + featured = extract_featured_image(article_url) + if featured: + all_images.append(featured) + + # 2. Normale Bildextraktion + content_images = extract_images_with_metadata(article_url) + all_images.extend(content_images) + + # 3. Duplikate entfernen + seen_urls = set() + unique_images = [] + for img in all_images: + if img["url"] not in seen_urls: + unique_images.append(img) + seen_urls.add(img["url"]) + + # 4. Metadaten bereinigen + cleaned_images = clean_image_metadata(unique_images) + + return cleaned_images[:MAX_IMAGES] \ No newline at end of file diff --git a/utils/ui_helpers.py b/utils/ui_helpers.py new file mode 100644 index 0000000..d5eb5c0 --- /dev/null +++ b/utils/ui_helpers.py @@ -0,0 +1,236 @@ +# utils/ui_helpers.py + +import streamlit as st +from datetime import datetime +import logging + +def show_toast(message, type="success", duration=3): + """ + Zeigt eine Toast-Benachrichtigung an + """ + if type == "success": + st.success(message) + elif type == "error": + st.error(message) + elif type == "warning": + st.warning(message) + elif type == "info": + st.info(message) + +def format_datetime(date_str): + """ + Formatiert Datetime-Strings für bessere Lesbarkeit + """ + try: + if isinstance(date_str, str): + if "GMT" in date_str or "+" in date_str: + dt = datetime.strptime(date_str, "%a, %d %b %Y %H:%M:%S %z") + return dt.strftime("%d.%m.%Y %H:%M") + elif "T" in date_str: + dt = datetime.fromisoformat(date_str.replace("Z", "+00:00")) + return dt.strftime("%d.%m.%Y %H:%M") + else: + return date_str[:16].replace("T", " ") + return str(date_str) + except Exception as e: + logging.warning(f"Datum konnte nicht formatiert werden: {date_str} - {e}") + return str(date_str)[:16] + +def get_status_color(status): + """ + Gibt die passende Farbe für einen Status zurück + """ + colors = { + "New": "#2196f3", + "Rewrite": "#ff9800", + "Process": "#9c27b0", + "Online": "#4caf50", + "On Hold": "#e91e63", + "Trash": "#f44336" + } + return colors.get(status, "#2196f3") + +def create_status_badge(status): + """ + Erstellt einen HTML-Status-Badge + """ + color = get_status_color(status) + return f""" + {status} + """ + +def truncate_text(text, max_length=150): + """ + Kürzt Text auf maximale Länge + """ + if not text: + return "" + + if len(text) <= max_length: + return text + + return text[:max_length].rsplit(' ', 1)[0] + "..." + +def calculate_reading_time(text): + """ + Berechnet geschätzte Lesezeit (200 Wörter/Minute) + """ + if not text: + return 0 + + word_count = len(text.split()) + reading_time = max(1, word_count // 200) + return reading_time + +def validate_url(url): + """ + Validiert eine URL + """ + import re + pattern = re.compile( + r'^https?://' # http:// oder https:// + r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' # domain... + r'localhost|' # localhost... + r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...oder IP + r'(?::\d+)?' # optional port + r'(?:/?|[/?]\S+)$', re.IGNORECASE) + return pattern.match(url) is not None + +def create_article_card_html(article, source_name="Unbekannt"): + """ + Erstellt HTML für eine Artikel-Karte + """ + has_images = len(article.get("images", [])) > 0 + word_count = len(article.get("text", "").split()) + reading_time = calculate_reading_time(article.get("text", "")) + + # Unvollständige Bilder prüfen + incomplete_images = any( + not all(k in img and img[k] for k in ("caption", "copyright", "copyright_url")) + for img in article.get("images", []) + ) + + warning_icon = " ⚠️" if incomplete_images else "" + + return f""" +
+ +
+
+

+ {article.get('title', 'Kein Titel')}{warning_icon} +

+
+ 📅 {format_datetime(article.get('date', ''))} • + 📝 {word_count} Wörter • + ⏱️ {reading_time} Min Lesezeit + {'• 🖼️ ' + str(len(article.get('images', []))) + ' Bilder' if has_images else ''} +
+
+
+ {create_status_badge(article.get('status', 'New'))} +
+
+ +
+ {truncate_text(article.get('summary', ''), 200)} +
+ +
+
+ 📡 {source_name} +
+
+ 🏷️ {', '.join(article.get('tags', [])[:3])}{'...' if len(article.get('tags', [])) > 3 else ''} +
+
+
+ """ + +def create_stats_card(title, value, icon="📊", color="#667eea"): + """ + Erstellt eine Statistik-Karte + """ + return f""" +
+
{icon}
+
{value}
+
{title}
+
+ """ + +def show_loading_spinner(text="Lädt..."): + """ + Zeigt einen Lade-Spinner mit Text + """ + return st.empty().markdown(f""" +
+
+
{text}
+
+ + """, unsafe_allow_html=True) + +def create_filter_section(): + """ + Erstellt einen modernen Filter-Bereich + """ + return """ +
+

🔍 Filter & Suche

+ """ + +def get_error_message(error_type, details=""): + """ + Gibt formatierte Fehlermeldungen zurück + """ + messages = { + "feed_error": f"❌ Fehler beim Laden des Feeds: {details}", + "save_error": f"❌ Fehler beim Speichern: {details}", + "api_error": f"❌ API-Fehler: {details}", + "validation_error": f"⚠️ Validierungsfehler: {details}", + "network_error": f"🌐 Netzwerkfehler: {details}" + } + return messages.get(error_type, f"❌ Unbekannter Fehler: {details}") \ No newline at end of file From 56a766596bce2552c7b90cffd4b54d139ca46948 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 16 Aug 2025 13:01:10 +0200 Subject: [PATCH 21/87] Wordpress API Anbindung imprementiert --- CHANGELOG.md | 933 ++++++++++++++++++++++++++++++++++++ __version__.py | 2 +- app.py | 358 +++++++++++++- data/articles.json | 641 +++++++++++++------------ logs/rss_tool.log | 289 +++++++++++ main.py | 48 +- utils/wordpress_uploader.py | 468 ++++++++++++++++++ 7 files changed, 2422 insertions(+), 317 deletions(-) create mode 100644 utils/wordpress_uploader.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ad8a33..0e8d5df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,936 @@ +## [v1.6.2] - 2025-08-16 + +### 🐛 Kritische Fehlerbehebung + +- **WordPress-Tag-Upload-Fehler behoben:** + - WordPress REST API benötigt Tag-IDs statt Tag-Namen im `tags`-Parameter + - Neue Funktion `_get_or_create_tags()` ermittelt existierende Tag-IDs oder erstellt neue Tags + - Automatische Tag-Erstellung wenn Tags nicht existieren + - Robuste Fehlerbehandlung für Tag-Verarbeitungsfehler + +### 🔧 Verbesserungen + +- **Erweiterte Fehleranalyse:** + - Detaillierte Logging-Ausgaben für Post-Daten bei Fehlern + - Spezielle Behandlung von Tag-Parameter-Fehlern + - JSON-formatierte Debug-Ausgaben für bessere Fehleranalyse + +- **Tag-Management:** + - Suche nach existierenden Tags mit exakter Namensübereinstimmung + - Automatische Erstellung fehlender Tags über WordPress REST API + - Tag-IDs werden korrekt im Post-Daten-Objekt verwendet + - Leere/ungültige Tags werden übersprungen + +### 🛠 Technische Details + +- Tag-Verarbeitung erfolgt vor Post-Erstellung +- WordPress `/wp-json/wp/v2/tags` Endpoint für Tag-Management +- Fallback-Verhalten bei Tag-Erstellungsfehlern +- Verbesserte Logging-Ausgaben für Tag-Operationen + +--- + +## [v1.6.1] - 2025-08-16 + +### 💡 Neue Funktionen + +- **WordPress-Integration** implementiert: + - Vollständige WordPress REST API-Anbindung über `utils/wordpress_uploader.py` + - **Base64-Authentifizierung** mit Authorization Header (wie von WordPress API benötigt) + - Neuer Status "WordPress Pending" für hochgeladene Artikel + - Artikel mit Status "Process" können einzeln oder als Batch zu WordPress hochgeladen werden + - Automatische Duplikatserkennung basierend auf Titel-Übereinstimmung + - Meta-Felder werden gesetzt (RSS-Quelle, Original-Link, Import-Datum, RSS-Artikel-ID) + +- **Erweiterte UI-Funktionen**: + - Neuer Tab "WordPress" mit Verbindungstest und Konfigurationsübersicht + - WordPress-Upload-Buttons in der Artikel-Übersicht (einzeln und global) + - WordPress-Artikel-Statistiken im Dashboard und Statistiken-Tab + - Detaillierte Upload-Ergebnisse mit Erfolgs-/Fehlerstatistiken + - Debug-Modus für Auth-Details (Entwicklung) + +- **Verbesserte Artikel-Verwaltung**: + - WordPress Post ID und Upload-Datum werden in Artikeln gespeichert + - Status-Workflow: New → Rewrite → Process → WordPress Pending → Online + - Anzeige von WordPress-Informationen in der Artikel-Detailansicht + +### 🔧 Verbesserungen + +- **Korrekte WordPress-API-Authentifizierung**: + - Unterstützung für bereitgestellten Base64-Auth-String (`WP_AUTH_BASE64`) + - Fallback auf automatische Base64-Generierung aus Username/Password + - Authorization Header im korrekten Format: `Basic ` + - Erweiterte Debug-Ausgaben für Authentifizierung + +- **Robuste Fehlerbehandlung**: + - Ausführliches Logging für alle WordPress-Operationen inkl. Auth-Details + - Retry-Mechanismus mit exponential backoff bei Netzwerkfehlern + - Detaillierte Fehlermeldungen für verschiedene HTTP-Status-Codes (401, 403, etc.) + - Verbindungstest vor Upload-Operationen mit Auth-Verifikation + +- **Erweiterte WordPress-API-Funktionen**: + - Automatische Ermittlung der Standard-Kategorie "Allgemein" + - Session-basierte HTTP-Verbindungen für bessere Performance + - Unterstützung für WordPress-Meta-Felder zur Nachverfolgung + - Berücksichtigung verschiedener WordPress-Authentifizierungsfehler + +- **UI/UX-Verbesserungen**: + - Neuer Status-Badge für "WordPress Pending" mit eigenem Styling + - Dashboard zeigt WordPress-spezifische Statistiken + - Konfigurationshilfen und .env-Vorlagen im WordPress-Tab + - Massenupload-Funktionalität mit Progress-Feedback + - Base64-Auth-Status in Konfigurationsübersicht + +### 🛠 Interne Änderungen + +- `main.py` erweitert um `upload_articles_to_wp()` Funktion +- `VALID_STATUSES` um "WordPress Pending" erweitert +- Neue Umgebungsvariable `WP_AUTH_BASE64` für direkte Base64-Authentifizierung +- Erweiterte Artikel-Datenstruktur um WordPress-spezifische Felder +- Session-Management für HTTP-Verbindungen implementiert +- Base64-Authentifizierung mit Fallback-Mechanismus + +### 📁 Neue Dateien + +- `utils/wordpress_uploader.py` - Vollständige WordPress REST API-Integration mit Base64-Auth +- Erweiterte `.env`-Vorlage mit WordPress-Konfiguration inkl. Base64-String + +### 🔒 Sicherheit + +- WordPress-Credentials werden sicher über Umgebungsvariablen verwaltet +- Base64-Auth über Anwendungspasswort (sicherer als Haupt-Login) +- Keine sensiblen Daten in Logs oder Fehlermeldungen +- Authorization Header im WordPress-Standard-Format + +### 📋 Authentifizierungs-Setup + +**Bereitgestellte Konfiguration:** +```bash +WP_AUTH_BASE64=b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM= +# Dekodiert: ogiertz:whNEx9aZCIUXViV89Z3e7Z03 +``` + +**Authorization Header:** +``` +Authorization: Basic b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM= +``` + +--- + +## [v1.5.3] - 2025-07-11 + +### 💡 Neue Funktionen + +- **WordPress-Integration** implementiert: + - Vollständige WordPress REST API-Anbindung über `utils/wordpress_uploader.py` + - Neuer Status "WordPress Pending" für hochgeladene Artikel + - Artikel mit Status "Process" können einzeln oder als Batch zu WordPress hochgeladen werden + - Automatische Duplikatserkennung basierend auf Titel-Übereinstimmung + - Meta-Felder werden gesetzt (RSS-Quelle, Original-Link, Import-Datum, RSS-Artikel-ID) + +- **Erweiterte UI-Funktionen**: + - Neuer Tab "WordPress" mit Verbindungstest und Konfigurationsübersicht + - WordPress-Upload-Buttons in der Artikel-Übersicht (einzeln und global) + - WordPress-Artikel-Statistiken im Dashboard und Statistiken-Tab + - Detaillierte Upload-Ergebnisse mit Erfolgs-/Fehlerstatistiken + +- **Verbesserte Artikel-Verwaltung**: + - WordPress Post ID und Upload-Datum werden in Artikeln gespeichert + - Status-Workflow: New → Rewrite → Process → WordPress Pending → Online + - Anzeige von WordPress-Informationen in der Artikel-Detailansicht + +### 🔧 Verbesserungen + +- **Robuste Fehlerbehandlung**: + - Ausführliches Logging für alle WordPress-Operationen + - Retry-Mechanismus mit exponential backoff bei Netzwerkfehlern + - Detaillierte Fehlermeldungen für verschiedene HTTP-Status-Codes + - Verbindungstest vor Upload-Operationen + +- **Erweiterte WordPress-API-Funktionen**: + - Automatische Ermittlung der Standard-Kategorie "Allgemein" + - Session-basierte HTTP-Verbindungen für bessere Performance + - Unterstützung für WordPress-Meta-Felder zur Nachverfolgung + - Berücksichtigung verschiedener WordPress-Authentifizierungsfehler + +- **UI/UX-Verbesserungen**: + - Neuer Status-Badge für "WordPress Pending" mit eigenem Styling + - Dashboard zeigt WordPress-spezifische Statistiken + - Konfigurationshilfen und .env-Vorlagen im WordPress-Tab + - Massenupload-Funktionalität mit Progress-Feedback + +### 🛠 Interne Änderungen + +- `main.py` erweitert um `upload_articles_to_wp()` Funktion +- `VALID_STATUSES` um "WordPress Pending" erweitert +- Neue Umgebungsvariablen für WordPress-Konfiguration +- Erweiterte Artikel-Datenstruktur um WordPress-spezifische Felder +- Session-Management für HTTP-Verbindungen implementiert + +### 📁 Neue Dateien + +- `utils/wordpress_uploader.py` - Vollständige WordPress REST API-Integration +- Erweiterte `.env`-Vorlage mit WordPress-Konfiguration + +### 🔒 Sicherheit + +- WordPress-Credentials werden sicher über Umgebungsvariablen verwaltet +- Basic Auth über Anwendungspasswort (sicherer als Haupt-Login) +- Keine sensiblen Daten in Logs oder Fehlermeldungen + +--- + +## [v1.5.3] - 2025-07-11 + +### ✨ Neue Funktionen + +- Automatischer Volltextabruf bei zu kurzen Artikeln (< 50 Wörter) + - Inhalte werden direkt von der Originalseite geladen (ähnlich wie bei der Bildextraktion) + - Promobil, Camping-News und andere gängige WordPress-Seiten werden unterstützt + +- Neue Verwaltungsseite `Feed-Verwaltung` unter `pages/01_feed_manager.py` + - RSS-Feeds können nun über eine dedizierte Oberfläche hinzugefügt, bearbeitet und gelöscht werden + - Anzahl verknüpfter Artikel pro Feed wird angezeigt + - Änderungen werden protokolliert und per `st.rerun()` sofort sichtbar + +### 🔧 Verbesserungen + +- Feed-Filter in der Artikelübersicht zeigt jetzt die **korrekten Feed-Namen mit Artikelanzahl** + - Beispiel: „Promobil News (12)" statt nur „Alle (20)" + - Basierend auf `source`-Feld im Artikelobjekt + +- Verbesserte Logging-Ausgaben bei Feed-Aktionen (hinzufügen, ändern, löschen) + +### 📁 Neue Dateien + +- `utils/article_extractor.py` – Logik zum Abrufen vollständiger Artikeltexte von Originalseiten +- `pages/01_feed_manager.py` – Eigenständige Verwaltungsseite für RSS-Feeds + +### 🛠 Interne Änderungen + +- `main.py` erweitert: Automatischer Fallback auf `extract_full_article()` bei zu kurzem Text +- Logging konsolidiert und mit Feed-Aktionen ergänzt + +## [v1.5.2] - 2025-07-09 + +- Fehlerbehandlung bei `CHANGELOG.md`-Doppelungen hinzugefügt +- Signaturlogik robuster (SSH, GPG, fallback) +- Farbige Terminalausgabe verbessert +- dry-run Argument hinzugefügt: + * Versionsnummer wird berechnet ✅ + * Änderungen (Version, Changelog, Commit, Tag, Push) werden nur angezeigt, nicht ausgeführt ✅ + * Ausgabe erfolgt farbig und klar gegliedert ✅ + +## [1.5.1] - 2025-07-09 + +SSH-Commit-Signatur in versioning.py eingebaut +Automatischer Fallback auf GPG oder keine Signatur +Farbige Terminalausgabe zur Signaturmethode +Readme erweitert mit Setup-Anleitung + +## [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 +- + +### 🔧 Änderungen & Fixes +- Fehlerbehebung bei neuen Release, CHANGELOG wurde nicht angehangen, es wird nun die gesamte Datei übernommen + +### 📦 Internes +- + +## [v1.4.7] – 2025-07-07 + +### 💡 Neue Funktionen +- Automatischer Release-Workflow bei `git tag v*` +- Release-Text aus `CHANGELOG.md` wird extrahiert und als GitHub Release verwendet + +### 🔧 Änderungen & Fixes +- Fehlerbehebung bei neuen Release, CHANGELOG wurde nicht angehangen + +### 📦 Internes +- Erweiterte `release.yml` zur zuverlässigen Release-Erstellung +- GitHub Actions mit `softprops/action-gh-release` + +## [v1.4.6] – 2025-07-07 + +### 💡 Neue Funktionen +- Automatischer Release-Workflow bei `git tag v*` +- Release-Text aus `CHANGELOG.md` wird extrahiert und als GitHub Release verwendet + +### 🔧 Änderungen & Fixes +- Fehlerbehebung bei Bilddatenextraktion +- Erweiterung von `versioning.py` um automatische Tag-Erstellung und Push + +### 📦 Internes +- Erweiterte `release.yml` zur zuverlässigen Release-Erstellung +- GitHub Actions mit `softprops/action-gh-release` + +## [v1.4.5] – 2025-07-07 + +### 💡 Neue Funktionen +- Umstellung des versioning.py-Skripts auf eine moderne Typer-CLI: +- create zum Erstellen neuer Versionen mit Level und Push-Option +- rollback zum Zurücknehmen der letzten Version +- list zur Anzeige aller Versionen im CHANGELOG.md +- Validierung, ob der CHANGELOG.md-Eintrag vor Release wirklich ausgefüllt wurde +- Interaktive CLI-Prompts zur besseren Benutzerführung + +### 🔧 Änderungen & Fixes +- versioning.py ersetzt bisherige manuelle Menüs durch Typer-Kommandos +- requirements.txt um typer[all]==0.12.3 ergänzt + +### 📦 Internes +- Vorbereitung für globale CLI-Nutzung (versioning als Befehl möglich) +- Automatisierung des Release-Prozesses mit GitHub Actions weiterhin vorbereitet + +## [v1.4.4] – 2025-07-07 + +### 💡 Neue Funktionen +- + +### 🔧 Änderungen & Fixes +- + +### 📦 Internes +- automatische Versionierung eingebunden und direktes GitHub puschen der Änderungen + +- ## [v1.4.3] – 2025-07-07 + +### 💡 Neue Funktionen +- ⚠️ Visuelle Warnanzeige in der Artikeltabelle für unvollständige Bildmetadaten (fehlende Caption, Copyright oder Quelle) +- ✍️ Inline-Bearbeitung von Bilddaten (Caption, Copyright, Quelle) direkt in der Detailansicht +- 🪵 Neue separate Seite `Log-Viewer` zur Anzeige der letzten Log-Einträge (automatisch über `pages/log_viewer.py`) +- 📂 Startfilter für Artikelansicht auf „New" voreingestellt für fokussierten Workflow + +### 🔧 Änderungen & Fixes +- ✅ Artikel aus Feeds überschreiben bestehende Artikel **nicht mehr** – Status, Tags und andere manuelle Änderungen bleiben erhalten +- 🧹 `get_recent_logs()` wurde entfernt und die Sidebar-Logausgabe aus `app.py` entfernt +- 🔗 Sidebar-Link zur Log-Seite hinzugefügt (mittlerweile durch native Seiten-Navigation ersetzt) +- 🧭 Navigation durch Nutzung von Streamlit-Multipage-Struktur (`pages/`) + +### 📦 Internes +- Refactoring von `process_articles()` zur sicheren ID-basierten Artikelzusammenführung +- Verbesserte Logging-Ausgabe bei bereits vorhandenen Artikeln +- Robusteres Fehlerhandling in `image_extractor.py` + +## [v1.4.2] – 2025-07-03 + +### 💡 Neue Funktionen +- Komplett überarbeitete Artikel-Tabelle mit: + - Auswahlcheckboxen + - Inline-Statuswechsel mit Dropdown + - Wortanzahl, Tag-Anzeige, Datum kompakt +- Copy-to-Clipboard Funktion für Titel, Text und Tags +- Bildanzeige inkl. Caption und Copyright-Quelle im Detailbereich +- Titel wird automatisch beim Kopieren des Texts vorangestellt + +### 🔧 Änderungen & Fixes +- `st.experimental_rerun()` durch `st.rerun()` ersetzt +- Statusfilter „Alle" funktioniert jetzt korrekt +- UI-Tuning für bessere Lesbarkeit +- Feedliste aus der Sidebar entfernt +- Fix: Bilddaten ohne Caption verursachen keine Fehler mehr +- Artikelüberschriften korrekt in Kopiertext eingebaut + +### 📦 Internes +- Logging bleibt aktiv im Verzeichnis `/logs` +- Vorbereitung für Bildquellen-Import aus Original-Artikel umgesetzt + +## [1.4.1] – 2025-07-03 +### Hinzugefügt +- Logging für `process_articles()`, damit nachvollziehbar ist, welche Feeds verarbeitet wurden +- Rückmeldung in der App bei Klick auf „Alle Feeds neu laden" + +### Geändert +- `main.py`: Inhalte aus `content`, `summary` oder `description` werden vollständig geladen und mit `BeautifulSoup` bereinigt +- Sicherstellung, dass `fetch_and_process_feed()` alle relevanten Artikelinformationen vollständig speichert + +### Fehlerbehebungen +- Problem behoben, bei dem Artikeltexte nicht vollständig übernommen wurden + +## [1.3.1] – 2025-07-03 +### Added +- Tabellenansicht mit Checkbox, Titel, Datum, Zusammenfassung, Wortanzahl, Tags, Status +- Direktes Bearbeiten des Status über Dropdown-Menü +- Massenbearbeitung von Artikeln per Checkbox +- Rewrite-Button für alle Artikel mit Status 'Rewrite' + +## [1.2.0] - 2025-07-04 +### Hinzugefügt +- Automatische Bilderkennung beim Einlesen von Artikeln + - Extrahieren von Bildern aus dem Originalartikel (bis zu 3 Bilder) + - Speicherung von Bild-URLs, Alt-Texten (Bildbeschreibung) und Copyright-Hinweisen +- Fehlerbehandlung für nicht erreichbare Seiten +- Darstellung der Bilder (inkl. Beschreibung & Copyright) in der Artikelansicht + +### Geändert +- Bilder werden direkt beim Einlesen eines RSS-Artikels verarbeitet und gespeichert +- `app.py` zeigt nun auch Bildinformationen innerhalb der Artikeldetailansicht an + +### Behoben +- Keine + +--- + +## [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 + +--- + + +## [v1.6.1] - 2025-08-16 + +### 💡 Neue Funktionen + +- **WordPress-Integration** implementiert: + - Vollständige WordPress REST API-Anbindung über `utils/wordpress_uploader.py` + - **Base64-Authentifizierung** mit Authorization Header (wie von WordPress API benötigt) + - Neuer Status "WordPress Pending" für hochgeladene Artikel + - Artikel mit Status "Process" können einzeln oder als Batch zu WordPress hochgeladen werden + - Automatische Duplikatserkennung basierend auf Titel-Übereinstimmung + - Meta-Felder werden gesetzt (RSS-Quelle, Original-Link, Import-Datum, RSS-Artikel-ID) + +- **Erweiterte UI-Funktionen**: + - Neuer Tab "WordPress" mit Verbindungstest und Konfigurationsübersicht + - WordPress-Upload-Buttons in der Artikel-Übersicht (einzeln und global) + - WordPress-Artikel-Statistiken im Dashboard und Statistiken-Tab + - Detaillierte Upload-Ergebnisse mit Erfolgs-/Fehlerstatistiken + - Debug-Modus für Auth-Details (Entwicklung) + +- **Verbesserte Artikel-Verwaltung**: + - WordPress Post ID und Upload-Datum werden in Artikeln gespeichert + - Status-Workflow: New → Rewrite → Process → WordPress Pending → Online + - Anzeige von WordPress-Informationen in der Artikel-Detailansicht + +### 🔧 Verbesserungen + +- **Korrekte WordPress-API-Authentifizierung**: + - Unterstützung für bereitgestellten Base64-Auth-String (`WP_AUTH_BASE64`) + - Fallback auf automatische Base64-Generierung aus Username/Password + - Authorization Header im korrekten Format: `Basic ` + - Erweiterte Debug-Ausgaben für Authentifizierung + +- **Robuste Fehlerbehandlung**: + - Ausführliches Logging für alle WordPress-Operationen inkl. Auth-Details + - Retry-Mechanismus mit exponential backoff bei Netzwerkfehlern + - Detaillierte Fehlermeldungen für verschiedene HTTP-Status-Codes (401, 403, etc.) + - Verbindungstest vor Upload-Operationen mit Auth-Verifikation + +- **Erweiterte WordPress-API-Funktionen**: + - Automatische Ermittlung der Standard-Kategorie "Allgemein" + - Session-basierte HTTP-Verbindungen für bessere Performance + - Unterstützung für WordPress-Meta-Felder zur Nachverfolgung + - Berücksichtigung verschiedener WordPress-Authentifizierungsfehler + +- **UI/UX-Verbesserungen**: + - Neuer Status-Badge für "WordPress Pending" mit eigenem Styling + - Dashboard zeigt WordPress-spezifische Statistiken + - Konfigurationshilfen und .env-Vorlagen im WordPress-Tab + - Massenupload-Funktionalität mit Progress-Feedback + - Base64-Auth-Status in Konfigurationsübersicht + +### 🛠 Interne Änderungen + +- `main.py` erweitert um `upload_articles_to_wp()` Funktion +- `VALID_STATUSES` um "WordPress Pending" erweitert +- Neue Umgebungsvariable `WP_AUTH_BASE64` für direkte Base64-Authentifizierung +- Erweiterte Artikel-Datenstruktur um WordPress-spezifische Felder +- Session-Management für HTTP-Verbindungen implementiert +- Base64-Authentifizierung mit Fallback-Mechanismus + +### 📁 Neue Dateien + +- `utils/wordpress_uploader.py` - Vollständige WordPress REST API-Integration mit Base64-Auth +- Erweiterte `.env`-Vorlage mit WordPress-Konfiguration inkl. Base64-String + +### 🔒 Sicherheit + +- WordPress-Credentials werden sicher über Umgebungsvariablen verwaltet +- Base64-Auth über Anwendungspasswort (sicherer als Haupt-Login) +- Keine sensiblen Daten in Logs oder Fehlermeldungen +- Authorization Header im WordPress-Standard-Format + +### 📋 Authentifizierungs-Setup + +**Bereitgestellte Konfiguration:** +```bash +WP_AUTH_BASE64=b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM= +# Dekodiert: ogiertz:whNEx9aZCIUXViV89Z3e7Z03 +``` + +**Authorization Header:** +``` +Authorization: Basic b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM= +``` + +--- + +## [v1.5.3] - 2025-07-11 + +### 💡 Neue Funktionen + +- **WordPress-Integration** implementiert: + - Vollständige WordPress REST API-Anbindung über `utils/wordpress_uploader.py` + - Neuer Status "WordPress Pending" für hochgeladene Artikel + - Artikel mit Status "Process" können einzeln oder als Batch zu WordPress hochgeladen werden + - Automatische Duplikatserkennung basierend auf Titel-Übereinstimmung + - Meta-Felder werden gesetzt (RSS-Quelle, Original-Link, Import-Datum, RSS-Artikel-ID) + +- **Erweiterte UI-Funktionen**: + - Neuer Tab "WordPress" mit Verbindungstest und Konfigurationsübersicht + - WordPress-Upload-Buttons in der Artikel-Übersicht (einzeln und global) + - WordPress-Artikel-Statistiken im Dashboard und Statistiken-Tab + - Detaillierte Upload-Ergebnisse mit Erfolgs-/Fehlerstatistiken + +- **Verbesserte Artikel-Verwaltung**: + - WordPress Post ID und Upload-Datum werden in Artikeln gespeichert + - Status-Workflow: New → Rewrite → Process → WordPress Pending → Online + - Anzeige von WordPress-Informationen in der Artikel-Detailansicht + +### 🔧 Verbesserungen + +- **Robuste Fehlerbehandlung**: + - Ausführliches Logging für alle WordPress-Operationen + - Retry-Mechanismus mit exponential backoff bei Netzwerkfehlern + - Detaillierte Fehlermeldungen für verschiedene HTTP-Status-Codes + - Verbindungstest vor Upload-Operationen + +- **Erweiterte WordPress-API-Funktionen**: + - Automatische Ermittlung der Standard-Kategorie "Allgemein" + - Session-basierte HTTP-Verbindungen für bessere Performance + - Unterstützung für WordPress-Meta-Felder zur Nachverfolgung + - Berücksichtigung verschiedener WordPress-Authentifizierungsfehler + +- **UI/UX-Verbesserungen**: + - Neuer Status-Badge für "WordPress Pending" mit eigenem Styling + - Dashboard zeigt WordPress-spezifische Statistiken + - Konfigurationshilfen und .env-Vorlagen im WordPress-Tab + - Massenupload-Funktionalität mit Progress-Feedback + +### 🛠 Interne Änderungen + +- `main.py` erweitert um `upload_articles_to_wp()` Funktion +- `VALID_STATUSES` um "WordPress Pending" erweitert +- Neue Umgebungsvariablen für WordPress-Konfiguration +- Erweiterte Artikel-Datenstruktur um WordPress-spezifische Felder +- Session-Management für HTTP-Verbindungen implementiert + +### 📁 Neue Dateien + +- `utils/wordpress_uploader.py` - Vollständige WordPress REST API-Integration +- Erweiterte `.env`-Vorlage mit WordPress-Konfiguration + +### 🔒 Sicherheit + +- WordPress-Credentials werden sicher über Umgebungsvariablen verwaltet +- Basic Auth über Anwendungspasswort (sicherer als Haupt-Login) +- Keine sensiblen Daten in Logs oder Fehlermeldungen + +--- + +## [v1.5.3] - 2025-07-11 + +### ✨ Neue Funktionen + +- Automatischer Volltextabruf bei zu kurzen Artikeln (< 50 Wörter) + - Inhalte werden direkt von der Originalseite geladen (ähnlich wie bei der Bildextraktion) + - Promobil, Camping-News und andere gängige WordPress-Seiten werden unterstützt + +- Neue Verwaltungsseite `Feed-Verwaltung` unter `pages/01_feed_manager.py` + - RSS-Feeds können nun über eine dedizierte Oberfläche hinzugefügt, bearbeitet und gelöscht werden + - Anzahl verknüpfter Artikel pro Feed wird angezeigt + - Änderungen werden protokolliert und per `st.rerun()` sofort sichtbar + +### 🔧 Verbesserungen + +- Feed-Filter in der Artikelübersicht zeigt jetzt die **korrekten Feed-Namen mit Artikelanzahl** + - Beispiel: „Promobil News (12)" statt nur „Alle (20)" + - Basierend auf `source`-Feld im Artikelobjekt + +- Verbesserte Logging-Ausgaben bei Feed-Aktionen (hinzufügen, ändern, löschen) + +### 📁 Neue Dateien + +- `utils/article_extractor.py` – Logik zum Abrufen vollständiger Artikeltexte von Originalseiten +- `pages/01_feed_manager.py` – Eigenständige Verwaltungsseite für RSS-Feeds + +### 🛠 Interne Änderungen + +- `main.py` erweitert: Automatischer Fallback auf `extract_full_article()` bei zu kurzem Text +- Logging konsolidiert und mit Feed-Aktionen ergänzt + +## [v1.5.2] - 2025-07-09 + +- Fehlerbehandlung bei `CHANGELOG.md`-Doppelungen hinzugefügt +- Signaturlogik robuster (SSH, GPG, fallback) +- Farbige Terminalausgabe verbessert +- dry-run Argument hinzugefügt: + * Versionsnummer wird berechnet ✅ + * Änderungen (Version, Changelog, Commit, Tag, Push) werden nur angezeigt, nicht ausgeführt ✅ + * Ausgabe erfolgt farbig und klar gegliedert ✅ + +## [1.5.1] - 2025-07-09 + +SSH-Commit-Signatur in versioning.py eingebaut +Automatischer Fallback auf GPG oder keine Signatur +Farbige Terminalausgabe zur Signaturmethode +Readme erweitert mit Setup-Anleitung + +## [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 +- + +### 🔧 Änderungen & Fixes +- Fehlerbehebung bei neuen Release, CHANGELOG wurde nicht angehangen, es wird nun die gesamte Datei übernommen + +### 📦 Internes +- + +## [v1.4.7] – 2025-07-07 + +### 💡 Neue Funktionen +- Automatischer Release-Workflow bei `git tag v*` +- Release-Text aus `CHANGELOG.md` wird extrahiert und als GitHub Release verwendet + +### 🔧 Änderungen & Fixes +- Fehlerbehebung bei neuen Release, CHANGELOG wurde nicht angehangen + +### 📦 Internes +- Erweiterte `release.yml` zur zuverlässigen Release-Erstellung +- GitHub Actions mit `softprops/action-gh-release` + +## [v1.4.6] – 2025-07-07 + +### 💡 Neue Funktionen +- Automatischer Release-Workflow bei `git tag v*` +- Release-Text aus `CHANGELOG.md` wird extrahiert und als GitHub Release verwendet + +### 🔧 Änderungen & Fixes +- Fehlerbehebung bei Bilddatenextraktion +- Erweiterung von `versioning.py` um automatische Tag-Erstellung und Push + +### 📦 Internes +- Erweiterte `release.yml` zur zuverlässigen Release-Erstellung +- GitHub Actions mit `softprops/action-gh-release` + +## [v1.4.5] – 2025-07-07 + +### 💡 Neue Funktionen +- Umstellung des versioning.py-Skripts auf eine moderne Typer-CLI: +- create zum Erstellen neuer Versionen mit Level und Push-Option +- rollback zum Zurücknehmen der letzten Version +- list zur Anzeige aller Versionen im CHANGELOG.md +- Validierung, ob der CHANGELOG.md-Eintrag vor Release wirklich ausgefüllt wurde +- Interaktive CLI-Prompts zur besseren Benutzerführung + +### 🔧 Änderungen & Fixes +- versioning.py ersetzt bisherige manuelle Menüs durch Typer-Kommandos +- requirements.txt um typer[all]==0.12.3 ergänzt + +### 📦 Internes +- Vorbereitung für globale CLI-Nutzung (versioning als Befehl möglich) +- Automatisierung des Release-Prozesses mit GitHub Actions weiterhin vorbereitet + +## [v1.4.4] – 2025-07-07 + +### 💡 Neue Funktionen +- + +### 🔧 Änderungen & Fixes +- + +### 📦 Internes +- automatische Versionierung eingebunden und direktes GitHub puschen der Änderungen + +- ## [v1.4.3] – 2025-07-07 + +### 💡 Neue Funktionen +- ⚠️ Visuelle Warnanzeige in der Artikeltabelle für unvollständige Bildmetadaten (fehlende Caption, Copyright oder Quelle) +- ✍️ Inline-Bearbeitung von Bilddaten (Caption, Copyright, Quelle) direkt in der Detailansicht +- 🪵 Neue separate Seite `Log-Viewer` zur Anzeige der letzten Log-Einträge (automatisch über `pages/log_viewer.py`) +- 📂 Startfilter für Artikelansicht auf „New" voreingestellt für fokussierten Workflow + +### 🔧 Änderungen & Fixes +- ✅ Artikel aus Feeds überschreiben bestehende Artikel **nicht mehr** – Status, Tags und andere manuelle Änderungen bleiben erhalten +- 🧹 `get_recent_logs()` wurde entfernt und die Sidebar-Logausgabe aus `app.py` entfernt +- 🔗 Sidebar-Link zur Log-Seite hinzugefügt (mittlerweile durch native Seiten-Navigation ersetzt) +- 🧭 Navigation durch Nutzung von Streamlit-Multipage-Struktur (`pages/`) + +### 📦 Internes +- Refactoring von `process_articles()` zur sicheren ID-basierten Artikelzusammenführung +- Verbesserte Logging-Ausgabe bei bereits vorhandenen Artikeln +- Robusteres Fehlerhandling in `image_extractor.py` + +## [v1.4.2] – 2025-07-03 + +### 💡 Neue Funktionen +- Komplett überarbeitete Artikel-Tabelle mit: + - Auswahlcheckboxen + - Inline-Statuswechsel mit Dropdown + - Wortanzahl, Tag-Anzeige, Datum kompakt +- Copy-to-Clipboard Funktion für Titel, Text und Tags +- Bildanzeige inkl. Caption und Copyright-Quelle im Detailbereich +- Titel wird automatisch beim Kopieren des Texts vorangestellt + +### 🔧 Änderungen & Fixes +- `st.experimental_rerun()` durch `st.rerun()` ersetzt +- Statusfilter „Alle" funktioniert jetzt korrekt +- UI-Tuning für bessere Lesbarkeit +- Feedliste aus der Sidebar entfernt +- Fix: Bilddaten ohne Caption verursachen keine Fehler mehr +- Artikelüberschriften korrekt in Kopiertext eingebaut + +### 📦 Internes +- Logging bleibt aktiv im Verzeichnis `/logs` +- Vorbereitung für Bildquellen-Import aus Original-Artikel umgesetzt + +## [1.4.1] – 2025-07-03 +### Hinzugefügt +- Logging für `process_articles()`, damit nachvollziehbar ist, welche Feeds verarbeitet wurden +- Rückmeldung in der App bei Klick auf „Alle Feeds neu laden" + +### Geändert +- `main.py`: Inhalte aus `content`, `summary` oder `description` werden vollständig geladen und mit `BeautifulSoup` bereinigt +- Sicherstellung, dass `fetch_and_process_feed()` alle relevanten Artikelinformationen vollständig speichert + +### Fehlerbehebungen +- Problem behoben, bei dem Artikeltexte nicht vollständig übernommen wurden + +## [1.3.1] – 2025-07-03 +### Added +- Tabellenansicht mit Checkbox, Titel, Datum, Zusammenfassung, Wortanzahl, Tags, Status +- Direktes Bearbeiten des Status über Dropdown-Menü +- Massenbearbeitung von Artikeln per Checkbox +- Rewrite-Button für alle Artikel mit Status 'Rewrite' + +## [1.2.0] - 2025-07-04 +### Hinzugefügt +- Automatische Bilderkennung beim Einlesen von Artikeln + - Extrahieren von Bildern aus dem Originalartikel (bis zu 3 Bilder) + - Speicherung von Bild-URLs, Alt-Texten (Bildbeschreibung) und Copyright-Hinweisen +- Fehlerbehandlung für nicht erreichbare Seiten +- Darstellung der Bilder (inkl. Beschreibung & Copyright) in der Artikelansicht + +### Geändert +- Bilder werden direkt beim Einlesen eines RSS-Artikels verarbeitet und gespeichert +- `app.py` zeigt nun auch Bildinformationen innerhalb der Artikeldetailansicht an + +### Behoben +- Keine + +--- + +## [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 + +---- + +## [v1.6.0] - 2025-08-15 + +### 🎨 Komplette UI-Überarbeitung + +- **Modernes Tab-basiertes Design** mit Dashboard, Artikel, Feeds, Bilder und Statistiken-Tabs +- **Card-basierte Artikelansicht** ersetzt die alte Tabellenstruktur +- **Gradient-Header** und moderne CSS-Styling für professionelleres Aussehen +- **Responsive Layout** mit verbesserter mobiler Darstellung +- **Status-Badges** mit farbkodierten Indikatoren +- **Toast-Benachrichtigungen** für besseres User-Feedback + +### 🔍 Erweiterte Filter- und Suchfunktionen + +- **Kombinierte Filter** für Status, Feed und Volltextsuche +- **Live-Suche** durch Titel, Inhalt und Tags +- **Feed-spezifische Filterung** mit Artikelanzahl-Anzeige +- **Session State Management** für persistente Filter-Einstellungen + +### 📊 Neues Dashboard + +- **Statistik-Karten** mit visuellen Metriken (Gesamt-Artikel, neue Artikel, Feeds, Online-Artikel) +- **Schnellaktionen** für häufige Aufgaben (Feed-Update, Rewrite, Aufräumen) +- **Neueste Artikel Preview** mit Status-Anzeige +- **Übersichtliche Zahlen** mit modernem Design + +### 🖼️ Verbesserte Bildverwaltung + +- **Dedizierte Bilder-Seite** mit Galerie-Ansicht +- **Erweiterte Bildextraktion** mit Featured Image Detection +- **OpenGraph und Twitter Card** Unterstützung +- **Intelligente Bildfilterung** (Größe, Typ, Blacklist) +- **Metadaten-Bereinigung** mit Fallback-Werten + +### 📰 Optimierte Artikelverarbeitung + +- **Erweiterte Duplikatserkennung** basierend auf Titel-Ähnlichkeit und URL +- **Verbesserte Volltextextraktion** mit website-spezifischen Selektoren +- **WordPress-Erkennung** für optimierte Content-Extraktion +- **Retry-Mechanismus** mit exponential backoff +- **Bessere Textbereinigung** und Validierung + +### 🛠️ Backend-Verbesserungen + +- **Strukturiertes Logging** mit Funktions- und Zeilennummern +- **Session State Management** für bessere Performance +- **Verbesserte Fehlerbehandlung** mit spezifischen Error-Messages +- **JSON-Validierung** vor dem Speichern +- **Encoding-Fixes** für internationale Zeichen +- **Memory-optimierte Verarbeitung** + +### 📊 Neue Statistiken-Seite + +- **Status-Verteilung** mit Prozentanzeigen +- **Feed-Artikel-Übersicht** sortiert nach Anzahl +- **Textstatistiken** (Durchschnitt, Min/Max Wortanzahl) +- **Tag-Häufigkeiten** der meist verwendeten Tags +- **Lesezeit-Berechnungen** (200 Wörter pro Minute) + +### 🔧 Technische Verbesserungen + +- **UI Helper Functions** in `utils/ui_helpers.py` für wiederverwendbare Komponenten +- **Verbesserte URL-Validierung** und Domain-Erkennung +- **Smart Content Selectors** für verschiedene Website-Typen +- **Robustes Error Handling** mit spezifischen Fehlermeldungen +- **Performance-Optimierungen** durch reduzierte `st.rerun()` Calls +- **Memory-Management** für große Artikel-Listen + +### 📱 UX-Verbesserungen + +- **Inline-Bearbeitung** von Artikel-Status direkt in der Card-Ansicht +- **Erweiterte Details-Ansicht** mit Collapsible-Bereichen +- **Copy-to-Clipboard** Funktionalität mit formatiertem Text +- **Hover-Effekte** und Animations für bessere Interaktion +- **Breadcrumb-Navigation** in komplexen Ansichten +- **Loading-Spinner** für längere Operationen + +### 🗂️ Neue Dateistruktur + +``` +├── app.py (komplett überarbeitet) +├── main.py (erweiterte Backend-Logik) +├── utils/ +│ ├── ui_helpers.py (neue UI-Komponenten) +│ ├── image_extractor.py (verbesserte Bildextraktion) +│ ├── article_extractor.py (erweiterte Artikelextraktion) +│ └── dalle_generator.py (unverändert) +├── pages/ +│ ├── 01_feed_manager.py (bestehend) +│ └── log_viewer.py (bestehend) +└── logs/ (verbessertes Logging) +``` + +### 🔄 Migration & Kompatibilität + +- **Vollständige Rückwärtskompatibilität** mit bestehenden JSON-Daten +- **Automatische Datenmigration** für neue Felder (source_name, word_count, etc.) +- **Graceful Degradation** bei fehlenden Feldern +- **Validierung und Reparatur** ungültiger Datenstrukturen + +### ⚡ Performance-Optimierungen + +- **Lazy Loading** für große Artikel-Listen +- **Effiziente Filtering** ohne komplette Neuladung +- **Optimierte Bildverarbeitung** mit Größen-Caching +- **Reduzierte API-Calls** durch besseres State Management +- **Memory-optimierte JSON-Verarbeitung** + +### 🐛 Bugfixes + +- **Status-Änderungen** gehen nicht mehr verloren nach Reload +- **Bildmetadaten** werden korrekt gespeichert und angezeigt +- **Duplikat-Artikel** werden zuverlässig erkannt +- **Encoding-Probleme** bei internationalen Zeichen behoben +- **Feed-Namen** werden korrekt in Filter-Dropdown angezeigt +- **Session State** Konflikte bei mehreren Tabs behoben + +### 📋 Breaking Changes + +- **Alte Tabellen-UI** wurde durch Card-Layout ersetzt +- **Sidebar-Navigation** wurde durch Tab-Navigation ersetzt +- **Direkte JSON-Manipulation** sollte vermieden werden (neue Validierung) + +--- + ## [v1.5.3] - 2025-07-11 ### ✨ Neue Funktionen diff --git a/__version__.py b/__version__.py index c3bc1f8..c8a19b1 100644 --- a/__version__.py +++ b/__version__.py @@ -1 +1 @@ -VERSION = "1.5.3" +VERSION = "1.6.2" diff --git a/app.py b/app.py index 4e499ca..0296f0b 100644 --- a/app.py +++ b/app.py @@ -8,9 +8,11 @@ from main import ( load_articles, save_articles, process_articles, - rewrite_articles + rewrite_articles, + upload_articles_to_wp ) from utils.dalle_generator import generate_dalle_image +from utils.wordpress_uploader import WordPressUploader import os from collections import Counter import time @@ -66,6 +68,7 @@ st.markdown(""" .status-online { background-color: #e8f5e8; color: #388e3c; } .status-hold { background-color: #fce4ec; color: #c2185b; } .status-trash { background-color: #ffebee; color: #d32f2f; } + .status-wp-pending { background-color: #e1f5fe; color: #0277bd; } /* Filter Section */ .filter-section { @@ -107,6 +110,15 @@ st.markdown(""" min-width: 200px; text-align: center; } + + /* WordPress Upload Status */ + .wp-status { + background: #e3f2fd; + padding: 1rem; + border-radius: 8px; + margin: 1rem 0; + border-left: 4px solid #2196f3; + } """, unsafe_allow_html=True) @@ -129,7 +141,8 @@ def get_status_badge(status): "Process": "status-process", "Online": "status-online", "On Hold": "status-hold", - "Trash": "status-trash" + "Trash": "status-trash", + "WordPress Pending": "status-wp-pending" } class_name = status_classes.get(status, "status-new") return f'{status}' @@ -159,21 +172,31 @@ def show_notification(message, type="success"): elif type == "info": st.info(message) +def test_wordpress_connection(): + """Testet die WordPress-Verbindung""" + try: + uploader = WordPressUploader() + success, message = uploader.test_connection() + return success, message + except Exception as e: + return False, f"Fehler beim Testen der Verbindung: {str(e)}" + # === Header === st.markdown("""

📰 RSS Artikel Manager

-

Moderne Verwaltung deiner RSS-Feeds und Artikel

+

Moderne Verwaltung deiner RSS-Feeds und Artikel mit WordPress-Integration

""", unsafe_allow_html=True) # === Tab Navigation === -tab1, tab2, tab3, tab4, tab5 = st.tabs([ +tab1, tab2, tab3, tab4, tab5, tab6 = st.tabs([ "📋 Dashboard", "📰 Artikel", "📡 Feeds", "🖼️ Bilder", - "📊 Statistiken" + "📊 Statistiken", + "🔧 WordPress" ]) # === Dashboard Tab === @@ -185,7 +208,7 @@ with tab1: feeds = load_feeds() # Statistiken - col1, col2, col3, col4 = st.columns(4) + col1, col2, col3, col4, col5 = st.columns(5) with col1: st.markdown(""" @@ -205,14 +228,24 @@ with tab1: """.format(new_count), unsafe_allow_html=True) with col3: + process_count = len([a for a in all_articles if a.get("status") == "Process"]) st.markdown("""
{}
-
RSS Feeds
+
Bereit für WP
- """.format(len(feeds)), unsafe_allow_html=True) + """.format(process_count), unsafe_allow_html=True) with col4: + wp_pending_count = len([a for a in all_articles if a.get("status") == "WordPress Pending"]) + st.markdown(""" +
+
{}
+
WP Ausstehend
+
+ """.format(wp_pending_count), unsafe_allow_html=True) + + with col5: online_count = len([a for a in all_articles if a.get("status") == "Online"]) st.markdown("""
@@ -226,7 +259,7 @@ with tab1: # Quick Actions st.subheader("⚡ Schnellaktionen") - col1, col2, col3 = st.columns(3) + col1, col2, col3, col4 = st.columns(4) with col1: if st.button("🔄 Alle Feeds aktualisieren", use_container_width=True): @@ -250,6 +283,32 @@ with tab1: show_notification("Keine Artikel zum Umschreiben gefunden.", "info") with col3: + if st.button("📤 WordPress Upload", use_container_width=True): + process_count = len([a for a in all_articles if a.get("status") == "Process"]) + if process_count > 0: + with st.spinner(f"{process_count} Artikel werden zu WordPress hochgeladen..."): + upload_results = upload_articles_to_wp() + + if upload_results.get('error'): + show_notification(f"Fehler beim WordPress-Upload: {upload_results['error']}", "error") + else: + successful = upload_results.get('successful', 0) + failed = upload_results.get('failed', 0) + duplicates = upload_results.get('duplicates', 0) + + if successful > 0: + show_notification(f"✅ {successful} Artikel erfolgreich zu WordPress hochgeladen!") + if failed > 0: + show_notification(f"⚠️ {failed} Artikel konnten nicht hochgeladen werden.", "warning") + if duplicates > 0: + show_notification(f"ℹ️ {duplicates} Duplikate übersprungen.", "info") + + time.sleep(2) + st.rerun() + else: + show_notification("Keine Artikel für WordPress-Upload gefunden.", "info") + + with col4: if st.button("🧹 Aufräumen", use_container_width=True): trash_count = len([a for a in all_articles if a.get("status") == "Trash"]) if trash_count > 0: @@ -257,6 +316,21 @@ with tab1: else: show_notification("Keine Artikel zum Aufräumen gefunden.", "info") + # WordPress-Status-Übersicht + if wp_pending_count > 0 or online_count > 0: + st.subheader("🔗 WordPress-Status") + + wp_articles = [a for a in all_articles if a.get("status") in ["WordPress Pending", "Online"]] + for article in wp_articles[:5]: # Nur die ersten 5 anzeigen + st.markdown(f""" +
+ {article.get('title', 'Kein Titel')} + {get_status_badge(article.get('status', 'Unknown'))} +
+ WP Post ID: {article.get('wp_post_id', 'Unbekannt')} | Upload: {format_date(article.get('wp_upload_date', ''))} +
+ """, unsafe_allow_html=True) + # Neueste Artikel Preview st.subheader("🕒 Neueste Artikel") recent_articles = sorted(all_articles, key=lambda x: x.get("date", ""), reverse=True)[:5] @@ -288,7 +362,7 @@ with tab2: col1, col2, col3 = st.columns(3) with col1: - status_options = ["Alle", "New", "Rewrite", "Process", "Online", "On Hold", "Trash"] + status_options = ["Alle", "New", "Rewrite", "Process", "Online", "On Hold", "Trash", "WordPress Pending"] st.session_state.status_filter = st.selectbox( "Status", status_options, @@ -366,6 +440,10 @@ with tab2: st.markdown(f"**{title}**") st.markdown(f"📅 {format_date(article.get('date', ''))}") + # WordPress-Info anzeigen falls vorhanden + if article.get("wp_post_id"): + st.markdown(f"🔗 WordPress ID: {article.get('wp_post_id')} | Upload: {format_date(article.get('wp_upload_date', ''))}") + with col2: st.markdown(get_status_badge(article.get("status", "New")), unsafe_allow_html=True) @@ -388,11 +466,11 @@ with tab2: st.markdown(f"📡 {source_name}") # Actions - col1, col2, col3, col4 = st.columns(4) + col1, col2, col3, col4, col5 = st.columns(5) with col1: # Status ändern - status_options = ["New", "Rewrite", "Process", "Online", "On Hold", "Trash"] + status_options = ["New", "Rewrite", "Process", "Online", "On Hold", "Trash", "WordPress Pending"] current_status = article.get("status", "New") new_status = st.selectbox( "Status", @@ -423,6 +501,30 @@ with tab2: st.markdown(f"[🔗 Artikel öffnen]({article.get('link', '#')})") with col4: + # WordPress Upload Button für einzelne Artikel + if article.get("status") == "Process": + if st.button("📤 WordPress", key=f"wp_upload_{article['id']}"): + with st.spinner("Lade zu WordPress hoch..."): + from utils.wordpress_uploader import upload_single_article_to_wordpress + success, message, wp_post_id = upload_single_article_to_wordpress(article) + + if success: + # Status ändern + for idx, art in enumerate(all_articles): + if art["id"] == article["id"]: + all_articles[idx]["status"] = "WordPress Pending" + all_articles[idx]["wp_upload_date"] = datetime.now().isoformat() + all_articles[idx]["wp_post_id"] = wp_post_id + break + save_articles(all_articles) + show_notification("✅ Erfolgreich zu WordPress hochgeladen!") + else: + show_notification(f"❌ WordPress-Upload fehlgeschlagen: {message}", "error") + + time.sleep(1) + st.rerun() + + with col5: # Details anzeigen if st.button("📖 Details", key=f"details_{article['id']}"): st.session_state[f"show_details_{article['id']}"] = not st.session_state.get(f"show_details_{article['id']}", False) @@ -641,6 +743,39 @@ with tab5: for feed_name, count in feed_counts.most_common(): st.markdown(f"**{feed_name}:** {count} Artikel") + # WordPress-Statistiken + st.subheader("🔗 WordPress-Statistiken") + wp_articles = [a for a in all_articles if a.get("wp_post_id")] + + if wp_articles: + col1, col2, col3 = st.columns(3) + + with col1: + st.metric("WordPress Artikel", len(wp_articles)) + + with col2: + pending_count = len([a for a in wp_articles if a.get("status") == "WordPress Pending"]) + st.metric("Ausstehend", pending_count) + + with col3: + online_wp_count = len([a for a in wp_articles if a.get("status") == "Online"]) + st.metric("Online", online_wp_count) + + # Neueste WordPress-Uploads + recent_wp = sorted([a for a in wp_articles if a.get("wp_upload_date")], + key=lambda x: x.get("wp_upload_date", ""), reverse=True)[:5] + + if recent_wp: + st.subheader("🕒 Neueste WordPress-Uploads") + for article in recent_wp: + st.markdown(f""" + **{article.get('title', 'Kein Titel')}** {get_status_badge(article.get('status', 'Unknown'))} + + WP ID: {article.get('wp_post_id')} | Upload: {format_date(article.get('wp_upload_date', ''))} + """, unsafe_allow_html=True) + else: + st.info("Noch keine Artikel zu WordPress hochgeladen.") + # Weitere Statistiken st.subheader("📝 Textstatistiken") @@ -668,4 +803,201 @@ with tab5: for tag, count in tag_counts.most_common(10): st.markdown(f"**{tag}:** {count}x verwendet") else: - st.info("Keine Tags gefunden.") \ No newline at end of file + st.info("Keine Tags gefunden.") + +# === WordPress Tab === +with tab6: + st.header("🔧 WordPress-Integration") + + # Verbindungstest + st.subheader("🔗 Verbindungstest") + + col1, col2 = st.columns(2) + + with col1: + if st.button("🧪 WordPress-Verbindung testen", use_container_width=True): + with st.spinner("Teste Verbindung..."): + success, message = test_wordpress_connection() + + if success: + show_notification(f"✅ {message}") + else: + show_notification(f"❌ {message}", "error") + + with col2: + # WordPress-Konfiguration anzeigen + wp_url = os.getenv("WP_BASE_URL", "Nicht konfiguriert") + wp_user = os.getenv("WP_USERNAME", "Nicht konfiguriert") + wp_base64 = os.getenv("WP_AUTH_BASE64", "") + + st.info(f""" + **WordPress-Konfiguration:** + - URL: {wp_url} + - Benutzer: {wp_user} + - Passwort: {'✅ Konfiguriert' if os.getenv("WP_PASSWORD") else '❌ Nicht konfiguriert'} + - Base64 Auth: {'✅ Konfiguriert' if wp_base64 else '❌ Nicht konfiguriert'} + """) + + # WordPress Auth Debug (nur für Entwicklung) + if st.checkbox("🔧 Debug-Modus (Auth-Details anzeigen)", value=False): + st.warning("⚠️ Nur für Entwicklung - zeigt Auth-Details!") + + wp_base64 = os.getenv("WP_AUTH_BASE64", "") + if wp_base64: + try: + import base64 + decoded = base64.b64decode(wp_base64).decode('utf-8') + st.code(f"Base64: {wp_base64}\nDecoded: {decoded}") + except Exception as e: + st.error(f"Fehler beim Dekodieren: {e}") + else: + st.info("Kein Base64-String konfiguriert") + + # Bulk Upload + st.subheader("📦 Massenupload") + + process_articles_list = [a for a in all_articles if a.get("status") == "Process"] + + if process_articles_list: + st.write(f"**{len(process_articles_list)} Artikel bereit für WordPress-Upload:**") + + # Artikel-Vorschau + for article in process_articles_list[:5]: # Nur die ersten 5 anzeigen + st.markdown(f"• **{article.get('title', 'Kein Titel')}** ({get_word_count(article.get('text', ''))} Wörter)") + + if len(process_articles_list) > 5: + st.markdown(f"... und {len(process_articles_list) - 5} weitere") + + col1, col2 = st.columns(2) + + with col1: + if st.button("📤 Alle zu WordPress hochladen", use_container_width=True): + with st.spinner(f"Lade {len(process_articles_list)} Artikel zu WordPress hoch..."): + upload_results = upload_articles_to_wp() + + # Detaillierte Ergebnisse anzeigen + st.subheader("📊 Upload-Ergebnisse") + + if upload_results.get('error'): + show_notification(f"❌ Fehler: {upload_results['error']}", "error") + else: + col1, col2, col3 = st.columns(3) + + with col1: + st.metric("Erfolgreich", upload_results.get('successful', 0)) + with col2: + st.metric("Fehlgeschlagen", upload_results.get('failed', 0)) + with col3: + st.metric("Duplikate", upload_results.get('duplicates', 0)) + + # Details anzeigen + if upload_results.get('details'): + st.subheader("📋 Upload-Details") + for detail in upload_results['details']: + status_icon = "✅" if detail['success'] else "❌" + st.markdown(f"{status_icon} **{detail['title']}**: {detail['message']}") + + time.sleep(2) + st.rerun() + + with col2: + st.info("💡 Artikel erhalten den Status 'WordPress Pending' nach erfolgreichem Upload.") + + else: + st.info("Keine Artikel mit Status 'Process' gefunden. Artikel müssen zuerst umgeschrieben werden.") + + # WordPress-Artikel-Übersicht + st.subheader("📋 WordPress-Artikel-Übersicht") + + wp_articles = [a for a in all_articles if a.get("wp_post_id")] + + if wp_articles: + # Filter für WordPress-Artikel + wp_status_filter = st.selectbox( + "WordPress-Status filtern", + ["Alle", "WordPress Pending", "Online"], + key="wp_status_filter" + ) + + filtered_wp_articles = wp_articles + if wp_status_filter != "Alle": + filtered_wp_articles = [a for a in wp_articles if a.get("status") == wp_status_filter] + + st.write(f"**{len(filtered_wp_articles)} WordPress-Artikel gefunden**") + + # WordPress-Artikel anzeigen + for article in filtered_wp_articles: + st.markdown(f""" +
+
+
+ {article.get('title', 'Kein Titel')} +
+ WP ID: {article.get('wp_post_id')} | Upload: {format_date(article.get('wp_upload_date', ''))} +
+
+ {get_status_badge(article.get('status', 'Unknown'))} +
+
+
+ """, unsafe_allow_html=True) + + else: + st.info("Noch keine Artikel zu WordPress hochgeladen.") + + # Konfigurationshilfe + st.subheader("⚙️ Konfiguration") + + with st.expander("📋 .env-Datei Vorlage", expanded=False): + st.code(""" +# WordPress-Konfiguration +WP_BASE_URL=https://vanityontour.de +WP_USERNAME=ogiertz +WP_PASSWORD=whNEx9aZCIUXViV89Z3e7Z03 + +# WordPress Base64-Authentifizierung (bevorzugte Methode) +WP_AUTH_BASE64=b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM= + +# OpenAI-Konfiguration (für Artikel-Umschreibung) +OPENAI_API_KEY=sk-... + """, language="bash") + + with st.expander("🔑 Base64-Authentifizierung verstehen", expanded=False): + st.markdown(""" + **WordPress REST API Authentifizierung:** + + Die WordPress REST API erfordert eine Base64-kodierte Authentifizierung im Format: + ``` + Authorization: Basic + ``` + + **Ihr bereitgestellter Base64-String:** + - `b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM=` + - Dekodiert: `ogiertz:whNEx9aZCIUXViV89Z3e7Z03` + + **So funktioniert es:** + 1. Benutzername und Anwendungspasswort werden kombiniert: `username:password` + 2. Dieser String wird Base64-kodiert + 3. Im Authorization-Header verwendet: `Basic ` + + **Fallback-Verhalten:** + - Wenn `WP_AUTH_BASE64` gesetzt ist → Direkter Base64-String verwendet + - Wenn nicht gesetzt → Base64 wird aus `WP_USERNAME:WP_PASSWORD` generiert + """) + + with st.expander("📖 WordPress-API Berechtigungen", expanded=False): + st.markdown(""" + **Erforderliche Berechtigungen für den WordPress-Benutzer:** + + - `edit_posts` - Beiträge erstellen und bearbeiten + - `publish_posts` - Beiträge veröffentlichen (für Status-Änderungen) + - `upload_files` - Dateien hochladen (für spätere Bild-Uploads) + - `edit_categories` - Kategorien verwalten + - `edit_tags` - Tags verwalten + + **Anwendungspasswort erstellen:** + 1. WordPress Admin → Benutzer → Profil + 2. Unter "Anwendungspasswörter" neues Passwort erstellen + 3. Name: "RSS Feed Manager" + 4. Generiertes Passwort in .env-Datei eintragen + """) \ No newline at end of file diff --git a/data/articles.json b/data/articles.json index 0135109..8437b4d 100644 --- a/data/articles.json +++ b/data/articles.json @@ -1,14 +1,14 @@ [ { "id": "Artikel 5924 von camping-news.de", - "title": "Fr\u00fchjahrsaktionen vom Verein WOHNmobil f\u00fcr Klimaschutz", + "title": "Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz", "date": "Wed, 07 May 2025 00:00:00 +0200", "summary": "In den ersten Wochen des Jahres 2025 schon 6.000 Jungbäume gepflanzt", - "text": "Fr\u00fchjahrsaktionen vom Verein WOHNmobil f\u00fcr Klimaschutz\n\nDer Verein WOHNmobil f\u00fcr Klimaschutz e.V. hat in Teilen Deutschlands insgesamt 6.000 Setzlinge von verschiedenen B\u00e4umen, darunter Hainbuchen, Rotbuchen, Eichen und Wei\u00dftannen, als Teil seiner \"Fr\u00fchjahrs-Tour\" gepflanzt. In Teams von 12 bis 18 Mitgliedern unternahmen sie drei Wochenendtripps im M\u00e4rz und Anfang April nach Jagsthausen, Uchte, Wernigerode und Harkebr\u00fcgger See, um die jungen B\u00e4ume zusammen mit dem \u00f6rtlichen Revierf\u00f6rster zu pflanzen. Zwei der Fl\u00e4chen waren zuvor von Fichten belegt, die Trockenheit, St\u00fcrme und Borkenk\u00e4fer nicht \u00fcberlebt hatten. Bei der anderen Fl\u00e4che wurden die Setzlinge in einen Kiefernbestand gepflanzt, um einen gemischten Wald zu schaffen. Mit diesen neuen Setzlingen hat der Verein nun fast 19.000 B\u00e4ume gespendet und gepflanzt.\n\nDer Verein WOHNmobil f\u00fcr Klimaschutz e.V. f\u00f6rdert auch das umweltfreundliche und -bewusste Camping, indem er \u00f6kologische Wohnmobil-Stellpl\u00e4tze bewertet und auszeichnet. Am 27. M\u00e4rz 2025 hat der Verein das Wohnmobilcamp Sm\u00e5land am Harkebr\u00fcgger See zum \"\u00d6kologischen Wohnmobilstellplatz 2025\" gek\u00fcrt. Der Stellplatz verf\u00fcgt \u00fcber energie- und wassersparende Einrichtungen, eine sorgf\u00e4ltige M\u00fclltrennung und Informationen f\u00fcr die G\u00e4ste \u00fcber umweltschonendes Verhalten. Der Vereinsvorstand, Albert M\u00e4rkl, lobte die Betreiber f\u00fcr ihr Engagement f\u00fcr die Umwelt und das Wohl ihrer G\u00e4ste. Weitere Informationen dazu, wie man Mitglied oder F\u00f6rdermitglied im Verein werden kann, sind auf der Vereins-Website zu finden.", + "text": "Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz\n\nDer Verein WOHNmobil für Klimaschutz e.V. hat in Teilen Deutschlands insgesamt 6.000 Setzlinge von verschiedenen Bäumen, darunter Hainbuchen, Rotbuchen, Eichen und Weißtannen, als Teil seiner \"Frühjahrs-Tour\" gepflanzt. In Teams von 12 bis 18 Mitgliedern unternahmen sie drei Wochenendtripps im März und Anfang April nach Jagsthausen, Uchte, Wernigerode und Harkebrügger See, um die jungen Bäume zusammen mit dem örtlichen Revierförster zu pflanzen. Zwei der Flächen waren zuvor von Fichten belegt, die Trockenheit, Stürme und Borkenkäfer nicht überlebt hatten. Bei der anderen Fläche wurden die Setzlinge in einen Kiefernbestand gepflanzt, um einen gemischten Wald zu schaffen. Mit diesen neuen Setzlingen hat der Verein nun fast 19.000 Bäume gespendet und gepflanzt.\n\nDer Verein WOHNmobil für Klimaschutz e.V. fördert auch das umweltfreundliche und -bewusste Camping, indem er ökologische Wohnmobil-Stellplätze bewertet und auszeichnet. Am 27. März 2025 hat der Verein das Wohnmobilcamp Småland am Harkebrügger See zum \"Ökologischen Wohnmobilstellplatz 2025\" gekürt. Der Stellplatz verfügt über energie- und wassersparende Einrichtungen, eine sorgfältige Mülltrennung und Informationen für die Gäste über umweltschonendes Verhalten. Der Vereinsvorstand, Albert Märkl, lobte die Betreiber für ihr Engagement für die Umwelt und das Wohl ihrer Gäste. Weitere Informationen dazu, wie man Mitglied oder Fördermitglied im Verein werden kann, sind auf der Vereins-Website zu finden.", "tags": [ "1. Klimaschutz", - "2. B\u00e4ume pflanzen", - "3. \u00d6kologisches Camping" + "2. Bäume pflanzen", + "3. Ökologisches Camping" ], "status": "Online", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5924", @@ -78,9 +78,9 @@ }, { "url": "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", - "alt": "KI-generiertes Titelbild zu: Fr\u00fchjahrsaktionen vom Verein WOHNmobil f\u00fcr Klimaschutz", - "caption": "KI-generiertes Titelbild zu: Fr\u00fchjahrsaktionen vom Verein WOHNmobil f\u00fcr Klimaschutz", - "copyright": "OpenAI DALL\u00b7E", + "alt": "KI-generiertes Titelbild zu: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz", + "caption": "KI-generiertes Titelbild zu: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz", + "copyright": "OpenAI DALL·E", "copyright_url": "https://openai.com/dall-e" } ], @@ -91,7 +91,7 @@ "title": "15 Jahre PremiumCamps", "date": "Tue, 24 Jun 2025 00:00:00 +0200", "summary": "Jubiläumstour zum 15-jährigen Bestehen des Qualitätsverbundes", - "text": "Die Kooperation PremiumCamps feiert 2025 ihr 15-j\u00e4hriges Bestehen \u2013 ein Anlass, der geb\u00fchrend gefeiert wurde: mit einer erlebnisreichen Rundreise zu zahlreichen Mitgliedsbetrieben in Deutschland sowie befreundeten Campingpl\u00e4tzen in S\u00fcdtirol, Italien und \u00d6sterreich. Im Mittelpunkt der Jubil\u00e4umstour stand der pers\u00f6nliche Austausch mit Kolleginnen und Kollegen vor Ort. Die Gastgeber empfingen die PremiumCamps-Delegation unter Leitung von Vorstand Dieter L\u00fcbberding herzlich und mit gro\u00dfem Engagement. Eine durchweg harmonische Atmosph\u00e4re pr\u00e4gte die gesamte Reise. Neben Einblicken in den individuellen Charakter der Pl\u00e4tze bot die Tour vielf\u00e4ltige Inspirationen, neue Perspektiven und konkrete Ideen zur Weiterentwicklung. Ziel war es, voneinander zu lernen, gemeinsame Qualit\u00e4tsstandards weiterzuentwickeln und Innovationen aufzugreifen \u2013 ganz im Sinne des PremiumCamps-Mottos: Qualit\u00e4t durch Gemeinschaft. H\u00f6hepunkt der Tour war eine Stippvisite beim Kooperationspartner in S\u00fcdtirol. \u201eWir haben uns auf Messen kennengelernt und tauschen uns seitdem partnerschaftlich \u00fcber die L\u00e4ndergrenzen hinweg aus\u201c, berichtet Dieter L\u00fcbberding, Vorstand der PremiumCamps e.V. PremiumCamps ist eine Kooperation inhabergef\u00fchrter Top-Campingpl\u00e4tze in Deutschland. Seit 15 Jahren steht der Zusammenschluss f\u00fcr h\u00f6chste Qualit\u00e4tsanspr\u00fcche, gelebte Gastfreundschaft und kontinuierliche Weiterentwicklung. Der regelm\u00e4\u00dfige vertrauensvolle Austausch untereinander ist dabei ein zentrales Element. G\u00e4ste d\u00fcrfen sich auf individuell gef\u00fchrte Pl\u00e4tze mit erstklassiger Ausstattung, pers\u00f6nlichem Service und besonderem Ambiente freuen. Die PremiumCamps im \u00dcberblick: \u2022 Ferien-Camp B\u00f6rgerende , Ostsee \u2022 Naturcamping Spitzenort , Holsteinische Schweiz \u2022 Campingplatz \"Zur Perle\" , Nordsee \u2022 Ferienpark Seehof , Schweriner See \u2022 Camping- und Wohnmobilpark Kamerun , Waren/M\u00fcritz \u2022 R\u00f6ders' Park - Premium Camping , L\u00fcneburger Heide \u2022 Ihr k\u00f6niglicher Campingpark Sanssouci , Berlin/Potsdam \u2022 Campingpark Kerstgenshof , Niederrhein \u2022 Camping- und Freizeitpark LuxOase , Dresden/S\u00e4chs. Schweiz \u2022 Campingplatz Auenland , Lahntal \u2022 Camping Holmernhof , Bad F\u00fcssing \u2022 Camping Schwanenplatz , Chiemgau \u2022 Camping Wirthshof , Bodensee \u2022 Kur- und Feriencamping Dreiquellenbad , Bad Griesbach, Niederbayern \u2022 Camping-Resort Allweglehen , Berchtesgaden, Oberbayern \u2022 Insel-Camp , Fehmarn \u2022 Spreewald-Natur-Camping \u201eAm See\u201c , L\u00fcbbenau/Spreewald \u2022 Camping Harfenm\u00fchle , EdelSteinLand / Hunsr\u00fcck \u2022 Ferienparadies Schwarzw\u00e4lder Hof , Seelbach Mehr auf www.premiumcamps.de", + "text": "Die Kooperation PremiumCamps feiert 2025 ihr 15-jähriges Bestehen – ein Anlass, der gebührend gefeiert wurde: mit einer erlebnisreichen Rundreise zu zahlreichen Mitgliedsbetrieben in Deutschland sowie befreundeten Campingplätzen in Südtirol, Italien und Österreich. Im Mittelpunkt der Jubiläumstour stand der persönliche Austausch mit Kolleginnen und Kollegen vor Ort. Die Gastgeber empfingen die PremiumCamps-Delegation unter Leitung von Vorstand Dieter Lübberding herzlich und mit großem Engagement. Eine durchweg harmonische Atmosphäre prägte die gesamte Reise. Neben Einblicken in den individuellen Charakter der Plätze bot die Tour vielfältige Inspirationen, neue Perspektiven und konkrete Ideen zur Weiterentwicklung. Ziel war es, voneinander zu lernen, gemeinsame Qualitätsstandards weiterzuentwickeln und Innovationen aufzugreifen – ganz im Sinne des PremiumCamps-Mottos: Qualität durch Gemeinschaft. Höhepunkt der Tour war eine Stippvisite beim Kooperationspartner in Südtirol. „Wir haben uns auf Messen kennengelernt und tauschen uns seitdem partnerschaftlich über die Ländergrenzen hinweg aus“, berichtet Dieter Lübberding, Vorstand der PremiumCamps e.V. PremiumCamps ist eine Kooperation inhabergeführter Top-Campingplätze in Deutschland. Seit 15 Jahren steht der Zusammenschluss für höchste Qualitätsansprüche, gelebte Gastfreundschaft und kontinuierliche Weiterentwicklung. Der regelmäßige vertrauensvolle Austausch untereinander ist dabei ein zentrales Element. Gäste dürfen sich auf individuell geführte Plätze mit erstklassiger Ausstattung, persönlichem Service und besonderem Ambiente freuen. Die PremiumCamps im Überblick: • Ferien-Camp Börgerende , Ostsee • Naturcamping Spitzenort , Holsteinische Schweiz • Campingplatz \"Zur Perle\" , Nordsee • Ferienpark Seehof , Schweriner See • Camping- und Wohnmobilpark Kamerun , Waren/Müritz • Röders' Park - Premium Camping , Lüneburger Heide • Ihr königlicher Campingpark Sanssouci , Berlin/Potsdam • Campingpark Kerstgenshof , Niederrhein • Camping- und Freizeitpark LuxOase , Dresden/Sächs. Schweiz • Campingplatz Auenland , Lahntal • Camping Holmernhof , Bad Füssing • Camping Schwanenplatz , Chiemgau • Camping Wirthshof , Bodensee • Kur- und Feriencamping Dreiquellenbad , Bad Griesbach, Niederbayern • Camping-Resort Allweglehen , Berchtesgaden, Oberbayern • Insel-Camp , Fehmarn • Spreewald-Natur-Camping „Am See“ , Lübbenau/Spreewald • Camping Harfenmühle , EdelSteinLand / Hunsrück • Ferienparadies Schwarzwälder Hof , Seelbach Mehr auf www.premiumcamps.de", "tags": [], "status": "Online", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5927", @@ -174,7 +174,7 @@ "title": "Der neue Eriba Feeling und Novaline", "date": "Fri, 20 Jun 2025 00:00:00 +0200", "summary": "Zwei starke Charaktere für die Caravaning-Saison", - "text": "Zwei Modelle, zwei Konzepte \u2013 und ein gemeinsamer Anspruch: Mit dem neuen Eriba Feeling und dem Eriba Novaline stellt Eriba zwei Neuheiten vor, die zukunftsf\u00e4higes, flexibles Reisen erm\u00f6glichen. Auf diesem gemeinsamen Weg bieten die beiden Neuheiten Antworten auf unterschiedliche Bed\u00fcrfnisse. \u201eMit dem neuen Eriba Feeling und Eriba Novaline haben wir eine neue Baureihe entwickelt, die in jeder Hinsicht neu durchdacht ist. Neben neuen Grundrissen und dem f\u00fcr Eriba typischen au\u00dfergew\u00f6hnlichen Design haben wir auch im Bereich der Funktionalit\u00e4t neue Ma\u00dfst\u00e4be gesetzt. Selbst in sehr kompakten Grundrissen finden sich Betten mit 2,10 m L\u00e4nge wieder. Hier hat das Entwicklungsteam einen erstklassigen Job gemacht\u201c, sagt Matthias Binder, Markenleitung bei Eriba. Eriba Feeling \u2013 f\u00fcr alle, die mehr mitnehmen wollen Der neue Eriba Feeling ist die perfekte Wahl f\u00fcr alle, die auf Reisen maximale Flexibilit\u00e4t und Raumkomfort suchen. Sein serienm\u00e4\u00dfiges Hubdach erm\u00f6glicht eine geringe Gesamth\u00f6he f\u00fcr bessere Aerodynamik und entspanntes Fahren, sorgt aber gleichzeitig f\u00fcr volle Stehh\u00f6he im Inneren. Wer mehr Platz zum Schlafen ben\u00f6tigt, kann den Feeling mit einem optionalen Schlafdach erweitern. Je nach Grundriss finden bis zu f\u00fcnf Personen Platz. Die intelligente Raumgestaltung kombiniert cleveren Stauraum mit multifunktionalen Sitzgruppen und durchdachten Details: Ein leistungsstarker Kompressork\u00fchlschrank, eine Eingangst\u00fcr mit integrierter Hakenleiste und Multifunktionsschienen sowie eine dimmbare, magnetisch befestigte Multifunktionsleuchte schaffen vielseitige Nutzungsm\u00f6glichkeiten und Komfort auf h\u00f6chstem Niveau. Der Eriba Feeling ist in Deutschland ab einem Grundpreis von 27.990 Euro erh\u00e4ltlich. Eriba Novaline \u2013 gro\u00dfz\u00fcgig, elegant und komfortabel Reisekomfort hat einen neuen Namen: Eriba Novaline. Frische Designs, durchdachte Grundrisse und eine Ausstattung auf h\u00f6chstem Niveau heben das Caravaning-Erlebnis auf die n\u00e4chste Stufe. Die durchg\u00e4ngige Stehh\u00f6he von 198 Zentimetern sorgt f\u00fcr ein offenes Raumgef\u00fchl, das in Kombination mit cleveren Grundrissen, bis zu f\u00fcnf Schlafpl\u00e4tzen und eleganten Sitzgruppen \u00fcberzeugt. Wer sein Reisevergn\u00fcgen noch weiter steigern m\u00f6chte, erg\u00e4nzt sein Modell um optionale Features wie eine Dachklimaanlage, ein hagelresistentes GFK-Dach oder ein voll integriertes Entertainmentsystem mit 22-Zoll-TV. Der Eriba Novaline ist in Deutschland ab einem Grundpreis von 29.490 Euro verf\u00fcgbar. Markentypisches Design au\u00dfen, wohnliches Ambiente innen Beide Modelle folgen der neuen Designsprache von Eriba: Klare Linien, moderne LED-Heckleuchten mit angedeutetem Bridge-Light und Glattblech in Carrara White oder optional Crystal Silver pr\u00e4gen das Exterieur. Im Inneren erwartet Reisende ein wohnliches Ambiente, das Funktion und Design vereint: Vier Stoffwelten \u2013 Seattle Stone, Asmara Cinnamon, Treviso Lake und Lulea Leaf \u2013 sowie das neue M\u00f6beldekor Biarritz in Holzoptik schaffen ein harmonisches Raumgef\u00fchl. Abgerundet wird das Interieur durch Marmor- und Betonoptiken in K\u00fcche und Bad, mattschwarze Armaturen und stoffbezogene Seitenw\u00e4nde. Die indirekt beleuchteten Dachstauschr\u00e4nke unterstreichen den hohen Anspruch an \u00c4sthetik und Wohnlichkeit. Digital und autark: Technik, die mitdenkt Sowohl der Eriba Feeling als auch der Eriba Novaline bieten zahlreiche technologische Highlights, die das Reisen entspannter machen, und lassen sich auf Wunsch mit digitalen und autarken Features ausstatten. Die serienm\u00e4\u00dfig integrierte Eriba Connect App erm\u00f6glicht eine intuitive \u00dcberwachung von Wasserstand und Batteriestatus via Smartphone. Wer unabh\u00e4ngig reisen m\u00f6chte, kann zwischen verschiedenen Autarkiepaketen mit Lithium- oder AGM-Batterie w\u00e4hlen. Serienm\u00e4\u00dfig sorgt die Truma Vario Heat Heizung mit digitalem Bedienpanel f\u00fcr wohlige W\u00e4rme an k\u00fchleren Tagen. Beide Modellreihen sind ab Juli 2025 im Handel verf\u00fcgbar. Mehr Infos auf www.eriba.com .", + "text": "Zwei Modelle, zwei Konzepte – und ein gemeinsamer Anspruch: Mit dem neuen Eriba Feeling und dem Eriba Novaline stellt Eriba zwei Neuheiten vor, die zukunftsfähiges, flexibles Reisen ermöglichen. Auf diesem gemeinsamen Weg bieten die beiden Neuheiten Antworten auf unterschiedliche Bedürfnisse. „Mit dem neuen Eriba Feeling und Eriba Novaline haben wir eine neue Baureihe entwickelt, die in jeder Hinsicht neu durchdacht ist. Neben neuen Grundrissen und dem für Eriba typischen außergewöhnlichen Design haben wir auch im Bereich der Funktionalität neue Maßstäbe gesetzt. Selbst in sehr kompakten Grundrissen finden sich Betten mit 2,10 m Länge wieder. Hier hat das Entwicklungsteam einen erstklassigen Job gemacht“, sagt Matthias Binder, Markenleitung bei Eriba. Eriba Feeling – für alle, die mehr mitnehmen wollen Der neue Eriba Feeling ist die perfekte Wahl für alle, die auf Reisen maximale Flexibilität und Raumkomfort suchen. Sein serienmäßiges Hubdach ermöglicht eine geringe Gesamthöhe für bessere Aerodynamik und entspanntes Fahren, sorgt aber gleichzeitig für volle Stehhöhe im Inneren. Wer mehr Platz zum Schlafen benötigt, kann den Feeling mit einem optionalen Schlafdach erweitern. Je nach Grundriss finden bis zu fünf Personen Platz. Die intelligente Raumgestaltung kombiniert cleveren Stauraum mit multifunktionalen Sitzgruppen und durchdachten Details: Ein leistungsstarker Kompressorkühlschrank, eine Eingangstür mit integrierter Hakenleiste und Multifunktionsschienen sowie eine dimmbare, magnetisch befestigte Multifunktionsleuchte schaffen vielseitige Nutzungsmöglichkeiten und Komfort auf höchstem Niveau. Der Eriba Feeling ist in Deutschland ab einem Grundpreis von 27.990 Euro erhältlich. Eriba Novaline – großzügig, elegant und komfortabel Reisekomfort hat einen neuen Namen: Eriba Novaline. Frische Designs, durchdachte Grundrisse und eine Ausstattung auf höchstem Niveau heben das Caravaning-Erlebnis auf die nächste Stufe. Die durchgängige Stehhöhe von 198 Zentimetern sorgt für ein offenes Raumgefühl, das in Kombination mit cleveren Grundrissen, bis zu fünf Schlafplätzen und eleganten Sitzgruppen überzeugt. Wer sein Reisevergnügen noch weiter steigern möchte, ergänzt sein Modell um optionale Features wie eine Dachklimaanlage, ein hagelresistentes GFK-Dach oder ein voll integriertes Entertainmentsystem mit 22-Zoll-TV. Der Eriba Novaline ist in Deutschland ab einem Grundpreis von 29.490 Euro verfügbar. Markentypisches Design außen, wohnliches Ambiente innen Beide Modelle folgen der neuen Designsprache von Eriba: Klare Linien, moderne LED-Heckleuchten mit angedeutetem Bridge-Light und Glattblech in Carrara White oder optional Crystal Silver prägen das Exterieur. Im Inneren erwartet Reisende ein wohnliches Ambiente, das Funktion und Design vereint: Vier Stoffwelten – Seattle Stone, Asmara Cinnamon, Treviso Lake und Lulea Leaf – sowie das neue Möbeldekor Biarritz in Holzoptik schaffen ein harmonisches Raumgefühl. Abgerundet wird das Interieur durch Marmor- und Betonoptiken in Küche und Bad, mattschwarze Armaturen und stoffbezogene Seitenwände. Die indirekt beleuchteten Dachstauschränke unterstreichen den hohen Anspruch an Ästhetik und Wohnlichkeit. Digital und autark: Technik, die mitdenkt Sowohl der Eriba Feeling als auch der Eriba Novaline bieten zahlreiche technologische Highlights, die das Reisen entspannter machen, und lassen sich auf Wunsch mit digitalen und autarken Features ausstatten. Die serienmäßig integrierte Eriba Connect App ermöglicht eine intuitive Überwachung von Wasserstand und Batteriestatus via Smartphone. Wer unabhängig reisen möchte, kann zwischen verschiedenen Autarkiepaketen mit Lithium- oder AGM-Batterie wählen. Serienmäßig sorgt die Truma Vario Heat Heizung mit digitalem Bedienpanel für wohlige Wärme an kühleren Tagen. Beide Modellreihen sind ab Juli 2025 im Handel verfügbar. Mehr Infos auf www.eriba.com .", "tags": [], "status": "Trash", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5928", @@ -257,11 +257,11 @@ "title": "Den eigenen Verbrauchszahlen auf der Spur", "date": "Thu, 05 Jun 2025 00:00:00 +0200", "summary": "Campingplatz Kirchzarten erhält EU Ecolabel", - "text": "Den eigenen Verbrauchszahlen auf der Spur\n\nDer Campingplatz Kirchzarten wird vom Inhaber Jens Ziegler nachhaltig betrieben. Er strebt das Europ\u00e4ische Umweltzeichen EU Ecolabel an und hat daf\u00fcr verschiedene \u00c4nderungen am Campingplatz vorgenommen. \n\nZiegler hat den Wasserdurchfluss auf seinem Platz reduziert, um den Verbrauch zu verringern. Er hat alle Armaturen wie Brausek\u00f6pfe und Wasserh\u00e4hne gegen wassersparende Modelle ausgetauscht. Dar\u00fcber hinaus plant Ziegler, zwei Regenwasserzisternen zu bauen, um die Bew\u00e4sserung nicht mehr mit Trinkwasser durchf\u00fchren zu m\u00fcssen.\n\nDer Einsatz von Pestiziden auf dem Campingplatz Kirchzarten ist nicht erlaubt. Stattdessen konzentriert sich Ziegler auf einheimische Pflanzen und Str\u00e4ucher sowie bienenfreundliche Blumenwiesen. Er plant au\u00dferdem, bestimmte Bereiche des Campingplatzes in lebendige Hummel-Pl\u00e4tze zu verwandeln. \n\nDar\u00fcber hinaus achtet Ziegler darauf, dass die Beleuchtung in den Geb\u00e4uden auf umweltfreundliche LED-Lichter umgestellt ist und dass die Reinigungssets in umweltfreundlichen Papierkartons anstatt in Plastik verpackt sind. Zudem halbierte die digitale Rezeption den Papierverbrauch und verbessert die Effizienz des Personals. \n\nDie Heizanlage auf dem Campingplatz wurde durch zwei W\u00e4rmepumpen ersetzt, die den alten Gaskessel ersetzen. Ziegler betreibt au\u00dferdem eine eigene Photovoltaikanlage, die etwa 12% des Strombedarfs deckt und plant, Speicher f\u00fcr den eigenen Sonnenstrom zu installieren. \n\nCamping Kirchzarten ist seit langem Mitglied der Organisation ECOCAMPING, was Ziegler half, viele der Kriterien f\u00fcr das EU Ecolabel zu erf\u00fcllen. Durch seine nachhaltigen Bem\u00fchungen wurde Camping Kirchzarten zu einem der attraktivsten Campingpl\u00e4tze in Europa.", + "text": "Den eigenen Verbrauchszahlen auf der Spur\n\nDer Campingplatz Kirchzarten wird vom Inhaber Jens Ziegler nachhaltig betrieben. Er strebt das Europäische Umweltzeichen EU Ecolabel an und hat dafür verschiedene Änderungen am Campingplatz vorgenommen. \n\nZiegler hat den Wasserdurchfluss auf seinem Platz reduziert, um den Verbrauch zu verringern. Er hat alle Armaturen wie Brauseköpfe und Wasserhähne gegen wassersparende Modelle ausgetauscht. Darüber hinaus plant Ziegler, zwei Regenwasserzisternen zu bauen, um die Bewässerung nicht mehr mit Trinkwasser durchführen zu müssen.\n\nDer Einsatz von Pestiziden auf dem Campingplatz Kirchzarten ist nicht erlaubt. Stattdessen konzentriert sich Ziegler auf einheimische Pflanzen und Sträucher sowie bienenfreundliche Blumenwiesen. Er plant außerdem, bestimmte Bereiche des Campingplatzes in lebendige Hummel-Plätze zu verwandeln. \n\nDarüber hinaus achtet Ziegler darauf, dass die Beleuchtung in den Gebäuden auf umweltfreundliche LED-Lichter umgestellt ist und dass die Reinigungssets in umweltfreundlichen Papierkartons anstatt in Plastik verpackt sind. Zudem halbierte die digitale Rezeption den Papierverbrauch und verbessert die Effizienz des Personals. \n\nDie Heizanlage auf dem Campingplatz wurde durch zwei Wärmepumpen ersetzt, die den alten Gaskessel ersetzen. Ziegler betreibt außerdem eine eigene Photovoltaikanlage, die etwa 12% des Strombedarfs deckt und plant, Speicher für den eigenen Sonnenstrom zu installieren. \n\nCamping Kirchzarten ist seit langem Mitglied der Organisation ECOCAMPING, was Ziegler half, viele der Kriterien für das EU Ecolabel zu erfüllen. Durch seine nachhaltigen Bemühungen wurde Camping Kirchzarten zu einem der attraktivsten Campingplätze in Europa.", "tags": [ "Nachhaltiges Camping", "EU Ecolabel", - "Umweltfreundliche Ma\u00dfnahmen" + "Umweltfreundliche Maßnahmen" ], "status": "Online", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5929", @@ -389,7 +389,7 @@ "url": "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", "alt": "KI-generiertes Titelbild zu: Den eigenen Verbrauchszahlen auf der Spur", "caption": "KI-generiertes Titelbild zu: Den eigenen Verbrauchszahlen auf der Spur", - "copyright": "OpenAI DALL\u00b7E", + "copyright": "OpenAI DALL·E", "copyright_url": "https://openai.com/dall-e" } ], @@ -397,10 +397,10 @@ }, { "id": "Artikel 5925 von camping-news.de", - "title": "Abenteuer f\u00fcr die Kleinen, Entspannung f\u00fcr\ndie Gro\u00dfen", + "title": "Abenteuer für die Kleinen, Entspannung für\ndie Großen", "date": "Wed, 14 May 2025 00:00:00 +0200", "summary": "Ferienparadies Schwarzwälder Hof setzt auf Wohlfühlmodus", - "text": "Ein fantasievoller Abenteuerspielplatz, ein stilvoller Loungebereich zum Entspannen sowie ein umfangreiches Technik-Update sorgt f\u00fcr weiteren Komfort und Erlebnisqualit\u00e4t auf der beliebten Campinganlage im Herzen des mittleren Schwarzwaldes. Wo Kinderherzen Purzelb\u00e4ume schlagen Willkommen im Abenteuer. Ein zentrales Highlight der Neuerungen ist der komplett renovierte Abenteuerspielplatz, der mit naturbelassenem Holz und kreativen Kletterelementen zu Abenteuer, Spiel und Action einl\u00e4dt. Kinder k\u00f6nnen hier Seilbr\u00fccken \u00fcberqueren, T\u00fcrme erklimmen und mutig in luftigen H\u00f6hen balancieren. W\u00e4hrend die Kleinen mit leuchtenden Augen ihr eigenes Baumhaus-Abenteuer erleben, genie\u00dfen Eltern entspannte Momente und das Gl\u00fcck ihrer mutigen Kids bei Bewegung, Kreativit\u00e4t und Naturverbundenheit. F\u00fcr\u00a0alle eine unvergessliche Familienzeit inmitten der Natur. Symbiose aus Erholung und Genuss Einladung zum Chillen. Ein Ort zum Ankommen ist der ebenfalls neu und liebevoll gestaltete Loungebereich vor dem Restaurant, der einen mit seinen warmen Holzw\u00e4nden aus massiven Rundh\u00f6lzern, der sanften Beleuchtung und gem\u00fctlichen Sesseln mit einer nat\u00fcrlichen Geborgenheit umringt und somit zum gem\u00fctlichen Verweilen einl\u00e4dt. Die ged\u00e4mpfte Beleuchtung, die aus stilvollen, von der Decke herab schwebenden Gl\u00fchbirnen erzeugt wird, zaubert in seinem sanftgoldenen Licht eine behagliche Atmosph\u00e4re. Ob bei einer Tasse Kaffee am Nachmittag oder einem belebenden Aperitif am Abend, der stilvolle R\u00fcckzugsort bietet Raum f\u00fcr Ruhe, Gespr\u00e4che oder entspanntes Chillen. Dies ganz besonders in den Abendstunden zum Ausklang eines erlebnisreichen Tages und zum gem\u00fctlichen Beisammensein mit Freunden oder Familie. Die bequemen Sessel und urspr\u00fcnglichen kleinen Holztische untermalen die rustikal, moderne Nat\u00fcrlichkeit. Technik auf dem neuesten Stand Gut versorgt die Freiheit in der Natur genie\u00dfen. Auch auf technischer Seite wurde ein weiterer Meilenstein auf dem beliebten Ferien-Resort gesetzt. Alle Stellpl\u00e4tze haben nun neue eigene Stroms\u00e4ulen bekommen, die einen integriertem \u00dcberspannungsschutz, eine direkt selbst einschaltbare Sicherung sowie eine moderne LED-Platzbeleuchtung bieten. So kann sich ab sofort jeder einer zuverl\u00e4ssigen Stromversorgung sicher sein. Ein besonderes Plus: Wasser- und Abwasseranschl\u00fcsse direkt an jeder S\u00e4ule machen das Camperleben auf dem Stellplatz noch komfortabler. Ebenso die jetzt fl\u00e4chendeckende Erreichbarkeit des W-LAN Netzes auf dem gesamten Areal. Zudem wurde in Sachen Platzbeleuchtung mit der neuesten Technik Energieeffizienz und Nachhaltigkeit miteinander vereint, um dem Gedanken der \u201cgr\u00fcnsten\u201d Urlaubsform auch in diesem Bereich gerecht zu werden. Natur erleben \u2013 mit Stil, Abenteuer und Komfort. Das will das Team des Ferienparadies Schwarzw\u00e4lder Hof seinen G\u00e4sten bieten und damit ein nachhaltiges Naturerlebnis mit h\u00f6chstem Komfort verbinden \u2013 f\u00fcr Familien, Paare und Alleinreisende gleicherma\u00dfen, f\u00fcr einen Urlaub mit Erholung, Erlebnis und Qualit\u00e4t.", + "text": "Ein fantasievoller Abenteuerspielplatz, ein stilvoller Loungebereich zum Entspannen sowie ein umfangreiches Technik-Update sorgt für weiteren Komfort und Erlebnisqualität auf der beliebten Campinganlage im Herzen des mittleren Schwarzwaldes. Wo Kinderherzen Purzelbäume schlagen Willkommen im Abenteuer. Ein zentrales Highlight der Neuerungen ist der komplett renovierte Abenteuerspielplatz, der mit naturbelassenem Holz und kreativen Kletterelementen zu Abenteuer, Spiel und Action einlädt. Kinder können hier Seilbrücken überqueren, Türme erklimmen und mutig in luftigen Höhen balancieren. Während die Kleinen mit leuchtenden Augen ihr eigenes Baumhaus-Abenteuer erleben, genießen Eltern entspannte Momente und das Glück ihrer mutigen Kids bei Bewegung, Kreativität und Naturverbundenheit. Für alle eine unvergessliche Familienzeit inmitten der Natur. Symbiose aus Erholung und Genuss Einladung zum Chillen. Ein Ort zum Ankommen ist der ebenfalls neu und liebevoll gestaltete Loungebereich vor dem Restaurant, der einen mit seinen warmen Holzwänden aus massiven Rundhölzern, der sanften Beleuchtung und gemütlichen Sesseln mit einer natürlichen Geborgenheit umringt und somit zum gemütlichen Verweilen einlädt. Die gedämpfte Beleuchtung, die aus stilvollen, von der Decke herab schwebenden Glühbirnen erzeugt wird, zaubert in seinem sanftgoldenen Licht eine behagliche Atmosphäre. Ob bei einer Tasse Kaffee am Nachmittag oder einem belebenden Aperitif am Abend, der stilvolle Rückzugsort bietet Raum für Ruhe, Gespräche oder entspanntes Chillen. Dies ganz besonders in den Abendstunden zum Ausklang eines erlebnisreichen Tages und zum gemütlichen Beisammensein mit Freunden oder Familie. Die bequemen Sessel und ursprünglichen kleinen Holztische untermalen die rustikal, moderne Natürlichkeit. Technik auf dem neuesten Stand Gut versorgt die Freiheit in der Natur genießen. Auch auf technischer Seite wurde ein weiterer Meilenstein auf dem beliebten Ferien-Resort gesetzt. Alle Stellplätze haben nun neue eigene Stromsäulen bekommen, die einen integriertem Überspannungsschutz, eine direkt selbst einschaltbare Sicherung sowie eine moderne LED-Platzbeleuchtung bieten. So kann sich ab sofort jeder einer zuverlässigen Stromversorgung sicher sein. Ein besonderes Plus: Wasser- und Abwasseranschlüsse direkt an jeder Säule machen das Camperleben auf dem Stellplatz noch komfortabler. Ebenso die jetzt flächendeckende Erreichbarkeit des W-LAN Netzes auf dem gesamten Areal. Zudem wurde in Sachen Platzbeleuchtung mit der neuesten Technik Energieeffizienz und Nachhaltigkeit miteinander vereint, um dem Gedanken der “grünsten” Urlaubsform auch in diesem Bereich gerecht zu werden. Natur erleben – mit Stil, Abenteuer und Komfort. Das will das Team des Ferienparadies Schwarzwälder Hof seinen Gästen bieten und damit ein nachhaltiges Naturerlebnis mit höchstem Komfort verbinden – für Familien, Paare und Alleinreisende gleichermaßen, für einen Urlaub mit Erholung, Erlebnis und Qualität.", "tags": [], "status": "Trash", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5925", @@ -522,10 +522,10 @@ }, { "id": "Artikel 5926 von camping-news.de", - "title": "Das weltweit gr\u00f6\u00dfte Caravaning-Erlebnis", + "title": "Das weltweit größte Caravaning-Erlebnis", "date": "Tue, 13 May 2025 00:00:00 +0200", "summary": "Vom 29. August (Preview Day) bis zum 7. September 2025 wird Düsseldorf erneut zum Treffpunkt der Caravaning-Welt", - "text": "Das weltweit gr\u00f6\u00dfte Caravaning-Erlebnis\n\nDer CARAVAN SALON ist die weltweit gr\u00f6\u00dfte Messe, die sich speziell auf Caravaning konzentriert, und bietet eine eindrucksvolle Ausstellung von Reisemobilen, Caravans und Campervans. Zu dem breiten Angebot geh\u00f6ren aber auch Zubeh\u00f6r, technisches Equipment, Ausbauteile, Dachzelte, Mobilheime und Campingzubeh\u00f6r. Der Salon ist auch ein Ort, an dem Besucher Reiseziele, Campingpl\u00e4tze und Wohnmobilstellpl\u00e4tze entdecken k\u00f6nnen. Besucher haben die M\u00f6glichkeit, die Fahrzeuge vor dem Kauf intensiv zu begutachten, zu testen und zu vergleichen, um das f\u00fcr ihren Lebensstil passende Modell zu finden. Als weltweit f\u00fchrendes Event in diesem Bereich versammelt der CARAVAN SALON sowohl nationale als auch internationale Hersteller, und pr\u00e4sentiert die neuesten Produkte, Innovationen und Weltneuheiten. Mit einer neuen und \u00fcbersichtlichen Hallenstruktur sind die Ausstellungsst\u00fccke leicht zu finden und zu vergleichen. Der CARAVAN SALON zeichnet sich dadurch aus, dass er allen Besuchern, ob Neueinsteiger oder Luxus-Liebhaber, ein spannendes Messeerlebnis bietet. Laut dem Gesch\u00e4ftsf\u00fchrer des Caravaning Industrie Verbandes, Daniel Onggowinarso, spiegelt der Salon auch die steigende Beliebtheit und das Wachstum der Caravaningbranche wider. Der Preview Day bietet eine ruhige Atmosph\u00e4re f\u00fcr diejenigen, die die Neuheiten der Branche in Ruhe entdecken wollen. Der Ticketverkauf beginnt am 11. Juni und weitere Informationen sind auf der Website www.caravan-salon.de zu finden.", + "text": "Das weltweit größte Caravaning-Erlebnis\n\nDer CARAVAN SALON ist die weltweit größte Messe, die sich speziell auf Caravaning konzentriert, und bietet eine eindrucksvolle Ausstellung von Reisemobilen, Caravans und Campervans. Zu dem breiten Angebot gehören aber auch Zubehör, technisches Equipment, Ausbauteile, Dachzelte, Mobilheime und Campingzubehör. Der Salon ist auch ein Ort, an dem Besucher Reiseziele, Campingplätze und Wohnmobilstellplätze entdecken können. Besucher haben die Möglichkeit, die Fahrzeuge vor dem Kauf intensiv zu begutachten, zu testen und zu vergleichen, um das für ihren Lebensstil passende Modell zu finden. Als weltweit führendes Event in diesem Bereich versammelt der CARAVAN SALON sowohl nationale als auch internationale Hersteller, und präsentiert die neuesten Produkte, Innovationen und Weltneuheiten. Mit einer neuen und übersichtlichen Hallenstruktur sind die Ausstellungsstücke leicht zu finden und zu vergleichen. Der CARAVAN SALON zeichnet sich dadurch aus, dass er allen Besuchern, ob Neueinsteiger oder Luxus-Liebhaber, ein spannendes Messeerlebnis bietet. Laut dem Geschäftsführer des Caravaning Industrie Verbandes, Daniel Onggowinarso, spiegelt der Salon auch die steigende Beliebtheit und das Wachstum der Caravaningbranche wider. Der Preview Day bietet eine ruhige Atmosphäre für diejenigen, die die Neuheiten der Branche in Ruhe entdecken wollen. Der Ticketverkauf beginnt am 11. Juni und weitere Informationen sind auf der Website www.caravan-salon.de zu finden.", "tags": [ "Caravaning", "CARAVAN SALON", @@ -606,9 +606,9 @@ }, { "url": "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", - "alt": "KI-generiertes Titelbild zu: Das weltweit gr\u00f6\u00dfte Caravaning-Erlebnis", - "caption": "KI-generiertes Titelbild zu: Das weltweit gr\u00f6\u00dfte Caravaning-Erlebnis", - "copyright": "OpenAI DALL\u00b7E", + "alt": "KI-generiertes Titelbild zu: Das weltweit größte Caravaning-Erlebnis", + "caption": "KI-generiertes Titelbild zu: Das weltweit größte Caravaning-Erlebnis", + "copyright": "OpenAI DALL·E", "copyright_url": "https://openai.com/dall-e" } ], @@ -616,10 +616,10 @@ }, { "id": "Artikel 5923 von camping-news.de", - "title": "Komfort und Flexibilit\u00e4t f\u00fcr moderne Camper", + "title": "Komfort und Flexibilität für moderne Camper", "date": "Wed, 07 May 2025 00:00:00 +0200", "summary": "dwt-Zelte präsentiert das Luftzelt Scala Air", - "text": "Mit dem neuen Luftzelt Scala Air stellt dwt-Zelte nei neues Modell in zwei Varianten vor: Scala Air 250 und Scala Air 280, jeweils mit einer Zelttiefe von 250 bzw. 280 cm, und richtet sich an Camper, die Wert auf gro\u00dfz\u00fcgigen Raum und durchdachte Bel\u00fcftung legen. Schneller Aufbau dank moderner Air-In-Technologie Das Scala Air ist mit dem bew\u00e4hrten Air-In-System ausgestattet. Die robusten 13 cm starken Luftschl\u00e4uche sorgen f\u00fcr eine stabile Zeltstruktur \u2013 ganz ohne Gest\u00e4nge. Der Aufbau gelingt in wenigen Minuten, was das Zelt besonders attraktiv f\u00fcr spontane Kurzurlaube oder wechselnde Standorte macht. Zus\u00e4tzliche Luftschl\u00e4uche im Dachbereich und in der Vorderwand erh\u00f6hen die Windsicherheit erheblich. Besonders hervorzuheben ist der Verzicht auf einen Dach\u00fcberstand, was das Zelt besonders f\u00fcr windige Regionen, wie beispielsweise am Meer, optimal macht. Gute Bel\u00fcftung f\u00fcr jedes Wetter Dank clever platzierter Bel\u00fcftungs\u00f6ffnungen und gro\u00dffl\u00e4chiger Fenster mit Moskitonetzen bleibt das Raumklima im Zelt stets angenehm \u2013 auch bei hohen Temperaturen. Die Seitenfenster lassen sich aufrollen oder als L\u00fcftungshaube ausstellen, sodass auch bei Regen eine gute Luftzirkulation gew\u00e4hrleistet ist. Flexible Raumgestaltung durch modulares Design Das Scala Air punktet mit einem variabel nutzbaren Innenraum: \u2022 Die Vorderwand ist herausnehmbar und besitzt eine hochrollbare T\u00fcr. \u2022 Die rechte Vorderwandh\u00e4lfte l\u00e4sst sich zur Veranda abklappen. \u2022 Seitenw\u00e4nde k\u00f6nnen ebenfalls entfernt oder individuell angepasst werden. \u2022 Die doppelte Windecke in der rechten Seitenwand gleicht die Bugschr\u00e4ge optimal aus. H\u00f6hen-Ausgleichs-Blocks inklusive Das Zelt soll eben stehen und auch in der H\u00f6he exakt an den Wohnwagen anschlie\u00dfen: Daf\u00fcr ist beim Scala Air 250/280 durch serienm\u00e4\u00dfige H\u00f6hen-Ausgleichs-Blocks gesorgt. Sie erlauben es, ung\u00fcnstige Bodenunebenheiten oder abfallendes Terrain unter dem Zelt auszugleichen. Gleichzeitig gew\u00e4hrleisten sie den stimmigen \u00dcbergang zwischen Caravan und Zeltdach. Langlebige Materialien f\u00fcr den Outdoor-Einsatz Gefertigt aus Texolan 150 HQ Ripstop-Polyester mit PU-Beschichtung, ist das Scala Air nicht nur strapazierf\u00e4hig, sondern auch pflegeleicht und wetterfest. Die Luftschl\u00e4uche aus TPU sowie der hochgezogene Spritzschutz aus kunststoffbeschichtetem Polyester sorgen f\u00fcr zus\u00e4tzliche Robustheit und Langlebigkeit. Verf\u00fcgbarkeit und Preise Das Scala Air ist in mehreren Gr\u00f6\u00dfen f\u00fcr Umlaufma\u00dfe zwischen 906 cm und 1030 cm erh\u00e4ltlich. Die unverbindliche Preisempfehlung liegt \u2013 je nach Gr\u00f6\u00dfe \u2013 zwischen 1.995 \u20ac und 2.215 \u20ac. Damit bietet dwt-Zelte eine flexible L\u00f6sung f\u00fcr unterschiedlich gro\u00dfe Wohnwagenmodelle und verschiedenste Campinganspr\u00fcche. Besondere Sicherheitsmerkmale F\u00fcr den Einsatz an windigen Standorten \u2013 wie beispielsweise an der See \u2013 sind Sicherheitsgurte serienm\u00e4\u00dfig enthalten. Diese erh\u00f6hen die Sicherheit des Zeltes erheblich und tragen dazu bei, das Zelt bei widrigen Witterungsbedingungen stabil zu halten. Weitere Informationen zu dwt Luftzelten f\u00fcr Wohnwagen gibt's auf https://dwt-zelte.de/wohnwagenvorzelte/wohnwagen-luftzelte.html", + "text": "Mit dem neuen Luftzelt Scala Air stellt dwt-Zelte nei neues Modell in zwei Varianten vor: Scala Air 250 und Scala Air 280, jeweils mit einer Zelttiefe von 250 bzw. 280 cm, und richtet sich an Camper, die Wert auf großzügigen Raum und durchdachte Belüftung legen. Schneller Aufbau dank moderner Air-In-Technologie Das Scala Air ist mit dem bewährten Air-In-System ausgestattet. Die robusten 13 cm starken Luftschläuche sorgen für eine stabile Zeltstruktur – ganz ohne Gestänge. Der Aufbau gelingt in wenigen Minuten, was das Zelt besonders attraktiv für spontane Kurzurlaube oder wechselnde Standorte macht. Zusätzliche Luftschläuche im Dachbereich und in der Vorderwand erhöhen die Windsicherheit erheblich. Besonders hervorzuheben ist der Verzicht auf einen Dachüberstand, was das Zelt besonders für windige Regionen, wie beispielsweise am Meer, optimal macht. Gute Belüftung für jedes Wetter Dank clever platzierter Belüftungsöffnungen und großflächiger Fenster mit Moskitonetzen bleibt das Raumklima im Zelt stets angenehm – auch bei hohen Temperaturen. Die Seitenfenster lassen sich aufrollen oder als Lüftungshaube ausstellen, sodass auch bei Regen eine gute Luftzirkulation gewährleistet ist. Flexible Raumgestaltung durch modulares Design Das Scala Air punktet mit einem variabel nutzbaren Innenraum: • Die Vorderwand ist herausnehmbar und besitzt eine hochrollbare Tür. • Die rechte Vorderwandhälfte lässt sich zur Veranda abklappen. • Seitenwände können ebenfalls entfernt oder individuell angepasst werden. • Die doppelte Windecke in der rechten Seitenwand gleicht die Bugschräge optimal aus. Höhen-Ausgleichs-Blocks inklusive Das Zelt soll eben stehen und auch in der Höhe exakt an den Wohnwagen anschließen: Dafür ist beim Scala Air 250/280 durch serienmäßige Höhen-Ausgleichs-Blocks gesorgt. Sie erlauben es, ungünstige Bodenunebenheiten oder abfallendes Terrain unter dem Zelt auszugleichen. Gleichzeitig gewährleisten sie den stimmigen Übergang zwischen Caravan und Zeltdach. Langlebige Materialien für den Outdoor-Einsatz Gefertigt aus Texolan 150 HQ Ripstop-Polyester mit PU-Beschichtung, ist das Scala Air nicht nur strapazierfähig, sondern auch pflegeleicht und wetterfest. Die Luftschläuche aus TPU sowie der hochgezogene Spritzschutz aus kunststoffbeschichtetem Polyester sorgen für zusätzliche Robustheit und Langlebigkeit. Verfügbarkeit und Preise Das Scala Air ist in mehreren Größen für Umlaufmaße zwischen 906 cm und 1030 cm erhältlich. Die unverbindliche Preisempfehlung liegt – je nach Größe – zwischen 1.995 € und 2.215 €. Damit bietet dwt-Zelte eine flexible Lösung für unterschiedlich große Wohnwagenmodelle und verschiedenste Campingansprüche. Besondere Sicherheitsmerkmale Für den Einsatz an windigen Standorten – wie beispielsweise an der See – sind Sicherheitsgurte serienmäßig enthalten. Diese erhöhen die Sicherheit des Zeltes erheblich und tragen dazu bei, das Zelt bei widrigen Witterungsbedingungen stabil zu halten. Weitere Informationen zu dwt Luftzelten für Wohnwagen gibt's auf https://dwt-zelte.de/wohnwagenvorzelte/wohnwagen-luftzelte.html", "tags": [], "status": "Trash", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5923", @@ -702,7 +702,7 @@ "title": "Viel los auf dem Klaukenhof", "date": "Fri, 25 Apr 2025 00:00:00 +0200", "summary": "Auch 2025 gibt es viel Spannendes auf dem Campingplatz", - "text": "Der Klaukenhof bietet die ganze Saison \u00fcber ein umfangreiches Angebot. Hier nun einige Highlights: 01. Mai 2025 - Maifest Das Maifest findet auf dem Vorplatz und im Biergarten statt. Das Fest ist die perfekte Gelegenheit, um den Fr\u00fchling zu begr\u00fc\u00dfen und um unter Campern ausgiebig zu fachsimpeln. Tauschen Sie mit anderen Campern die besten \u201eCamping-Hacks\u201d aus, um das Leben im Wohnwagen noch angenehmer zu machen und genie\u00dfen Sie nebenbei k\u00fchle Getr\u00e4nke unter der alten Eiche! Keine Anmeldung n\u00f6tig! 02. Mai 2025 - Clevere Camper nutzen Br\u00fcckentage Der 02.05.2025 ist ein Br\u00fcckentag! Geschickt genutzt wird daraus ein langes Wochenende in der Natur. Entspannen, Grillen mit Freunden und die frische Luft genie\u00dfen. Einfach online buchen \u00fcber https://campbuchung.de/anfrage/10180/ 29. Mai 2025 - Vatertag Am Vatertag gilt das Motto \u201ePapa, mach mal Pause!\u201d. Der Vorplatz und der Biergarten sind f\u00fcr alle V\u00e4ter reserviert, die ausgelassen feiern m\u00f6chten. Auf jeden Vater wartet ein k\u00fchles Bier und auf den Bollerwagen wartet ein schattiger Parkplatz. Lassen Sie es also krachen und feiern Sie gemeinsam mit anderen V\u00e4tern diesen besonderen Tag. Keine Anmeldung n\u00f6tig! 07. Dezember 2025 \u2013 Gef\u00fchrte Wanderung am Klaukenhof \u2013 Gemeinsam f\u00fcr den guten Zweck! Am 7. Dezember 2025 l\u00e4dt der Klaukenhof ab 10:00 Uhr zu einer gef\u00fchrten Wanderung ein. Alle Interessierten sind herzlich willkommen, die Natur zu genie\u00dfen und dabei Gutes zu tun. Die Veranstaltung dient dazu, Spenden f\u00fcr \u201eLichtblicke\u201c zu sammeln. Ein weiteres Highlight: Radio Vest wird die Wanderung begleiten und f\u00fcr spannende Einblicke sorgen. Seien Sie dabei und erleben Sie einen Tag voller Bewegung, Gemeinschaft und Unterst\u00fctzung f\u00fcr einen wertvollen Zweck. Anmeldung: info@freizeitpark-klaukenhof.de 31. Dezember 2025 - Silvester Wir verabschieden das Jahr mit einer gro\u00dfen Silvesterparty! Freuen Sie sich auf eine fr\u00f6hliche Veranstaltung mit tollem Essen und Sekt im Biergarten. Bitte beachten Sie, dass eine rechtzeitige Anmeldung erforderlich ist, um an der Feier teilzunehmen. Anmeldungen bei Jutta Hahn unter 02363-365037.", + "text": "Der Klaukenhof bietet die ganze Saison über ein umfangreiches Angebot. Hier nun einige Highlights: 01. Mai 2025 - Maifest Das Maifest findet auf dem Vorplatz und im Biergarten statt. Das Fest ist die perfekte Gelegenheit, um den Frühling zu begrüßen und um unter Campern ausgiebig zu fachsimpeln. Tauschen Sie mit anderen Campern die besten „Camping-Hacks” aus, um das Leben im Wohnwagen noch angenehmer zu machen und genießen Sie nebenbei kühle Getränke unter der alten Eiche! Keine Anmeldung nötig! 02. Mai 2025 - Clevere Camper nutzen Brückentage Der 02.05.2025 ist ein Brückentag! Geschickt genutzt wird daraus ein langes Wochenende in der Natur. Entspannen, Grillen mit Freunden und die frische Luft genießen. Einfach online buchen über https://campbuchung.de/anfrage/10180/ 29. Mai 2025 - Vatertag Am Vatertag gilt das Motto „Papa, mach mal Pause!”. Der Vorplatz und der Biergarten sind für alle Väter reserviert, die ausgelassen feiern möchten. Auf jeden Vater wartet ein kühles Bier und auf den Bollerwagen wartet ein schattiger Parkplatz. Lassen Sie es also krachen und feiern Sie gemeinsam mit anderen Vätern diesen besonderen Tag. Keine Anmeldung nötig! 07. Dezember 2025 – Geführte Wanderung am Klaukenhof – Gemeinsam für den guten Zweck! Am 7. Dezember 2025 lädt der Klaukenhof ab 10:00 Uhr zu einer geführten Wanderung ein. Alle Interessierten sind herzlich willkommen, die Natur zu genießen und dabei Gutes zu tun. Die Veranstaltung dient dazu, Spenden für „Lichtblicke“ zu sammeln. Ein weiteres Highlight: Radio Vest wird die Wanderung begleiten und für spannende Einblicke sorgen. Seien Sie dabei und erleben Sie einen Tag voller Bewegung, Gemeinschaft und Unterstützung für einen wertvollen Zweck. Anmeldung: info@freizeitpark-klaukenhof.de 31. Dezember 2025 - Silvester Wir verabschieden das Jahr mit einer großen Silvesterparty! Freuen Sie sich auf eine fröhliche Veranstaltung mit tollem Essen und Sekt im Biergarten. Bitte beachten Sie, dass eine rechtzeitige Anmeldung erforderlich ist, um an der Feier teilzunehmen. Anmeldungen bei Jutta Hahn unter 02363-365037.", "tags": [], "status": "Trash", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5922", @@ -834,7 +834,7 @@ "title": "Camping Resort Allweglehen bietet \"Wellness plus\"", "date": "Fri, 04 Apr 2025 00:00:00 +0200", "summary": "Biken, Yoga und Allweglehen Adventures", - "text": "Fr\u00fchlingserwachen in der Erlebnisregion Berchtesgaden Genug vom Winter? Auf dem Camping Resort Allweglehen dr\u00e4ngt die Jahreszeit f\u00fcr schneefreie Sportaktivit\u00e4ten ins Land. Mit den \u201eAllweglehen Adventures\u201c steht ein neues Aktiv-Konzept. F\u00fcr die mentale und k\u00f6rperliche Fitness wurde das Angebot von Yoga und Aquagym als Erg\u00e4nzung der Wellnesserholung ins Programm genommen. Eingebettet in die beeindruckende Natur des Nationalparks bieten das \u201e5-Sterne S\u201c Resort zusammen mit seinen Aktivpartnern einzigartige Abenteuer f\u00fcr jedes Niveau, vom gem\u00fctlichen Naturgenuss bis hin zum Adrenalinkick \u2013 beim Wandern, auf Klettersteigen, Canyoning, Wildwasser Rafting bis zum Tandemflug am Familien- und Aktivberg Jenner. Letzteres ein atemberaubendes Abenteuer mit Blick aus der Vogelperspektive auf die spektakul\u00e4re Berchtesgadener Bergwelt. Bei allen gef\u00fchrten Touren bewegt man sich dabei immer in der sicheren Obhut erfahrener und speziell daf\u00fcr ausgebildeter Guides. \u201eRadeln f\u00fcr die Wadeln\u201c Vor allem aber laden grandiose Biketouren im Alpennationalpark Berchtesgaden ein, Zeit in der Natur zu verbringen. Von leicht bis anspruchsvoll, und das auch auf eigene Faust. Die muskelschonende Variante macht der E-Bike-Verleih am Camping Resort m\u00f6glich. Sechs R\u00e4der stehen aus dem eigenen Verleih zur Verf\u00fcgung, um die Region im eigenen Tempo zu entdecken und auf abwechslungsreichen Routen zu den umliegenden Almen zu gelangen. Die Litzl- oder Reiter Alm bieten sich besonders an, um dort bei einer gem\u00fctlichen Brotzeit die Aussicht auf die beeindruckende umliegende Bergwelt zu genie\u00dfen. F\u00fcr ausdauernde Radler empfiehlt sich der Tourenklassiker \u201eRund um den Untersberg\u201c mit knapp 46 Kilometer L\u00e4nge, jedoch mei\u00dft relativ flach verlaufend, oder die Ro\u00dffeldrunde, die ideal vom Allweglehen gestartet werden kann. Eine knackige Runde mit 1145 Metern H\u00f6henunterschied bis auf eine Passh\u00f6he von 1545 Meter. Oben mit Traumaussicht bis ins Salzburger Land laden bewirtschaftete Almh\u00fctten zum Verweilen ein. Wellness plus: Resorteigenes Yoga & Aqua Gym Angebot In Erg\u00e4nzung zu allen Aktivprogrammen steht das Wellnessangebot mit Saunalandschaft, Saunagarten, Ruhezonen und Zugang zum Infinitypool f\u00fcr eine erholsame Regeneration. Auch eine Rundum Verw\u00f6hnung mit erholsamen Massageangeboten und Kosmetik k\u00f6nnen dazu beitragen, das eigene Zeitgef\u00fchl einmal komplett auszublenden. Neu im Programm sind zudem die Angebote von Aqua Gym und Yoga, die in Zusammenarbeit mit Barbara Steube von der \u00f6rtlichen Bewegungsschule Du\u00e0nsh\u00f9 durchgef\u00fchrt werden. Beides tr\u00e4gt sowohl zur Muskelst\u00e4rkung, einer verbesserten k\u00f6rperlichen Haltung sowie zum Aufbau mentaler St\u00e4rke und Konzentration bei - gut zur Bew\u00e4ltigung intensiver Aktivit\u00e4ten, Touren oder Trails. Zum 30 min\u00fctigen Aquagym am Allweglehen geht es immer dienstags um 9:00 Uhr in den Infinity-Pool, zum Yoga immer donnerstags um 9:00 Uhr f\u00fcr 45 Minuten in den Ruheraum. Beide Angebote finden bei jeder Witterung statt. Voranmeldung erforderlich. Infos zu den genannten und weiteren Radtouren und Aktivit\u00e4ten gibt es unter https://www.allweglehen.de/aktiv/sommer/biken & https://www.allweglehen.de/aktiv/sommer", + "text": "Frühlingserwachen in der Erlebnisregion Berchtesgaden Genug vom Winter? Auf dem Camping Resort Allweglehen drängt die Jahreszeit für schneefreie Sportaktivitäten ins Land. Mit den „Allweglehen Adventures“ steht ein neues Aktiv-Konzept. Für die mentale und körperliche Fitness wurde das Angebot von Yoga und Aquagym als Ergänzung der Wellnesserholung ins Programm genommen. Eingebettet in die beeindruckende Natur des Nationalparks bieten das „5-Sterne S“ Resort zusammen mit seinen Aktivpartnern einzigartige Abenteuer für jedes Niveau, vom gemütlichen Naturgenuss bis hin zum Adrenalinkick – beim Wandern, auf Klettersteigen, Canyoning, Wildwasser Rafting bis zum Tandemflug am Familien- und Aktivberg Jenner. Letzteres ein atemberaubendes Abenteuer mit Blick aus der Vogelperspektive auf die spektakuläre Berchtesgadener Bergwelt. Bei allen geführten Touren bewegt man sich dabei immer in der sicheren Obhut erfahrener und speziell dafür ausgebildeter Guides. „Radeln für die Wadeln“ Vor allem aber laden grandiose Biketouren im Alpennationalpark Berchtesgaden ein, Zeit in der Natur zu verbringen. Von leicht bis anspruchsvoll, und das auch auf eigene Faust. Die muskelschonende Variante macht der E-Bike-Verleih am Camping Resort möglich. Sechs Räder stehen aus dem eigenen Verleih zur Verfügung, um die Region im eigenen Tempo zu entdecken und auf abwechslungsreichen Routen zu den umliegenden Almen zu gelangen. Die Litzl- oder Reiter Alm bieten sich besonders an, um dort bei einer gemütlichen Brotzeit die Aussicht auf die beeindruckende umliegende Bergwelt zu genießen. Für ausdauernde Radler empfiehlt sich der Tourenklassiker „Rund um den Untersberg“ mit knapp 46 Kilometer Länge, jedoch meißt relativ flach verlaufend, oder die Roßfeldrunde, die ideal vom Allweglehen gestartet werden kann. Eine knackige Runde mit 1145 Metern Höhenunterschied bis auf eine Passhöhe von 1545 Meter. Oben mit Traumaussicht bis ins Salzburger Land laden bewirtschaftete Almhütten zum Verweilen ein. Wellness plus: Resorteigenes Yoga & Aqua Gym Angebot In Ergänzung zu allen Aktivprogrammen steht das Wellnessangebot mit Saunalandschaft, Saunagarten, Ruhezonen und Zugang zum Infinitypool für eine erholsame Regeneration. Auch eine Rundum Verwöhnung mit erholsamen Massageangeboten und Kosmetik können dazu beitragen, das eigene Zeitgefühl einmal komplett auszublenden. Neu im Programm sind zudem die Angebote von Aqua Gym und Yoga, die in Zusammenarbeit mit Barbara Steube von der örtlichen Bewegungsschule Duànshù durchgeführt werden. Beides trägt sowohl zur Muskelstärkung, einer verbesserten körperlichen Haltung sowie zum Aufbau mentaler Stärke und Konzentration bei - gut zur Bewältigung intensiver Aktivitäten, Touren oder Trails. Zum 30 minütigen Aquagym am Allweglehen geht es immer dienstags um 9:00 Uhr in den Infinity-Pool, zum Yoga immer donnerstags um 9:00 Uhr für 45 Minuten in den Ruheraum. Beide Angebote finden bei jeder Witterung statt. Voranmeldung erforderlich. Infos zu den genannten und weiteren Radtouren und Aktivitäten gibt es unter https://www.allweglehen.de/aktiv/sommer/biken & https://www.allweglehen.de/aktiv/sommer", "tags": [], "status": "Online", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5921", @@ -963,10 +963,10 @@ }, { "id": "Artikel 5920 von camping-news.de", - "title": "EU-F\u00fchrerscheinreform kommt", + "title": "EU-Führerscheinreform kommt", "date": "Tue, 01 Apr 2025 00:00:00 +0200", "summary": "Reisemobile bis 4,25 Tonnen mit B-Führerschein", - "text": "Das Europ\u00e4ische Parlament und die Mitgliedstaaten haben sich auf eine Novellierung der EU-F\u00fchrerscheinrichtlinie verst\u00e4ndigt, die eine Sonderregelung f\u00fcr Reisemobile umfasst: Demnach soll das zul\u00e4ssige Gesamtgewicht f\u00fcr Inhaber eines B-F\u00fchrerscheins auf 4,25 Tonnen bei Reisemobilen erh\u00f6ht werden. Die \u00fcberarbeitete F\u00fchrerscheinrichtlinie bietet die Chance, nachhaltiges und familienfreundliches Reisen mit dem Reisemobil f\u00fcr noch mehr Menschen zug\u00e4nglich zu machen. Mit der Einf\u00fchrung des B-F\u00fchrerscheins im Jahr 1999 teilte sich in Deutschland die stetig wachsende Zahl der Reisemobilisten immer mehr in zwei Klassen auf. W\u00e4hrend mit dem alten F\u00fchrerschein der Klasse 3 noch Reisemobile mit einem zul\u00e4ssigen Gesamtgewicht von bis zu 7,5 Tonnen bewegt werden d\u00fcrfen, ist es Besitzern des B-F\u00fchrerscheins nur erlaubt, Reisemobile bis zu 3,5 Tonnen zu lenken. Die Grenze von 3,5 Tonnen wird aus vielen Gr\u00fcnden schnell erreicht: Moderne Reisemobile sind sicherer und umweltfreundlicher als je zuvor. Allerdings sind sie - nicht zuletzt aufgrund der weitgehend durch EU-Recht vorgeschriebenen Sicherheits- und Umweltanforderungen - auch schwerer geworden. Mit dem langfristig angestrebten Umstieg auf alternative Antriebe wird das Fahrzeuggewicht in Zukunft voraussichtlich weiter ansteigen. Daher setzt sich der Caravaning Industrie Verband (CIVD) bereits seit vielen Jahren \u00fcber den europ\u00e4ischen Dachverband \"European Caravan Federation\" (ECF) f\u00fcr eine Erweiterung der Gewichtsgrenze des B-F\u00fchrerschein auf EU-Ebene ein. In Zukunft k\u00f6nnen Inhaber eines B-F\u00fchrerscheins Reisemobile mit einem Gesamtgewicht von bis zu 4,25 Tonnen f\u00fchren, sofern sie ein spezielles Training oder eine Pr\u00fcfung absolvieren. Ob ein Training, eine Pr\u00fcfung oder beides erforderlich ist, liegt im Ermessen der einzelnen Mitgliedstaaten.\u00a0Bei allen Fahrzeugen mit alternativen Antrieben entf\u00e4llt eine Zusatzpr\u00fcfung, wenn der Fahrer seit mindestens zwei Jahren im Besitz der Fahrerlaubnis ist. Die Novellierung der EU-F\u00fchrerscheinrichtlinie bietet die Chance, den naturnahen, nachhaltigen und familienfreundlichen Urlaub mit dem Reisemobil f\u00fcr Millionen von Menschen - insbesondere f\u00fcr junge und kommende Generationen - noch leichter zug\u00e4nglich zu machen und tr\u00e4gt so positiv zur Entwicklung des Tourismus in Deutschland und Europa bei.", + "text": "Das Europäische Parlament und die Mitgliedstaaten haben sich auf eine Novellierung der EU-Führerscheinrichtlinie verständigt, die eine Sonderregelung für Reisemobile umfasst: Demnach soll das zulässige Gesamtgewicht für Inhaber eines B-Führerscheins auf 4,25 Tonnen bei Reisemobilen erhöht werden. Die überarbeitete Führerscheinrichtlinie bietet die Chance, nachhaltiges und familienfreundliches Reisen mit dem Reisemobil für noch mehr Menschen zugänglich zu machen. Mit der Einführung des B-Führerscheins im Jahr 1999 teilte sich in Deutschland die stetig wachsende Zahl der Reisemobilisten immer mehr in zwei Klassen auf. Während mit dem alten Führerschein der Klasse 3 noch Reisemobile mit einem zulässigen Gesamtgewicht von bis zu 7,5 Tonnen bewegt werden dürfen, ist es Besitzern des B-Führerscheins nur erlaubt, Reisemobile bis zu 3,5 Tonnen zu lenken. Die Grenze von 3,5 Tonnen wird aus vielen Gründen schnell erreicht: Moderne Reisemobile sind sicherer und umweltfreundlicher als je zuvor. Allerdings sind sie - nicht zuletzt aufgrund der weitgehend durch EU-Recht vorgeschriebenen Sicherheits- und Umweltanforderungen - auch schwerer geworden. Mit dem langfristig angestrebten Umstieg auf alternative Antriebe wird das Fahrzeuggewicht in Zukunft voraussichtlich weiter ansteigen. Daher setzt sich der Caravaning Industrie Verband (CIVD) bereits seit vielen Jahren über den europäischen Dachverband \"European Caravan Federation\" (ECF) für eine Erweiterung der Gewichtsgrenze des B-Führerschein auf EU-Ebene ein. In Zukunft können Inhaber eines B-Führerscheins Reisemobile mit einem Gesamtgewicht von bis zu 4,25 Tonnen führen, sofern sie ein spezielles Training oder eine Prüfung absolvieren. Ob ein Training, eine Prüfung oder beides erforderlich ist, liegt im Ermessen der einzelnen Mitgliedstaaten. Bei allen Fahrzeugen mit alternativen Antrieben entfällt eine Zusatzprüfung, wenn der Fahrer seit mindestens zwei Jahren im Besitz der Fahrerlaubnis ist. Die Novellierung der EU-Führerscheinrichtlinie bietet die Chance, den naturnahen, nachhaltigen und familienfreundlichen Urlaub mit dem Reisemobil für Millionen von Menschen - insbesondere für junge und kommende Generationen - noch leichter zugänglich zu machen und trägt so positiv zur Entwicklung des Tourismus in Deutschland und Europa bei.", "tags": [], "status": "Online", "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5920", @@ -1039,10 +1039,10 @@ }, { "id": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/", - "title": "Hymer k\u00fcndigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue G\u00fcnstig-Marke f\u00fcr Camper", + "title": "Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper", "date": "Mon, 24 Mar 2025 11:48:00 +0100", - "summary": "

Corigon ist der Name der neuesten Marke der Erwin-Hymer-Group (EHG). Mit dem Chef der EHG hat promobil bereits dar\u00fcber gesprochen.

", - "text": "Corigon ist der Name der neuesten Marke der Erwin-Hymer-Group (EHG). Mit dem Chef der EHG hat promobil bereits dar\u00fcber gesprochen.", + "summary": "

Corigon ist der Name der neuesten Marke der Erwin-Hymer-Group (EHG). Mit dem Chef der EHG hat promobil bereits darüber gesprochen.

", + "text": "Corigon ist der Name der neuesten Marke der Erwin-Hymer-Group (EHG). Mit dem Chef der EHG hat promobil bereits darüber gesprochen.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/", @@ -1084,8 +1084,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" }, @@ -1140,22 +1140,22 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2216768.jpg", - "alt": "B\u00fcrster Papillon Rendering", - "caption": "B\u00fcrster Papillon Rendering", + "alt": "Bürster Papillon Rendering", + "caption": "Bürster Papillon Rendering", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2215467.jpg", - "alt": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", - "caption": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", + "alt": "Giottiline Siena 396 Wohnmobil für Familien mit Kinderzimmer", + "caption": "Giottiline Siena 396 Wohnmobil für Familien mit Kinderzimmer", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2215384.jpg", - "alt": "Giottiline, Wohnmobil, Siena 485, Alkoven, f\u00fcnf Personen, Familien", - "caption": "Giottiline, Wohnmobil, Siena 485, Alkoven, f\u00fcnf Personen, Familien", + "alt": "Giottiline, Wohnmobil, Siena 485, Alkoven, fünf Personen, Familien", + "caption": "Giottiline, Wohnmobil, Siena 485, Alkoven, fünf Personen, Familien", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/" }, @@ -1213,10 +1213,10 @@ }, { "id": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/", - "title": "Die besten Camper-Innovationen 2025: \u201eFrosch\u201c ist das genialste neue Camping-Zubeh\u00f6r", + "title": "Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör", "date": "Tue, 18 Mar 2025 06:00:00 +0100", - "summary": "

Das sind die besten Neuerfindungen auf dem Gebiet Camping-Zubeh\u00f6r 2025: Tolle Produkte f\u00fcr Ihr n\u00e4chstes Camping-Abenteuer.

", - "text": "Das sind die besten Neuerfindungen auf dem Gebiet Camping-Zubeh\u00f6r 2025: Tolle Produkte f\u00fcr Ihr n\u00e4chstes Camping-Abenteuer.", + "summary": "

Das sind die besten Neuerfindungen auf dem Gebiet Camping-Zubehör 2025: Tolle Produkte für Ihr nächstes Camping-Abenteuer.

", + "text": "Das sind die besten Neuerfindungen auf dem Gebiet Camping-Zubehör 2025: Tolle Produkte für Ihr nächstes Camping-Abenteuer.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/", @@ -1244,8 +1244,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/" }, @@ -1373,10 +1373,10 @@ }, { "id": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/", - "title": "CARAVANING Jahrgangs Archiv 2024: CARAVANING f\u00fcrs Archiv", + "title": "CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv", "date": "Wed, 15 Jan 2025 08:34:00 +0100", - "summary": "

Artikel f\u00fcr Artikel jetzt ganz einfach durchforsten: Mit den Jahrgangs-PDF-Archiven ist das m\u00f6glich. In den Archiven befinden sich alle zw\u00f6lf CARAVANING-Ausgaben des jeweiligen Jahres.

", - "text": "Artikel f\u00fcr Artikel jetzt ganz einfach durchforsten: Mit den Jahrgangs-PDF-Archiven ist das m\u00f6glich. In den Archiven befinden sich alle zw\u00f6lf CARAVANING-Ausgaben des jeweiligen Jahres.", + "summary": "

Artikel für Artikel jetzt ganz einfach durchforsten: Mit den Jahrgangs-PDF-Archiven ist das möglich. In den Archiven befinden sich alle zwölf CARAVANING-Ausgaben des jeweiligen Jahres.

", + "text": "Artikel für Artikel jetzt ganz einfach durchforsten: Mit den Jahrgangs-PDF-Archiven ist das möglich. In den Archiven befinden sich alle zwölf CARAVANING-Ausgaben des jeweiligen Jahres.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/", @@ -1397,15 +1397,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1665061.jpg", - "alt": "CARAVANING f\u00fcrs Archiv", - "caption": "CARAVANING f\u00fcrs Archiv", + "alt": "CARAVANING fürs Archiv", + "caption": "CARAVANING fürs Archiv", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/" }, @@ -1515,8 +1515,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/top-10-clever-campen-videos-2024/" }, @@ -1595,10 +1595,10 @@ }, { "id": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/", - "title": "Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die hei\u00dfesten Wohnmobile 2004", + "title": "Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004", "date": "Tue, 31 Dec 2024 06:00:00 +0100", - "summary": "

Vom Carthago M-Liner bis zum Esterel Integrierten \u2013 der promobil-R\u00fcckblick auf die Highlights des Jahres 2004.

", - "text": "Vom Carthago M-Liner bis zum Esterel Integrierten \u2013 der promobil-R\u00fcckblick auf die Highlights des Jahres 2004.", + "summary": "

Vom Carthago M-Liner bis zum Esterel Integrierten – der promobil-Rückblick auf die Highlights des Jahres 2004.

", + "text": "Vom Carthago M-Liner bis zum Esterel Integrierten – der promobil-Rückblick auf die Highlights des Jahres 2004.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/", @@ -1612,99 +1612,99 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2167835.jpg", - "alt": "Au\u00dfenansicht, Carthago", - "caption": "Au\u00dfenansicht, Carthago", + "alt": "Außenansicht, Carthago", + "caption": "Außenansicht, Carthago", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167835.jpg", - "alt": "Au\u00dfenansicht, Carthago", - "caption": "Au\u00dfenansicht, Carthago", + "alt": "Außenansicht, Carthago", + "caption": "Außenansicht, Carthago", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167837.jpg", - "alt": "Au\u00dfenansicht, Esterel", - "caption": "Au\u00dfenansicht, Esterel", + "alt": "Außenansicht, Esterel", + "caption": "Außenansicht, Esterel", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167838.jpg", - "alt": "Au\u00dfenansicht, Dethleffs Esprit I 7410", - "caption": "Au\u00dfenansicht, Dethleffs Esprit I 7410", + "alt": "Außenansicht, Dethleffs Esprit I 7410", + "caption": "Außenansicht, Dethleffs Esprit I 7410", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167840.jpg", - "alt": "Au\u00dfenansicht, Carthago", - "caption": "Au\u00dfenansicht, Carthago", + "alt": "Außenansicht, Carthago", + "caption": "Außenansicht, Carthago", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167842.jpg", - "alt": "Au\u00dfenansicht, Flair", - "caption": "Au\u00dfenansicht, Flair", + "alt": "Außenansicht, Flair", + "caption": "Außenansicht, Flair", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167844.jpg", - "alt": "Au\u00dfenansicht, Dethleffs Advantage A 6771", - "caption": "Au\u00dfenansicht, Dethleffs Advantage A 6771", + "alt": "Außenansicht, Dethleffs Advantage A 6771", + "caption": "Außenansicht, Dethleffs Advantage A 6771", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167846.jpg", - "alt": "Au\u00dfenansicht, TEC Rotec", - "caption": "Au\u00dfenansicht, TEC Rotec", + "alt": "Außenansicht, TEC Rotec", + "caption": "Außenansicht, TEC Rotec", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167848.jpg", - "alt": "Au\u00dfenansicht, Cariva-Alkoven E35.22", - "caption": "Au\u00dfenansicht, Cariva-Alkoven E35.22", + "alt": "Außenansicht, Cariva-Alkoven E35.22", + "caption": "Außenansicht, Cariva-Alkoven E35.22", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167850.jpg", - "alt": "Au\u00dfenansicht, Hymertramp 655", - "caption": "Au\u00dfenansicht, Hymertramp 655", + "alt": "Außenansicht, Hymertramp 655", + "caption": "Außenansicht, Hymertramp 655", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167852.jpg", - "alt": "Au\u00dfenansicht, I-TEC 6300 G", - "caption": "Au\u00dfenansicht, I-TEC 6300 G", + "alt": "Außenansicht, I-TEC 6300 G", + "caption": "Außenansicht, I-TEC 6300 G", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167854.jpg", - "alt": "Au\u00dfenraum, B\u00fcrstner Delfin Performance", - "caption": "Au\u00dfenraum, B\u00fcrstner Delfin Performance", + "alt": "Außenraum, Bürstner Delfin Performance", + "caption": "Außenraum, Bürstner Delfin Performance", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2167856.jpg", - "alt": "Au\u00dfenansicht, Silverdream", - "caption": "Au\u00dfenansicht, Silverdream", + "alt": "Außenansicht, Silverdream", + "caption": "Außenansicht, Silverdream", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/" }, @@ -1783,10 +1783,10 @@ }, { "id": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/", - "title": "Gaswarner im Wohnmobil: So sch\u00fctze Sie sich vor unsichtbaren Gasen", + "title": "Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen", "date": "Tue, 26 Nov 2024 12:00:00 +0100", - "summary": "

Im Falle eines Falles k\u00f6nnen sie Leben retten: Gaswarner. Gef\u00e4hrlich werden k\u00f6nnen mehrere ganz unterschiedliche Gasarten im Reisemobil. Promobil erkl\u00e4rt, welche das sind und wie Sie sich vor ihnen sch\u00fctzen.

", - "text": "Gaswarner im Wohnmobil: So sch\u00fctze Sie sich vor unsichtbaren Gasen\n\nGaswarner sind lebensrettende Ger\u00e4te, insbesondere bei der Verwendung in Reisemobilen, da sie verschiedene gef\u00e4hrliche Gasarten erkennen k\u00f6nnen. Promobil bietet wertvolle Informationen dar\u00fcber, welche Gasarten gef\u00e4hrlich sein k\u00f6nnen und wie man sich vor diesen sch\u00fctzen kann.", + "summary": "

Im Falle eines Falles können sie Leben retten: Gaswarner. Gefährlich werden können mehrere ganz unterschiedliche Gasarten im Reisemobil. Promobil erklärt, welche das sind und wie Sie sich vor ihnen schützen.

", + "text": "Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen\n\nGaswarner sind lebensrettende Geräte, insbesondere bei der Verwendung in Reisemobilen, da sie verschiedene gefährliche Gasarten erkennen können. Promobil bietet wertvolle Informationen darüber, welche Gasarten gefährlich sein können und wie man sich vor diesen schützen kann.", "tags": [ "Gaswarner", "Reisemobilsicherheit", @@ -1902,8 +1902,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" }, @@ -1944,15 +1944,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2178259.jpg", - "alt": "Absorberk\u00fchlschrank, Carado T 471", - "caption": "Absorberk\u00fchlschrank, Carado T 471", + "alt": "Absorberkühlschrank, Carado T 471", + "caption": "Absorberkühlschrank, Carado T 471", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1840128.jpg", - "alt": "Sicherheitszubeh\u00f6r - Einbruchs und Diebstahlschutz", - "caption": "Sicherheitszubeh\u00f6r - Einbruchs und Diebstahlschutz", + "alt": "Sicherheitszubehör - Einbruchs und Diebstahlschutz", + "caption": "Sicherheitszubehör - Einbruchs und Diebstahlschutz", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/" }, @@ -2033,8 +2033,8 @@ "id": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/", "title": "Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo", "date": "Tue, 15 Oct 2024 16:00:00 +0200", - "summary": "

Der nur 4,40 Meter lange kompakte Minicamper von Freizeitmobile Kliem auf Basis des Fiat Doblo bietet eine flexible L\u00f6sung f\u00fcr Alltag und Reisen.

", - "text": "Der nur 4,40 Meter lange kompakte Minicamper von Freizeitmobile Kliem auf Basis des Fiat Doblo bietet eine flexible L\u00f6sung f\u00fcr Alltag und Reisen.", + "summary": "

Der nur 4,40 Meter lange kompakte Minicamper von Freizeitmobile Kliem auf Basis des Fiat Doblo bietet eine flexible Lösung für Alltag und Reisen.

", + "text": "Der nur 4,40 Meter lange kompakte Minicamper von Freizeitmobile Kliem auf Basis des Fiat Doblo bietet eine flexible Lösung für Alltag und Reisen.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/", @@ -2069,8 +2069,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/" }, @@ -2149,10 +2149,10 @@ }, { "id": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/", - "title": "Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper f\u00fcr Ironman-Rekord", + "title": "Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord", "date": "Wed, 04 Sep 2024 13:55:57 +0200", - "summary": "

Am 5. September war es so weit: 120 Langdistanz-Triathlons nacheinander. Extrem-Triathlet Jonas Deichmann macht sein Versprechen wahr und pulverisiert den bisherigen Weltrekord. Vom ersten Tag an half ihm ein Wohnmobil von Rocket Camper, diese t\u00e4gliche Leistung zu meistern. Wir schauen mal rein und kl\u00e4ren, f\u00fcr was er das \u00fcberhaupt braucht.\u00a0

", - "text": "Am 5. September war es so weit: 120 Langdistanz-Triathlons nacheinander. Extrem-Triathlet Jonas Deichmann macht sein Versprechen wahr und pulverisiert den bisherigen Weltrekord. Vom ersten Tag an half ihm ein Wohnmobil von Rocket Camper, diese t\u00e4gliche Leistung zu meistern. Wir schauen mal rein und kl\u00e4ren, f\u00fcr was er das \u00fcberhaupt braucht.", + "summary": "

Am 5. September war es so weit: 120 Langdistanz-Triathlons nacheinander. Extrem-Triathlet Jonas Deichmann macht sein Versprechen wahr und pulverisiert den bisherigen Weltrekord. Vom ersten Tag an half ihm ein Wohnmobil von Rocket Camper, diese tägliche Leistung zu meistern. Wir schauen mal rein und klären, für was er das überhaupt braucht. 

", + "text": "Am 5. September war es so weit: 120 Langdistanz-Triathlons nacheinander. Extrem-Triathlet Jonas Deichmann macht sein Versprechen wahr und pulverisiert den bisherigen Weltrekord. Vom ersten Tag an half ihm ein Wohnmobil von Rocket Camper, diese tägliche Leistung zu meistern. Wir schauen mal rein und klären, für was er das überhaupt braucht.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/", @@ -2173,8 +2173,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2138096.jpg", - "alt": "Rocket Camper, Au\u00dfenansicht", - "caption": "Rocket Camper, Au\u00dfenansicht", + "alt": "Rocket Camper, Außenansicht", + "caption": "Rocket Camper, Außenansicht", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" }, @@ -2201,8 +2201,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" }, @@ -2243,29 +2243,29 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2219557.jpg", - "alt": "Dreamer D 43 Up, Au\u00dfenaufnahme", - "caption": "Dreamer D 43 Up, Au\u00dfenaufnahme", + "alt": "Dreamer D 43 Up, Außenaufnahme", + "caption": "Dreamer D 43 Up, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2219246.jpg", - "alt": "Livingstone Go, Innen, Frau, K\u00fchlschrank", - "caption": "Livingstone Go, Innen, Frau, K\u00fchlschrank", + "alt": "Livingstone Go, Innen, Frau, Kühlschrank", + "caption": "Livingstone Go, Innen, Frau, Kühlschrank", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2218304.jpg", - "alt": "Forster Livin' Up Pro 599 (2026), Au\u00dfenaufnahme, Frau, Campingbus, Halle", - "caption": "Forster Livin' Up Pro 599 (2026), Au\u00dfenaufnahme, Frau, Campingbus, Halle", + "alt": "Forster Livin' Up Pro 599 (2026), Außenaufnahme, Frau, Campingbus, Halle", + "caption": "Forster Livin' Up Pro 599 (2026), Außenaufnahme, Frau, Campingbus, Halle", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/rocket-ryzon-campingbus-von-extrem-sportler-jonas-deichmann/" }, @@ -2330,10 +2330,10 @@ }, { "id": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/", - "title": "E-Trailer f\u00fcr die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome", + "title": "E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome", "date": "Sat, 06 Jul 2024 12:00:00 +0200", - "summary": "

Wer sein Kontrollboard modernisieren m\u00f6chte, hat mit dem E-Trailer-System die M\u00f6glichkeit, Schritt f\u00fcr Schritt ins digitale Zeitalter zu wechseln.

", - "text": "Wer sein Kontrollboard modernisieren m\u00f6chte, hat mit dem E-Trailer-System die M\u00f6glichkeit, Schritt f\u00fcr Schritt ins digitale Zeitalter zu wechseln.", + "summary": "

Wer sein Kontrollboard modernisieren möchte, hat mit dem E-Trailer-System die Möglichkeit, Schritt für Schritt ins digitale Zeitalter zu wechseln.

", + "text": "Wer sein Kontrollboard modernisieren möchte, hat mit dem E-Trailer-System die Möglichkeit, Schritt für Schritt ins digitale Zeitalter zu wechseln.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/", @@ -2368,15 +2368,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2105848.jpg", - "alt": "E-Trailer System, Temperaturf\u00fchler", - "caption": "E-Trailer System, Temperaturf\u00fchler", + "alt": "E-Trailer System, Temperaturfühler", + "caption": "E-Trailer System, Temperaturfühler", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/" }, @@ -2455,10 +2455,10 @@ }, { "id": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/", - "title": "Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fu\u00dfball-EM", + "title": "Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM", "date": "Sun, 14 Apr 2024 18:00:00 +0200", - "summary": "

Neben Berlin ist Leipzig der einzige ostdeutsche EM-Gastgeber. Mit der Hauptstadt mithalten kann Sachsens bev\u00f6lkerungsreichste Stadt durchaus. Und das liegt nicht nur am Fu\u00dfball-Verein.

", - "text": "Neben Berlin ist Leipzig der einzige ostdeutsche EM-Gastgeber. Mit der Hauptstadt mithalten kann Sachsens bev\u00f6lkerungsreichste Stadt durchaus. Und das liegt nicht nur am Fu\u00dfball-Verein.", + "summary": "

Neben Berlin ist Leipzig der einzige ostdeutsche EM-Gastgeber. Mit der Hauptstadt mithalten kann Sachsens bevölkerungsreichste Stadt durchaus. Und das liegt nicht nur am Fußball-Verein.

", + "text": "Neben Berlin ist Leipzig der einzige ostdeutsche EM-Gastgeber. Mit der Hauptstadt mithalten kann Sachsens bevölkerungsreichste Stadt durchaus. Und das liegt nicht nur am Fußball-Verein.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/", @@ -2521,8 +2521,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/" }, @@ -2603,8 +2603,8 @@ "id": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/", "title": "Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft?", "date": "Sun, 17 Dec 2023 17:50:00 +0100", - "summary": "

Westfalia produziert an zwei deutschen Standorten Campingbusse: am Stammsitz in Rheda-Wiedenbr\u00fcck Modelle f\u00fcr Automarken wie Mercedes und Ford, in Gotha eigene Fahrzeuge der Marke Westfalia.

", - "text": "Westfalia produziert an zwei deutschen Standorten Campingbusse: am Stammsitz in Rheda-Wiedenbr\u00fcck Modelle f\u00fcr Automarken wie Mercedes und Ford, in Gotha eigene Fahrzeuge der Marke Westfalia.", + "summary": "

Westfalia produziert an zwei deutschen Standorten Campingbusse: am Stammsitz in Rheda-Wiedenbrück Modelle für Automarken wie Mercedes und Ford, in Gotha eigene Fahrzeuge der Marke Westfalia.

", + "text": "Westfalia produziert an zwei deutschen Standorten Campingbusse: am Stammsitz in Rheda-Wiedenbrück Modelle für Automarken wie Mercedes und Ford, in Gotha eigene Fahrzeuge der Marke Westfalia.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/", @@ -2625,8 +2625,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/can-kasim-dogan-interview-westfalia/" }, @@ -2705,10 +2705,10 @@ }, { "id": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/", - "title": "Top-Fortbewegungsmittel f\u00fcr Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil?", + "title": "Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil?", "date": "Sun, 26 Nov 2023 16:00:00 +0100", - "summary": "

Bevorzugtes Fortbewegungsmittel der promobil-Lesenden ist das Fahrrad \u2013 mit oder ohne elektrischen Antrieb. Ist das bei Ihnen auch so?

", - "text": "Bevorzugtes Fortbewegungsmittel der promobil-Lesenden ist das Fahrrad \u2013 mit oder ohne elektrischen Antrieb. Ist das bei Ihnen auch so?", + "summary": "

Bevorzugtes Fortbewegungsmittel der promobil-Lesenden ist das Fahrrad – mit oder ohne elektrischen Antrieb. Ist das bei Ihnen auch so?

", + "text": "Bevorzugtes Fortbewegungsmittel der promobil-Lesenden ist das Fahrrad – mit oder ohne elektrischen Antrieb. Ist das bei Ihnen auch so?", "tags": [], "status": "Trash", "link": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/", @@ -2722,29 +2722,29 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2053714.jpg", - "alt": "Lesermeinung Thema Mobilit\u00e4t", - "caption": "Lesermeinung Thema Mobilit\u00e4t", + "alt": "Lesermeinung Thema Mobilität", + "caption": "Lesermeinung Thema Mobilität", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2053716.jpg", - "alt": "Lesermeinung Thema Mobilit\u00e4t - Elke", - "caption": "Lesermeinung Thema Mobilit\u00e4t - Elke", + "alt": "Lesermeinung Thema Mobilität - Elke", + "caption": "Lesermeinung Thema Mobilität - Elke", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2053715.jpg", - "alt": "Lesermeinung Thema Mobilit\u00e4t - J\u00fcrgen", - "caption": "Lesermeinung Thema Mobilit\u00e4t - J\u00fcrgen", + "alt": "Lesermeinung Thema Mobilität - Jürgen", + "caption": "Lesermeinung Thema Mobilität - Jürgen", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" }, @@ -2799,15 +2799,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1555475.jpg", - "alt": "Hagelsch\u00e4den am Wohnmobil", - "caption": "Hagelsch\u00e4den am Wohnmobil", + "alt": "Hagelschäden am Wohnmobil", + "caption": "Hagelschäden am Wohnmobil", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2153790.jpg", - "alt": "Sanit\u00e4r-Autarkie - Frischwasser", - "caption": "Sanit\u00e4r-Autarkie - Frischwasser", + "alt": "Sanitär-Autarkie - Frischwasser", + "caption": "Sanitär-Autarkie - Frischwasser", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" }, @@ -2820,8 +2820,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2147777.jpg", - "alt": "Adria Super Twin etnh\u00fcllung auf der Messe", - "caption": "Adria Super Twin etnh\u00fcllung auf der Messe", + "alt": "Adria Super Twin etnhüllung auf der Messe", + "caption": "Adria Super Twin etnhüllung auf der Messe", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/" }, @@ -2872,10 +2872,10 @@ }, { "id": "https://www.promobil.de/spielorte-em-2024-frankfurt/", - "title": "Camping-Tipps f\u00fcr EM-Spielorte 2024 : Frankfurt f\u00fcr Fu\u00dfball-Fans im Wohnmobil", + "title": "Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil", "date": "Mon, 06 Nov 2023 09:00:00 +0100", - "summary": "

Im kommenden Sommer ist die Mainmetropole Frankfurt einer von zehn Gastgebern bei der Fu\u00dfball-EM der M\u00e4nner. Dort findet am 23. Juni 2024 das dritte Vorrundenspiel der DFB-Elf statt.

", - "text": "Im kommenden Sommer ist die Mainmetropole Frankfurt einer von zehn Gastgebern bei der Fu\u00dfball-EM der M\u00e4nner. Dort findet am 23. Juni 2024 das dritte Vorrundenspiel der DFB-Elf statt.", + "summary": "

Im kommenden Sommer ist die Mainmetropole Frankfurt einer von zehn Gastgebern bei der Fußball-EM der Männer. Dort findet am 23. Juni 2024 das dritte Vorrundenspiel der DFB-Elf statt.

", + "text": "Im kommenden Sommer ist die Mainmetropole Frankfurt einer von zehn Gastgebern bei der Fußball-EM der Männer. Dort findet am 23. Juni 2024 das dritte Vorrundenspiel der DFB-Elf statt.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/spielorte-em-2024-frankfurt/", @@ -2896,15 +2896,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2050074.jpg", - "alt": "Altstadt, Stra\u00dfencafe, Friedrich Stoltze Brunnen", - "caption": "Altstadt, Stra\u00dfencafe, Friedrich Stoltze Brunnen", + "alt": "Altstadt, Straßencafe, Friedrich Stoltze Brunnen", + "caption": "Altstadt, Straßencafe, Friedrich Stoltze Brunnen", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2050076.jpg", - "alt": "Brot, K\u00e4se, Zwiebeln, Bembel, Hessen, Apfelwein", - "caption": "Brot, K\u00e4se, Zwiebeln, Bembel, Hessen, Apfelwein", + "alt": "Brot, Käse, Zwiebeln, Bembel, Hessen, Apfelwein", + "caption": "Brot, Käse, Zwiebeln, Bembel, Hessen, Apfelwein", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" }, @@ -2931,8 +2931,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/spielorte-em-2024-frankfurt/" }, @@ -3011,10 +3011,10 @@ }, { "id": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/", - "title": "Spielorte und Stellpl\u00e4tze zur Fu\u00dfball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart", + "title": "Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart", "date": "Fri, 13 Oct 2023 09:00:00 +0200", - "summary": "

Wegen seiner topographischen Lage wird Stuttgart gerne als \"Kessel\" bezeichnet. Wer zur Fu\u00dfball-EM in die Stadt reist, darf sich auf ein vielf\u00e4ltiges Kultur- und Freizeitangebot freuen.

", - "text": "Wegen seiner topographischen Lage wird Stuttgart gerne als \"Kessel\" bezeichnet. Wer zur Fu\u00dfball-EM in die Stadt reist, darf sich auf ein vielf\u00e4ltiges Kultur- und Freizeitangebot freuen.", + "summary": "

Wegen seiner topographischen Lage wird Stuttgart gerne als \"Kessel\" bezeichnet. Wer zur Fußball-EM in die Stadt reist, darf sich auf ein vielfältiges Kultur- und Freizeitangebot freuen.

", + "text": "Wegen seiner topographischen Lage wird Stuttgart gerne als \"Kessel\" bezeichnet. Wer zur Fußball-EM in die Stadt reist, darf sich auf ein vielfältiges Kultur- und Freizeitangebot freuen.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/", @@ -3042,8 +3042,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2037927.jpg", - "alt": "Stuttgart, S\u00fcd, Kessel,Fernsehturm, Panorama", - "caption": "Stuttgart, S\u00fcd, Kessel,Fernsehturm, Panorama", + "alt": "Stuttgart, Süd, Kessel,Fernsehturm, Panorama", + "caption": "Stuttgart, Süd, Kessel,Fernsehturm, Panorama", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" }, @@ -3063,15 +3063,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2037928.jpg", - "alt": "Fu\u00df\u00dfball, Fans, Vfb Stuttgart, MHP Arena", - "caption": "Fu\u00df\u00dfball, Fans, Vfb Stuttgart, MHP Arena", + "alt": "Fußßball, Fans, Vfb Stuttgart, MHP Arena", + "caption": "Fußßball, Fans, Vfb Stuttgart, MHP Arena", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/" }, @@ -3150,10 +3150,10 @@ }, { "id": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/", - "title": "Professor f\u00fcr Tourismus-Management im Interview: Armin Brysch spricht \u00fcber virtuelle Reisen", + "title": "Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen", "date": "Mon, 18 Sep 2023 09:00:00 +0200", - "summary": "

Armin Brysch, Professor f\u00fcr Tourismus-Management an der Hochschule Kempten, spricht mit promobil \u00fcber das Reisen der Zukunft. Werden virtuelle Reisen die echten ersetzen?

", - "text": "Armin Brysch, Professor f\u00fcr Tourismus-Management an der Hochschule Kempten, spricht mit promobil \u00fcber das Reisen der Zukunft. Werden virtuelle Reisen die echten ersetzen?", + "summary": "

Armin Brysch, Professor für Tourismus-Management an der Hochschule Kempten, spricht mit promobil über das Reisen der Zukunft. Werden virtuelle Reisen die echten ersetzen?

", + "text": "Armin Brysch, Professor für Tourismus-Management an der Hochschule Kempten, spricht mit promobil über das Reisen der Zukunft. Werden virtuelle Reisen die echten ersetzen?", "tags": [], "status": "Trash", "link": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/", @@ -3174,8 +3174,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/" }, @@ -3254,10 +3254,10 @@ }, { "id": "https://www.promobil.de/termine-veranstaltungen-juni-juli/", - "title": "Vanlife-Events im Juni bis November 2025: Events f\u00fcr Bulli-Lover und Campervan-Fans", + "title": "Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans", "date": "Fri, 06 Jun 2025 12:00:00 +0200", - "summary": "

Endlich wieder Zeit f\u00fcr Bulli-Treffen & Co! Entdecken Sie die besten Festivals und Events f\u00fcr Camper, Vanlife-Fans und Outdoor-Abenteurer in 2025.

", - "text": "Vanlife- und Bus-Treffen 2025: Events f\u00fcr Bulli-Lover und Campervan-Fans + Messen Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt Vanlife- und Bus-Treffen 2025: Events f\u00fcr Bulli-Lover und Campervan-Fans + Messen Vanlife-Events im Juni bis November 2025 : Events f\u00fcr Bulli-Lover und Campervan-Fans Endlich wieder Zeit f\u00fcr Bulli-Treffen & Co! Entdecken Sie die besten Festivals und Events f\u00fcr Camper, Vanlife-Fans und Outdoor-Abenteurer in 2025. Timo Gro\u00dfhans Ver\u00f6ffentlicht am 06.06.2025 Foto: Heiko p. Wacker 5 Bilder Nach einem langen Winter kommen nun endlich wieder die gro\u00dfen Treffen und Festivals \u2013 und wer das Abenteuer auf vier R\u00e4dern liebt, sollte sich die folgenden Events keinesfalls entgehen lassen. Ob Bulli-Festival, Offroad-Messe oder Vanlife-Treffen: In den kommenden Monaten stehen zahlreiche spannende Veranstaltungen f\u00fcr Camper, Vanlife-Enthusiasten und Outdoor-Fans auf dem Programm. Hier sind die wichtigsten Termine, die das Jahr 2025 zu einem unvergesslichen Erlebnis machen werden. Juni 2025 Midsummer Bulli Festival Datum: 19.\u201322. Juni 2025 Ort: Fehmarn Beschreibung: Deutschlands gr\u00f6\u00dftes Bullifestival direkt am Meer mit Show & Shine, Beachcamp und Live-Musik. Website: https://www.midsummerfestival.de Abenteuer & Allrad Datum: 19.\u201322. Juni 2025 Ort: Bad Kissingen Beschreibung: Europas gr\u00f6\u00dfte Offroad- und Overlanding-Messe mit \u00fcber 350 Ausstellern. Website: https://www.abenteuer-allrad.de Queer Summer Camp Datum: 19.\u201322. Juni 2025 Ort: Simmerath, Eifel Beschreibung: Ein queeres Campingerlebnis mit Community-Feeling am Rursee. Website: https://www.queer-summer-camp.de Juli 2025 California Festival Mimizan Datum: 4.\u20136. Juli 2025 Ort: Mimizan, Frankreich Beschreibung: Ein entspanntes Treffen f\u00fcr Bulli- und Vanlife-Enthusiasten an der franz\u00f6sischen Atlantikk\u00fcste mit Musik und Strandaktivit\u00e4ten. Website: Infos pratiques californiafestival.fr Kastenwagentreffen Datum: 4.\u20136. Juli 2025 Ort: Bad D\u00fcrrheim Beschreibung: Ein Treffen f\u00fcr alle Kastenwagen-Fans mit Fokus auf Gemeinschaft und Erfahrungsaustausch. Website: https://www.kastenwagentreffen.de Caravan & Vanlife Meetup Datum: 11.\u201313. Juli 2025 Ort: Stuttgart, B\u00f6blingen Beschreibung: Ein Event f\u00fcr alle Camper mit Vortr\u00e4gen, Offroad-Parcours und Live-Musik. Website: https://www.overlandvanlifefestival.com/ovfstuttgart Adventure Southside Datum: 18.\u201320. Juli 2025 Ort: Friedrichshafen Beschreibung: Outdoor- und Offroad-Messe mit Workshops, Kinderprogramm und Camping-Areal. Website: https://adventuresouthside.com/ Swiss Vanlife Festival Datum: 25.\u201327. Juli 2025 Ort: Yverdon-les-Bains, Schweiz Beschreibung: Vanlife & Outdoor Festival mit Fokus auf Nachhaltigkeit, Camping und Abenteuer. Website: https://www.vanlife.ch Busfestival G\u00f6ppingen Datum: 25.\u201327. Juli 2025 Ort: G\u00f6ppingen Beschreibung: Ein Festival f\u00fcr Busliebhaber mit Musik und Vanlife-Atmosph\u00e4re. Website: https://www.bus-festival.de August 2025 VW Bus Festival Berlin Datum: 14.\u201317. August 2025 Ort: Zossen, Deutschland Beschreibung: Treffen f\u00fcr VW Bus Begeisterte mit vielf\u00e4ltigem Programm und Community-Austausch. Website: www.vwbus-festival.de Vanlife Ferropolis Datum: 21.\u201324. August 2025 Ort: Ferropolis, Gr\u00e4fenhainichen Beschreibung: Ein Festival auf einer Halbinsel mit Workshops, Live-Acts und Strandaktivit\u00e4ten. Website: https://www.vanlife-ferropolis.de September 2025 VW Bus Treffen Hannover Datum: 5.\u20137. September 2025 Ort: Altwarmb\u00fcchener See, Hannover Beschreibung: Traditionelles Bulli-Treffen mit Flohmarkt, Lagerfeuer und Camping. Bullis auf R\u00fcgen Datum: 11. \u2013 14. September 2025 Ort: Altenkirchen. Beschreibung: Das Familien-Bustreffen auf Deutschlands gr\u00f6\u00dfter Insel. Bullis auf R\u00fcgen \u2013 Das Familienbustreffen auf Deutschlands gr\u00f6\u00dfter Insel \u2013 Das Familien-Bustreffen auf Deutschlands gr\u00f6\u00dfter Insel bullisaufruegen.de Bulli Summer Festival Datum: 4.\u20137. September 2025 Ort: Wesel Beschreibung: Ein gro\u00dfes Treffen f\u00fcr Bulli-Fans mit Musik, Foodtrucks und Gemeinschaftsgef\u00fchl. Website: Bulli Summer Festival \u2013 Dein Bulli, Dein Sommer. Busfest Datum: 12.\u201314. September 2025 Ort: Malvern, England Beschreibung: Das weltweit gr\u00f6\u00dfte Treffen der VW-Bus-Freunde mit Show & Shine, Offroad-Wettbewerben und mehr. Website: https://www.busfest.org Adventure Northside Datum: 12.\u201315. September 2025 Ort: Gut Basthorst bei Hamburg Beschreibung: Messe f\u00fcr Offroad- und Vanlife-Enthusiasten mit Ausstellern und Vortr\u00e4gen. Website: adventurenorthside.de Vanlife Treffen Allg\u00e4u Datum: 18.\u201321. September 2025 Ort: Lechbruck am See Beschreibung: Ein Treffen f\u00fcr Vanlife-Fans in malerischer Umgebung mit Workshops und Gemeinschaftsaktivit\u00e4ten. Website: http://www.allgaeu-vans-treffen.de Oktober 2025 Caravan Live Datum: 2.\u20135. Oktober 2025 Ort: Freiburg Beschreibung: Messe f\u00fcr Caravaning und Vanlife mit Ausstellern und Vortr\u00e4gen. Website: https://www.caravanlive.de Caravan Salon Austria Datum: 15.\u201319. Oktober 2025 Ort: Wels, \u00d6sterreich Beschreibung: Internationale Messe f\u00fcr Caravaning und Camping. Website: https://www.caravan-wels.al Suisse Caravan Salon Datum: 23.\u201327. Oktober 2025 Ort: Bern, Schweiz Beschreibung: Schweizer Messe f\u00fcr Caravaning und Vanlife. Website: https://www.suissecaravansalon.ch November 2025 Caravan Bremen Datum: 7.\u201310. November 2025 Ort: Bremen Beschreibung: Messe f\u00fcr Caravaning, Camping und Vanlife in Norddeutschland. Website: https://www.caravan-bremen.de TC Touristik & Caravaning Datum: 19.\u201323. November 2025 Ort: Leipzig Beschreibung: Gro\u00dfe Messe f\u00fcr Touristik, Caravaning und Vanlife mit vielen Ausstellern und Live-Vortr\u00e4gen. Website: https://www.tc-messe.de Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", + "summary": "

Endlich wieder Zeit für Bulli-Treffen & Co! Entdecken Sie die besten Festivals und Events für Camper, Vanlife-Fans und Outdoor-Abenteurer in 2025.

", + "text": "Vanlife- und Bus-Treffen 2025: Events für Bulli-Lover und Campervan-Fans + Messen Abo Hefte Produkte Marken Anmelden Abo Menü Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubehör Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt Vanlife- und Bus-Treffen 2025: Events für Bulli-Lover und Campervan-Fans + Messen Vanlife-Events im Juni bis November 2025 : Events für Bulli-Lover und Campervan-Fans Endlich wieder Zeit für Bulli-Treffen & Co! Entdecken Sie die besten Festivals und Events für Camper, Vanlife-Fans und Outdoor-Abenteurer in 2025. Timo Großhans Veröffentlicht am 06.06.2025 Foto: Heiko p. Wacker 5 Bilder Nach einem langen Winter kommen nun endlich wieder die großen Treffen und Festivals – und wer das Abenteuer auf vier Rädern liebt, sollte sich die folgenden Events keinesfalls entgehen lassen. Ob Bulli-Festival, Offroad-Messe oder Vanlife-Treffen: In den kommenden Monaten stehen zahlreiche spannende Veranstaltungen für Camper, Vanlife-Enthusiasten und Outdoor-Fans auf dem Programm. Hier sind die wichtigsten Termine, die das Jahr 2025 zu einem unvergesslichen Erlebnis machen werden. Juni 2025 Midsummer Bulli Festival Datum: 19.–22. Juni 2025 Ort: Fehmarn Beschreibung: Deutschlands größtes Bullifestival direkt am Meer mit Show & Shine, Beachcamp und Live-Musik. Website: https://www.midsummerfestival.de Abenteuer & Allrad Datum: 19.–22. Juni 2025 Ort: Bad Kissingen Beschreibung: Europas größte Offroad- und Overlanding-Messe mit über 350 Ausstellern. Website: https://www.abenteuer-allrad.de Queer Summer Camp Datum: 19.–22. Juni 2025 Ort: Simmerath, Eifel Beschreibung: Ein queeres Campingerlebnis mit Community-Feeling am Rursee. Website: https://www.queer-summer-camp.de Juli 2025 California Festival Mimizan Datum: 4.–6. Juli 2025 Ort: Mimizan, Frankreich Beschreibung: Ein entspanntes Treffen für Bulli- und Vanlife-Enthusiasten an der französischen Atlantikküste mit Musik und Strandaktivitäten. Website: Infos pratiques californiafestival.fr Kastenwagentreffen Datum: 4.–6. Juli 2025 Ort: Bad Dürrheim Beschreibung: Ein Treffen für alle Kastenwagen-Fans mit Fokus auf Gemeinschaft und Erfahrungsaustausch. Website: https://www.kastenwagentreffen.de Caravan & Vanlife Meetup Datum: 11.–13. Juli 2025 Ort: Stuttgart, Böblingen Beschreibung: Ein Event für alle Camper mit Vorträgen, Offroad-Parcours und Live-Musik. Website: https://www.overlandvanlifefestival.com/ovfstuttgart Adventure Southside Datum: 18.–20. Juli 2025 Ort: Friedrichshafen Beschreibung: Outdoor- und Offroad-Messe mit Workshops, Kinderprogramm und Camping-Areal. Website: https://adventuresouthside.com/ Swiss Vanlife Festival Datum: 25.–27. Juli 2025 Ort: Yverdon-les-Bains, Schweiz Beschreibung: Vanlife & Outdoor Festival mit Fokus auf Nachhaltigkeit, Camping und Abenteuer. Website: https://www.vanlife.ch Busfestival Göppingen Datum: 25.–27. Juli 2025 Ort: Göppingen Beschreibung: Ein Festival für Busliebhaber mit Musik und Vanlife-Atmosphäre. Website: https://www.bus-festival.de August 2025 VW Bus Festival Berlin Datum: 14.–17. August 2025 Ort: Zossen, Deutschland Beschreibung: Treffen für VW Bus Begeisterte mit vielfältigem Programm und Community-Austausch. Website: www.vwbus-festival.de Vanlife Ferropolis Datum: 21.–24. August 2025 Ort: Ferropolis, Gräfenhainichen Beschreibung: Ein Festival auf einer Halbinsel mit Workshops, Live-Acts und Strandaktivitäten. Website: https://www.vanlife-ferropolis.de September 2025 VW Bus Treffen Hannover Datum: 5.–7. September 2025 Ort: Altwarmbüchener See, Hannover Beschreibung: Traditionelles Bulli-Treffen mit Flohmarkt, Lagerfeuer und Camping. Bullis auf Rügen Datum: 11. – 14. September 2025 Ort: Altenkirchen. Beschreibung: Das Familien-Bustreffen auf Deutschlands größter Insel. Bullis auf Rügen – Das Familienbustreffen auf Deutschlands größter Insel – Das Familien-Bustreffen auf Deutschlands größter Insel bullisaufruegen.de Bulli Summer Festival Datum: 4.–7. September 2025 Ort: Wesel Beschreibung: Ein großes Treffen für Bulli-Fans mit Musik, Foodtrucks und Gemeinschaftsgefühl. Website: Bulli Summer Festival – Dein Bulli, Dein Sommer. Busfest Datum: 12.–14. September 2025 Ort: Malvern, England Beschreibung: Das weltweit größte Treffen der VW-Bus-Freunde mit Show & Shine, Offroad-Wettbewerben und mehr. Website: https://www.busfest.org Adventure Northside Datum: 12.–15. September 2025 Ort: Gut Basthorst bei Hamburg Beschreibung: Messe für Offroad- und Vanlife-Enthusiasten mit Ausstellern und Vorträgen. Website: adventurenorthside.de Vanlife Treffen Allgäu Datum: 18.–21. September 2025 Ort: Lechbruck am See Beschreibung: Ein Treffen für Vanlife-Fans in malerischer Umgebung mit Workshops und Gemeinschaftsaktivitäten. Website: http://www.allgaeu-vans-treffen.de Oktober 2025 Caravan Live Datum: 2.–5. Oktober 2025 Ort: Freiburg Beschreibung: Messe für Caravaning und Vanlife mit Ausstellern und Vorträgen. Website: https://www.caravanlive.de Caravan Salon Austria Datum: 15.–19. Oktober 2025 Ort: Wels, Österreich Beschreibung: Internationale Messe für Caravaning und Camping. Website: https://www.caravan-wels.al Suisse Caravan Salon Datum: 23.–27. Oktober 2025 Ort: Bern, Schweiz Beschreibung: Schweizer Messe für Caravaning und Vanlife. Website: https://www.suissecaravansalon.ch November 2025 Caravan Bremen Datum: 7.–10. November 2025 Ort: Bremen Beschreibung: Messe für Caravaning, Camping und Vanlife in Norddeutschland. Website: https://www.caravan-bremen.de TC Touristik & Caravaning Datum: 19.–23. November 2025 Ort: Leipzig Beschreibung: Große Messe für Touristik, Caravaning und Vanlife mit vielen Ausstellern und Live-Vorträgen. Website: https://www.tc-messe.de Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn – Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf Rädern oder nur ein schönes Wort? 5 Amazon Prime Day 2025 für Camper Camping-Zubehör stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellplätze, Zubehör und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserklärung Impressum Pur-Abo hier kündigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print © 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", "tags": [], "status": "Trash", "link": "https://www.promobil.de/termine-veranstaltungen-juni-juli/", @@ -3278,8 +3278,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/termine-veranstaltungen-juni-juli/" }, @@ -3358,10 +3358,10 @@ }, { "id": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/", - "title": "Schutz vor Einbruch und Diebstahl f\u00fcrs Wohnmobil: Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl?", + "title": "Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl?", "date": "Wed, 21 May 2025 11:00:00 +0200", - "summary": "

Einen Kriminalfall beim Camping? Braucht man nur in der Urlaubslekt\u00fcre. Wir zeigen nachr\u00fcstbare Ausr\u00fcstung, die Einbruch und Diebstahl erschwert.

", - "text": "Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl? Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Zubeh\u00f6r Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl? Alles \u00fcber Gasf\u00fcllst\u00e4nde und Co Gas im Wohnmobil Schutz vor Einbruch und Diebstahl f\u00fcrs Wohnmobil : Wie sch\u00fctze ich mein Wohnmobil vor Diebstahl? Einen Kriminalfall beim Camping? Braucht man nur in der Urlaubslekt\u00fcre. Wir zeigen nachr\u00fcstbare Ausr\u00fcstung, die Einbruch und Diebstahl erschwert. Sophia Pfisterer , Ingo K\u00f6cher Ver\u00f6ffentlicht am 21.05.2025 Foto: Fiamma 27 Bilder Der gr\u00f6\u00dfte Albtraum ist, wenn man von einem Ausflug auf den Parkplatz oder Stellplatz zur\u00fcckkommt und das Wohnmobil verschwunden ist oder Diebe das Campingfahrzeug aufgebrochen haben, alles durchw\u00fchlt ist und Wertgegenst\u00e4nde gestohlen sind. Neben dem unguten Gef\u00fchl, dass Fremde in den privaten Bereich eingedrungen sind, dem \u00c4rger \u00fcber die Sch\u00e4den und Verluste, bleibt die Sorge, dass sich dies jederzeit wiederholen k\u00f6nnte. 5 Verhaltens-Tipps zum Schutz vor Diebstahl und Einbruch Eine einfache, technische L\u00f6sung des Problems sind verschiedene Zubeh\u00f6rkomponenten wie Zusatz-Sicherungen, Schl\u00f6sser, Parkkrallen, Verriegelungen, GPS-Trackern und Alarmanlagen. Diese stellen wir weiter unten ausf\u00fchrlich vor. Gleichzeitig k\u00f6nnen einfache Verhaltensregeln das Risiko minimieren, dass im Wohnmobil eingebrochen wird bzw. dass es geklaut wird. Denn: Gelegenheit macht Diebe. Immer abschlie\u00dfen \u2013 auch bei kurzer Abwesenheit: Selbst beim schnellen Br\u00f6tchenholen: T\u00fcren, Fenster und Dachluken verriegeln. Wertgegenst\u00e4nde au\u00dfer Sicht verstauen: Keine Handys, Laptops oder Kameras sichtbar liegen lassen \u2013 Vorh\u00e4nge oder Sichtschutz nutzen. Stellplatz mit Bedacht w\u00e4hlen: Bevorzugt auf offiziellen Campingpl\u00e4tzen oder gut beleuchteten, belebten Stellfl\u00e4chen \u00fcbernachten. Nachbarschaftliche Aufmerksamkeit : Kontakt zu Nachbarn am Stellplatz halten \u2013 gegenseitiges Beobachten erh\u00f6ht die Sicherheit. Fahrzeugpapiere separat und sicher aufbewahren : Niemals die Zulassungsbescheinigung Teil I (Fahrzeugschein) im Wohnmobil lassen \u2013 sonst wird Diebstahl f\u00fcr Profis noch einfacher. Besser: Im Geldbeutel oder an einem sicheren Ort au\u00dferhalb des Fahrzeugs aufbewahren. Zus\u00e4tzliche Schl\u00f6sser f\u00fcr T\u00fcren und Klappen Um das Aufbrechen des Fahrzeugs von au\u00dfen zu verhindern, lassen sich Fahrerhaus-, Aufbau- und Garagent\u00fcr sowie Serviceklappen von au\u00dfen durch zus\u00e4tzliche Schl\u00f6sser sichern. Entsprechende Systeme bieten unter anderem Fiamma und Thule mit den sogenannten Security-Handgriffen. Die au\u00dfen neben der T\u00fcr montierten B\u00fcgel sind \u00fcber das T\u00fcrblatt schwenk- und verschlie\u00dfbar. Auf diese Weise wird das Aufbrechen der T\u00fcr deutlich erschwert. Praktisch: Im offenen Zustand fungieren die B\u00fcgel als Handlauf und erleichtern das Ein- und Aussteigen. Zus\u00e4tzliche Riegelschl\u00f6sser zur Au\u00dfenmontage haben unter anderem Heosolution mit dem Heosafe Riegelschloss und Thule mit Universal Lock und Door Frame Lock im Programm. Thule Security-Handgriffe sichern die Aufbaut\u00fcr zus\u00e4tzlich. Auch innen im Fahrzeug lassen sich T\u00fcren und Klappen zus\u00e4tzlich sichern. F\u00fcr die Fahrerhaust\u00fcren bietet Fiamma mit Duo-Safe Pro eine Alustange , deren Enden unterhalb des Fensters in den T\u00fcrrahmen gesteckt werden. Die teleskopierbare Stange l\u00e4sst sich von 119 auf 190 Zentimeter verl\u00e4ngern und verhindert das \u00d6ffnen der beiden T\u00fcren. Die gleiche Wirkung erzielt man mit einer Kette, die in am T\u00fcrrahmen montierte Metall\u00f6sen eingeh\u00e4ngt wird. Wiederum von Fiamma ist das Sicherheitsschloss Safe Door Guardian. Der Riegel des komplett aus Aluminium gefertigten Schlosses verriegelt bzw. \u00f6ffnet per Drehbewegung Fahrerhaus-, Aufbau-, Garagent\u00fcren und Serviceklappen von innen. T\u00fcren und Klappen sichern Fiamma Safe Door Magnum , ab 87 Euro [Link auf https://www.awin1.com/cread.php?awinmid=70949&awinaffid=893807&clickref=pro-22102643-sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase&ued=https%3A%2F%2Fwww.fritz-berger.de%2Fartikel%2Ffiamma-einstiegshilfe-buegel-security-und-tuersicherung-1971] Fiamma Einstiegshilfe- und Sicherungsb\u00fcgel Security , Preis ab 123 Euro Fiamma Duo Safe Pro Sicherheitsleiste , Preis ab 69 Euro [Link auf https://www.awin1.com/cread.php?awinmid=70949&awinaffid=893807&clickref=pro-22102643-sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase&ued=https%3A%2F%2Fwww.fritz-berger.de%2Fartikel%2Ffiamma-safe-door-guardian-innerer-sicherheitsblock-266765] Fiamma Safe Door Guardian Sicherheitsblock , Preis ab 77 Euro Heosolution Heosafe Riegelschloss , Preis ab 135 Euro Thule Universal Lock , Preis ab 101 Euro Fenster und Dachhauben verriegeln Spezielle L\u00f6sungen zur Sicherung vorgeh\u00e4ngter Fenster als auch Rahmen- und Schiebefenster bietet Womo-Sicherheit. Das System f\u00fcr Ausstellfenster besteht aus einem Metall-U-Profil, das die Unterkante der Scheibe verst\u00e4rkt. Im Innenraum werden am Fensterrahmen zwei verschlie\u00dfbare Gegenst\u00fccke montiert, die das Fenster rechts und links mit jeweils einer R\u00e4ndelschraube halten. F\u00fcr die Sicherung von Schiebefenstern im Fahrerhaus und Aufbau sowie f\u00fcr Dachluken sind zudem teleskopierbare Stangen im Programm. Benjamin K\u00f6bler-Linsner Fenster und Dachhauben sichern Womo-Sicherheit Ausstell- u. Rahmenfenstersicherung , Preis ab 99 Euro Womo-Sicherheit Dachhaubensicherung , Preis ab 83 Euro Wolfshund Schiebefenstersicherung , Preis ab 159 Euro Safe f\u00fcrs Wohnmobil Wertsachen im Fahrzeug sichert man am besten in einem Tresor . Ein Safe l\u00e4sst sich in Schr\u00e4nken und Staur\u00e4umen, im Doppelboden, als T\u00fcrtresor oder in den Fahrerhaussitzkonsolen einbauen. Tresore in unterschiedlichen Gr\u00f6\u00dfen liefern unter anderem Alko, Mobile-Safe, Milenco und Mobil. Wertsachen, Dokumente sicher lagern Alko Tresor , Preis ab 187 Euro Mobile-Safe Sitzkonsolensafe f\u00fcr Mercedes Sprinter , Preis ab 249Euro Mobile-Safe T\u00fcrsafe f\u00fcr Fiat Ducato , Preis 249 Euro Milenco Sitzsockelsafe f\u00fcr Iveco Daily , Preis ab 199 Euro Mobil-Safe Standard Safe mit Doppelbartschloss , Preis ab 125 Euro Wegfahrschutz f\u00fcrs Wohnmobil Automatische Wegfahrsperren verhindern unbefugtes Starten des Motors, indem sie die Z\u00fcndung oder Kraftstoffzufuhr elektronisch unterbrechen. Sie funktionieren meist \u00fcber einen Transponder-Schl\u00fcssel oder eine codierte Verbindung zwischen Schl\u00fcssel und Steuerger\u00e4t, die nur bei korrekter Erkennung den Motorstart erm\u00f6glicht. Damit sch\u00fctzen sie vor Diebstahl, indem sie den Startvorgang ohne autorisierten Schl\u00fcssel blockieren. F\u00fcr Camper bedeutet das mehr Sicherheit, besonders bei l\u00e4ngeren Standzeiten oder an unbekannten Orten. Ist eine Wegfahrsperre nicht automatisch im Fahrzeug eingebaut, l\u00e4sst sich der Camper mechanisch nachr\u00fcsten. Um das unbefugte Wegfahren des Wohnmobils zu verhindern, leisten Lenkrad-, Pedal- und Radkrallen sowie Pedal- und Ganghebelsperren gute Dienste. Wegfahrschutz Alca AutoSafe Pedal-Sperre , Preis ab 20 Euro Berger Radkralle , Preis ab 30 Euro Milenco BD Loc Pedalsperre f\u00fcr Fiat Ducato und Peugeot Boxer , Preis ab 150 Euro MEM Lenkradkralle f\u00fcr Lkw und Transporter , Preis ab 284 Euro Alarmanlagen und Bewegungsmelder Einbruchschutz bieten auch Alarmanlagen , die, an Fenstern, Dachhauben und T\u00fcren angebracht, bei gewaltsamem Aufhebeln ordentlich L\u00e4rm machen und je nach Modell eine Nachricht an eine angeschlossene Sicherheitszentrale oder das Smartphone senden. Die Ger\u00e4te sind zum Teil mit Bewegungsmelder und Trackingsystem ausgestattet. Solche Systeme bekommt man ab 55 Euro. Anbieter sind unter anderem Bosch, Carbest, Dometic, Milenco und Thitronik. Tipp: Eine abschreckende Wirkung f\u00fcr Gelegenheitsdiebe haben oft auch schon entsprechende Warnaufkleber an den Scheiben. Alarmanlagen und Bewegungsmelder Bosch Spexor , Preis ab 230 Euro Carbest Protect-On Camper 849 f\u00fcr Fiat Ducato , Preis ab 259 Euro Dometic Magic Safe MS 660 , Preis ab 63 Euro Milenco Autoalarm , Preis ab 147 Euro Thitronik Funk-Alarmanlage WiPro III safe.lock , Preis ab 399 Euro Trackingsysteme f\u00fcrs Fahrzeug Zudem lassen sich gestohlene Wohnmobile mit GPS-Trackingsystemen orten. Hierzu wird ein Sender versteckt im Fahrzeug eingebaut, der dann \u00fcber das Mobilfunknetz und GPS die Auffindung des Fahrzeugs erm\u00f6glicht. Anbieter sind unter anderem Blaupunkt mit BPT 1500+, Dethleffs mit Vehicle Defence, Mc Ortung mit SP2+Z und PAJ GPS mit Power Finder. Die Systeme laufen mit eigener Batterie oder Starterbatteriestrom. Wichtig zu wissen: F\u00fcr die Ortung des Fahrzeugs k\u00f6nnen weitere Kosten durch die Nutzung der integrierten SIM-Karte entstehen. Trackingsysteme CaraSave Alarmsystem mit GPS-Version , Preis ab 599 Euro Blaupunkt: BT 1500+ , Preis ab 179 Euro Dethleffs Vehicle Defence , Preis ab 269 Euro Mc Ortung SP 2+Z, Preis ab 236 Euro PAJ-GPS Power Finder, Preis ab 140 Euro YUKAtrack Ortungssystem easyWire GPS , ab 115 Euro Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Mehr zum Thema Gas Gaspr\u00fcfung f\u00fcr Campingfahrzeuge Pflicht ab 2025 Ohne Gasplakette droht Campern eine Strafe Tipps & Tricks Gasbetrieb im Wohnmobil und Wohnwagen K\u00fchlschrank w\u00e4hrend der Fahrt laufen lassen? Tipps & Tricks Vorteile von Gastanks im Wohnmobil Gastank oder Gasflasche - Was ist besser? Zubeh\u00f6r Mobile Satelliten-Antennen f\u00fcrs Camping Tragbare Sat-Anlagen f\u00fcr fast unbegrenzten Empfang Zubeh\u00f6r Gas im Wohnmobil und Wohnwagen Gasflaschen, Filter, F\u00fcllstandsanzeige und Co Themen Gaswarner im Wohnmobil So sch\u00fctze Sie sich vor unsichtbaren Gasen Zubeh\u00f6r Truma-Chef Wottrich im Interview Wird Gas beim Campen von Alternativen abgel\u00f6st? Zubeh\u00f6r Mehr anzeigen Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", + "summary": "

Einen Kriminalfall beim Camping? Braucht man nur in der Urlaubslektüre. Wir zeigen nachrüstbare Ausrüstung, die Einbruch und Diebstahl erschwert.

", + "text": "Wie schütze ich mein Wohnmobil vor Diebstahl? Abo Hefte Produkte Marken Anmelden Abo Menü Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubehör Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Zubehör Wie schütze ich mein Wohnmobil vor Diebstahl? Alles über Gasfüllstände und Co Gas im Wohnmobil Schutz vor Einbruch und Diebstahl fürs Wohnmobil : Wie schütze ich mein Wohnmobil vor Diebstahl? Einen Kriminalfall beim Camping? Braucht man nur in der Urlaubslektüre. Wir zeigen nachrüstbare Ausrüstung, die Einbruch und Diebstahl erschwert. Sophia Pfisterer , Ingo Köcher Veröffentlicht am 21.05.2025 Foto: Fiamma 27 Bilder Der größte Albtraum ist, wenn man von einem Ausflug auf den Parkplatz oder Stellplatz zurückkommt und das Wohnmobil verschwunden ist oder Diebe das Campingfahrzeug aufgebrochen haben, alles durchwühlt ist und Wertgegenstände gestohlen sind. Neben dem unguten Gefühl, dass Fremde in den privaten Bereich eingedrungen sind, dem Ärger über die Schäden und Verluste, bleibt die Sorge, dass sich dies jederzeit wiederholen könnte. 5 Verhaltens-Tipps zum Schutz vor Diebstahl und Einbruch Eine einfache, technische Lösung des Problems sind verschiedene Zubehörkomponenten wie Zusatz-Sicherungen, Schlösser, Parkkrallen, Verriegelungen, GPS-Trackern und Alarmanlagen. Diese stellen wir weiter unten ausführlich vor. Gleichzeitig können einfache Verhaltensregeln das Risiko minimieren, dass im Wohnmobil eingebrochen wird bzw. dass es geklaut wird. Denn: Gelegenheit macht Diebe. Immer abschließen – auch bei kurzer Abwesenheit: Selbst beim schnellen Brötchenholen: Türen, Fenster und Dachluken verriegeln. Wertgegenstände außer Sicht verstauen: Keine Handys, Laptops oder Kameras sichtbar liegen lassen – Vorhänge oder Sichtschutz nutzen. Stellplatz mit Bedacht wählen: Bevorzugt auf offiziellen Campingplätzen oder gut beleuchteten, belebten Stellflächen übernachten. Nachbarschaftliche Aufmerksamkeit : Kontakt zu Nachbarn am Stellplatz halten – gegenseitiges Beobachten erhöht die Sicherheit. Fahrzeugpapiere separat und sicher aufbewahren : Niemals die Zulassungsbescheinigung Teil I (Fahrzeugschein) im Wohnmobil lassen – sonst wird Diebstahl für Profis noch einfacher. Besser: Im Geldbeutel oder an einem sicheren Ort außerhalb des Fahrzeugs aufbewahren. Zusätzliche Schlösser für Türen und Klappen Um das Aufbrechen des Fahrzeugs von außen zu verhindern, lassen sich Fahrerhaus-, Aufbau- und Garagentür sowie Serviceklappen von außen durch zusätzliche Schlösser sichern. Entsprechende Systeme bieten unter anderem Fiamma und Thule mit den sogenannten Security-Handgriffen. Die außen neben der Tür montierten Bügel sind über das Türblatt schwenk- und verschließbar. Auf diese Weise wird das Aufbrechen der Tür deutlich erschwert. Praktisch: Im offenen Zustand fungieren die Bügel als Handlauf und erleichtern das Ein- und Aussteigen. Zusätzliche Riegelschlösser zur Außenmontage haben unter anderem Heosolution mit dem Heosafe Riegelschloss und Thule mit Universal Lock und Door Frame Lock im Programm. Thule Security-Handgriffe sichern die Aufbautür zusätzlich. Auch innen im Fahrzeug lassen sich Türen und Klappen zusätzlich sichern. Für die Fahrerhaustüren bietet Fiamma mit Duo-Safe Pro eine Alustange , deren Enden unterhalb des Fensters in den Türrahmen gesteckt werden. Die teleskopierbare Stange lässt sich von 119 auf 190 Zentimeter verlängern und verhindert das Öffnen der beiden Türen. Die gleiche Wirkung erzielt man mit einer Kette, die in am Türrahmen montierte Metallösen eingehängt wird. Wiederum von Fiamma ist das Sicherheitsschloss Safe Door Guardian. Der Riegel des komplett aus Aluminium gefertigten Schlosses verriegelt bzw. öffnet per Drehbewegung Fahrerhaus-, Aufbau-, Garagentüren und Serviceklappen von innen. Türen und Klappen sichern Fiamma Safe Door Magnum , ab 87 Euro [Link auf https://www.awin1.com/cread.php?awinmid=70949&awinaffid=893807&clickref=pro-22102643-sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase&ued=https%3A%2F%2Fwww.fritz-berger.de%2Fartikel%2Ffiamma-einstiegshilfe-buegel-security-und-tuersicherung-1971] Fiamma Einstiegshilfe- und Sicherungsbügel Security , Preis ab 123 Euro Fiamma Duo Safe Pro Sicherheitsleiste , Preis ab 69 Euro [Link auf https://www.awin1.com/cread.php?awinmid=70949&awinaffid=893807&clickref=pro-22102643-sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase&ued=https%3A%2F%2Fwww.fritz-berger.de%2Fartikel%2Ffiamma-safe-door-guardian-innerer-sicherheitsblock-266765] Fiamma Safe Door Guardian Sicherheitsblock , Preis ab 77 Euro Heosolution Heosafe Riegelschloss , Preis ab 135 Euro Thule Universal Lock , Preis ab 101 Euro Fenster und Dachhauben verriegeln Spezielle Lösungen zur Sicherung vorgehängter Fenster als auch Rahmen- und Schiebefenster bietet Womo-Sicherheit. Das System für Ausstellfenster besteht aus einem Metall-U-Profil, das die Unterkante der Scheibe verstärkt. Im Innenraum werden am Fensterrahmen zwei verschließbare Gegenstücke montiert, die das Fenster rechts und links mit jeweils einer Rändelschraube halten. Für die Sicherung von Schiebefenstern im Fahrerhaus und Aufbau sowie für Dachluken sind zudem teleskopierbare Stangen im Programm. Benjamin Köbler-Linsner Fenster und Dachhauben sichern Womo-Sicherheit Ausstell- u. Rahmenfenstersicherung , Preis ab 99 Euro Womo-Sicherheit Dachhaubensicherung , Preis ab 83 Euro Wolfshund Schiebefenstersicherung , Preis ab 159 Euro Safe fürs Wohnmobil Wertsachen im Fahrzeug sichert man am besten in einem Tresor . Ein Safe lässt sich in Schränken und Stauräumen, im Doppelboden, als Türtresor oder in den Fahrerhaussitzkonsolen einbauen. Tresore in unterschiedlichen Größen liefern unter anderem Alko, Mobile-Safe, Milenco und Mobil. Wertsachen, Dokumente sicher lagern Alko Tresor , Preis ab 187 Euro Mobile-Safe Sitzkonsolensafe für Mercedes Sprinter , Preis ab 249Euro Mobile-Safe Türsafe für Fiat Ducato , Preis 249 Euro Milenco Sitzsockelsafe für Iveco Daily , Preis ab 199 Euro Mobil-Safe Standard Safe mit Doppelbartschloss , Preis ab 125 Euro Wegfahrschutz fürs Wohnmobil Automatische Wegfahrsperren verhindern unbefugtes Starten des Motors, indem sie die Zündung oder Kraftstoffzufuhr elektronisch unterbrechen. Sie funktionieren meist über einen Transponder-Schlüssel oder eine codierte Verbindung zwischen Schlüssel und Steuergerät, die nur bei korrekter Erkennung den Motorstart ermöglicht. Damit schützen sie vor Diebstahl, indem sie den Startvorgang ohne autorisierten Schlüssel blockieren. Für Camper bedeutet das mehr Sicherheit, besonders bei längeren Standzeiten oder an unbekannten Orten. Ist eine Wegfahrsperre nicht automatisch im Fahrzeug eingebaut, lässt sich der Camper mechanisch nachrüsten. Um das unbefugte Wegfahren des Wohnmobils zu verhindern, leisten Lenkrad-, Pedal- und Radkrallen sowie Pedal- und Ganghebelsperren gute Dienste. Wegfahrschutz Alca AutoSafe Pedal-Sperre , Preis ab 20 Euro Berger Radkralle , Preis ab 30 Euro Milenco BD Loc Pedalsperre für Fiat Ducato und Peugeot Boxer , Preis ab 150 Euro MEM Lenkradkralle für Lkw und Transporter , Preis ab 284 Euro Alarmanlagen und Bewegungsmelder Einbruchschutz bieten auch Alarmanlagen , die, an Fenstern, Dachhauben und Türen angebracht, bei gewaltsamem Aufhebeln ordentlich Lärm machen und je nach Modell eine Nachricht an eine angeschlossene Sicherheitszentrale oder das Smartphone senden. Die Geräte sind zum Teil mit Bewegungsmelder und Trackingsystem ausgestattet. Solche Systeme bekommt man ab 55 Euro. Anbieter sind unter anderem Bosch, Carbest, Dometic, Milenco und Thitronik. Tipp: Eine abschreckende Wirkung für Gelegenheitsdiebe haben oft auch schon entsprechende Warnaufkleber an den Scheiben. Alarmanlagen und Bewegungsmelder Bosch Spexor , Preis ab 230 Euro Carbest Protect-On Camper 849 für Fiat Ducato , Preis ab 259 Euro Dometic Magic Safe MS 660 , Preis ab 63 Euro Milenco Autoalarm , Preis ab 147 Euro Thitronik Funk-Alarmanlage WiPro III safe.lock , Preis ab 399 Euro Trackingsysteme fürs Fahrzeug Zudem lassen sich gestohlene Wohnmobile mit GPS-Trackingsystemen orten. Hierzu wird ein Sender versteckt im Fahrzeug eingebaut, der dann über das Mobilfunknetz und GPS die Auffindung des Fahrzeugs ermöglicht. Anbieter sind unter anderem Blaupunkt mit BPT 1500+, Dethleffs mit Vehicle Defence, Mc Ortung mit SP2+Z und PAJ GPS mit Power Finder. Die Systeme laufen mit eigener Batterie oder Starterbatteriestrom. Wichtig zu wissen: Für die Ortung des Fahrzeugs können weitere Kosten durch die Nutzung der integrierten SIM-Karte entstehen. Trackingsysteme CaraSave Alarmsystem mit GPS-Version , Preis ab 599 Euro Blaupunkt: BT 1500+ , Preis ab 179 Euro Dethleffs Vehicle Defence , Preis ab 269 Euro Mc Ortung SP 2+Z, Preis ab 236 Euro PAJ-GPS Power Finder, Preis ab 140 Euro YUKAtrack Ortungssystem easyWire GPS , ab 115 Euro Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn – Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf Rädern oder nur ein schönes Wort? 5 Amazon Prime Day 2025 für Camper Camping-Zubehör stark reduziert bei Amazon Mehr zum Thema Gas Gasprüfung für Campingfahrzeuge Pflicht ab 2025 Ohne Gasplakette droht Campern eine Strafe Tipps & Tricks Gasbetrieb im Wohnmobil und Wohnwagen Kühlschrank während der Fahrt laufen lassen? Tipps & Tricks Vorteile von Gastanks im Wohnmobil Gastank oder Gasflasche - Was ist besser? Zubehör Mobile Satelliten-Antennen fürs Camping Tragbare Sat-Anlagen für fast unbegrenzten Empfang Zubehör Gas im Wohnmobil und Wohnwagen Gasflaschen, Filter, Füllstandsanzeige und Co Themen Gaswarner im Wohnmobil So schütze Sie sich vor unsichtbaren Gasen Zubehör Truma-Chef Wottrich im Interview Wird Gas beim Campen von Alternativen abgelöst? Zubehör Mehr anzeigen Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellplätze, Zubehör und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserklärung Impressum Pur-Abo hier kündigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print © 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", "tags": [], "status": "Trash", "link": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/", @@ -3375,29 +3375,29 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1840128.jpg", - "alt": "Sicherheitszubeh\u00f6r - Einbruchs und Diebstahlschutz", - "caption": "Sicherheitszubeh\u00f6r - Einbruchs und Diebstahlschutz", + "alt": "Sicherheitszubehör - Einbruchs und Diebstahlschutz", + "caption": "Sicherheitszubehör - Einbruchs und Diebstahlschutz", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1840180.jpg", - "alt": "Sicherheitszubeh\u00f6r f\u00fcrs Wohnmobil", - "caption": "Sicherheitszubeh\u00f6r f\u00fcrs Wohnmobil", + "alt": "Sicherheitszubehör fürs Wohnmobil", + "caption": "Sicherheitszubehör fürs Wohnmobil", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1840185.jpg", - "alt": "Sicherheitszubeh\u00f6r f\u00fcrs Wohnmobil", - "caption": "Sicherheitszubeh\u00f6r f\u00fcrs Wohnmobil", + "alt": "Sicherheitszubehör fürs Wohnmobil", + "caption": "Sicherheitszubehör fürs Wohnmobil", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" }, @@ -3438,8 +3438,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2178259.jpg", - "alt": "Absorberk\u00fchlschrank, Carado T 471", - "caption": "Absorberk\u00fchlschrank, Carado T 471", + "alt": "Absorberkühlschrank, Carado T 471", + "caption": "Absorberkühlschrank, Carado T 471", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/" }, @@ -3525,10 +3525,10 @@ }, { "id": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/", - "title": "Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate f\u00fcr den Ducato 8?", + "title": "Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8?", "date": "Thu, 20 Feb 2025 06:00:00 +0100", - "summary": "

Fiat verspricht, mit einem Software-Update die Probleme mit der Ducato 9-Gang-Automatik zu l\u00f6sen. Doch h\u00e4lt die Ma\u00dfnahme, was sie verspricht? Wir wollen es wissen und haben nach Ihren Erfahrungen gefragt.

", - "text": "Sie sind gefragt! Was bringt das Softwareupdate f\u00fcr den Fiat Ducato? Abo Hefte Produkte Marken Anmelden Abo Men\u00fc Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubeh\u00f6r Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Wohnmobile Sie sind gefragt! Was bringt das Softwareupdate f\u00fcr den Fiat Ducato? Leserstimmen zum Update der 9-Gang-Automatik : Was bringt das Softwareupdate f\u00fcr den Ducato 8? Fiat verspricht, mit einem Software-Update die Probleme mit der Ducato 9-Gang-Automatik zu l\u00f6sen. Doch h\u00e4lt die Ma\u00dfnahme, was sie verspricht? Wir wollen es wissen und haben nach Ihren Erfahrungen gefragt. Samira Matschinsky Ver\u00f6ffentlicht am 20.02.2025 Foto: Kohstall 3 Bilder Im vergangenen Jahr h\u00e4uften sich Probleme mit der 2019 von Fiat neu eingef\u00fchrten 9-Gang-Automatik, vor allem bei Wohnmobilen, die die 3,5 Tonnen \u00fcberschritten. Es erreichten uns zahlreiche Berichte von Leserinnen und Lesern, die im Urlaub mit ihrem Wohnmobil von gelb und rot aufleuchtenden Getriebel\u00e4mpchen und der Motorkontrollleuchte \u00fcberrascht wurden. Nach einem Softwareupdate oder einem \u00d6lwechsel wurden viele Besitzerinnen und Besitzer mit ihren Wohnmobilen wieder nach Hause geschickt, bis sie, teilweise nur wenige Tage sp\u00e4ter, wieder vor den Toren der Werkstatt standen. Die finale Diagnose in vielen F\u00e4llen: Getriebeschaden . Hier geht es zu den Erfahrungen unserer Leserinnen und Leser. Sie sind gefragt! Was bringt das Software-Update? Die aktuellste Entwicklung ist nun ein Update der Steuerungssoftware von Motor und Getriebe, das k\u00fcnftig Probleme bzw. Defekte verhindern soll. Vorgesehen ist das Update f\u00fcr mit der 9-Gang-Wandlerautomatik ausgestattete Ducato-Modelle der Generation 8, die mit den 2,2-Liter-Motoren mit 160 und 180 PS best\u00fcckt sind. Die Fiat-Professional-Werkst\u00e4tten wurden Anfang November des letzten Jahres \u00fcber das Update informiert und haben entsprechende Instruktionen erhalten. promobil m\u00f6chte dieser L\u00f6sung nun auf den Zahn f\u00fchlen und hat Sie, liebe Leserinnen und Leser, nach ihren Erfahrungen gefragt. Die Erfahrungen unserer Leserinnen und Leser! Das neue Software-Update f\u00fcr die 9-Gang-Wandlerautomatik des Fiat Ducato soll k\u00fcnftig Getriebesch\u00e4den verhindern und das Zusammenspiel von Motor und Getriebe verbessern \u2013 doch wie sieht es in der Praxis aus? Noch Wochen nach unserem ersten Aufruf melden sich immer noch Leserinnen und Leser per Mail bei uns und berichten von ihren Erfahrungen mit der 9-Gang-Automatik. Nicht wenige dieser Zuschriften erz\u00e4hlen noch immer von Getriebesch\u00e4den und Werkstatt-Odyssee. Hier kam das Update zu sp\u00e4t. Doch die ersten Wohnmobile haben nun auch das Software-Update erhalten, welches k\u00fcnftig Probleme mit dem Getriebe der 9-Gangautomatik verhindern soll. Keine langen Wartezeiten f\u00fcr den Termin Bei etwas \u00fcber 50 Zuschriften zum Software-Update berichtet der \u00fcberwiegende Teil von positiven Erfahrungen. \"Nach einer Wartezeit von 2 Wochen konnten wir den Wagen abgeben und haben ihn innerhalb einer Woche wieder bekommen\", schreibt beispielsweise Andreas Neubert am 10.01.2025. Das Schaltverhalten sei seither \"definitiv besser, aber nicht optimal\". Martin D\u00f6ller bekam innerhalb einer Woche einen Termin. Die Aktion habe dann genau 45 Minuten gedauert. Seither merke er \"keinen Unterschied beim Fahren\". Auch Gerry Sch\u00f6newolf bekam innerhalb weniger Tage einen Termin f\u00fcr das Update. Was genau gemacht wurde, habe man ihm nicht gesagt. Insgesamt f\u00fchle sich das Update aber \"nicht schlecht an\". Er habe aber das Gef\u00fchl, dass das Wohnmobil im unteren Drehzahlbereich mehr Drehmoment habe und fr\u00fcher schalte. \"Allerdings habe ich auch den Eindruck, dass beim Beschleunigen oberhalb von 80\u201390 km/h etwas Leistung fehlt und das Fahrzeug dort tr\u00e4ger wirkt\" schildert Sch\u00f6newolf. Peter Neye bekam f\u00fcr seinen Roller Team innerhalb einer Woche einen Termin. Der sei auf 2 Stunden angesetzt gewesen. \"Da aber noch ein paar Kleinigkeiten gepr\u00fcft werden sollten, blieb das Fahrzeug \u00fcber Nacht\", schreibt er. \"Bei der Abholung wurde mir erkl\u00e4rt, was alles gemacht wurde. Das Personal war kompetent und freundlich. Ich werde mein Fahrzeug also wieder dort zum Service hinbringen\". Zum Fahrverhalten nach dem Update schreibt er: \"Das Fahr- und Schaltverhalten hat mich vor dem Update schon begeistert und ich muss zugeben, dass ich keine Ver\u00e4nderung nach dem Update feststellen konnte\". Dauer: 45 Minuten bis 2 Stunden So oder so \u00e4hnlich ergeht es auch zahlreichen anderen Lesern und Leserinnen. Meist verl\u00e4uft der Termin zwischen 45 Minuten und zwei Stunden. Wenn das Update im Rahmen anderer Ma\u00dfnahmen durchgef\u00fchrt wird, bleibt das Fahrzeug auch mal \u00fcber Nacht oder sogar die ganze Woche. Nicht jede Werkstatt kl\u00e4rt dabei den Kunden \u00fcber Sinn und Zweck des Updates auf. Einige wenige LeserInnen berichten auch davon, dass ihre Werkstatt von dem Update nichts gewusst hat oder sie sogar aufgefordert wurden, eine Geb\u00fchr f\u00fcr das eigentlich kostenlose Update zu zahlen. \u00dcber das Update informierte die Werkstatt bei Vorstellung Von ihrer Werkstatt oder ihrem H\u00e4ndler informiert worden sind ebenfalls die wenigsten. H\u00e4ufiger kam das Update im Rahmen einer \u00dcberpr\u00fcfung oder eines Servicetermins zur Sprache. Einige sprachen die Werkstatt auch auf das Update an, nachdem sie bei uns oder in einem Forum davon gelesen hatten. Die meisten bekamen dann jedoch schnell einen Termin. Fahrverhalten nach dem Update unauff\u00e4llig Mit der Getriebe-Problematik im Hinterkopf horchen Wohnmobil-Besitzer nach einem solchen Termin nat\u00fcrlich ganz genau in ihr Fahrzeug hinein. Dabei stellen die meisten nach dem Update jedoch keine bis eher geringe Unterschiede fest. Vereinzelte Kunden glauben eher eine Verbesserung im Fahrverhalten ersp\u00fcren zu k\u00f6nnen, insbesondere bei h\u00f6heren Geschwindigkeiten. In Einzelf\u00e4llen wird allerdings von verminderter Leistung, einem h\u00f6heren Verbrauch oder \u2013 in einem Fall \u2013 sogar von einem Getriebeschaden kurz nach dem Update berichtet. Dieser k\u00f6nnte aber nat\u00fcrlich auch bereits in den Grundz\u00fcgen bestanden haben, bevor das Update aufgespielt wurde. Zudem erw\u00e4hnen einzelne LeserInnen, dass sie bereits mehrere tausend Kilometer mit dem Update gefahren sind, ohne dass sich Probleme bemerkbar gemacht h\u00e4tten. Diese Berichte sind ermutigend, liefern jedoch noch keinen endg\u00fcltigen Beweis daf\u00fcr, dass das Update fl\u00e4chendeckend wirkt und das Risiko von Getriebesch\u00e4den signifikant reduziert. Weitere Leserstimmen zum Software-Update Schreitter J\u00fcrgen , am 10.01.2025, per Mail : \"Wir haben einen gebrauchten Malibu T 430 LE mit 180PS Automatik gekauft (20.500 km). Auch ich hatte im Vorfeld von der Problematik geh\u00f6rt, allerdings erst, als ich den Kaufvertrag bereits unterschrieben hatte. Als ich die FIN mitgeteilt bekam, habe ich mich bei Fiat registriert und mich dort vorab informiert. Dann hab ich mir einen sehr guten Fiat H\u00e4ndler in der Gegend gesucht und \u00fcber ihn meine FIN zur \u00dcberpr\u00fcfung geschickt. Fahrverhalten vor dem Update : Sehr unruhig und viel zu hohe Drehzahlen im 1.-2. Gang zu sp\u00fcren, selbst bei sanftem Gasfu\u00df. Ebenfalls kam ich auf der Autobahn selbst bei 120+ km/h nicht in den 9. Gang. Fahrverhalten nach dem Update : Ein absoluter Traum, Schaltvorg\u00e4nge sind nicht zu sp\u00fcren, selbst mein DSG 7 von VW Tiguan schaltet ruppiger. Verbrauch ca. 1,5-2 Liter geringer, 9. Gang bereits ab Tempo 95 km/h in Gebrauch und das nicht nur auf der Autobahn, sondern auch auf Landstra\u00dfen. Gef\u00fchlt zieht er kultivierter und angenehmer die Steigungen hoch.\" Oliver \u00d6hlenberg , am 24.01.2025, per Mail : \"Wir wurden leider nicht von Fiat bzw. B\u00fcrstner kontaktiert, sondern haben \u00fcber verschiedene Camper Foren bzw. der Presse von dem Update erfahren. Wir haben unseren FIAT H\u00e4ndler darauf angesprochen und dieser hat gesagt, das liege daran, dass B\u00fcrstner einen Kaufvertrag mit FIAT eingegangen ist und daher FIAT den eigentlichen Endkunden nicht kennt. Er hat auch gesagt, dass bei gr\u00f6\u00dferen Problemen mit dem Fahrzeug es eigentlich so sein sollte, dass der Endkunde eigentlich zum B\u00fcrstner H\u00e4ndler gehen muss, damit dieser dann das Fahrzeug an eine FIAT-Werkstatt bringen muss. Er hatte gerade mit dem Getriebe immer wieder den Fall, dass FIAT bei einem Getriebeaustausch ihm nur die Stunden bezahlt, welche man ben\u00f6tigt, um das Getriebe bei einem normalen Ducato zu tauschen. Der Zeitaufwand, gerade bei einem Vollintegrierten, ist aber wesentlich h\u00f6her. Die Differenz muss entweder der Endkunde zahlen, oder der Aufbauhersteller. Da es in K\u00f6ln nur noch einen FIAT Professional H\u00e4ndler gibt, welcher gro\u00dfe Wohnmobile (\u00fcber 6m) bearbeiten kann, mussten wir ca. 2 Monate auf einen Termin warten. 2 Tage dauerte dann das Update, da am eigentlichen Tag es ein Problem bei FIAT am Server gab und kein Update heruntergeladen werden konnte. Bis jetzt f\u00e4hrt das Fahrzeug wie vorher.\" Claus Bergmann , am 11.01.2025, per Mail : \"Wir fahren einen Malibu T460 Baujahr 03/2024. Wir haben 180PS mit der 9-Gang-Automatik (bislang 7.000 km ohne Probleme). Aufmerksam geworden sind wir zum einen \u00fcber die Carthago Gruppe in Facebook, zum anderen \u00fcber den Artikel in ihrer Zeitung. Ich bin im Oktober dann zu Fiat bez\u00fcglich eines Termines wegen des Updates und konnte 4 Wochen danach hinfahren. Den Termin hatte ich um 7.30 Uhr und rollte um 8.10 Uhr wieder vom Platz. Das lief alles sehr problemlos. Was ich schade fand, dass man mir nicht sagen konnte, was das Update macht. Der Inhaber sagte, sie h\u00e4tten eine Update-Nummer, mehr auch nicht. Das fand ich schon verwunderlich, dass diese Informationen nicht vorlagen. Sprich, ich wei\u00df bis heute nicht, was genau gemacht wurde. Ich bin bislang nicht viel gefahren, jedoch merkte ich, dass es fr\u00fcher schaltet und der 9. Gang schneller erreicht wird als fr\u00fcher. Bei ca. 100 km/h schaltet er in den neunten Gang, das war fr\u00fcher definitiv nicht der Fall.\" Jens Birkenk\u00f6tter , per Mail: \"Die Abwicklung war sehr gut. Termin vereinbart, zwei Wochen sp\u00e4ter das neue Software Update bekommen.\" So haben wir gefragt: Haben Sie das Update schon gemacht? Wurden Sie aktiv von Fiat kontaktiert oder haben Sie auf anderen Wegen von dem Update erfahren? Wie schnell haben Sie einen Termin f\u00fcr das Update erhalten? Wie lange dauerte der Werkstattbesuch? Haben Sie Ver\u00e4nderungen im Fahrverhalten Ihres Ducato festgestellt \u2013 vor und nach dem Update? Haben Sie vorher Probleme mit dem Getriebe erlebt, und wenn ja, welche? Wurden Sie \u00fcber den Update-Vorgang und dessen Ziele ausreichend informiert? Wie bewerten Sie den Service von Fiat Professional und den Ablauf der Aktion insgesamt? Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn \u2013 Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf R\u00e4dern oder nur ein sch\u00f6nes Wort? 5 Amazon Prime Day 2025 f\u00fcr Camper Camping-Zubeh\u00f6r stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellpl\u00e4tze, Zubeh\u00f6r und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserkl\u00e4rung Impressum Pur-Abo hier k\u00fcndigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print \u00a9 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", + "summary": "

Fiat verspricht, mit einem Software-Update die Probleme mit der Ducato 9-Gang-Automatik zu lösen. Doch hält die Maßnahme, was sie verspricht? Wir wollen es wissen und haben nach Ihren Erfahrungen gefragt.

", + "text": "Sie sind gefragt! Was bringt das Softwareupdate für den Fiat Ducato? Abo Hefte Produkte Marken Anmelden Abo Menü Alle pro+ Artikel Finanzierung Wohnmobile Wohnwagen Zubehör Platzfinder Reiseplanung Ratgeber Fahrzeugmarkt News Wohnmobile Sie sind gefragt! Was bringt das Softwareupdate für den Fiat Ducato? Leserstimmen zum Update der 9-Gang-Automatik : Was bringt das Softwareupdate für den Ducato 8? Fiat verspricht, mit einem Software-Update die Probleme mit der Ducato 9-Gang-Automatik zu lösen. Doch hält die Maßnahme, was sie verspricht? Wir wollen es wissen und haben nach Ihren Erfahrungen gefragt. Samira Matschinsky Veröffentlicht am 20.02.2025 Foto: Kohstall 3 Bilder Im vergangenen Jahr häuften sich Probleme mit der 2019 von Fiat neu eingeführten 9-Gang-Automatik, vor allem bei Wohnmobilen, die die 3,5 Tonnen überschritten. Es erreichten uns zahlreiche Berichte von Leserinnen und Lesern, die im Urlaub mit ihrem Wohnmobil von gelb und rot aufleuchtenden Getriebelämpchen und der Motorkontrollleuchte überrascht wurden. Nach einem Softwareupdate oder einem Ölwechsel wurden viele Besitzerinnen und Besitzer mit ihren Wohnmobilen wieder nach Hause geschickt, bis sie, teilweise nur wenige Tage später, wieder vor den Toren der Werkstatt standen. Die finale Diagnose in vielen Fällen: Getriebeschaden . Hier geht es zu den Erfahrungen unserer Leserinnen und Leser. Sie sind gefragt! Was bringt das Software-Update? Die aktuellste Entwicklung ist nun ein Update der Steuerungssoftware von Motor und Getriebe, das künftig Probleme bzw. Defekte verhindern soll. Vorgesehen ist das Update für mit der 9-Gang-Wandlerautomatik ausgestattete Ducato-Modelle der Generation 8, die mit den 2,2-Liter-Motoren mit 160 und 180 PS bestückt sind. Die Fiat-Professional-Werkstätten wurden Anfang November des letzten Jahres über das Update informiert und haben entsprechende Instruktionen erhalten. promobil möchte dieser Lösung nun auf den Zahn fühlen und hat Sie, liebe Leserinnen und Leser, nach ihren Erfahrungen gefragt. Die Erfahrungen unserer Leserinnen und Leser! Das neue Software-Update für die 9-Gang-Wandlerautomatik des Fiat Ducato soll künftig Getriebeschäden verhindern und das Zusammenspiel von Motor und Getriebe verbessern – doch wie sieht es in der Praxis aus? Noch Wochen nach unserem ersten Aufruf melden sich immer noch Leserinnen und Leser per Mail bei uns und berichten von ihren Erfahrungen mit der 9-Gang-Automatik. Nicht wenige dieser Zuschriften erzählen noch immer von Getriebeschäden und Werkstatt-Odyssee. Hier kam das Update zu spät. Doch die ersten Wohnmobile haben nun auch das Software-Update erhalten, welches künftig Probleme mit dem Getriebe der 9-Gangautomatik verhindern soll. Keine langen Wartezeiten für den Termin Bei etwas über 50 Zuschriften zum Software-Update berichtet der überwiegende Teil von positiven Erfahrungen. \"Nach einer Wartezeit von 2 Wochen konnten wir den Wagen abgeben und haben ihn innerhalb einer Woche wieder bekommen\", schreibt beispielsweise Andreas Neubert am 10.01.2025. Das Schaltverhalten sei seither \"definitiv besser, aber nicht optimal\". Martin Döller bekam innerhalb einer Woche einen Termin. Die Aktion habe dann genau 45 Minuten gedauert. Seither merke er \"keinen Unterschied beim Fahren\". Auch Gerry Schönewolf bekam innerhalb weniger Tage einen Termin für das Update. Was genau gemacht wurde, habe man ihm nicht gesagt. Insgesamt fühle sich das Update aber \"nicht schlecht an\". Er habe aber das Gefühl, dass das Wohnmobil im unteren Drehzahlbereich mehr Drehmoment habe und früher schalte. \"Allerdings habe ich auch den Eindruck, dass beim Beschleunigen oberhalb von 80–90 km/h etwas Leistung fehlt und das Fahrzeug dort träger wirkt\" schildert Schönewolf. Peter Neye bekam für seinen Roller Team innerhalb einer Woche einen Termin. Der sei auf 2 Stunden angesetzt gewesen. \"Da aber noch ein paar Kleinigkeiten geprüft werden sollten, blieb das Fahrzeug über Nacht\", schreibt er. \"Bei der Abholung wurde mir erklärt, was alles gemacht wurde. Das Personal war kompetent und freundlich. Ich werde mein Fahrzeug also wieder dort zum Service hinbringen\". Zum Fahrverhalten nach dem Update schreibt er: \"Das Fahr- und Schaltverhalten hat mich vor dem Update schon begeistert und ich muss zugeben, dass ich keine Veränderung nach dem Update feststellen konnte\". Dauer: 45 Minuten bis 2 Stunden So oder so ähnlich ergeht es auch zahlreichen anderen Lesern und Leserinnen. Meist verläuft der Termin zwischen 45 Minuten und zwei Stunden. Wenn das Update im Rahmen anderer Maßnahmen durchgeführt wird, bleibt das Fahrzeug auch mal über Nacht oder sogar die ganze Woche. Nicht jede Werkstatt klärt dabei den Kunden über Sinn und Zweck des Updates auf. Einige wenige LeserInnen berichten auch davon, dass ihre Werkstatt von dem Update nichts gewusst hat oder sie sogar aufgefordert wurden, eine Gebühr für das eigentlich kostenlose Update zu zahlen. Über das Update informierte die Werkstatt bei Vorstellung Von ihrer Werkstatt oder ihrem Händler informiert worden sind ebenfalls die wenigsten. Häufiger kam das Update im Rahmen einer Überprüfung oder eines Servicetermins zur Sprache. Einige sprachen die Werkstatt auch auf das Update an, nachdem sie bei uns oder in einem Forum davon gelesen hatten. Die meisten bekamen dann jedoch schnell einen Termin. Fahrverhalten nach dem Update unauffällig Mit der Getriebe-Problematik im Hinterkopf horchen Wohnmobil-Besitzer nach einem solchen Termin natürlich ganz genau in ihr Fahrzeug hinein. Dabei stellen die meisten nach dem Update jedoch keine bis eher geringe Unterschiede fest. Vereinzelte Kunden glauben eher eine Verbesserung im Fahrverhalten erspüren zu können, insbesondere bei höheren Geschwindigkeiten. In Einzelfällen wird allerdings von verminderter Leistung, einem höheren Verbrauch oder – in einem Fall – sogar von einem Getriebeschaden kurz nach dem Update berichtet. Dieser könnte aber natürlich auch bereits in den Grundzügen bestanden haben, bevor das Update aufgespielt wurde. Zudem erwähnen einzelne LeserInnen, dass sie bereits mehrere tausend Kilometer mit dem Update gefahren sind, ohne dass sich Probleme bemerkbar gemacht hätten. Diese Berichte sind ermutigend, liefern jedoch noch keinen endgültigen Beweis dafür, dass das Update flächendeckend wirkt und das Risiko von Getriebeschäden signifikant reduziert. Weitere Leserstimmen zum Software-Update Schreitter Jürgen , am 10.01.2025, per Mail : \"Wir haben einen gebrauchten Malibu T 430 LE mit 180PS Automatik gekauft (20.500 km). Auch ich hatte im Vorfeld von der Problematik gehört, allerdings erst, als ich den Kaufvertrag bereits unterschrieben hatte. Als ich die FIN mitgeteilt bekam, habe ich mich bei Fiat registriert und mich dort vorab informiert. Dann hab ich mir einen sehr guten Fiat Händler in der Gegend gesucht und über ihn meine FIN zur Überprüfung geschickt. Fahrverhalten vor dem Update : Sehr unruhig und viel zu hohe Drehzahlen im 1.-2. Gang zu spüren, selbst bei sanftem Gasfuß. Ebenfalls kam ich auf der Autobahn selbst bei 120+ km/h nicht in den 9. Gang. Fahrverhalten nach dem Update : Ein absoluter Traum, Schaltvorgänge sind nicht zu spüren, selbst mein DSG 7 von VW Tiguan schaltet ruppiger. Verbrauch ca. 1,5-2 Liter geringer, 9. Gang bereits ab Tempo 95 km/h in Gebrauch und das nicht nur auf der Autobahn, sondern auch auf Landstraßen. Gefühlt zieht er kultivierter und angenehmer die Steigungen hoch.\" Oliver Öhlenberg , am 24.01.2025, per Mail : \"Wir wurden leider nicht von Fiat bzw. Bürstner kontaktiert, sondern haben über verschiedene Camper Foren bzw. der Presse von dem Update erfahren. Wir haben unseren FIAT Händler darauf angesprochen und dieser hat gesagt, das liege daran, dass Bürstner einen Kaufvertrag mit FIAT eingegangen ist und daher FIAT den eigentlichen Endkunden nicht kennt. Er hat auch gesagt, dass bei größeren Problemen mit dem Fahrzeug es eigentlich so sein sollte, dass der Endkunde eigentlich zum Bürstner Händler gehen muss, damit dieser dann das Fahrzeug an eine FIAT-Werkstatt bringen muss. Er hatte gerade mit dem Getriebe immer wieder den Fall, dass FIAT bei einem Getriebeaustausch ihm nur die Stunden bezahlt, welche man benötigt, um das Getriebe bei einem normalen Ducato zu tauschen. Der Zeitaufwand, gerade bei einem Vollintegrierten, ist aber wesentlich höher. Die Differenz muss entweder der Endkunde zahlen, oder der Aufbauhersteller. Da es in Köln nur noch einen FIAT Professional Händler gibt, welcher große Wohnmobile (über 6m) bearbeiten kann, mussten wir ca. 2 Monate auf einen Termin warten. 2 Tage dauerte dann das Update, da am eigentlichen Tag es ein Problem bei FIAT am Server gab und kein Update heruntergeladen werden konnte. Bis jetzt fährt das Fahrzeug wie vorher.\" Claus Bergmann , am 11.01.2025, per Mail : \"Wir fahren einen Malibu T460 Baujahr 03/2024. Wir haben 180PS mit der 9-Gang-Automatik (bislang 7.000 km ohne Probleme). Aufmerksam geworden sind wir zum einen über die Carthago Gruppe in Facebook, zum anderen über den Artikel in ihrer Zeitung. Ich bin im Oktober dann zu Fiat bezüglich eines Termines wegen des Updates und konnte 4 Wochen danach hinfahren. Den Termin hatte ich um 7.30 Uhr und rollte um 8.10 Uhr wieder vom Platz. Das lief alles sehr problemlos. Was ich schade fand, dass man mir nicht sagen konnte, was das Update macht. Der Inhaber sagte, sie hätten eine Update-Nummer, mehr auch nicht. Das fand ich schon verwunderlich, dass diese Informationen nicht vorlagen. Sprich, ich weiß bis heute nicht, was genau gemacht wurde. Ich bin bislang nicht viel gefahren, jedoch merkte ich, dass es früher schaltet und der 9. Gang schneller erreicht wird als früher. Bei ca. 100 km/h schaltet er in den neunten Gang, das war früher definitiv nicht der Fall.\" Jens Birkenkötter , per Mail: \"Die Abwicklung war sehr gut. Termin vereinbart, zwei Wochen später das neue Software Update bekommen.\" So haben wir gefragt: Haben Sie das Update schon gemacht? Wurden Sie aktiv von Fiat kontaktiert oder haben Sie auf anderen Wegen von dem Update erfahren? Wie schnell haben Sie einen Termin für das Update erhalten? Wie lange dauerte der Werkstattbesuch? Haben Sie Veränderungen im Fahrverhalten Ihres Ducato festgestellt – vor und nach dem Update? Haben Sie vorher Probleme mit dem Getriebe erlebt, und wenn ja, welche? Wurden Sie über den Update-Vorgang und dessen Ziele ausreichend informiert? Wie bewerten Sie den Service von Fiat Professional und den Ablauf der Aktion insgesamt? Meist gelesen 1 Carado CV 541 PRO (2026) Spannender Campingbus mit separatem Wohnraum 2 Crosscamp ADVTR und Crosscamp EXPLR (2026) Campingbusse im Hymer-Style ab 50.000 Euro 3 Erste Fahrt im neuen Renault Master Alles neu bei Ahorn – Erster Test im T690 4 Fleurette Wellness-Wohnmobile(2026) Wellness auf Rädern oder nur ein schönes Wort? 5 Amazon Prime Day 2025 für Camper Camping-Zubehör stark reduziert bei Amazon Newsletter Jede Woche per E-Mail erfahren, was in der Wohnmobil-Welt neu ist: Fahrzeuge, Stellplätze, Zubehör und Technik. Plus: Ratgeber, Tests, Kauftipps und vieles mehr. Hier anmelden Angebote Caravaning Newsletter Shop Stellplatz-App Stellplatz-Atlas Themen A-Z Kreditrechner Wohnmobil finanzieren Information Kontakt AGB Nutzungsbedingungen Datenschutz Privacy Manager Datenschutzanfrage Barrierefreiheitserklärung Impressum Pur-Abo hier kündigen Redaktion Heftarchiv Abo & Hefte Heftarchiv Promobil Heftarchiv Caravaning Jahresinhalt Media Mediadaten Online Mediadaten Print © 2025 promobil ist ein Teil der Motor Presse Stuttgart GmbH & Co.KG Weitere Angebote der Motor Presse Stuttgart GmbH & Co. KG & Motor Presse Hamburg GmbH & Co. KG und deren Mehrheitsbeteiligungen Aerokurier Auto Motor und Sport Caravaning Cavallo Flugrevue Klettern mehr-tanken Men's Health Motorradonline Outdoor Promobil Runner's World Women's Health BikeX", "tags": [], "status": "Trash", "link": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/", @@ -3549,8 +3549,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/" }, @@ -3629,12 +3629,12 @@ }, { "id": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/", - "title": "Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das k\u00f6nnen Sie tun!", + "title": "Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun!", "date": "Sat, 23 Nov 2024 12:00:00 +0100", - "summary": "

Die Versicherungspolicen f\u00fcr Wohnmobile werden 2025 deutlich teurer. Warum die Kosten steigen und wie Sie dennoch sparen k\u00f6nnen.

", - "text": "Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das k\u00f6nnen Sie tun!\n\nWohnmobilbesitzer erleben 2025 einen Preisschock: Versicherungspolicen f\u00fcr Wohnmobile werden deutlich teurer. Im Allgemeinen berichten Camper von Preiserh\u00f6hungen um bis zu 60 % f\u00fcr ihre Versicherungspr\u00e4mien. Ausl\u00f6ser sind gestiegene Reparatur- und Ersatzteilkosten, hohe Schadensquoten aus den letzten Jahren und Inflation.\n\nVersicherungsunternehmen f\u00fchren diese Preiserh\u00f6hungen durch, um Verluste auszugleichen und ihre Risiken anzupassen. So werten Regional- und Typenklassen das Risiko des Wohnortes des Halters sowie das Schaden-und Reparaturrisiko eines bestimmten Fahrzeugtyps. Weiterhin tragen datenbasierte Tarifmodelle, die u.a. das Fahrverhalten oder die Nutzungsh\u00e4ufigkeit des Wohnmobils ber\u00fccksichtigen, zur Erh\u00f6hung bei. \n\nTrotzdem gibt es M\u00f6glichkeiten, die erh\u00f6hten Kosten zu kompensieren, z. B. durch den Vergleich verschiedener Anbieter, die Erh\u00f6hung der Selbstbeteiligung, die Pr\u00fcfung des Leistungsumfangs, die Minimierung von Risikofaktoren, die Betreuung durch Makler, eine Neueinstufung oder den Wechsel w\u00e4hrend der Wechselsaison. \n\nJe nachdem k\u00f6nnte es sich lohnen, einen Versicherer anzurufen oder zu einem Maklerb\u00fcro zu wechseln, der bessere M\u00f6glichkeiten zur Verhandlung mit den Versicherern hat.", + "summary": "

Die Versicherungspolicen für Wohnmobile werden 2025 deutlich teurer. Warum die Kosten steigen und wie Sie dennoch sparen können.

", + "text": "Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun!\n\nWohnmobilbesitzer erleben 2025 einen Preisschock: Versicherungspolicen für Wohnmobile werden deutlich teurer. Im Allgemeinen berichten Camper von Preiserhöhungen um bis zu 60 % für ihre Versicherungsprämien. Auslöser sind gestiegene Reparatur- und Ersatzteilkosten, hohe Schadensquoten aus den letzten Jahren und Inflation.\n\nVersicherungsunternehmen führen diese Preiserhöhungen durch, um Verluste auszugleichen und ihre Risiken anzupassen. So werten Regional- und Typenklassen das Risiko des Wohnortes des Halters sowie das Schaden-und Reparaturrisiko eines bestimmten Fahrzeugtyps. Weiterhin tragen datenbasierte Tarifmodelle, die u.a. das Fahrverhalten oder die Nutzungshäufigkeit des Wohnmobils berücksichtigen, zur Erhöhung bei. \n\nTrotzdem gibt es Möglichkeiten, die erhöhten Kosten zu kompensieren, z. B. durch den Vergleich verschiedener Anbieter, die Erhöhung der Selbstbeteiligung, die Prüfung des Leistungsumfangs, die Minimierung von Risikofaktoren, die Betreuung durch Makler, eine Neueinstufung oder den Wechsel während der Wechselsaison. \n\nJe nachdem könnte es sich lohnen, einen Versicherer anzurufen oder zu einem Maklerbüro zu wechseln, der bessere Möglichkeiten zur Verhandlung mit den Versicherern hat.", "tags": [ - "1. \"Versicherungserh\u00f6hung 2025\"", + "1. \"Versicherungserhöhung 2025\"", "2. \"Wohnmobilversicherung\"", "3. \"Kosten sparen bei Versicherungen\"" ], @@ -3657,8 +3657,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/" }, @@ -3734,9 +3734,9 @@ }, { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-yKWdGDCQJZBOCQ4V4HoD40A0.png?st=2025-07-28T06%3A27%3A26Z&se=2025-07-28T08%3A27%3A26Z&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-27T22%3A07%3A39Z&ske=2025-07-28T22%3A07%3A39Z&sks=b&skv=2024-08-04&sig=HUMRhg2FbaKnLil%2BMbyvNemVeBcrvTODpctkfQyFHPc%3D", - "alt": "KI-generiertes Titelbild zu: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das k\u00f6nnen Sie tun!", - "caption": "KI-generiertes Titelbild zu: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das k\u00f6nnen Sie tun!", - "copyright": "OpenAI DALL\u00b7E", + "alt": "KI-generiertes Titelbild zu: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun!", + "caption": "KI-generiertes Titelbild zu: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun!", + "copyright": "OpenAI DALL·E", "copyright_url": "https://openai.com/dall-e" } ], @@ -3744,10 +3744,10 @@ }, { "id": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/", - "title": "Camper-Radio\u200b Caravan.fm : Radiosender speziell f\u00fcr Camping-Fans", + "title": "Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans", "date": "Mon, 02 Oct 2023 16:00:00 +0200", - "summary": "

Welcher Radiosender l\u00e4uft bei Ihnen im Reisemobil oder Campingbus? Seit Juli 2023 gibt es einen Radiosender speziell f\u00fcr Camperinnen und Camper.

", - "text": "Camper-Radio\u200b Caravan.fm : Radiosender speziell f\u00fcr Camping-Fans\n\nCaravan.fm ist ein neuer Radiosender exklusiv f\u00fcr Camping-Fans. Dieser Sender, der im Juli 2023 startete, sendet rund um die Uhr ein programm, das auf die Bed\u00fcrfnisse von Campern abgestimmt ist. Neben Mainstream-Musik bietet der Sender Kurznachrichten und europaweites Reisewetter. Zudem behandelt das Programm verschiedene Themen rund um das Camping. Caravan.fm, initiiert von Radio Hamburg, kann weltweit per Stream \u00fcber die Webadresse www.caravan.fm und \u00fcber die dazugeh\u00f6rige App empfangen werden. Zuk\u00fcnftig soll der Sender auch \u00fcber DAB+ empfangbar sein. \n\nDas t\u00e4gliche Programm umfasst die \"CARAVAN.fm-Br\u00f6tchenshow\" am Morgen, die \"CARAVAN.fm-Mittagspause\" und die \"CARAVAN.fm-Happy Hours\" am Abend. Nachts gibt es ununterbrochen Musik. Zudem bietet der Sender freitags und samstags eine Sendung mit dem Namen \"CARAVAN.fm-Lagerfeuer\", bei der stimmungsvolle Indie- und Akustiksongs passend zur Lagerfeuer-Romantik gespielt werden. \n\nDie Redaktionsleiterin des Senders, Linn MacKenzie, sieht in ihrem Job die M\u00f6glichkeit, das Gef\u00fchl von Ruhe und Leidenschaft, das sie beim Campen empfindet, an die Zuh\u00f6rer weiterzugeben und somit das perfekte musikalische Begleitprogramm f\u00fcr ihre Campingabenteuer zu bieten.", + "summary": "

Welcher Radiosender läuft bei Ihnen im Reisemobil oder Campingbus? Seit Juli 2023 gibt es einen Radiosender speziell für Camperinnen und Camper.

", + "text": "Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans\n\nCaravan.fm ist ein neuer Radiosender exklusiv für Camping-Fans. Dieser Sender, der im Juli 2023 startete, sendet rund um die Uhr ein programm, das auf die Bedürfnisse von Campern abgestimmt ist. Neben Mainstream-Musik bietet der Sender Kurznachrichten und europaweites Reisewetter. Zudem behandelt das Programm verschiedene Themen rund um das Camping. Caravan.fm, initiiert von Radio Hamburg, kann weltweit per Stream über die Webadresse www.caravan.fm und über die dazugehörige App empfangen werden. Zukünftig soll der Sender auch über DAB+ empfangbar sein. \n\nDas tägliche Programm umfasst die \"CARAVAN.fm-Brötchenshow\" am Morgen, die \"CARAVAN.fm-Mittagspause\" und die \"CARAVAN.fm-Happy Hours\" am Abend. Nachts gibt es ununterbrochen Musik. Zudem bietet der Sender freitags und samstags eine Sendung mit dem Namen \"CARAVAN.fm-Lagerfeuer\", bei der stimmungsvolle Indie- und Akustiksongs passend zur Lagerfeuer-Romantik gespielt werden. \n\nDie Redaktionsleiterin des Senders, Linn MacKenzie, sieht in ihrem Job die Möglichkeit, das Gefühl von Ruhe und Leidenschaft, das sie beim Campen empfindet, an die Zuhörer weiterzugeben und somit das perfekte musikalische Begleitprogramm für ihre Campingabenteuer zu bieten.", "tags": [ "1. Camping-Radio", "2. Caravan.fm", @@ -3765,15 +3765,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2035069.jpg", - "alt": "Camper-Radio\u200b", - "caption": "Camper-Radio\u200b", + "alt": "Camper-Radio​", + "caption": "Camper-Radio​", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:51/rt:fill/w:90/plain/2220349.jpg", - "alt": "Carado CV 541, 2026, Au\u00dfenaufnahme", - "caption": "Carado CV 541, 2026, Au\u00dfenaufnahme", + "alt": "Carado CV 541, 2026, Außenaufnahme", + "caption": "Carado CV 541, 2026, Außenaufnahme", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/camper-radio-radiosender-caravan-fm/" }, @@ -3852,10 +3852,10 @@ }, { "id": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/", - "title": "Film-Stunt mit Caravan \u2013 wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen", + "title": "Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen", "date": "Thu, 24 Jul 2025 18:00:00 +0200", - "summary": "

F\u00fcr die Serie \"Countdown\" risikiert Schauspieler Jensen Ackles einen waghalsigen Stunt. Warum Sie das nicht nachmachen sollten.

", - "text": "Jensen Ackles d\u00fcrfte sp\u00e4testens seit seiner Rolle als Soldier Boy in der Amazon-Prime-Serie \"The Boys\" ein Begriff sein. Zum Staffelstart haben sein blanker Hintern und die enormen Views am ersten Tag mal kurz den Streamingdienst zum Erliegen gebracht. Hartgesottene Fans kennen ihn noch aus seiner Rolle als Dean Winchester in der Serie Supernatural. Stunt mit Wohnwagen Momentan l\u00e4uft er mit seiner neuen Serie \"Countdown\" auf Amazon Prime, in der unter anderem Schauspieler Eric Dane mitspielt (bekannt aus Grey's Anatomy). In dieser Serie wagt er in Folge sechs einen verr\u00fcckten Stunt auf einem Wohnwagen. Die Verfolgung eines Verd\u00e4chtigen f\u00fchrt die Taskforce, der Jensen Ackles Charakter Mark Meachum angeh\u00f6rt, zu einem Trailerpark in der W\u00fcste Kaliforniens. Bei der \u00dcberpr\u00fcfung eines Wohnwagens setzt sich dieser pl\u00f6tzlich in Bewegung. Jensen Ackles, im Inneren des Caravans gefangen, wagt w\u00e4hrend der Fahrt ein riskantes Man\u00f6ver, um vom Wohnwagen auf das Zugfahrzeug zu gelangen. Nat\u00fcrlich erh\u00e4lt der Schauspieler dabei Unterst\u00fctzung von einem Stuntdouble. Die Szenen zeigen dabei auf, wie gef\u00e4hrlich es w\u00e4re, wenn jemand sich w\u00e4hrend der Fahrt im Inneren eines Wohnwagens aufhalten w\u00fcrde. Nat\u00fcrlich ist die rasante Verfolgung mit dem Wohnwagen-Gespann in der Serie ein \u00fcbertriebenes Beispiel. Im wahren Leben w\u00fcrden leichte Kurven ausreichen, um Insassen und lose Gegenst\u00e4nde durch den Innenraum fliegen zu lassen. Vor allem, da vom Wohnwagen aus nicht ersichtlich ist, in welche Richtung das Zugfahrzeug f\u00e4hrt, anders als im Wohnmobil. Riskante Fahrman\u00f6ver mit Wohnwagen Dass nicht nur der Stunt riskant ist, sondern auch die wilde Fahrt mit dem Gespann, kann wohl jeder Wohnwagen-Fahrende verstehen. Wohnwagen angeh\u00e4ngt am Pkw k\u00f6nnen \u00e4hnlich einem Pendel schnell unkontrolliert von einer zur anderen Seite schwenken. Schnell schaukelt sich das Gespann so auf, bis der Wohnwagen kippt. Solche Unf\u00e4lle passieren regelm\u00e4\u00dfig auf der Autobahn. Drei einfache Tipps helfen gegen Pendeln Gewichte richtig verteilen : M\u00f6glichst tief und unter Einhaltung der St\u00fctzlast nahe der Achse packen. Gewicht reduzieren : Schwere Gegenst\u00e4nde besser in den Zugwagen packen. Fahrgeschwindigkeit anpassen . In der Serie Countdown ist nat\u00fcrlich alles nur Show. In der Realit\u00e4t sollten Sie Ihre Fahrweise stets an die Umgebung anpassen. Au\u00dferdem sind auf deutschen Autobahnen ohnehin maximal 100 km/h mit dem Gespann erlaubt. Wohnwagen als Nebenrollen in weiteren Serien Jensen Ackles liefert \u00fcbrigens eine weitere Verbindung zu Wohnwagen in Serien. In seiner Rolle als Beau Arlen spielte er den Sheriff in der Serie \"Big Skys\", der in einem Airstream wohnte. Einen solchen bewohnt auch sein Serien-Bruder Colter Shaw (Justin Hartley) in der Serie Tracker (Disney+).", + "summary": "

Für die Serie \"Countdown\" risikiert Schauspieler Jensen Ackles einen waghalsigen Stunt. Warum Sie das nicht nachmachen sollten.

", + "text": "Jensen Ackles dürfte spätestens seit seiner Rolle als Soldier Boy in der Amazon-Prime-Serie \"The Boys\" ein Begriff sein. Zum Staffelstart haben sein blanker Hintern und die enormen Views am ersten Tag mal kurz den Streamingdienst zum Erliegen gebracht. Hartgesottene Fans kennen ihn noch aus seiner Rolle als Dean Winchester in der Serie Supernatural. Stunt mit Wohnwagen Momentan läuft er mit seiner neuen Serie \"Countdown\" auf Amazon Prime, in der unter anderem Schauspieler Eric Dane mitspielt (bekannt aus Grey's Anatomy). In dieser Serie wagt er in Folge sechs einen verrückten Stunt auf einem Wohnwagen. Die Verfolgung eines Verdächtigen führt die Taskforce, der Jensen Ackles Charakter Mark Meachum angehört, zu einem Trailerpark in der Wüste Kaliforniens. Bei der Überprüfung eines Wohnwagens setzt sich dieser plötzlich in Bewegung. Jensen Ackles, im Inneren des Caravans gefangen, wagt während der Fahrt ein riskantes Manöver, um vom Wohnwagen auf das Zugfahrzeug zu gelangen. Natürlich erhält der Schauspieler dabei Unterstützung von einem Stuntdouble. Die Szenen zeigen dabei auf, wie gefährlich es wäre, wenn jemand sich während der Fahrt im Inneren eines Wohnwagens aufhalten würde. Natürlich ist die rasante Verfolgung mit dem Wohnwagen-Gespann in der Serie ein übertriebenes Beispiel. Im wahren Leben würden leichte Kurven ausreichen, um Insassen und lose Gegenstände durch den Innenraum fliegen zu lassen. Vor allem, da vom Wohnwagen aus nicht ersichtlich ist, in welche Richtung das Zugfahrzeug fährt, anders als im Wohnmobil. Riskante Fahrmanöver mit Wohnwagen Dass nicht nur der Stunt riskant ist, sondern auch die wilde Fahrt mit dem Gespann, kann wohl jeder Wohnwagen-Fahrende verstehen. Wohnwagen angehängt am Pkw können ähnlich einem Pendel schnell unkontrolliert von einer zur anderen Seite schwenken. Schnell schaukelt sich das Gespann so auf, bis der Wohnwagen kippt. Solche Unfälle passieren regelmäßig auf der Autobahn. Drei einfache Tipps helfen gegen Pendeln Gewichte richtig verteilen : Möglichst tief und unter Einhaltung der Stützlast nahe der Achse packen. Gewicht reduzieren : Schwere Gegenstände besser in den Zugwagen packen. Fahrgeschwindigkeit anpassen . In der Serie Countdown ist natürlich alles nur Show. In der Realität sollten Sie Ihre Fahrweise stets an die Umgebung anpassen. Außerdem sind auf deutschen Autobahnen ohnehin maximal 100 km/h mit dem Gespann erlaubt. Wohnwagen als Nebenrollen in weiteren Serien Jensen Ackles liefert übrigens eine weitere Verbindung zu Wohnwagen in Serien. In seiner Rolle als Beau Arlen spielte er den Sheriff in der Serie \"Big Skys\", der in einem Airstream wohnte. Einen solchen bewohnt auch sein Serien-Bruder Colter Shaw (Justin Hartley) in der Serie Tracker (Disney+).", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/stunt-auf-wohnwagen-jensen-ackles-countdown/", @@ -3977,10 +3977,10 @@ }, { "id": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/", - "title": "CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping \u2013 die beste Kombi?", + "title": "CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi?", "date": "Tue, 22 Jul 2025 14:10:00 +0200", - "summary": "

Gravelbikes und Camping: die perfekte Symbiose aus Freizeitsport, Abenteuergeist und Komfortbed\u00fcrfnis. Warum diese beiden so gut zusammenpassen und welche Hindernisse es zu \u00fcberkommen gilt, lesen und h\u00f6ren Sie hier.

", - "text": "Wer bei uns auf promobil.de unterwegs ist, wird bereits verstanden haben, dass Camping f\u00fcr uns die ultimative Urlaubsform ist. Vielleicht teilen Sie dieses Hobby sogar und k\u00f6nnen ebenso leidenschaftliche Pl\u00e4doyers f\u00fcr oder gegen private B\u00e4der auf Campingpl\u00e4tzen halten, wie unsere Redakteurinnen und Redakteure. Oder Sie schnuppern gerade frisch die erste Campingluft. Dann garantieren wir Ihnen: Camping wird Sie nie wieder loslassen . Doch wie steht es eigentlich um die sportlichen Hobbys der CamperInnen? Jeder kennt das Klischee des Campers , der in Flipflops und Badehose vor seinem Wohnmobil oder Wohnwagen im Liegestuhl liegt. Meist mit einer ordentlichen Plauze und einem beginnenden Sonnenbrand. Doch ist dieses Bild nicht vielleicht genau das: ein Klischee? Schauen wir uns auf den Stra\u00dfen um, hat inzwischen jeder dritte Camper die Fahrr\u00e4der dabei: am Heck, im Heck, auf der Deichsel oder dem Dach des Zugwagens. Sie sind das zweitliebste Fortbewegungsmittel der CamperInnen. Um hier gleich ein weiteres Klischee vorzubeugen: Nicht jeder Campende ist dabei mit Tiefeinsteiger-Rahmen und E-Motor am Zweirad unterwegs \u2013 auch wenn daran nat\u00fcrlich nichts Falsches zu finden ist. Im Jahr 2024 verkaufte der Fachhandel in Deutschland insgesamt 3,85 Millionen Fahrr\u00e4der , davon 53 Prozent Elektrofahrr\u00e4der (Quelle: ADFC). Elektrische Mountainbikes sind dabei immer noch der absolute Spitzenreiter, doch der Trend (vor allem in den St\u00e4dten) geht zum Gravelbike oder sogar Rennrad . Wer etwas auf sich und sein Image h\u00e4lt, hat so ein sportliches, schlankes Fahrrad mit gebogenem Lenker zumindest im Keller stehen. Und so stellen wir uns die Frage: Geh\u00f6rt ein Gravelbike bald in jede Heckgarage? Da wir Camping-ExpertInnen sind, die sich eher mit den Klischees \u00fcber Camping auseinandersetzen, haben wir uns f\u00fcr ein paar Antworten Felix und Moritz vom Podcast \"Faszination Rennrad\" eingeladen. Die beiden sollten uns erkl\u00e4ren, was es mit dem Trendsport bzw. dem Trend-Rad auf sich hat und warum wir unbedingt Teil des Trends sein sollten. Im Gegenzug beantworten wir den beiden ihre Fragen zum Thema Camping. Hier geht es zur Podcastfolge auf Spotify und hier k\u00f6nnen Sie direkt reinh\u00f6ren: Unsere Erkenntnisse: 7 Fragen, 7 Antworten Wir haben in diesem Podcast einige sehr grundlegende Fragen gestellt, die uns besch\u00e4ftigt haben. Hier haben wir sieben Fragen und deren Antworten kurz zusammengefasst: Warum sehen Rennrads\u00e4ttel so unbequem aus \u2013 und was bringen die \"Windelhosen\" wirklich? Rennrads\u00e4ttel sind so geformt, dass sie die Sitzposition des Fahrers unterst\u00fctzen und die Belastung optimieren. Die speziellen Radhosen verhindern Druckstellen und erh\u00f6hen den Komfort bei langen Fahrten. Was kostet der Einstieg ins Gravelbiken \u2013 und ab wann macht\u2019s wirklich Spa\u00df? Ein gutes Gravelbike startet bei etwa 1.000 Euro, f\u00fcr den optimalen Fahrspa\u00df empfiehlt sich ein Budget von 3.000 bis 5.000 Euro. Hier bekommst du ein leichteres Rad mit besserer Ausstattung und Komfort. Wie viele Kilometer f\u00e4hrt man am Anfang \u2013 und geh\u00f6ren H\u00f6henmeter gleich dazu? Einsteiger k\u00f6nnen mit 20-30 km beginnen und die Strecke langsam steigern. Wenn man sich fit f\u00fchlt, k\u00f6nnen ein paar H\u00f6henmeter hinzukommen, aber es geht zuerst um die Distanz. Was mache ich eigentlich drei Stunden lang im Sattel \u2013 au\u00dfer treten? Neben dem Treten kann man Musik h\u00f6ren, Podcasts genie\u00dfen oder sich einfach in der Umgebung verlieren. Der Fokus liegt auf der Bewegung und dem Naturerlebnis, obwohl es manchmal anstrengend wird. Gibt es Gravelbike-Strecken abseits von Stra\u00dfen und Verkehr? Ja, viele Gravelbike-Strecken f\u00fchren \u00fcber unbefestigte Wege wie Waldautobahnen, Wirtschaftswege und Feldwege, die einen gro\u00dfartigen Mix aus Abenteuer und Natur bieten. Was soll dieser gebogene Lenker am Rennrad \u2013 und wo greift man da \u00fcberhaupt hin? Der gebogene Lenker erm\u00f6glicht verschiedene Griffpositionen: flacher f\u00fcr Geschwindigkeit, mittig f\u00fcr mehr Komfort und oben f\u00fcr eine entspannte Haltung \u2013 ideal f\u00fcr l\u00e4ngere Fahrten. Wo zeigt sich die Verbindung von Rennrad und Camper am besten? F\u00fcr Felix und Moritz zeigt sich die Synergie zwischen Camping und dem Radsport besonders w\u00e4hrend der Tour de France, wo Fans in ihren Campern schon Tage vorher anreisen, um die Radrenn-Action hautnah direkt an der Strecke zu erleben \u2013 ein gro\u00dfes Event, das Menschen aus aller Welt zusammenbringt. Unsere Tipps f\u00fcr Gravelbike-Camping-Touren Wenn Sie den perfekten Camping-Ausflug mit dem Gravelbike planen, gibt es ein paar Dinge zu beachten: Die richtige Region w\u00e4hlen: Gravelbiken und Campen passen perfekt zusammen, vor allem in Regionen wie S\u00fcdtirol, die nicht nur fantastische Fahrradstrecken bieten, sondern auch eine ausgezeichnete Campinginfrastruktur. Diese Regionen sind bestens auf Radreisende vorbereitet, mit speziellen Unterstellm\u00f6glichkeiten und Fahrradwaschstationen. In Frankreich gibt es Regionen, die bekannt daf\u00fcr sind, Radsportler anzuziehen und eine angenehme Mischung aus sanften Steigungen und atemberaubenden Ausblicken zu bieten. Den richtigen Campingplatz ansteuern Neben der Region ist auch die Wahl des Campingplatzes entscheidend. Vom Stellplatz mit minimaler Infrastruktur bis hin zu speziell auf Mountainbiker und Outdoor-Freaks vorbereiteten Pl\u00e4tzen, die Fahrradwaschstationen und SUP-Verleih anbieten, gibt es viele Optionen. F\u00fcr die Entspannung nach der anstrengenden Tour k\u00f6nnen a Wellness-Campingpl\u00e4tze eine \u00dcberlegung wert sein. \u00dcberlegen Sie sich im Vorfeld, was Sie ben\u00f6tigen, was Sie mitbringen k\u00f6nnen und wollen, und welche zus\u00e4tzlichen Bed\u00fcrfnisse Ihre Mitreisenden haben. Wer mit Kindern reist, sollte vielleicht auf ein gutes Freizeitangebot achten. Und wer gerne schwimmt, sollte einen Campingplatz mit Seezugang in Betracht ziehen. Wahl des richtigen Fahrzeugs F\u00fcr Gravelbikende, die flexibel unterwegs sein wollen, ist die Wahl des richtigen Fahrzeugs entscheidend. Wer minimalistisch reist und viel drau\u00dfen unterwegs ist, wird mit einem Campervan in VW-Bus-Gr\u00f6\u00dfe gut zurechtkommen. Wenn mehr Komfort gew\u00fcnscht wird und man mit guten Stra\u00dfen erschlossenen Regionen reist oder gr\u00f6\u00dfere Ausr\u00fcstung dabei hat, kann ein kompakter Selim-Teilintegrierter eine gute Wahl sein. F\u00fcr diejenigen, die ein Zwischending suchen, ist ein Campingbus in Transportergr\u00f6\u00dfe ideal \u2013 hier gibt es oft ein kleines Bad und gen\u00fcgend Platz, um Fahrr\u00e4der (bis zu vier St\u00fcck) zu transportieren. Ein Camperbad eignet sich auch gut f\u00fcr das Aufh\u00e4ngen von schmutziger Ausr\u00fcstung nach einer langen Tour \u2013 selbst wenn man lieber in den Sanit\u00e4reinrichtungen des Campingplatzes duscht.", + "summary": "

Gravelbikes und Camping: die perfekte Symbiose aus Freizeitsport, Abenteuergeist und Komfortbedürfnis. Warum diese beiden so gut zusammenpassen und welche Hindernisse es zu überkommen gilt, lesen und hören Sie hier.

", + "text": "Wer bei uns auf promobil.de unterwegs ist, wird bereits verstanden haben, dass Camping für uns die ultimative Urlaubsform ist. Vielleicht teilen Sie dieses Hobby sogar und können ebenso leidenschaftliche Plädoyers für oder gegen private Bäder auf Campingplätzen halten, wie unsere Redakteurinnen und Redakteure. Oder Sie schnuppern gerade frisch die erste Campingluft. Dann garantieren wir Ihnen: Camping wird Sie nie wieder loslassen . Doch wie steht es eigentlich um die sportlichen Hobbys der CamperInnen? Jeder kennt das Klischee des Campers , der in Flipflops und Badehose vor seinem Wohnmobil oder Wohnwagen im Liegestuhl liegt. Meist mit einer ordentlichen Plauze und einem beginnenden Sonnenbrand. Doch ist dieses Bild nicht vielleicht genau das: ein Klischee? Schauen wir uns auf den Straßen um, hat inzwischen jeder dritte Camper die Fahrräder dabei: am Heck, im Heck, auf der Deichsel oder dem Dach des Zugwagens. Sie sind das zweitliebste Fortbewegungsmittel der CamperInnen. Um hier gleich ein weiteres Klischee vorzubeugen: Nicht jeder Campende ist dabei mit Tiefeinsteiger-Rahmen und E-Motor am Zweirad unterwegs – auch wenn daran natürlich nichts Falsches zu finden ist. Im Jahr 2024 verkaufte der Fachhandel in Deutschland insgesamt 3,85 Millionen Fahrräder , davon 53 Prozent Elektrofahrräder (Quelle: ADFC). Elektrische Mountainbikes sind dabei immer noch der absolute Spitzenreiter, doch der Trend (vor allem in den Städten) geht zum Gravelbike oder sogar Rennrad . Wer etwas auf sich und sein Image hält, hat so ein sportliches, schlankes Fahrrad mit gebogenem Lenker zumindest im Keller stehen. Und so stellen wir uns die Frage: Gehört ein Gravelbike bald in jede Heckgarage? Da wir Camping-ExpertInnen sind, die sich eher mit den Klischees über Camping auseinandersetzen, haben wir uns für ein paar Antworten Felix und Moritz vom Podcast \"Faszination Rennrad\" eingeladen. Die beiden sollten uns erklären, was es mit dem Trendsport bzw. dem Trend-Rad auf sich hat und warum wir unbedingt Teil des Trends sein sollten. Im Gegenzug beantworten wir den beiden ihre Fragen zum Thema Camping. Hier geht es zur Podcastfolge auf Spotify und hier können Sie direkt reinhören: Unsere Erkenntnisse: 7 Fragen, 7 Antworten Wir haben in diesem Podcast einige sehr grundlegende Fragen gestellt, die uns beschäftigt haben. Hier haben wir sieben Fragen und deren Antworten kurz zusammengefasst: Warum sehen Rennradsättel so unbequem aus – und was bringen die \"Windelhosen\" wirklich? Rennradsättel sind so geformt, dass sie die Sitzposition des Fahrers unterstützen und die Belastung optimieren. Die speziellen Radhosen verhindern Druckstellen und erhöhen den Komfort bei langen Fahrten. Was kostet der Einstieg ins Gravelbiken – und ab wann macht’s wirklich Spaß? Ein gutes Gravelbike startet bei etwa 1.000 Euro, für den optimalen Fahrspaß empfiehlt sich ein Budget von 3.000 bis 5.000 Euro. Hier bekommst du ein leichteres Rad mit besserer Ausstattung und Komfort. Wie viele Kilometer fährt man am Anfang – und gehören Höhenmeter gleich dazu? Einsteiger können mit 20-30 km beginnen und die Strecke langsam steigern. Wenn man sich fit fühlt, können ein paar Höhenmeter hinzukommen, aber es geht zuerst um die Distanz. Was mache ich eigentlich drei Stunden lang im Sattel – außer treten? Neben dem Treten kann man Musik hören, Podcasts genießen oder sich einfach in der Umgebung verlieren. Der Fokus liegt auf der Bewegung und dem Naturerlebnis, obwohl es manchmal anstrengend wird. Gibt es Gravelbike-Strecken abseits von Straßen und Verkehr? Ja, viele Gravelbike-Strecken führen über unbefestigte Wege wie Waldautobahnen, Wirtschaftswege und Feldwege, die einen großartigen Mix aus Abenteuer und Natur bieten. Was soll dieser gebogene Lenker am Rennrad – und wo greift man da überhaupt hin? Der gebogene Lenker ermöglicht verschiedene Griffpositionen: flacher für Geschwindigkeit, mittig für mehr Komfort und oben für eine entspannte Haltung – ideal für längere Fahrten. Wo zeigt sich die Verbindung von Rennrad und Camper am besten? Für Felix und Moritz zeigt sich die Synergie zwischen Camping und dem Radsport besonders während der Tour de France, wo Fans in ihren Campern schon Tage vorher anreisen, um die Radrenn-Action hautnah direkt an der Strecke zu erleben – ein großes Event, das Menschen aus aller Welt zusammenbringt. Unsere Tipps für Gravelbike-Camping-Touren Wenn Sie den perfekten Camping-Ausflug mit dem Gravelbike planen, gibt es ein paar Dinge zu beachten: Die richtige Region wählen: Gravelbiken und Campen passen perfekt zusammen, vor allem in Regionen wie Südtirol, die nicht nur fantastische Fahrradstrecken bieten, sondern auch eine ausgezeichnete Campinginfrastruktur. Diese Regionen sind bestens auf Radreisende vorbereitet, mit speziellen Unterstellmöglichkeiten und Fahrradwaschstationen. In Frankreich gibt es Regionen, die bekannt dafür sind, Radsportler anzuziehen und eine angenehme Mischung aus sanften Steigungen und atemberaubenden Ausblicken zu bieten. Den richtigen Campingplatz ansteuern Neben der Region ist auch die Wahl des Campingplatzes entscheidend. Vom Stellplatz mit minimaler Infrastruktur bis hin zu speziell auf Mountainbiker und Outdoor-Freaks vorbereiteten Plätzen, die Fahrradwaschstationen und SUP-Verleih anbieten, gibt es viele Optionen. Für die Entspannung nach der anstrengenden Tour können a Wellness-Campingplätze eine Überlegung wert sein. Überlegen Sie sich im Vorfeld, was Sie benötigen, was Sie mitbringen können und wollen, und welche zusätzlichen Bedürfnisse Ihre Mitreisenden haben. Wer mit Kindern reist, sollte vielleicht auf ein gutes Freizeitangebot achten. Und wer gerne schwimmt, sollte einen Campingplatz mit Seezugang in Betracht ziehen. Wahl des richtigen Fahrzeugs Für Gravelbikende, die flexibel unterwegs sein wollen, ist die Wahl des richtigen Fahrzeugs entscheidend. Wer minimalistisch reist und viel draußen unterwegs ist, wird mit einem Campervan in VW-Bus-Größe gut zurechtkommen. Wenn mehr Komfort gewünscht wird und man mit guten Straßen erschlossenen Regionen reist oder größere Ausrüstung dabei hat, kann ein kompakter Selim-Teilintegrierter eine gute Wahl sein. Für diejenigen, die ein Zwischending suchen, ist ein Campingbus in Transportergröße ideal – hier gibt es oft ein kleines Bad und genügend Platz, um Fahrräder (bis zu vier Stück) zu transportieren. Ein Camperbad eignet sich auch gut für das Aufhängen von schmutziger Ausrüstung nach einer langen Tour – selbst wenn man lieber in den Sanitäreinrichtungen des Campingplatzes duscht.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/clever-campen-podcast-wie-passen-gravelbikes-und-camping-zusamen/", @@ -4083,8 +4083,8 @@ "id": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/", "title": "Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen", "date": "Mon, 21 Jul 2025 09:55:00 +0200", - "summary": "

Jetzt Gutscheincode einl\u00f6sen und die App Stellplatz-Radar 30 Tage lang kostenfrei mit allen Funktionen nutzen. Und so geht\u2019s!

", - "text": "P\u00fcnktlich zum Sommer startet die Stellplatz-Radar-App eine exklusive Sonderaktion: Neue Nutzerinnen und Nutzer haben jetzt die M\u00f6glichkeit, 30 Tage lang alle Plus-Funktionen der App komplett kostenlos zu nutzen! L\u00f6se hierzu einfach den Gutscheincode SOMMER25 in der Stellplatz-Radar App ein. Die Stellplatz-Radar PLUS Features Spare mit dem Code SOMMER25 * und profitiere 30 Tage lang von den erweiterten Funktionen wie: Erweiterte Suche & Filter Suche gezielt nach Ausstattung (z. Strom, WLAN, Ver- & Entsorgung) Filtere beispielsweise nach Preis, Entfernung oder Bewertung Routenplanung f\u00fcr Camper Plane individuelle Routen f\u00fcr Wohnmobile & Campervans Integration von Stellpl\u00e4tzen direkt entlang der Route Favoriten & Merklisten Speichere Stellpl\u00e4tze in eigenen Listen f\u00fcr sp\u00e4tere Reisen Werbefreie Nutzung Keine Banner oder Popups \u2013 volle Konzentration auf die Stellplatzsuche Schnellere Ladezeiten & bessere Performance Optimiertes Nutzererlebnis ohne Wartezeiten Ideal f\u00fcr alle, die unterwegs komfortabel und entspannt reisen m\u00f6chten. So l\u00f6st du den Gutscheincode SOMMER25* direkt in deiner App ein App \u00fcber den QR-Code downloaden App \u00f6ffnen Melde dich \u00fcber das Men\u00fc an oder registriere dich neu und kostenlos \u00d6ffne den Men\u00fcpunkt \"Plus-Upgrade\" L\u00f6se den Code SOMMER25* \u00fcber die Schaltfl\u00e4che \"Gutscheincode einl\u00f6sen\" ein", + "summary": "

Jetzt Gutscheincode einlösen und die App Stellplatz-Radar 30 Tage lang kostenfrei mit allen Funktionen nutzen. Und so geht’s!

", + "text": "Pünktlich zum Sommer startet die Stellplatz-Radar-App eine exklusive Sonderaktion: Neue Nutzerinnen und Nutzer haben jetzt die Möglichkeit, 30 Tage lang alle Plus-Funktionen der App komplett kostenlos zu nutzen! Löse hierzu einfach den Gutscheincode SOMMER25 in der Stellplatz-Radar App ein. Die Stellplatz-Radar PLUS Features Spare mit dem Code SOMMER25 * und profitiere 30 Tage lang von den erweiterten Funktionen wie: Erweiterte Suche & Filter Suche gezielt nach Ausstattung (z. Strom, WLAN, Ver- & Entsorgung) Filtere beispielsweise nach Preis, Entfernung oder Bewertung Routenplanung für Camper Plane individuelle Routen für Wohnmobile & Campervans Integration von Stellplätzen direkt entlang der Route Favoriten & Merklisten Speichere Stellplätze in eigenen Listen für spätere Reisen Werbefreie Nutzung Keine Banner oder Popups – volle Konzentration auf die Stellplatzsuche Schnellere Ladezeiten & bessere Performance Optimiertes Nutzererlebnis ohne Wartezeiten Ideal für alle, die unterwegs komfortabel und entspannt reisen möchten. So löst du den Gutscheincode SOMMER25* direkt in deiner App ein App über den QR-Code downloaden App öffnen Melde dich über das Menü an oder registriere dich neu und kostenlos Öffne den Menüpunkt \"Plus-Upgrade\" Löse den Code SOMMER25* über die Schaltfläche \"Gutscheincode einlösen\" ein", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/stellplatz-radar-30-tage-kostenlos-alle-plus-funktionen/", @@ -4199,10 +4199,10 @@ }, { "id": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/", - "title": "Digitaler Fahrzeugschein f\u00fcr Camper: promobil testet den digitalen Fahrzeugschein", + "title": "Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein", "date": "Tue, 15 Jul 2025 16:20:00 +0200", - "summary": "

Der digitale Fahrzeugschein soll endlich Realit\u00e4t werden. Die Pilotphase l\u00e4uft seit April, im zweiten Halbjahr 2025 soll die App f\u00fcr alle Kfz-Inhaber nutzbar sein.

", - "text": "Seit Ende April l\u00e4uft die offizielle Pilotphase des digitalen Fahrzeugscheins in der i-Kfz-App des Bundesministeriums f\u00fcr Verkehr und des Kraftfahrt-Bundesamts. 2.500 Nutzer testen auf ihren Smartphones die Anwendung und ihre Kernfunktionen, geben Feedback und helfen, die Prozesse zu optimieren. promobil geh\u00f6rt zum exklusiven Kreis der Pilotnutzer. Der in der App hinterlegte digitale Fahrzeugschein bietet viele Vorteile: vereinfachte, \u00fcbersichtliche Darstellung der hinterlegten Werte automatische Erinnerung an f\u00e4llige HU-Termine M\u00f6glichkeit, den Fahrzeugschein digital und ortsunabh\u00e4ngig zu teilen. Halter mehrerer Fahrzeuge k\u00f6nnen immer alle Fahrzeugscheine mitf\u00fchren Fahrzeugschein kann \u00fcber weite Distanzen in der App geteilt werden, falls er in geliehenen Fahrzeugen fehlt So gut ist die i-Kfz-App abgesichert Die Sicherheitsvorkehrungen der i-Kfz-App \u00e4hneln denen moderner Banking-Apps. Um einen digitalen Fahrzeugschein in die App zu laden, ist die sichere Identifikation als Halter mittels E-ID \u00fcber den neuen Personalausweis notwendig. Erst wenn man sich als Halter ausgewiesen hat, werden die Fahrzeugdaten des jeweiligen Fahrzeuges vom Kraftfahrt-Bundesamt abgefragt und als digitaler Fahrzeugschein in der i-Kfz-App hinterlegt. Es wird den digitalen Fahrzeugschein f\u00fcr alle Fahrzeuge und Anh\u00e4nger geben. Das schlie\u00dft Wohnmobile, Campingbusse, Wohnwagen, Motorr\u00e4der, Roller oder Autos mit ein. Halter k\u00f6nnen sich alle Fahrzeugscheine f\u00fcr ihren Fuhrpark in die App laden und sie dort mit anderen Nutzern teilen. Das funktioniert in n\u00e4herem Umfeld per QR-Code oder \u00fcber gr\u00f6\u00dfere Distanzen mithilfe eines Links, der sich verschicken l\u00e4sst. Der Halter kann dabei festlegen, wie lange er den Fahrzeugschein teilen will, oder ihn unbegrenzt freigeben. Digitaler Fahrzeugschein f\u00fcr Campende Sein Funktionsumfang macht den digitalen Fahrzeugschein zum perfekten Werkzeug f\u00fcr Camperinnen und Camper. Wer die digitalen Dokumente f\u00fcr alle Fahrzeuge auf dem Smartphone dabei hat, kann beruhigt ins Wohnmobil steigen, auf dessen Hecktr\u00e4ger der Roller steht. Vorn im Zugfahrzeug m\u00fcssen sich Reisende nicht mehr fragen, wo hinten die Papiere f\u00fcr den Wohnwagen deponiert sind. Privates Verleihen von Campingfahrzeugen wird durch den digitalen Fahrzeugschein sorgenfreier. Noch befindet sich der digitale Fahrzeugschein in der Pilotphase. Doch laut dem Bundesministerium f\u00fcr Verkehr soll die i-Kfz-App nach Abschluss der Pilotphase voraussichtlich im Verlauf des zweiten Halbjahrs 2025 f\u00fcr die \u00f6ffentliche Nutzung angeboten werden. Dann soll diese f\u00fcr IOS und Android-Ger\u00e4te in den jeweiligen App-Stores erh\u00e4ltlich sein. G\u00fcltig ist der digitale Fahrzeugschein vorerst nur in Deutschland. Wer die Bundesrepublik verl\u00e4sst, sollte die Fahrzeugpapiere weiterhin mitf\u00fchren. Integration des digitalen F\u00fchrerscheins geplant In der ersten Phase l\u00e4sst sich in der i-Kfz-App nur der digitale Fahrzeugschein hinterlegen. Das Bundesministerium f\u00fcr Verkehr m\u00f6chte zuk\u00fcnftig auch den digitalen F\u00fchrerschein in die Anwendung integrieren. Er befindet sich in der Vorbereitungsphase f\u00fcr die nationale Einf\u00fchrung. Wann es den EU-weit g\u00fcltigen digitalen F\u00fchrerschein geben wird, h\u00e4ngt von der Verabschiedung und Umsetzung der vierten EU-F\u00fchrerscheinrichtlinie ab. Die Abstimmungsarbeiten zwischen Europ\u00e4ischem Rat und EU-Parlament sind mittlerweile abgeschlossen. Die neuen EU-F\u00fchrerscheinregeln werden derzeit rechtskonform in die Sprachen der 27 Mitgliedsl\u00e4nder \u00fcbersetzt, bevor Rat und Parlament dar\u00fcber offiziell abstimmen k\u00f6nnen. Inhalt der neuen Richtlinie ist auch die Erweiterung des B-F\u00fchrerscheins f\u00fcr Wohnmobile bis 4,25 Tonnen.", + "summary": "

Der digitale Fahrzeugschein soll endlich Realität werden. Die Pilotphase läuft seit April, im zweiten Halbjahr 2025 soll die App für alle Kfz-Inhaber nutzbar sein.

", + "text": "Seit Ende April läuft die offizielle Pilotphase des digitalen Fahrzeugscheins in der i-Kfz-App des Bundesministeriums für Verkehr und des Kraftfahrt-Bundesamts. 2.500 Nutzer testen auf ihren Smartphones die Anwendung und ihre Kernfunktionen, geben Feedback und helfen, die Prozesse zu optimieren. promobil gehört zum exklusiven Kreis der Pilotnutzer. Der in der App hinterlegte digitale Fahrzeugschein bietet viele Vorteile: vereinfachte, übersichtliche Darstellung der hinterlegten Werte automatische Erinnerung an fällige HU-Termine Möglichkeit, den Fahrzeugschein digital und ortsunabhängig zu teilen. Halter mehrerer Fahrzeuge können immer alle Fahrzeugscheine mitführen Fahrzeugschein kann über weite Distanzen in der App geteilt werden, falls er in geliehenen Fahrzeugen fehlt So gut ist die i-Kfz-App abgesichert Die Sicherheitsvorkehrungen der i-Kfz-App ähneln denen moderner Banking-Apps. Um einen digitalen Fahrzeugschein in die App zu laden, ist die sichere Identifikation als Halter mittels E-ID über den neuen Personalausweis notwendig. Erst wenn man sich als Halter ausgewiesen hat, werden die Fahrzeugdaten des jeweiligen Fahrzeuges vom Kraftfahrt-Bundesamt abgefragt und als digitaler Fahrzeugschein in der i-Kfz-App hinterlegt. Es wird den digitalen Fahrzeugschein für alle Fahrzeuge und Anhänger geben. Das schließt Wohnmobile, Campingbusse, Wohnwagen, Motorräder, Roller oder Autos mit ein. Halter können sich alle Fahrzeugscheine für ihren Fuhrpark in die App laden und sie dort mit anderen Nutzern teilen. Das funktioniert in näherem Umfeld per QR-Code oder über größere Distanzen mithilfe eines Links, der sich verschicken lässt. Der Halter kann dabei festlegen, wie lange er den Fahrzeugschein teilen will, oder ihn unbegrenzt freigeben. Digitaler Fahrzeugschein für Campende Sein Funktionsumfang macht den digitalen Fahrzeugschein zum perfekten Werkzeug für Camperinnen und Camper. Wer die digitalen Dokumente für alle Fahrzeuge auf dem Smartphone dabei hat, kann beruhigt ins Wohnmobil steigen, auf dessen Heckträger der Roller steht. Vorn im Zugfahrzeug müssen sich Reisende nicht mehr fragen, wo hinten die Papiere für den Wohnwagen deponiert sind. Privates Verleihen von Campingfahrzeugen wird durch den digitalen Fahrzeugschein sorgenfreier. Noch befindet sich der digitale Fahrzeugschein in der Pilotphase. Doch laut dem Bundesministerium für Verkehr soll die i-Kfz-App nach Abschluss der Pilotphase voraussichtlich im Verlauf des zweiten Halbjahrs 2025 für die öffentliche Nutzung angeboten werden. Dann soll diese für IOS und Android-Geräte in den jeweiligen App-Stores erhältlich sein. Gültig ist der digitale Fahrzeugschein vorerst nur in Deutschland. Wer die Bundesrepublik verlässt, sollte die Fahrzeugpapiere weiterhin mitführen. Integration des digitalen Führerscheins geplant In der ersten Phase lässt sich in der i-Kfz-App nur der digitale Fahrzeugschein hinterlegen. Das Bundesministerium für Verkehr möchte zukünftig auch den digitalen Führerschein in die Anwendung integrieren. Er befindet sich in der Vorbereitungsphase für die nationale Einführung. Wann es den EU-weit gültigen digitalen Führerschein geben wird, hängt von der Verabschiedung und Umsetzung der vierten EU-Führerscheinrichtlinie ab. Die Abstimmungsarbeiten zwischen Europäischem Rat und EU-Parlament sind mittlerweile abgeschlossen. Die neuen EU-Führerscheinregeln werden derzeit rechtskonform in die Sprachen der 27 Mitgliedsländer übersetzt, bevor Rat und Parlament darüber offiziell abstimmen können. Inhalt der neuen Richtlinie ist auch die Erweiterung des B-Führerscheins für Wohnmobile bis 4,25 Tonnen.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/", @@ -4223,8 +4223,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/1834994.jpg", - "alt": "Digitaler F\u00fchrerschein", - "caption": "Digitaler F\u00fchrerschein", + "alt": "Digitaler Führerschein", + "caption": "Digitaler Führerschein", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/weitere-ratgeber/wann-der-digitale-fahrzeugschein-fuer-alle-kommt/" }, @@ -4312,8 +4312,8 @@ "id": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/", "title": "Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil?", "date": "Sun, 13 Jul 2025 14:00:00 +0200", - "summary": "

Wie viel Bad ben\u00f6tigen Sie im Wohnmobil und wie intensiv nutzen Sie Waschbecken, Dusche und WC? Sind Sie mit Ihrem Bad zufrieden?

", - "text": "F\u00fcr viele Reisemobilisten ist das gut ausgestattete Bad ein wichtiges Kaufkriterium. Denn: Eine vollst\u00e4ndige Nasszelle mit Waschbecken, Dusche und Toilette macht Wohnmobilreisende autark. Der Luxus, eine Toilette und ein Waschbecken dabeizuhaben, geh\u00f6rt f\u00fcr die meisten zum Wohnmobilurlaub dazu. Doch schon bei der Dusche scheiden sich die Geister. Die einen sehen sie als Platzverschwendung, andere dagegen genie\u00dfen die Freiheit, die sich durch ein vollst\u00e4ndiges Bad im Wohnmobil bietet. Welches Bad hat Ihr Wohnmobil und wie nutzen Sie es? Wirklich bequem duschen l\u00e4sst sich nicht in jedem Wohnmobil. Oft ist die Nasszelle in einem Raum auf der Fahrerseite zwischen Sitzgruppe und Bett positioniert. Darin ist die Duschtasse gleichzeitig der Boden. H\u00e4ufig wird so der ganze Raum zur Dusche, mit einer Faltwand oder einem Duschvorhang als Spritzschutz. Eine clevere L\u00f6sung f\u00fcr mehr Platz beim Duschen bietet das Schwenkbad: Darin wird meist das an einer Wand montierte Waschbecken zum Duschen seitlich \u00fcber die Toilette geschoben. An der R\u00fcckseite der Wand befindet sich die Duscharmatur, und sie dient gleichzeitig als Duschabtrennung. Erg\u00e4nzend gibt es h\u00e4ufig noch eine Klappwand oder einen Duschvorhang, der die \u00fcbrigen W\u00e4nde und die Badt\u00fcr vor Feuchtigkeit sch\u00fctzt. Deutlich mehr Komfort bieten Wohnmobile mit einer abgetrennten Duschkabine im Bad oder separat, etwa auf der gegen\u00fcberliegenden Fahrzeugseite. Luxuri\u00f6s sind Raumb\u00e4der mit eigenem Toilettenraum und Duschkabine. Oft haben diese einen direkten Zugang zum Schlafzimmer. Neben den genannten Varianten gibt es unz\u00e4hlige weitere Badl\u00f6sungen im Wohnmobil: vom platzsparenden Kompaktbad mit Duscherweiterung in den Flur hinein bis zum Heckbad \u00fcber die gesamte Fahrzeugbreite. Wie nutzen Sie das Bad in Ihrem Wohnmobil? Dienen Waschbecken, Toilette und Dusche nur als Backup, nutzen Sie nur einzelne Einrichtungen oder ausschlie\u00dflich die eigene Nasszelle? Mehr zu den Badvarianten in Wohnmobilen lesen Sie hier: B\u00e4der im Wohnmobil . Wie zufrieden sind Sie mit dem Bad in Ihrem Wohnmobil? Das Waschbecken ist zu klein, der Duschvorhang klebt am K\u00f6rper und auf dem Klo baumeln die Beine. Was f\u00fcr den einen Camper wie gemacht ist, sorgt beim anderen f\u00fcr Verdruss. Meist erkennt man die Schwachstellen im Wohnmobilbad erst dann, wenn man zum ersten Mal mit dem zu kurzen Duschschlauch k\u00e4mpft oder sich vom Thron aus zur Klopapierrolle verrenkt. Auch fehlende Handtuchhaken und L\u00fcftungs\u00f6ffnungen, knapper Stauraum oder windige Armaturen k\u00f6nnen f\u00fcr Unmut im Wohnmobilbad sorgen. Was nervt Sie am Bad in Ihrem Wohnmobil? Haben Sie Dinge selbst optimiert oder war alles von Anfang an in Ordnung f\u00fcr Ihren Anspruch? F\u00fcr welches Bad w\u00fcrden Sie sich beim Neukauf entscheiden? Bei der Entscheidung f\u00fcr ein neues Wohnmobil spielt die Frage nach dem Bad und seiner Gr\u00f6\u00dfe eine ma\u00dfgebliche Rolle. Erfahrenen Campern f\u00e4llt die Auswahl deutlich leichter als Neueinsteigern ohne einschl\u00e4gige Erfahrungen. Doch auch wer sich schon zu den alten Hasen z\u00e4hlt, sollte seine aktuellen Bed\u00fcrfnisse reflektieren und gleichzeitig an die Zukunft denken: Reisegewohnheiten k\u00f6nnen sich \u00e4ndern und damit kann auch das Bad einen neuen Stellenwert bekommen. Wer etwa irgendwann von der Hauptsaison auf die Nebensaison umschwenkt, kann in manchen Regionen schon Mitte September vor verschlossenen Campingplatzt\u00fcren stehen und ist pl\u00f6tzlich mit Stellpl\u00e4tzen ohne Sanit\u00e4rinfrastruktur konfrontiert. Oder man entdeckt St\u00e4dtereisen mit dem Wohnmobil f\u00fcr sich und \u00fcbernachtet gern mitten im Zentrum auf einfachen Stellpl\u00e4tzen. promobil will herausfinden: Welchen Stellenwert hatte das Bad f\u00fcr Sie bei der Auswahl Ihres Wohnmobils? F\u00fcr welche Badl\u00f6sung w\u00fcrden Sie sich heute beim Kauf eines Wohnmobils entscheiden? Schreiben Sie uns! Bei der Umfrage mitmachen und gewinnen! Senden Sie uns Ihre Meinung bis zum 21. Juli 2025 per E-Mail an thema-des-monats@promobil.de . Unter allen Einsendungen verlosen wir eines unserer aktuellen promobil-Sonderhefte nach Wunsch und Verf\u00fcgbarkeit. Bitte f\u00fcgen Sie Ihrer Einsendung m\u00f6glichst ein Portr\u00e4tfoto von sich bei, das wir zusammen mit Ihrem Meinungsbeitrag in promobil ver\u00f6ffentlichen d\u00fcrfen; Ihre Chance auf Ver\u00f6ffentlichung erh\u00f6ht sich dadurch. Datenschutzhinweis : Wenn Sie uns eine Anfrage stellen oder ein Feedback geben, speichern wir Ihre Kontaktdaten und Ihren Text (Art. 6 Abs. 1 lit. f DSGVO). Ihre Zuschrift hilft uns, unser Informationsangebot in unseren Medien zu verbessern. Wir geben Ihre Daten nicht an Dritte weiter. Wir behalten uns vor, Ihre Zuschrift zusammen mit Ihrem Namen in unseren Zeitschriften promobil und CARAVANING und gegebenenfalls auch auf unserer Website www.promobil.de, sowie unseren Social-Media-Kan\u00e4len zu ver\u00f6ffentlichen. Sie k\u00f6nnen der Speicherung Ihrer Daten jederzeit mit Wirkung f\u00fcr die Zukunft widersprechen ( datenschutz@motorpresse.de ). Wir werden dann die gespeicherten Daten umgehend l\u00f6schen. Im \u00dcbrigen l\u00f6schen wir Ihre Daten sp\u00e4testens nach Ablauf eines halben Jahres bzw. im Falle einer Ver\u00f6ffentlichung im Internet, wenn wir der Ansicht sind, dass die Frage nicht mehr interessant f\u00fcr unsere NutzerInnen ist. Mehr zum Datenschutz unter www.promobil.de/datenschutz .", + "summary": "

Wie viel Bad benötigen Sie im Wohnmobil und wie intensiv nutzen Sie Waschbecken, Dusche und WC? Sind Sie mit Ihrem Bad zufrieden?

", + "text": "Für viele Reisemobilisten ist das gut ausgestattete Bad ein wichtiges Kaufkriterium. Denn: Eine vollständige Nasszelle mit Waschbecken, Dusche und Toilette macht Wohnmobilreisende autark. Der Luxus, eine Toilette und ein Waschbecken dabeizuhaben, gehört für die meisten zum Wohnmobilurlaub dazu. Doch schon bei der Dusche scheiden sich die Geister. Die einen sehen sie als Platzverschwendung, andere dagegen genießen die Freiheit, die sich durch ein vollständiges Bad im Wohnmobil bietet. Welches Bad hat Ihr Wohnmobil und wie nutzen Sie es? Wirklich bequem duschen lässt sich nicht in jedem Wohnmobil. Oft ist die Nasszelle in einem Raum auf der Fahrerseite zwischen Sitzgruppe und Bett positioniert. Darin ist die Duschtasse gleichzeitig der Boden. Häufig wird so der ganze Raum zur Dusche, mit einer Faltwand oder einem Duschvorhang als Spritzschutz. Eine clevere Lösung für mehr Platz beim Duschen bietet das Schwenkbad: Darin wird meist das an einer Wand montierte Waschbecken zum Duschen seitlich über die Toilette geschoben. An der Rückseite der Wand befindet sich die Duscharmatur, und sie dient gleichzeitig als Duschabtrennung. Ergänzend gibt es häufig noch eine Klappwand oder einen Duschvorhang, der die übrigen Wände und die Badtür vor Feuchtigkeit schützt. Deutlich mehr Komfort bieten Wohnmobile mit einer abgetrennten Duschkabine im Bad oder separat, etwa auf der gegenüberliegenden Fahrzeugseite. Luxuriös sind Raumbäder mit eigenem Toilettenraum und Duschkabine. Oft haben diese einen direkten Zugang zum Schlafzimmer. Neben den genannten Varianten gibt es unzählige weitere Badlösungen im Wohnmobil: vom platzsparenden Kompaktbad mit Duscherweiterung in den Flur hinein bis zum Heckbad über die gesamte Fahrzeugbreite. Wie nutzen Sie das Bad in Ihrem Wohnmobil? Dienen Waschbecken, Toilette und Dusche nur als Backup, nutzen Sie nur einzelne Einrichtungen oder ausschließlich die eigene Nasszelle? Mehr zu den Badvarianten in Wohnmobilen lesen Sie hier: Bäder im Wohnmobil . Wie zufrieden sind Sie mit dem Bad in Ihrem Wohnmobil? Das Waschbecken ist zu klein, der Duschvorhang klebt am Körper und auf dem Klo baumeln die Beine. Was für den einen Camper wie gemacht ist, sorgt beim anderen für Verdruss. Meist erkennt man die Schwachstellen im Wohnmobilbad erst dann, wenn man zum ersten Mal mit dem zu kurzen Duschschlauch kämpft oder sich vom Thron aus zur Klopapierrolle verrenkt. Auch fehlende Handtuchhaken und Lüftungsöffnungen, knapper Stauraum oder windige Armaturen können für Unmut im Wohnmobilbad sorgen. Was nervt Sie am Bad in Ihrem Wohnmobil? Haben Sie Dinge selbst optimiert oder war alles von Anfang an in Ordnung für Ihren Anspruch? Für welches Bad würden Sie sich beim Neukauf entscheiden? Bei der Entscheidung für ein neues Wohnmobil spielt die Frage nach dem Bad und seiner Größe eine maßgebliche Rolle. Erfahrenen Campern fällt die Auswahl deutlich leichter als Neueinsteigern ohne einschlägige Erfahrungen. Doch auch wer sich schon zu den alten Hasen zählt, sollte seine aktuellen Bedürfnisse reflektieren und gleichzeitig an die Zukunft denken: Reisegewohnheiten können sich ändern und damit kann auch das Bad einen neuen Stellenwert bekommen. Wer etwa irgendwann von der Hauptsaison auf die Nebensaison umschwenkt, kann in manchen Regionen schon Mitte September vor verschlossenen Campingplatztüren stehen und ist plötzlich mit Stellplätzen ohne Sanitärinfrastruktur konfrontiert. Oder man entdeckt Städtereisen mit dem Wohnmobil für sich und übernachtet gern mitten im Zentrum auf einfachen Stellplätzen. promobil will herausfinden: Welchen Stellenwert hatte das Bad für Sie bei der Auswahl Ihres Wohnmobils? Für welche Badlösung würden Sie sich heute beim Kauf eines Wohnmobils entscheiden? Schreiben Sie uns! Bei der Umfrage mitmachen und gewinnen! Senden Sie uns Ihre Meinung bis zum 21. Juli 2025 per E-Mail an thema-des-monats@promobil.de . Unter allen Einsendungen verlosen wir eines unserer aktuellen promobil-Sonderhefte nach Wunsch und Verfügbarkeit. Bitte fügen Sie Ihrer Einsendung möglichst ein Porträtfoto von sich bei, das wir zusammen mit Ihrem Meinungsbeitrag in promobil veröffentlichen dürfen; Ihre Chance auf Veröffentlichung erhöht sich dadurch. Datenschutzhinweis : Wenn Sie uns eine Anfrage stellen oder ein Feedback geben, speichern wir Ihre Kontaktdaten und Ihren Text (Art. 6 Abs. 1 lit. f DSGVO). Ihre Zuschrift hilft uns, unser Informationsangebot in unseren Medien zu verbessern. Wir geben Ihre Daten nicht an Dritte weiter. Wir behalten uns vor, Ihre Zuschrift zusammen mit Ihrem Namen in unseren Zeitschriften promobil und CARAVANING und gegebenenfalls auch auf unserer Website www.promobil.de, sowie unseren Social-Media-Kanälen zu veröffentlichen. Sie können der Speicherung Ihrer Daten jederzeit mit Wirkung für die Zukunft widersprechen ( datenschutz@motorpresse.de ). Wir werden dann die gespeicherten Daten umgehend löschen. Im Übrigen löschen wir Ihre Daten spätestens nach Ablauf eines halben Jahres bzw. im Falle einer Veröffentlichung im Internet, wenn wir der Ansicht sind, dass die Frage nicht mehr interessant für unsere NutzerInnen ist. Mehr zum Datenschutz unter www.promobil.de/datenschutz .", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/", @@ -4404,15 +4404,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1555475.jpg", - "alt": "Hagelsch\u00e4den am Wohnmobil", - "caption": "Hagelsch\u00e4den am Wohnmobil", + "alt": "Hagelschäden am Wohnmobil", + "caption": "Hagelschäden am Wohnmobil", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2153790.jpg", - "alt": "Sanit\u00e4r-Autarkie - Frischwasser", - "caption": "Sanit\u00e4r-Autarkie - Frischwasser", + "alt": "Sanitär-Autarkie - Frischwasser", + "caption": "Sanitär-Autarkie - Frischwasser", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" }, @@ -4425,8 +4425,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2147777.jpg", - "alt": "Adria Super Twin etnh\u00fcllung auf der Messe", - "caption": "Adria Super Twin etnh\u00fcllung auf der Messe", + "alt": "Adria Super Twin etnhüllung auf der Messe", + "caption": "Adria Super Twin etnhüllung auf der Messe", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/weitere-ratgeber/umfrage-welches-bad-brauchen-sie-im-wohnmobil/" }, @@ -4479,8 +4479,8 @@ "id": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/", "title": "Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee", "date": "Sat, 12 Jul 2025 14:00:00 +0200", - "summary": "

F\u00fcr viele Camperinnen und Camper kann der Tag erst nach einer guten Tasse Kaffee beginnen. So bereiten Sie Ihren Kaffee im Wohnmobil zu!

", - "text": "Kaffee ist f\u00fcr viele der Wachmacher Nummer Eins. Auf dem Camping- oder Stellplatz kann er auch zur Kontaktaufnahme dienen. Wohl dem, der seinen Camping- oder Stellplatznachbarn einen Espresso, einen Cappuccino oder einen gepflegten Filterkaffee anbieten kann. Doch wie bei vielem sind auch beim Kaffeegenuss die Geschm\u00e4cker verschieden. Wir haben Sie gefragt, welches Ihr bevorzugtes Hei\u00dfgetr\u00e4nk im Campingurlaub ist und wie Sie es zubereiten. Die Antworten finden Sie unten . Haben Sie eine Kaffeemaschine im Wohnmobil? Die einen schw\u00f6ren auf technisch ausgefeiltes Equipment mit automatischem Milchaufsch\u00e4umer, andere vertrauen auf die gute alte Filtermaschine oder den Perlator von Bialetti und Co. Puristen br\u00fchen mit hei\u00dfem Wasser in der French Press oder mit einem Filterhalter selbst auf. Ganz Abgebr\u00fchte machen sich das Leben mit Instant-Pulver leicht. Welche Methoden zum Kaffeekochen nutzen Sie im Campingurlaub? Wo verstauen Sie Ihr Kaffee-Equipment w\u00e4hrend der Fahrt im Wohnmobil? Viele Wohnmobilhersteller bieten inzwischen clevere L\u00f6sungen, um eine Kaffeemaschine im Wohnmobil gut zu verstauen. Absenkbare Schr\u00e4nke oder spezielle Regale erleichtern Kaffeeliebhabern das Leben im Wohnmobil. Zum Teil kann man die Kapselmaschine samt Kapselhalter gleich mitbestellen. Haben Sie eine spezielle L\u00f6sung f\u00fcr den Kaffeemaschinentransport im Wohnmobil? Oder haben Sie sich selbst einen geeigneten Ort f\u00fcr die Unterbringung w\u00e4hrend der Fahrt gesucht? Ihre Antworten zum Kaffeegenuss Karin und Harald Pauler: Ein Wasserkessel f\u00fcr den Gasherd, Filter und Filtert\u00fcte; so bereiten wir unseren Kaffee im Wohnmobil seit mehr als 30 Jahren zu. Und am Nachmittag gerne auch mal einen Espresso aus der alten Espressokanne. Ingrid und Hannes Drechsler: F\u00fcr eine schmale Kapselmaschine mit integriertem Milchsch\u00e4umer haben wir auf Arbeitsh\u00f6he im Apothekerschrank einen Auszug montiert. W\u00e4hrend der Fahrt dient Schaumstoff zum Schutz und das Fach wird mit einem Schieber fixiert. Utz Graafmann: Mit einem Briki, einem kleinen Mokkak\u00e4nnchen, bereiten wir auf dem Gasherd griechischen Kaffee zu. Er hat ein tolles Aroma und einen perfekten Kaimaki, also die \"Crema\" beim griechischen Kaffee. Urlaubserinnerungen an Griechenland inklusive. Gertrudis Laggai: Meinen Espressokocher verwende ich f\u00fcr normalen Kaffee mit Kaffeepads. Das schmeckt hervorragend und der Kocher ist schnell zu reinigen, da sich kein loses Kaffeepulver darin befindet. So habe ich einen Kocher f\u00fcr normalen Kaffee und f\u00fcr Espresso dabei. Allerdings gibt es nicht in allen L\u00e4ndern Kaffeepads, daher informieren und gen\u00fcgend Pads mitnehmen. Urs Bichler: Als echte Kaffeeliebhaber haben wir viele M\u00f6glichkeiten ausprobiert. Heute genie\u00dfen wir unseren Kaffee aus einer Mini-Nespresso-Maschine, die wir mit Landstrom oder mit einer Eco-Flow-Powerstation betreiben. Sie hat ihren festen Platz an der K\u00fcchenwand in einer Halterung von K\u00e4psele. Margret und Werner: Unsere Coffee B Maschine betreiben wir mit Landstrom, ansonsten gibt es zur Not l\u00f6slichen Kaffee. Die Kaffee-Kugeln sind kompostierbar und somit nachhaltig. Carsten Languth: Wir benutzen ein Kaffeekonzentrat von Moin. Wasser kochen, einen Messl\u00f6ffel hinzuf\u00fcgen und fertig. Es gibt viele Sorten und die kleinen Fl\u00e4schchen sind leicht zu verstauen. Kerstin Anders: Vor drei Jahren waren wir noch mit Instantkaffee unterwegs. Inzwischen kaufen wir unterwegs bei kleinen, lokalen R\u00f6stereien Kaffee. Der wird in der French Press mit Thermofunktion zubereitet. Manche R\u00f6sterei bietet auch Tassenkaffeefilter an. Die klemmt man in die Tasse und \u00fcbergie\u00dft sie mit hei\u00dfem Wasser. Gerd Lowig: Ich mahle den Kaffee in einer Handm\u00fchle und bereite ihn in der French Press zu. Harald Homm: Mit Landstrom ist unser Saeco-Vollautomat die erste Wahl. Stehen wir autark, wird die French Press von Waldwerk ausgepackt. Walter Kaiser: Als Gourmet-Banausen (in Bezug auf die Kaffeezubereitung im Camper-Van) verwenden wir Nescaf\u00e9 Gold. Ganz so \u00fcbel ist das Gebr\u00e4u nicht, kochendes Wasser gibt es immer und es steht nichts herum und man muss keine Kaffeereste entsorgen. Birte und Rainer: Echten Kaffee wie bei Oma gibt es bei uns. Kessel, Wasser kochen, Filter auf Thermoskanne, Kaffeepulver aufgie\u00dfen. Der Vorteil ist, dass so gleich ein Liter Kaffee fertig ist und der Nachbar gerne einen Becher mittrinken darf.", + "summary": "

Für viele Camperinnen und Camper kann der Tag erst nach einer guten Tasse Kaffee beginnen. So bereiten Sie Ihren Kaffee im Wohnmobil zu!

", + "text": "Kaffee ist für viele der Wachmacher Nummer Eins. Auf dem Camping- oder Stellplatz kann er auch zur Kontaktaufnahme dienen. Wohl dem, der seinen Camping- oder Stellplatznachbarn einen Espresso, einen Cappuccino oder einen gepflegten Filterkaffee anbieten kann. Doch wie bei vielem sind auch beim Kaffeegenuss die Geschmäcker verschieden. Wir haben Sie gefragt, welches Ihr bevorzugtes Heißgetränk im Campingurlaub ist und wie Sie es zubereiten. Die Antworten finden Sie unten . Haben Sie eine Kaffeemaschine im Wohnmobil? Die einen schwören auf technisch ausgefeiltes Equipment mit automatischem Milchaufschäumer, andere vertrauen auf die gute alte Filtermaschine oder den Perlator von Bialetti und Co. Puristen brühen mit heißem Wasser in der French Press oder mit einem Filterhalter selbst auf. Ganz Abgebrühte machen sich das Leben mit Instant-Pulver leicht. Welche Methoden zum Kaffeekochen nutzen Sie im Campingurlaub? Wo verstauen Sie Ihr Kaffee-Equipment während der Fahrt im Wohnmobil? Viele Wohnmobilhersteller bieten inzwischen clevere Lösungen, um eine Kaffeemaschine im Wohnmobil gut zu verstauen. Absenkbare Schränke oder spezielle Regale erleichtern Kaffeeliebhabern das Leben im Wohnmobil. Zum Teil kann man die Kapselmaschine samt Kapselhalter gleich mitbestellen. Haben Sie eine spezielle Lösung für den Kaffeemaschinentransport im Wohnmobil? Oder haben Sie sich selbst einen geeigneten Ort für die Unterbringung während der Fahrt gesucht? Ihre Antworten zum Kaffeegenuss Karin und Harald Pauler: Ein Wasserkessel für den Gasherd, Filter und Filtertüte; so bereiten wir unseren Kaffee im Wohnmobil seit mehr als 30 Jahren zu. Und am Nachmittag gerne auch mal einen Espresso aus der alten Espressokanne. Ingrid und Hannes Drechsler: Für eine schmale Kapselmaschine mit integriertem Milchschäumer haben wir auf Arbeitshöhe im Apothekerschrank einen Auszug montiert. Während der Fahrt dient Schaumstoff zum Schutz und das Fach wird mit einem Schieber fixiert. Utz Graafmann: Mit einem Briki, einem kleinen Mokkakännchen, bereiten wir auf dem Gasherd griechischen Kaffee zu. Er hat ein tolles Aroma und einen perfekten Kaimaki, also die \"Crema\" beim griechischen Kaffee. Urlaubserinnerungen an Griechenland inklusive. Gertrudis Laggai: Meinen Espressokocher verwende ich für normalen Kaffee mit Kaffeepads. Das schmeckt hervorragend und der Kocher ist schnell zu reinigen, da sich kein loses Kaffeepulver darin befindet. So habe ich einen Kocher für normalen Kaffee und für Espresso dabei. Allerdings gibt es nicht in allen Ländern Kaffeepads, daher informieren und genügend Pads mitnehmen. Urs Bichler: Als echte Kaffeeliebhaber haben wir viele Möglichkeiten ausprobiert. Heute genießen wir unseren Kaffee aus einer Mini-Nespresso-Maschine, die wir mit Landstrom oder mit einer Eco-Flow-Powerstation betreiben. Sie hat ihren festen Platz an der Küchenwand in einer Halterung von Käpsele. Margret und Werner: Unsere Coffee B Maschine betreiben wir mit Landstrom, ansonsten gibt es zur Not löslichen Kaffee. Die Kaffee-Kugeln sind kompostierbar und somit nachhaltig. Carsten Languth: Wir benutzen ein Kaffeekonzentrat von Moin. Wasser kochen, einen Messlöffel hinzufügen und fertig. Es gibt viele Sorten und die kleinen Fläschchen sind leicht zu verstauen. Kerstin Anders: Vor drei Jahren waren wir noch mit Instantkaffee unterwegs. Inzwischen kaufen wir unterwegs bei kleinen, lokalen Röstereien Kaffee. Der wird in der French Press mit Thermofunktion zubereitet. Manche Rösterei bietet auch Tassenkaffeefilter an. Die klemmt man in die Tasse und übergießt sie mit heißem Wasser. Gerd Lowig: Ich mahle den Kaffee in einer Handmühle und bereite ihn in der French Press zu. Harald Homm: Mit Landstrom ist unser Saeco-Vollautomat die erste Wahl. Stehen wir autark, wird die French Press von Waldwerk ausgepackt. Walter Kaiser: Als Gourmet-Banausen (in Bezug auf die Kaffeezubereitung im Camper-Van) verwenden wir Nescafé Gold. Ganz so übel ist das Gebräu nicht, kochendes Wasser gibt es immer und es steht nichts herum und man muss keine Kaffeereste entsorgen. Birte und Rainer: Echten Kaffee wie bei Oma gibt es bei uns. Kessel, Wasser kochen, Filter auf Thermoskanne, Kaffeepulver aufgießen. Der Vorteil ist, dass so gleich ein Liter Kaffee fertig ist und der Nachbar gerne einen Becher mittrinken darf.", "tags": [], "status": "Online", "link": "https://www.promobil.de/weitere-ratgeber/umfrage-kaffeegenuss-camping-wohnmobil-wohnwagen/", @@ -4584,7 +4584,7 @@ "title": "Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt", "date": "Sat, 12 Jul 2025 11:00:00 +0200", "summary": "

Privates Bad am Stellplatz: Komfort pur oder Verrat am Camping? Zwei Redakteur:innen diskutieren, was das Mietbad wirklich bedeutet.

", - "text": "Ein privates Mietbad auf der Campingplatz-Parzelle ist wie ein VIP-Bereich f\u00fcrs Z\u00e4hneputzen \u2013 nur ohne T\u00fcrsteher. Statt Flipflop-Marsch durchs Morgengrauen geht\u2019s direkt von der Matratze aufs eigene WC. Dusche, Spiegel, Klobrille \u2013 alles da, alles sauber, alles zur alleinigen Nutzung. Privatbad auf dem Campingplatz \u2013 ja oder nein? Die einen feiern die neue Form des Komforts als zeitgem\u00e4\u00dfes Angebot. Die anderen kritisieren: Mietb\u00e4der f\u00f6rdern das Eigenbr\u00f6tlertum, steigern Kosten und entfremden vom klassischen Campinggef\u00fchl. Ist ein privates Bad direkt an der Parzelle ein Fortschritt oder ein R\u00fcckschritt f\u00fcrs Camping? An kaum einem Thema scheiden sich die Geister unter Camperinnen und Campern so sehr wie an dieser Frage. Zwischen Naturn\u00e4he und Komfortanspruch, Gemeinschaft und R\u00fcckzug \u2013 Zwei Redaktionsmeinungen, zwei Perspektiven, ein Thema: Wie viel Privat-Bad vertr\u00e4gt das Camping? Philipp Heise: Klare Kante gegen Mietb\u00e4der! Die Campingwelt ver\u00e4ndert sich \u2013 und nicht jede Entwicklung ist ein Fortschritt. Mietb\u00e4der auf der eigenen Parzelle versprechen auf den ersten Blick Komfort, doch sie werfen auch grundlegende Fragen auf, wohin sich Camping entwickelt. Als Fachredakteur, der sein Hobby lebt, sehe ich den Trend zu privaten Sanit\u00e4rkabinen mit Sorge \u2013 und das nicht nur, weil ich am liebsten unparzelliert oder bestenfalls frei stehe beim Campen. Warum? Weil Mietb\u00e4der f\u00fcr mich eine Abkehr vom eigentlichen Wesen des Campings bedeuten. Verlust des Camping-Gef\u00fchls Camping war immer mehr als nur eine Urlaubsform. Es ist ein Lebensgef\u00fchl. Es geht um Naturverbundenheit und auch um eine materielle Reduktion, die hilft, dem Alltag in einer \u00dcberflussgesellschaft zu entfliehen. Wer sich ein eigenes abgeschlossenes Bad direkt an die Parzelle mietet, grenzt sich ab. Der Schritt zur abgeschotteten Ferienwohnung im Gr\u00fcnen ist dann nicht mehr weit. Es entsteht ein k\u00fcnstlicher Komfortraum, der mit klassischem Camping wenig zu tun hat. Warum noch mit dem Freizeitmobil verreisen, wenn man sich vor Ort dann die Annehmlichkeiten eines Ferienapartments nachbaut? Weniger Gemeinschaft Camping lebt von Begegnung. Der morgendliche Plausch am Waschhaus, das Z\u00e4hneputzen neben anderen Reisenden aus aller Welt \u2013 das sind die kleinen Momente, die verbinden. Mietb\u00e4der f\u00f6rdern jedoch die Abschottung. Wer alles privat hat, begegnet niemandem mehr zuf\u00e4llig. Der Campingplatz verkommt so zur Parzellenansammlung mit eigenem Sanit\u00e4rtrakt. H\u00f6here Kosten \u2013 f\u00fcr Camper und Betreiber Mietb\u00e4der treiben die Preise hoch \u2013 f\u00fcr Stellpl\u00e4tze wie f\u00fcr deren Wartung. Camper, die auf diese Form der \"Luxus-Parzelle\" verzichten m\u00f6chten, zahlen oft mit dank insgesamt h\u00f6herer Gesamtpreise. F\u00fcr Betreiber bedeuten der Unterhalt und die Reinigung privater Sanit\u00e4ranlagen einen erheblichen Mehraufwand. Widerspruch zur Naturverbundenheit Camping steht f\u00fcr Reduktion, f\u00fcr bewusstes Leben in und mit der Natur. Die Errichtung privater B\u00e4der auf jeder Parzelle wirkt diesem Gedanken entgegen: versiegelte Fl\u00e4chen, zus\u00e4tzliche Infrastruktur, h\u00f6herer Wasser- und Energieverbrauch. Und zu guter Letzt wandeln sie das optische Erscheinungsbild eines Campingplatzes stark hin zu einer Mini-Reihenhaussiedlung. Fazit : Mietb\u00e4der m\u00f6gen bequem sein \u2013 aber sie sind ein Komfort, der das Camping einen Teil seiner Essenz raubt. Statt naturnah und gemeinschaftlich wird es individuell und abgeschottet. Es entsteht eine Art Zweiklassengesellschaft, die das Kn\u00fcpfen neuer Kontakte weiter erschwert. Wenn wir nicht aufpassen, verwandeln sich unsere Campingpl\u00e4tze schleichend in Reihenhaussiedlungen mit Urlaubsanstrich. Sophia Pfisterer: Privates Mietbad, g\u00f6nn ich mir! Ich habe viele N\u00e4chte in Stockbetten verbracht. Habe mit Stirnlampe auf Festivals das Zelt gesucht, mit nassen Flipflops in Gemeinschaftsduschen gestanden und w\u00e4hrend Corona die H\u00e4nde vor und nach dem Klogang desinfiziert. Entgegenkommende Camperinnen und Camper nickten mir zu. Es war intensiv \u2013 und irgendwie sch\u00f6n. Aber heute w\u00fcnsche ich mir etwas mehr \"Chill Pill\". Seitdem ich mit kleinem Kind reise, stelle ich fest: Nicht jede Situation l\u00e4sst sich mit einem Schulterzucken und einem fr\u00f6hlichen \"Das geh\u00f6rt dazu\" l\u00f6sen. Heute freue ich mich \u00fcber Mietb\u00e4der auf der Parzelle \u2013 nicht aus Bequemlichkeit, sondern aus dem Bed\u00fcrfnis nach Routine und Verl\u00e4sslichkeit. Glamping ist kein Verrat an der Idee \u2013 sondern ihre Weiterentwicklung Camping ist nicht nur wild und reduziert. Es ist das, was wir daraus machen. Ich sehe Mietb\u00e4der nicht als Abschottung, sondern als Wahlfreiheit. Glamping ist f\u00fcr mich der Beweis, dass Camping mitwachsen kann \u2013 mit dem Leben, mit der Familie, mit den Anspr\u00fcchen. Wer eine atomare Windelexplosion nachts eind\u00e4mmen oder einem Kleinkind (sprich: zappeligem Dinosaurier) die Z\u00e4hne putzen muss, lernt ein sauberes, privates Bad zu sch\u00e4tzen. Und wenn ich nach einem langen Campingtag 5 Minuten ungest\u00f6rt mit warmem Wasser duschen kann, habe ich schlicht mehr Energie f\u00fcr das, was drau\u00dfen z\u00e4hlt: das Lagerfeuer, die Natur, die Begegnung. Gemeinschaft braucht Raum \u2013 auch R\u00fcckzugsraum In S\u00fcdspanien stand ich einmal auf einem wundersch\u00f6nen Campingplatz, weitl\u00e4ufige Parzellen unter B\u00e4umen, direkt am Strand. Doch irgendwas mit der Wasserversorgung war faul. Die Toiletten liefen \u00fcber, teilweise waren sie so randvoll, dass wir schnell das Weite gesucht haben. Der Angestellte an der Rezeption schaute nur mitleidig: \"Si, claro\", sagte er, und wir bekamen unser Geld zur\u00fcck. Es war schon so ein Albtraum \u2013 mit kleinem Kindosauraus rex, das alles ableckt? Der blanke Bakterien-Horror! Die Begegnungen auf Campingpl\u00e4tzen geh\u00f6ren f\u00fcr mich dazu: das kurze Schw\u00e4tzchen am Sp\u00fclbecken, die Urlaubsfreundschaften bei den Gro\u00dfen wie Kleinen. Und genauso genie\u00dfe ich es, abends die T\u00fcr hinter mir zu schlie\u00dfen \u2013 und mein Buch zu lesen. Gemeinschaft darf f\u00fcr mich nicht bedeuten, dass ich meinen Wunsch nach Ruhe und R\u00fcckzug komplett aufgeben muss. Gemeinschaft entsteht nicht im Mangel, sondern im geteilten Erleben \u2013 gerne drau\u00dfen, gerne am Grill, aber nicht zwangsl\u00e4ufig in der Duschkabine. Ja zu Vielfalt auf dem Platz Nicht jeder Camper und jede Camperin ist gleich. Manche reisen minimalistisch, andere mit Komfortanspruch. Das Sch\u00f6ne an modernen Campingpl\u00e4tzen: Sie k\u00f6nnen beides. Mietb\u00e4der sind ein Angebot, kein Zwang. Das Gemeinschaftsbad wird's weiterhin geben. Vielleicht nutze ich es sogar irgendwann mal wieder. Gleichwohl empfinde ich es als Gewinn, wenn Menschen mit besonderen Bed\u00fcrfnissen \u2013 Familien mit kleinen Kindern, Senioren, Menschen mit Mobilit\u00e4tseinschr\u00e4nkung \u2013 sich auf dem Campingplatz willkommen und wohl f\u00fchlen. Komfort ist keine Bedrohung, sondern eine Einladung. Fazit : Mietb\u00e4der rauben dem Camping nicht die Seele \u2013 sie geben der Urlaubsform neue M\u00f6glichkeiten. Wer diesen Komfort ablehnt, soll das tun. Aber wer ihn braucht, sollte sich nicht sch\u00e4men m\u00fcssen. Denn wahres Campinggef\u00fchl entsteht nicht im Bad \u2013 sondern drau\u00dfen, wo wir uns begegnen.", + "text": "Ein privates Mietbad auf der Campingplatz-Parzelle ist wie ein VIP-Bereich fürs Zähneputzen – nur ohne Türsteher. Statt Flipflop-Marsch durchs Morgengrauen geht’s direkt von der Matratze aufs eigene WC. Dusche, Spiegel, Klobrille – alles da, alles sauber, alles zur alleinigen Nutzung. Privatbad auf dem Campingplatz – ja oder nein? Die einen feiern die neue Form des Komforts als zeitgemäßes Angebot. Die anderen kritisieren: Mietbäder fördern das Eigenbrötlertum, steigern Kosten und entfremden vom klassischen Campinggefühl. Ist ein privates Bad direkt an der Parzelle ein Fortschritt oder ein Rückschritt fürs Camping? An kaum einem Thema scheiden sich die Geister unter Camperinnen und Campern so sehr wie an dieser Frage. Zwischen Naturnähe und Komfortanspruch, Gemeinschaft und Rückzug – Zwei Redaktionsmeinungen, zwei Perspektiven, ein Thema: Wie viel Privat-Bad verträgt das Camping? Philipp Heise: Klare Kante gegen Mietbäder! Die Campingwelt verändert sich – und nicht jede Entwicklung ist ein Fortschritt. Mietbäder auf der eigenen Parzelle versprechen auf den ersten Blick Komfort, doch sie werfen auch grundlegende Fragen auf, wohin sich Camping entwickelt. Als Fachredakteur, der sein Hobby lebt, sehe ich den Trend zu privaten Sanitärkabinen mit Sorge – und das nicht nur, weil ich am liebsten unparzelliert oder bestenfalls frei stehe beim Campen. Warum? Weil Mietbäder für mich eine Abkehr vom eigentlichen Wesen des Campings bedeuten. Verlust des Camping-Gefühls Camping war immer mehr als nur eine Urlaubsform. Es ist ein Lebensgefühl. Es geht um Naturverbundenheit und auch um eine materielle Reduktion, die hilft, dem Alltag in einer Überflussgesellschaft zu entfliehen. Wer sich ein eigenes abgeschlossenes Bad direkt an die Parzelle mietet, grenzt sich ab. Der Schritt zur abgeschotteten Ferienwohnung im Grünen ist dann nicht mehr weit. Es entsteht ein künstlicher Komfortraum, der mit klassischem Camping wenig zu tun hat. Warum noch mit dem Freizeitmobil verreisen, wenn man sich vor Ort dann die Annehmlichkeiten eines Ferienapartments nachbaut? Weniger Gemeinschaft Camping lebt von Begegnung. Der morgendliche Plausch am Waschhaus, das Zähneputzen neben anderen Reisenden aus aller Welt – das sind die kleinen Momente, die verbinden. Mietbäder fördern jedoch die Abschottung. Wer alles privat hat, begegnet niemandem mehr zufällig. Der Campingplatz verkommt so zur Parzellenansammlung mit eigenem Sanitärtrakt. Höhere Kosten – für Camper und Betreiber Mietbäder treiben die Preise hoch – für Stellplätze wie für deren Wartung. Camper, die auf diese Form der \"Luxus-Parzelle\" verzichten möchten, zahlen oft mit dank insgesamt höherer Gesamtpreise. Für Betreiber bedeuten der Unterhalt und die Reinigung privater Sanitäranlagen einen erheblichen Mehraufwand. Widerspruch zur Naturverbundenheit Camping steht für Reduktion, für bewusstes Leben in und mit der Natur. Die Errichtung privater Bäder auf jeder Parzelle wirkt diesem Gedanken entgegen: versiegelte Flächen, zusätzliche Infrastruktur, höherer Wasser- und Energieverbrauch. Und zu guter Letzt wandeln sie das optische Erscheinungsbild eines Campingplatzes stark hin zu einer Mini-Reihenhaussiedlung. Fazit : Mietbäder mögen bequem sein – aber sie sind ein Komfort, der das Camping einen Teil seiner Essenz raubt. Statt naturnah und gemeinschaftlich wird es individuell und abgeschottet. Es entsteht eine Art Zweiklassengesellschaft, die das Knüpfen neuer Kontakte weiter erschwert. Wenn wir nicht aufpassen, verwandeln sich unsere Campingplätze schleichend in Reihenhaussiedlungen mit Urlaubsanstrich. Sophia Pfisterer: Privates Mietbad, gönn ich mir! Ich habe viele Nächte in Stockbetten verbracht. Habe mit Stirnlampe auf Festivals das Zelt gesucht, mit nassen Flipflops in Gemeinschaftsduschen gestanden und während Corona die Hände vor und nach dem Klogang desinfiziert. Entgegenkommende Camperinnen und Camper nickten mir zu. Es war intensiv – und irgendwie schön. Aber heute wünsche ich mir etwas mehr \"Chill Pill\". Seitdem ich mit kleinem Kind reise, stelle ich fest: Nicht jede Situation lässt sich mit einem Schulterzucken und einem fröhlichen \"Das gehört dazu\" lösen. Heute freue ich mich über Mietbäder auf der Parzelle – nicht aus Bequemlichkeit, sondern aus dem Bedürfnis nach Routine und Verlässlichkeit. Glamping ist kein Verrat an der Idee – sondern ihre Weiterentwicklung Camping ist nicht nur wild und reduziert. Es ist das, was wir daraus machen. Ich sehe Mietbäder nicht als Abschottung, sondern als Wahlfreiheit. Glamping ist für mich der Beweis, dass Camping mitwachsen kann – mit dem Leben, mit der Familie, mit den Ansprüchen. Wer eine atomare Windelexplosion nachts eindämmen oder einem Kleinkind (sprich: zappeligem Dinosaurier) die Zähne putzen muss, lernt ein sauberes, privates Bad zu schätzen. Und wenn ich nach einem langen Campingtag 5 Minuten ungestört mit warmem Wasser duschen kann, habe ich schlicht mehr Energie für das, was draußen zählt: das Lagerfeuer, die Natur, die Begegnung. Gemeinschaft braucht Raum – auch Rückzugsraum In Südspanien stand ich einmal auf einem wunderschönen Campingplatz, weitläufige Parzellen unter Bäumen, direkt am Strand. Doch irgendwas mit der Wasserversorgung war faul. Die Toiletten liefen über, teilweise waren sie so randvoll, dass wir schnell das Weite gesucht haben. Der Angestellte an der Rezeption schaute nur mitleidig: \"Si, claro\", sagte er, und wir bekamen unser Geld zurück. Es war schon so ein Albtraum – mit kleinem Kindosauraus rex, das alles ableckt? Der blanke Bakterien-Horror! Die Begegnungen auf Campingplätzen gehören für mich dazu: das kurze Schwätzchen am Spülbecken, die Urlaubsfreundschaften bei den Großen wie Kleinen. Und genauso genieße ich es, abends die Tür hinter mir zu schließen – und mein Buch zu lesen. Gemeinschaft darf für mich nicht bedeuten, dass ich meinen Wunsch nach Ruhe und Rückzug komplett aufgeben muss. Gemeinschaft entsteht nicht im Mangel, sondern im geteilten Erleben – gerne draußen, gerne am Grill, aber nicht zwangsläufig in der Duschkabine. Ja zu Vielfalt auf dem Platz Nicht jeder Camper und jede Camperin ist gleich. Manche reisen minimalistisch, andere mit Komfortanspruch. Das Schöne an modernen Campingplätzen: Sie können beides. Mietbäder sind ein Angebot, kein Zwang. Das Gemeinschaftsbad wird's weiterhin geben. Vielleicht nutze ich es sogar irgendwann mal wieder. Gleichwohl empfinde ich es als Gewinn, wenn Menschen mit besonderen Bedürfnissen – Familien mit kleinen Kindern, Senioren, Menschen mit Mobilitätseinschränkung – sich auf dem Campingplatz willkommen und wohl fühlen. Komfort ist keine Bedrohung, sondern eine Einladung. Fazit : Mietbäder rauben dem Camping nicht die Seele – sie geben der Urlaubsform neue Möglichkeiten. Wer diesen Komfort ablehnt, soll das tun. Aber wer ihn braucht, sollte sich nicht schämen müssen. Denn wahres Campinggefühl entsteht nicht im Bad – sondern draußen, wo wir uns begegnen.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/meinung-privates-mietbad-beim-camping-komfort-oder-stilbruch/", @@ -4713,10 +4713,10 @@ }, { "id": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/", - "title": "Zubeh\u00f6r auf der gr\u00f6\u00dften Campingmesse kaufen: Deshalb m\u00fcssen Zubeh\u00f6r-Shopper zum Caravan Salon", + "title": "Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon", "date": "Mon, 07 Jul 2025 14:03:00 +0200", - "summary": "

Zubeh\u00f6r gibt\u2019s \u00fcberall \u2013 aber nur auf dem Caravan Salon gibt\u2019s den vollen \u00dcberblick. Camper, die gezielt nachr\u00fcsten oder ihr Fahrzeug optimieren wollen, finden hier nicht nur g\u00fcnstige Messepreise, sondern auch Beratung, Live-Tests und echte Neuheiten.

", - "text": "Der beliebteste Gegenstand mit R\u00e4dern auf dem Caravan Salon ist der Fritz Berger Einkaufstrolley. Wer auf der gr\u00f6\u00dften Messe f\u00fcr Reisemobile, Wohnwagen oder Campingbusse unterwegs ist, sieht immer wieder Besucher, die die kleine blaue Kiste hinter sich herziehen. Nat\u00fcrlich ist die vollgestopft mit Camping-Ausr\u00fcstung. Wer m\u00f6chte schon die ganzen Schn\u00e4ppchen, die er gerade in den Zubeh\u00f6r-Hallen 3, 13 und 14 gemacht hat, herumtragen. Also gibt es f\u00fcr 20 Euro den Trolley als Extra dazu. Auf der riesigen Neuheiten-Show geht im Glanz der Campingfahrzeuge unter, dass es kaum eine bessere Gelegenheit gibt, um sich \u00fcber Camping-Zubeh\u00f6r zu informieren, es einzukaufen und alles \u00fcber Neuheiten zu erfahren. Warum das so ist, erz\u00e4hlen wir Ihnen hier. 1. Markt\u00fcbersicht an einem Ort Auf dem Caravan Salon finden Camper eine riesige Auswahl an Zubeh\u00f6r \u2013 von Solarmodulen \u00fcber automatische Hubst\u00fctzen, Batterien, Vorzelten, Markisen bis zu cleveren Campingst\u00fchlen oder K\u00fcchenhelfern. Es sind nicht nur alle Kategorien aus den Bereichen Camping-Zubeh\u00f6r, Wohnmobil- oder Wohnwagen-Technik oder Ausr\u00fcstung auf der Messe, sondern in der Regel auch alle relevanten Hersteller. Dazwischen schleicht sich gelegentlich ein kleines Start-up mit einer neuen Idee. Camperinnen und Camper k\u00f6nnen sich also schnell einen \u00dcberblick \u00fcber den Markt verschaffen und die konkurrierenden Produkte gleich miteinander vergleichen. Das klappt im Internet gar nicht und bei Zubeh\u00f6r-Shops am Wohnort nur bedingt, weil die nicht alle Marken verkaufen. 2. Produkte direkt ausprobieren Probieren geht \u00fcber Studieren: Die Chance dazu haben Camperinnen und Camper auf dem Caravan Salon oft ziemlich exklusiv. In Online-Shops m\u00fcssen sie sich auf Bewertungen anderer K\u00e4ufer verlassen und station\u00e4re H\u00e4ndler haben die Ware oft nur verpackt im Regal liegen. Auf dem Caravan Salon haben die Hersteller in der Regel eigene St\u00e4nde und bauen dort so viele Produkte wie m\u00f6glich auf \u2013 vorrangig die Neuheiten. Besucher k\u00f6nnen sich die Vorzelte anschauen oder auf Campingst\u00fchlen Probe sitzen. Sie k\u00f6nnen ausprobieren, ob sie mit der Bedienung des Reich easydriver oder des Truma Mover besser klarkommen und sich danach f\u00fcr einen Rangierantrieb f\u00fcr den Wohnwagen entscheiden. 4. Fragen direkt kl\u00e4ren \u2013 bei den besten Experten Wer auf dem Caravan Salon ein Zubeh\u00f6r-Produkt entdeckt und Fragen dazu hat, kann sie gleich kl\u00e4ren. Die Antworten geben oft die Mitarbeiterinnen und Mitarbeiter der Hersteller. Bessere Experten gibt es nicht. Wer direkt f\u00fcr ein Unternehmen arbeitet, wei\u00df oft mehr \u00fcber das Produktportfolio als Einzelh\u00e4ndler. Nat\u00fcrlich geht das nicht auf, wenn Camperinnen und Camper in der Zubeh\u00f6r-Halle 3 am gro\u00dfen Verkaufsstand von Fritz-Berger vor Toiletten-Zus\u00e4tzen von Thetford, Geschirr von Brunner oder K\u00fchlboxen von Dometic stehen. Dann gibt es aber auch eine L\u00f6sung: Die Frage einfach mitnehmen in die Hallen 13 und 14, wo die drei Hersteller ihre St\u00e4nde haben. Denn die geh\u00f6ren zur Kategorie Fahrzeugtechnik und Ausstattung, f\u00fcr die es eigene Hallen gibt. 5. Schn\u00e4ppchen machen dank Messepreisen Viele Hersteller oder Zubeh\u00f6r-H\u00e4ndler machen auf dem Caravan Salon Sonderangebote. Preise liegen dabei oft 10 bis 20 Prozent unter dem regul\u00e4ren Marktwert. Gerade bei hochpreisigen Teilen wie Wechselrichtern, Batterien oder Klimaanlagen kann sich das lohnen. 6. Zubeh\u00f6r-Neuheiten zuerst sehen Auch die gro\u00dfen Hersteller von Camping-Zubeh\u00f6r, Fahrzeug- und Aufbautechnik stellen in der Regel in D\u00fcsseldorf ihre Neuheiten f\u00fcr die kommende Saison vor. Nirgends in Europa k\u00f6nnen Camperinnen und Camper die technischen Highlights der Zukunft fr\u00fcher live aufgebaut sehen. Zubeh\u00f6r in Halle 3, Ausstattung und Technik in Hallen 13 und 14 Eigentlich liegen die Kategorien Camping-Zubeh\u00f6r und Fahrzeug-Ausstattung und Technik relativ nah zusammen. Manche Camperinnen und Camper w\u00fcrden Ausstattungs-Komponenten wie Klimaanlagen oder Markisen vermutlich sogar zum Zubeh\u00f6r z\u00e4hlen. Auf dem Caravan Salon liegen die drei Kategorien maximal weit auseinander. Zubeh\u00f6r wie Vorzelte, Campingst\u00fchle oder Geschirr finden die Besucher n\u00e4mlich eher in Halle 3 an der s\u00fcdwestlichen Ecke des Gel\u00e4ndes. Die Hersteller von Klima-Technik, Wechselrichter, Markisen oder Sat-Anlagen sind in den Hallen 13 und 14 untergebracht \u2013 also am Ostende des Gel\u00e4ndes.", + "summary": "

Zubehör gibt’s überall – aber nur auf dem Caravan Salon gibt’s den vollen Überblick. Camper, die gezielt nachrüsten oder ihr Fahrzeug optimieren wollen, finden hier nicht nur günstige Messepreise, sondern auch Beratung, Live-Tests und echte Neuheiten.

", + "text": "Der beliebteste Gegenstand mit Rädern auf dem Caravan Salon ist der Fritz Berger Einkaufstrolley. Wer auf der größten Messe für Reisemobile, Wohnwagen oder Campingbusse unterwegs ist, sieht immer wieder Besucher, die die kleine blaue Kiste hinter sich herziehen. Natürlich ist die vollgestopft mit Camping-Ausrüstung. Wer möchte schon die ganzen Schnäppchen, die er gerade in den Zubehör-Hallen 3, 13 und 14 gemacht hat, herumtragen. Also gibt es für 20 Euro den Trolley als Extra dazu. Auf der riesigen Neuheiten-Show geht im Glanz der Campingfahrzeuge unter, dass es kaum eine bessere Gelegenheit gibt, um sich über Camping-Zubehör zu informieren, es einzukaufen und alles über Neuheiten zu erfahren. Warum das so ist, erzählen wir Ihnen hier. 1. Marktübersicht an einem Ort Auf dem Caravan Salon finden Camper eine riesige Auswahl an Zubehör – von Solarmodulen über automatische Hubstützen, Batterien, Vorzelten, Markisen bis zu cleveren Campingstühlen oder Küchenhelfern. Es sind nicht nur alle Kategorien aus den Bereichen Camping-Zubehör, Wohnmobil- oder Wohnwagen-Technik oder Ausrüstung auf der Messe, sondern in der Regel auch alle relevanten Hersteller. Dazwischen schleicht sich gelegentlich ein kleines Start-up mit einer neuen Idee. Camperinnen und Camper können sich also schnell einen Überblick über den Markt verschaffen und die konkurrierenden Produkte gleich miteinander vergleichen. Das klappt im Internet gar nicht und bei Zubehör-Shops am Wohnort nur bedingt, weil die nicht alle Marken verkaufen. 2. Produkte direkt ausprobieren Probieren geht über Studieren: Die Chance dazu haben Camperinnen und Camper auf dem Caravan Salon oft ziemlich exklusiv. In Online-Shops müssen sie sich auf Bewertungen anderer Käufer verlassen und stationäre Händler haben die Ware oft nur verpackt im Regal liegen. Auf dem Caravan Salon haben die Hersteller in der Regel eigene Stände und bauen dort so viele Produkte wie möglich auf – vorrangig die Neuheiten. Besucher können sich die Vorzelte anschauen oder auf Campingstühlen Probe sitzen. Sie können ausprobieren, ob sie mit der Bedienung des Reich easydriver oder des Truma Mover besser klarkommen und sich danach für einen Rangierantrieb für den Wohnwagen entscheiden. 4. Fragen direkt klären – bei den besten Experten Wer auf dem Caravan Salon ein Zubehör-Produkt entdeckt und Fragen dazu hat, kann sie gleich klären. Die Antworten geben oft die Mitarbeiterinnen und Mitarbeiter der Hersteller. Bessere Experten gibt es nicht. Wer direkt für ein Unternehmen arbeitet, weiß oft mehr über das Produktportfolio als Einzelhändler. Natürlich geht das nicht auf, wenn Camperinnen und Camper in der Zubehör-Halle 3 am großen Verkaufsstand von Fritz-Berger vor Toiletten-Zusätzen von Thetford, Geschirr von Brunner oder Kühlboxen von Dometic stehen. Dann gibt es aber auch eine Lösung: Die Frage einfach mitnehmen in die Hallen 13 und 14, wo die drei Hersteller ihre Stände haben. Denn die gehören zur Kategorie Fahrzeugtechnik und Ausstattung, für die es eigene Hallen gibt. 5. Schnäppchen machen dank Messepreisen Viele Hersteller oder Zubehör-Händler machen auf dem Caravan Salon Sonderangebote. Preise liegen dabei oft 10 bis 20 Prozent unter dem regulären Marktwert. Gerade bei hochpreisigen Teilen wie Wechselrichtern, Batterien oder Klimaanlagen kann sich das lohnen. 6. Zubehör-Neuheiten zuerst sehen Auch die großen Hersteller von Camping-Zubehör, Fahrzeug- und Aufbautechnik stellen in der Regel in Düsseldorf ihre Neuheiten für die kommende Saison vor. Nirgends in Europa können Camperinnen und Camper die technischen Highlights der Zukunft früher live aufgebaut sehen. Zubehör in Halle 3, Ausstattung und Technik in Hallen 13 und 14 Eigentlich liegen die Kategorien Camping-Zubehör und Fahrzeug-Ausstattung und Technik relativ nah zusammen. Manche Camperinnen und Camper würden Ausstattungs-Komponenten wie Klimaanlagen oder Markisen vermutlich sogar zum Zubehör zählen. Auf dem Caravan Salon liegen die drei Kategorien maximal weit auseinander. Zubehör wie Vorzelte, Campingstühle oder Geschirr finden die Besucher nämlich eher in Halle 3 an der südwestlichen Ecke des Geländes. Die Hersteller von Klima-Technik, Wechselrichter, Markisen oder Sat-Anlagen sind in den Hallen 13 und 14 untergebracht – also am Ostende des Geländes.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/", @@ -4807,15 +4807,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2216768.jpg", - "alt": "B\u00fcrster Papillon Rendering", - "caption": "B\u00fcrster Papillon Rendering", + "alt": "Bürster Papillon Rendering", + "caption": "Bürster Papillon Rendering", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2215467.jpg", - "alt": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", - "caption": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", + "alt": "Giottiline Siena 396 Wohnmobil für Familien mit Kinderzimmer", + "caption": "Giottiline Siena 396 Wohnmobil für Familien mit Kinderzimmer", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/caravan-salon-duesseldorf-eine-einmalige-gelegenheit-fuer-camping-zubehoer-shopper/" }, @@ -4866,10 +4866,10 @@ }, { "id": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/", - "title": "Tipps f\u00fcr die gr\u00f6\u00dfte Camping-Messe Deutschlands: Darum d\u00fcrfen Sie den Caravan Salon nicht verpassen", + "title": "Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen", "date": "Thu, 03 Jul 2025 06:00:00 +0200", - "summary": "

Der Caravan Salon in D\u00fcsseldorf ist die gr\u00f6\u00dfte Messe f\u00fcr Wohnmobile, Wohnwagen und Camping-Zubeh\u00f6r. Wir verraten Ihnen, warum Sie unbedingt einmal hingehen m\u00fcssen!

", - "text": "Die mit Abstand gr\u00f6\u00dfte und wichtigste Messe f\u00fcr Wohnmobile, Wohnwagen und Camping-Zubeh\u00f6r ist ohne Zweifel der Caravan Salon in D\u00fcsseldorf. Er findet jedes Jahr Ende August statt \u2013 2025 vom 30. August bis zum 7. September. Was Sie dort erwartet, lesen Sie in unserem Themenspecial. Warum Sie unbedingt auf den Caravan Salon gehen sollten, erfahren Sie hier. 1. Wohnmobile/Wohnwagen anschauen Ganz oben auf der Liste der Messe-Highlights stehen nat\u00fcrlich die unz\u00e4hligen Wohnmobile, Campingbusse und Wohnwagen, die Sie dort nicht nur aus der Ferne, sondern ganz genau von au\u00dfen und innen unter die Lupe nehmen k\u00f6nnen. Nirgendwo sonst haben Sie die Chance, einmal so viele Modelle unterschiedlicher Hersteller auf einem Fleck zu sehen. Das lohnt sich, wenn Sie: A: Noch nie ein Campingfahrzeug von innen gesehen haben. Treten Sie ruhig ein und schauen Sie sich einmal die unterschiedlichen Gattungen von innen an. Meist wirken die Fahrzeuge auf Bildern gr\u00f6\u00dfer, als sie es tats\u00e4chlich sind. Nehmen Sie Ihren Partner/Ihre Partnerin und Kinder mit rein, um zu sehen, wie sich die Platzverh\u00e4ltnisse auf sie auswirken. B: Ein Fahrzeug kaufen m\u00f6chten, aber noch nicht so genau wissen, was oder von welcher Marke. Hier haben Sie die Chance, die unterschiedlichen Hersteller auszuchecken. Seien es die Big Player auf dem Markt, wie Hymer, Knaus oder P\u00f6ssl, oder unbekanntere, kleine Manufakturen \u2013 auf dem Caravan Salon sind sie alle vertreten. 2. Wohnmobil, Campingbus oder Wohnwagen kaufen Nat\u00fcrlich animiert die Messe auch zum Kauf eines Freizeitfahrzeugs, mit Rabatten und attraktiven Preisen. Allerdings sollten Sie von Spontank\u00e4ufen absehen und nur zuschlagen, wenn Sie sich wirklich sicher sind. Wichtig ist es, sich vorher Gedanken dar\u00fcber zu machen: Was ist mir beim Camping wichtig? Eine grobe Idee von der Fahrzeugkategorie, dem Platz und der Bettenaufteilung sollten Sie immerhin haben. Alles, was sonst f\u00fcr den Messekauf wichtig ist, erfahren Sie hier. Wohnmobile, Campingbusse und Wohnwagen gibt es in den Hallen: 1, 4-7a, 10\u201312 und 15 bis 17. 3. Zubeh\u00f6r durchforsten Im Zubeh\u00f6r-Bereich des Caravan Salons \u2013 in den Hallen 3, 13 und 14 \u2013 finden Sie alles, was das Camperleben angenehmer macht. Ob praktische Alltagshelfer, clevere Technik oder stilvolle Einrichtung: Hier k\u00f6nnen Sie st\u00f6bern, vergleichen und entdecken, was zu Ihrem Fahrzeug passt. Vielleicht ahnen Sie noch gar nicht, wie viel Potenzial in Ihrem mobilen Zuhause steckt. 4. \u00dcber Selbstausbau informieren Zum Thema Zubeh\u00f6r passt auch die Sonderschau \"Abenteuer Selbstausbau\" auf dem Freigel\u00e4nde vor den Hallen 13 und 14. Hier erfahren Sie nicht nur, welches Zubeh\u00f6r Sie f\u00fcr einen Selbstausbau ben\u00f6tigen, sondern auch, wie Sie diesen planen und durchf\u00fchren. Dort gibt es t\u00e4glich Vortr\u00e4ge f\u00fcr Anf\u00e4nger, Fortgeschrittene und Profis zum Thema Selbstausbau und ebenso fertige Ausbauten, die beispielhaft zeigen, was m\u00f6glich ist. Dass ein Selbstausbau n\u00e4mlich nicht nur cool aussieht, sondern vor allem einiges an Blut, Schwei\u00df und Tr\u00e4nen einfordert, lernen Sie sp\u00e4testens im Gespr\u00e4ch mit den Experten. 5. Starter-Welt f\u00fcr Neulinge Alle Camping-Neulinge sollten unbedingt bei der Starter-Welt vorbeischauen. Hier gibt es spannende Vortr\u00e4ge von Expertinnen und Experten aus der Camping-Branche zum Thema \"das erste Mal Camping\". Wenn Sie noch nie campen waren, k\u00f6nnen Sie sich hier \u00fcber die unterschiedlichen Fahrzeugarten informieren und was unterwegs wichtig ist. Au\u00dferdem k\u00f6nnen Sie Ihre brennendsten Fragen loswerden. Die Starter-Welt kommt 2025 an einen neuen Platz und befindet sich zwischen den Hallen 5 und 9. 6. Ungest\u00f6rt am Preview Day Wer sich intensiv mit den Fahrzeugen und Co. auseinandersetzen will, kann schon am Freitag, 29. August, ein Ticket f\u00fcr den \"Preview Day\" erwerben. Die St\u00fcckzahlen der Tickets sind limitiert und so schafft es nur eine begrenzte Besuchermenge auf das Gel\u00e4nde. An diesem Tag k\u00f6nnen Sie sich in entspannter Atmosph\u00e4re umschauen. Am Wochenende wird es jedes Jahr gerammelt voll auf dem Caravan Salon. Wer am Preview Day kein Ticket mehr bekommt, es aber unter der Woche einrichten kann, profitiert ebenfalls von mehr Ruhe und hat mehr Gelegenheit, mit den Beratern an den Herstellerst\u00e4nden ins Gespr\u00e4ch zu kommen.", + "summary": "

Der Caravan Salon in Düsseldorf ist die größte Messe für Wohnmobile, Wohnwagen und Camping-Zubehör. Wir verraten Ihnen, warum Sie unbedingt einmal hingehen müssen!

", + "text": "Die mit Abstand größte und wichtigste Messe für Wohnmobile, Wohnwagen und Camping-Zubehör ist ohne Zweifel der Caravan Salon in Düsseldorf. Er findet jedes Jahr Ende August statt – 2025 vom 30. August bis zum 7. September. Was Sie dort erwartet, lesen Sie in unserem Themenspecial. Warum Sie unbedingt auf den Caravan Salon gehen sollten, erfahren Sie hier. 1. Wohnmobile/Wohnwagen anschauen Ganz oben auf der Liste der Messe-Highlights stehen natürlich die unzähligen Wohnmobile, Campingbusse und Wohnwagen, die Sie dort nicht nur aus der Ferne, sondern ganz genau von außen und innen unter die Lupe nehmen können. Nirgendwo sonst haben Sie die Chance, einmal so viele Modelle unterschiedlicher Hersteller auf einem Fleck zu sehen. Das lohnt sich, wenn Sie: A: Noch nie ein Campingfahrzeug von innen gesehen haben. Treten Sie ruhig ein und schauen Sie sich einmal die unterschiedlichen Gattungen von innen an. Meist wirken die Fahrzeuge auf Bildern größer, als sie es tatsächlich sind. Nehmen Sie Ihren Partner/Ihre Partnerin und Kinder mit rein, um zu sehen, wie sich die Platzverhältnisse auf sie auswirken. B: Ein Fahrzeug kaufen möchten, aber noch nicht so genau wissen, was oder von welcher Marke. Hier haben Sie die Chance, die unterschiedlichen Hersteller auszuchecken. Seien es die Big Player auf dem Markt, wie Hymer, Knaus oder Pössl, oder unbekanntere, kleine Manufakturen – auf dem Caravan Salon sind sie alle vertreten. 2. Wohnmobil, Campingbus oder Wohnwagen kaufen Natürlich animiert die Messe auch zum Kauf eines Freizeitfahrzeugs, mit Rabatten und attraktiven Preisen. Allerdings sollten Sie von Spontankäufen absehen und nur zuschlagen, wenn Sie sich wirklich sicher sind. Wichtig ist es, sich vorher Gedanken darüber zu machen: Was ist mir beim Camping wichtig? Eine grobe Idee von der Fahrzeugkategorie, dem Platz und der Bettenaufteilung sollten Sie immerhin haben. Alles, was sonst für den Messekauf wichtig ist, erfahren Sie hier. Wohnmobile, Campingbusse und Wohnwagen gibt es in den Hallen: 1, 4-7a, 10–12 und 15 bis 17. 3. Zubehör durchforsten Im Zubehör-Bereich des Caravan Salons – in den Hallen 3, 13 und 14 – finden Sie alles, was das Camperleben angenehmer macht. Ob praktische Alltagshelfer, clevere Technik oder stilvolle Einrichtung: Hier können Sie stöbern, vergleichen und entdecken, was zu Ihrem Fahrzeug passt. Vielleicht ahnen Sie noch gar nicht, wie viel Potenzial in Ihrem mobilen Zuhause steckt. 4. Über Selbstausbau informieren Zum Thema Zubehör passt auch die Sonderschau \"Abenteuer Selbstausbau\" auf dem Freigelände vor den Hallen 13 und 14. Hier erfahren Sie nicht nur, welches Zubehör Sie für einen Selbstausbau benötigen, sondern auch, wie Sie diesen planen und durchführen. Dort gibt es täglich Vorträge für Anfänger, Fortgeschrittene und Profis zum Thema Selbstausbau und ebenso fertige Ausbauten, die beispielhaft zeigen, was möglich ist. Dass ein Selbstausbau nämlich nicht nur cool aussieht, sondern vor allem einiges an Blut, Schweiß und Tränen einfordert, lernen Sie spätestens im Gespräch mit den Experten. 5. Starter-Welt für Neulinge Alle Camping-Neulinge sollten unbedingt bei der Starter-Welt vorbeischauen. Hier gibt es spannende Vorträge von Expertinnen und Experten aus der Camping-Branche zum Thema \"das erste Mal Camping\". Wenn Sie noch nie campen waren, können Sie sich hier über die unterschiedlichen Fahrzeugarten informieren und was unterwegs wichtig ist. Außerdem können Sie Ihre brennendsten Fragen loswerden. Die Starter-Welt kommt 2025 an einen neuen Platz und befindet sich zwischen den Hallen 5 und 9. 6. Ungestört am Preview Day Wer sich intensiv mit den Fahrzeugen und Co. auseinandersetzen will, kann schon am Freitag, 29. August, ein Ticket für den \"Preview Day\" erwerben. Die Stückzahlen der Tickets sind limitiert und so schafft es nur eine begrenzte Besuchermenge auf das Gelände. An diesem Tag können Sie sich in entspannter Atmosphäre umschauen. Am Wochenende wird es jedes Jahr gerammelt voll auf dem Caravan Salon. Wer am Preview Day kein Ticket mehr bekommt, es aber unter der Woche einrichten kann, profitiert ebenfalls von mehr Ruhe und hat mehr Gelegenheit, mit den Beratern an den Herstellerständen ins Gespräch zu kommen.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/", @@ -4960,15 +4960,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2216768.jpg", - "alt": "B\u00fcrster Papillon Rendering", - "caption": "B\u00fcrster Papillon Rendering", + "alt": "Bürster Papillon Rendering", + "caption": "Bürster Papillon Rendering", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2215467.jpg", - "alt": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", - "caption": "Giottiline Siena 396 Wohnmobil f\u00fcr Familien mit Kinderzimmer", + "alt": "Giottiline Siena 396 Wohnmobil für Familien mit Kinderzimmer", + "caption": "Giottiline Siena 396 Wohnmobil für Familien mit Kinderzimmer", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/caravan-salon-2025-6-gruende-besuch-messe/" }, @@ -5021,8 +5021,8 @@ "id": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/", "title": "Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper", "date": "Sun, 29 Jun 2025 14:00:00 +0200", - "summary": "

Die erste Hitzewelle ist in vollem Gange. Wir verraten die besten Tipps und Tricks, wie es im Camper k\u00fchl bleibt.

", - "text": "Es wird richtig hei\u00df! Wenn die Temperaturen im Sommer steigen, kann es im Wohnmobil schnell unangenehm hei\u00df werden. Besonders bei Reisen nach S\u00fcdeuropa oder w\u00e4hrend Hitzewellen in Deutschland heizt sich der Innenraum von Wohnmobilen, Campingbussen oder Wohnwagen tags\u00fcber stark auf. Und wir alle fragen uns: Was tun, wenn es zu hei\u00df wird im Campingfahrzeug? Keine Sorge, es gibt zahlreiche M\u00f6glichkeiten, wie Sie die hei\u00dfen Tage angenehmer gestalten k\u00f6nnen. Wir haben die besten K\u00fchl-Tipps f\u00fcr Sie zusammengestellt, damit Sie auch bei hohen Temperaturen einen k\u00fchlen Kopf bewahren k\u00f6nnen. Wer sehr temperaturempfindlich ist, sollte auch bei der Wahl des Urlaubsortes das Klima im Kopf behalten. Vor allem f\u00fcr Menschen mit Vorerkrankungen, kleine Kinder, Schwangere und \u00e4ltere Reisende ist der Trend Coolcation im Hochsommer wahrscheinlich die beste Wahl \u2013 Sprich: Ein Sommerurlaub an einem k\u00fchlen Ort. Sie wollen trotzdem in den S\u00fcden oder lieben es einfach, wenn es drau\u00dfen warm ist? Mit den folgenden Ma\u00dfnahmen k\u00f6nnen Sie auch bei hohen Temperaturen einen angenehmen und erholsamen Campingurlaub genie\u00dfen. Richtig l\u00fcften Sobald die ersten Sonnenstrahlen die Luft aufheizen, werden die Schotten dicht gemacht. Im Reisemobil oder Wohnwagen bedeutet das: Fenster und Luken zu. L\u00fcften mittels Dachluken und Fenster ergibt nur Sinn, wenn es drau\u00dfen k\u00fchler ist. Und genau die S\u00fcdeurop\u00e4er machen uns vor, wie es geht: Sie l\u00fcften dann, wenn es drau\u00dfen k\u00fchler ist als drin \u2013 und zwar von sp\u00e4tabends bis fr\u00fchmorgens . Auch wenn drau\u00dfen ein kleines L\u00fcftchen weht, ergibt das L\u00fcften Sinn. Dann entsteht auch drinnen ein Luftstrom , der zwar die Temperatur real nicht senkt, sie jedoch ertr\u00e4glicher macht. Kastenwagen heizen sich st\u00e4rker auf, weshalb hier offene Fenster und T\u00fcren auch tags\u00fcber Linderung bringen k\u00f6nnen. Fensterschutz Wer denkt, das Schlie\u00dfen aller Rollos w\u00fcrde dem rasanten Temperaturanstieg entgegenwirken, liegt nicht ganz richtig. Zwar versprechen die silbrig folierten Rollo-Au\u00dfenseiten eine gewisse Abschirmung, doch wenn das Sonnenlicht auf die Rollos trifft, ist die W\u00e4rme schon hinter den Fensterscheiben \u2013 also im Fahrzeug. Fenster, Luken und T\u00fcren sind die eigentlichen Hitzeschleusen. Spezielle Funktionstextilien , die man au\u00dfen anbringt, helfen, sie besser zu isolieren. Die gr\u00f6\u00dfte Wirksamkeit entwickeln sie in Kombination mit geschlossenen Rollos innen. F\u00fcr Dachhauben und Seitenfenster haben verschiedene Firmen ma\u00dfgeschneiderte Sonnenschutz-\u00dcberz\u00fcge im Programm. Die Beschaffenheit der \u00dcberz\u00fcge ist unterschiedlich: Durch die Dometic \" Sunshades \" dringt immer noch ein wenig Tageslicht, die Thermomatte von Hindermann ist dagegen komplett undurchsichtig. Die Hindermann Thermomatte k\u00f6nnen Sie hier direkt bei unserem Partnershop Fritz Berger bestellen. Cockpit-Schutz Vor allem f\u00fcr das gr\u00f6\u00dfte Fenster im Fahrzeug, die Frontscheibe, eignet sich zus\u00e4tzlich eine Thermofolie au\u00dfen, erh\u00e4ltlich beispielsweise bei Fritz Berger. Der Zubeh\u00f6rhandel hat eine Vielzahl ma\u00dfgeschneiderter silber bedampfter D\u00e4mmmatten im Angebot. Die Preisspannen sind enorm. Je nach technischer Finesse und Ausstattung kosten sie zwischen 100 und 900 Euro. Die Frontscheiben-Thermofolie von Fritz Berger k\u00f6nnen Sie direkt bei Fritz Berger bestellen, einfach hier klicken. Noch mehr Thermomatten f\u00fcr die Frontscheibe gibt es hier bei Camping Wagner. Ventilatoren Dem Luftzug auf die Spr\u00fcnge helfen Ventilator-Dachhauben . Bei Fiamma hei\u00dfen sie Turbo Vent und Turbo Vent Premium, passen in Dachlukenausschnitte von 36 mal 36 und 40 mal 40 Zentimeter Gr\u00f6\u00dfe und verf\u00fcgen \u00fcber zwei Laufrichtungen sowie stufenlose Drehzahlregelung. Damit kann k\u00fchle Au\u00dfenluft zu- oder hei\u00dfe Innenluft abgef\u00fchrt werden. Beim Luftverkehr von drinnen nach drau\u00dfen dienen Ventilator-Dachhauben je nach Einbaulage auch als Dunstabzug f\u00fcr K\u00fcche oder Bad. Hier gibt es noch mehr Informationen \u00fcber Ventilatoren f\u00fcrs Camping. Hier gibt es die Fiamma-Ventilator-Dachhauben in unserem Partnershop Fritz Berger. Ebenfalls erh\u00e4ltlich ist der Universal-Ventilator Fritz Berger Turbo-Kit, der mit Querstreben unter herk\u00f6mmlichen Dachhauben montiert werden kann. Seinen Strom bezieht er \u00fcber eine handwerklich aufwendige Verkabelung mit dem Bordnetz oder acht 1,5-Volt-Batterien. Nat\u00fcrlich funktioniert auch jeder normale Tischventilator . Dagegen sprechen jedoch der Platzbedarf, den er im Wohnmobil und beim Transport beansprucht, und dass ein Kabel durch den Raum f\u00fchrt. Schatten suchen Effektiver Hitzeschutz f\u00e4ngt au\u00dfen an. Die simpelste L\u00f6sung hei\u00dft: Einen schattigen Stellplatz unter B\u00e4umen suchen. In die dunkle R\u00f6hre schaut dann nur der, der seine Satellitensch\u00fcssel fest auf dem Dach montiert hat. Wer h\u00e4ufig hei\u00dfe Regionen aufsucht und trotzdem nicht aufs Fernsehen verzichten mag, greift besser zu transportablen Sat-Sch\u00fcsseln. Oder hat einfach einen Router dabei und streamt das Fernseh-Programm. Hier finden Sie mehr zum Thema Internet im Reisemobil: Aktuelle Router haben wir hier getestet. Noch mehr dazu gibt es hier: Router f\u00fcr unterwegs. Aber auch das Bier bleibt auf Schattenpl\u00e4tzen l\u00e4nger k\u00fchl, weil Absorberk\u00fchlschr\u00e4nke systembedingt nur 30 Grad Celsius unter die Au\u00dfentemperatur kommen. Knallt die Sonne durch die Abluftgitter auf die K\u00fchlschrankr\u00fcckseite, kann es kritisch werden. Spezielle 12-Volt- K\u00fchlschrankventilatoren mildern oder beheben dieses Problem. Sowohl Dometic als auch Thetford haben einbaufertige Ventilator-Sets f\u00fcr rund 45 bzw. 53 Euro im Programm. Hier k\u00f6nnen Sie solche Ventilatoren direkt bei unserem Partnershop Fritz Berger bestellen. Markise Selbst auf dem lauschigsten Schattenplatz scheint irgendwann die Sonne. Dann schl\u00e4gt die Stunde von Markise und Sonnendach. Planen mit UV-Blocker sch\u00fctzen Haut und Fahrzeug. Eine vom textilen Vordach beschattete Seitenwand bleibt deutlich k\u00fchler als eine direkt bestrahlte. Das Angebot an Markisen ist enorm. Es reicht vom einfachen Sonnensegel (ab ca. 180 Euro) \u00fcber in die Kederleiste eingezogene Sackmarkisen , die von Hand entrollt und aufgestellt werden m\u00fcssen, bis zu klassischen Kassettenmarkisen , die per Handkurbel oder elektrisch ausfahren. Viele Sack- und Kassettenmarkisen lassen sich durch Front- und Seitenteile zu Windf\u00e4ngen und geschlossenen Vorzelten erweitern \u2013 eine variable L\u00f6sung f\u00fcr die meisten Eins\u00e4tze mit Ausnahme von extremem Wintercamping. Sonnensegel k\u00f6nnen Sie hier bei unserem Partnershop Fritz Berger direkt bestellen. Tipps und alles rund ums Thema Markise finden Sie hier. Bel\u00fcftete Sitzmatte Wer keine Klimaanlage f\u00fcrs Fahrerhaus hat, kann w\u00e4hrend der Fahrt zwar das Fenster einen Spalt \u00f6ffnen. Allerdings riskiert man damit im schlimmsten Fall, sich durch den kalten Luftstrom im Nacken einen \"Zug\" zu holen, eine Muskelverspannung. Eine nachr\u00fcstbare Alternative f\u00fcr lange Strecken bei praller Sonne ist eine bel\u00fcftete Sitzauflage. Diese k\u00fchlenden Sitzmatten tragen an mehreren Stellen im Polster einen Luftauslass. Matten wie die von Westfalia werden via 12-Volt-Anschluss betrieben. K\u00fchlmatten Ganz ohne Strom funktionieren K\u00fchlmatten, die es ebenfalls f\u00fcr die Sitze gibt, aber f\u00fcrs Bett. Gehen die Temperaturen auch nachts nicht in den Keller, k\u00f6nnte beispielsweise die Freshmat von Wiegel f\u00fcr Linderung sorgen. Die K\u00fchlkissen, die es als 30 mal 40 Zentimeter gro\u00dfe Sitz- sowie als 90 mal 90 Zentimeter gro\u00dfe faltbare Matratzenauflage gibt, haben einen Gelkern, der bei Druck K\u00fchle erzeugt. Sobald Druck fehlt, regeneriert sich das Gel ohne Strom- oder K\u00e4ltezufuhr. Die Matten gibt es auch f\u00fcr das Haustier. K\u00fchlmatten f\u00fcr Haustiere gibt es hier bei Fritz Berger. Hier gibt es verschiedene K\u00fchlmatten bei Amazon. Schutzfarbe Der Aufbau des Wohnmobils bleibt durch einen UV-Schutzanstrich auf dem Dach k\u00fchler, beispielsweise von der Marke Cooldry. Die Dispersionsfarbe enth\u00e4lt Reflexionskomponenten, die bis zu 90 Prozent der Sonnenenergie reflektieren sollen. Des Weiteren gibt der Hersteller an, dass sich die Oberfl\u00e4chentemperatur des nach dem Anstrich mattwei\u00dfen oder -beigen Dachs bei direkter Sonnenbestrahlung bei Tests von 45,4 auf 31,4 Grad reduziert. Die Schutzfarbe kann direkt auf das lackierte Blech bzw. GFK aufgetragen werden. Der Originallack kann, muss aber nicht angeschliffen werden. Laut Hersteller gen\u00fcgt ein Liter Cooldry f\u00fcr ca. 1,5 m\u00b2 bei zwei Schichten. Das hei\u00dft: zehn Liter reichen f\u00fcr ca. 15 m\u00b2, der Literpreis liegt aktuell bei rund 20,40 Euro. Nach rund einer Stunde klebt der Schutzanstrich nicht mehr, nach zw\u00f6lf bis 16 Stunden kann eine zweite Schicht aufgetragen werden. Klimaanlagen Klimaanlagen sind die Hightech-Ger\u00e4te gegen Hitze. Die Anlagen unterscheiden sich durch ihre Wirkungsweise und den Einbauort. Die effektivste K\u00fchlung, jedoch unter intensivem Einsatz von 230-Volt-Strom, versprechen Kompressor-Klimaanlagen . Diese gibt es f\u00fcr die Montage auf dem Dach in einem Dachlukenausschnitt von 40 mal 40 Zentimeter Gr\u00f6\u00dfe. Unsere gro\u00dfe Kaufberatung mit Markt\u00fcbersicht zum Thema Klimaanalgen finden Sie hier. Die wichtigsten Hersteller von Dachklimaanlagen mit 1100 bis 3200 Watt K\u00fchlleistung sind Dometic, Truma, Telair und Coleman. Eine Sonderform der Kompressor-Anlage ist die Saphir-Baureihe von Truma f\u00fcr den Einbau im Fahrzeug. Sie findet Platz im Doppelboden oder in einem anderen Staufach. Alle Kompressor-Klimaanlagen haben \u00e4hnliche Nachteile: Ger\u00e4uschloser Betrieb ist nicht m\u00f6glich \u2013 sowohl innen als auch au\u00dfen ist stets ein leichtes Brummen vernehmbar. Au\u00dferdem wiegen die Ger\u00e4te zwischen 18 und 24 Kilogramm und brauchen Landstrom. Wer autark stehen m\u00f6chte, muss einen Generator an Bord haben, der ebenfalls teuer ist, Energie verbraucht und Ger\u00e4usche emittiert. Ohne Kompressor und deshalb mit 12 Volt kommt die Verdunster-Klimaanlage Ebercool von Ebersp\u00e4cher zurecht. Das 25 Kilogramm schwere Dachger\u00e4t verdampft zwischen einem und drei Liter Wasser pro Stunde, um die Luft um etwas mehr als zehn Grad Celsius im Verh\u00e4ltnis zur Au\u00dfentemperatur abzuk\u00fchlen und in den Innenraum zu blasen. Grunds\u00e4tzlich sind Dachklimaanlagen leichter nachzur\u00fcsten als Exemplare f\u00fcr den Einbau innen. Noch mehr Tipps Drau\u00dfen kochen Wer an hei\u00dfen Tagen die K\u00fcche nach drau\u00dfen verlegt, heizt das Wohnmobil nicht noch zus\u00e4tzlich auf. Salate oder kalte Gerichte funktionieren nat\u00fcrlich ohne Herd, man kann aber auch die K\u00fcche nach drau\u00dfen verlegen. Dazu ist es praktisch einen Gaskocher f\u00fcr drau\u00dfen dabeizuhaben. Unsere KollegInnen haben erst k\u00fcrzlich verschiedene Modelle getestet, die sich f\u00fcr die Au\u00dfenk\u00fcche eignen. Hier finden Sie alle Modelle und den ganzen Test. Erfrischungen Nat\u00fcrlich gilt beim Campingurlaub wie auch sonst an hei\u00dfen Tagen, immer genug trinken! Wer sich schon beim Cremen abk\u00fchlen will, kann die Sonnencreme in den K\u00fchlschrank stellen. Frische bringt zu Beispiel auch ein Bodyspray mit Pfefferminz\u00f6l oder einfach eine Spr\u00fchflasche mit Wasser.", + "summary": "

Die erste Hitzewelle ist in vollem Gange. Wir verraten die besten Tipps und Tricks, wie es im Camper kühl bleibt.

", + "text": "Es wird richtig heiß! Wenn die Temperaturen im Sommer steigen, kann es im Wohnmobil schnell unangenehm heiß werden. Besonders bei Reisen nach Südeuropa oder während Hitzewellen in Deutschland heizt sich der Innenraum von Wohnmobilen, Campingbussen oder Wohnwagen tagsüber stark auf. Und wir alle fragen uns: Was tun, wenn es zu heiß wird im Campingfahrzeug? Keine Sorge, es gibt zahlreiche Möglichkeiten, wie Sie die heißen Tage angenehmer gestalten können. Wir haben die besten Kühl-Tipps für Sie zusammengestellt, damit Sie auch bei hohen Temperaturen einen kühlen Kopf bewahren können. Wer sehr temperaturempfindlich ist, sollte auch bei der Wahl des Urlaubsortes das Klima im Kopf behalten. Vor allem für Menschen mit Vorerkrankungen, kleine Kinder, Schwangere und ältere Reisende ist der Trend Coolcation im Hochsommer wahrscheinlich die beste Wahl – Sprich: Ein Sommerurlaub an einem kühlen Ort. Sie wollen trotzdem in den Süden oder lieben es einfach, wenn es draußen warm ist? Mit den folgenden Maßnahmen können Sie auch bei hohen Temperaturen einen angenehmen und erholsamen Campingurlaub genießen. Richtig lüften Sobald die ersten Sonnenstrahlen die Luft aufheizen, werden die Schotten dicht gemacht. Im Reisemobil oder Wohnwagen bedeutet das: Fenster und Luken zu. Lüften mittels Dachluken und Fenster ergibt nur Sinn, wenn es draußen kühler ist. Und genau die Südeuropäer machen uns vor, wie es geht: Sie lüften dann, wenn es draußen kühler ist als drin – und zwar von spätabends bis frühmorgens . Auch wenn draußen ein kleines Lüftchen weht, ergibt das Lüften Sinn. Dann entsteht auch drinnen ein Luftstrom , der zwar die Temperatur real nicht senkt, sie jedoch erträglicher macht. Kastenwagen heizen sich stärker auf, weshalb hier offene Fenster und Türen auch tagsüber Linderung bringen können. Fensterschutz Wer denkt, das Schließen aller Rollos würde dem rasanten Temperaturanstieg entgegenwirken, liegt nicht ganz richtig. Zwar versprechen die silbrig folierten Rollo-Außenseiten eine gewisse Abschirmung, doch wenn das Sonnenlicht auf die Rollos trifft, ist die Wärme schon hinter den Fensterscheiben – also im Fahrzeug. Fenster, Luken und Türen sind die eigentlichen Hitzeschleusen. Spezielle Funktionstextilien , die man außen anbringt, helfen, sie besser zu isolieren. Die größte Wirksamkeit entwickeln sie in Kombination mit geschlossenen Rollos innen. Für Dachhauben und Seitenfenster haben verschiedene Firmen maßgeschneiderte Sonnenschutz-Überzüge im Programm. Die Beschaffenheit der Überzüge ist unterschiedlich: Durch die Dometic \" Sunshades \" dringt immer noch ein wenig Tageslicht, die Thermomatte von Hindermann ist dagegen komplett undurchsichtig. Die Hindermann Thermomatte können Sie hier direkt bei unserem Partnershop Fritz Berger bestellen. Cockpit-Schutz Vor allem für das größte Fenster im Fahrzeug, die Frontscheibe, eignet sich zusätzlich eine Thermofolie außen, erhältlich beispielsweise bei Fritz Berger. Der Zubehörhandel hat eine Vielzahl maßgeschneiderter silber bedampfter Dämmmatten im Angebot. Die Preisspannen sind enorm. Je nach technischer Finesse und Ausstattung kosten sie zwischen 100 und 900 Euro. Die Frontscheiben-Thermofolie von Fritz Berger können Sie direkt bei Fritz Berger bestellen, einfach hier klicken. Noch mehr Thermomatten für die Frontscheibe gibt es hier bei Camping Wagner. Ventilatoren Dem Luftzug auf die Sprünge helfen Ventilator-Dachhauben . Bei Fiamma heißen sie Turbo Vent und Turbo Vent Premium, passen in Dachlukenausschnitte von 36 mal 36 und 40 mal 40 Zentimeter Größe und verfügen über zwei Laufrichtungen sowie stufenlose Drehzahlregelung. Damit kann kühle Außenluft zu- oder heiße Innenluft abgeführt werden. Beim Luftverkehr von drinnen nach draußen dienen Ventilator-Dachhauben je nach Einbaulage auch als Dunstabzug für Küche oder Bad. Hier gibt es noch mehr Informationen über Ventilatoren fürs Camping. Hier gibt es die Fiamma-Ventilator-Dachhauben in unserem Partnershop Fritz Berger. Ebenfalls erhältlich ist der Universal-Ventilator Fritz Berger Turbo-Kit, der mit Querstreben unter herkömmlichen Dachhauben montiert werden kann. Seinen Strom bezieht er über eine handwerklich aufwendige Verkabelung mit dem Bordnetz oder acht 1,5-Volt-Batterien. Natürlich funktioniert auch jeder normale Tischventilator . Dagegen sprechen jedoch der Platzbedarf, den er im Wohnmobil und beim Transport beansprucht, und dass ein Kabel durch den Raum führt. Schatten suchen Effektiver Hitzeschutz fängt außen an. Die simpelste Lösung heißt: Einen schattigen Stellplatz unter Bäumen suchen. In die dunkle Röhre schaut dann nur der, der seine Satellitenschüssel fest auf dem Dach montiert hat. Wer häufig heiße Regionen aufsucht und trotzdem nicht aufs Fernsehen verzichten mag, greift besser zu transportablen Sat-Schüsseln. Oder hat einfach einen Router dabei und streamt das Fernseh-Programm. Hier finden Sie mehr zum Thema Internet im Reisemobil: Aktuelle Router haben wir hier getestet. Noch mehr dazu gibt es hier: Router für unterwegs. Aber auch das Bier bleibt auf Schattenplätzen länger kühl, weil Absorberkühlschränke systembedingt nur 30 Grad Celsius unter die Außentemperatur kommen. Knallt die Sonne durch die Abluftgitter auf die Kühlschrankrückseite, kann es kritisch werden. Spezielle 12-Volt- Kühlschrankventilatoren mildern oder beheben dieses Problem. Sowohl Dometic als auch Thetford haben einbaufertige Ventilator-Sets für rund 45 bzw. 53 Euro im Programm. Hier können Sie solche Ventilatoren direkt bei unserem Partnershop Fritz Berger bestellen. Markise Selbst auf dem lauschigsten Schattenplatz scheint irgendwann die Sonne. Dann schlägt die Stunde von Markise und Sonnendach. Planen mit UV-Blocker schützen Haut und Fahrzeug. Eine vom textilen Vordach beschattete Seitenwand bleibt deutlich kühler als eine direkt bestrahlte. Das Angebot an Markisen ist enorm. Es reicht vom einfachen Sonnensegel (ab ca. 180 Euro) über in die Kederleiste eingezogene Sackmarkisen , die von Hand entrollt und aufgestellt werden müssen, bis zu klassischen Kassettenmarkisen , die per Handkurbel oder elektrisch ausfahren. Viele Sack- und Kassettenmarkisen lassen sich durch Front- und Seitenteile zu Windfängen und geschlossenen Vorzelten erweitern – eine variable Lösung für die meisten Einsätze mit Ausnahme von extremem Wintercamping. Sonnensegel können Sie hier bei unserem Partnershop Fritz Berger direkt bestellen. Tipps und alles rund ums Thema Markise finden Sie hier. Belüftete Sitzmatte Wer keine Klimaanlage fürs Fahrerhaus hat, kann während der Fahrt zwar das Fenster einen Spalt öffnen. Allerdings riskiert man damit im schlimmsten Fall, sich durch den kalten Luftstrom im Nacken einen \"Zug\" zu holen, eine Muskelverspannung. Eine nachrüstbare Alternative für lange Strecken bei praller Sonne ist eine belüftete Sitzauflage. Diese kühlenden Sitzmatten tragen an mehreren Stellen im Polster einen Luftauslass. Matten wie die von Westfalia werden via 12-Volt-Anschluss betrieben. Kühlmatten Ganz ohne Strom funktionieren Kühlmatten, die es ebenfalls für die Sitze gibt, aber fürs Bett. Gehen die Temperaturen auch nachts nicht in den Keller, könnte beispielsweise die Freshmat von Wiegel für Linderung sorgen. Die Kühlkissen, die es als 30 mal 40 Zentimeter große Sitz- sowie als 90 mal 90 Zentimeter große faltbare Matratzenauflage gibt, haben einen Gelkern, der bei Druck Kühle erzeugt. Sobald Druck fehlt, regeneriert sich das Gel ohne Strom- oder Kältezufuhr. Die Matten gibt es auch für das Haustier. Kühlmatten für Haustiere gibt es hier bei Fritz Berger. Hier gibt es verschiedene Kühlmatten bei Amazon. Schutzfarbe Der Aufbau des Wohnmobils bleibt durch einen UV-Schutzanstrich auf dem Dach kühler, beispielsweise von der Marke Cooldry. Die Dispersionsfarbe enthält Reflexionskomponenten, die bis zu 90 Prozent der Sonnenenergie reflektieren sollen. Des Weiteren gibt der Hersteller an, dass sich die Oberflächentemperatur des nach dem Anstrich mattweißen oder -beigen Dachs bei direkter Sonnenbestrahlung bei Tests von 45,4 auf 31,4 Grad reduziert. Die Schutzfarbe kann direkt auf das lackierte Blech bzw. GFK aufgetragen werden. Der Originallack kann, muss aber nicht angeschliffen werden. Laut Hersteller genügt ein Liter Cooldry für ca. 1,5 m² bei zwei Schichten. Das heißt: zehn Liter reichen für ca. 15 m², der Literpreis liegt aktuell bei rund 20,40 Euro. Nach rund einer Stunde klebt der Schutzanstrich nicht mehr, nach zwölf bis 16 Stunden kann eine zweite Schicht aufgetragen werden. Klimaanlagen Klimaanlagen sind die Hightech-Geräte gegen Hitze. Die Anlagen unterscheiden sich durch ihre Wirkungsweise und den Einbauort. Die effektivste Kühlung, jedoch unter intensivem Einsatz von 230-Volt-Strom, versprechen Kompressor-Klimaanlagen . Diese gibt es für die Montage auf dem Dach in einem Dachlukenausschnitt von 40 mal 40 Zentimeter Größe. Unsere große Kaufberatung mit Marktübersicht zum Thema Klimaanalgen finden Sie hier. Die wichtigsten Hersteller von Dachklimaanlagen mit 1100 bis 3200 Watt Kühlleistung sind Dometic, Truma, Telair und Coleman. Eine Sonderform der Kompressor-Anlage ist die Saphir-Baureihe von Truma für den Einbau im Fahrzeug. Sie findet Platz im Doppelboden oder in einem anderen Staufach. Alle Kompressor-Klimaanlagen haben ähnliche Nachteile: Geräuschloser Betrieb ist nicht möglich – sowohl innen als auch außen ist stets ein leichtes Brummen vernehmbar. Außerdem wiegen die Geräte zwischen 18 und 24 Kilogramm und brauchen Landstrom. Wer autark stehen möchte, muss einen Generator an Bord haben, der ebenfalls teuer ist, Energie verbraucht und Geräusche emittiert. Ohne Kompressor und deshalb mit 12 Volt kommt die Verdunster-Klimaanlage Ebercool von Eberspächer zurecht. Das 25 Kilogramm schwere Dachgerät verdampft zwischen einem und drei Liter Wasser pro Stunde, um die Luft um etwas mehr als zehn Grad Celsius im Verhältnis zur Außentemperatur abzukühlen und in den Innenraum zu blasen. Grundsätzlich sind Dachklimaanlagen leichter nachzurüsten als Exemplare für den Einbau innen. Noch mehr Tipps Draußen kochen Wer an heißen Tagen die Küche nach draußen verlegt, heizt das Wohnmobil nicht noch zusätzlich auf. Salate oder kalte Gerichte funktionieren natürlich ohne Herd, man kann aber auch die Küche nach draußen verlegen. Dazu ist es praktisch einen Gaskocher für draußen dabeizuhaben. Unsere KollegInnen haben erst kürzlich verschiedene Modelle getestet, die sich für die Außenküche eignen. Hier finden Sie alle Modelle und den ganzen Test. Erfrischungen Natürlich gilt beim Campingurlaub wie auch sonst an heißen Tagen, immer genug trinken! Wer sich schon beim Cremen abkühlen will, kann die Sonnencreme in den Kühlschrank stellen. Frische bringt zu Beispiel auch ein Bodyspray mit Pfefferminzöl oder einfach eine Sprühflasche mit Wasser.", "tags": [], "status": "Online", "link": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/", @@ -5036,8 +5036,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1918478.jpg", - "alt": "Abk\u00fchlung bei Hitze im Wohnmobil", - "caption": "Abk\u00fchlung bei Hitze im Wohnmobil", + "alt": "Abkühlung bei Hitze im Wohnmobil", + "caption": "Abkühlung bei Hitze im Wohnmobil", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" }, @@ -5120,8 +5120,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1986977.jpg", - "alt": "Klimaanlage von Dometic? - K\u00fchlen", - "caption": "Klimaanlage von Dometic? - K\u00fchlen", + "alt": "Klimaanlage von Dometic? - Kühlen", + "caption": "Klimaanlage von Dometic? - Kühlen", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" }, @@ -5148,8 +5148,8 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1052520.jpg", - "alt": "Zubeh\u00f6rspezialist Truma bietet neue Dachklimaanlage Aventa comfort mit speziellem Dichtkonzept an", - "caption": "Zubeh\u00f6rspezialist Truma bietet neue Dachklimaanlage Aventa comfort mit speziellem Dichtkonzept an", + "alt": "Zubehörspezialist Truma bietet neue Dachklimaanlage Aventa comfort mit speziellem Dichtkonzept an", + "caption": "Zubehörspezialist Truma bietet neue Dachklimaanlage Aventa comfort mit speziellem Dichtkonzept an", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/tipps-schutz-gegen-sommerhitze-hitzestau-wohnmobil/" }, @@ -5200,10 +5200,10 @@ }, { "id": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/", - "title": "Dethleffs Reiselust-Pr\u00e4mie: Bis zu 20.000 Euro Rabatt auf Wohnmobile", + "title": "Dethleffs Reiselust-Prämie: Bis zu 20.000 Euro Rabatt auf Wohnmobile", "date": "Sat, 28 Jun 2025 12:00:00 +0200", "summary": "

Dethleffs geht in die Rabattschlacht: bis zu 10.000 Euro Rabatt auf Neufahrzeuge und bis zu 20.000 Euro auf junge Gebrauchte!

", - "text": "Dethleffs startet eine attraktive Rabattaktion und bietet K\u00e4ufern bis zu 20.000 Euro Preisvorteil auf junge gebrauchte Wohnmobile und Campingbusse und bis zu 10.000 Euro auf neue. Mit der \"Reiselust-Pr\u00e4mie\" sorgt der Hersteller daf\u00fcr, dass der Traum vom eigenen Fahrzeug f\u00fcr viele Camper noch greifbarer wird. Vor allem zeitnah: Denn die Rabatte gelten nur f\u00fcr Fahrzeuge, die bereits produziert sind und schon in den H\u00f6fen der H\u00e4ndler stehen. Wer zugreift, spart bis zum 31. Juli 2025 \u2013 eine Gelegenheit, die sich viele nicht entgehen lassen sollten. Reiselust-Pr\u00e4mie f\u00fcr Neufahrzeuge und junge Gebrauchte Das Angebot gilt nur f\u00fcr ausgew\u00e4hlte Modelle, und die Rabatth\u00f6he ist abh\u00e4ngig vom Modelljahr. Besonders hervorzuheben ist, dass auch junge Gebrauchtfahrzeuge Teil der Aktion sind. Diese M\u00f6glichkeit ist besonders f\u00fcr Camper von Interesse, die ein nahezu neues Fahrzeug zu einem deutlich g\u00fcnstigeren Preis erwerben m\u00f6chten. Zu den rabattierten Fahrzeugen geh\u00f6rt etwa der Dethleffs Trend , der f\u00fcr seine Kombination aus modernem Design und cleverem Komfort bekannt ist. Als Integrierter (Trend I ) oder Teilintegrierter (Trend T ) mit \"Reiselust-Pr\u00e4mie\" erh\u00e4ltlich, bietet das Wohnmobil alles, was das Herz eines Camper-Fans h\u00f6her schlagen l\u00e4sst \u2013 vom gro\u00dfz\u00fcgigen Wohnraum bis zu praktischen Details f\u00fcr den Alltag unterwegs. K\u00e4uferinnen und K\u00e4ufer k\u00f6nnen beim Kauf des Bestsellers direkt vom Hof eines H\u00e4ndlers bis zu 6.000 Euro sparen. Auch der Dethleffs Just Camp ist Teil der Rabattaktion. Kompakt, modern und preislich fair, ist dieses Wohnmobil perfekt f\u00fcr Einsteiger und alle, die unkompliziert und ohne viel Aufwand losfahren m\u00f6chten. Wer sich f\u00fcr ein neues Modell entscheidet, profitiert von bis zu 6.000 Euro Rabatt. Die Rabatte f\u00fcr neue aufgebaute Wohnmobile sind jeweils gestaffelt: Modelljahr 2023: 6.000 Euro Modelljahr 2024: 4.000 Euro Modelljahr 2025: 2.000 Euro Bis zu 10.000 Euro Rabatt bekommen Camperinnen und Camper auf neue Globetrail Campingbusse . Auch hier gibt es wieder eine Staffelung: Modelljahr 2023: 10.000 Euro Modelljahr 2024: 8.000 Euro Modelljahr 2025: 6.000 Euro F\u00fcr Gebrauchtfahrzeuge der Baujahre 2022 bis 2025 gibt es ebenfalls hohe Rabatte, die aber an bestimmte Fahrzeuge gebunden sind. Globetrail (ausgenommen Globetrail Performance), Globebus (ausgenommen Active), Just (ausgenommen Active): je 8.000 Euro Pr\u00e4mie Trend (ausgenommen Alkoven): 10.000 Euro Pr\u00e4mie Esprit : 15.000 Euro Pr\u00e4mie Globetrotter XLI & XXL A: je 20.000 Euro Pr\u00e4mie Vorteile der Aktion f\u00fcr Camper Warum gerade jetzt ein Dethleffs Wohnmobil oder Campervan? Die Antwort ist einfach: Die \"Reiselust-Pr\u00e4mie\" macht den Kauf eines neuen oder jungen gebrauchten Fahrzeugs attraktiver denn je. Wer ein Wohnmobil oder einen Campervan von Dethleffs ins Auge fasst, spart nicht nur durch den Rabatt, sondern erh\u00e4lt auch ein Fahrzeug, das mit guter Qualit\u00e4t und praktischen Funktionen \u00fcberzeugt. F\u00fcr all diejenigen, die sich von den Fahrzeugen pers\u00f6nlich \u00fcberzeugen m\u00f6chten, bieten Dethleffs' Handelspartner zahlreiche Hausmessen an. Hier k\u00f6nnen Interessierte die Fahrzeuge anschauen. Die genaue Liste der Veranstaltungen und Termine ist online einsehbar. Alternativ k\u00f6nnen Kunden online einen Termin bei einem H\u00e4ndler in der N\u00e4he anfragen, bei dem Rabatt-Modelle verf\u00fcgbar sind. Einschr\u00e4nkungen und Details zur Aktion Die \"Reiselust-Pr\u00e4mie\" gilt nur bis zum 31. Juli 2025 und nur f\u00fcr Fahrzeuge, die bei teilnehmenden H\u00e4ndlern jetzt schon verf\u00fcgbar sind \u2013 nicht auf Neubestellungen. Wer sich also f\u00fcr ein Modell interessiert, sollte nicht zu lange warten. Das Angebot gilt, solange der Vorrat reicht. Dethleffs schafft Platz f\u00fcr Neuheiten Von der Rabattaktion profitieren die Kunden. Sie schafft auf den H\u00f6fen der H\u00e4ndler nebenbei Platz f\u00fcr Neuheiten und hilft den Betrieben aus der Krise. Denn die Branche hat bedingt durch eine deutliche \u00dcberproduktion und anziehende Absatzschwierigkeiten mit einem \u00dcberbestand zu k\u00e4mpfen, der das Kapital der Handelsbetriebe bindet und die ihre Gewinne mindert.", + "text": "Dethleffs startet eine attraktive Rabattaktion und bietet Käufern bis zu 20.000 Euro Preisvorteil auf junge gebrauchte Wohnmobile und Campingbusse und bis zu 10.000 Euro auf neue. Mit der \"Reiselust-Prämie\" sorgt der Hersteller dafür, dass der Traum vom eigenen Fahrzeug für viele Camper noch greifbarer wird. Vor allem zeitnah: Denn die Rabatte gelten nur für Fahrzeuge, die bereits produziert sind und schon in den Höfen der Händler stehen. Wer zugreift, spart bis zum 31. Juli 2025 – eine Gelegenheit, die sich viele nicht entgehen lassen sollten. Reiselust-Prämie für Neufahrzeuge und junge Gebrauchte Das Angebot gilt nur für ausgewählte Modelle, und die Rabatthöhe ist abhängig vom Modelljahr. Besonders hervorzuheben ist, dass auch junge Gebrauchtfahrzeuge Teil der Aktion sind. Diese Möglichkeit ist besonders für Camper von Interesse, die ein nahezu neues Fahrzeug zu einem deutlich günstigeren Preis erwerben möchten. Zu den rabattierten Fahrzeugen gehört etwa der Dethleffs Trend , der für seine Kombination aus modernem Design und cleverem Komfort bekannt ist. Als Integrierter (Trend I ) oder Teilintegrierter (Trend T ) mit \"Reiselust-Prämie\" erhältlich, bietet das Wohnmobil alles, was das Herz eines Camper-Fans höher schlagen lässt – vom großzügigen Wohnraum bis zu praktischen Details für den Alltag unterwegs. Käuferinnen und Käufer können beim Kauf des Bestsellers direkt vom Hof eines Händlers bis zu 6.000 Euro sparen. Auch der Dethleffs Just Camp ist Teil der Rabattaktion. Kompakt, modern und preislich fair, ist dieses Wohnmobil perfekt für Einsteiger und alle, die unkompliziert und ohne viel Aufwand losfahren möchten. Wer sich für ein neues Modell entscheidet, profitiert von bis zu 6.000 Euro Rabatt. Die Rabatte für neue aufgebaute Wohnmobile sind jeweils gestaffelt: Modelljahr 2023: 6.000 Euro Modelljahr 2024: 4.000 Euro Modelljahr 2025: 2.000 Euro Bis zu 10.000 Euro Rabatt bekommen Camperinnen und Camper auf neue Globetrail Campingbusse . Auch hier gibt es wieder eine Staffelung: Modelljahr 2023: 10.000 Euro Modelljahr 2024: 8.000 Euro Modelljahr 2025: 6.000 Euro Für Gebrauchtfahrzeuge der Baujahre 2022 bis 2025 gibt es ebenfalls hohe Rabatte, die aber an bestimmte Fahrzeuge gebunden sind. Globetrail (ausgenommen Globetrail Performance), Globebus (ausgenommen Active), Just (ausgenommen Active): je 8.000 Euro Prämie Trend (ausgenommen Alkoven): 10.000 Euro Prämie Esprit : 15.000 Euro Prämie Globetrotter XLI & XXL A: je 20.000 Euro Prämie Vorteile der Aktion für Camper Warum gerade jetzt ein Dethleffs Wohnmobil oder Campervan? Die Antwort ist einfach: Die \"Reiselust-Prämie\" macht den Kauf eines neuen oder jungen gebrauchten Fahrzeugs attraktiver denn je. Wer ein Wohnmobil oder einen Campervan von Dethleffs ins Auge fasst, spart nicht nur durch den Rabatt, sondern erhält auch ein Fahrzeug, das mit guter Qualität und praktischen Funktionen überzeugt. Für all diejenigen, die sich von den Fahrzeugen persönlich überzeugen möchten, bieten Dethleffs' Handelspartner zahlreiche Hausmessen an. Hier können Interessierte die Fahrzeuge anschauen. Die genaue Liste der Veranstaltungen und Termine ist online einsehbar. Alternativ können Kunden online einen Termin bei einem Händler in der Nähe anfragen, bei dem Rabatt-Modelle verfügbar sind. Einschränkungen und Details zur Aktion Die \"Reiselust-Prämie\" gilt nur bis zum 31. Juli 2025 und nur für Fahrzeuge, die bei teilnehmenden Händlern jetzt schon verfügbar sind – nicht auf Neubestellungen. Wer sich also für ein Modell interessiert, sollte nicht zu lange warten. Das Angebot gilt, solange der Vorrat reicht. Dethleffs schafft Platz für Neuheiten Von der Rabattaktion profitieren die Kunden. Sie schafft auf den Höfen der Händler nebenbei Platz für Neuheiten und hilft den Betrieben aus der Krise. Denn die Branche hat bedingt durch eine deutliche Überproduktion und anziehende Absatzschwierigkeiten mit einem Überbestand zu kämpfen, der das Kapital der Handelsbetriebe bindet und die ihre Gewinne mindert.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/ratgeber/dethleffs-reiselust-praemie-2025-rabatte-wohnmobile/", @@ -5325,10 +5325,10 @@ }, { "id": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/", - "title": "Der neue promobil-Newsletter - gratis!: Zum Fr\u00fchst\u00fcck die spannendsten Camping-Themen", + "title": "Der neue promobil-Newsletter - gratis!: Zum Frühstück die spannendsten Camping-Themen", "date": "Fri, 27 Jun 2025 13:00:00 +0200", - "summary": "

Den promobil-Newsletter gibt es ab sofort auch Samstagmorgens: Zum Fr\u00fchst\u00fcck servieren wir die frischesten Camping-News.

", - "text": "Melden Sie sich f\u00fcr unseren gratis promobil-Newsletter an und verpassen Sie keine Neuigkeiten mehr. Jetzt sogar zwei Mal die Woche. Warum? Weil wir nicht wollen, dass Sie etwas verpassen. +++ Hier zum Newsletter anmelden .+++ Mehr Reisetipps, Zubeh\u00f6r-Highlights und Wohnmobil-Neuheiten \u2013 direkt ins Postfach Camping ist mehr als ein Hobby \u2013 es ist eine Leidenschaft. Wer unterwegs ist, plant, umbaut oder tr\u00e4umt, braucht vor allem eines: aktuelle Infos, die wirklich weiterhelfen. Genau deshalb gibt\u2019s den promobil-Newsletter \u2013 und jetzt sogar zweimal pro Woche! Neu: Ihr Samstags-Update zum Fr\u00fchst\u00fcck Ab dem 5. Juli 2025 schicken wir Ihnen den promobil-Newsletter zus\u00e4tzlich samstags um 9 Uhr \u2013 p\u00fcnktlich zum ersten Kaffee. Warum? Weil wir jede Woche so viele spannende Themen haben, dass ein einziger Newsletter einfach nicht mehr reicht. Modellneuheiten, clevere Techniktrends, Zubeh\u00f6r, das den Camping-Alltag leichter macht \u2013 dazu Ratgeber, Tourentipps und Stellplatz-Geheimtipps aus der Redaktion. Wohin am Wochenende? Was ist neu auf dem Markt? Wir liefern Antworten. Mit dem neuen Samstags-Newsletter bleiben Sie am Puls der Camping-Welt. Egal, ob Sie Ihre erste Reise planen oder schon seit Jahren unterwegs sind \u2013 unsere Inhalte richten sich an alle, die Camping leben. Kuratiert von der promobil-Redaktion, geschrieben mit Blick auf die Praxis. Doppelt informiert, doppelt inspiriert Unsere Newsletter-Abonnentinnen und -Abonennten bekommen jetzt mittwochs und samstags alles Wichtige aus der Welt der Wohnmobile, Vans und Campingpl\u00e4tze \u2013 ohne langes Suchen, ohne Umwege. So starten Sie nicht nur bestens informiert in die Woche, sondern auch mit frischer Inspiration ins Wochenende . Jetzt anmelden und dabei sein Ob im Camper, zu Hause oder auf der Suche nach der n\u00e4chsten Idee \u2013 der promobil-Newsletter liefert, was z\u00e4hlt. Jetzt einfach anmelden und keinen Reisetipp, kein neues Zubeh\u00f6r und keine spannende Story mehr verpassen! Hier f\u00fcr den promobil-Newsletter anmelden . \u00dcbrigens k\u00f6nnen Sie nicht nur den promobil-Newsletter mit allen Themen rund um Wohnmobile abonnieren, sondern auch den CARAVANING-Newsletter mit allen Infos rund um Wohnwagen und Zugfahrzeug. Jede Woche die neuesten Caravans, Zugfahrzeugtests sowie n\u00fctzliches Zubeh\u00f6r, Campingplatz-Tipps und die aktuellen Ratgeber f\u00fcr die Pflege und Optimierung Ihres eigenen Wohnwagens \u2013 hier finden Sie alle News! Damit Sie alle spannenden Artikel lesen k\u00f6nnen und Ihnen nichts vorenthalten bleibt, schlie\u00dfen Sie gleich unser Plus-Abo mit ab. Die neuesten Insider-Informationen rund um neue Wohnmobile, ausf\u00fchrliche Ratgeber f\u00fcr Ihr liebstes Gef\u00e4hrt zu Hause oder die besten getesteten Stellpl\u00e4tze schalten Sie mit einem promobil-Plus-Abo frei. Hier das promobil-Plus-Abo abschlie\u00dfen .", + "summary": "

Den promobil-Newsletter gibt es ab sofort auch Samstagmorgens: Zum Frühstück servieren wir die frischesten Camping-News.

", + "text": "Melden Sie sich für unseren gratis promobil-Newsletter an und verpassen Sie keine Neuigkeiten mehr. Jetzt sogar zwei Mal die Woche. Warum? Weil wir nicht wollen, dass Sie etwas verpassen. +++ Hier zum Newsletter anmelden .+++ Mehr Reisetipps, Zubehör-Highlights und Wohnmobil-Neuheiten – direkt ins Postfach Camping ist mehr als ein Hobby – es ist eine Leidenschaft. Wer unterwegs ist, plant, umbaut oder träumt, braucht vor allem eines: aktuelle Infos, die wirklich weiterhelfen. Genau deshalb gibt’s den promobil-Newsletter – und jetzt sogar zweimal pro Woche! Neu: Ihr Samstags-Update zum Frühstück Ab dem 5. Juli 2025 schicken wir Ihnen den promobil-Newsletter zusätzlich samstags um 9 Uhr – pünktlich zum ersten Kaffee. Warum? Weil wir jede Woche so viele spannende Themen haben, dass ein einziger Newsletter einfach nicht mehr reicht. Modellneuheiten, clevere Techniktrends, Zubehör, das den Camping-Alltag leichter macht – dazu Ratgeber, Tourentipps und Stellplatz-Geheimtipps aus der Redaktion. Wohin am Wochenende? Was ist neu auf dem Markt? Wir liefern Antworten. Mit dem neuen Samstags-Newsletter bleiben Sie am Puls der Camping-Welt. Egal, ob Sie Ihre erste Reise planen oder schon seit Jahren unterwegs sind – unsere Inhalte richten sich an alle, die Camping leben. Kuratiert von der promobil-Redaktion, geschrieben mit Blick auf die Praxis. Doppelt informiert, doppelt inspiriert Unsere Newsletter-Abonnentinnen und -Abonennten bekommen jetzt mittwochs und samstags alles Wichtige aus der Welt der Wohnmobile, Vans und Campingplätze – ohne langes Suchen, ohne Umwege. So starten Sie nicht nur bestens informiert in die Woche, sondern auch mit frischer Inspiration ins Wochenende . Jetzt anmelden und dabei sein Ob im Camper, zu Hause oder auf der Suche nach der nächsten Idee – der promobil-Newsletter liefert, was zählt. Jetzt einfach anmelden und keinen Reisetipp, kein neues Zubehör und keine spannende Story mehr verpassen! Hier für den promobil-Newsletter anmelden . Übrigens können Sie nicht nur den promobil-Newsletter mit allen Themen rund um Wohnmobile abonnieren, sondern auch den CARAVANING-Newsletter mit allen Infos rund um Wohnwagen und Zugfahrzeug. Jede Woche die neuesten Caravans, Zugfahrzeugtests sowie nützliches Zubehör, Campingplatz-Tipps und die aktuellen Ratgeber für die Pflege und Optimierung Ihres eigenen Wohnwagens – hier finden Sie alle News! Damit Sie alle spannenden Artikel lesen können und Ihnen nichts vorenthalten bleibt, schließen Sie gleich unser Plus-Abo mit ab. Die neuesten Insider-Informationen rund um neue Wohnmobile, ausführliche Ratgeber für Ihr liebstes Gefährt zu Hause oder die besten getesteten Stellplätze schalten Sie mit einem promobil-Plus-Abo frei. Hier das promobil-Plus-Abo abschließen .", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/promobil-newsletter-ab-sofort-zwei-mal-die-woche-samstags-keine-camping-news-verpassen/", @@ -5429,10 +5429,10 @@ }, { "id": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/", - "title": "Drittes Camping-Rekordjahr in Folge: S\u00fcd schl\u00e4gt Nord \u2013 Hier wird am h\u00e4ufigsten gecampt", + "title": "Drittes Camping-Rekordjahr in Folge: Süd schlägt Nord – Hier wird am häufigsten gecampt", "date": "Tue, 24 Jun 2025 14:00:00 +0200", - "summary": "

Camping ist weiterhin im Trend: 2024 stieg die Zahl der Camping\u00fcbernachtungen in Deutschland im Vergleich zum Vorjahr. Doch wo campt man am h\u00e4ufigsten?

", - "text": "Die aktuellen \u00dcbernachtungszahlen aus dem vergangenen Jahr zeigen: Campingtourismus boomt weiterhin! Die deutsche Campingbranche verzeichnete im vergangenen Jahr einen Zuwachs. Mit 42,9 Millionen \u00dcbernachtungen z\u00e4hlt der Urlaub auf Campingpl\u00e4tzen zu den am st\u00e4rksten wachsenden Segmenten in der deutschen Tourismusbranche. Fast jede zw\u00f6lfte (8,6 %) der insgesamt 496,0 Millionen G\u00e4ste\u00fcbernachtungen im Jahr 2024 fand auf einem Campingplatz statt. Das sind die beliebtesten Bundesl\u00e4nder f\u00fcr Camping Wir berichteten bereits \u00fcber die beliebtesten deutschen Regionen 2024 f\u00fcr Campingurlaub . Sehr aufschlussreich ist der Blick auf die beliebtesten Bundesl\u00e4nder f\u00fcr Camping \u2013 dort ist seit vielen Jahren Bayern der ungeschlagene Camping-Champion. 2024 z\u00e4hlte das Bundesland mit \u00fcber 8,3 Millionen die meisten Camping\u00fcbernachtungen in ganz Deutschland. Insgesamt stieg die Anzahl um 1,3 Prozent. Die beliebteste bayerische Campingregion ist \u00fcbrigens das Allg\u00e4u \u2013 doch auch im Bayerischen Wald oder im Fr\u00e4nkischen Seenland lohnt sich ein Besuch. Auf Platz 2 h\u00e4lt sich das Bundesland Niedersachsen mit \u00fcber 6 Millionen Camping\u00fcbernachtungen. Das Bundesland im Norden trendet dabei mehr als Bayern und kann 5,1 Prozent im Vergleich zum Vorjahr dazugewinnen. Die beliebteste Region hier ist nat\u00fcrlich die Nordseek\u00fcste. Doch auch das Harz, die L\u00fcneburger Heide oder das Weserbergland haben ihren ganz eigenen Reiz. Ganz neu auf Platz 3 kommt 2024 das Bundesland Mecklenburg-Vorpommern , da Schleswig-Holstein (-2,3 Prozent) auf Platz 5 absteigt. Das Bundesland im Osten gewinnt 1,9 Prozent dazu und z\u00e4hlt insgesamt 5,53 Millionen Camping\u00fcbernachtungen. Die beliebteste Campingregion in Meck-Pomm ist die Ostseek\u00fcste \u2013 doch auch die Mecklenburgische Seenplatte hat viele Fans. Platz 4 geht an Baden-W\u00fcrttemberg mit 5,41 Millionen Camping\u00fcbernachtungen und einem kleinen Minus von 0,1 Prozent. Der Schwarzwald ist hier der gr\u00f6\u00dfte Camping-Magnet. Top-Campingpl\u00e4tze in den Top 3 Bundesl\u00e4ndern Bleibt die Frage: Welcher Campingplatz ist in den Top 3 Camping-Bundesl\u00e4ndern besonders beliebt? Auf Camping.info haben wir die bestbewerteten Campingpl\u00e4tze der Top 3 Bundesl\u00e4nder herausgefiltert. Voraussetzung: Mehr als 1.000 Bewertungen. Bayern: Campingplatz Demmelhof in Bad T\u00f6lz Ruhe am Alpenrand bietet der Campingplatz Demmelhof. Er liegt idyllisch in der Region Bad T\u00f6lz-Wolfratshausen. Mit seinen gro\u00dfz\u00fcgigen Stellpl\u00e4tzen und modernen Sanit\u00e4ranlagen ist er besonders f\u00fcr Familien und Naturfreunde geeignet. Freizeiteinrichtungen wie ein gro\u00dfz\u00fcgiger Spielplatz und Wanderm\u00f6glichkeiten in den umliegenden Bergen machen ihn zu einem idealen Ausgangspunkt f\u00fcr Outdoor-Aktivit\u00e4ten. Die j\u00fcngste Bewertung in der Stellplatz-Radar-App beschreibt den Platz wie folgt: \"Sehr ehrlicher und menschlicher Bauernhof-Campingplatz mit toller zentraler Lage. Der See war eine willkommene Abk\u00fchlung.\" Niedersachsen: Campingplatz S\u00fcdheide in Winsen Inmitten der malerischen S\u00fcdheide bei Winsen (Luhe) gelegen, \u00fcberzeugt dieser Campingplatz mit seiner naturnahen Atmosph\u00e4re. Der Platz bietet gro\u00dfz\u00fcgige Stellfl\u00e4chen und moderne Einrichtungen f\u00fcr Camper und hat sich besonders als familienfreundlich etabliert. Ein umfangreiches Freizeitangebot mit Rad- und Wanderrouten sowie einem Pool sorgt f\u00fcr abwechslungsreiche Erholung. Eine Bewertung aus dem Stellplatz-Radar lautet: \"Sehr sch\u00f6ner Campingplatz mit neuem Sanit\u00e4rgeb\u00e4ude, sehr gepflegt und sauber. Toller Naturschwimmteich.\" Mecklenburg-Vorpommern: Campingpark K\u00fchlungsborn Direkt an der Ostsee in K\u00fchlungsborn gelegen, besticht dieser Campingplatz durch seine N\u00e4he zum Strand und die vielf\u00e4ltigen Freizeitm\u00f6glichkeiten. Der Campingpark ist ideal f\u00fcr einen aktiven Strandurlaub. Daf\u00fcr sorgt eine breite Auswahl an sportlichen Aktivit\u00e4ten wie Surfen und Beachvolleyball. Die Anlage ist gro\u00dfz\u00fcgig, genauso wie die Stellpl\u00e4tze f\u00fcr Wohnmobile und Zelte. Zur Ausstattung geh\u00f6ren moderne Sanit\u00e4ranlagen und ein Restaurant. Im Stellplatz-Radar schreibt im User: \"Luxus Campingplatz mit dementsprechendem Preis. Wer bucht, sollte das wissen. Sehr sauber, problemlose Anreise.\" Dauerbrenner: Camping gewinnt konstant Beliebtheit Die Auswertungen des Portals Camping.info zeigen dar\u00fcber hinaus, dass der Boom dieser Urlaubsform nicht allein ein Corona-Effekt ist. Seit zehn Jahren steigen die \u00dcbernachtungszahlen kontinuierlich und wurden nur 2020 und 2021 durch Corona-Beschr\u00e4nkungen vor\u00fcbergehend gebremst.", + "summary": "

Camping ist weiterhin im Trend: 2024 stieg die Zahl der Campingübernachtungen in Deutschland im Vergleich zum Vorjahr. Doch wo campt man am häufigsten?

", + "text": "Die aktuellen Übernachtungszahlen aus dem vergangenen Jahr zeigen: Campingtourismus boomt weiterhin! Die deutsche Campingbranche verzeichnete im vergangenen Jahr einen Zuwachs. Mit 42,9 Millionen Übernachtungen zählt der Urlaub auf Campingplätzen zu den am stärksten wachsenden Segmenten in der deutschen Tourismusbranche. Fast jede zwölfte (8,6 %) der insgesamt 496,0 Millionen Gästeübernachtungen im Jahr 2024 fand auf einem Campingplatz statt. Das sind die beliebtesten Bundesländer für Camping Wir berichteten bereits über die beliebtesten deutschen Regionen 2024 für Campingurlaub . Sehr aufschlussreich ist der Blick auf die beliebtesten Bundesländer für Camping – dort ist seit vielen Jahren Bayern der ungeschlagene Camping-Champion. 2024 zählte das Bundesland mit über 8,3 Millionen die meisten Campingübernachtungen in ganz Deutschland. Insgesamt stieg die Anzahl um 1,3 Prozent. Die beliebteste bayerische Campingregion ist übrigens das Allgäu – doch auch im Bayerischen Wald oder im Fränkischen Seenland lohnt sich ein Besuch. Auf Platz 2 hält sich das Bundesland Niedersachsen mit über 6 Millionen Campingübernachtungen. Das Bundesland im Norden trendet dabei mehr als Bayern und kann 5,1 Prozent im Vergleich zum Vorjahr dazugewinnen. Die beliebteste Region hier ist natürlich die Nordseeküste. Doch auch das Harz, die Lüneburger Heide oder das Weserbergland haben ihren ganz eigenen Reiz. Ganz neu auf Platz 3 kommt 2024 das Bundesland Mecklenburg-Vorpommern , da Schleswig-Holstein (-2,3 Prozent) auf Platz 5 absteigt. Das Bundesland im Osten gewinnt 1,9 Prozent dazu und zählt insgesamt 5,53 Millionen Campingübernachtungen. Die beliebteste Campingregion in Meck-Pomm ist die Ostseeküste – doch auch die Mecklenburgische Seenplatte hat viele Fans. Platz 4 geht an Baden-Württemberg mit 5,41 Millionen Campingübernachtungen und einem kleinen Minus von 0,1 Prozent. Der Schwarzwald ist hier der größte Camping-Magnet. Top-Campingplätze in den Top 3 Bundesländern Bleibt die Frage: Welcher Campingplatz ist in den Top 3 Camping-Bundesländern besonders beliebt? Auf Camping.info haben wir die bestbewerteten Campingplätze der Top 3 Bundesländer herausgefiltert. Voraussetzung: Mehr als 1.000 Bewertungen. Bayern: Campingplatz Demmelhof in Bad Tölz Ruhe am Alpenrand bietet der Campingplatz Demmelhof. Er liegt idyllisch in der Region Bad Tölz-Wolfratshausen. Mit seinen großzügigen Stellplätzen und modernen Sanitäranlagen ist er besonders für Familien und Naturfreunde geeignet. Freizeiteinrichtungen wie ein großzügiger Spielplatz und Wandermöglichkeiten in den umliegenden Bergen machen ihn zu einem idealen Ausgangspunkt für Outdoor-Aktivitäten. Die jüngste Bewertung in der Stellplatz-Radar-App beschreibt den Platz wie folgt: \"Sehr ehrlicher und menschlicher Bauernhof-Campingplatz mit toller zentraler Lage. Der See war eine willkommene Abkühlung.\" Niedersachsen: Campingplatz Südheide in Winsen Inmitten der malerischen Südheide bei Winsen (Luhe) gelegen, überzeugt dieser Campingplatz mit seiner naturnahen Atmosphäre. Der Platz bietet großzügige Stellflächen und moderne Einrichtungen für Camper und hat sich besonders als familienfreundlich etabliert. Ein umfangreiches Freizeitangebot mit Rad- und Wanderrouten sowie einem Pool sorgt für abwechslungsreiche Erholung. Eine Bewertung aus dem Stellplatz-Radar lautet: \"Sehr schöner Campingplatz mit neuem Sanitärgebäude, sehr gepflegt und sauber. Toller Naturschwimmteich.\" Mecklenburg-Vorpommern: Campingpark Kühlungsborn Direkt an der Ostsee in Kühlungsborn gelegen, besticht dieser Campingplatz durch seine Nähe zum Strand und die vielfältigen Freizeitmöglichkeiten. Der Campingpark ist ideal für einen aktiven Strandurlaub. Dafür sorgt eine breite Auswahl an sportlichen Aktivitäten wie Surfen und Beachvolleyball. Die Anlage ist großzügig, genauso wie die Stellplätze für Wohnmobile und Zelte. Zur Ausstattung gehören moderne Sanitäranlagen und ein Restaurant. Im Stellplatz-Radar schreibt im User: \"Luxus Campingplatz mit dementsprechendem Preis. Wer bucht, sollte das wissen. Sehr sauber, problemlose Anreise.\" Dauerbrenner: Camping gewinnt konstant Beliebtheit Die Auswertungen des Portals Camping.info zeigen darüber hinaus, dass der Boom dieser Urlaubsform nicht allein ein Corona-Effekt ist. Seit zehn Jahren steigen die Übernachtungszahlen kontinuierlich und wurden nur 2020 und 2021 durch Corona-Beschränkungen vorübergehend gebremst.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/campingtourismus-boomt-drittes-camping-rekordjahr-in-folge/", @@ -5568,10 +5568,10 @@ }, { "id": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/", - "title": "Wohnmobil-Handel treibt Vorzelt-Profi in Insolvenz: Camping-Ausr\u00fcster Herzog beantragt Insolvenz", + "title": "Wohnmobil-Handel treibt Vorzelt-Profi in Insolvenz: Camping-Ausrüster Herzog beantragt Insolvenz", "date": "Mon, 23 Jun 2025 14:00:00 +0200", - "summary": "

Herzog, einer der f\u00fchrenden Vorzelthersteller, k\u00e4mpft mit der Insolvenz. Dabei schw\u00e4chelt auch der angeschlossene Wohnmobil- und Wohnwagenhandel. Ein Lehrst\u00fcck \u00fcber die aktuellen T\u00fccken des Caravaning-Marktes.

", - "text": "Der Vorzelthersteller und Caravaning-H\u00e4ndler Herzog ist insolvent. Laut einer Pressemitteilung arbeitet das Unternehmen gemeinsam mit Insolvenzverwalter Holger Bl\u00fcmle von der Kanzlei Schultze und Braun an einer tragf\u00e4higen Sanierung. In Kirchheim am Neckar, 40 Kilometer n\u00f6rdlich von Stuttgart, steht nicht nur ein Traditionsunternehmen vor gro\u00dfen wirtschaftlichen Problemen \u2013 sondern ein exemplarisches Gesch\u00e4ftsmodell. Die Insolvenz von Herzog zeigt, wie problematisch die Marktbedingungen f\u00fcr die H\u00e4ndler in der Caravaning-Branche unter den derzeitigen Bedingungen sind. Das Zwei-S\u00e4ulen-Modell steht unter Druck Herzog ist eine der Top-Adressen Deutschlands f\u00fcr die Produktion ma\u00dfgefertigter Vorzelte. Parallel dazu wurde \u00fcber Jahre ein Handelsbereich mit Wohnwagen, Campingbussen und Wohnmobilen mit angeschlossener Werkstatt aufgebaut. Die Marken: Fendt, Knaus, Tabbert, Weinsberg. Doch genau dieses Gesch\u00e4ftsmodell, das Produktion von Vorzelten und Handel von Campingfahrzeugen vereint, wurde Herzog zum Verh\u00e4ngnis. Anders als bei Kommissionsmodellen kaufen H\u00e4ndler Wohnmobile und Wohnwagen vom Hersteller \u2013 auf eigenes Risiko. Ausgel\u00f6st vom Pandemie-Boom entstand ein Nachfragestau. Die Hersteller kamen mit der Auslieferung nicht hinterher und drehten deshalb ihre Produktions-Kapazit\u00e4ten deutlich hoch. Nach der Pandemie legte sich der Kaufrausch. Die Lebenshaltungskosten erh\u00f6hen sich, die Preise steigen. Die Kundinnen und Kunden nehmen weniger Wohnmobile und Wohnwagen ab, als die Hersteller produzieren und die Handelsbetriebe geordert haben. Die Folge: Viele H\u00e4ndler bleiben auf den Wohnwagen und Wohnmobilen und ihren Finanzierungskosten sitzen, was Liquidit\u00e4t bindet. Gegen\u00fcber der Stuttgarter Zeitung skizzierte Ingo Schorlemmer, Pressesprecher von Schultze und Braun, diese Marktbedingungen als Kernproblem der Branche. Denn sie treiben nicht nur Herzog in Probleme. In den vergangenen Monaten mussten mehrere Caravaning-H\u00e4ndler Insolvenz anmelden oder den Betrieb einstellen . Vorzeltproduktion l\u00e4ngst gedrosselt Mit den Absatzproblemen am Fahrzeugmarkt gingen die Verkaufszahlen von Vorzelten zur\u00fcck. Parallel stiegen die Materialpreise f\u00fcr die hauseigene Zeltproduktion. Schon lange bevor das Insolvenzverfahren eingeleitet wurde, hatte Herzog begonnen, auf die ver\u00e4nderten Marktbedingungen zu reagieren. \"Wir haben schon fr\u00fch damit begonnen, unsere Produktionskapazit\u00e4ten und -prozesse an die ver\u00e4nderten Rahmenbedingungen anzupassen\", erkl\u00e4rt Gesch\u00e4ftsf\u00fchrer Erich Eugen Herzog. Produktionsmengen wurden gestrafft, Abl\u00e4ufe optimiert, alternative Auftr\u00e4ge akquiriert. Auch im Vertrieb setzte Herzog verst\u00e4rkt auf Direktvermarktung und digitale Kan\u00e4le. Dennoch gelang es nicht, die entstandene L\u00fccke in der Auslastung vollst\u00e4ndig zu schlie\u00dfen. Das Unternehmen hat also nicht abgewartet \u2013 sondern gehandelt. Doch die strukturellen Belastungen im Markt waren st\u00e4rker. \"Die Kombination aus Herausforderungen war und ist auch f\u00fcr uns als vorsichtig planendes und agierendes Familienunternehmen \u00fcber einen Zeitraum von inzwischen \u00fcber drei Jahren nicht durchzuhalten\", so Herzog. Das Insolvenzverfahren l\u00e4uft seit Mitte Juni 2025. Herzog f\u00fchrt den Gesch\u00e4ftsbetrieb derzeit regul\u00e4r fort. Die Geh\u00e4lter der Mitarbeitenden sind durch das Insolvenzgeld \u00fcber drei Monate gedeckt. Investoren gesucht Der Insolvenzverwalter Holger Bl\u00fcmle pr\u00fcft derzeit gemeinsam mit der Gesch\u00e4ftsf\u00fchrung Sanierungsoptionen. Das Unternehmen soll unter Mitwirkung der Familie Herzog zukunftsf\u00e4hig aufgestellt werden, um m\u00f6glichst viele Arbeitspl\u00e4tze zu erhalten. Die Neuausrichtung soll insbesondere die St\u00e4rken des Unternehmens nutzen: ma\u00dfgeschneiderte Zeltl\u00f6sungen, ISO-zertifizierte Produktion und einen starken Servicefokus. Zusammen mit den Eigent\u00fcmern und der Unternehmensberatung sucht der Insolvenzverwalter nach Investoren, die in das bestehende Unternehmen einsteigen wolle oder es in ihre Unternehmensgruppe eingliedern m\u00f6chten. Bisher seien die R\u00fcckmeldungen durchweg positiv, hei\u00dft es in der Pressemitteilung der Kanzlei Schulze und Braun. \"Wir werden aber auch noch weitere potenzielle Kandidaten ansprechen. Interessenten f\u00fcr einen Einstieg k\u00f6nnen sich gerne bei mir melden. Der Prozess ist offen f\u00fcr alle ernsthaften Investoren\", sagt Bl\u00fcmel. Was Camper zur Insolvenz wissen m\u00fcssen F\u00fcr Kunden \u00e4ndert sich vorerst wenig. Serviceleistungen bleiben bestehen, Lieferketten sind gesichert. Bestellungen \u00fcber den Online-Shop sind m\u00f6glich, Service und Werkstatt bleiben aktiv. Wer gerade \u00fcber einen Vorzeltkauf oder eine Reparatur nachdenkt, kann das weiterhin mit gutem Gewissen bei Herzog tun. Herzog: Kurze Firmenhistorie Herzog entstand 1902 als Hersteller von Pferdedecken und Rucks\u00e4cken, verlagerte seinen Schwerpunkt mit der Zeit auf Vorzelte f\u00fcr Wohnwagen und Wohnmobile. In diesem Segment geh\u00f6rt das Familienunternehmen zu den Marktf\u00fchrern in Europa. \"Wir produzieren auf \u00fcber 16.000 m\u00b2 mit einem hochmodernen Maschinenpark\", sagt Gesch\u00e4ftsf\u00fchrer Erich Eugen Herzog. Das Unternehmen ist bekannt f\u00fcr seine flexiblen Zeltl\u00f6sungen \u2013 auch als Ma\u00dfanfertigung. Abgerundet wird das umfassende Produktportfolio im Shop von Herzog durch ein breites Camping-, Trekking-, Freizeit- und Outdoor-Sortiment anderer Hersteller.", + "summary": "

Herzog, einer der führenden Vorzelthersteller, kämpft mit der Insolvenz. Dabei schwächelt auch der angeschlossene Wohnmobil- und Wohnwagenhandel. Ein Lehrstück über die aktuellen Tücken des Caravaning-Marktes.

", + "text": "Der Vorzelthersteller und Caravaning-Händler Herzog ist insolvent. Laut einer Pressemitteilung arbeitet das Unternehmen gemeinsam mit Insolvenzverwalter Holger Blümle von der Kanzlei Schultze und Braun an einer tragfähigen Sanierung. In Kirchheim am Neckar, 40 Kilometer nördlich von Stuttgart, steht nicht nur ein Traditionsunternehmen vor großen wirtschaftlichen Problemen – sondern ein exemplarisches Geschäftsmodell. Die Insolvenz von Herzog zeigt, wie problematisch die Marktbedingungen für die Händler in der Caravaning-Branche unter den derzeitigen Bedingungen sind. Das Zwei-Säulen-Modell steht unter Druck Herzog ist eine der Top-Adressen Deutschlands für die Produktion maßgefertigter Vorzelte. Parallel dazu wurde über Jahre ein Handelsbereich mit Wohnwagen, Campingbussen und Wohnmobilen mit angeschlossener Werkstatt aufgebaut. Die Marken: Fendt, Knaus, Tabbert, Weinsberg. Doch genau dieses Geschäftsmodell, das Produktion von Vorzelten und Handel von Campingfahrzeugen vereint, wurde Herzog zum Verhängnis. Anders als bei Kommissionsmodellen kaufen Händler Wohnmobile und Wohnwagen vom Hersteller – auf eigenes Risiko. Ausgelöst vom Pandemie-Boom entstand ein Nachfragestau. Die Hersteller kamen mit der Auslieferung nicht hinterher und drehten deshalb ihre Produktions-Kapazitäten deutlich hoch. Nach der Pandemie legte sich der Kaufrausch. Die Lebenshaltungskosten erhöhen sich, die Preise steigen. Die Kundinnen und Kunden nehmen weniger Wohnmobile und Wohnwagen ab, als die Hersteller produzieren und die Handelsbetriebe geordert haben. Die Folge: Viele Händler bleiben auf den Wohnwagen und Wohnmobilen und ihren Finanzierungskosten sitzen, was Liquidität bindet. Gegenüber der Stuttgarter Zeitung skizzierte Ingo Schorlemmer, Pressesprecher von Schultze und Braun, diese Marktbedingungen als Kernproblem der Branche. Denn sie treiben nicht nur Herzog in Probleme. In den vergangenen Monaten mussten mehrere Caravaning-Händler Insolvenz anmelden oder den Betrieb einstellen . Vorzeltproduktion längst gedrosselt Mit den Absatzproblemen am Fahrzeugmarkt gingen die Verkaufszahlen von Vorzelten zurück. Parallel stiegen die Materialpreise für die hauseigene Zeltproduktion. Schon lange bevor das Insolvenzverfahren eingeleitet wurde, hatte Herzog begonnen, auf die veränderten Marktbedingungen zu reagieren. \"Wir haben schon früh damit begonnen, unsere Produktionskapazitäten und -prozesse an die veränderten Rahmenbedingungen anzupassen\", erklärt Geschäftsführer Erich Eugen Herzog. Produktionsmengen wurden gestrafft, Abläufe optimiert, alternative Aufträge akquiriert. Auch im Vertrieb setzte Herzog verstärkt auf Direktvermarktung und digitale Kanäle. Dennoch gelang es nicht, die entstandene Lücke in der Auslastung vollständig zu schließen. Das Unternehmen hat also nicht abgewartet – sondern gehandelt. Doch die strukturellen Belastungen im Markt waren stärker. \"Die Kombination aus Herausforderungen war und ist auch für uns als vorsichtig planendes und agierendes Familienunternehmen über einen Zeitraum von inzwischen über drei Jahren nicht durchzuhalten\", so Herzog. Das Insolvenzverfahren läuft seit Mitte Juni 2025. Herzog führt den Geschäftsbetrieb derzeit regulär fort. Die Gehälter der Mitarbeitenden sind durch das Insolvenzgeld über drei Monate gedeckt. Investoren gesucht Der Insolvenzverwalter Holger Blümle prüft derzeit gemeinsam mit der Geschäftsführung Sanierungsoptionen. Das Unternehmen soll unter Mitwirkung der Familie Herzog zukunftsfähig aufgestellt werden, um möglichst viele Arbeitsplätze zu erhalten. Die Neuausrichtung soll insbesondere die Stärken des Unternehmens nutzen: maßgeschneiderte Zeltlösungen, ISO-zertifizierte Produktion und einen starken Servicefokus. Zusammen mit den Eigentümern und der Unternehmensberatung sucht der Insolvenzverwalter nach Investoren, die in das bestehende Unternehmen einsteigen wolle oder es in ihre Unternehmensgruppe eingliedern möchten. Bisher seien die Rückmeldungen durchweg positiv, heißt es in der Pressemitteilung der Kanzlei Schulze und Braun. \"Wir werden aber auch noch weitere potenzielle Kandidaten ansprechen. Interessenten für einen Einstieg können sich gerne bei mir melden. Der Prozess ist offen für alle ernsthaften Investoren\", sagt Blümel. Was Camper zur Insolvenz wissen müssen Für Kunden ändert sich vorerst wenig. Serviceleistungen bleiben bestehen, Lieferketten sind gesichert. Bestellungen über den Online-Shop sind möglich, Service und Werkstatt bleiben aktiv. Wer gerade über einen Vorzeltkauf oder eine Reparatur nachdenkt, kann das weiterhin mit gutem Gewissen bei Herzog tun. Herzog: Kurze Firmenhistorie Herzog entstand 1902 als Hersteller von Pferdedecken und Rucksäcken, verlagerte seinen Schwerpunkt mit der Zeit auf Vorzelte für Wohnwagen und Wohnmobile. In diesem Segment gehört das Familienunternehmen zu den Marktführern in Europa. \"Wir produzieren auf über 16.000 m² mit einem hochmodernen Maschinenpark\", sagt Geschäftsführer Erich Eugen Herzog. Das Unternehmen ist bekannt für seine flexiblen Zeltlösungen – auch als Maßanfertigung. Abgerundet wird das umfassende Produktportfolio im Shop von Herzog durch ein breites Camping-, Trekking-, Freizeit- und Outdoor-Sortiment anderer Hersteller.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/ratgeber/camping-ausruester-herzog-beantragt-insolvenz-wohnmobilhandel-belastet-vorzelthersteller/", @@ -5672,10 +5672,10 @@ }, { "id": "https://www.promobil.de/tipps/bordtechnik-einmaleins-einsteiger-tipps-fuer-den-campingurlaub/", - "title": "Pannen und Probleme im Wohnmobil & Wohnwagen: Erste Hilfe f\u00fcr die Camper-Bordtechnik", + "title": "Pannen und Probleme im Wohnmobil & Wohnwagen: Erste Hilfe für die Camper-Bordtechnik", "date": "Sat, 21 Jun 2025 14:00:00 +0200", - "summary": "

Was tun, wenn die Technik streikt? Wir verraten Ihnen, wie Sie Pannen im Wohnmobilurlaub meistern \u2013 mit Tipps f\u00fcr Strom, Wasser, Gas & Co.

", - "text": "Pannen und Probleme im Wohnmobil & Wohnwagen: Erste Hilfe f\u00fcr die Camper-Bordtechnik\n\nCamping kann eine angenehme Weinachtsreise sein, aber man sollte immer f\u00fcr unvorhergesehene Situationen vorbereitet sein. Von leerer Bordbatterie bis hin zur Gasflasche, es kann einige Herausforderungen geben, auf die Camper sto\u00dfen can. Wisse z.B., wie man die Bordbatterie l\u00e4dt und den Zustand der Batterie erkennt. F\u00fchre immer eine Ersatzbatterie mit und pr\u00fcfe in regelm\u00e4\u00dfigen Abst\u00e4nden die Funkion der Sicherungen. Sorge au\u00dferdem daf\u00fcr, da\u00df du die Funkionsweise der Heizung kennst, damit du nicht kalt erwischt wirst, wenn du sie wirklich brauchst.\n\nEbenso ist die Kenntniss \u00fcber deinen K\u00fchlschrank wichtig. Wei\u00dft du, wie man pr\u00fcft, ob Gas oder Strom das Problem ist, wenn der K\u00fchlschrank nicht funktioniert?\n\nEs ist auch wichtig zu wissen, wo und wie man die Gasflaschen austauscht, um einen Gastmangel zu vermeiden. Lerne die verschiedenen Flaschen- und Anschlusstypen kennen, die in den verschiedenen L\u00e4ndern gelten. \n\nIn Sachen Wasser, wei\u00dft du was zu tun ist, wenn kein Wasser aus dem Hahn kommt? Wie kannst du eine defekte Tauchpumpe ersetzen oder eine blockierte Wasserleitung finden?\n\nDenke dar\u00fcber nach, was zu tun ist, wenn die Toilettenkassette voll ist und wie du sie richtig entsorgst. Hast du dar\u00fcber nachgedacht, was zu tun ist, wenn du einen Kratzer oder eine Beule in deinem Wohnmobil hast?\n\nUnd schlie\u00dflich, hast du einen Notfallplan f\u00fcr den Fall eines platten Reifens? Bist du ausger\u00fcstet, um einen Reifen selbst zu wechseln, oder m\u00fcsstest du auf einen Pannendienst warten? Sei bewusst, dass Camping-Urlauber auf einige Probleme sto\u00dfen k\u00f6nnen und sei gut darauf vorbereitet, diese selbst zu l\u00f6sen.", + "summary": "

Was tun, wenn die Technik streikt? Wir verraten Ihnen, wie Sie Pannen im Wohnmobilurlaub meistern – mit Tipps für Strom, Wasser, Gas & Co.

", + "text": "Pannen und Probleme im Wohnmobil & Wohnwagen: Erste Hilfe für die Camper-Bordtechnik\n\nCamping kann eine angenehme Weinachtsreise sein, aber man sollte immer für unvorhergesehene Situationen vorbereitet sein. Von leerer Bordbatterie bis hin zur Gasflasche, es kann einige Herausforderungen geben, auf die Camper stoßen can. Wisse z.B., wie man die Bordbatterie lädt und den Zustand der Batterie erkennt. Führe immer eine Ersatzbatterie mit und prüfe in regelmäßigen Abständen die Funkion der Sicherungen. Sorge außerdem dafür, daß du die Funkionsweise der Heizung kennst, damit du nicht kalt erwischt wirst, wenn du sie wirklich brauchst.\n\nEbenso ist die Kenntniss über deinen Kühlschrank wichtig. Weißt du, wie man prüft, ob Gas oder Strom das Problem ist, wenn der Kühlschrank nicht funktioniert?\n\nEs ist auch wichtig zu wissen, wo und wie man die Gasflaschen austauscht, um einen Gastmangel zu vermeiden. Lerne die verschiedenen Flaschen- und Anschlusstypen kennen, die in den verschiedenen Ländern gelten. \n\nIn Sachen Wasser, weißt du was zu tun ist, wenn kein Wasser aus dem Hahn kommt? Wie kannst du eine defekte Tauchpumpe ersetzen oder eine blockierte Wasserleitung finden?\n\nDenke darüber nach, was zu tun ist, wenn die Toilettenkassette voll ist und wie du sie richtig entsorgst. Hast du darüber nachgedacht, was zu tun ist, wenn du einen Kratzer oder eine Beule in deinem Wohnmobil hast?\n\nUnd schließlich, hast du einen Notfallplan für den Fall eines platten Reifens? Bist du ausgerüstet, um einen Reifen selbst zu wechseln, oder müsstest du auf einen Pannendienst warten? Sei bewusst, dass Camping-Urlauber auf einige Probleme stoßen können und sei gut darauf vorbereitet, diese selbst zu lösen.", "tags": [ "#CampingVorbereitung", "#WohnmobilTipps", @@ -5782,8 +5782,8 @@ "id": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/", "title": "Gotthard, Brenner & Reschenpass: Wo Wohnmobile und Camper heute Geduld brauchen", "date": "Sat, 21 Jun 2025 11:25:00 +0200", - "summary": "

Am Gotthard ist am Vormittag bereits mit bis zu 50 Minuten Verz\u00f6gerung zu rechnen. San Bernardino lockt als Ausweichroute ohne Baustellen. Am Reschenpass bleibt die Ampelregelung ganzj\u00e4hrig aktiv. F\u00fcr Wohnmobile und Gespanne auf dem Heimweg aus Italien, Kroatien und Co bedeutet das heute Wartezeiten.

", - "text": "Zum Ferienende sind Megastaus leider oft vorgezeichnet. Insbesondere aus dem S\u00fcden, also Italien, Slowenien, Kroatien, kommen an diesem Wochenende tausende Urlauber zur\u00fcck. Engstellen mit Grenzkontrollen, Blockabfertigung am Gotthard und zahlreiche Baustellen \u2013 etwa an der Luegbr\u00fccke auf dem Weg nach \u00d6sterreich zum Brenner \u2013 versch\u00e4rfen die Lage zus\u00e4tzlich. Bereits vergangenes Wochenende und am Feiertag kam es vielerorts zu langen Staus. Staus auf der Gotthard-Route (Schweiz) Heute (am 21.06.2025) m\u00fcssen sich Camperinnen und Camper erneut auf l\u00e4ngere Wartezeiten einstellen. In den kritischen Zonen, insbesondere vor dem Gotthard-Stra\u00dfentunnel , zeigen sich bereits am Morgen erste R\u00fcckstaus. Jetzt am Mittag sind es laut der Verkehrs\u00fcberwachung am Gotthardtunnel (www.gotthard-traffic.ch) bereits 5 Kilometer und bis zu 50 Minuten Wartezeit. Betrachtet man die Webcam Aufnahmen 8 Kilometer vor dem S\u00fcdportal l\u00e4uft der Verkehr jedoch noch gem\u00e4chlich. Erfahrungsgem\u00e4\u00df versch\u00e4rft sich die Lage ab den sp\u00e4ten Vormittagsstunden bis in den sp\u00e4ten Nachmittag hinein deutlich. Neben der Tunnelpassage selbst sorgt auch die Blockabfertigung f\u00fcr Lkw immer wieder f\u00fcr Verz\u00f6gerungen. Reisende weichen bei ersten Anzeichen von Stillstand h\u00e4ufig auf den Gotthardpass aus \u2013 eine landschaftlich reizvolle, aber zeitaufw\u00e4ndige Ausweichroute, die gerade mit Wohnmobilen nur eingeschr\u00e4nkt empfohlen werden kann. Am Pass stauen sich Fahrzeuge regelm\u00e4\u00dfig an engen Baustellenbereichen sowie an den Kreisverkehren und am Bahn\u00fcbergang auf der Nordseite. Alternative: San-Bernardino-Route Als Ausweichm\u00f6glichkeit bietet sich die Route \u00fcber den San-Bernardino-Tunnel (A13) an. Die Strecke ist aktuell ohne gr\u00f6\u00dfere Baustellen und bislang (21.06.2025, 11:19) staufrei befahrbar. Allerdings nutzen immer mehr R\u00fcckreisende diese Option, was im Tagesverlauf zu wachsendem Verkehrsaufkommen f\u00fchren d\u00fcrfte. Wer fr\u00fch startet oder besonders flexibel ist, hat \u00fcber diese Nord-S\u00fcd-Achse durch Graub\u00fcnden eine realistische Chance, gr\u00f6\u00dfere Verz\u00f6gerungen zu vermeiden. Staus auf der Brenner-Route (\u00d6sterreich) Auch auf der Brennerstrecke ist am heutigen Samstag mit massiven R\u00fcckstaus zu rechnen. Bereits fr\u00fchmorgens beginnt in Tirol die Blockabfertigung f\u00fcr Lkw , die regelm\u00e4\u00dfig R\u00fcckstauungen auf der Inntalautobahn (A12) und Brennerautobahn (A13) verursacht. Die Dauerbaustelle an der Luegbr\u00fccke zwischen Innsbruck und dem Brenner bleibt dabei ein neuralgischer Punkt. Immerhin: Im Sommer 2025 greift eine Ausnahmeregelung , die f\u00fcr etwas Entlastung sorgt. Zwischen Juni und Anfang September wird der Verkehr dort zeitweise zweispurig gef\u00fchrt , um den Urlaubsreiseverkehr besser zu bew\u00e4ltigen. Dennoch ist mit R\u00fcckstaus zu rechnen \u2013 vor allem, wenn sich Urlauberstr\u00f6me mit Lkw-Abfertigung \u00fcberlagern. Aktuell (21.06.2025, 11:20) sind auf der Verkehrs\u00fcberwachung des Brenner (www.autobrennero.it) noch keine Staus zu erkennen. F\u00fcr den Nachmittag und den morgigen Sonntag sagt die Verkehrsprognose jedoch starken bis sehr starken Verkehr voraus. Alternative: Reschenpass-Route \u00fcber S\u00fcdtirol Weniger frequentiert, aber landschaftlich reizvoll und aktuell vergleichsweise fl\u00fcssig befahrbar ist die Route \u00fcber den Reschenpass (SS40/B180) . Diese Verbindung f\u00fchrt von S\u00fcdtirol \u00fcber Nauders ins \u00f6sterreichische Inntal \u2013 und weiter zur A12 Richtung Deutschland. Allerdings wird der Verkehr im Bereich der Kanzelgalerie bei Pfunds seit Mai 2025 einspurig per Ampel geregelt \u2013 ganzj\u00e4hrig, auch im Sommer . Eine Ausnahmeregelung, wie sie etwa bei der Luegbr\u00fccke greift, gibt es hier nicht . Die Baustelle bleibt bis Ende 2026 bestehen. Wartezeiten halten sich bislang im Rahmen, k\u00f6nnen aber im Tagesverlauf anwachsen. Eine Umfahrung \u00fcber das Engadin ist f\u00fcr Pkw m\u00f6glich, f\u00fcr gr\u00f6\u00dfere Gespanne allerdings nicht zugelassen. R\u00fcckreise durch S\u00fcddeutschland: A8 und A81 besonders belastet Wer \u00fcber die A8 (Salzburg \u2013 M\u00fcnchen \u2013 Stuttgart) oder die A81 (Singen \u2013 Stuttgart) unterwegs ist, sollte sich ebenfalls auf dichten Verkehr einstellen. Die A8 ist traditionell eine der am st\u00e4rksten belasteten Autobahnen bei R\u00fcckreiseverkehr. Baustellenbereiche und Engstellen, etwa rund um Ulm und bei Pforzheim, wirken sich regelm\u00e4\u00dfig stauversch\u00e4rfend aus. In den Nachmittagsstunden kann es auch auf der A7 (F\u00fcssen \u2013 Ulm \u2013 W\u00fcrzburg) und auf der A96 (Memmingen \u2013 Lindau \u2013 M\u00fcnchen) zu erheblichen Verz\u00f6gerungen kommen, wenn die Urlaubsr\u00fcckkehrer aus dem Allg\u00e4u, Tirol und Vorarlberg zustr\u00f6men.", + "summary": "

Am Gotthard ist am Vormittag bereits mit bis zu 50 Minuten Verzögerung zu rechnen. San Bernardino lockt als Ausweichroute ohne Baustellen. Am Reschenpass bleibt die Ampelregelung ganzjährig aktiv. Für Wohnmobile und Gespanne auf dem Heimweg aus Italien, Kroatien und Co bedeutet das heute Wartezeiten.

", + "text": "Zum Ferienende sind Megastaus leider oft vorgezeichnet. Insbesondere aus dem Süden, also Italien, Slowenien, Kroatien, kommen an diesem Wochenende tausende Urlauber zurück. Engstellen mit Grenzkontrollen, Blockabfertigung am Gotthard und zahlreiche Baustellen – etwa an der Luegbrücke auf dem Weg nach Österreich zum Brenner – verschärfen die Lage zusätzlich. Bereits vergangenes Wochenende und am Feiertag kam es vielerorts zu langen Staus. Staus auf der Gotthard-Route (Schweiz) Heute (am 21.06.2025) müssen sich Camperinnen und Camper erneut auf längere Wartezeiten einstellen. In den kritischen Zonen, insbesondere vor dem Gotthard-Straßentunnel , zeigen sich bereits am Morgen erste Rückstaus. Jetzt am Mittag sind es laut der Verkehrsüberwachung am Gotthardtunnel (www.gotthard-traffic.ch) bereits 5 Kilometer und bis zu 50 Minuten Wartezeit. Betrachtet man die Webcam Aufnahmen 8 Kilometer vor dem Südportal läuft der Verkehr jedoch noch gemächlich. Erfahrungsgemäß verschärft sich die Lage ab den späten Vormittagsstunden bis in den späten Nachmittag hinein deutlich. Neben der Tunnelpassage selbst sorgt auch die Blockabfertigung für Lkw immer wieder für Verzögerungen. Reisende weichen bei ersten Anzeichen von Stillstand häufig auf den Gotthardpass aus – eine landschaftlich reizvolle, aber zeitaufwändige Ausweichroute, die gerade mit Wohnmobilen nur eingeschränkt empfohlen werden kann. Am Pass stauen sich Fahrzeuge regelmäßig an engen Baustellenbereichen sowie an den Kreisverkehren und am Bahnübergang auf der Nordseite. Alternative: San-Bernardino-Route Als Ausweichmöglichkeit bietet sich die Route über den San-Bernardino-Tunnel (A13) an. Die Strecke ist aktuell ohne größere Baustellen und bislang (21.06.2025, 11:19) staufrei befahrbar. Allerdings nutzen immer mehr Rückreisende diese Option, was im Tagesverlauf zu wachsendem Verkehrsaufkommen führen dürfte. Wer früh startet oder besonders flexibel ist, hat über diese Nord-Süd-Achse durch Graubünden eine realistische Chance, größere Verzögerungen zu vermeiden. Staus auf der Brenner-Route (Österreich) Auch auf der Brennerstrecke ist am heutigen Samstag mit massiven Rückstaus zu rechnen. Bereits frühmorgens beginnt in Tirol die Blockabfertigung für Lkw , die regelmäßig Rückstauungen auf der Inntalautobahn (A12) und Brennerautobahn (A13) verursacht. Die Dauerbaustelle an der Luegbrücke zwischen Innsbruck und dem Brenner bleibt dabei ein neuralgischer Punkt. Immerhin: Im Sommer 2025 greift eine Ausnahmeregelung , die für etwas Entlastung sorgt. Zwischen Juni und Anfang September wird der Verkehr dort zeitweise zweispurig geführt , um den Urlaubsreiseverkehr besser zu bewältigen. Dennoch ist mit Rückstaus zu rechnen – vor allem, wenn sich Urlauberströme mit Lkw-Abfertigung überlagern. Aktuell (21.06.2025, 11:20) sind auf der Verkehrsüberwachung des Brenner (www.autobrennero.it) noch keine Staus zu erkennen. Für den Nachmittag und den morgigen Sonntag sagt die Verkehrsprognose jedoch starken bis sehr starken Verkehr voraus. Alternative: Reschenpass-Route über Südtirol Weniger frequentiert, aber landschaftlich reizvoll und aktuell vergleichsweise flüssig befahrbar ist die Route über den Reschenpass (SS40/B180) . Diese Verbindung führt von Südtirol über Nauders ins österreichische Inntal – und weiter zur A12 Richtung Deutschland. Allerdings wird der Verkehr im Bereich der Kanzelgalerie bei Pfunds seit Mai 2025 einspurig per Ampel geregelt – ganzjährig, auch im Sommer . Eine Ausnahmeregelung, wie sie etwa bei der Luegbrücke greift, gibt es hier nicht . Die Baustelle bleibt bis Ende 2026 bestehen. Wartezeiten halten sich bislang im Rahmen, können aber im Tagesverlauf anwachsen. Eine Umfahrung über das Engadin ist für Pkw möglich, für größere Gespanne allerdings nicht zugelassen. Rückreise durch Süddeutschland: A8 und A81 besonders belastet Wer über die A8 (Salzburg – München – Stuttgart) oder die A81 (Singen – Stuttgart) unterwegs ist, sollte sich ebenfalls auf dichten Verkehr einstellen. Die A8 ist traditionell eine der am stärksten belasteten Autobahnen bei Rückreiseverkehr. Baustellenbereiche und Engstellen, etwa rund um Ulm und bei Pforzheim, wirken sich regelmäßig stauverschärfend aus. In den Nachmittagsstunden kann es auch auf der A7 (Füssen – Ulm – Würzburg) und auf der A96 (Memmingen – Lindau – München) zu erheblichen Verzögerungen kommen, wenn die Urlaubsrückkehrer aus dem Allgäu, Tirol und Vorarlberg zuströmen.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/gotthard-brenner-reschenpass-wo-wohnmobile-und-camper-heute-geduld-brauchen/", @@ -5886,8 +5886,8 @@ "id": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/", "title": "Leichtbau in der Caravaning-Industrie: Mit diesen Tricks sparen die Hersteller Gewicht", "date": "Thu, 19 Jun 2025 14:00:00 +0200", - "summary": "

Ein leichtes Reisemobil schafft Reserven bei der Zuladung und sorgt f\u00fcr einen geringeren Verbrauch. promobil verr\u00e4t, was Hersteller in Sachen Leichtbau unternehmen \u2013 und wo die Grenzen liegen.

", - "text": "Ich packe meine Sachen und nehme mit: die E-Bikes, die Kaffeemaschine, den Grill \u2026 Und die Markise, die Klimaanlage und die Solaranlage d\u00fcrfen nat\u00fcrlich auch nicht fehlen. Gerade in der 3,5-Tonnen-Klasse setzt der Wunsch vieler Reisemobilisten nach \u00fcppiger Zuladung und reichlich Komfort die Hersteller teils heftig unter Druck. Mit einem leichten Auf- und Ausbau sorgen Reisemobilhersteller daf\u00fcr, dass m\u00f6glichst viel Gep\u00e4ck auf Reisen mitgenommen werden kann. Gleichzeitig bringt ein leichtes Mobil weitere Vorteile \u2013 etwa einen geringeren Kraftstoffverbrauch und dadurch eine h\u00f6here Reichweite und weniger CO2-Aussto\u00df. Was unterschiedliche Hersteller beim Thema Leichtbau tun, k\u00f6nnen sie hier liesen. Vanyx: Leichtbau mit viel Carbon Vanyx fertigt edle Kastenwagen-Ausbauten auf Basis des allradgetriebenen MAN TGE. Um die Busse m\u00f6glichst leicht zu halten, setzen die S\u00fcdbadener auf den Werkstoff Carbon \u2013 etwa beim Hochdach. Das ist in Sandwichbauweise gefertigt und wiegt laut Hersteller 89 Kilogramm. Durch den Einsatz von Carbon kann Vanyx nach eigenen Angaben 50 Prozent an Gewicht gegen\u00fcber einem GfK-Hochdach einsparen. Das Dach hat Vanyx gemeinsam mit dem Fraunhofer Institut entwickelt, dort wird das Dach auch hergestellt. Auch beim Ausbau des Campers setzt Vanyx auf Kohlefaser. Unter anderem besteht der Lattenrost sowie die Unterkonstruktion der Betten aus CfK (Carbonfaser-verst\u00e4rkter Kunststoff). Auch beim Tisch, Waschbecken, der Klosch\u00fcssel, Dusche und Bodenplatte verwendet Vanyx CfK. Dank Carbon kommt der Vanyx laut Hersteller auf ein Leergewicht von etwa drei Tonnen \u2013 und das trotz \u00fcppiger Ausstattung mit Vollluftfahrwerk oder Solarpanels auf dem Dach. Der Preis f\u00fcr den edlen und leichten Campingbus beginnt allerdings bei 340.000 Euro. LMC Tracer: Reduzierung aufs Wesentliche Beim neuen Tracer konnte LMC im Vergleich zu den bestehenden Tourer-Teilintegrierten bis zu 100 Kilogramm einsparen. Den Sassenbergern gelang das unter anderem durch Einsatz von Leichtbaumaterialien und die Optimierung der Materialst\u00e4rken beim M\u00f6belbau. So wurde etwa die T-Haube durch einen verbesserten Faservolumengehalt des GfK-Laminats um 4,5 Kilo leichter. Am Fahrgestell kommen leichte Blattfedern aus GfK zum Einsatz, au\u00dferdem eine gewichtsoptimierte Rahmenverl\u00e4ngerung. Auch bei der Elektro- und Gasinstallation konnten Kilos eingespart werden. Aber nicht nur das Gewicht der f\u00fcnf Tracer- Modelle \u2013 zwei schmale Vans und drei normalbreite Modelle \u2013 hat LMC nach unten gedr\u00fcckt, auch die Preise konnten attraktiv gehalten werden. Die starten f\u00fcr die breiteren Modelle bei 65.200 Euro. Niesmann+Bischoff: Leichtbau bei Integrierten Auch Hersteller von Luxus-Integrierten setzen auf Leichtbau. Niesmann+ Bischoff beispielsweise hat zum Modelljahr 2025 den Arto nach eigenen Angaben um mehr als 300 Kilogramm leichter gemacht als den Vorg\u00e4nger. Das ist umso bemerkenswerter angesichts dessen, dass der Arto nun auf dem Mercedes Sprinter aufbaut, der etwa 80 Kilogramm schwerer ist als der Fiat Ducato, der bislang als Basis diente. Die Ma\u00dfnahmen zur Gewichtsreduzierung: Beim Boden, einer Sandwichkonstruktion mit Aluminium-Deckschichten und XPS-Kern, hat Niesmann+Bischoff das Fl\u00e4chengewicht um 39 Prozentreduzieren k\u00f6nnen \u2013 und das, obwohl er in Summe dicker geworden ist (42 statt bisher 23 Millimeter). Die Isolierung des Bodens soll viermal so gut sein wie beim Vorg\u00e4nger, die Biegesteifigkeit hat Niesmann+Bischoff nach eigenen Angaben um den Faktor 6,3 verbessert. Carthago: Gewicht sparen durch intelligentes Weglassen Gewichtsparen durch intelligentes Weglassen: Mit dieser Methode senkt Carthago das Gewicht in seiner neuen Integrierten-Baureihe C2-Tourer. Etwa in den Kleiderschr\u00e4nken unter den Betten sind im Regalboden sowie in den Seitenw\u00e4nden Teile ausgefr\u00e4st. Beim Regalbrett befindet sich die Ausfr\u00e4sung an der Unterseite und st\u00f6rt damit weder optisch noch bei der Nutzung. Auch die Ausschnitte in der Seitenwand bergen keine funktionalen Nachteile, sind zwar sichtbar, aber nicht st\u00f6rend \u2013 und vermindern das Gewicht wiederum etwas. Aus der Holz-Einlegeplatte in der Dusche hat Carthago ebenfalls einen Teil ausgefr\u00e4st und spart auch hier Gewicht. Eine weitere Ma\u00dfnahme in Sachen Leichtbau beim C2-Tourer: Die Sandwich-Seitenw\u00e4nde laufen nun bis zu den A-S\u00e4ulen vorn plan durch. Die vergleichsweise schwere GfK-Frontmaske, die sich bei der Vorg\u00e4ngerversion des C-Tourer noch bis zum ersten seitlichen Fenstersteg herumw\u00f6lbte, endet nun an der A-S\u00e4ule. Im Vergleich zum C1-Tourer, der die bisherige Bauweise weiterf\u00fchrt, ist der neue C2-Tourer au\u00dferdem um etwa zehn Zentimeter schmaler, was ebenfalls Gewicht einspart. Die Integrierten C1- und C2-Tourer sowie den Teilintegrierten C1-Tourer T bietet Carthago sowohl in einer Comfort-Version mit 4,2 Tonnen Gesamtgewicht als auch in einer Lightweight-Variante mit 3,5 Tonnen an. Um zus\u00e4tzlich Gewicht zu sparen, verzichtet die Lightweight-Version in der Serienausf\u00fchrung auf Ausstattungsdetails wie etwa die Zusatzpolster zur Betterweiterung. Au\u00dferdem kommen teils leichtere Komponenten zum Einsatz, z.B. ein Herd mit emailliertem Drahtrost und Edelstahlboden statt Gussrost und Glasboden. Weinsberg: Zwei Superlight-Baureihen Das schw\u00e4bische Unternehmen hat sich auf M\u00f6bel- und Innenausbau in Leichtbauweise spezialisiert. F\u00fcr unterschiedliche Bereiche im Mobil stehen eigens entwickelte Materialkompositionen bereit: f\u00fcr den M\u00f6belbau beispielsweise Sandwichplatten mit leichten EPS-, XPS- oder PET-Kernen. Die sind laut Hersteller nicht nur bis zu 45 Prozent leichter als Pappelsperrholz, sondern teils auch g\u00fcnstiger. Teilweise sind Kern und Decklagen an den Seiten durch Polyurethan miteinander vergossen, was f\u00fcr zus\u00e4tzliche Stabilit\u00e4t sorgt. F\u00fcr den Boden, der eine hohe Biegefestigkeit und Wasserresistenz ben\u00f6tigt, hat V\u00f6hringer eine spezielle Leichtbauplatte entwickelt. Den Kern dieser Platte bilden Sch\u00e4ume bzw. Waben, die aus unterschiedlichen Materialien bestehen k\u00f6nnen. Die Deckschicht besteht aus einem Glasfaser-Polypropylen-Gelege. Auch f\u00fcr die Verkleidung von W\u00e4nden und Decken hat V\u00f6hringer verschiedene Leichtbaumaterialien im Angebot. Die sind atmungsaktiv, schallisolierend und k\u00f6nnen f\u00fcr eine angenehme Optik und Haptik teilweise mit Stoffen kaschiert werden. Zu den Kunden von V\u00f6hringer z\u00e4hlen zahlreiche kleinere und gr\u00f6\u00dfere Hersteller aus der Reisemobil-Branche. F\u00fcr die Campingbus-Marke Alphavan hat V\u00f6hringer beispielsweise den kompletten M\u00f6bel- und Innenausbau ausgef\u00fchrt. V\u00f6hringer: Auf Leichtbaum\u00f6bel spezialisiert Bei zwei seiner aktuellen Baureihen, dem Alkovenmobil Carahome und dem Integrierten Caracore, setzt Weinsberg die sogenannte Superlight-Technologie ein. Beide Baureihen sind in unterschiedlichen Grundrissen erh\u00e4ltlich, das Gesamtgewicht liegt bei allen Grundrissvarianten bei 3,5 Tonnen. Durch die Superlight-Bauweise verspricht Weinsberg fast 30 Prozent mehr Zuladung. Um das zu erreichen, kommen beim M\u00f6belbau Leichtbauplatten der Marke Lisocore zum Einsatz. Die bestehen aus einer gewellten Kernschicht aus Holz- und Pflanzenfaservlies, die mit den Deckschichten aus Furniersperrholz verklebt sind. Der Fahrzeugboden besteht aus einer 52 Millimeter starken Sandwichplatte mit XPS-Schaum. Auch die Sitzbank in den Carahome- und Caracore-Modellen hat Weinsberg nach eigenen Angaben besonders leicht gestaltet. Zudem sind die Fahrzeuge mit leichten Blattfedern aus GfK ausgestattet, optional sind Lithium-Batterien statt Blei-Akkus erh\u00e4ltlich. Leichtbau ist in der Caravaning-Industrie seit jeher wichtig. Das wird auch so bleiben, wenn der B-F\u00fchrerschein f\u00fcr Wohnmobile bis 4,25 Tonnen den Druck etwas von den Herstellern nimmt. Die haben aber gerade erst angefangen mit den modernsten Leichtbaumaterialien wie EPP (expandiertes Polypropylen) zu arbeiten. Vorreiter sind hier Adria mit Einzelelementen und Knaus, die ab 2026 in allen Campingbussen auf gro\u00dfe EPP-Bauteile setzen.", + "summary": "

Ein leichtes Reisemobil schafft Reserven bei der Zuladung und sorgt für einen geringeren Verbrauch. promobil verrät, was Hersteller in Sachen Leichtbau unternehmen – und wo die Grenzen liegen.

", + "text": "Ich packe meine Sachen und nehme mit: die E-Bikes, die Kaffeemaschine, den Grill … Und die Markise, die Klimaanlage und die Solaranlage dürfen natürlich auch nicht fehlen. Gerade in der 3,5-Tonnen-Klasse setzt der Wunsch vieler Reisemobilisten nach üppiger Zuladung und reichlich Komfort die Hersteller teils heftig unter Druck. Mit einem leichten Auf- und Ausbau sorgen Reisemobilhersteller dafür, dass möglichst viel Gepäck auf Reisen mitgenommen werden kann. Gleichzeitig bringt ein leichtes Mobil weitere Vorteile – etwa einen geringeren Kraftstoffverbrauch und dadurch eine höhere Reichweite und weniger CO2-Ausstoß. Was unterschiedliche Hersteller beim Thema Leichtbau tun, können sie hier liesen. Vanyx: Leichtbau mit viel Carbon Vanyx fertigt edle Kastenwagen-Ausbauten auf Basis des allradgetriebenen MAN TGE. Um die Busse möglichst leicht zu halten, setzen die Südbadener auf den Werkstoff Carbon – etwa beim Hochdach. Das ist in Sandwichbauweise gefertigt und wiegt laut Hersteller 89 Kilogramm. Durch den Einsatz von Carbon kann Vanyx nach eigenen Angaben 50 Prozent an Gewicht gegenüber einem GfK-Hochdach einsparen. Das Dach hat Vanyx gemeinsam mit dem Fraunhofer Institut entwickelt, dort wird das Dach auch hergestellt. Auch beim Ausbau des Campers setzt Vanyx auf Kohlefaser. Unter anderem besteht der Lattenrost sowie die Unterkonstruktion der Betten aus CfK (Carbonfaser-verstärkter Kunststoff). Auch beim Tisch, Waschbecken, der Kloschüssel, Dusche und Bodenplatte verwendet Vanyx CfK. Dank Carbon kommt der Vanyx laut Hersteller auf ein Leergewicht von etwa drei Tonnen – und das trotz üppiger Ausstattung mit Vollluftfahrwerk oder Solarpanels auf dem Dach. Der Preis für den edlen und leichten Campingbus beginnt allerdings bei 340.000 Euro. LMC Tracer: Reduzierung aufs Wesentliche Beim neuen Tracer konnte LMC im Vergleich zu den bestehenden Tourer-Teilintegrierten bis zu 100 Kilogramm einsparen. Den Sassenbergern gelang das unter anderem durch Einsatz von Leichtbaumaterialien und die Optimierung der Materialstärken beim Möbelbau. So wurde etwa die T-Haube durch einen verbesserten Faservolumengehalt des GfK-Laminats um 4,5 Kilo leichter. Am Fahrgestell kommen leichte Blattfedern aus GfK zum Einsatz, außerdem eine gewichtsoptimierte Rahmenverlängerung. Auch bei der Elektro- und Gasinstallation konnten Kilos eingespart werden. Aber nicht nur das Gewicht der fünf Tracer- Modelle – zwei schmale Vans und drei normalbreite Modelle – hat LMC nach unten gedrückt, auch die Preise konnten attraktiv gehalten werden. Die starten für die breiteren Modelle bei 65.200 Euro. Niesmann+Bischoff: Leichtbau bei Integrierten Auch Hersteller von Luxus-Integrierten setzen auf Leichtbau. Niesmann+ Bischoff beispielsweise hat zum Modelljahr 2025 den Arto nach eigenen Angaben um mehr als 300 Kilogramm leichter gemacht als den Vorgänger. Das ist umso bemerkenswerter angesichts dessen, dass der Arto nun auf dem Mercedes Sprinter aufbaut, der etwa 80 Kilogramm schwerer ist als der Fiat Ducato, der bislang als Basis diente. Die Maßnahmen zur Gewichtsreduzierung: Beim Boden, einer Sandwichkonstruktion mit Aluminium-Deckschichten und XPS-Kern, hat Niesmann+Bischoff das Flächengewicht um 39 Prozentreduzieren können – und das, obwohl er in Summe dicker geworden ist (42 statt bisher 23 Millimeter). Die Isolierung des Bodens soll viermal so gut sein wie beim Vorgänger, die Biegesteifigkeit hat Niesmann+Bischoff nach eigenen Angaben um den Faktor 6,3 verbessert. Carthago: Gewicht sparen durch intelligentes Weglassen Gewichtsparen durch intelligentes Weglassen: Mit dieser Methode senkt Carthago das Gewicht in seiner neuen Integrierten-Baureihe C2-Tourer. Etwa in den Kleiderschränken unter den Betten sind im Regalboden sowie in den Seitenwänden Teile ausgefräst. Beim Regalbrett befindet sich die Ausfräsung an der Unterseite und stört damit weder optisch noch bei der Nutzung. Auch die Ausschnitte in der Seitenwand bergen keine funktionalen Nachteile, sind zwar sichtbar, aber nicht störend – und vermindern das Gewicht wiederum etwas. Aus der Holz-Einlegeplatte in der Dusche hat Carthago ebenfalls einen Teil ausgefräst und spart auch hier Gewicht. Eine weitere Maßnahme in Sachen Leichtbau beim C2-Tourer: Die Sandwich-Seitenwände laufen nun bis zu den A-Säulen vorn plan durch. Die vergleichsweise schwere GfK-Frontmaske, die sich bei der Vorgängerversion des C-Tourer noch bis zum ersten seitlichen Fenstersteg herumwölbte, endet nun an der A-Säule. Im Vergleich zum C1-Tourer, der die bisherige Bauweise weiterführt, ist der neue C2-Tourer außerdem um etwa zehn Zentimeter schmaler, was ebenfalls Gewicht einspart. Die Integrierten C1- und C2-Tourer sowie den Teilintegrierten C1-Tourer T bietet Carthago sowohl in einer Comfort-Version mit 4,2 Tonnen Gesamtgewicht als auch in einer Lightweight-Variante mit 3,5 Tonnen an. Um zusätzlich Gewicht zu sparen, verzichtet die Lightweight-Version in der Serienausführung auf Ausstattungsdetails wie etwa die Zusatzpolster zur Betterweiterung. Außerdem kommen teils leichtere Komponenten zum Einsatz, z.B. ein Herd mit emailliertem Drahtrost und Edelstahlboden statt Gussrost und Glasboden. Weinsberg: Zwei Superlight-Baureihen Das schwäbische Unternehmen hat sich auf Möbel- und Innenausbau in Leichtbauweise spezialisiert. Für unterschiedliche Bereiche im Mobil stehen eigens entwickelte Materialkompositionen bereit: für den Möbelbau beispielsweise Sandwichplatten mit leichten EPS-, XPS- oder PET-Kernen. Die sind laut Hersteller nicht nur bis zu 45 Prozent leichter als Pappelsperrholz, sondern teils auch günstiger. Teilweise sind Kern und Decklagen an den Seiten durch Polyurethan miteinander vergossen, was für zusätzliche Stabilität sorgt. Für den Boden, der eine hohe Biegefestigkeit und Wasserresistenz benötigt, hat Vöhringer eine spezielle Leichtbauplatte entwickelt. Den Kern dieser Platte bilden Schäume bzw. Waben, die aus unterschiedlichen Materialien bestehen können. Die Deckschicht besteht aus einem Glasfaser-Polypropylen-Gelege. Auch für die Verkleidung von Wänden und Decken hat Vöhringer verschiedene Leichtbaumaterialien im Angebot. Die sind atmungsaktiv, schallisolierend und können für eine angenehme Optik und Haptik teilweise mit Stoffen kaschiert werden. Zu den Kunden von Vöhringer zählen zahlreiche kleinere und größere Hersteller aus der Reisemobil-Branche. Für die Campingbus-Marke Alphavan hat Vöhringer beispielsweise den kompletten Möbel- und Innenausbau ausgeführt. Vöhringer: Auf Leichtbaumöbel spezialisiert Bei zwei seiner aktuellen Baureihen, dem Alkovenmobil Carahome und dem Integrierten Caracore, setzt Weinsberg die sogenannte Superlight-Technologie ein. Beide Baureihen sind in unterschiedlichen Grundrissen erhältlich, das Gesamtgewicht liegt bei allen Grundrissvarianten bei 3,5 Tonnen. Durch die Superlight-Bauweise verspricht Weinsberg fast 30 Prozent mehr Zuladung. Um das zu erreichen, kommen beim Möbelbau Leichtbauplatten der Marke Lisocore zum Einsatz. Die bestehen aus einer gewellten Kernschicht aus Holz- und Pflanzenfaservlies, die mit den Deckschichten aus Furniersperrholz verklebt sind. Der Fahrzeugboden besteht aus einer 52 Millimeter starken Sandwichplatte mit XPS-Schaum. Auch die Sitzbank in den Carahome- und Caracore-Modellen hat Weinsberg nach eigenen Angaben besonders leicht gestaltet. Zudem sind die Fahrzeuge mit leichten Blattfedern aus GfK ausgestattet, optional sind Lithium-Batterien statt Blei-Akkus erhältlich. Leichtbau ist in der Caravaning-Industrie seit jeher wichtig. Das wird auch so bleiben, wenn der B-Führerschein für Wohnmobile bis 4,25 Tonnen den Druck etwas von den Herstellern nimmt. Die haben aber gerade erst angefangen mit den modernsten Leichtbaumaterialien wie EPP (expandiertes Polypropylen) zu arbeiten. Vorreiter sind hier Adria mit Einzelelementen und Knaus, die ab 2026 in allen Campingbussen auf große EPP-Bauteile setzen.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/tipps/leichtbautricks-wohnmobilhersteller/", @@ -5990,8 +5990,8 @@ "id": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/", "title": "5 Camper-Marken aus Slowenien: Ernstzunehmende Alternativen zu Hymer und Co", "date": "Thu, 19 Jun 2025 11:00:00 +0200", - "summary": "

Slowenische Camper-Marken wie Adria und Robeta haben sich l\u00e4ngst als zuverl\u00e4ssige Anbieter etabliert. Sie stehen f\u00fcr exzellente Technik, hochwertiges Design und konkurrenzf\u00e4hige Preise. F\u00fcnf slowenische Marken im kurzen Portr\u00e4t.

", - "text": "In der deutschen Campingszene w\u00e4chst das Interesse an Marken aus L\u00e4ndern wie Polen , Slowenien und sogar China . Oft wird ihnen prim\u00e4r eines zugeschrieben: g\u00fcnstige Preise. Doch diese Vorstellung trifft so nicht immer zu. Vielmehr bieten diese Marken h\u00e4ufig ein \u00fcberzeugendes Preis-Leistungs-Verh\u00e4ltnis. Besonders spannend sind dabei die slowenischen Hersteller, die keineswegs Neulinge am Markt sind: Einige von ihnen produzieren bereits seit den 1970er und 1980er Jahren, lange bevor Wohnmobile hierzulande ein Boomsegment wurden. Die bekannteste slowenische Marke auf dem deutschen Markt ist Adria , die mit ihrer Tochtermarke Sun Living eine breite Palette, von Einsteiger- bis Premiumfahrzeugen, abdeckt. Und auch wenn die Marke Robeta hierzulande erst in den letzten Jahren f\u00fcr Aufsehen sorgte, gibt es sie schon seit 2011. Slowenien bietet im hei\u00df umk\u00e4mpften Markt der Wohnmobile und Wohnwagen f\u00fcr fast jeden Geschmack und Geldbeutel etwas: von robusten Einsteigermodellen \u00fcber stylische Campervans bis zu exklusiven Luxus-Campern im Boutique-Stil. Sogar der Offroad- und Allrad-Trend spiegelt sich mit der Marke Megamobil wider, die einige besonders gel\u00e4ndetauglich anmutende Kastenwagen produziert. Kurz gesagt: Slowenische Camper \u00fcberzeugen nicht mit Billigpreisen, sondern mit einer ausgewogenen Mischung aus Qualit\u00e4t, Design, Ausstattung und einem konkurrenzf\u00e4higen Preis \u2013 eine spannende Alternative zu den klassischen deutschen Herstellern. Wir stellen f\u00fcnf slowenische Hersteller und ihre Modellpalette vor. 1. Adria \u2013 Premium-Marke mit Geschichte Adria ist das Flaggschiff unter Sloweniens Freizeitfahrzeugmarken. Seit der Gr\u00fcndung 1965 produziert das Unternehmen durchg\u00e4ngig in Novo Mesto \u2013 heute in einem der modernsten Werke Europas. \u00dcber 600.000 Fahrzeuge haben die Slowenen bislang gefertigt, darunter Caravans, teil- und vollintegrierte Wohnmobile (Coral, Matrix, Sonic) sowie Campervans (Twin Supreme u. a.). Die Produktion setzt dabei auf hochmoderne und ISO-zertifizierte Prozesse sowie umfangreiche Qualit\u00e4tspr\u00fcfungen \u2013 inklusive Dichtigkeit-Checks in Monsunkammern und Extremtests in Klimakammern bei bis zu \u201340 \u00b0C. Die Marke geh\u00f6rt seit 2017 zur franz\u00f6sischen Trigano-Gruppe, produziert aber weiterhin eigenst\u00e4ndig in Slowenien. Adria verbindet Premium-Design und zuverl\u00e4ssige Technik mit industrieller St\u00e4rke \u2013 und besetzt so den europ\u00e4ischen Mittel- bis Oberklassemarkt. Segmente: Caravans, Vans, teilintegrierte und integrierte Wohnmobile, Alkoven Baureihen: Caravans: Aviva (Lite), Action, Altea , Adora, Alpina , Astella; Vans: Twin (Sports, Supreme, Max, Supertwin ); Teilintegrierte: Compact (Max), Coral, Matrix, Coral XL (Alkoven); Integrierte: Sonic, Supersonic Basispreise : ab circa 10.000 bis 50.000 Euro (Caravans); ab circa 60.000 bis 150.000 Euro (Vans, TIs und Integrierte) Besonderheiten: ISO-zertifizierte Fertigung mit Monsun- und Klimakammern, digitales MACH-System, Panorama-Design, mehrfach ausgezeichnet Hier geht es zum Test des Adria Twin 640 SGX 2. Robeta \u2013 Boutique-Luxus aus Slowenien Robeta hat sich seit der Gr\u00fcndung 2011 in den oberen R\u00e4ngen des Segments der Luxus-Campingbusse auf dem europ\u00e4ischen Markt etabliert. Mit individualisierbaren Serienmodellen (\" Adonis \", \"Apollo\", \" Ares \" u. v. a.) bietet Robeta \u00fcber 15.000 m\u00f6gliche Konfigurationen f\u00fcr Kundinnen und Kunden. Jedes Fahrzeug kommt dabei handsigniert direkt vom Monteur. Ein besonderer Hingucker: die Robeta Schumacher Edition \u2013 pr\u00e4sentiert mit Ex-Formel-1-Star Ralf Schumacher auf dem Caravan Salon 2022. Basierend auf dem Mercedes Sprinter (7,36 m, 190 PS), ausgestattet mit Yacht-inspiriertem Interieur, Solaranlage, JL\u2011Audio-Soundsystem und luxuri\u00f6sem Sanit\u00e4rbereich \u2013 und einem Preis von rund 279.000 Euro . Eine weitere Besonderheit der Slowenen sind die Leichtbaum\u00f6bel aus recyceltem Kunststoff, mit denen sie nach eigenen Angaben bis zu 220 kg Gewichtsersparnis pro Fahrzeug erreichen. Robeta richtet sich damit an Premiumk\u00e4uferinnen und -k\u00e4ufer mit Stilbewusstsein, die Individualit\u00e4t statt Massenware, luxuri\u00f6ses Design und technische High-End-Ausstattung zu Listenpreisen suchen. Segmente: ausschlie\u00dflich Kastenwagen Baureihen: drei Serienmodelle (\" Adonis \", \"Apollo\", \" Ares \") plus Sonder-Editionen wie die Schumacher Edition Basispreise : ab ca. 80.000 bis 279.000 Euro Besonderheiten: Leichtbaum\u00f6bel aus recyceltem Kunststoff mit bis zu 220 kg Gewichtsersparnis, handsignierte Fahrzeuge, rund 15.000 Konfigurationsoptionen Hier geht es zum Test des Robeta Adonis 3. Sun Living \u2013 budgetfreundlicher Einstieg Als Schwester-Marke von Adria und Teil der Trigano-Gruppe (seit 2017) zielt Sun Living gezielt auf Einsteiger- und Mittelklasse ab. Weil Sun Living im gleichen Werk wie Adria gebaut wird, kann die Marke hochwertige Ausstattungen wie GFK-Boden, Kompressor-K\u00fchlschrank und digitale Steuerung auch in g\u00fcnstigeren Modellen anbieten. Ein Marktvorteil. Auch die hohen Qualit\u00e4tsstandards und das technische Know-how im Werk in Novo Mesto kommen den Einsteigermodellen von Sun Living zugute. Die aktuelle Modellpalette umfasst Kastenwagen (V-Serie) , teilintegrierte Modelle (S-Serie) sowie klassische Alkovenmobile (A-Serie) \u2013 alle auf Citro\u00ebn Jumper oder Fiat Ducato. Besonders beliebt: der kompakte V 60 SP mit Aufstelldach oder der S 70 SP , ein clever konzipierter Teilintegrierter mit Querbett. Einstiegspreise liegen meist zwischen 57.000 und 70.000 Euro , je nach Modell und Ausstattung. Innen dominiert ein funktionales, helles Design mit pflegeleichten Materialien, das vor allem Camping-Neulinge und Familien anspricht. Wer auf Individualisierungsoptionen verzichten kann, bekommt hier viel Technik und Raum zum attraktiven Preis \u2013 ohne auf Solidit\u00e4t und durchdachte Details zu verzichten. Segmente/Baureihen: Vans (V-Serie), Teilintegrierte (S-Serie), Alkoven (A-Serie) Basispreise: ab ca. 57.000 bis 70.000 Euro Besonderheiten: Ausstattung wie GFK-Boden, Kompressor-K\u00fchlschrank, digitale Steuerung aus Adria-Fertigung 4. Tourne \u2013 Der schicke Au\u00dfenseiter Tourne fertigt ebenfalls in Slowenien und baut ausschlie\u00dflich kompakte Campervans. Preislich ist die kleine Marke zwischen Sun Living und Robeta angesiedelt \u2013 kein \u00fcbertrieben luxuri\u00f6s, aber hochwertig, individuell und klar positioniert. Das Unternehmen kombiniert skandinavisch inspirierte Innenraumgestaltung \u2013 helle Holzdekore, klare Strukturen, dezente LED-Beleuchtung \u2013 mit praxisnaher Technik. Besonders hervorzuheben ist die effektive Wintertauglichkeit: Alle Fahrzeuge verf\u00fcgen \u00fcber eine vollst\u00e4ndige Isolierung, Fu\u00dfboden- und Dieselheizung sowie ein durchg\u00e4ngiges Bel\u00fcftungssystem. Die Modellpalette umfasst aktuell die Baureihen Cruise und Select , jeweils in den L\u00e4ngen 6,00 und 6,36 Metern \u2013 alle auf Citro\u00ebn Jumper mit optionalem Allrad und Automatikgetriebe. Der Einstiegspreis liegt bei rund 58.700 Euro (Cruise 6.0), die Topmodelle wie der Select 6.4 kosten ab 83.000 Euro . Ein besonderes Merkmal ist das patentierte \"Dream4\"-System, mit dem sich vier vollwertige Schlafpl\u00e4tze im Kastenwagen realisieren lassen \u2013 ganz ohne Aufstelldach. Segmente: ausschlie\u00dflich kompakte Campingbusse (Kastenwagen) Baureihen: Cruise und Select (je in 6,00 m & 6,36 m) Basispreise : ab ca. 59.000 bis 83.000 Euro Besonderheiten: Skandinavisch inspiriertes Interieur, l\u00fcckenlose Isolation (Fu\u00dfboden- & Dieselheizung), patentiertes Dream4 -Schlafsystem f\u00fcr vier Personen Hier geht es zum Test des Tourne 6.4 5. Megamobil \u2013 Alternative Gr\u00f6\u00dfe mit Komfort Megamobil produziert ausschlie\u00dflich Kastenwagen \u2013 und das in sorgf\u00e4ltiger Handarbeit. Das slowenische Familienunternehmen mit Sitz in Slovenska Bistrica hat seine Wurzeln in den 1960er-Jahren, der Ausbau von Campervans erfolgt seit rund 15 Jahren. Heute fertigen rund 80 Mitarbeiter j\u00e4hrlich etwa 500 Fahrzeuge \u2013 mit viel Sorgfalt, robusten Materialien und einem klaren Fokus auf Praxistauglichkeit und ganzj\u00e4hrige Nutzbarkeit. Alle Modelle entstehen auf Basis von Fiat Ducato, Citro\u00ebn Jumper, MAN TGE oder VW Crafter \u2013 und unterscheiden sich in L\u00e4nge (von 5,40 bis 6,80 m), Raumaufteilung und Technik. Die M\u00f6bel bestehen aus 15 mm starkem Pappelsperrholz mit pflegeleichter CPL-Oberfl\u00e4che, die Fahrzeuge sind rundum isoliert und mit Armaflex ged\u00e4mmt. Jedes Exemplar durchl\u00e4uft nach Angaben des Herstellers vor der Auslieferung umfangreiche Funktions- und Dichtheitspr\u00fcfungen. Besonders beliebt ist der Mega Sport 640 : ein clever konzipierter Campervan mit elektrischem Hubbett \u00fcber einem gro\u00dfen Stauraum im Heck \u2013 dort lassen sich selbst zwei Fahrr\u00e4der unterbringen. Im promobil-Test lobten wir prim\u00e4r das flexible Bettkonzept, die gute Familiennutzung und die hochwertige Verarbeitung. Kritik gab es nur f\u00fcr kleinere Komfortdetails wie fehlende Ablagefl\u00e4chen im Bettbereich. Zum vollst\u00e4ndigen Test des Mega Sport 640 geht es hier. Segmente: ausschlie\u00dflich Kastenwagen Baureihen: Lounge, Classic, Sport, Revolution , Twin, Re-Aktiv , 4x4 Basispreise : ab ca. 70.000 Euro", + "summary": "

Slowenische Camper-Marken wie Adria und Robeta haben sich längst als zuverlässige Anbieter etabliert. Sie stehen für exzellente Technik, hochwertiges Design und konkurrenzfähige Preise. Fünf slowenische Marken im kurzen Porträt.

", + "text": "In der deutschen Campingszene wächst das Interesse an Marken aus Ländern wie Polen , Slowenien und sogar China . Oft wird ihnen primär eines zugeschrieben: günstige Preise. Doch diese Vorstellung trifft so nicht immer zu. Vielmehr bieten diese Marken häufig ein überzeugendes Preis-Leistungs-Verhältnis. Besonders spannend sind dabei die slowenischen Hersteller, die keineswegs Neulinge am Markt sind: Einige von ihnen produzieren bereits seit den 1970er und 1980er Jahren, lange bevor Wohnmobile hierzulande ein Boomsegment wurden. Die bekannteste slowenische Marke auf dem deutschen Markt ist Adria , die mit ihrer Tochtermarke Sun Living eine breite Palette, von Einsteiger- bis Premiumfahrzeugen, abdeckt. Und auch wenn die Marke Robeta hierzulande erst in den letzten Jahren für Aufsehen sorgte, gibt es sie schon seit 2011. Slowenien bietet im heiß umkämpften Markt der Wohnmobile und Wohnwagen für fast jeden Geschmack und Geldbeutel etwas: von robusten Einsteigermodellen über stylische Campervans bis zu exklusiven Luxus-Campern im Boutique-Stil. Sogar der Offroad- und Allrad-Trend spiegelt sich mit der Marke Megamobil wider, die einige besonders geländetauglich anmutende Kastenwagen produziert. Kurz gesagt: Slowenische Camper überzeugen nicht mit Billigpreisen, sondern mit einer ausgewogenen Mischung aus Qualität, Design, Ausstattung und einem konkurrenzfähigen Preis – eine spannende Alternative zu den klassischen deutschen Herstellern. Wir stellen fünf slowenische Hersteller und ihre Modellpalette vor. 1. Adria – Premium-Marke mit Geschichte Adria ist das Flaggschiff unter Sloweniens Freizeitfahrzeugmarken. Seit der Gründung 1965 produziert das Unternehmen durchgängig in Novo Mesto – heute in einem der modernsten Werke Europas. Über 600.000 Fahrzeuge haben die Slowenen bislang gefertigt, darunter Caravans, teil- und vollintegrierte Wohnmobile (Coral, Matrix, Sonic) sowie Campervans (Twin Supreme u. a.). Die Produktion setzt dabei auf hochmoderne und ISO-zertifizierte Prozesse sowie umfangreiche Qualitätsprüfungen – inklusive Dichtigkeit-Checks in Monsunkammern und Extremtests in Klimakammern bei bis zu –40 °C. Die Marke gehört seit 2017 zur französischen Trigano-Gruppe, produziert aber weiterhin eigenständig in Slowenien. Adria verbindet Premium-Design und zuverlässige Technik mit industrieller Stärke – und besetzt so den europäischen Mittel- bis Oberklassemarkt. Segmente: Caravans, Vans, teilintegrierte und integrierte Wohnmobile, Alkoven Baureihen: Caravans: Aviva (Lite), Action, Altea , Adora, Alpina , Astella; Vans: Twin (Sports, Supreme, Max, Supertwin ); Teilintegrierte: Compact (Max), Coral, Matrix, Coral XL (Alkoven); Integrierte: Sonic, Supersonic Basispreise : ab circa 10.000 bis 50.000 Euro (Caravans); ab circa 60.000 bis 150.000 Euro (Vans, TIs und Integrierte) Besonderheiten: ISO-zertifizierte Fertigung mit Monsun- und Klimakammern, digitales MACH-System, Panorama-Design, mehrfach ausgezeichnet Hier geht es zum Test des Adria Twin 640 SGX 2. Robeta – Boutique-Luxus aus Slowenien Robeta hat sich seit der Gründung 2011 in den oberen Rängen des Segments der Luxus-Campingbusse auf dem europäischen Markt etabliert. Mit individualisierbaren Serienmodellen (\" Adonis \", \"Apollo\", \" Ares \" u. v. a.) bietet Robeta über 15.000 mögliche Konfigurationen für Kundinnen und Kunden. Jedes Fahrzeug kommt dabei handsigniert direkt vom Monteur. Ein besonderer Hingucker: die Robeta Schumacher Edition – präsentiert mit Ex-Formel-1-Star Ralf Schumacher auf dem Caravan Salon 2022. Basierend auf dem Mercedes Sprinter (7,36 m, 190 PS), ausgestattet mit Yacht-inspiriertem Interieur, Solaranlage, JL‑Audio-Soundsystem und luxuriösem Sanitärbereich – und einem Preis von rund 279.000 Euro . Eine weitere Besonderheit der Slowenen sind die Leichtbaumöbel aus recyceltem Kunststoff, mit denen sie nach eigenen Angaben bis zu 220 kg Gewichtsersparnis pro Fahrzeug erreichen. Robeta richtet sich damit an Premiumkäuferinnen und -käufer mit Stilbewusstsein, die Individualität statt Massenware, luxuriöses Design und technische High-End-Ausstattung zu Listenpreisen suchen. Segmente: ausschließlich Kastenwagen Baureihen: drei Serienmodelle (\" Adonis \", \"Apollo\", \" Ares \") plus Sonder-Editionen wie die Schumacher Edition Basispreise : ab ca. 80.000 bis 279.000 Euro Besonderheiten: Leichtbaumöbel aus recyceltem Kunststoff mit bis zu 220 kg Gewichtsersparnis, handsignierte Fahrzeuge, rund 15.000 Konfigurationsoptionen Hier geht es zum Test des Robeta Adonis 3. Sun Living – budgetfreundlicher Einstieg Als Schwester-Marke von Adria und Teil der Trigano-Gruppe (seit 2017) zielt Sun Living gezielt auf Einsteiger- und Mittelklasse ab. Weil Sun Living im gleichen Werk wie Adria gebaut wird, kann die Marke hochwertige Ausstattungen wie GFK-Boden, Kompressor-Kühlschrank und digitale Steuerung auch in günstigeren Modellen anbieten. Ein Marktvorteil. Auch die hohen Qualitätsstandards und das technische Know-how im Werk in Novo Mesto kommen den Einsteigermodellen von Sun Living zugute. Die aktuelle Modellpalette umfasst Kastenwagen (V-Serie) , teilintegrierte Modelle (S-Serie) sowie klassische Alkovenmobile (A-Serie) – alle auf Citroën Jumper oder Fiat Ducato. Besonders beliebt: der kompakte V 60 SP mit Aufstelldach oder der S 70 SP , ein clever konzipierter Teilintegrierter mit Querbett. Einstiegspreise liegen meist zwischen 57.000 und 70.000 Euro , je nach Modell und Ausstattung. Innen dominiert ein funktionales, helles Design mit pflegeleichten Materialien, das vor allem Camping-Neulinge und Familien anspricht. Wer auf Individualisierungsoptionen verzichten kann, bekommt hier viel Technik und Raum zum attraktiven Preis – ohne auf Solidität und durchdachte Details zu verzichten. Segmente/Baureihen: Vans (V-Serie), Teilintegrierte (S-Serie), Alkoven (A-Serie) Basispreise: ab ca. 57.000 bis 70.000 Euro Besonderheiten: Ausstattung wie GFK-Boden, Kompressor-Kühlschrank, digitale Steuerung aus Adria-Fertigung 4. Tourne – Der schicke Außenseiter Tourne fertigt ebenfalls in Slowenien und baut ausschließlich kompakte Campervans. Preislich ist die kleine Marke zwischen Sun Living und Robeta angesiedelt – kein übertrieben luxuriös, aber hochwertig, individuell und klar positioniert. Das Unternehmen kombiniert skandinavisch inspirierte Innenraumgestaltung – helle Holzdekore, klare Strukturen, dezente LED-Beleuchtung – mit praxisnaher Technik. Besonders hervorzuheben ist die effektive Wintertauglichkeit: Alle Fahrzeuge verfügen über eine vollständige Isolierung, Fußboden- und Dieselheizung sowie ein durchgängiges Belüftungssystem. Die Modellpalette umfasst aktuell die Baureihen Cruise und Select , jeweils in den Längen 6,00 und 6,36 Metern – alle auf Citroën Jumper mit optionalem Allrad und Automatikgetriebe. Der Einstiegspreis liegt bei rund 58.700 Euro (Cruise 6.0), die Topmodelle wie der Select 6.4 kosten ab 83.000 Euro . Ein besonderes Merkmal ist das patentierte \"Dream4\"-System, mit dem sich vier vollwertige Schlafplätze im Kastenwagen realisieren lassen – ganz ohne Aufstelldach. Segmente: ausschließlich kompakte Campingbusse (Kastenwagen) Baureihen: Cruise und Select (je in 6,00 m & 6,36 m) Basispreise : ab ca. 59.000 bis 83.000 Euro Besonderheiten: Skandinavisch inspiriertes Interieur, lückenlose Isolation (Fußboden- & Dieselheizung), patentiertes Dream4 -Schlafsystem für vier Personen Hier geht es zum Test des Tourne 6.4 5. Megamobil – Alternative Größe mit Komfort Megamobil produziert ausschließlich Kastenwagen – und das in sorgfältiger Handarbeit. Das slowenische Familienunternehmen mit Sitz in Slovenska Bistrica hat seine Wurzeln in den 1960er-Jahren, der Ausbau von Campervans erfolgt seit rund 15 Jahren. Heute fertigen rund 80 Mitarbeiter jährlich etwa 500 Fahrzeuge – mit viel Sorgfalt, robusten Materialien und einem klaren Fokus auf Praxistauglichkeit und ganzjährige Nutzbarkeit. Alle Modelle entstehen auf Basis von Fiat Ducato, Citroën Jumper, MAN TGE oder VW Crafter – und unterscheiden sich in Länge (von 5,40 bis 6,80 m), Raumaufteilung und Technik. Die Möbel bestehen aus 15 mm starkem Pappelsperrholz mit pflegeleichter CPL-Oberfläche, die Fahrzeuge sind rundum isoliert und mit Armaflex gedämmt. Jedes Exemplar durchläuft nach Angaben des Herstellers vor der Auslieferung umfangreiche Funktions- und Dichtheitsprüfungen. Besonders beliebt ist der Mega Sport 640 : ein clever konzipierter Campervan mit elektrischem Hubbett über einem großen Stauraum im Heck – dort lassen sich selbst zwei Fahrräder unterbringen. Im promobil-Test lobten wir primär das flexible Bettkonzept, die gute Familiennutzung und die hochwertige Verarbeitung. Kritik gab es nur für kleinere Komfortdetails wie fehlende Ablageflächen im Bettbereich. Zum vollständigen Test des Mega Sport 640 geht es hier. Segmente: ausschließlich Kastenwagen Baureihen: Lounge, Classic, Sport, Revolution , Twin, Re-Aktiv , 4x4 Basispreise : ab ca. 70.000 Euro", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/slowenische-campingmarken-sind-laengst-auf-dem-deutschen-markt-angekommen/", @@ -6113,10 +6113,10 @@ }, { "id": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/", - "title": "\u201eBella Italia \u2013 Camping auf Deutsch\u201c Recap Folge 2: Sascha und Dennis vom Bodensee als Italiener", + "title": "„Bella Italia – Camping auf Deutsch“ Recap Folge 2: Sascha und Dennis vom Bodensee als Italiener", "date": "Tue, 17 Jun 2025 16:00:00 +0200", - "summary": "

Endlich geht es wieder los: die neue Staffel \"Bella Italia \u2013 Camping auf Deutsch\" ist auf RTL II gestartet. In Folge 2 wollen die Bodensee-Boys als Italiener durchgehen \u2013 ohne Italienisch-Kenntnisse. Wie das klappt?!

", - "text": "Gestern (16.06.2025) lief nun schon die zweite Folge der neuen Staffel \"Bella Italia \u2013 Camping auf Deutsch\" auf RTL II. Mit dabei sind nat\u00fcrlich die Fingerhuths und die Bodensee-Boys, aber auch ein paar neue Gesichter. Eines vereint sie alle: sie machen Urlaub auf dem ber\u00fchmten italienischen Campingplatz \" Marina di Venezia \". Fingerhuths gehen dem Marina fremd Naja fast! Sascha und Nicole Fingerhuth und Clique scheinen dieses Mal dem Mega-Campingplatz fremdzugehen und urlauben lieber an der Costa Brava in Spanien. Das Filmteam ist trotzdem dabei. Ob sie diese Staffel noch auf dem Marina zu sehen sind? Es bleibt spannend. F\u00fcr mich ist es immer wieder erstaunlich, was die Camperinnen und Camper alles aus ihren Wohnmobilen und Wohnwagen zaubern. Sei es Micha, der ein Sammelsurium an bunten Strasssteinchen aus seinem Wohnwagen zaubert, mit dem er uns seine Kumpels Horst und Sascha ihre K\u00fchlboxen verzieren oder Hypnotiseur Peter und seine Frau Angelika f\u00fcr die ein Eierkocher zur Standardausr\u00fcstung geh\u00f6rt. Folge 2 \"Bella Italia\": Was ist passiert? Einen liebenswerten Moment gab es bei den Camping-Neulingen Maysofie und Tochter Mia, die zum allerersten Mal die Wohnwagen-Toilette ausleeren gehen mussten. Sicher erinnern sich die meisten langj\u00e4hrigen Camping-Fans an ihr eigenes erstes Mal. Die Kassette der Toilette \u00fcber den Platz ziehen \u2013 das kostet zun\u00e4chst einmal \u00dcberwindung. Maysofie opfert sich dann tapfer und leert die Br\u00fche in den Ausguss. Unter W\u00fcrgen und Jammern haben die beiden es hinter sich gebracht. Die Bondesee-Boys Sascha und Dennis sind wieder auf einer Mission: Sie wollen als waschechte Italiener durchgehen und das nahegelegene Venedig unsicher machen. Das Problem ist nur: Italienisch sprechen sie noch schlechter als Englisch. Das macht aber gar nichts. Das Liebenswerte an den beiden M\u00e4nnern ist ja, dass sie sich mit Hand und Fu\u00df verst\u00e4ndigen k\u00f6nnen und zusammen immer Spa\u00df haben. Nach so einigen Aperol-Spritz l\u00e4uft es dann mit der Kontaktaufnahme auf Italienischen auch gar nicht so schlecht. Nat\u00fcrlich alles nur freundschaftlich. Mittlerweile sind beide Schwaben vergeben und Flirts suchen sie auf dem Marina di Venezia nicht mehr. Ehepaar kehrt zur\u00fcck Gegen Ende der Folge reist dann noch ein weiteres Kult-P\u00e4rchen an. Lex und seine frisch angetraute Annika \u2013 sie haben sich in der letzten Staffel das Ja-Wort am Strand des Campingplatzes gegeben \u2013 reisen mit ihren beiden M\u00fcttern an. Das verspricht Unterhaltung. Das Ehepaar w\u00fcnscht sich Zweisamkeit. Und die M\u00fctter? Familienzeit. Ob das gut geht?! Wir k\u00f6nnen gespannt sein auf die n\u00e4chste unterhaltsame Folge der Doku-Soap \"Bella Italia \u2013 Camping auf Deutsch\" am 23.06.2025.", + "summary": "

Endlich geht es wieder los: die neue Staffel \"Bella Italia – Camping auf Deutsch\" ist auf RTL II gestartet. In Folge 2 wollen die Bodensee-Boys als Italiener durchgehen – ohne Italienisch-Kenntnisse. Wie das klappt?!

", + "text": "Gestern (16.06.2025) lief nun schon die zweite Folge der neuen Staffel \"Bella Italia – Camping auf Deutsch\" auf RTL II. Mit dabei sind natürlich die Fingerhuths und die Bodensee-Boys, aber auch ein paar neue Gesichter. Eines vereint sie alle: sie machen Urlaub auf dem berühmten italienischen Campingplatz \" Marina di Venezia \". Fingerhuths gehen dem Marina fremd Naja fast! Sascha und Nicole Fingerhuth und Clique scheinen dieses Mal dem Mega-Campingplatz fremdzugehen und urlauben lieber an der Costa Brava in Spanien. Das Filmteam ist trotzdem dabei. Ob sie diese Staffel noch auf dem Marina zu sehen sind? Es bleibt spannend. Für mich ist es immer wieder erstaunlich, was die Camperinnen und Camper alles aus ihren Wohnmobilen und Wohnwagen zaubern. Sei es Micha, der ein Sammelsurium an bunten Strasssteinchen aus seinem Wohnwagen zaubert, mit dem er uns seine Kumpels Horst und Sascha ihre Kühlboxen verzieren oder Hypnotiseur Peter und seine Frau Angelika für die ein Eierkocher zur Standardausrüstung gehört. Folge 2 \"Bella Italia\": Was ist passiert? Einen liebenswerten Moment gab es bei den Camping-Neulingen Maysofie und Tochter Mia, die zum allerersten Mal die Wohnwagen-Toilette ausleeren gehen mussten. Sicher erinnern sich die meisten langjährigen Camping-Fans an ihr eigenes erstes Mal. Die Kassette der Toilette über den Platz ziehen – das kostet zunächst einmal Überwindung. Maysofie opfert sich dann tapfer und leert die Brühe in den Ausguss. Unter Würgen und Jammern haben die beiden es hinter sich gebracht. Die Bondesee-Boys Sascha und Dennis sind wieder auf einer Mission: Sie wollen als waschechte Italiener durchgehen und das nahegelegene Venedig unsicher machen. Das Problem ist nur: Italienisch sprechen sie noch schlechter als Englisch. Das macht aber gar nichts. Das Liebenswerte an den beiden Männern ist ja, dass sie sich mit Hand und Fuß verständigen können und zusammen immer Spaß haben. Nach so einigen Aperol-Spritz läuft es dann mit der Kontaktaufnahme auf Italienischen auch gar nicht so schlecht. Natürlich alles nur freundschaftlich. Mittlerweile sind beide Schwaben vergeben und Flirts suchen sie auf dem Marina di Venezia nicht mehr. Ehepaar kehrt zurück Gegen Ende der Folge reist dann noch ein weiteres Kult-Pärchen an. Lex und seine frisch angetraute Annika – sie haben sich in der letzten Staffel das Ja-Wort am Strand des Campingplatzes gegeben – reisen mit ihren beiden Müttern an. Das verspricht Unterhaltung. Das Ehepaar wünscht sich Zweisamkeit. Und die Mütter? Familienzeit. Ob das gut geht?! Wir können gespannt sein auf die nächste unterhaltsame Folge der Doku-Soap \"Bella Italia – Camping auf Deutsch\" am 23.06.2025.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/recap-folge-2-bella-italia-camping-auf-deutsch/", @@ -6224,10 +6224,10 @@ }, { "id": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/", - "title": "Tipps f\u00fcr die Reiseplanung: Diese kostenlosen Apps m\u00fcssen Camper kennen", + "title": "Tipps für die Reiseplanung: Diese kostenlosen Apps müssen Camper kennen", "date": "Sat, 14 Jun 2025 14:00:00 +0200", - "summary": "

Diese Apps retten den Urlaub: Ob Krankheit, Notfall oder Sprachbarriere \u2013 hier sind 5 App-Kategorien, die im Ausland helfen.

", - "text": "Im Urlaub will man zwar nicht st\u00e4ndig am Mobiltelefon h\u00e4ngen, doch in vielen Situationen kann es ein n\u00fctzlicher Helfer sein. W\u00e4hrend die Internetrecherche schnell vom eigentlichen Ziel ablenkt, bieten spezialisierte Apps einen klaren Fokus. Sie lenken nicht ab, sondern konzentrieren sich auf ein Thema \u2013 und genau das macht sie so praktisch. Ein gutes Beispiel ist die promobil Stellplatz-Radar-App , die gezielt bei der Suche nach Camping- und Stellpl\u00e4tzen oder Entsorgungsstationen unterst\u00fctzt. Doch nicht nur \u00dcbernachtungspl\u00e4tze und Entsorgungsm\u00f6glichkeiten sind im Campingurlaub unverzichtbar. Wir haben kostenlose Apps aus f\u00fcnf Kategorien zusammengestellt, die im Krankheitsfall, bei Sprachbarrieren oder in Notf\u00e4llen in fremder Umgebung weiterhelfen. 1. Mobile Daten im Blick behalten Viele Apps funktionieren nicht nur offline, sondern verbrauchen auch mobile Daten. Daher steht am Anfang jeder Auslandsreise der Blick auf den Mobilfunktarif und das verf\u00fcgbare Datenvolumen in EU und Nicht-EU. Besonders in Grenzregionen zu Nicht-EU-Staaten wie etwa der Schweiz kann es vorkommen, dass sich das Mobiltelefon in das Netz des Nachbarlands einw\u00e4hlt und je nach Tarif hohe Roaming-Geb\u00fchren anfallen. Abhilfe bieten die Apps der Mobilfunkanbieter, \u00fcber die man die pers\u00f6nlichen Tarifdetails einsehen, sein verbrauchtes Datenguthaben kontrollieren und gegebenenfalls erweitern kann. Die Telekom bietet diesen Service in der \"Magenta-App\" : Apple Store: MeinMagenta: Handy & Festnetz im App Store Google-Play-Store: MeinMagenta: Handy & Festnetz \u2013 Apps bei Google Play Bei Telef\u00f3nica findet man die entsprechenden Funktionen in der \" Mein O2-App \": Apple Store: Mein o2 im App Store Google-Play-Store: Mein o2 \u2013 Apps bei Google Play Bei Vodafone in der App \" Mein Vodafone \": Apple Store: MeinVodafone \u2013 Apps bei Google Play Google-Play-Store: MeinVodafone im App Store Bei 1&1 gibt es daf\u00fcr die App \" Control-Center \": Apple Store: 1&1 Control-Center im App Store Google-Play-Store: 1&1 Control-Center \u2013 Apps bei Google Play 2. Sicherheitshinweise immer auf dem Schirm Je nach Reiseland sollte man sich schon vor dem Losfahren \u00fcber aktuelle Entwicklungen am Zielort informieren. Mit der App \"Sicher Reisen\" vom Ausw\u00e4rtigen Amt kann man im Vorfeld und unterwegs die Reise- und Sicherheitshinweise des Urlaubslands im Blick behalten. Bei aktuellen \u00c4nderungen wird man auf Wunsch automatisch informiert. Au\u00dferdem findet man in der App detaillierte Informationen zu Ansprechpartnern der deutschen Auslandsvertretungen. Die App enth\u00e4lt zudem Hinweise, wie man im Urlaub vorgeht, falls der Ausweis verloren geht oder der Zugang zum Konto oder zur Kreditkarte nicht mehr m\u00f6glich ist. Die App \" Sicher Reisen \" gibt es in den Stores von Apple und Google: Apple Store: Sicher Reisen im App Store Google-Play-Store: Sicher Reisen \u2013 Apps bei Google Play Sogenannte Notfall-Informations-Apps senden bei Unwettern und anderen Katastrophenlagen Push-Nachrichten aufs Mobiltelefon. Sie warnen vor Gefahren wie etwa Hochwasser, Feuer oder auch bei Gef\u00e4hrdungslagen, etwa nach Anschl\u00e4gen. Wer innerhalb Deutschlands unterwegs ist, wird \u00fcber die App \"Nina\" vom Bundesamt f\u00fcr Bev\u00f6lkerungsschutz bei Gefahrenlagen an heimischen Standorten gewarnt. Die App \" Nina \" gibt es in den Stores von Apple und Google: Apple Store: NINA im App Store Google-Play-Store: NINA - Die Warn-App des BBK \u2013 Apps bei Google Play Bei Reisen innerhalb von Europa empfiehlt sich eine international vernetzte Warn-App wie \"Katwarn\". Dank der sogenannten \"Katwarn-Roaming-Technologie\" erh\u00e4lt man \u2013 bei entsprechender Einstellung \u2013 auch im Ausland Warnmeldungen f\u00fcr den aktuellen Aufenthaltsort, ohne die App des jeweiligen Landes installieren zu m\u00fcssen. Die App \" Katwarn \" gibt es in den Stores von Apple und Google: Apple Store: KATWARN im App Store Google-Play-Store: KATWARN \u2013 Apps bei Google Play 3. Bei Krankheit \u00e4rztlichen Rat suchen Gerade im Urlaub und wom\u00f6glich noch im Ausland kann es herausfordernd sein, einen Arzt oder ein Krankenhaus zu finden. Da ist es beruhigend, wenn man sich im Vorfeld bereits auf eine solche Situation vorbereitet hat. Viele nutzen auch im Alltag schon Apps, um Arzttermine zu buchen oder sich per Videosprechstunde von einem Arzt beraten zu lassen. Unabh\u00e4ngig von einer bestimmten Krankenversicherung kann man beispielsweise \u00fcber die App des M\u00fcnchner Unternehmens Teleclinic Online-Arztgespr\u00e4che vereinbaren, ggf. sogar beim eigenen Arzt, wenn er dort gelistet ist. Die App von Teleclinic gibt es hier zum Download: Apple Store: TeleClinic - Online Arzt im App Store Google-Play-Store TeleClinic - Online Arzt - Apps on Google Play Auch der ADAC bietet diesen Service in Kooperation mit Teleclinic und Doctolib an. Daf\u00fcr kann man den ADAC-Onlinezugang nutzen. F\u00fcr die Online-Sprechstunde ist eine ADAC-Mitgliedschaft oder ein Auslandskrankenschutz des ADAC notwendig. Hier geht es zur ADAC \" Medical App \" in den Stores von Apple und Google: Apple Store: ADAC Medical: Gesundheitsapp im App Store Google-Play-Store: ADAC Medical: Gesundheitsapp \u2013 Apps bei Google Play Auch viele Krankenversicherungen bieten ihren Versicherten den Service der Telesprechstunde in eigenen Apps. Hier einige Beispiele der gr\u00f6\u00dften gesetzlichen Krankenversicherungen: Die AOK mit der App \" AOK NAVIDA \": Apple-Store: AOK NAVIDA im App Store Google-Play-Store: AOK NAVIDA \u2013 Apps bei Google Play Die Barmer mit der \" Teledoktor-App \": Apple-Store: BARMER Teledoktor-App im App Store Google-Play-Store: BARMER Teledoktor-App \u2013 Apps bei Google Play Die DAK mit der \" DAK-App \": Apple-Store: DAK App im App Store Google-Play-Store: DAK App \u2013 Apps bei Google Play Techniker Krankenkasse mit ihrer \" App TK-Doc \": Apple-Store: TK-Doc im App Store Google-Play-Store: TK-App \u2013 Apps bei Google Play Viele private Krankenversicherer bieten ihren Versicherten ebenfalls Apps f\u00fcr den Krankheits- oder Notfall an, wie etwa der K\u00f6lner Krankenversicherer Debeka mit der App \"Auslands SOS\". Zum Download von \"Auslands-SOS\" geht es hier: Apple-Store: Debeka Auslands-SOS \u2013 Apps bei Google Play Google-Play-Store: Debeka Auslands-SOS im App Store Vor-Ort und Onlinetermine buchen kann man auch \u00fcber die Apps von Doctolib oder Jameda. Bei Doctolib findet man neben Arztpraxen in Deutschland auch \u00c4rztinnen und \u00c4rzte in Frankreich und Italien. Zum Download von \"Dictolib\" geht es hier: Apple-Store: Doctolib - Die Gesundheits-App im App Store Google-Play-Store: Doctolib - Die Gesundheits-App \u2013 Apps bei Google Play Hier gibt es die App von Jameda zum Download: Apple-Store: jameda: \u00c4rzte finden & buchen im App Store Google-Play-Store: jameda: \u00c4rzte finden & buchen \u2013 Apps bei Google Play 4. Sprachprobleme \u00fcberwinden Wer in Europa reist, trifft unweigerlich auf Situationen, in denen er sich in einer fremden Sprache nur schwer oder gar nicht verst\u00e4ndigen kann. Statt eines klassischen W\u00f6rterbuchs greifen viele inzwischen zu \u00dcbersetzungsapps. Eine empfehlenswerte Alternative zu den US-Anbietern Google und Microsoft ist die App von DeepL die in K\u00f6ln entwickelt wird. DeepL gilt dabei als besonders pr\u00e4zise bei europ\u00e4ischen Sprachen, w\u00e4hrend Google Translate die meisten Sprachen unterst\u00fctzt. Alle drei Apps entwickeln sich laufend weiter und unterst\u00fctzen auch die Kamera- und Bild\u00fcbersetzung. So kann man etwa fremdsprachige Speisekarten oder die Beschreibung von Sehensw\u00fcrdigkeiten direkt \u00fcbersetzen lassen. Auch die Spracheingabe und -ausgabe unterst\u00fctzen alle drei. Der Vorteil der \u00dcbersetzungs-App von Microsoft ist die Offline-Nutzung, wenn man sich eine bestimmte Sprache in der App im Vorfeld heruntergeladen hat. Zur App von DeepL geht es hier: Apple-Store: DeepL Translate on the App Store Google-Play-Store: DeepL \u00dcbersetzer \u2013 Apps bei Google Play Der \"Google \u00dcbersetzer\" in den App-Stores: Apple-Store: Google \u00dcbersetzer im App Store Google-Play-Store: Google \u00dcbersetzer \u2013 Apps bei Google Play Hier geht es zum Microsoft \u00dcbersetzer: Apple-Store: Microsoft Translator im App Store Google-Play-Store: Microsoft \u00dcbersetzer \u2013 Apps bei Google Play 5. Im Notfall Hilfe rufen In Ausnahmesituationen vergisst man oft die einfachsten Dinge. Die Rufnummer 112 ist in Deutschland und Europa die Notrufnummer f\u00fcr lebensbedrohliche Notf\u00e4lle wie Br\u00e4nde, Unf\u00e4lle und medizinische Notf\u00e4lle. Sie ist ohne Vorwahl und kostenlos erreichbar. In Deutschland kann man einen Notruf auch \u00fcber die App \"Nora\" absetzen. Sie ist in Kooperation der Bundesl\u00e4nder entstanden. Zuvor muss man sich mit der eigenen Mobilfunknummer registrieren und per Postident mit seinem Ausweis identifizieren. So soll unter anderem Missbrauch verhindert werden. Nach der Verifizierung kann man \u00fcber einen Button in der App bei Notf\u00e4llen die Polizei, die Feuerwehr und den Rettungsdienst \u00fcberall in Deutschland alarmieren. Mit der Standort-Funktion des Mobiltelefons wird der genaue Standort an die Leitstelle \u00fcbermittelt. \u00dcber die App k\u00f6nnen auch Notrufe abgesetzt werden, ohne sprechen zu m\u00fcssen. Zum Download der \" Nora \"-App: Apple-Store: nora - Notruf-App im App Store Google-Play-Store: nora - Notruf-App \u2013 Apps bei Google Play Die in der Schweiz entwickelte Notruf-App \"EchoSOS\" funktioniert im Gegensatz zu \"Nora\" weltweit. Auch sie erkennt den Standort und zeigt die Notrufnummer des entsprechenden Landes an. Der Notruf kann dann wie bei \"Nora\" aus der App heraus automatisch gestartet werden. Dabei wird auch der Standort an die Leitstelle \u00fcbertragen. Ist am Notrufort kein mobiles Internet verf\u00fcgbar, dann wird \u00fcber die App automatisch eine SMS verschickt an die Leitstelle verschickt. Hier geht es zum Download von \" EchoSOS \": Apple-Store: EchoSOS on the App Store Google-Play-Store: EchoSOS \u2013 Apps bei Google Play In beiden Apps kann man sich auf die Nutzung der Anwendung im Notfall vorbereiten und \u00fcber eine Demo den Notfall simulieren.", + "summary": "

Diese Apps retten den Urlaub: Ob Krankheit, Notfall oder Sprachbarriere – hier sind 5 App-Kategorien, die im Ausland helfen.

", + "text": "Im Urlaub will man zwar nicht ständig am Mobiltelefon hängen, doch in vielen Situationen kann es ein nützlicher Helfer sein. Während die Internetrecherche schnell vom eigentlichen Ziel ablenkt, bieten spezialisierte Apps einen klaren Fokus. Sie lenken nicht ab, sondern konzentrieren sich auf ein Thema – und genau das macht sie so praktisch. Ein gutes Beispiel ist die promobil Stellplatz-Radar-App , die gezielt bei der Suche nach Camping- und Stellplätzen oder Entsorgungsstationen unterstützt. Doch nicht nur Übernachtungsplätze und Entsorgungsmöglichkeiten sind im Campingurlaub unverzichtbar. Wir haben kostenlose Apps aus fünf Kategorien zusammengestellt, die im Krankheitsfall, bei Sprachbarrieren oder in Notfällen in fremder Umgebung weiterhelfen. 1. Mobile Daten im Blick behalten Viele Apps funktionieren nicht nur offline, sondern verbrauchen auch mobile Daten. Daher steht am Anfang jeder Auslandsreise der Blick auf den Mobilfunktarif und das verfügbare Datenvolumen in EU und Nicht-EU. Besonders in Grenzregionen zu Nicht-EU-Staaten wie etwa der Schweiz kann es vorkommen, dass sich das Mobiltelefon in das Netz des Nachbarlands einwählt und je nach Tarif hohe Roaming-Gebühren anfallen. Abhilfe bieten die Apps der Mobilfunkanbieter, über die man die persönlichen Tarifdetails einsehen, sein verbrauchtes Datenguthaben kontrollieren und gegebenenfalls erweitern kann. Die Telekom bietet diesen Service in der \"Magenta-App\" : Apple Store: MeinMagenta: Handy & Festnetz im App Store Google-Play-Store: MeinMagenta: Handy & Festnetz – Apps bei Google Play Bei Telefónica findet man die entsprechenden Funktionen in der \" Mein O2-App \": Apple Store: Mein o2 im App Store Google-Play-Store: Mein o2 – Apps bei Google Play Bei Vodafone in der App \" Mein Vodafone \": Apple Store: MeinVodafone – Apps bei Google Play Google-Play-Store: MeinVodafone im App Store Bei 1&1 gibt es dafür die App \" Control-Center \": Apple Store: 1&1 Control-Center im App Store Google-Play-Store: 1&1 Control-Center – Apps bei Google Play 2. Sicherheitshinweise immer auf dem Schirm Je nach Reiseland sollte man sich schon vor dem Losfahren über aktuelle Entwicklungen am Zielort informieren. Mit der App \"Sicher Reisen\" vom Auswärtigen Amt kann man im Vorfeld und unterwegs die Reise- und Sicherheitshinweise des Urlaubslands im Blick behalten. Bei aktuellen Änderungen wird man auf Wunsch automatisch informiert. Außerdem findet man in der App detaillierte Informationen zu Ansprechpartnern der deutschen Auslandsvertretungen. Die App enthält zudem Hinweise, wie man im Urlaub vorgeht, falls der Ausweis verloren geht oder der Zugang zum Konto oder zur Kreditkarte nicht mehr möglich ist. Die App \" Sicher Reisen \" gibt es in den Stores von Apple und Google: Apple Store: Sicher Reisen im App Store Google-Play-Store: Sicher Reisen – Apps bei Google Play Sogenannte Notfall-Informations-Apps senden bei Unwettern und anderen Katastrophenlagen Push-Nachrichten aufs Mobiltelefon. Sie warnen vor Gefahren wie etwa Hochwasser, Feuer oder auch bei Gefährdungslagen, etwa nach Anschlägen. Wer innerhalb Deutschlands unterwegs ist, wird über die App \"Nina\" vom Bundesamt für Bevölkerungsschutz bei Gefahrenlagen an heimischen Standorten gewarnt. Die App \" Nina \" gibt es in den Stores von Apple und Google: Apple Store: NINA im App Store Google-Play-Store: NINA - Die Warn-App des BBK – Apps bei Google Play Bei Reisen innerhalb von Europa empfiehlt sich eine international vernetzte Warn-App wie \"Katwarn\". Dank der sogenannten \"Katwarn-Roaming-Technologie\" erhält man – bei entsprechender Einstellung – auch im Ausland Warnmeldungen für den aktuellen Aufenthaltsort, ohne die App des jeweiligen Landes installieren zu müssen. Die App \" Katwarn \" gibt es in den Stores von Apple und Google: Apple Store: KATWARN im App Store Google-Play-Store: KATWARN – Apps bei Google Play 3. Bei Krankheit ärztlichen Rat suchen Gerade im Urlaub und womöglich noch im Ausland kann es herausfordernd sein, einen Arzt oder ein Krankenhaus zu finden. Da ist es beruhigend, wenn man sich im Vorfeld bereits auf eine solche Situation vorbereitet hat. Viele nutzen auch im Alltag schon Apps, um Arzttermine zu buchen oder sich per Videosprechstunde von einem Arzt beraten zu lassen. Unabhängig von einer bestimmten Krankenversicherung kann man beispielsweise über die App des Münchner Unternehmens Teleclinic Online-Arztgespräche vereinbaren, ggf. sogar beim eigenen Arzt, wenn er dort gelistet ist. Die App von Teleclinic gibt es hier zum Download: Apple Store: TeleClinic - Online Arzt im App Store Google-Play-Store TeleClinic - Online Arzt - Apps on Google Play Auch der ADAC bietet diesen Service in Kooperation mit Teleclinic und Doctolib an. Dafür kann man den ADAC-Onlinezugang nutzen. Für die Online-Sprechstunde ist eine ADAC-Mitgliedschaft oder ein Auslandskrankenschutz des ADAC notwendig. Hier geht es zur ADAC \" Medical App \" in den Stores von Apple und Google: Apple Store: ADAC Medical: Gesundheitsapp im App Store Google-Play-Store: ADAC Medical: Gesundheitsapp – Apps bei Google Play Auch viele Krankenversicherungen bieten ihren Versicherten den Service der Telesprechstunde in eigenen Apps. Hier einige Beispiele der größten gesetzlichen Krankenversicherungen: Die AOK mit der App \" AOK NAVIDA \": Apple-Store: AOK NAVIDA im App Store Google-Play-Store: AOK NAVIDA – Apps bei Google Play Die Barmer mit der \" Teledoktor-App \": Apple-Store: BARMER Teledoktor-App im App Store Google-Play-Store: BARMER Teledoktor-App – Apps bei Google Play Die DAK mit der \" DAK-App \": Apple-Store: DAK App im App Store Google-Play-Store: DAK App – Apps bei Google Play Techniker Krankenkasse mit ihrer \" App TK-Doc \": Apple-Store: TK-Doc im App Store Google-Play-Store: TK-App – Apps bei Google Play Viele private Krankenversicherer bieten ihren Versicherten ebenfalls Apps für den Krankheits- oder Notfall an, wie etwa der Kölner Krankenversicherer Debeka mit der App \"Auslands SOS\". Zum Download von \"Auslands-SOS\" geht es hier: Apple-Store: Debeka Auslands-SOS – Apps bei Google Play Google-Play-Store: Debeka Auslands-SOS im App Store Vor-Ort und Onlinetermine buchen kann man auch über die Apps von Doctolib oder Jameda. Bei Doctolib findet man neben Arztpraxen in Deutschland auch Ärztinnen und Ärzte in Frankreich und Italien. Zum Download von \"Dictolib\" geht es hier: Apple-Store: Doctolib - Die Gesundheits-App im App Store Google-Play-Store: Doctolib - Die Gesundheits-App – Apps bei Google Play Hier gibt es die App von Jameda zum Download: Apple-Store: jameda: Ärzte finden & buchen im App Store Google-Play-Store: jameda: Ärzte finden & buchen – Apps bei Google Play 4. Sprachprobleme überwinden Wer in Europa reist, trifft unweigerlich auf Situationen, in denen er sich in einer fremden Sprache nur schwer oder gar nicht verständigen kann. Statt eines klassischen Wörterbuchs greifen viele inzwischen zu Übersetzungsapps. Eine empfehlenswerte Alternative zu den US-Anbietern Google und Microsoft ist die App von DeepL die in Köln entwickelt wird. DeepL gilt dabei als besonders präzise bei europäischen Sprachen, während Google Translate die meisten Sprachen unterstützt. Alle drei Apps entwickeln sich laufend weiter und unterstützen auch die Kamera- und Bildübersetzung. So kann man etwa fremdsprachige Speisekarten oder die Beschreibung von Sehenswürdigkeiten direkt übersetzen lassen. Auch die Spracheingabe und -ausgabe unterstützen alle drei. Der Vorteil der Übersetzungs-App von Microsoft ist die Offline-Nutzung, wenn man sich eine bestimmte Sprache in der App im Vorfeld heruntergeladen hat. Zur App von DeepL geht es hier: Apple-Store: DeepL Translate on the App Store Google-Play-Store: DeepL Übersetzer – Apps bei Google Play Der \"Google Übersetzer\" in den App-Stores: Apple-Store: Google Übersetzer im App Store Google-Play-Store: Google Übersetzer – Apps bei Google Play Hier geht es zum Microsoft Übersetzer: Apple-Store: Microsoft Translator im App Store Google-Play-Store: Microsoft Übersetzer – Apps bei Google Play 5. Im Notfall Hilfe rufen In Ausnahmesituationen vergisst man oft die einfachsten Dinge. Die Rufnummer 112 ist in Deutschland und Europa die Notrufnummer für lebensbedrohliche Notfälle wie Brände, Unfälle und medizinische Notfälle. Sie ist ohne Vorwahl und kostenlos erreichbar. In Deutschland kann man einen Notruf auch über die App \"Nora\" absetzen. Sie ist in Kooperation der Bundesländer entstanden. Zuvor muss man sich mit der eigenen Mobilfunknummer registrieren und per Postident mit seinem Ausweis identifizieren. So soll unter anderem Missbrauch verhindert werden. Nach der Verifizierung kann man über einen Button in der App bei Notfällen die Polizei, die Feuerwehr und den Rettungsdienst überall in Deutschland alarmieren. Mit der Standort-Funktion des Mobiltelefons wird der genaue Standort an die Leitstelle übermittelt. Über die App können auch Notrufe abgesetzt werden, ohne sprechen zu müssen. Zum Download der \" Nora \"-App: Apple-Store: nora - Notruf-App im App Store Google-Play-Store: nora - Notruf-App – Apps bei Google Play Die in der Schweiz entwickelte Notruf-App \"EchoSOS\" funktioniert im Gegensatz zu \"Nora\" weltweit. Auch sie erkennt den Standort und zeigt die Notrufnummer des entsprechenden Landes an. Der Notruf kann dann wie bei \"Nora\" aus der App heraus automatisch gestartet werden. Dabei wird auch der Standort an die Leitstelle übertragen. Ist am Notrufort kein mobiles Internet verfügbar, dann wird über die App automatisch eine SMS verschickt an die Leitstelle verschickt. Hier geht es zum Download von \" EchoSOS \": Apple-Store: EchoSOS on the App Store Google-Play-Store: EchoSOS – Apps bei Google Play In beiden Apps kann man sich auf die Nutzung der Anwendung im Notfall vorbereiten und über eine Demo den Notfall simulieren.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/", @@ -6255,15 +6255,15 @@ }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2213669.jpg", - "alt": "Kostenlose-Apps_Arztgespr\u00e4ch", - "caption": "Kostenlose-Apps_Arztgespr\u00e4ch", + "alt": "Kostenlose-Apps_Arztgespräch", + "caption": "Kostenlose-Apps_Arztgespräch", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2213670.jpg", - "alt": "Kostenlose-Apps_\u00dcbersetzer", - "caption": "Kostenlose-Apps_\u00dcbersetzer", + "alt": "Kostenlose-Apps_Übersetzer", + "caption": "Kostenlose-Apps_Übersetzer", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/weitere-ratgeber/diese-kostenlosen-apps-muessen-camper-kennen/" }, @@ -6358,8 +6358,8 @@ "id": "https://www.promobil.de/weitere-ratgeber/frankreichs-autobahnen-kein-adac-schutz-bei-pannen/", "title": "Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen", "date": "Mon, 04 Aug 2025 16:00:00 +0200", - "summary": "

ADAC & Co. d\u00fcrfen bei Pannen in Frankreich nicht helfen \u2013 was Camperinnen und Camper auf Autobahnen wissen und beachten m\u00fcssen.

", - "text": "Wer mit dem Wohnmobil durch Frankreich reist und auf der Autobahn liegenbleibt, kann von seinem Schutzbriefanbieter keine Hilfe erwarten. W\u00e4hrend etwa in Deutschland oder Italien Automobilclubs und Schutzbriefversicherungen Hilfe organisieren, greifen auf Frankreichs Autobahnen andere Regeln. Nur Notrufs\u00e4ule oder 112 \u2013 sonst nichts Im Fall einer Panne auf der franz\u00f6sischen Autobahn d\u00fcrfen Dienstleister wie etwa der ADAC keine Hilfe organisieren. Stattdessen muss die Panne \u00fcber eine der Notrufs\u00e4ulen oder \u00fcber die Notrufnummer 112 gemeldet werden. Nach der Meldung koordiniert der private Autobahnbetreiber den daf\u00fcr autorisierten Pannendienst, der binnen rund 30 Minuten eintreffen sollte. Abschleppen oder Reparatur vor Ort Der Pannenhelfer pr\u00fcft, ob das Wohnmobil vor Ort repariert werden kann oder in eine Werkstatt abgeschleppt werden muss. Beim Abschleppen hat man die Wahl zwischen zwei Optionen: Man l\u00e4sst sich in die n\u00e4chste Werkstatt abschleppen oder l\u00e4sst das Wohnmobil auf Wunsch zu einem anderen Ort bringen, allerdings maximal f\u00fcnf Kilometer abseits der n\u00e4chsten Autobahnausfahrt. Gesetzlich geregelte Abschleppkosten bis 3,5 Tonnen Doch zumindest Fahrer von Wohnmobilen bis 3,5 Tonnen k\u00f6nnen aufatmen: F\u00fcr das Abschleppen auf Frankreichs Autobahnen gelten gesetzlich festgelegte Tarife. So d\u00fcrfen aktuell f\u00fcr das Abschleppen eines Wohnmobils unter 3,5 Tonnen tags\u00fcber pauschal 148,67 Euro berechnet werden (Montag bis Freitag zwischen 8 und 18 Uhr). In den \u00fcbrigen Zeiten sowie an Wochenenden und Feiertagen gilt eine Pauschale von 223,01 Euro. Zur besseren Transparenz m\u00fcssen diese Preise im Pannenhilfefahrzeug ausgeh\u00e4ngt sein. Bezahlt werden muss die Rechnung direkt vor Ort. Schutzbriefversicherungen erstatten oft im Nachhinein die Kosten f\u00fcrs Abschleppen, der ADAC etwa bis zu 300 Euro. Reparaturen zahlt man selbst Die Kosten f\u00fcr eine Reparatur durch die Pannenhilfe m\u00fcssen Wohnmobilfahrer im Gegensatz zu den Abschleppkosten auch mit Schutzbrief selbst tragen. Dabei sollte man unbedingt darauf achten, dass man eine Rechnung bekommt. Wie auch beim Abschleppen ist der Pannenhelfer verpflichtet, eine Rechnung auszustellen, auf der alle erbrachten Leistungen und deren Preis aufgef\u00fchrt sind. Schwerer als 3,5 Tonnen? Dann wird's teuer Kritischer wird es f\u00fcr Besitzer schwererer Wohnmobile: Ab einem zul\u00e4ssigen Gesamtgewicht von \u00fcber 3,5 Tonnen gibt es keine regulierten Tarife auf Frankreichs Autobahnen. Die Preise richten sich nach den Vorgaben des gerufenen Abschleppdienstes \u2013 vierstellige Betr\u00e4ge sind keine Seltenheit. Wer ein gro\u00dfes Wohnmobil f\u00e4hrt, sollte daher unbedingt vor Reiseantritt \u00fcberpr\u00fcfen, ob und in welcher H\u00f6he der Versicherungsschutz greift, und sich beim jeweiligen Versicherer r\u00fcckversichern, wie er im Pannenfall vorgehen soll. So verhalten Sie sich bei einer Panne richtig In Frankreich ist es nicht erlaubt, sich zu Fu\u00df auf der Autobahn (einschlie\u00dflich Pannenstreifen) zu bewegen. Alle Insassen des Wohnmobils m\u00fcssen bei einer Panne oder einem Unfall au\u00dferhalb des Fahrzeugs eine Warnweste tragen und unverz\u00fcglich die Fahrbahn und den Standstreifen verlassen. Auf das Aufstellen eines Warndreiecks auf Autobahnen kann laut ADAC verzichtet werden, wenn der Fahrer sich dadurch in Gefahr bringt. Dagegen ist auf Landstra\u00dfen und innerorts das Aufstellen eines Warndreiecks vorgeschrieben. Wer sein Fahrzeug noch aus eigener Kraft bewegen kann, sollte unbedingt versuchen, die n\u00e4chste Autobahnausfahrt zu erreichen. Auf Landstra\u00dfen kann man dann wieder frei entscheiden, welchen Pannenhelfer man beauftragen m\u00f6chte.", + "summary": "

ADAC & Co. dürfen bei Pannen in Frankreich nicht helfen – was Camperinnen und Camper auf Autobahnen wissen und beachten müssen.

", + "text": "Wer mit dem Wohnmobil durch Frankreich reist und auf der Autobahn liegenbleibt, kann von seinem Schutzbriefanbieter keine Hilfe erwarten. Während etwa in Deutschland oder Italien Automobilclubs und Schutzbriefversicherungen Hilfe organisieren, greifen auf Frankreichs Autobahnen andere Regeln. Nur Notrufsäule oder 112 – sonst nichts Im Fall einer Panne auf der französischen Autobahn dürfen Dienstleister wie etwa der ADAC keine Hilfe organisieren. Stattdessen muss die Panne über eine der Notrufsäulen oder über die Notrufnummer 112 gemeldet werden. Nach der Meldung koordiniert der private Autobahnbetreiber den dafür autorisierten Pannendienst, der binnen rund 30 Minuten eintreffen sollte. Abschleppen oder Reparatur vor Ort Der Pannenhelfer prüft, ob das Wohnmobil vor Ort repariert werden kann oder in eine Werkstatt abgeschleppt werden muss. Beim Abschleppen hat man die Wahl zwischen zwei Optionen: Man lässt sich in die nächste Werkstatt abschleppen oder lässt das Wohnmobil auf Wunsch zu einem anderen Ort bringen, allerdings maximal fünf Kilometer abseits der nächsten Autobahnausfahrt. Gesetzlich geregelte Abschleppkosten bis 3,5 Tonnen Doch zumindest Fahrer von Wohnmobilen bis 3,5 Tonnen können aufatmen: Für das Abschleppen auf Frankreichs Autobahnen gelten gesetzlich festgelegte Tarife. So dürfen aktuell für das Abschleppen eines Wohnmobils unter 3,5 Tonnen tagsüber pauschal 148,67 Euro berechnet werden (Montag bis Freitag zwischen 8 und 18 Uhr). In den übrigen Zeiten sowie an Wochenenden und Feiertagen gilt eine Pauschale von 223,01 Euro. Zur besseren Transparenz müssen diese Preise im Pannenhilfefahrzeug ausgehängt sein. Bezahlt werden muss die Rechnung direkt vor Ort. Schutzbriefversicherungen erstatten oft im Nachhinein die Kosten fürs Abschleppen, der ADAC etwa bis zu 300 Euro. Reparaturen zahlt man selbst Die Kosten für eine Reparatur durch die Pannenhilfe müssen Wohnmobilfahrer im Gegensatz zu den Abschleppkosten auch mit Schutzbrief selbst tragen. Dabei sollte man unbedingt darauf achten, dass man eine Rechnung bekommt. Wie auch beim Abschleppen ist der Pannenhelfer verpflichtet, eine Rechnung auszustellen, auf der alle erbrachten Leistungen und deren Preis aufgeführt sind. Schwerer als 3,5 Tonnen? Dann wird's teuer Kritischer wird es für Besitzer schwererer Wohnmobile: Ab einem zulässigen Gesamtgewicht von über 3,5 Tonnen gibt es keine regulierten Tarife auf Frankreichs Autobahnen. Die Preise richten sich nach den Vorgaben des gerufenen Abschleppdienstes – vierstellige Beträge sind keine Seltenheit. Wer ein großes Wohnmobil fährt, sollte daher unbedingt vor Reiseantritt überprüfen, ob und in welcher Höhe der Versicherungsschutz greift, und sich beim jeweiligen Versicherer rückversichern, wie er im Pannenfall vorgehen soll. So verhalten Sie sich bei einer Panne richtig In Frankreich ist es nicht erlaubt, sich zu Fuß auf der Autobahn (einschließlich Pannenstreifen) zu bewegen. Alle Insassen des Wohnmobils müssen bei einer Panne oder einem Unfall außerhalb des Fahrzeugs eine Warnweste tragen und unverzüglich die Fahrbahn und den Standstreifen verlassen. Auf das Aufstellen eines Warndreiecks auf Autobahnen kann laut ADAC verzichtet werden, wenn der Fahrer sich dadurch in Gefahr bringt. Dagegen ist auf Landstraßen und innerorts das Aufstellen eines Warndreiecks vorgeschrieben. Wer sein Fahrzeug noch aus eigener Kraft bewegen kann, sollte unbedingt versuchen, die nächste Autobahnausfahrt zu erreichen. Auf Landstraßen kann man dann wieder frei entscheiden, welchen Pannenhelfer man beauftragen möchte.", "tags": [], "status": "Trash", "link": "https://www.promobil.de/weitere-ratgeber/frankreichs-autobahnen-kein-adac-schutz-bei-pannen/", @@ -6368,10 +6368,10 @@ }, { "id": "https://www.promobil.de/weitere-ratgeber/warntafel-wahnsinn-in-italien-anbringen-an-fahrradtraegern-trotz-neuer-gesetze-empfohlen/", - "title": "Fahrradtransport in Italien: Warntafel bei Fahrradtr\u00e4gern doch wieder Pflicht?", + "title": "Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht?", "date": "Thu, 31 Jul 2025 10:38:00 +0200", - "summary": "

Chaos beim Fahrradtransport in Italien: Seit Januar 2025 ist die Warntafel an Kupplungstr\u00e4gern mit Kennzeichen und Licht offiziell nicht mehr vorgeschrieben. Doch ADAC und \u00d6AMTC empfehlen, die Warntafel besser weiterhin zu montieren.

", - "text": "Fahrradtransport in Italien: Warntafel bei Fahrradtr\u00e4gern doch wieder Pflicht?\n\nItalienische und internationale Automobilclubs empfehlen Reisenden, trotz neuer Regelungen, Warntafeln an Fahrrad- und Transporttr\u00e4gern ihrer Fahrzeuge anzubringen, um Bu\u00dfgelder zu vermeiden. Seit Januar 2025 hat Italien eine Gesetzes\u00e4nderung eingef\u00fchrt, die besagt, dass diese Tafeln nicht mehr notwendig sind, solange die Beleuchtung sichtbar ist oder der Tr\u00e4ger eine eigene Beleuchtung und ein Wiederholungskennzeichen hat. Dies betr\u00e4fe Fahrzeuge der Klassen M1 und N1, zu denen Wohnmobile und Campingbusse z\u00e4hlen. In der Praxis wird diese Regelung jedoch anscheinend nicht konsequent umgesetzt, und es gibt lokal unterschiedliche Interpretationen, was zu Unsicherheit unter den Reisenden f\u00fchrt. Deshalb raten Automobilclubs, sich weiterhin an die alte Regelung zu halten. Bei Wohnmobilen, bei denen der Fahrradtr\u00e4ger direkt an der Heckwand montiert ist, bleibt die Pflicht zur Warntafel bestehen. Jede Warntafel in Italien muss rot-wei\u00df gestreift sein, Mindestma\u00dfe von 50 cm x 50 cm haben und aus Metallblech bestehen. Wenn die Ladung am Heck breiter als das Fahrzeug ist, muss an jeder Seite eine Tafel montiert werden.", + "summary": "

Chaos beim Fahrradtransport in Italien: Seit Januar 2025 ist die Warntafel an Kupplungsträgern mit Kennzeichen und Licht offiziell nicht mehr vorgeschrieben. Doch ADAC und ÖAMTC empfehlen, die Warntafel besser weiterhin zu montieren.

", + "text": "Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht?\n\nItalienische und internationale Automobilclubs empfehlen Reisenden, trotz neuer Regelungen, Warntafeln an Fahrrad- und Transportträgern ihrer Fahrzeuge anzubringen, um Bußgelder zu vermeiden. Seit Januar 2025 hat Italien eine Gesetzesänderung eingeführt, die besagt, dass diese Tafeln nicht mehr notwendig sind, solange die Beleuchtung sichtbar ist oder der Träger eine eigene Beleuchtung und ein Wiederholungskennzeichen hat. Dies beträfe Fahrzeuge der Klassen M1 und N1, zu denen Wohnmobile und Campingbusse zählen. In der Praxis wird diese Regelung jedoch anscheinend nicht konsequent umgesetzt, und es gibt lokal unterschiedliche Interpretationen, was zu Unsicherheit unter den Reisenden führt. Deshalb raten Automobilclubs, sich weiterhin an die alte Regelung zu halten. Bei Wohnmobilen, bei denen der Fahrradträger direkt an der Heckwand montiert ist, bleibt die Pflicht zur Warntafel bestehen. Jede Warntafel in Italien muss rot-weiß gestreift sein, Mindestmaße von 50 cm x 50 cm haben und aus Metallblech bestehen. Wenn die Ladung am Heck breiter als das Fahrzeug ist, muss an jeder Seite eine Tafel montiert werden.", "tags": [ "\"Italien Reisebestimmungen\"", "\"Automobilclubs Empfehlungen\"", @@ -6382,9 +6382,9 @@ "images": [ { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-Ksiks2ssSZxpEFf1MQedlap1.png?st=2025-08-15T06%3A48%3A42Z&se=2025-08-15T08%3A48%3A42Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=8b33a531-2df9-46a3-bc02-d4b1430a422c&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-08-14T16%3A59%3A16Z&ske=2025-08-15T16%3A59%3A16Z&sks=b&skv=2024-08-04&sig=e0/ULpNgNLwixo3UapqnxHgR18t4HCpyEtnbmik33yA%3D", - "alt": "KI-generiertes Titelbild zu: Fahrradtransport in Italien: Warntafel bei Fahrradtr\u00e4gern doch wieder Pflicht?", - "caption": "KI-generiertes Titelbild zu: Fahrradtransport in Italien: Warntafel bei Fahrradtr\u00e4gern doch wieder Pflicht?", - "copyright": "OpenAI DALL\u00b7E", + "alt": "KI-generiertes Titelbild zu: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht?", + "caption": "KI-generiertes Titelbild zu: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht?", + "copyright": "OpenAI DALL·E", "copyright_url": "https://openai.com/dall-e" } ], @@ -6392,12 +6392,12 @@ }, { "id": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", - "title": "Neue Mautregeln f\u00fcr Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box", + "title": "Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box", "date": "Wed, 30 Jul 2025 16:00:00 +0200", - "summary": "

Ab 2029 gilt f\u00fcr Wohnmobile mit hoher \"tzGm\" die GO-Box-Pflicht \u2013 trotz 3,5 Tonnen \"zGG\" im Fahrzeugschein. promobil erkl\u00e4rt, was das bedeutet.

", - "text": "Neue Mautregeln f\u00fcr Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box\n\nAb dem 1. Februar 2029 gelten neue Vorschriften f\u00fcr die Mautzahlung auf \u00f6sterreichischen Autobahnen und Schnellstra\u00dfen f\u00fcr Wohnmobile. Statt der bisherigen Regelung, nach der sich die Mautpflicht nach dem im Fahrzeugschein eingetragenen zul\u00e4ssigen Gesamtgewicht des Fahrzeugs richtete, ist nun die technisch m\u00f6gliche Gesamtmasse des Fahrzeugs ausschlaggebend. Das bedeutet, dass alle Wohnmobile, die gem\u00e4\u00df Herstellerangaben mehr als 3,5 Tonnen tragen k\u00f6nnten, eine sogenannte GO-Box ben\u00f6tigen, ein elektronisches Ger\u00e4t f\u00fcr die Mautabrechnung. Diese Ger\u00e4te sind an speziellen Vertriebsstellen erh\u00e4ltlich und werden an der Windschutzscheibe des Fahrzeugs montiert. Sie registrieren automatisch, wenn das Fahrzeug eine mautpflichtige Strecke bef\u00e4hrt und berechnen die Maut dann streckenabh\u00e4ngig.\n\nDie \u00c4nderung ist insbesondere f\u00fcr Fahrzeuge relevant, die technisch mehr als 3,5 Tonnen tragen k\u00f6nnten, aber auf ein tats\u00e4chliches Gesamtgewicht von 3,5 Tonnen \"abgelastet\" wurden. Kamen solche Fahrzeuge bislang ohne die GO-Box aus, werden sie ab Februar 2029 mautpflichtig, wenn ihre technisch m\u00f6gliche Gesamtmasse mehr als 3,5 Tonnen betr\u00e4gt. Bereits seit dem 1. Dezember 2023 galt diese Regelung f\u00fcr alle nach diesem Datum neu zugelassenen Wohnmobile.\n\nF\u00fcr die Anmeldung und Einrichtung der GO-Box werden die Fahrzeugdaten (einschlie\u00dflich der Anzahl der Achsen und der Schadstoffklasse, die den Mautpreis beeinflussen), pers\u00f6nliche Daten sowie der Fahrzeugschein ben\u00f6tigt. Nach der Anmeldung erh\u00e4lt der Fahrzeughalter eine Fahrzeugdeklaration, die er bei Fahrten auf mautpflichtigen Strecken in \u00d6sterreich immer dabei haben muss.", + "summary": "

Ab 2029 gilt für Wohnmobile mit hoher \"tzGm\" die GO-Box-Pflicht – trotz 3,5 Tonnen \"zGG\" im Fahrzeugschein. promobil erklärt, was das bedeutet.

", + "text": "Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box\n\nAb dem 1. Februar 2029 gelten neue Vorschriften für die Mautzahlung auf österreichischen Autobahnen und Schnellstraßen für Wohnmobile. Statt der bisherigen Regelung, nach der sich die Mautpflicht nach dem im Fahrzeugschein eingetragenen zulässigen Gesamtgewicht des Fahrzeugs richtete, ist nun die technisch mögliche Gesamtmasse des Fahrzeugs ausschlaggebend. Das bedeutet, dass alle Wohnmobile, die gemäß Herstellerangaben mehr als 3,5 Tonnen tragen könnten, eine sogenannte GO-Box benötigen, ein elektronisches Gerät für die Mautabrechnung. Diese Geräte sind an speziellen Vertriebsstellen erhältlich und werden an der Windschutzscheibe des Fahrzeugs montiert. Sie registrieren automatisch, wenn das Fahrzeug eine mautpflichtige Strecke befährt und berechnen die Maut dann streckenabhängig.\n\nDie Änderung ist insbesondere für Fahrzeuge relevant, die technisch mehr als 3,5 Tonnen tragen könnten, aber auf ein tatsächliches Gesamtgewicht von 3,5 Tonnen \"abgelastet\" wurden. Kamen solche Fahrzeuge bislang ohne die GO-Box aus, werden sie ab Februar 2029 mautpflichtig, wenn ihre technisch mögliche Gesamtmasse mehr als 3,5 Tonnen beträgt. Bereits seit dem 1. Dezember 2023 galt diese Regelung für alle nach diesem Datum neu zugelassenen Wohnmobile.\n\nFür die Anmeldung und Einrichtung der GO-Box werden die Fahrzeugdaten (einschließlich der Anzahl der Achsen und der Schadstoffklasse, die den Mautpreis beeinflussen), persönliche Daten sowie der Fahrzeugschein benötigt. Nach der Anmeldung erhält der Fahrzeughalter eine Fahrzeugdeklaration, die er bei Fahrten auf mautpflichtigen Strecken in Österreich immer dabei haben muss.", "tags": [ - "\"Mautvorschriften \u00d6sterreich\"", + "\"Mautvorschriften Österreich\"", "\"Wohnmobile\"", "\"GO-Box\"" ], @@ -6407,22 +6407,22 @@ { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/1102576.jpg", "alt": "Go-Box", - "caption": "Maut, Basis, Wissen, \u00d6sterreich, Vignette, Go-Box,", + "caption": "Maut, Basis, Wissen, Österreich, Vignette, Go-Box,", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", "width": 430, "height": 243, - "title": "Maut, Basis, Wissen, \u00d6sterreich, Vignette, Go-Box," + "title": "Maut, Basis, Wissen, Österreich, Vignette, Go-Box," }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2202648.jpg", - "alt": "Wohnmobil, K\u00fcste, Parkplatz, Wohnmobil, Mann", - "caption": "Wohnmobil, K\u00fcste, Parkplatz, Wohnmobil, Mann", + "alt": "Wohnmobil, Küste, Parkplatz, Wohnmobil, Mann", + "caption": "Wohnmobil, Küste, Parkplatz, Wohnmobil, Mann", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", "width": 249, "height": 140, - "title": "Wohnmobil, K\u00fcste, Parkplatz, Wohnmobil, Mann" + "title": "Wohnmobil, Küste, Parkplatz, Wohnmobil, Mann" }, { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/2203732.jpg", @@ -6447,21 +6447,58 @@ { "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:140/rt:fill/w:249/plain/1107089.jpg", "alt": "Die Seitensitztruhe bietet sich als Schuhfach an.", - "caption": "Supercheck, Dethleffs Magic Edition T 2 EB, Seitensitztruhe, Schuhfach, Feuerl\u00f6scher", + "caption": "Supercheck, Dethleffs Magic Edition T 2 EB, Seitensitztruhe, Schuhfach, Feuerlöscher", "copyright": "Unbekannt", "copyright_url": "https://www.promobil.de/tipps/achtung-mautschock-warum-viele-wohnmobile-bald-eine-go-box-brauchen/", "width": 249, "height": 140, - "title": "Supercheck, Dethleffs Magic Edition T 2 EB, Seitensitztruhe, Schuhfach, Feuerl\u00f6scher" + "title": "Supercheck, Dethleffs Magic Edition T 2 EB, Seitensitztruhe, Schuhfach, Feuerlöscher" }, { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-YimPc01cYtOXjUpCATUqDABw/user-eA31w0vmy3fOrb3G64Ygndsr/img-Pl4ik6W7mTrv2MhIbdWlwgOL.png?st=2025-08-15T06%3A51%3A53Z&se=2025-08-15T08%3A51%3A53Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=b1a0ae1f-618f-4548-84fd-8b16cacd5485&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-08-14T15%3A09%3A17Z&ske=2025-08-15T15%3A09%3A17Z&sks=b&skv=2024-08-04&sig=RHIFlJLMumrcr/jEskOVfqJ%2Bns0pDS2HM8l5siBfLmM%3D", - "alt": "KI-generiertes Titelbild zu: Neue Mautregeln f\u00fcr Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box", - "caption": "KI-generiertes Titelbild zu: Neue Mautregeln f\u00fcr Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box", - "copyright": "OpenAI DALL\u00b7E", + "alt": "KI-generiertes Titelbild zu: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box", + "caption": "KI-generiertes Titelbild zu: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box", + "copyright": "OpenAI DALL·E", "copyright_url": "https://openai.com/dall-e" } ], "source": "https://www.promobil.de/rss/ratgeber" + }, + { + "id": "87ae83573a39b0296226eaa8c52a03a4", + "title": "Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper", + "date": "Sat, 16 Aug 2025 06:00:00 +0200", + "summary": "

Gasflasche leer? Das führt auf Reisen oft zu Engpässen. Gut, wenn Nachschub rund um die Uhr zur Verfügung steht – etwa in Form von Gasflaschen-Automaten. promobil hat den 24/7 Tauschautomaten für Gasflaschen ausprobiert.

", + "text": "Die Bequemlichkeit des Austauschs von leeren Gasflaschen gegen volle an Automaten ist ein großer Vorteil für Besitzer von Wohnmobilen. Das Verfahren ist einfach: Man stellt die leere Flasche in den Automaten, bezahlt mit Karte und innerhalb von wenigen Minuten erhält man eine volle Flasche. Diese Automaten wurden erfolgreich an einem Globus-Baumarkt in der Nähe von Stuttgart getestet. Es gibt insgesamt 72 dieser Automaten in Globus-Märkten in Deutschland und Luxemburg, an denen sowohl 11- als auch 5-kg-Flaschen getauscht werden können.\n\nNicht nur Wohnmobilbesitzer profitieren von diesem 24-Stunden-Service. Auch Grillfans, die feststellen, dass ihr Gasgrill leer ist, können ihre Flasche schnell und unkompliziert austauschen, vorausgesetzt es gibt einen Markt in der Nähe. Die Gasflaschenautomaten werden von der Firma Insensiv in Bielefeld hergestellt, die seit 2016 für Globus und andere Kunden tätig ist. Je nach Flaschengröße können bis zu 72 volle Gasflaschen in die Automaten passen, die normalerweise auf vier Ausgabebahnen verteilt sind, zusätzlich gibt es eine Bahn für die Annahme leerer Flaschen.\n\nHeutzutage gibt es diese Automaten an 105 Standorten und das Geschäft wächst stetig. Laut Alexander Wiese, Marketing-Verantwortlicher von Insensiv, wird derzeit etwa ein weiterer Automat pro Woche geliefert. Diese Automaten befinden sich nicht nur in Baumärkten, sondern auch an Tankstellen und Lebensmitteldiscountern und zunehmend an Wohnmobilstellplätzen.\n\nDas Netzwerk dieser Automaten ist auch in der Promobil Stellplatz-App und -Datenbank gelistet. Sowohl Reisemobilisten als auch Produzenten, Aufsteller und Betreiber profitieren von diesem Service, und es ist zu hoffen, dass die Anzahl der Automaten in Zukunft weiter steigen wird.\n\nWährend Gastanks, die fest im Fahrzeug installiert sind und ein größeres Volumen haben, an rund 6000 Tankstellen in Deutschland befüllt werden können, ist das Befüllen von sogenannten Tankflaschen, einer Mischung aus Gasflasche und Gastank, an Tankstellen in Deutschland offiziell nicht erlaubt.", + "tags": [ + "Gasflaschen-Automat", + "Wohnmobil", + "Globus-Baumarkt" + ], + "status": "WordPress Pending", + "link": "https://www.promobil.de/weitere-ratgeber/gasflaschenservice-fuer-camping-und-grillfans-im-promobil-test/", + "images": [], + "source": "https://www.promobil.de/rss/ratgeber", + "source_name": "ratgeber bei www.promobil.de", + "created_at": "2025-08-16T12:49:46.822304", + "word_count": 287, + "rewritten_at": "2025-08-16T12:51:39.038647", + "wp_upload_date": "2025-08-16T12:58:20.442976", + "wp_post_id": 3378 + }, + { + "id": "abbe981f16577cf832b0a291395949ca", + "title": "Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper", + "date": "Fri, 15 Aug 2025 16:00:00 +0200", + "summary": "

Wer in Italien seinen Müll aus dem Wohnmobil oder Zugfahrzeug wirft, riskiert künftig mehr als nur ein schlechtes Gewissen. Seit August 2025 gelten neue Vorschriften – und die haben es in sich.

", + "text": "Mancher Camper kennt ähnliche Situationen: Kurz vor der Abfahrt vom Stellplatz muss der Müll aus dem Fahrzeug entsorgt werden. Auf dem Weg zum Container fällt einem auf, dass das Landstromkabel noch am Wohnmobil hängt. Also packt man an: Kabel weg, rein in die Heckgarage, Klappe zu und danach den Müllbeutel neben dem Fahrzeug vergessen. Natürlich ist das ein Versehen. Genau das könnte in Italien sehr teuer werden – bis zu 18.000 Euro. Italien zieht die Reißleine: Um die wachsende Vermüllung entlang von Straßen, Seen und Küsten einzudämmen, hat die Regierung ein Gesetzespaket verabschiedet. Das \"decreto-legge 8 agosto 2025, n. 116\" verschärft die Straßenverkehrsordnung und betrifft auch alle Reisenden mit Wohnmobil – und zwar unmittelbar. Im Extremfall droht das Gefängnis Das Gesetzesdekret verbietet es ausdrücklich, Abfälle jeglicher Art – vom Kaugummi bis zum vollen Müllsack – aus fahrenden oder parkenden Fahrzeugen zu entsorgen. Dabei spielt es keine Rolle, ob der Fahrende oder ein Mitfahrender verantwortlich ist. Für Reisende mit Wohnmobil, die häufig in der Natur stehen oder auf abgelegenen Stellplätzen übernachten, wird das schnell zur Falle. Das Bußgeld für Wohnmobil-Reisende in Italien kann dabei schnell fünfstellig ausfallen. Bei nachweislicher Gefährdung von Umwelt oder Tieren drohen sogar strafrechtliche Konsequenzen. Warum gerade Wohnmobile betroffen sind Camperinnen und Camper frühstücken, kochen und grillen in und rund um ihre Wohnmobile. Im Camperalltag fällt besonders bei längeren Standseiten so viel Unrat an, dass der Mülleimer voll wird – Küchenreste, Verpackungen oder Sanitärabfälle inklusive. Wer hier nicht sauber trennt oder nachlässig entsorgt, gefährdet nicht nur die Umwelt, sondern auch den eigenen Geldbeutel. Besonders strenge Strafen gelten in Naturschutzgebieten, an Flussufern oder in Meeresnähe – beliebte Reiseziele vieler Camper. Video statt Verkehrskontrolle: So wird überwacht Neu ist auch die Art der Kontrolle: Italien setzt auf Überwachungskameras, die entlang von Autobahnen, Parkplätzen und in Städten installiert sind. Diese Kameras erfassen das Kennzeichen – und schon reicht ein aufgezeichneter Verstoß, um einen Bußgeldbescheid auszulösen. Für Camper, die mit gemieteten Fahrzeugen unterwegs sind, wird es besonders heikel: Die Strafe landet direkt beim Vermieter, oft mit zusätzlicher Bearbeitungsgebühr. Ein kurzer Halt am Straßenrand – und ein unachtsam entsorgtes Taschentuch – kann so mehrere Hundert Euro kosten. Regeln in Deutschland: weniger einheitlich, aber nicht harmlos In Deutschland ist das Wegwerfen von Müll aus dem Fahrzeug verboten. Doch anders als in Italien fehlt eine zentrale Regelung: Die Strafen variieren von Bundesland zu Bundesland. Während in Bayern schon 50 Euro für eine Zigarettenkippe fällig werden, bleibt es in anderen Regionen bei einer Ermahnung. Bei illegaler Entsorgung größerer Abfälle drohen auch hier empfindliche Strafen – bis zu 1.000 Euro, wenn Naturschutzgesetze greifen. Im direkten Vergleich zeigt sich jedoch: Die Strafen für Müllentsorgung beim Camping sind in Italien 2025 nicht nur strenger – sie werden auch konsequenter durchgesetzt.", + "tags": [], + "status": "New", + "link": "https://www.promobil.de/weitere-ratgeber/neue-bussgelder-in-italien-falsche-muellentsorgung-aus-dem-wohnmobil-wird-besonders-teuer/", + "images": [], + "source": "https://www.promobil.de/rss/ratgeber", + "source_name": "ratgeber bei www.promobil.de", + "created_at": "2025-08-16T12:49:47.652064", + "word_count": 451 } ] \ No newline at end of file diff --git a/logs/rss_tool.log b/logs/rss_tool.log index c4cd20e..68879b4 100644 --- a/logs/rss_tool.log +++ b/logs/rss_tool.log @@ -511,3 +511,292 @@ openai.APIConnectionError: Connection error. 2025-08-15 09:55:42,843 - INFO - Lade Feed: https://www.promobil.de/rss/ratgeber 2025-08-15 09:55:43,180 - INFO - 0 neue Artikel gefunden in https://www.promobil.de/rss/ratgeber 2025-08-15 09:55:43,180 - INFO - Keine neuen Artikel gefunden. +2025-08-16 12:11:35,892 - INFO - load_articles:123 - ✅ 53 Artikel geladen +2025-08-16 12:11:35,893 - INFO - load_feeds:92 - ✅ 3 Feeds geladen +2025-08-16 12:42:43,093 - INFO - load_articles:124 - ✅ 53 Artikel geladen +2025-08-16 12:42:43,095 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:48:41,965 - INFO - load_articles:124 - ✅ 53 Artikel geladen +2025-08-16 12:48:41,966 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:49:23,544 - INFO - load_articles:124 - ✅ 53 Artikel geladen +2025-08-16 12:49:23,544 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:49:23,547 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-16 12:49:23,547 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:49:23,554 - INFO - load_articles:124 - ✅ 53 Artikel geladen +2025-08-16 12:49:23,554 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-16 12:49:25,076 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-16 12:49:25,076 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-16 12:49:25,079 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-16 12:49:25,080 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-16 12:49:25,081 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-16 12:49:25,083 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-16 12:49:25,084 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-16 12:49:25,086 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-16 12:49:25,087 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-16 12:49:25,090 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-16 12:49:25,092 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-16 12:49:25,093 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-16 12:49:25,093 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-16 12:49:26,098 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-16 12:49:26,570 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-16 12:49:26,571 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-16 12:49:26,571 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-16 12:49:26,571 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-16 12:49:27,928 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:27,930 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:27,931 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-16 12:49:27,931 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-16 12:49:27,931 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-16 12:49:27,932 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-16 12:49:27,932 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-16 12:49:28,227 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:28,228 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:28,230 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-16 12:49:28,230 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-16 12:49:28,230 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-16 12:49:28,231 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-16 12:49:28,231 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-16 12:49:28,591 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:28,593 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:28,594 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-16 12:49:28,594 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-16 12:49:28,594 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-16 12:49:28,594 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-16 12:49:28,594 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-16 12:49:30,472 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:30,473 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:30,473 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-16 12:49:30,474 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-16 12:49:30,474 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-16 12:49:30,474 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-16 12:49:30,475 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-16 12:49:31,156 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:31,157 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:31,160 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-16 12:49:31,160 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-16 12:49:31,161 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-16 12:49:31,161 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-16 12:49:31,161 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-16 12:49:32,094 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:32,095 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:32,095 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-16 12:49:32,096 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-16 12:49:32,096 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-16 12:49:32,096 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-16 12:49:32,096 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-16 12:49:33,747 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:33,748 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:33,749 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-16 12:49:33,749 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-16 12:49:33,749 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-16 12:49:33,752 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-16 12:49:33,752 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-16 12:49:33,752 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-16 12:49:33,752 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-16 12:49:34,562 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:34,564 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:34,566 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-16 12:49:34,567 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-16 12:49:34,567 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-16 12:49:34,567 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-16 12:49:34,568 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-16 12:49:35,350 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:35,352 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:35,354 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-16 12:49:35,354 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-16 12:49:35,355 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-16 12:49:35,355 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-16 12:49:35,355 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-16 12:49:35,626 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:35,627 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:35,628 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-16 12:49:35,629 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-16 12:49:35,629 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-16 12:49:35,629 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-16 12:49:35,629 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-16 12:49:35,899 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:35,900 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:35,901 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-16 12:49:35,901 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-16 12:49:35,901 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-16 12:49:35,901 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-16 12:49:35,902 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-16 12:49:35,902 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-16 12:49:36,613 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:36,614 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:36,614 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-16 12:49:36,615 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-16 12:49:36,615 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-16 12:49:36,615 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-16 12:49:36,615 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-16 12:49:38,736 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:38,737 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:38,739 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-16 12:49:38,739 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-16 12:49:38,739 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-16 12:49:38,740 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-16 12:49:38,740 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-16 12:49:39,605 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:39,606 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:39,607 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-16 12:49:39,607 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-16 12:49:39,607 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-16 12:49:39,608 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-16 12:49:39,608 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-16 12:49:40,376 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:40,377 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:40,378 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-16 12:49:40,378 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-16 12:49:40,378 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-16 12:49:40,379 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-16 12:49:40,379 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-16 12:49:41,173 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:41,174 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:41,175 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-16 12:49:41,176 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-16 12:49:41,176 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-16 12:49:41,176 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-16 12:49:41,176 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-16 12:49:42,081 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:42,083 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:42,084 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-16 12:49:42,085 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-16 12:49:42,085 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-16 12:49:42,085 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-16 12:49:42,085 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-16 12:49:42,899 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:42,900 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:42,901 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-16 12:49:42,901 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-16 12:49:42,901 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-16 12:49:42,902 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-16 12:49:42,902 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-16 12:49:44,184 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-16 12:49:44,185 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-16 12:49:44,186 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-16 12:49:44,186 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-16 12:49:44,187 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-16 12:49:44,189 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-16 12:49:44,190 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-16 12:49:44,190 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-16 12:49:45,196 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-16 12:49:46,821 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-16 12:49:46,821 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-16 12:49:46,822 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.promobil.de/weitere-ratgeber/gasflaschenservice-fuer-camping-und-grillfans-im-promobil-test/ +2025-08-16 12:49:47,648 - INFO - extract_images_with_metadata:167 - 🔍 16 img-Tags gefunden +2025-08-16 12:49:47,649 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Automat... +2025-08-16 12:49:47,649 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Camping, Gas... +2025-08-16 12:49:47,650 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Gasflaschen, Tauschautomat, Energie Rath, Dinkels... +2025-08-16 12:49:47,650 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: LPG... +2025-08-16 12:49:47,650 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-16 12:49:47,650 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.promobil.de/weitere-ratgeber/gasflaschenservice-fuer-camping-und-grillfans-im-promobil-test/: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-16 12:49:47,651 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper' extrahiert +2025-08-16 12:49:47,651 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-16 12:49:47,652 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.promobil.de/weitere-ratgeber/neue-bussgelder-in-italien-falsche-muellentsorgung-aus-dem-wohnmobil-wird-besonders-teuer/ +2025-08-16 12:49:50,073 - INFO - extract_images_with_metadata:167 - 🔍 13 img-Tags gefunden +2025-08-16 12:49:50,074 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Basiswissen, Der gute Ton, Stellplatz-Knigge, Müll... +2025-08-16 12:49:50,074 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-16 12:49:50,074 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.promobil.de/weitere-ratgeber/neue-bussgelder-in-italien-falsche-muellentsorgung-aus-dem-wohnmobil-wird-besonders-teuer/: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-16 12:49:50,075 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper' extrahiert +2025-08-16 12:49:50,075 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-16 12:49:50,076 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-16 12:49:50,078 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-16 12:49:50,081 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-16 12:49:50,083 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-16 12:49:50,085 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-16 12:49:50,086 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-16 12:49:50,088 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-16 12:49:50,089 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-16 12:49:50,091 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-16 12:49:50,092 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-16 12:49:50,094 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-16 12:49:50,096 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-16 12:49:50,099 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-16 12:49:50,101 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dethleffs Reiselust-Prämie: Bis zu 20.000 Euro Rabatt auf Wohnmobile +2025-08-16 12:49:50,102 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue promobil-Newsletter - gratis!: Zum Frühstück die spannendsten Camping-Themen +2025-08-16 12:49:50,103 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Drittes Camping-Rekordjahr in Folge: Süd schlägt Nord – Hier wird am häufigsten gecampt +2025-08-16 12:49:50,104 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Wohnmobil-Handel treibt Vorzelt-Profi in Insolvenz: Camping-Ausrüster Herzog beantragt Insolvenz +2025-08-16 12:49:50,106 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Pannen und Probleme im Wohnmobil & Wohnwagen: Erste Hilfe für die Camper-Bordtechnik +2025-08-16 12:49:50,106 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 2 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-16 12:49:51,131 - INFO - save_articles:144 - ✅ 55 Artikel gespeichert +2025-08-16 12:49:51,131 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 2 neue Artikel in 27.58s hinzugefügt +2025-08-16 12:49:52,222 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:49:52,223 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:50:27,304 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:50:27,305 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:50:27,334 - INFO - save_articles:144 - ✅ 55 Artikel gespeichert +2025-08-16 12:50:27,909 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:50:27,910 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:50:33,666 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:50:33,667 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:50:47,623 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:50:47,624 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:50:49,242 - INFO - _get_default_category_id:63 - ✅ Standard-Kategorie 'Allgemein' gefunden: ID 1 +2025-08-16 12:50:49,242 - INFO - test_connection:237 - 🔧 Teste WordPress-API-Verbindung... +2025-08-16 12:50:49,751 - INFO - test_connection:247 - ✅ WordPress-API-Verbindung erfolgreich +2025-08-16 12:51:22,341 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:51:22,342 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:51:22,344 - INFO - rewrite_articles:320 - ✍️ Starte Artikel-Umschreibung +2025-08-16 12:51:22,346 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:51:22,347 - INFO - rewrite_articles:337 - ✍️ Umschreiben von: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-16 12:51:37,237 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-16 12:51:39,037 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-16 12:51:39,038 - INFO - rewrite_articles:392 - ✅ Artikel erfolgreich umgeschrieben: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-16 12:51:41,055 - INFO - save_articles:144 - ✅ 55 Artikel gespeichert +2025-08-16 12:51:41,055 - INFO - rewrite_articles:404 - 🎉 1 Artikel erfolgreich umgeschrieben +2025-08-16 12:51:42,128 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:51:42,128 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:52:01,541 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:52:01,542 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:52:08,641 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:52:08,641 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:52:14,550 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:52:14,550 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:52:32,308 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:52:32,311 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:53:12,402 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:53:12,403 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:53:15,939 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:53:15,939 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:53:15,959 - INFO - save_articles:144 - ✅ 55 Artikel gespeichert +2025-08-16 12:53:16,006 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:53:16,006 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:53:21,156 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:53:21,156 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:53:21,821 - INFO - _get_default_category_id:63 - ✅ Standard-Kategorie 'Allgemein' gefunden: ID 1 +2025-08-16 12:53:21,821 - INFO - test_connection:237 - 🔧 Teste WordPress-API-Verbindung... +2025-08-16 12:53:22,205 - INFO - test_connection:247 - ✅ WordPress-API-Verbindung erfolgreich +2025-08-16 12:53:22,205 - INFO - upload_article:158 - 📤 Starte WordPress-Upload: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-16 12:53:23,117 - ERROR - upload_article:190 - ❌ WordPress-Fehler 400 für 'Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper': Ungültige(r) Parameter: tags +2025-08-16 12:53:24,214 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:53:24,214 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:58:02,027 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:58:02,028 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:58:14,389 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:58:14,391 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-16 12:58:14,395 - INFO - upload_articles_to_wp:412 - 📤 Starte WordPress-Upload +2025-08-16 12:58:14,408 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:58:14,408 - INFO - upload_articles_to_wp:421 - 📦 1 Artikel für WordPress-Upload gefunden +2025-08-16 12:58:14,410 - INFO - __init__:51 - ✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String +2025-08-16 12:58:16,007 - INFO - _get_default_category_id:87 - ✅ Standard-Kategorie 'Allgemein' gefunden: ID 1 +2025-08-16 12:58:16,007 - INFO - test_connection:338 - 🔧 Teste WordPress-API-Verbindung mit Base64-Auth... +2025-08-16 12:58:16,007 - INFO - test_connection:342 - 🔑 Authorization Header: Basic b2dpZXJ0ejp3aE... +2025-08-16 12:58:16,501 - INFO - test_connection:351 - 📡 API-Response Status: 200 +2025-08-16 12:58:16,501 - INFO - test_connection:352 - 📡 API-Response Headers: {'Content-Type': 'application/json; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-WS-RateLimit-Limit': '1000', 'X-WS-RateLimit-Remaining': '998', 'Date': 'Sat, 16 Aug 2025 10:58:16 GMT', 'Server': 'Apache', 'X-Powered-By': 'PHP/8.2.29', 'Pragma': 'no-cache', 'X-Robots-Tag': 'noindex', 'X-Content-Type-Options': 'nosniff', 'Access-Control-Expose-Headers': 'X-WP-Total, X-WP-TotalPages, Link', 'Access-Control-Allow-Headers': 'Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type', 'X-WP-Total': '4', 'X-WP-TotalPages': '4', 'Link': '; rel="next"', 'Allow': 'GET, POST', 'Expires': 'Wed, 11 Jan 1984 05:00:00 GMT', 'Cache-Control': 'no-cache, must-revalidate, max-age=0, no-store, private'} +2025-08-16 12:58:16,501 - INFO - test_connection:355 - ✅ WordPress-API-Verbindung erfolgreich +2025-08-16 12:58:16,501 - INFO - upload_multiple_articles:392 - 📦 Starte Batch-Upload von 1 Artikeln zu WordPress +2025-08-16 12:58:16,502 - INFO - upload_multiple_articles:396 - 📤 Upload 1/1: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-16 12:58:16,502 - INFO - upload_article:249 - 📤 Starte WordPress-Upload: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-16 12:58:18,037 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Gasflaschen-Automat' (ID: 891) +2025-08-16 12:58:18,550 - INFO - _get_or_create_tags:135 - ✅ Existierender Tag gefunden: 'Wohnmobil' (ID: 646) +2025-08-16 12:58:19,573 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Globus-Baumarkt' (ID: 892) +2025-08-16 12:58:19,573 - INFO - _get_or_create_tags:158 - 🏷️ Tags verarbeitet: 3 Tag-IDs erstellt +2025-08-16 12:58:19,573 - INFO - _prepare_post_data:194 - 📝 Post-Daten vorbereitet: Titel='Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper', Tags=3, Kategorie=1 +2025-08-16 12:58:20,442 - INFO - upload_article:274 - ✅ WordPress-Upload erfolgreich: 'Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper' (ID: 3378) +2025-08-16 12:58:20,442 - INFO - upload_article:275 - 🔗 WordPress-URL: https://vanityontour.de/?p=3378 +2025-08-16 12:58:20,442 - INFO - upload_multiple_articles:422 - 📊 Batch-Upload abgeschlossen: 1 erfolgreich, 0 fehlgeschlagen, 0 Duplikate +2025-08-16 12:58:20,443 - INFO - upload_articles_to_wp:441 - ✅ Status geändert für 'Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper': Process → WordPress Pending +2025-08-16 12:58:20,453 - INFO - save_articles:144 - ✅ 55 Artikel gespeichert +2025-08-16 12:58:20,454 - INFO - upload_articles_to_wp:446 - 💾 Artikel-Status nach WordPress-Upload aktualisiert +2025-08-16 12:58:22,520 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-16 12:58:22,522 - INFO - load_feeds:93 - ✅ 3 Feeds geladen diff --git a/main.py b/main.py index c0a0221..7e83784 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,7 @@ import logging import openai from utils.image_extractor import extract_images_with_metadata from utils.article_extractor import extract_full_article +from utils.wordpress_uploader import upload_articles_to_wordpress import hashlib import time @@ -34,7 +35,7 @@ openai.api_key = os.getenv("OPENAI_API_KEY") ARTICLES_FILE = "data/articles.json" FEEDS_FILE = "data/feeds.json" -VALID_STATUSES = ["New", "Rewrite", "Process", "Online", "On Hold", "Trash"] +VALID_STATUSES = ["New", "Rewrite", "Process", "Online", "On Hold", "Trash", "WordPress Pending"] # === Datenordner erstellen === os.makedirs("data", exist_ok=True) @@ -405,6 +406,51 @@ def rewrite_articles(): except Exception as e: logging.error(f"❌ Kritischer Fehler beim Umschreiben: {e}") +def upload_articles_to_wp(): + """Lädt Artikel mit Status 'Process' zu WordPress hoch""" + try: + logging.info("📤 Starte WordPress-Upload") + + articles = load_articles() + process_articles_list = [a for a in articles if a.get("status") == "Process"] + + if not process_articles_list: + logging.info("ℹ️ Keine Artikel für WordPress-Upload gefunden") + return {"total": 0, "successful": 0, "failed": 0, "message": "Keine Artikel zum Hochladen gefunden"} + + logging.info(f"📦 {len(process_articles_list)} Artikel für WordPress-Upload gefunden") + + # WordPress-Upload durchführen + upload_results = upload_articles_to_wordpress(process_articles_list) + + # Status der erfolgreich hochgeladenen Artikel ändern + if upload_results.get('successful', 0) > 0: + changed = False + + for detail in upload_results.get('details', []): + if detail.get('success'): + article_id = detail.get('article_id') + + # Artikel in der Liste finden und Status ändern + for article in articles: + if article.get('id') == article_id: + article['status'] = "WordPress Pending" + article['wp_upload_date'] = datetime.now().isoformat() + article['wp_post_id'] = detail.get('wp_post_id') + changed = True + logging.info(f"✅ Status geändert für '{article.get('title')}': Process → WordPress Pending") + break + + if changed: + save_articles(articles) + logging.info(f"💾 Artikel-Status nach WordPress-Upload aktualisiert") + + return upload_results + + except Exception as e: + logging.error(f"❌ Kritischer Fehler beim WordPress-Upload: {e}") + return {"total": 0, "successful": 0, "failed": 1, "error": str(e)} + def get_article_stats(): """Gibt Statistiken über die Artikel zurück""" try: diff --git a/utils/wordpress_uploader.py b/utils/wordpress_uploader.py new file mode 100644 index 0000000..85b016d --- /dev/null +++ b/utils/wordpress_uploader.py @@ -0,0 +1,468 @@ +# utils/wordpress_uploader.py + +import requests +import json +import os +import logging +import base64 +from datetime import datetime +from typing import Dict, List, Optional, Tuple +from dotenv import load_dotenv + +load_dotenv() + +# WordPress API Konfiguration +WP_BASE_URL = os.getenv("WP_BASE_URL", "https://vanityontour.de") +WP_USERNAME = os.getenv("WP_USERNAME", "ogiertz") +WP_PASSWORD = os.getenv("WP_PASSWORD", "whNEx9aZCIUXViV89Z3e7Z03") +WP_AUTH_BASE64 = os.getenv("WP_AUTH_BASE64", "b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM=") +WP_API_ENDPOINT = f"{WP_BASE_URL}/wp-json/wp/v2" + +# Request-Konfiguration +REQUEST_TIMEOUT = 30 +MAX_RETRIES = 3 +USER_AGENT = 'RSS-Feed-Manager/1.6.1' + +class WordPressUploader: + """ + Klasse für den Upload von Artikeln zu WordPress über die REST API + mit Base64-Authentifizierung + """ + + def __init__(self): + self.base_url = WP_BASE_URL + self.api_endpoint = WP_API_ENDPOINT + self.username = WP_USERNAME + self.password = WP_PASSWORD + self.auth_base64 = WP_AUTH_BASE64 + + # Session für bessere Performance + self.session = requests.Session() + + # Authentifizierung über Authorization Header mit Base64 + if self.auth_base64: + # Verwende bereitgestellten Base64-String + self.session.headers.update({ + 'Authorization': f'Basic {self.auth_base64}', + 'User-Agent': USER_AGENT, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }) + logging.info("✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String") + else: + # Fallback: Generiere Base64 aus Username/Password + if self.username and self.password: + credentials = f"{self.username}:{self.password}" + encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8') + self.session.headers.update({ + 'Authorization': f'Basic {encoded_credentials}', + 'User-Agent': USER_AGENT, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }) + logging.info("✅ WordPress-Authentifizierung: Base64 aus Username/Password generiert") + else: + logging.error("❌ WordPress-Authentifizierung: Weder Base64-String noch Username/Password verfügbar") + raise ValueError("WordPress-Authentifizierung nicht konfiguriert") + + # Standard-Kategorie ID ermitteln + self.default_category_id = self._get_default_category_id() + + def _get_default_category_id(self) -> int: + """ + Ermittelt die ID der Standard-Kategorie 'Allgemein' + """ + try: + response = self.session.get( + f"{self.api_endpoint}/categories", + params={'search': 'Allgemein', 'per_page': 10}, + timeout=REQUEST_TIMEOUT + ) + response.raise_for_status() + + categories = response.json() + + for category in categories: + if category['name'].lower() == 'allgemein': + logging.info(f"✅ Standard-Kategorie 'Allgemein' gefunden: ID {category['id']}") + return category['id'] + + # Fallback: Erste Kategorie oder Standard-ID + if categories: + logging.warning(f"⚠️ Kategorie 'Allgemein' nicht gefunden, verwende '{categories[0]['name']}' (ID: {categories[0]['id']})") + return categories[0]['id'] + else: + logging.warning("⚠️ Keine Kategorien gefunden, verwende Standard-ID 1") + return 1 + + except Exception as e: + logging.error(f"❌ Fehler beim Ermitteln der Standard-Kategorie: {e}") + return 1 # WordPress Standard-Kategorie + + def _get_or_create_tags(self, tag_names: List[str]) -> List[int]: + """ + Ermittelt oder erstellt Tags und gibt deren IDs zurück + """ + tag_ids = [] + + if not tag_names: + return tag_ids + + try: + # Bestehende Tags abrufen + for tag_name in tag_names: + tag_name = tag_name.strip() + if not tag_name: + continue + + try: + # Suche nach existierendem Tag + response = self.session.get( + f"{self.api_endpoint}/tags", + params={'search': tag_name, 'per_page': 10}, + timeout=REQUEST_TIMEOUT + ) + response.raise_for_status() + + existing_tags = response.json() + tag_found = False + + # Exakte Übereinstimmung suchen + for tag in existing_tags: + if tag['name'].lower() == tag_name.lower(): + tag_ids.append(tag['id']) + tag_found = True + logging.info(f"✅ Existierender Tag gefunden: '{tag_name}' (ID: {tag['id']})") + break + + # Tag erstellen falls nicht gefunden + if not tag_found: + create_response = self.session.post( + f"{self.api_endpoint}/tags", + json={'name': tag_name}, + timeout=REQUEST_TIMEOUT + ) + + if create_response.status_code == 201: + new_tag = create_response.json() + tag_ids.append(new_tag['id']) + logging.info(f"✅ Neuer Tag erstellt: '{tag_name}' (ID: {new_tag['id']})") + else: + logging.warning(f"⚠️ Tag '{tag_name}' konnte nicht erstellt werden: {create_response.status_code}") + continue + + except Exception as e: + logging.error(f"❌ Fehler beim Verarbeiten von Tag '{tag_name}': {e}") + continue + + logging.info(f"🏷️ Tags verarbeitet: {len(tag_ids)} Tag-IDs erstellt") + return tag_ids + + except Exception as e: + logging.error(f"❌ Allgemeiner Fehler bei Tag-Verarbeitung: {e}") + return [] + def _prepare_post_data(self, article: Dict) -> Dict: + """ + Bereitet die Artikel-Daten für WordPress vor + """ + # Tags verarbeiten - WordPress benötigt Tag-IDs, nicht Namen + tag_names = article.get('tags', []) + tag_ids = self._get_or_create_tags(tag_names) + + # Basis Post-Daten + post_data = { + 'title': article.get('title', 'Kein Titel'), + 'content': article.get('text', ''), + 'status': 'pending', # Artikel als "Ausstehend" markieren + 'categories': [self.default_category_id], + 'excerpt': article.get('summary', '')[:300], # WordPress Excerpt + 'meta': { + 'rss_source': article.get('source', ''), + 'rss_original_link': article.get('link', ''), + 'rss_import_date': datetime.now().isoformat(), + 'rss_article_id': article.get('id', '') + } + } + + # Tags nur hinzufügen wenn vorhanden + if tag_ids: + post_data['tags'] = tag_ids + + # Optional: Author setzen (falls unterschiedliche Autoren gewünscht) + # post_data['author'] = 1 # WordPress User ID + + logging.info(f"📝 Post-Daten vorbereitet: Titel='{post_data['title']}', Tags={len(tag_ids)}, Kategorie={self.default_category_id}") + return post_data + + def _check_duplicate(self, article: Dict) -> Optional[int]: + """ + Prüft, ob ein Artikel bereits in WordPress existiert + """ + try: + # Suche nach Titel + title = article.get('title', '') + if not title: + return None + + response = self.session.get( + f"{self.api_endpoint}/posts", + params={ + 'search': title, + 'per_page': 5, + 'status': 'any' # Alle Status durchsuchen + }, + timeout=REQUEST_TIMEOUT + ) + response.raise_for_status() + + posts = response.json() + + for post in posts: + # Exakte Titel-Übereinstimmung + if post['title']['rendered'].strip() == title.strip(): + logging.info(f"🔄 Duplikat gefunden: '{title}' (WordPress ID: {post['id']})") + return post['id'] + + # Prüfe auch Custom Meta Fields (RSS Article ID) + article_id = article.get('id') + if article_id: + # Meta-Felder würden eine separate API-Abfrage erfordern + # Für jetzt: Nur Titel-basierte Duplikatserkennung + pass + + return None + + except Exception as e: + logging.error(f"❌ Fehler bei Duplikatsprüfung für '{article.get('title', 'Unbekannt')}': {e}") + return None + + def upload_article(self, article: Dict) -> Tuple[bool, str, Optional[int]]: + """ + Lädt einen einzelnen Artikel zu WordPress hoch + + Returns: + Tuple[bool, str, Optional[int]]: (Erfolg, Nachricht, WordPress Post ID) + """ + title = article.get('title', 'Unbekannt') + + try: + logging.info(f"📤 Starte WordPress-Upload: {title}") + + # Duplikatsprüfung + existing_post_id = self._check_duplicate(article) + if existing_post_id: + return False, f"Artikel '{title}' existiert bereits in WordPress (ID: {existing_post_id})", existing_post_id + + # Post-Daten vorbereiten + post_data = self._prepare_post_data(article) + + # Upload mit Retry-Logik + for attempt in range(MAX_RETRIES): + try: + response = self.session.post( + f"{self.api_endpoint}/posts", + json=post_data, + timeout=REQUEST_TIMEOUT + ) + + if response.status_code == 201: + # Erfolgreich erstellt + wp_post = response.json() + wp_post_id = wp_post['id'] + wp_url = wp_post['link'] + + logging.info(f"✅ WordPress-Upload erfolgreich: '{title}' (ID: {wp_post_id})") + logging.info(f"🔗 WordPress-URL: {wp_url}") + return True, f"Erfolgreich hochgeladen: {wp_url}", wp_post_id + + elif response.status_code == 400: + # Client Error - nicht wiederholen + error_data = response.json() + error_msg = error_data.get('message', 'Unbekannter Fehler') + error_code = error_data.get('code', 'unknown') + + # Detaillierte Fehleranalyse + if 'parameter' in error_msg.lower() and 'tags' in error_msg.lower(): + logging.error(f"❌ WordPress-Tag-Fehler für '{title}': {error_msg}") + logging.error(f"📋 Post-Daten: {json.dumps(post_data, indent=2, ensure_ascii=False)}") + return False, f"Tag-Fehler: {error_msg} (Artikel-Tags: {article.get('tags', [])})", None + else: + logging.error(f"❌ WordPress-Fehler 400 für '{title}': {error_msg} (Code: {error_code})") + logging.error(f"📋 Post-Daten: {json.dumps(post_data, indent=2, ensure_ascii=False)}") + return False, f"WordPress-Fehler: {error_msg}", None + + elif response.status_code == 401: + # Authentifizierungsfehler + logging.error(f"❌ WordPress-Authentifizierungsfehler für '{title}'") + return False, "Authentifizierungsfehler - bitte Zugangsdaten prüfen", None + + elif response.status_code == 403: + # Berechtigungsfehler + logging.error(f"❌ WordPress-Berechtigungsfehler für '{title}'") + return False, "Keine Berechtigung zum Erstellen von Posts", None + + else: + # Server Error - Retry möglich + if attempt < MAX_RETRIES - 1: + logging.warning(f"⚠️ WordPress-Upload Versuch {attempt + 1} fehlgeschlagen für '{title}' (Status: {response.status_code}), versuche erneut...") + continue + else: + logging.error(f"❌ WordPress-Upload nach {MAX_RETRIES} Versuchen fehlgeschlagen für '{title}' (Status: {response.status_code})") + return False, f"Upload fehlgeschlagen nach {MAX_RETRIES} Versuchen (HTTP {response.status_code})", None + + except requests.exceptions.Timeout: + if attempt < MAX_RETRIES - 1: + logging.warning(f"⏱️ Timeout bei WordPress-Upload für '{title}' (Versuch {attempt + 1}), versuche erneut...") + continue + else: + logging.error(f"❌ Timeout bei WordPress-Upload für '{title}' nach {MAX_RETRIES} Versuchen") + return False, f"Timeout nach {MAX_RETRIES} Versuchen", None + + except requests.exceptions.ConnectionError as e: + if attempt < MAX_RETRIES - 1: + logging.warning(f"🌐 Verbindungsfehler bei WordPress-Upload für '{title}' (Versuch {attempt + 1}): {e}") + continue + else: + logging.error(f"❌ Verbindungsfehler bei WordPress-Upload für '{title}' nach {MAX_RETRIES} Versuchen: {e}") + return False, f"Verbindungsfehler nach {MAX_RETRIES} Versuchen", None + + except Exception as e: + logging.error(f"❌ Unerwarteter Fehler bei WordPress-Upload für '{title}': {e}") + return False, f"Unerwarteter Fehler: {str(e)}", None + + def test_connection(self) -> Tuple[bool, str]: + """ + Testet die Verbindung zur WordPress API mit Base64-Authentifizierung + """ + try: + logging.info("🔧 Teste WordPress-API-Verbindung mit Base64-Auth...") + + # Debug: Auth-Header prüfen + auth_header = self.session.headers.get('Authorization', 'Nicht gesetzt') + logging.info(f"🔑 Authorization Header: {auth_header[:20]}..." if len(auth_header) > 20 else f"🔑 Authorization Header: {auth_header}") + + # Einfache Abfrage der Kategorien als Test + response = self.session.get( + f"{self.api_endpoint}/categories", + params={'per_page': 1}, + timeout=REQUEST_TIMEOUT + ) + + logging.info(f"📡 API-Response Status: {response.status_code}") + logging.info(f"📡 API-Response Headers: {dict(response.headers)}") + + if response.status_code == 200: + logging.info("✅ WordPress-API-Verbindung erfolgreich") + return True, "Verbindung zur WordPress API erfolgreich" + elif response.status_code == 401: + logging.error("❌ WordPress-API-Authentifizierung fehlgeschlagen") + logging.error(f"Response Body: {response.text}") + return False, "Authentifizierung fehlgeschlagen - bitte Base64-String oder Zugangsdaten prüfen" + elif response.status_code == 403: + logging.error("❌ WordPress-API-Berechtigung fehlgeschlagen") + logging.error(f"Response Body: {response.text}") + return False, "Keine Berechtigung - bitte Benutzerrechte prüfen" + else: + logging.error(f"❌ WordPress-API-Test fehlgeschlagen (Status: {response.status_code})") + logging.error(f"Response Body: {response.text}") + return False, f"API-Test fehlgeschlagen (HTTP {response.status_code}): {response.text[:100]}" + + except requests.exceptions.ConnectionError as e: + logging.error(f"❌ Verbindungsfehler zur WordPress API: {e}") + return False, f"Verbindungsfehler: {str(e)}" + except Exception as e: + logging.error(f"❌ Unerwarteter Fehler beim WordPress-API-Test: {e}") + return False, f"Unerwarteter Fehler: {str(e)}" + + def upload_multiple_articles(self, articles: List[Dict]) -> Dict: + """ + Lädt mehrere Artikel zu WordPress hoch + + Returns: + Dict mit Statistiken über erfolgreiche und fehlgeschlagene Uploads + """ + results = { + 'total': len(articles), + 'successful': 0, + 'failed': 0, + 'duplicates': 0, + 'details': [] + } + + logging.info(f"📦 Starte Batch-Upload von {len(articles)} Artikeln zu WordPress") + + for i, article in enumerate(articles, 1): + title = article.get('title', f'Artikel {i}') + logging.info(f"📤 Upload {i}/{len(articles)}: {title}") + + success, message, wp_post_id = self.upload_article(article) + + result_detail = { + 'article_id': article.get('id'), + 'title': title, + 'success': success, + 'message': message, + 'wp_post_id': wp_post_id + } + + results['details'].append(result_detail) + + if success: + results['successful'] += 1 + elif 'existiert bereits' in message: + results['duplicates'] += 1 + else: + results['failed'] += 1 + + # Kurze Pause zwischen Uploads + if i < len(articles): + import time + time.sleep(1) + + logging.info(f"📊 Batch-Upload abgeschlossen: {results['successful']} erfolgreich, {results['failed']} fehlgeschlagen, {results['duplicates']} Duplikate") + return results + + def __del__(self): + """ + Session sauber schließen + """ + if hasattr(self, 'session'): + self.session.close() + + +def upload_articles_to_wordpress(articles: List[Dict]) -> Dict: + """ + Convenience-Funktion für den Upload von Artikeln zu WordPress + """ + uploader = WordPressUploader() + + # Verbindung testen + connection_ok, connection_msg = uploader.test_connection() + if not connection_ok: + logging.error(f"❌ WordPress-Verbindung fehlgeschlagen: {connection_msg}") + return { + 'total': len(articles), + 'successful': 0, + 'failed': len(articles), + 'duplicates': 0, + 'error': connection_msg, + 'details': [] + } + + # Artikel hochladen + return uploader.upload_multiple_articles(articles) + + +def upload_single_article_to_wordpress(article: Dict) -> Tuple[bool, str, Optional[int]]: + """ + Convenience-Funktion für den Upload eines einzelnen Artikels + """ + uploader = WordPressUploader() + + # Verbindung testen + connection_ok, connection_msg = uploader.test_connection() + if not connection_ok: + return False, connection_msg, None + + # Artikel hochladen + return uploader.upload_article(article) \ No newline at end of file From 808a39dfc949bfc3c93c0d7ab98be824a3f8c341 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 16 Aug 2025 13:33:02 +0200 Subject: [PATCH 22/87] Bump version to v1.6.2 --- versioning.py | 75 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/versioning.py b/versioning.py index 3a3e6ea..a4e5a40 100644 --- a/versioning.py +++ b/versioning.py @@ -2,8 +2,7 @@ import re import subprocess from pathlib import Path from datetime import datetime -import typer -import os +import click CHANGELOG_FILE = Path("CHANGELOG.md") VERSION_FILE = Path("__version__.py") @@ -49,31 +48,53 @@ def configure_signing(use_ssh: bool): subprocess.run(["git", "config", "--global", "gpg.format", "openpgp"], check=True) subprocess.run(["git", "config", "--global", "commit.gpgsign", "true"], check=True) -def create( - level: str = "patch", - push: bool = False, - no_sign: bool = False, - dry_run: bool = False -): +@click.command() +@click.option("--level", default="patch", help="Version bump level: patch, minor, major") +@click.option("--version", "specific_version", help="Set specific version (e.g., 2.1.0) instead of auto-bumping") +@click.option("--push", is_flag=True, help="Push to GitHub after creating version") +@click.option("--no-sign", is_flag=True, help="Skip signing of commits and tags") +@click.option("--dry-run", is_flag=True, help="Show what would be done without executing") +def create(level, specific_version, push, no_sign, dry_run): """ Erstellt eine neue Version mit optional signiertem Commit & Tag. - Optional: --push, --no-sign, --dry-run + Optional: --push, --no-sign, --dry-run, --version """ current = get_latest_version() - new_version = bump_version(current, level) + + # Validierung und Festlegung der neuen Version + if specific_version: + # Validiere das Format der vorgegebenen Version + version_pattern = r"^\d+\.\d+\.\d+$" + if not re.match(version_pattern, specific_version): + click.secho("❌ Fehler: Version muss im Format X.Y.Z sein (z.B. 2.1.0)", fg="red") + return + + # Prüfe, ob die vorgegebene Version höher als die aktuelle ist + def version_tuple(v): + return tuple(map(int, v.split('.'))) + + if version_tuple(specific_version) <= version_tuple(current): + click.secho(f"❌ Fehler: Neue Version {specific_version} muss höher sein als aktuelle Version {current}", fg="red") + return + + new_version = specific_version + click.secho(f"📌 Verwende vorgegebene Version: {new_version}", fg="blue") + else: + new_version = bump_version(current, level) + click.secho(f"🔄 Auto-Bump ({level}): {current} → {new_version}", fg="green") if dry_run: - typer.secho("🔍 Dry-Run aktiviert – keine Dateien oder Git-Kommandos werden ausgeführt.\n", fg=typer.colors.YELLOW) - typer.echo(f"➡️ Aktuelle Version: {current}") - typer.echo(f"➡️ Neue Version: {new_version}") - typer.echo(f"➡️ Commit-Level: {level}") - typer.echo(f"➡️ Push nach GitHub: {'Ja' if push else 'Nein'}") - typer.echo(f"➡️ Signieren: {'Nein' if no_sign else 'Automatisch (SSH > GPG)'}") + click.secho("🔍 Dry-Run aktiviert – keine Dateien oder Git-Kommandos werden ausgeführt.\n", fg="yellow") + click.echo(f"➡️ Aktuelle Version: {current}") + click.echo(f"➡️ Neue Version: {new_version}") + click.echo(f"➡️ Commit-Level: {level}") + click.echo(f"➡️ Push nach GitHub: {'Ja' if push else 'Nein'}") + click.echo(f"➡️ Signieren: {'Nein' if no_sign else 'Automatisch (SSH > GPG)'}") date = datetime.now().strftime("%Y-%m-%d") - typer.echo("\n📄 Vorschlag für CHANGELOG-Eintrag:") - typer.echo(f"\n## [{new_version}] - {date}\n\n- Beschreibung...\n") - typer.secho("🚫 Dry-Run beendet.\n", fg=typer.colors.YELLOW) + click.echo("\n📄 Vorschlag für CHANGELOG-Eintrag:") + click.echo(f"\n## [{new_version}] - {date}\n\n- Beschreibung...\n") + click.secho("🚫 Dry-Run beendet.\n", fg="yellow") return # Update version file @@ -85,13 +106,13 @@ def create( content = CHANGELOG_FILE.read_text(encoding="utf-8") if f"## [{new_version}]" in content: - typer.secho(f"ℹ️ Version {new_version} ist bereits im CHANGELOG.md vorhanden. Kein Eintrag hinzugefügt.", fg=typer.colors.BLUE) + click.secho(f"ℹ️ Version {new_version} ist bereits im CHANGELOG.md vorhanden. Kein Eintrag hinzugefügt.", fg="blue") else: CHANGELOG_FILE.write_text(new_entry + content, encoding="utf-8") - typer.secho(f"📄 CHANGELOG.md wurde vorbereitet für Version {new_version}.", fg=typer.colors.MAGENTA) + click.secho(f"📄 CHANGELOG.md wurde vorbereitet für Version {new_version}.", fg="magenta") - typer.echo("") - typer.secho("✏️ Bitte jetzt den Eintrag in CHANGELOG.md überprüfen oder anpassen.", fg=typer.colors.CYAN) + click.echo("") + click.secho("✏️ Bitte jetzt den Eintrag in CHANGELOG.md überprüfen oder anpassen.", fg="cyan") input("⏸️ Drücke [Enter], um fortzufahren...") subprocess.run(["git", "add", "."], check=True) @@ -125,11 +146,11 @@ def create( if use_signing: if signing_method == "ssh": - typer.secho(f"✅ Version {new_version} erstellt und signiert mit SSH 🔐", fg=typer.colors.GREEN) + click.secho(f"✅ Version {new_version} erstellt und signiert mit SSH 🔐", fg="green") elif signing_method == "gpg": - typer.secho(f"✅ Version {new_version} erstellt und signiert mit GPG 🔏", fg=typer.colors.CYAN) + click.secho(f"✅ Version {new_version} erstellt und signiert mit GPG 🔏", fg="cyan") else: - typer.secho(f"⚠️ Version {new_version} wurde ohne Signatur erstellt", fg=typer.colors.YELLOW) + click.secho(f"⚠️ Version {new_version} wurde ohne Signatur erstellt", fg="yellow") if __name__ == "__main__": - typer.run(create) + create() \ No newline at end of file From d6ab09226a101241c7b7c711a7b981ff82092e46 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 16 Aug 2025 13:39:10 +0200 Subject: [PATCH 23/87] Bump version to v1.6.2 --- versioning.py | 61 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/versioning.py b/versioning.py index a4e5a40..0b56e74 100644 --- a/versioning.py +++ b/versioning.py @@ -40,6 +40,14 @@ def is_gpg_available() -> bool: except Exception: return False +def tag_exists(tag_name: str) -> bool: + """Prüft, ob ein Git-Tag bereits existiert""" + try: + result = subprocess.check_output(["git", "tag", "-l", tag_name], stderr=subprocess.DEVNULL).decode().strip() + return result == tag_name + except subprocess.CalledProcessError: + return False + def configure_signing(use_ssh: bool): if use_ssh: subprocess.run(["git", "config", "--global", "gpg.format", "ssh"], check=True) @@ -54,10 +62,11 @@ def configure_signing(use_ssh: bool): @click.option("--push", is_flag=True, help="Push to GitHub after creating version") @click.option("--no-sign", is_flag=True, help="Skip signing of commits and tags") @click.option("--dry-run", is_flag=True, help="Show what would be done without executing") -def create(level, specific_version, push, no_sign, dry_run): +@click.option("--force", is_flag=True, help="Force creation even if tag already exists (overwrites existing tag)") +def create(level, specific_version, push, no_sign, dry_run, force): """ Erstellt eine neue Version mit optional signiertem Commit & Tag. - Optional: --push, --no-sign, --dry-run, --version + Optional: --push, --no-sign, --dry-run, --version, --force """ current = get_latest_version() @@ -69,18 +78,37 @@ def create(level, specific_version, push, no_sign, dry_run): click.secho("❌ Fehler: Version muss im Format X.Y.Z sein (z.B. 2.1.0)", fg="red") return - # Prüfe, ob die vorgegebene Version höher als die aktuelle ist - def version_tuple(v): - return tuple(map(int, v.split('.'))) - - if version_tuple(specific_version) <= version_tuple(current): - click.secho(f"❌ Fehler: Neue Version {specific_version} muss höher sein als aktuelle Version {current}", fg="red") + # Prüfe, ob der Tag bereits existiert + tag_name = f"v{specific_version}" + if tag_exists(tag_name) and not force: + click.secho(f"❌ Fehler: Tag {tag_name} existiert bereits. Verwende --force zum Überschreiben.", fg="red") return + elif tag_exists(tag_name) and force: + click.secho(f"⚠️ Tag {tag_name} existiert bereits - wird überschrieben (--force aktiviert)", fg="yellow") + + # Prüfe, ob die vorgegebene Version höher als die aktuelle ist (nur ohne force) + if not force: + def version_tuple(v): + return tuple(map(int, v.split('.'))) + + if version_tuple(specific_version) <= version_tuple(current): + click.secho(f"❌ Fehler: Neue Version {specific_version} muss höher sein als aktuelle Version {current}", fg="red") + click.secho("💡 Tipp: Verwende --force um diese Prüfung zu überspringen", fg="blue") + return new_version = specific_version click.secho(f"📌 Verwende vorgegebene Version: {new_version}", fg="blue") else: new_version = bump_version(current, level) + + # Prüfe auch bei Auto-Bump, ob Tag existiert + tag_name = f"v{new_version}" + if tag_exists(tag_name) and not force: + click.secho(f"❌ Fehler: Tag {tag_name} existiert bereits. Verwende --force zum Überschreiben.", fg="red") + return + elif tag_exists(tag_name) and force: + click.secho(f"⚠️ Tag {tag_name} existiert bereits - wird überschrieben (--force aktiviert)", fg="yellow") + click.secho(f"🔄 Auto-Bump ({level}): {current} → {new_version}", fg="green") if dry_run: @@ -90,6 +118,7 @@ def create(level, specific_version, push, no_sign, dry_run): click.echo(f"➡️ Commit-Level: {level}") click.echo(f"➡️ Push nach GitHub: {'Ja' if push else 'Nein'}") click.echo(f"➡️ Signieren: {'Nein' if no_sign else 'Automatisch (SSH > GPG)'}") + click.echo(f"➡️ Force-Modus: {'Ja' if force else 'Nein'}") date = datetime.now().strftime("%Y-%m-%d") click.echo("\n📄 Vorschlag für CHANGELOG-Eintrag:") @@ -135,14 +164,24 @@ def create(level, specific_version, push, no_sign, dry_run): commit_cmd.append("-S") subprocess.run(commit_cmd, check=True) + # Tag erstellen + tag_name = f"v{new_version}" if use_signing: - subprocess.run(["git", "tag", "-s", f"v{new_version}", "-m", f"Release v{new_version}"], check=True) + if force and tag_exists(tag_name): + subprocess.run(["git", "tag", "-d", tag_name], check=True) # Lokalen Tag löschen + subprocess.run(["git", "tag", "-s", tag_name, "-m", f"Release {tag_name}"], check=True) else: - subprocess.run(["git", "tag", "-a", f"v{new_version}", "-m", f"Release v{new_version} (unsigned)"], check=True) + if force and tag_exists(tag_name): + subprocess.run(["git", "tag", "-d", tag_name], check=True) # Lokalen Tag löschen + subprocess.run(["git", "tag", "-a", tag_name, "-m", f"Release {tag_name} (unsigned)"], check=True) if push: subprocess.run(["git", "push"], check=True) - subprocess.run(["git", "push", "origin", f"v{new_version}"], check=True) + if force and tag_exists(tag_name): + # Force push des Tags, falls er bereits auf Remote existiert + subprocess.run(["git", "push", "origin", tag_name, "--force"], check=True) + else: + subprocess.run(["git", "push", "origin", tag_name], check=True) if use_signing: if signing_method == "ssh": From 759a313f31571666db026bedcd2132f16eb9d98f Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sun, 17 Aug 2025 17:54:09 +0200 Subject: [PATCH 24/87] Create roadmap-image-dedup.md --- docs/roadmap-image-dedup.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 docs/roadmap-image-dedup.md diff --git a/docs/roadmap-image-dedup.md b/docs/roadmap-image-dedup.md new file mode 100644 index 0000000..cc2a32c --- /dev/null +++ b/docs/roadmap-image-dedup.md @@ -0,0 +1,37 @@ +# Roadmap: Bild-Deduplizierung & Medien-Hygiene + +## Ziele +- Speicherverbrauch reduzieren +- Medienbestand konsistent halten +- Pipeline stabilisieren (keine Mehrfach-Uploads und -Speicherungen) + +## Vorgehen (sicher und reversibel) +1. **Index aufbauen (Read-Only):** + - Alle Bilder (`.jpg/.jpeg/.png/.webp/.gif`) in definierten Verzeichnissen scannen + - Für jede Datei: `sha256` (Byte-Hash) + `pHash` (perzeptuell) berechnen + - Ergebnis als SQLite-Index + CSV-Report speichern + +2. **Kanonisierung & Referenzen prüfen:** + - Pro Duplikatgruppe genau **eine** kanonische Datei wählen (größte/neueste) + - Alle internen Referenzen (DB/JSON) testweise auf Kanon aktualisieren (Dry-Run) + +3. **Speicher sparen ohne Risiko:** + - Nicht-kanonische Dateien durch **Hardlinks** auf den Kanon ersetzen (gleiches FS) + - Alternativ: nur löschen, wenn Referenzen **sicher** auf Kanon zeigen + +4. **Prävention für die Zukunft:** + - Beim Speichern: **Content-Addressed Storage** (`.`) + - In DB ein `content_hash`-Feld mit **Unique-Constraint** + - Vor jedem Speichern/Upload: Hash lookup → vorhandene Datei wiederverwenden + +## Akzeptanzkriterien +- Report listet alle Duplikatgruppen mit Pfaden und Größenersparnis +- Dry-Run zeigt geplante Änderungen ohne Schreibzugriff +- Nach „Anwenden“ verweisen alle Referenzen auf die kanonische Datei +- Re-Run findet **keine** Duplikate mehr (idempotent) +- Rollback möglich via Backup der Reports/Indexdatei + +## Metriken +- Anzahl Bilder vorher/nachher +- Ersparter Speicher (MB/GB) +- Anzahl gruppierter Duplikate From ed91864eda87524af04beabed6fa75d4b8273df3 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sun, 17 Aug 2025 17:56:04 +0200 Subject: [PATCH 25/87] Create image_deduper.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Funktionen: - Scan: Verzeichnisse rekursiv scannen, sha256 + pHash berechnen - Report: CSV + menschenlesbare Zusammenfassung mit Gruppen - Apply: Duplikate auf kanonische Datei umbiegen (Hardlink/Löschen) - Optional: DB-Referenzen aktualisieren (SQLite/SQLModel kompatibel) --- tools/image_deduper.py | 303 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 tools/image_deduper.py diff --git a/tools/image_deduper.py b/tools/image_deduper.py new file mode 100644 index 0000000..8bbec23 --- /dev/null +++ b/tools/image_deduper.py @@ -0,0 +1,303 @@ +#!/usr/bin/env python3 +""" +image_deduper.py — Finde und bereinige Bild-Dubletten sicher & reversibel. + +Funktionen: +- Scan: Verzeichnisse rekursiv scannen, sha256 + pHash berechnen +- Report: CSV + menschenlesbare Zusammenfassung mit Gruppen +- Apply: Duplikate auf kanonische Datei umbiegen (Hardlink/Löschen) +- Optional: DB-Referenzen aktualisieren (SQLite/SQLModel kompatibel) + +Nutzung (Beispiele): + # 1) Nur scannen + reporten (keine Änderungen): + python tools/image_deduper.py scan --roots media,assets/images --out-dir .dedupe --phash + + # 2) Report anzeigen: + python tools/image_deduper.py report --index .dedupe/index.sqlite --csv + + # 3) Anwenden (Hardlinks setzen, Dry-Run): + python tools/image_deduper.py apply --index .dedupe/index.sqlite --mode hardlink --dry-run + + # 4) Anwenden (wirklich ändern): + python tools/image_deduper.py apply --index .dedupe/index.sqlite --mode hardlink + + # 5) Referenzen in DB aktualisieren (optional): + python tools/image_deduper.py apply --index .dedupe/index.sqlite --update-db sqlite:///./rssbot.db --dry-run +""" + +import argparse +import csv +import hashlib +import os +import sqlite3 +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable, List, Optional, Tuple + +try: + from PIL import Image +except ImportError: + Image = None + +try: + import imagehash # type: ignore +except ImportError: + imagehash = None + + +IMAGE_EXTS = {".jpg", ".jpeg", ".png", ".webp", ".gif"} +DEFAULT_INDEX = ".dedupe/index.sqlite" +DEFAULT_REPORT = ".dedupe/report.csv" + + +def sha256_file(path: Path, bufsize: int = 1024 * 1024) -> str: + h = hashlib.sha256() + with path.open("rb") as f: + while True: + b = f.read(bufsize) + if not b: + break + h.update(b) + return h.hexdigest() + + +def calc_phash(path: Path) -> Optional[str]: + if Image is None or imagehash is None: + return None + try: + with Image.open(path) as im: + im = im.convert("RGB") + ph = imagehash.phash(im, hash_size=16) # 16x16 → 256-bit + return str(ph) + except Exception: + return None + + +def ensure_dir(p: Path): + p.mkdir(parents=True, exist_ok=True) + + +def init_index(db_path: Path): + conn = sqlite3.connect(str(db_path)) + cur = conn.cursor() + cur.execute(""" + CREATE TABLE IF NOT EXISTS files ( + id INTEGER PRIMARY KEY, + path TEXT NOT NULL UNIQUE, + size INTEGER NOT NULL, + mtime REAL NOT NULL, + sha256 TEXT NOT NULL, + phash TEXT, + ext TEXT NOT NULL + ); + """) + cur.execute("CREATE INDEX IF NOT EXISTS idx_sha256 ON files (sha256);") + cur.execute("CREATE INDEX IF NOT EXISTS idx_phash ON files (phash);") + conn.commit() + conn.close() + + +def is_image(path: Path) -> bool: + return path.suffix.lower() in IMAGE_EXTS + + +def walk_images(roots: List[Path]) -> Iterable[Path]: + for root in roots: + for p in root.rglob("*"): + if p.is_file() and is_image(p): + yield p + + +def upsert_file(db_path: Path, path: Path, sha256: str, phash: Optional[str]): + st = path.stat() + row = (str(path), st.st_size, st.st_mtime, sha256, phash, path.suffix.lower()) + conn = sqlite3.connect(str(db_path)) + cur = conn.cursor() + cur.execute(""" + INSERT INTO files (path, size, mtime, sha256, phash, ext) + VALUES (?, ?, ?, ?, ?, ?) + ON CONFLICT(path) DO UPDATE SET + size=excluded.size, + mtime=excluded.mtime, + sha256=excluded.sha256, + phash=excluded.phash, + ext=excluded.ext; + """, row) + conn.commit() + conn.close() + + +def group_by_sha256(db_path: Path) -> List[List[Tuple[int, str, int]]]: + """Return list of groups: [(id, path, size), ...] where sha256 identical and len(group) > 1.""" + conn = sqlite3.connect(str(db_path)) + cur = conn.cursor() + cur.execute(""" + SELECT sha256 FROM files GROUP BY sha256 HAVING COUNT(*) > 1; + """) + hashes = [r[0] for r in cur.fetchall()] + groups = [] + for h in hashes: + cur.execute("SELECT id, path, size FROM files WHERE sha256=?", (h,)) + rows = cur.fetchall() + groups.append([(rid, rpath, rsize) for rid, rpath, rsize in rows]) + conn.close() + return groups + + +def write_csv_report(db_path: Path, csv_path: Path) -> Tuple[int, int]: + groups = group_by_sha256(db_path) + ensure_dir(csv_path.parent) + total_dups = 0 + total_savings = 0 + with csv_path.open("w", newline="", encoding="utf-8") as f: + w = csv.writer(f) + w.writerow(["group_id", "canonical_path", "dup_path", "dup_size_bytes"]) + gid = 0 + for g in groups: + if not g: + continue + # Kanon: größte Datei (oder erste) + canonical = max(g, key=lambda x: x[2]) + for rid, path, size in g: + if path == canonical[1]: + continue + total_dups += 1 + total_savings += size + w.writerow([gid, canonical[1], path, size]) + gid += 1 + return total_dups, total_savings + + +def apply_hardlink(canonical: Path, dup: Path, dry_run: bool) -> None: + # Ersetzt dup durch Hardlink auf canonical (gleiche Partition nötig) + if dry_run: + return + tmp = dup.with_suffix(dup.suffix + ".dedupe.tmp") + dup.unlink() # entferne dup + os.link(canonical, tmp) # hardlink temp + tmp.replace(dup) # atomarer move + + +def apply_delete(dup: Path, dry_run: bool) -> None: + if dry_run: + return + dup.unlink() + + +@dataclass +class ApplyStats: + processed: int = 0 + errors: int = 0 + saved_bytes: int = 0 + + +def apply_changes(csv_report: Path, mode: str, dry_run: bool) -> ApplyStats: + stats = ApplyStats() + with csv_report.open("r", encoding="utf-8") as f: + r = csv.DictReader(f) + for row in r: + canonical = Path(row["canonical_path"]) + dup = Path(row["dup_path"]) + size = int(row["dup_size_bytes"]) + try: + if mode == "hardlink": + apply_hardlink(canonical, dup, dry_run) + elif mode == "delete": + apply_delete(dup, dry_run) + else: + raise ValueError("mode must be 'hardlink' or 'delete'") + stats.processed += 1 + stats.saved_bytes += size + except Exception as e: + stats.errors += 1 + print(f"[ERROR] {dup}: {e}", file=sys.stderr) + return stats + + +def parse_roots(roots_arg: str) -> List[Path]: + parts = [Path(p.strip()) for p in roots_arg.split(",") if p.strip()] + for p in parts: + if not p.exists(): + raise FileNotFoundError(f"Root not found: {p}") + return parts + + +def cmd_scan(args): + out_dir = Path(args.out_dir) + index = Path(args.index or DEFAULT_INDEX) + ensure_dir(out_dir) + ensure_dir(index.parent) + init_index(index) + roots = parse_roots(args.roots) + + count = 0 + for path in walk_images(roots): + try: + h = sha256_file(path) + ph = calc_phash(path) if args.phash else None + upsert_file(index, path, h, ph) + count += 1 + if count % 500 == 0: + print(f"... indexed {count} files") + except Exception as e: + print(f"[WARN] {path}: {e}", file=sys.stderr) + + dups, savings = write_csv_report(index, Path(args.report or DEFAULT_REPORT)) + print(f"Indexed {count} images. Found duplicate files: {dups}, potential savings: {savings/1_000_000:.2f} MB") + print(f"Index: {index}") + print(f"Report: {args.report or DEFAULT_REPORT}") + + +def cmd_report(args): + index = Path(args.index or DEFAULT_INDEX) + csv_path = Path(args.report or DEFAULT_REPORT) + dups, savings = write_csv_report(index, csv_path) + print(f"Duplicates: {dups}, potential savings: {savings/1_000_000:.2f} MB") + if args.csv: + print(f"CSV written: {csv_path}") + + +def cmd_apply(args): + csv_report = Path(args.report or DEFAULT_REPORT) + if not csv_report.exists(): + raise FileNotFoundError(f"Report not found: {csv_report}") + stats = apply_changes(csv_report, args.mode, args.dry_run) + print(f"Processed: {stats.processed}, Errors: {stats.errors}, Saved: {stats.saved_bytes/1_000_000:.2f} MB (mode={args.mode}, dry_run={args.dry_run})") + if args.update_db: + # Platzhalter: hier könntest du eure DB-Referenzen aktualisieren (falls Bilder-Paths in DB gespeichert sind). + # Beispiel: SQLModel mit Tabelle ImageMeta(content_hash UNIQUE, local_path) → auf kanonischen Pfad umbiegen. + print(f"[INFO] DB update requested for: {args.update_db} (implementierung projektspezifisch)") + + +def main(): + ap = argparse.ArgumentParser(description="Bild-Deduplizierung (scan/report/apply)") + sub = ap.add_subparsers(dest="cmd", required=True) + + sc = sub.add_parser("scan", help="Verzeichnisse scannen und Index/Report erstellen") + sc.add_argument("--roots", required=True, help="Kommagetrennte Wurzelpfade, z.B. 'media,assets/images'") + sc.add_argument("--out-dir", default=".dedupe", help="Ausgabeverzeichnis für Index/Reports") + sc.add_argument("--index", help="Pfad zur SQLite-Indexdatei (default .dedupe/index.sqlite)") + sc.add_argument("--report", help="Pfad zum CSV-Report (default .dedupe/report.csv)") + sc.add_argument("--phash", action="store_true", help="Perzeptuellen Hash berechnen (für zukünftige Near-Dups)") + sc.set_defaults(func=cmd_scan) + + rp = sub.add_parser("report", help="Report neu generieren/anzeigen") + rp.add_argument("--index", help="Pfad zur SQLite-Indexdatei") + rp.add_argument("--report", help="Pfad zum CSV-Report") + rp.add_argument("--csv", action="store_true", help="CSV-Pfad ausgeben") + rp.set_defaults(func=cmd_report) + + aply = sub.add_parser("apply", help="Änderungen anwenden (Hardlink/Delete)") + aply.add_argument("--report", help="Pfad zum CSV-Report") + aply.add_argument("--mode", choices=["hardlink", "delete"], default="hardlink", help="Strategie für Duplikate") + aply.add_argument("--dry-run", action="store_true", help="Nur anzeigen, nichts ändern") + aply.add_argument("--update-db", help="Optional: DB-URL für Referenz-Updates (projektspezifisch)") + aply.set_defaults(func=cmd_apply) + + args = ap.parse_args() + args.func(args) + + +if __name__ == "__main__": + main() From beac96095e314f138927d41e08fe3bf386a8bc58 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sun, 17 Aug 2025 17:58:18 +0200 Subject: [PATCH 26/87] Update requirements.txt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erweiterung der Abhängikeiten --- requirements.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/requirements.txt b/requirements.txt index 5a684fe..5fde2a7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -53,3 +53,6 @@ typing_extensions==4.14.0 tzdata==2025.2 urllib3==2.5.0 typer[all]==0.12.3 +# Bild- und Hashing-Bibliotheken für Dedupe +Pillow>=10.0.0 # Bildverarbeitung (öffnet Bilder für pHash) +ImageHash>=4.3 # Perzeptueller Hash (pHash) für Near-Duplicate Erkennung From 777c770142863d84add8e43a29122649b0dae33e Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sun, 17 Aug 2025 18:01:33 +0200 Subject: [PATCH 27/87] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d714f32..fcbde33 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ internal/start.sh internal/copy_files.sh internal/_line.txt internal/push_commit.txt +internal/git.sh From 0cfbb6c37f2d6b59e8b0aff7a19f29b173d2fd3f Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 18 Aug 2025 07:36:48 +0200 Subject: [PATCH 28/87] =?UTF-8?q?Image=20Dublettenpr=C3=BCfung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dedupe/index.sqlite | Bin 0 -> 20480 bytes .dedupe/report.csv | 1 + tools/image_deduper.py | 205 +++++++++++++++++++---------------------- 3 files changed, 96 insertions(+), 110 deletions(-) create mode 100644 .dedupe/index.sqlite create mode 100644 .dedupe/report.csv diff --git a/.dedupe/index.sqlite b/.dedupe/index.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..d2fa618a77da00ba73e2793e08f9246efcc32938 GIT binary patch literal 20480 zcmeI#O-sWt7{Kw=y(j}WJ>?=84}t>`RP-h|HOR1TIy+E2l*%eCY));3;ZZ#KVf-e3 zACI=tl@;+W;~z+xG*6!i}STlQLL_t>U-^@8YCSG0tg_000IagfB*srAb`OC6lfI7a#>o};a$%k zg}sq`A9zu48}|LEblA}iN2_M*NMEXKPPJRg%&RpMTR$q4<%+c2EJYM}TRXcZruZwz z_vA#9?;G`(C2LknX}!wWyXpJpY17R7q;MJswjRH^q9#h%OV;S|O6E9-6UhpxjM!Nzd|g>CZNwHVbJ(K>z^+ z5I_I{1Q0*~0R#|00D);0sH7X?{6DRqmwh3C00IagfB*srAbOvqJ.) und lädt identische Dateien nicht doppelt. +- Für HTML/Markdown werden Bild-URLs geparst; für JSON werden alle Stringwerte mit Bild-URL-Muster extrahiert. """ import argparse import csv import hashlib +import json +import mimetypes import os +import re import sqlite3 import sys from dataclasses import dataclass from pathlib import Path -from typing import Iterable, List, Optional, Tuple +from typing import Iterable, List, Optional, Tuple, Set +from urllib.parse import urlparse +# Optionale Parser/Helpers try: from PIL import Image except ImportError: @@ -45,12 +46,39 @@ try: except ImportError: imagehash = None +try: + import requests +except ImportError: + requests = None + +try: + from bs4 import BeautifulSoup +except ImportError: + BeautifulSoup = None + +try: + from tqdm import tqdm +except ImportError: + tqdm = None + IMAGE_EXTS = {".jpg", ".jpeg", ".png", ".webp", ".gif"} DEFAULT_INDEX = ".dedupe/index.sqlite" DEFAULT_REPORT = ".dedupe/report.csv" +DEFAULT_CACHE = ".media_cache" + +URL_RE = re.compile( + r"""https?://[^\s"'<>]+?\.(?:jpg|jpeg|png|webp|gif)(?:\?[^\s"'<>]*)?""", + re.IGNORECASE, +) + +def human_mb(nbytes: int) -> str: + return f"{nbytes/1_000_000:.2f} MB" +# --------------------------- +# Hashing & pHash +# --------------------------- def sha256_file(path: Path, bufsize: int = 1024 * 1024) -> str: h = hashlib.sha256() with path.open("rb") as f: @@ -74,6 +102,9 @@ def calc_phash(path: Path) -> Optional[str]: return None +# --------------------------- +# Index (SQLite) +# --------------------------- def ensure_dir(p: Path): p.mkdir(parents=True, exist_ok=True) @@ -104,6 +135,9 @@ def is_image(path: Path) -> bool: def walk_images(roots: List[Path]) -> Iterable[Path]: for root in roots: + if not root.exists(): + # Skip silently to be more forgiving; user might pass multiple roots + continue for p in root.rglob("*"): if p.is_file() and is_image(p): yield p @@ -129,12 +163,9 @@ def upsert_file(db_path: Path, path: Path, sha256: str, phash: Optional[str]): def group_by_sha256(db_path: Path) -> List[List[Tuple[int, str, int]]]: - """Return list of groups: [(id, path, size), ...] where sha256 identical and len(group) > 1.""" conn = sqlite3.connect(str(db_path)) cur = conn.cursor() - cur.execute(""" - SELECT sha256 FROM files GROUP BY sha256 HAVING COUNT(*) > 1; - """) + cur.execute("SELECT sha256 FROM files GROUP BY sha256 HAVING COUNT(*) > 1;") hashes = [r[0] for r in cur.fetchall()] groups = [] for h in hashes: @@ -157,8 +188,7 @@ def write_csv_report(db_path: Path, csv_path: Path) -> Tuple[int, int]: for g in groups: if not g: continue - # Kanon: größte Datei (oder erste) - canonical = max(g, key=lambda x: x[2]) + canonical = max(g, key=lambda x: x[2]) # größte Datei als Kanon for rid, path, size in g: if path == canonical[1]: continue @@ -169,20 +199,22 @@ def write_csv_report(db_path: Path, csv_path: Path) -> Tuple[int, int]: return total_dups, total_savings +# --------------------------- +# Apply (Hardlink/Delete) +# --------------------------- def apply_hardlink(canonical: Path, dup: Path, dry_run: bool) -> None: - # Ersetzt dup durch Hardlink auf canonical (gleiche Partition nötig) if dry_run: return tmp = dup.with_suffix(dup.suffix + ".dedupe.tmp") - dup.unlink() # entferne dup - os.link(canonical, tmp) # hardlink temp - tmp.replace(dup) # atomarer move + dup.unlink(missing_ok=False) + os.link(canonical, tmp) # gleicher FS notwendig + tmp.replace(dup) def apply_delete(dup: Path, dry_run: bool) -> None: if dry_run: return - dup.unlink() + dup.unlink(missing_ok=False) @dataclass @@ -215,89 +247,42 @@ def apply_changes(csv_report: Path, mode: str, dry_run: bool) -> ApplyStats: return stats -def parse_roots(roots_arg: str) -> List[Path]: - parts = [Path(p.strip()) for p in roots_arg.split(",") if p.strip()] - for p in parts: - if not p.exists(): - raise FileNotFoundError(f"Root not found: {p}") - return parts +# --------------------------- +# Collect (URLs -> Cache) +# --------------------------- +def is_image_url(url: str) -> bool: + if URL_RE.search(url): + return True + # Fallback: Extension anhand des Pfads + path = urlparse(url).path + ext = Path(path).suffix.lower() + return ext in IMAGE_EXTS -def cmd_scan(args): - out_dir = Path(args.out_dir) - index = Path(args.index or DEFAULT_INDEX) - ensure_dir(out_dir) - ensure_dir(index.parent) - init_index(index) - roots = parse_roots(args.roots) - - count = 0 - for path in walk_images(roots): - try: - h = sha256_file(path) - ph = calc_phash(path) if args.phash else None - upsert_file(index, path, h, ph) - count += 1 - if count % 500 == 0: - print(f"... indexed {count} files") - except Exception as e: - print(f"[WARN] {path}: {e}", file=sys.stderr) - - dups, savings = write_csv_report(index, Path(args.report or DEFAULT_REPORT)) - print(f"Indexed {count} images. Found duplicate files: {dups}, potential savings: {savings/1_000_000:.2f} MB") - print(f"Index: {index}") - print(f"Report: {args.report or DEFAULT_REPORT}") +def extract_urls_from_text(text: str) -> Set[str]: + urls = set(URL_RE.findall(text)) + return urls -def cmd_report(args): - index = Path(args.index or DEFAULT_INDEX) - csv_path = Path(args.report or DEFAULT_REPORT) - dups, savings = write_csv_report(index, csv_path) - print(f"Duplicates: {dups}, potential savings: {savings/1_000_000:.2f} MB") - if args.csv: - print(f"CSV written: {csv_path}") +def extract_urls_from_html(text: str) -> Set[str]: + urls = set() + if BeautifulSoup is None: + return extract_urls_from_text(text) + try: + soup = BeautifulSoup(text, "html.parser") + for tag in soup.find_all(["img", "source"]): + src = tag.get("src") or tag.get("data-src") + if src and is_image_url(src): + urls.add(src) + # Fallback auf nackte URLs + urls |= extract_urls_from_text(text) + except Exception: + urls |= extract_urls_from_text(text) + return urls -def cmd_apply(args): - csv_report = Path(args.report or DEFAULT_REPORT) - if not csv_report.exists(): - raise FileNotFoundError(f"Report not found: {csv_report}") - stats = apply_changes(csv_report, args.mode, args.dry_run) - print(f"Processed: {stats.processed}, Errors: {stats.errors}, Saved: {stats.saved_bytes/1_000_000:.2f} MB (mode={args.mode}, dry_run={args.dry_run})") - if args.update_db: - # Platzhalter: hier könntest du eure DB-Referenzen aktualisieren (falls Bilder-Paths in DB gespeichert sind). - # Beispiel: SQLModel mit Tabelle ImageMeta(content_hash UNIQUE, local_path) → auf kanonischen Pfad umbiegen. - print(f"[INFO] DB update requested for: {args.update_db} (implementierung projektspezifisch)") - - -def main(): - ap = argparse.ArgumentParser(description="Bild-Deduplizierung (scan/report/apply)") - sub = ap.add_subparsers(dest="cmd", required=True) - - sc = sub.add_parser("scan", help="Verzeichnisse scannen und Index/Report erstellen") - sc.add_argument("--roots", required=True, help="Kommagetrennte Wurzelpfade, z.B. 'media,assets/images'") - sc.add_argument("--out-dir", default=".dedupe", help="Ausgabeverzeichnis für Index/Reports") - sc.add_argument("--index", help="Pfad zur SQLite-Indexdatei (default .dedupe/index.sqlite)") - sc.add_argument("--report", help="Pfad zum CSV-Report (default .dedupe/report.csv)") - sc.add_argument("--phash", action="store_true", help="Perzeptuellen Hash berechnen (für zukünftige Near-Dups)") - sc.set_defaults(func=cmd_scan) - - rp = sub.add_parser("report", help="Report neu generieren/anzeigen") - rp.add_argument("--index", help="Pfad zur SQLite-Indexdatei") - rp.add_argument("--report", help="Pfad zum CSV-Report") - rp.add_argument("--csv", action="store_true", help="CSV-Pfad ausgeben") - rp.set_defaults(func=cmd_report) - - aply = sub.add_parser("apply", help="Änderungen anwenden (Hardlink/Delete)") - aply.add_argument("--report", help="Pfad zum CSV-Report") - aply.add_argument("--mode", choices=["hardlink", "delete"], default="hardlink", help="Strategie für Duplikate") - aply.add_argument("--dry-run", action="store_true", help="Nur anzeigen, nichts ändern") - aply.add_argument("--update-db", help="Optional: DB-URL für Referenz-Updates (projektspezifisch)") - aply.set_defaults(func=cmd_apply) - - args = ap.parse_args() - args.func(args) - - -if __name__ == "__main__": - main() +def extract_urls_from_json(obj) -> Set[str]: + urls = set() + if isinstance(obj, dict): + for v in obj.values(): + urls |= extract From a02f825274210500abad1e67bda8b4b02d8cecb6 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 18 Aug 2025 07:37:32 +0200 Subject: [PATCH 29/87] =?UTF-8?q?Image=20Dublettenpr=C3=BCfung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/image_deduper.py | 205 ++++++++++++++++++++++------------------- 1 file changed, 110 insertions(+), 95 deletions(-) diff --git a/tools/image_deduper.py b/tools/image_deduper.py index 715e4e0..8bbec23 100644 --- a/tools/image_deduper.py +++ b/tools/image_deduper.py @@ -2,40 +2,39 @@ """ image_deduper.py — Finde und bereinige Bild-Dubletten sicher & reversibel. -Neu: -- collect: Bild-URLs aus JSON/HTML/Markdown/Text sammeln und lokal in .media_cache/ speichern -- scan/report/apply: wie gehabt (Hardlink/Delete), jetzt standardmäßig mit Cache nutzbar +Funktionen: +- Scan: Verzeichnisse rekursiv scannen, sha256 + pHash berechnen +- Report: CSV + menschenlesbare Zusammenfassung mit Gruppen +- Apply: Duplikate auf kanonische Datei umbiegen (Hardlink/Löschen) +- Optional: DB-Referenzen aktualisieren (SQLite/SQLModel kompatibel) -Workflows: - # A) Nur remote-Referenzen vorhanden → erst sammeln, dann deduplizieren - python tools/image_deduper.py collect --sources processed_articles.json,content/ --cache .media_cache - python tools/image_deduper.py scan --roots .media_cache --out-dir .dedupe --phash - python tools/image_deduper.py apply --report .dedupe/report.csv --mode hardlink --dry-run - python tools/image_deduper.py apply --report .dedupe/report.csv --mode hardlink +Nutzung (Beispiele): + # 1) Nur scannen + reporten (keine Änderungen): + python tools/image_deduper.py scan --roots media,assets/images --out-dir .dedupe --phash - # B) Lokale Bild-Ordner vorhanden - python tools/image_deduper.py scan --roots ./media,./static/images --out-dir .dedupe --phash + # 2) Report anzeigen: + python tools/image_deduper.py report --index .dedupe/index.sqlite --csv -Hinweise: -- "collect" speichert Bilder content-addressed (.) und lädt identische Dateien nicht doppelt. -- Für HTML/Markdown werden Bild-URLs geparst; für JSON werden alle Stringwerte mit Bild-URL-Muster extrahiert. + # 3) Anwenden (Hardlinks setzen, Dry-Run): + python tools/image_deduper.py apply --index .dedupe/index.sqlite --mode hardlink --dry-run + + # 4) Anwenden (wirklich ändern): + python tools/image_deduper.py apply --index .dedupe/index.sqlite --mode hardlink + + # 5) Referenzen in DB aktualisieren (optional): + python tools/image_deduper.py apply --index .dedupe/index.sqlite --update-db sqlite:///./rssbot.db --dry-run """ import argparse import csv import hashlib -import json -import mimetypes import os -import re import sqlite3 import sys from dataclasses import dataclass from pathlib import Path -from typing import Iterable, List, Optional, Tuple, Set -from urllib.parse import urlparse +from typing import Iterable, List, Optional, Tuple -# Optionale Parser/Helpers try: from PIL import Image except ImportError: @@ -46,39 +45,12 @@ try: except ImportError: imagehash = None -try: - import requests -except ImportError: - requests = None - -try: - from bs4 import BeautifulSoup -except ImportError: - BeautifulSoup = None - -try: - from tqdm import tqdm -except ImportError: - tqdm = None - IMAGE_EXTS = {".jpg", ".jpeg", ".png", ".webp", ".gif"} DEFAULT_INDEX = ".dedupe/index.sqlite" DEFAULT_REPORT = ".dedupe/report.csv" -DEFAULT_CACHE = ".media_cache" - -URL_RE = re.compile( - r"""https?://[^\s"'<>]+?\.(?:jpg|jpeg|png|webp|gif)(?:\?[^\s"'<>]*)?""", - re.IGNORECASE, -) - -def human_mb(nbytes: int) -> str: - return f"{nbytes/1_000_000:.2f} MB" -# --------------------------- -# Hashing & pHash -# --------------------------- def sha256_file(path: Path, bufsize: int = 1024 * 1024) -> str: h = hashlib.sha256() with path.open("rb") as f: @@ -102,9 +74,6 @@ def calc_phash(path: Path) -> Optional[str]: return None -# --------------------------- -# Index (SQLite) -# --------------------------- def ensure_dir(p: Path): p.mkdir(parents=True, exist_ok=True) @@ -135,9 +104,6 @@ def is_image(path: Path) -> bool: def walk_images(roots: List[Path]) -> Iterable[Path]: for root in roots: - if not root.exists(): - # Skip silently to be more forgiving; user might pass multiple roots - continue for p in root.rglob("*"): if p.is_file() and is_image(p): yield p @@ -163,9 +129,12 @@ def upsert_file(db_path: Path, path: Path, sha256: str, phash: Optional[str]): def group_by_sha256(db_path: Path) -> List[List[Tuple[int, str, int]]]: + """Return list of groups: [(id, path, size), ...] where sha256 identical and len(group) > 1.""" conn = sqlite3.connect(str(db_path)) cur = conn.cursor() - cur.execute("SELECT sha256 FROM files GROUP BY sha256 HAVING COUNT(*) > 1;") + cur.execute(""" + SELECT sha256 FROM files GROUP BY sha256 HAVING COUNT(*) > 1; + """) hashes = [r[0] for r in cur.fetchall()] groups = [] for h in hashes: @@ -188,7 +157,8 @@ def write_csv_report(db_path: Path, csv_path: Path) -> Tuple[int, int]: for g in groups: if not g: continue - canonical = max(g, key=lambda x: x[2]) # größte Datei als Kanon + # Kanon: größte Datei (oder erste) + canonical = max(g, key=lambda x: x[2]) for rid, path, size in g: if path == canonical[1]: continue @@ -199,22 +169,20 @@ def write_csv_report(db_path: Path, csv_path: Path) -> Tuple[int, int]: return total_dups, total_savings -# --------------------------- -# Apply (Hardlink/Delete) -# --------------------------- def apply_hardlink(canonical: Path, dup: Path, dry_run: bool) -> None: + # Ersetzt dup durch Hardlink auf canonical (gleiche Partition nötig) if dry_run: return tmp = dup.with_suffix(dup.suffix + ".dedupe.tmp") - dup.unlink(missing_ok=False) - os.link(canonical, tmp) # gleicher FS notwendig - tmp.replace(dup) + dup.unlink() # entferne dup + os.link(canonical, tmp) # hardlink temp + tmp.replace(dup) # atomarer move def apply_delete(dup: Path, dry_run: bool) -> None: if dry_run: return - dup.unlink(missing_ok=False) + dup.unlink() @dataclass @@ -247,42 +215,89 @@ def apply_changes(csv_report: Path, mode: str, dry_run: bool) -> ApplyStats: return stats -# --------------------------- -# Collect (URLs -> Cache) -# --------------------------- -def is_image_url(url: str) -> bool: - if URL_RE.search(url): - return True - # Fallback: Extension anhand des Pfads - path = urlparse(url).path - ext = Path(path).suffix.lower() - return ext in IMAGE_EXTS +def parse_roots(roots_arg: str) -> List[Path]: + parts = [Path(p.strip()) for p in roots_arg.split(",") if p.strip()] + for p in parts: + if not p.exists(): + raise FileNotFoundError(f"Root not found: {p}") + return parts -def extract_urls_from_text(text: str) -> Set[str]: - urls = set(URL_RE.findall(text)) - return urls +def cmd_scan(args): + out_dir = Path(args.out_dir) + index = Path(args.index or DEFAULT_INDEX) + ensure_dir(out_dir) + ensure_dir(index.parent) + init_index(index) + roots = parse_roots(args.roots) + + count = 0 + for path in walk_images(roots): + try: + h = sha256_file(path) + ph = calc_phash(path) if args.phash else None + upsert_file(index, path, h, ph) + count += 1 + if count % 500 == 0: + print(f"... indexed {count} files") + except Exception as e: + print(f"[WARN] {path}: {e}", file=sys.stderr) + + dups, savings = write_csv_report(index, Path(args.report or DEFAULT_REPORT)) + print(f"Indexed {count} images. Found duplicate files: {dups}, potential savings: {savings/1_000_000:.2f} MB") + print(f"Index: {index}") + print(f"Report: {args.report or DEFAULT_REPORT}") -def extract_urls_from_html(text: str) -> Set[str]: - urls = set() - if BeautifulSoup is None: - return extract_urls_from_text(text) - try: - soup = BeautifulSoup(text, "html.parser") - for tag in soup.find_all(["img", "source"]): - src = tag.get("src") or tag.get("data-src") - if src and is_image_url(src): - urls.add(src) - # Fallback auf nackte URLs - urls |= extract_urls_from_text(text) - except Exception: - urls |= extract_urls_from_text(text) - return urls +def cmd_report(args): + index = Path(args.index or DEFAULT_INDEX) + csv_path = Path(args.report or DEFAULT_REPORT) + dups, savings = write_csv_report(index, csv_path) + print(f"Duplicates: {dups}, potential savings: {savings/1_000_000:.2f} MB") + if args.csv: + print(f"CSV written: {csv_path}") -def extract_urls_from_json(obj) -> Set[str]: - urls = set() - if isinstance(obj, dict): - for v in obj.values(): - urls |= extract +def cmd_apply(args): + csv_report = Path(args.report or DEFAULT_REPORT) + if not csv_report.exists(): + raise FileNotFoundError(f"Report not found: {csv_report}") + stats = apply_changes(csv_report, args.mode, args.dry_run) + print(f"Processed: {stats.processed}, Errors: {stats.errors}, Saved: {stats.saved_bytes/1_000_000:.2f} MB (mode={args.mode}, dry_run={args.dry_run})") + if args.update_db: + # Platzhalter: hier könntest du eure DB-Referenzen aktualisieren (falls Bilder-Paths in DB gespeichert sind). + # Beispiel: SQLModel mit Tabelle ImageMeta(content_hash UNIQUE, local_path) → auf kanonischen Pfad umbiegen. + print(f"[INFO] DB update requested for: {args.update_db} (implementierung projektspezifisch)") + + +def main(): + ap = argparse.ArgumentParser(description="Bild-Deduplizierung (scan/report/apply)") + sub = ap.add_subparsers(dest="cmd", required=True) + + sc = sub.add_parser("scan", help="Verzeichnisse scannen und Index/Report erstellen") + sc.add_argument("--roots", required=True, help="Kommagetrennte Wurzelpfade, z.B. 'media,assets/images'") + sc.add_argument("--out-dir", default=".dedupe", help="Ausgabeverzeichnis für Index/Reports") + sc.add_argument("--index", help="Pfad zur SQLite-Indexdatei (default .dedupe/index.sqlite)") + sc.add_argument("--report", help="Pfad zum CSV-Report (default .dedupe/report.csv)") + sc.add_argument("--phash", action="store_true", help="Perzeptuellen Hash berechnen (für zukünftige Near-Dups)") + sc.set_defaults(func=cmd_scan) + + rp = sub.add_parser("report", help="Report neu generieren/anzeigen") + rp.add_argument("--index", help="Pfad zur SQLite-Indexdatei") + rp.add_argument("--report", help="Pfad zum CSV-Report") + rp.add_argument("--csv", action="store_true", help="CSV-Pfad ausgeben") + rp.set_defaults(func=cmd_report) + + aply = sub.add_parser("apply", help="Änderungen anwenden (Hardlink/Delete)") + aply.add_argument("--report", help="Pfad zum CSV-Report") + aply.add_argument("--mode", choices=["hardlink", "delete"], default="hardlink", help="Strategie für Duplikate") + aply.add_argument("--dry-run", action="store_true", help="Nur anzeigen, nichts ändern") + aply.add_argument("--update-db", help="Optional: DB-URL für Referenz-Updates (projektspezifisch)") + aply.set_defaults(func=cmd_apply) + + args = ap.parse_args() + args.func(args) + + +if __name__ == "__main__": + main() From 0bb7d246c19f21bbcbc2592a8a41c1f68ad6985d Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 18 Aug 2025 10:33:27 +0200 Subject: [PATCH 30/87] Bump version to v1.6.3 --- CHANGELOG.md | 4 + __version__.py | 2 +- app.py | 323 ++++++++++++------------- data/articles.json | 32 ++- logs/rss_tool.log | 243 +++++++++++++++++++ pages/01_feed_manager.py | 223 +++++++++++++++--- pages/log_viewer.py | 294 ++++++++++++++++++++++- static/styles.css | 491 +++++++++++++++++++++++++++++++++++++++ utils/css_loader.py | 367 +++++++++++++++++++++++++++++ 9 files changed, 1758 insertions(+), 221 deletions(-) create mode 100644 static/styles.css create mode 100644 utils/css_loader.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e8d5df..c50eb8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [1.6.3] - 2025-08-18 + +- Beschreibung... + ## [v1.6.2] - 2025-08-16 ### 🐛 Kritische Fehlerbehebung diff --git a/__version__.py b/__version__.py index c8a19b1..1b702b1 100644 --- a/__version__.py +++ b/__version__.py @@ -1 +1 @@ -VERSION = "1.6.2" +VERSION = "1.6.3" diff --git a/app.py b/app.py index 0296f0b..6d8b504 100644 --- a/app.py +++ b/app.py @@ -13,6 +13,7 @@ from main import ( ) from utils.dalle_generator import generate_dalle_image from utils.wordpress_uploader import WordPressUploader +from utils.css_loader import load_css, apply_dark_theme import os from collections import Counter import time @@ -24,103 +25,9 @@ st.set_page_config( initial_sidebar_state="collapsed" ) -# === Custom CSS für modernes Design === -st.markdown(""" - -""", unsafe_allow_html=True) +# === CSS & Theme laden === +load_css() +apply_dark_theme() # === Initialize Session State === if 'selected_articles' not in st.session_state: @@ -340,9 +247,8 @@ with tab1:
- {article.get('title', 'Kein Titel')} -
- {format_date(article.get('date', ''))} +

{article.get('title', 'Kein Titel')}

+
{get_status_badge(article.get('status', 'New'))} @@ -437,12 +343,12 @@ with tab2: title = article.get("title", "Kein Titel") if has_incomplete_images: title += " ⚠️" - st.markdown(f"**{title}**") - st.markdown(f"📅 {format_date(article.get('date', ''))}") + st.markdown(f'

{title}

', unsafe_allow_html=True) + st.markdown(f'', unsafe_allow_html=True) # WordPress-Info anzeigen falls vorhanden if article.get("wp_post_id"): - st.markdown(f"🔗 WordPress ID: {article.get('wp_post_id')} | Upload: {format_date(article.get('wp_upload_date', ''))}") + st.markdown(f'', unsafe_allow_html=True) with col2: st.markdown(get_status_badge(article.get("status", "New")), unsafe_allow_html=True) @@ -451,19 +357,19 @@ with tab2: summary = article.get("summary", "")[:200] if len(summary) == 200: summary += "..." - st.markdown(summary) + st.markdown(f'
{summary}
', unsafe_allow_html=True) # Meta Info col1, col2, col3 = st.columns(3) with col1: - st.markdown(f"📝 **{get_word_count(article.get('text', ''))} Wörter**") + st.markdown(f'', unsafe_allow_html=True) with col2: tags = article.get("tags", []) if tags: - st.markdown(f"🏷️ {', '.join(tags[:3])}{'...' if len(tags) > 3 else ''}") + st.markdown(f'', unsafe_allow_html=True) with col3: source_name = source_to_name.get(article.get("source", ""), "Unbekannt") - st.markdown(f"📡 {source_name}") + st.markdown(f'', unsafe_allow_html=True) # Actions col1, col2, col3, col4, col5 = st.columns(5) @@ -642,11 +548,9 @@ with tab3:
- {feed_name} -
- {feed_url} -
- 📰 {article_count} Artikel +

{feed_name}

+ +
{article_count} Artikel @@ -712,13 +616,15 @@ with tab4: cols = st.columns(3) for idx, img in enumerate(all_images): with cols[idx % 3]: + st.markdown('
', unsafe_allow_html=True) st.image(img["url"], use_column_width=True) - st.markdown(f"**{img.get('caption', 'Kein Titel')}**") - st.markdown(f"📰 {img['article_title']}") - st.markdown(f"©️ {img.get('copyright', 'Unbekannt')}") + st.markdown(f'{img.get("caption", "Kein Titel")}', unsafe_allow_html=True) + st.markdown(f'
📰 {img["article_title"]}
', unsafe_allow_html=True) + st.markdown(f'
©️ {img.get("copyright", "Unbekannt")}
', unsafe_allow_html=True) if img.get("copyright_url") and img["copyright_url"] != "#": - st.markdown(f"[🔗 Quelle]({img['copyright_url']})") + st.markdown(f'🔗 Quelle', unsafe_allow_html=True) + st.markdown('
', unsafe_allow_html=True) else: st.info("Keine Bilder gefunden.") @@ -735,13 +641,13 @@ with tab5: st.subheader("📈 Status Verteilung") for status, count in status_counts.items(): percentage = (count / len(all_articles) * 100) if all_articles else 0 - st.markdown(f"{get_status_badge(status)} {count} ({percentage:.1f}%)", unsafe_allow_html=True) + st.markdown(f"{get_status_badge(status)} {count} ({percentage:.1f}%)", unsafe_allow_html=True) with col2: st.subheader("📡 Artikel pro Feed") feed_counts = Counter([source_to_name.get(a.get("source", ""), "Unbekannt") for a in all_articles]) for feed_name, count in feed_counts.most_common(): - st.markdown(f"**{feed_name}:** {count} Artikel") + st.markdown(f'
{feed_name}: {count} Artikel
', unsafe_allow_html=True) # WordPress-Statistiken st.subheader("🔗 WordPress-Statistiken") @@ -751,15 +657,30 @@ with tab5: col1, col2, col3 = st.columns(3) with col1: - st.metric("WordPress Artikel", len(wp_articles)) + st.markdown(""" +
+
{}
+
WordPress Artikel
+
+ """.format(len(wp_articles)), unsafe_allow_html=True) with col2: pending_count = len([a for a in wp_articles if a.get("status") == "WordPress Pending"]) - st.metric("Ausstehend", pending_count) + st.markdown(""" +
+
{}
+
Ausstehend
+
+ """.format(pending_count), unsafe_allow_html=True) with col3: online_wp_count = len([a for a in wp_articles if a.get("status") == "Online"]) - st.metric("Online", online_wp_count) + st.markdown(""" +
+
{}
+
Online
+
+ """.format(online_wp_count), unsafe_allow_html=True) # Neueste WordPress-Uploads recent_wp = sorted([a for a in wp_articles if a.get("wp_upload_date")], @@ -769,9 +690,11 @@ with tab5: st.subheader("🕒 Neueste WordPress-Uploads") for article in recent_wp: st.markdown(f""" - **{article.get('title', 'Kein Titel')}** {get_status_badge(article.get('status', 'Unknown'))} - - WP ID: {article.get('wp_post_id')} | Upload: {format_date(article.get('wp_upload_date', ''))} +
+

{article.get('title', 'Kein Titel')}

+ {get_status_badge(article.get('status', 'Unknown'))} + +
""", unsafe_allow_html=True) else: st.info("Noch keine Artikel zu WordPress hochgeladen.") @@ -784,13 +707,28 @@ with tab5: col1, col2, col3 = st.columns(3) with col1: - st.metric("Durchschnittliche Wortanzahl", f"{sum(word_counts) // len(word_counts)}") + st.markdown(""" +
+
{}
+
Durchschnittliche Wortanzahl
+
+ """.format(sum(word_counts) // len(word_counts)), unsafe_allow_html=True) with col2: - st.metric("Längster Artikel", f"{max(word_counts)} Wörter") + st.markdown(""" +
+
{}
+
Längster Artikel (Wörter)
+
+ """.format(max(word_counts)), unsafe_allow_html=True) with col3: - st.metric("Kürzester Artikel", f"{min(word_counts)} Wörter") + st.markdown(""" +
+
{}
+
Kürzester Artikel (Wörter)
+
+ """.format(min(word_counts)), unsafe_allow_html=True) # Tag Cloud Simulation st.subheader("🏷️ Häufigste Tags") @@ -801,7 +739,7 @@ with tab5: if all_tags: tag_counts = Counter(all_tags) for tag, count in tag_counts.most_common(10): - st.markdown(f"**{tag}:** {count}x verwendet") + st.markdown(f'
{tag}: {count}x verwendet
', unsafe_allow_html=True) else: st.info("Keine Tags gefunden.") @@ -830,13 +768,17 @@ with tab6: wp_user = os.getenv("WP_USERNAME", "Nicht konfiguriert") wp_base64 = os.getenv("WP_AUTH_BASE64", "") - st.info(f""" - **WordPress-Konfiguration:** - - URL: {wp_url} - - Benutzer: {wp_user} - - Passwort: {'✅ Konfiguriert' if os.getenv("WP_PASSWORD") else '❌ Nicht konfiguriert'} - - Base64 Auth: {'✅ Konfiguriert' if wp_base64 else '❌ Nicht konfiguriert'} - """) + st.markdown(f""" +
+ WordPress-Konfiguration:
+
+ URL: {wp_url}
+ Benutzer: {wp_user}
+ Passwort: {'✅ Konfiguriert' if os.getenv("WP_PASSWORD") else '❌ Nicht konfiguriert'}
+ Base64 Auth: {'✅ Konfiguriert' if wp_base64 else '❌ Nicht konfiguriert'} +
+
+ """, unsafe_allow_html=True) # WordPress Auth Debug (nur für Entwicklung) if st.checkbox("🔧 Debug-Modus (Auth-Details anzeigen)", value=False): @@ -863,10 +805,10 @@ with tab6: # Artikel-Vorschau for article in process_articles_list[:5]: # Nur die ersten 5 anzeigen - st.markdown(f"• **{article.get('title', 'Kein Titel')}** ({get_word_count(article.get('text', ''))} Wörter)") + st.markdown(f'
{article.get("title", "Kein Titel")} ({get_word_count(article.get("text", ""))} Wörter)
', unsafe_allow_html=True) if len(process_articles_list) > 5: - st.markdown(f"... und {len(process_articles_list) - 5} weitere") + st.markdown(f'
... und {len(process_articles_list) - 5} weitere
', unsafe_allow_html=True) col1, col2 = st.columns(2) @@ -884,24 +826,46 @@ with tab6: col1, col2, col3 = st.columns(3) with col1: - st.metric("Erfolgreich", upload_results.get('successful', 0)) + st.markdown(""" +
+
{}
+
Erfolgreich
+
+ """.format(upload_results.get('successful', 0)), unsafe_allow_html=True) with col2: - st.metric("Fehlgeschlagen", upload_results.get('failed', 0)) + st.markdown(""" +
+
{}
+
Fehlgeschlagen
+
+ """.format(upload_results.get('failed', 0)), unsafe_allow_html=True) with col3: - st.metric("Duplikate", upload_results.get('duplicates', 0)) + st.markdown(""" +
+
{}
+
Duplikate
+
+ """.format(upload_results.get('duplicates', 0)), unsafe_allow_html=True) # Details anzeigen if upload_results.get('details'): st.subheader("📋 Upload-Details") for detail in upload_results['details']: status_icon = "✅" if detail['success'] else "❌" - st.markdown(f"{status_icon} **{detail['title']}**: {detail['message']}") + st.markdown(f'
{status_icon} {detail["title"]}: {detail["message"]}
', unsafe_allow_html=True) time.sleep(2) st.rerun() with col2: - st.info("💡 Artikel erhalten den Status 'WordPress Pending' nach erfolgreichem Upload.") + st.markdown(""" +
+ 💡 Info:
+
+ Artikel erhalten den Status 'WordPress Pending' nach erfolgreichem Upload. +
+
+ """, unsafe_allow_html=True) else: st.info("Keine Artikel mit Status 'Process' gefunden. Artikel müssen zuerst umgeschrieben werden.") @@ -931,8 +895,7 @@ with tab6:
- {article.get('title', 'Kein Titel')} -
+ {article.get('title', 'Kein Titel')}
WP ID: {article.get('wp_post_id')} | Upload: {format_date(article.get('wp_upload_date', ''))}
@@ -964,40 +927,44 @@ OPENAI_API_KEY=sk-... with st.expander("🔑 Base64-Authentifizierung verstehen", expanded=False): st.markdown(""" - **WordPress REST API Authentifizierung:** - - Die WordPress REST API erfordert eine Base64-kodierte Authentifizierung im Format: - ``` - Authorization: Basic - ``` - - **Ihr bereitgestellter Base64-String:** - - `b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM=` - - Dekodiert: `ogiertz:whNEx9aZCIUXViV89Z3e7Z03` - - **So funktioniert es:** - 1. Benutzername und Anwendungspasswort werden kombiniert: `username:password` - 2. Dieser String wird Base64-kodiert - 3. Im Authorization-Header verwendet: `Basic ` - - **Fallback-Verhalten:** - - Wenn `WP_AUTH_BASE64` gesetzt ist → Direkter Base64-String verwendet - - Wenn nicht gesetzt → Base64 wird aus `WP_USERNAME:WP_PASSWORD` generiert - """) +
+

WordPress REST API Authentifizierung:

+
+ Die WordPress REST API erfordert eine Base64-kodierte Authentifizierung im Format:
+ Authorization: Basic <base64_encoded_credentials> +

+ Ihr bereitgestellter Base64-String:
+ • b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM=
+ • Dekodiert: ogiertz:whNEx9aZCIUXViV89Z3e7Z03 +

+ So funktioniert es:
+ 1. Benutzername und Anwendungspasswort werden kombiniert: username:password
+ 2. Dieser String wird Base64-kodiert
+ 3. Im Authorization-Header verwendet: Basic <base64_string> +

+ Fallback-Verhalten:
+ • Wenn WP_AUTH_BASE64 gesetzt ist → Direkter Base64-String verwendet
+ • Wenn nicht gesetzt → Base64 wird aus WP_USERNAME:WP_PASSWORD generiert +
+
+ """, unsafe_allow_html=True) with st.expander("📖 WordPress-API Berechtigungen", expanded=False): st.markdown(""" - **Erforderliche Berechtigungen für den WordPress-Benutzer:** - - - `edit_posts` - Beiträge erstellen und bearbeiten - - `publish_posts` - Beiträge veröffentlichen (für Status-Änderungen) - - `upload_files` - Dateien hochladen (für spätere Bild-Uploads) - - `edit_categories` - Kategorien verwalten - - `edit_tags` - Tags verwalten - - **Anwendungspasswort erstellen:** - 1. WordPress Admin → Benutzer → Profil - 2. Unter "Anwendungspasswörter" neues Passwort erstellen - 3. Name: "RSS Feed Manager" - 4. Generiertes Passwort in .env-Datei eintragen - """) \ No newline at end of file +
+

Erforderliche Berechtigungen für den WordPress-Benutzer:

+
+ • edit_posts - Beiträge erstellen und bearbeiten
+ • publish_posts - Beiträge veröffentlichen (für Status-Änderungen)
+ • upload_files - Dateien hochladen (für spätere Bild-Uploads)
+ • edit_categories - Kategorien verwalten
+ • edit_tags - Tags verwalten +

+ Anwendungspasswort erstellen:
+ 1. WordPress Admin → Benutzer → Profil
+ 2. Unter "Anwendungspasswörter" neues Passwort erstellen
+ 3. Name: "RSS Feed Manager"
+ 4. Generiertes Passwort in .env-Datei eintragen +
+
+ """, unsafe_allow_html=True) \ No newline at end of file diff --git a/data/articles.json b/data/articles.json index 8437b4d..514daff 100644 --- a/data/articles.json +++ b/data/articles.json @@ -6475,7 +6475,7 @@ "Wohnmobil", "Globus-Baumarkt" ], - "status": "WordPress Pending", + "status": "Online", "link": "https://www.promobil.de/weitere-ratgeber/gasflaschenservice-fuer-camping-und-grillfans-im-promobil-test/", "images": [], "source": "https://www.promobil.de/rss/ratgeber", @@ -6491,14 +6491,36 @@ "title": "Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper", "date": "Fri, 15 Aug 2025 16:00:00 +0200", "summary": "

Wer in Italien seinen Müll aus dem Wohnmobil oder Zugfahrzeug wirft, riskiert künftig mehr als nur ein schlechtes Gewissen. Seit August 2025 gelten neue Vorschriften – und die haben es in sich.

", - "text": "Mancher Camper kennt ähnliche Situationen: Kurz vor der Abfahrt vom Stellplatz muss der Müll aus dem Fahrzeug entsorgt werden. Auf dem Weg zum Container fällt einem auf, dass das Landstromkabel noch am Wohnmobil hängt. Also packt man an: Kabel weg, rein in die Heckgarage, Klappe zu und danach den Müllbeutel neben dem Fahrzeug vergessen. Natürlich ist das ein Versehen. Genau das könnte in Italien sehr teuer werden – bis zu 18.000 Euro. Italien zieht die Reißleine: Um die wachsende Vermüllung entlang von Straßen, Seen und Küsten einzudämmen, hat die Regierung ein Gesetzespaket verabschiedet. Das \"decreto-legge 8 agosto 2025, n. 116\" verschärft die Straßenverkehrsordnung und betrifft auch alle Reisenden mit Wohnmobil – und zwar unmittelbar. Im Extremfall droht das Gefängnis Das Gesetzesdekret verbietet es ausdrücklich, Abfälle jeglicher Art – vom Kaugummi bis zum vollen Müllsack – aus fahrenden oder parkenden Fahrzeugen zu entsorgen. Dabei spielt es keine Rolle, ob der Fahrende oder ein Mitfahrender verantwortlich ist. Für Reisende mit Wohnmobil, die häufig in der Natur stehen oder auf abgelegenen Stellplätzen übernachten, wird das schnell zur Falle. Das Bußgeld für Wohnmobil-Reisende in Italien kann dabei schnell fünfstellig ausfallen. Bei nachweislicher Gefährdung von Umwelt oder Tieren drohen sogar strafrechtliche Konsequenzen. Warum gerade Wohnmobile betroffen sind Camperinnen und Camper frühstücken, kochen und grillen in und rund um ihre Wohnmobile. Im Camperalltag fällt besonders bei längeren Standseiten so viel Unrat an, dass der Mülleimer voll wird – Küchenreste, Verpackungen oder Sanitärabfälle inklusive. Wer hier nicht sauber trennt oder nachlässig entsorgt, gefährdet nicht nur die Umwelt, sondern auch den eigenen Geldbeutel. Besonders strenge Strafen gelten in Naturschutzgebieten, an Flussufern oder in Meeresnähe – beliebte Reiseziele vieler Camper. Video statt Verkehrskontrolle: So wird überwacht Neu ist auch die Art der Kontrolle: Italien setzt auf Überwachungskameras, die entlang von Autobahnen, Parkplätzen und in Städten installiert sind. Diese Kameras erfassen das Kennzeichen – und schon reicht ein aufgezeichneter Verstoß, um einen Bußgeldbescheid auszulösen. Für Camper, die mit gemieteten Fahrzeugen unterwegs sind, wird es besonders heikel: Die Strafe landet direkt beim Vermieter, oft mit zusätzlicher Bearbeitungsgebühr. Ein kurzer Halt am Straßenrand – und ein unachtsam entsorgtes Taschentuch – kann so mehrere Hundert Euro kosten. Regeln in Deutschland: weniger einheitlich, aber nicht harmlos In Deutschland ist das Wegwerfen von Müll aus dem Fahrzeug verboten. Doch anders als in Italien fehlt eine zentrale Regelung: Die Strafen variieren von Bundesland zu Bundesland. Während in Bayern schon 50 Euro für eine Zigarettenkippe fällig werden, bleibt es in anderen Regionen bei einer Ermahnung. Bei illegaler Entsorgung größerer Abfälle drohen auch hier empfindliche Strafen – bis zu 1.000 Euro, wenn Naturschutzgesetze greifen. Im direkten Vergleich zeigt sich jedoch: Die Strafen für Müllentsorgung beim Camping sind in Italien 2025 nicht nur strenger – sie werden auch konsequenter durchgesetzt.", - "tags": [], - "status": "New", + "text": "Für Camper, die sich in Italien aufhalten, könnte das Vergessen eines Müllbeutels neben ihrem Fahrzeug ein kostspieliges Versehen werden, das bis zu 18.000 Euro kosten kann. Dies ist auf ein neues Gesetzespaket zurückzuführen, das die italienische Regierung eingeführt hat, um die zunehmende Verschmutzung an Straßen, Seen und Küsten zu bekämpfen. Dieses Gesetz, das \"decreto-legge 8 agosto 2025, n. 116\", verschärft die Straßenverkehrsordnung und betrifft alle Wohnmobilreisenden unmittelbar. Es verbietet ausdrücklich, Abfälle aller Art, von Kaugummi bis zu vollen Müllsäcken, aus fahrenden oder parkenden Fahrzeugen zu entsorgen, unabhängig davon, ob der Fahrer oder der Beifahrer dafür verantwortlich ist. Bei nachgewiesener Gefährdung von Umwelt oder Tieren können sogar strafrechtliche Konsequenzen drohen. \n\nBesonders Wohnmobilbenutzer sind betroffen, da sie beim Kochen, Grillen und bei längeren Aufenthalten viel Abfall produzieren. Wer seinen Abfall nicht ordnungsgemäß entsorgt, gefährdet nicht nur die Umwelt, sondern auch seinen Geldbeutel. Die Strafen sind besonders streng in Naturparks, an Flussufern oder in der Nähe des Meeres – alles beliebte Reiseziele für Camper. \n\nItalien setzt zur Überwachung auf Kameras, die entlang von Autobahnen, auf Parkplätzen und in Städten installiert sind und die ein Fahrzeugkennzeichen erfassen können. Ein aufgezeichneter Verstoß kann ausreichen, um einen Bußgeldbescheid auszulösen. Für Camper, die gemietete Fahrzeuge benutzen, kann dies besonders problematisch sein, da die Strafe direkt an den Vermieter geht, oft mit zusätzlichen Bearbeitungsgebühren.\n\nIn Deutschland ist das Wegwerfen von Müll aus dem Fahrzeug ebenfalls verboten, aber es gibt keine einheitliche Regelung und die Strafen variieren je nach Bundesland. Bei illegaler Entsorgung größerer Abfälle können Strafen bis zu 1.000 Euro drohen, insbesondere wenn Naturschutzgesetze verletzt werden. Im Vergleich zu Italien sind die Strafen in Deutschland jedoch weniger streng und werden weniger konsequent durchgesetzt.", + "tags": [ + "Italien", + "Camping", + "Müllentsorgung", + "Straßenverkehrsordnung", + "Umweltschutz" + ], + "status": "Process", "link": "https://www.promobil.de/weitere-ratgeber/neue-bussgelder-in-italien-falsche-muellentsorgung-aus-dem-wohnmobil-wird-besonders-teuer/", "images": [], "source": "https://www.promobil.de/rss/ratgeber", "source_name": "ratgeber bei www.promobil.de", "created_at": "2025-08-16T12:49:47.652064", - "word_count": 451 + "word_count": 275, + "rewritten_at": "2025-08-18T10:30:43.148097" + }, + { + "id": "13aafca64dc26e25ebc74baabef3257f", + "title": "Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub?", + "date": "Sun, 17 Aug 2025 16:00:00 +0200", + "summary": "

Wie sieht Ihr perfekter Campingtag aus? Lassen Sie uns wissen, was Sie im Urlaub glücklich macht und machen Sie mit bei unserer Umfrage.

", + "text": "Beim Campen ist kein Tag wie der andere und für jeden wird er in einer anderen Art und Weise zum perfekten Campingtag: entspannt und gemütlich, sportlich und abenteuerlich, kulturell bereichernd oder minimalistisch. Was gehört für Sie zu einem perfekten Campingtag? An welche Erlebnisse und Begegnungen an einem solchen Tag denken Sie besonders gerne zurück? Schwimmen und paddeln im Wasser oder chillen am Strand? Campingplätze am Wasser sind perfekt, um Erholung und Aktivitäten im Wasser miteinander zu kombinieren. Ob direkt am Meer, an einem idyllischen See oder am Fluss: Die Nähe zum Wasser lädt zu Wassersportaktivitäten einerseits und zur Entspannung andererseits ein. Springen Sie morgens als eine der Ersten ins Wasser oder sind Sie die letzte, die ihr Strandtuch ausbreitet? Genießen Sie den Sonnenuntergang beim Stand-up-paddeln oder setzen Sie am Surfbrett die Segel, sobald der Wind weht? Oder verbringen Sie am liebsten den Tag in der Sonnenliege mit einem guten Buch und einer gelegentlichen Erfrischung im Wasser? Wie sieht Ihr perfekter Tag beim Camping am Meer, See oder Fluss aus? Bergtour, Mountainbikerunde oder Kletterwand? Camping in den Bergen verspricht das Gefühl von Freiheit inmitten unberührter Natur. Zwischen schroffen Gipfeln, blühenden Almwiesen und kristallklaren Bergseen gibt es zahlreiche Möglichkeiten einen Urlaubstag zu gestalten. Suchen Sie im Campingurlaub die sportliche Herausforderung? Oder brechen Sie lieber zu einer entspannten und einfachen Wandertour mit gemütlichem Picknick auf? Suchen Sie die Herausforderung beim Klettern? Wie sieht Ihr perfekter Campingtag in den Bergen aus? Stadtführung, Museumsbesuch oder kulinarische Entdeckungsreise? Wer im Campingurlaub historische Gebäude, Museen, Parks und Plätze in der Stadt entdecken will, findet in vielen europäischen Städten Campingplätze oder Stellplätze am Stadtrand oder mittendrin. Sie sind der perfekte Ausgangspunkt, um lebendige Stadtviertel zu entdecken, auf quirligen Märkten einzukaufen und gute Restaurants zu besuchen. Gehört für Sie zu Ihrem perfekten Campingtag der Besuch einer lebendigen Stadt dazu? Lassen Sie sich in der Stadt einfach treiben oder sind sie lieber mit einem professionellen Gästeführer unterwegs? Fahren Sie mit dem Fahrrad, dem Segway oder öffentlichen Verkehrsmitteln durch die Stadt oder bewältigen Sie die Besichtigung zu Fuß? Schreiben Sie uns! Bei der Umfrage mitmachen und gewinnen! Wie sieht Ihr perfekter Campingtag aus? Führt er Sie ans Wasser, in die Berge oder in sehenswerte Städte? Oder an einen ganz anderen Ort? Was darf an einem perfekten Campingtag auf keinen Fall fehlen? Skizzieren Sie in ein paar Sätzen, was für Sie einen Campingtag perfekt macht! Senden Sie uns Ihre Meinung bis zum 25. August 2025 per E-Mail an thema-des-monats@promobil.de . Unter allen Einsendungen verlosen wir eines unserer aktuellen promobil-Sonderhefte nach Wunsch und Verfügbarkeit. Bitte fügen Sie Ihrer Einsendung möglichst ein Porträtfoto von sich bei, das wir zusammen mit Ihrem Meinungsbeitrag in promobil veröffentlichen dürfen; Ihre Chance auf Veröffentlichung erhöht sich dadurch. Datenschutzhinweis: Wenn Sie uns eine Anfrage stellen oder ein Feedback geben, speichern wir Ihre Kontaktdaten und Ihren Text (Art. 6 Abs. 1 lit. f DSGVO). Ihre Zuschrift hilft uns, unser Informationsangebot in unseren Medien zu verbessern. Wir geben Ihre Daten nicht an Dritte weiter. Wir behalten uns vor, Ihre Zuschrift zusammen mit Ihrem Namen in unseren Zeitschriften promobil und CARAVANING und gegebenenfalls auch auf unserer Website www.promobil.de, sowie unseren Social-Media-Kanälen zu veröffentlichen. Sie können der Speicherung Ihrer Daten jederzeit mit Wirkung für die Zukunft widersprechen (datenschutz@motorpresse.de). Wir werden dann die gespeicherten Daten umgehend löschen. Im Übrigen löschen wir Ihre Daten spätestens nach Ablauf eines halben Jahres bzw. im Falle einer Veröffentlichung im Internet, wenn wir der Ansicht sind, dass die Frage nicht mehr interessant für unsere NutzerInnen ist. Mehr zum Datenschutz unter www.promobil.de/datenschutz .", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/ihr-perfekter-campingtag-mitmachen-und-gewinnen/", + "images": [], + "source": "https://www.promobil.de/rss/ratgeber", + "source_name": "ratgeber bei www.promobil.de", + "created_at": "2025-08-18T10:29:00.444125", + "word_count": 583 } ] \ No newline at end of file diff --git a/logs/rss_tool.log b/logs/rss_tool.log index 68879b4..2a2db22 100644 --- a/logs/rss_tool.log +++ b/logs/rss_tool.log @@ -800,3 +800,246 @@ die Großen 2025-08-16 12:58:20,454 - INFO - upload_articles_to_wp:446 - 💾 Artikel-Status nach WordPress-Upload aktualisiert 2025-08-16 12:58:22,520 - INFO - load_articles:124 - ✅ 55 Artikel geladen 2025-08-16 12:58:22,522 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:19:39,440 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:19:39,441 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:19:51,265 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:19:51,265 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:20:06,243 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:20:06,243 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:20:11,966 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:20:11,967 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:28:16,106 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:28:16,106 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:28:36,927 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:28:36,927 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:28:44,165 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:28:44,165 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:28:44,182 - INFO - save_articles:144 - ✅ 55 Artikel gespeichert +2025-08-18 10:28:44,737 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:28:44,738 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:28:53,869 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:28:53,869 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:28:53,871 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-18 10:28:53,871 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:28:53,873 - INFO - load_articles:124 - ✅ 55 Artikel geladen +2025-08-18 10:28:53,873 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-18 10:28:54,239 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-18 10:28:54,239 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-18 10:28:54,241 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-18 10:28:54,242 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-18 10:28:54,242 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-18 10:28:54,243 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-18 10:28:54,243 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-18 10:28:54,244 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-18 10:28:54,244 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-18 10:28:54,245 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-18 10:28:54,245 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-18 10:28:54,246 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-18 10:28:54,246 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-18 10:28:55,249 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-18 10:28:55,593 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-18 10:28:55,593 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-18 10:28:55,594 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-18 10:28:55,594 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-18 10:28:55,763 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:55,764 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:55,765 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-18 10:28:55,766 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-18 10:28:55,766 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-18 10:28:55,766 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-18 10:28:55,766 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-18 10:28:55,936 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:55,937 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:55,938 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-18 10:28:55,938 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-18 10:28:55,938 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-18 10:28:55,939 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-18 10:28:55,939 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-18 10:28:56,195 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:56,195 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:56,196 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-18 10:28:56,196 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-18 10:28:56,196 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-18 10:28:56,196 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-18 10:28:56,197 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-18 10:28:56,353 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:56,353 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:56,354 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-18 10:28:56,354 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-18 10:28:56,354 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-18 10:28:56,354 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-18 10:28:56,354 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-18 10:28:56,612 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:56,612 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:56,613 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-18 10:28:56,614 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-18 10:28:56,614 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-18 10:28:56,614 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-18 10:28:56,614 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-18 10:28:56,759 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:56,760 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:56,760 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-18 10:28:56,760 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-18 10:28:56,760 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-18 10:28:56,760 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-18 10:28:56,760 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-18 10:28:57,056 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:57,057 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:57,057 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-18 10:28:57,057 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-18 10:28:57,057 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-18 10:28:57,060 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-18 10:28:57,060 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-18 10:28:57,061 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-18 10:28:57,061 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-18 10:28:57,253 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:57,255 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:57,258 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-18 10:28:57,258 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-18 10:28:57,258 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-18 10:28:57,259 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-18 10:28:57,259 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-18 10:28:57,423 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:57,424 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:57,426 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-18 10:28:57,426 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-18 10:28:57,426 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-18 10:28:57,426 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-18 10:28:57,426 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-18 10:28:57,590 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:57,590 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:57,591 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-18 10:28:57,591 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-18 10:28:57,592 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-18 10:28:57,592 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-18 10:28:57,592 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-18 10:28:57,740 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:57,741 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:57,742 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-18 10:28:57,743 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-18 10:28:57,743 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-18 10:28:57,743 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-18 10:28:57,744 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-18 10:28:57,744 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-18 10:28:57,904 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:57,905 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:57,905 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-18 10:28:57,906 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-18 10:28:57,906 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-18 10:28:57,906 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-18 10:28:57,906 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-18 10:28:58,106 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:58,108 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:58,109 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-18 10:28:58,110 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-18 10:28:58,110 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-18 10:28:58,110 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-18 10:28:58,110 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-18 10:28:58,244 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:58,245 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:58,246 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-18 10:28:58,246 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-18 10:28:58,246 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-18 10:28:58,246 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-18 10:28:58,246 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-18 10:28:58,410 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:58,411 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:58,411 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-18 10:28:58,412 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-18 10:28:58,412 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-18 10:28:58,412 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-18 10:28:58,412 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-18 10:28:58,600 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:58,601 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:58,602 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-18 10:28:58,602 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-18 10:28:58,602 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-18 10:28:58,603 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-18 10:28:58,603 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-18 10:28:58,779 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:58,781 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:58,782 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-18 10:28:58,782 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-18 10:28:58,783 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-18 10:28:58,783 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-18 10:28:58,783 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-18 10:28:58,932 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:58,933 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:58,933 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-18 10:28:58,933 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-18 10:28:58,934 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-18 10:28:58,934 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-18 10:28:58,934 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-18 10:28:59,086 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-18 10:28:59,087 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-18 10:28:59,088 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-18 10:28:59,088 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-18 10:28:59,088 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-18 10:28:59,091 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-18 10:28:59,091 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-18 10:28:59,091 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-18 10:29:00,097 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-18 10:29:00,443 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-18 10:29:00,443 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-18 10:29:00,444 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.promobil.de/weitere-ratgeber/ihr-perfekter-campingtag-mitmachen-und-gewinnen/ +2025-08-18 10:29:00,597 - INFO - extract_images_with_metadata:167 - 🔍 13 img-Tags gefunden +2025-08-18 10:29:00,597 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Familie, Caravan, Camping... +2025-08-18 10:29:00,598 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-18 10:29:00,598 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.promobil.de/weitere-ratgeber/ihr-perfekter-campingtag-mitmachen-und-gewinnen/: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-18 10:29:00,598 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub?' extrahiert +2025-08-18 10:29:00,598 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-18 10:29:00,599 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-18 10:29:00,601 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-18 10:29:00,602 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-18 10:29:00,603 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-18 10:29:00,605 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-18 10:29:00,606 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-18 10:29:00,607 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-18 10:29:00,608 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-18 10:29:00,609 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-18 10:29:00,611 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-18 10:29:00,612 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-18 10:29:00,613 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-18 10:29:00,614 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-18 10:29:00,615 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-18 10:29:00,619 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-18 10:29:00,620 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dethleffs Reiselust-Prämie: Bis zu 20.000 Euro Rabatt auf Wohnmobile +2025-08-18 10:29:00,621 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue promobil-Newsletter - gratis!: Zum Frühstück die spannendsten Camping-Themen +2025-08-18 10:29:00,622 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Drittes Camping-Rekordjahr in Folge: Süd schlägt Nord – Hier wird am häufigsten gecampt +2025-08-18 10:29:00,623 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Wohnmobil-Handel treibt Vorzelt-Profi in Insolvenz: Camping-Ausrüster Herzog beantragt Insolvenz +2025-08-18 10:29:00,623 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-18 10:29:01,642 - INFO - save_articles:144 - ✅ 56 Artikel gespeichert +2025-08-18 10:29:01,642 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 1 neue Artikel in 7.77s hinzugefügt +2025-08-18 10:29:02,707 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:29:02,708 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:29:11,757 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:29:11,758 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:29:23,980 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:29:23,981 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:29:53,208 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:29:53,212 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:29:53,234 - INFO - save_articles:144 - ✅ 56 Artikel gespeichert +2025-08-18 10:29:53,810 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:29:53,810 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:29:58,377 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:29:58,377 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:30:13,131 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:30:13,132 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:30:13,149 - INFO - save_articles:144 - ✅ 56 Artikel gespeichert +2025-08-18 10:30:13,725 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:30:13,725 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:30:23,300 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:30:23,301 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:30:23,304 - INFO - rewrite_articles:320 - ✍️ Starte Artikel-Umschreibung +2025-08-18 10:30:23,306 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:30:23,306 - INFO - rewrite_articles:337 - ✍️ Umschreiben von: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-18 10:30:40,498 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-18 10:30:43,146 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-18 10:30:43,148 - INFO - rewrite_articles:392 - ✅ Artikel erfolgreich umgeschrieben: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-18 10:30:45,172 - INFO - save_articles:144 - ✅ 56 Artikel gespeichert +2025-08-18 10:30:45,172 - INFO - rewrite_articles:404 - 🎉 1 Artikel erfolgreich umgeschrieben +2025-08-18 10:30:46,246 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:30:46,246 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-18 10:30:55,147 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-18 10:30:55,147 - INFO - load_feeds:93 - ✅ 3 Feeds geladen diff --git a/pages/01_feed_manager.py b/pages/01_feed_manager.py index ffe7d51..255dd73 100644 --- a/pages/01_feed_manager.py +++ b/pages/01_feed_manager.py @@ -2,8 +2,13 @@ import streamlit as st from main import load_feeds, save_feeds, load_articles +from utils.css_loader import load_css, apply_dark_theme import logging +# === CSS & Theme laden === +load_css() +apply_dark_theme() + # === Logging vorbereiten === log_dir = "logs" log_file = f"{log_dir}/rss_tool.log" @@ -15,17 +20,29 @@ logging.basicConfig( st.set_page_config(page_title="📡 Feed-Verwaltung") -st.title("📡 RSS Feed-Verwaltung") +# Header +st.markdown(""" +
+

📡 RSS Feed-Verwaltung

+

Verwalte deine RSS-Feeds zentral und effizient

+
+""", unsafe_allow_html=True) + feeds = load_feeds() articles = load_articles() # === Neuen Feed hinzufügen === +st.markdown('
', unsafe_allow_html=True) st.subheader("➕ Neuen Feed hinzufügen") with st.form("add_feed_form"): - new_url = st.text_input("Feed URL", "") - new_name = st.text_input("Feed Name", "") - submitted = st.form_submit_button("Feed hinzufügen") + col1, col2 = st.columns(2) + with col1: + new_url = st.text_input("Feed URL", "", placeholder="https://example.com/feed.xml") + with col2: + new_name = st.text_input("Feed Name", "", placeholder="Beispiel News") + + submitted = st.form_submit_button("Feed hinzufügen", use_container_width=True) if submitted: if new_url and new_name: if not any(f.get("url") == new_url for f in feeds): @@ -39,33 +56,185 @@ with st.form("add_feed_form"): else: st.error("❌ Bitte gib sowohl URL als auch Name ein.") +st.markdown('
', unsafe_allow_html=True) + # === Bestehende Feeds bearbeiten === -st.subheader("🛠️ Vorhandene Feeds bearbeiten oder löschen") +st.subheader("🛠️ Vorhandene Feeds verwalten") -for idx, feed in enumerate(feeds): - with st.expander(f"🔗 {feed.get('name')}"): - url = st.text_input(f"Feed-URL {idx}", value=feed.get("url"), key=f"url_{idx}") - name = st.text_input(f"Feed-Name {idx}", value=feed.get("name"), key=f"name_{idx}") - count = sum(1 for a in articles if a.get("source") == feed.get("url")) - - col1, col2 = st.columns(2) +if not feeds: + st.info("Noch keine Feeds konfiguriert. Füge oben deinen ersten Feed hinzu!") +else: + for idx, feed in enumerate(feeds): + feed_url = feed.get("url", "") + feed_name = feed.get("name", "Unbekannt") + article_count = sum(1 for a in articles if a.get("source") == feed_url) + + # Feed Card + st.markdown(f""" +
+
+
+

{feed_name}

+ +
+
+ {article_count} Artikel +
+
+ +
+ """, unsafe_allow_html=True) + + # Actions + col1, col2, col3 = st.columns(3) with col1: - if st.button("💾 Änderungen speichern", key=f"save_{idx}"): - old_url, old_name = feed.get("url"), feed.get("name") - feeds[idx]["url"] = url - feeds[idx]["name"] = name - save_feeds(feeds) - logging.info(f"✏️ Feed geändert: '{old_name}' ({old_url}) → '{name}' ({url})") - st.success("Änderungen gespeichert.") - st.rerun() + if st.button("💾 Bearbeiten", key=f"edit_{idx}", use_container_width=True): + st.session_state[f"edit_mode_{idx}"] = not st.session_state.get(f"edit_mode_{idx}", False) with col2: - if st.button("🗑️ Feed löschen", key=f"delete_{idx}"): - deleted_feed = feeds.pop(idx) - save_feeds(feeds) - logging.info(f"❌ Feed gelöscht: {deleted_feed.get('name')} ({deleted_feed.get('url')})") - st.warning("Feed gelöscht.") - st.rerun() + if st.button("🔄 Aktualisieren", key=f"refresh_{idx}", use_container_width=True): + with st.spinner(f"Aktualisiere Feed '{feed_name}'..."): + # Hier könntest du eine einzelne Feed-Update-Funktion implementieren + from main import process_articles + existing_ids = [a["id"] for a in articles] + process_articles(existing_ids) + st.success(f"Feed '{feed_name}' aktualisiert!") + st.rerun() - st.caption(f"📰 Verknüpfte Artikel: {count}") + with col3: + if st.button("🗑️ Löschen", key=f"delete_{idx}", use_container_width=True): + # Bestätigung über Session State + if not st.session_state.get(f"confirm_delete_{idx}", False): + st.session_state[f"confirm_delete_{idx}"] = True + st.warning(f"Klicke erneut um '{feed_name}' wirklich zu löschen!") + else: + deleted_feed = feeds.pop(idx) + save_feeds(feeds) + logging.info(f"❌ Feed gelöscht: {deleted_feed.get('name')} ({deleted_feed.get('url')})") + st.success(f"Feed '{feed_name}' wurde gelöscht.") + # Cleanup Session State + if f"confirm_delete_{idx}" in st.session_state: + del st.session_state[f"confirm_delete_{idx}"] + st.rerun() + + # Edit Form (wenn aktiviert) + if st.session_state.get(f"edit_mode_{idx}", False): + st.markdown('
', unsafe_allow_html=True) + st.write("**Feed bearbeiten:**") + + with st.form(f"edit_form_{idx}"): + col1, col2 = st.columns(2) + with col1: + edited_url = st.text_input("Feed-URL", value=feed_url, key=f"edit_url_{idx}") + with col2: + edited_name = st.text_input("Feed-Name", value=feed_name, key=f"edit_name_{idx}") + + form_col1, form_col2 = st.columns(2) + with form_col1: + if st.form_submit_button("💾 Änderungen speichern", use_container_width=True): + old_url, old_name = feed.get("url"), feed.get("name") + feeds[idx]["url"] = edited_url + feeds[idx]["name"] = edited_name + save_feeds(feeds) + logging.info(f"✏️ Feed geändert: '{old_name}' ({old_url}) → '{edited_name}' ({edited_url})") + st.success("Änderungen gespeichert!") + st.session_state[f"edit_mode_{idx}"] = False + st.rerun() + + with form_col2: + if st.form_submit_button("❌ Abbrechen", use_container_width=True): + st.session_state[f"edit_mode_{idx}"] = False + st.rerun() + + st.markdown('
', unsafe_allow_html=True) + +# === Feed-Statistiken === +if feeds: + st.markdown("---") + st.subheader("📊 Feed-Statistiken") + + col1, col2, col3 = st.columns(3) + + with col1: + st.markdown(""" +
+
{}
+
Feeds Gesamt
+
+ """.format(len(feeds)), unsafe_allow_html=True) + + with col2: + total_articles = len(articles) + st.markdown(""" +
+
{}
+
Artikel Gesamt
+
+ """.format(total_articles), unsafe_allow_html=True) + + with col3: + avg_articles = total_articles // len(feeds) if feeds else 0 + st.markdown(""" +
+
{}
+
Ø Artikel pro Feed
+
+ """.format(avg_articles), unsafe_allow_html=True) + +# === Bulk Actions === +if feeds: + st.markdown("---") + st.subheader("⚡ Bulk-Aktionen") + + col1, col2 = st.columns(2) + + with col1: + if st.button("🔄 Alle Feeds aktualisieren", use_container_width=True): + with st.spinner("Aktualisiere alle Feeds..."): + from main import process_articles + existing_ids = [a["id"] for a in articles] + process_articles(existing_ids) + st.success(f"Alle {len(feeds)} Feeds wurden aktualisiert!") + st.rerun() + + with col2: + if st.button("📊 Feed-Performance anzeigen", use_container_width=True): + st.subheader("📈 Feed-Performance") + + # Performance-Daten sammeln + feed_performance = [] + for feed in feeds: + feed_url = feed.get("url", "") + feed_name = feed.get("name", "Unbekannt") + feed_articles = [a for a in articles if a.get("source") == feed_url] + + performance = { + "name": feed_name, + "url": feed_url, + "total_articles": len(feed_articles), + "new_articles": len([a for a in feed_articles if a.get("status") == "New"]), + "processed_articles": len([a for a in feed_articles if a.get("status") in ["Process", "Online", "WordPress Pending"]]) + } + feed_performance.append(performance) + + # Sortiere nach Artikel-Anzahl + feed_performance.sort(key=lambda x: x["total_articles"], reverse=True) + + # Anzeige als Cards + for perf in feed_performance: + success_rate = (perf["processed_articles"] / perf["total_articles"] * 100) if perf["total_articles"] > 0 else 0 + + st.markdown(f""" +
+

{perf["name"]}

+ +
+ """, unsafe_allow_html=True) \ No newline at end of file diff --git a/pages/log_viewer.py b/pages/log_viewer.py index fea50c7..5763825 100644 --- a/pages/log_viewer.py +++ b/pages/log_viewer.py @@ -1,23 +1,297 @@ -# log_viewer.py +# pages/log_viewer.py import streamlit as st import os +from utils.css_loader import load_css, apply_dark_theme +from datetime import datetime + +# === CSS & Theme laden === +load_css() +apply_dark_theme() st.set_page_config(page_title="🧾 Log Viewer", layout="wide") -st.title("🧾 Letzte Logeinträge anzeigen") + +# Header +st.markdown(""" +
+

🧾 Log Viewer

+

Überwache Systemaktivitäten und Debug-Informationen

+
+""", unsafe_allow_html=True) LOG_FILE = "logs/rss_tool.log" MAX_LINES = 500 -if not os.path.exists(LOG_FILE): - st.warning("Keine Logdatei gefunden.") -else: - with open(LOG_FILE, "r") as f: - lines = f.readlines() +# === Log-Datei Kontrollen === +st.markdown('
', unsafe_allow_html=True) +st.subheader("📁 Log-Datei Optionen") - st.write(f"Letzte {min(len(lines), MAX_LINES)} Zeilen aus `{LOG_FILE}`:") +col1, col2, col3, col4 = st.columns(4) - st.code("".join(lines[-MAX_LINES:]), language="text") +with col1: + lines_to_show = st.selectbox( + "Anzahl Zeilen", + [50, 100, 200, 500, 1000], + index=3, # Default: 500 + key="lines_select" + ) - if st.button("🔄 Neu laden"): +with col2: + if st.button("🔄 Neu laden", use_container_width=True): st.rerun() + +with col3: + log_level_filter = st.selectbox( + "Log Level Filter", + ["Alle", "INFO", "WARNING", "ERROR", "DEBUG"], + key="level_filter" + ) + +with col4: + search_term = st.text_input( + "Suche in Logs", + placeholder="Suchbegriff...", + key="log_search" + ) + +st.markdown('
', unsafe_allow_html=True) + +# === Log-Datei Status === +if not os.path.exists(LOG_FILE): + st.markdown(""" +
+ ⚠️ Keine Log-Datei gefunden
+
+ Die Log-Datei wurde noch nicht erstellt oder befindet sich an einem anderen Ort.
+ Erwarteter Pfad: {} +
+
+ """.format(LOG_FILE), unsafe_allow_html=True) +else: + # Datei-Informationen + file_size = os.path.getsize(LOG_FILE) + file_mtime = datetime.fromtimestamp(os.path.getmtime(LOG_FILE)) + + col1, col2, col3 = st.columns(3) + + with col1: + st.markdown(""" +
+
{:.1f} KB
+
Dateigröße
+
+ """.format(file_size / 1024), unsafe_allow_html=True) + + with col2: + st.markdown(""" +
+
{}
+
Letzte Änderung
+
+ """.format(file_mtime.strftime("%H:%M:%S")), unsafe_allow_html=True) + + with col3: + # Zeilen zählen + try: + with open(LOG_FILE, "r", encoding="utf-8") as f: + total_lines = sum(1 for _ in f) + except: + total_lines = 0 + + st.markdown(""" +
+
{}
+
Zeilen Gesamt
+
+ """.format(total_lines), unsafe_allow_html=True) + + # === Log-Inhalt anzeigen === + try: + with open(LOG_FILE, "r", encoding="utf-8") as f: + lines = f.readlines() + + # Filter anwenden + filtered_lines = [] + + for line in lines: + # Log Level Filter + if log_level_filter != "Alle": + if f" - {log_level_filter} - " not in line: + continue + + # Suchfilter + if search_term and search_term.lower() not in line.lower(): + continue + + filtered_lines.append(line) + + # Anzahl begrenzen + display_lines = filtered_lines[-lines_to_show:] if len(filtered_lines) > lines_to_show else filtered_lines + + # Header für Log-Anzeige + st.subheader(f"📋 Log-Einträge ({len(display_lines)} von {len(filtered_lines)} gefilterten Zeilen)") + + if display_lines: + # Log-Inhalt mit Syntax-Highlighting + log_content = "".join(display_lines) + + # Farbkodierung für verschiedene Log-Level + colored_content = log_content + colored_content = colored_content.replace(" - ERROR - ", " - 🔴 ERROR - ") + colored_content = colored_content.replace(" - WARNING - ", " - 🟡 WARNING - ") + colored_content = colored_content.replace(" - INFO - ", " - 🔵 INFO - ") + colored_content = colored_content.replace(" - DEBUG - ", " - ⚪ DEBUG - ") + + # Log in Card anzeigen + st.markdown(""" +
+

📄 Log-Ausgabe

+ +
+ """.format( + count=len(display_lines), + level=log_level_filter, + search=search_term or "Keine" + ), unsafe_allow_html=True) + + # Code-Block mit Logs + st.code(colored_content, language="text") + + # Download-Button + st.download_button( + label="💾 Log-Datei herunterladen", + data=log_content, + file_name=f"rss_tool_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt", + mime="text/plain", + use_container_width=True + ) + + else: + st.markdown(""" +
+ 🔍 Keine Log-Einträge gefunden
+
+ Mit den aktuellen Filtern wurden keine Log-Einträge gefunden.
+ Versuche andere Filter-Einstellungen. +
+
+ """, unsafe_allow_html=True) + + except Exception as e: + st.markdown(f""" +
+ ❌ Fehler beim Lesen der Log-Datei
+
+ {str(e)} +
+
+ """, unsafe_allow_html=True) + +# === Log-Level Erklärung === +with st.expander("ℹ️ Log-Level Erklärung", expanded=False): + st.markdown(""" +
+

📖 Log-Level Bedeutung

+
+ 🔵 INFO: Normale Programmaktivitäten (Feed-Updates, Artikel verarbeitet)
+ 🟡 WARNING: Potentielle Probleme (Duplikate, fehlende Daten)
+ 🔴 ERROR: Fehler die das Programm beeinträchtigen
+ ⚪ DEBUG: Detaillierte Entwickler-Informationen +
+
+ """, unsafe_allow_html=True) + +# === Log-Datei verwalten === +st.markdown("---") +st.subheader("🛠️ Log-Datei Verwaltung") + +col1, col2, col3 = st.columns(3) + +with col1: + if st.button("🗑️ Log-Datei leeren", use_container_width=True): + if st.button("⚠️ Wirklich leeren?", key="confirm_clear"): + try: + with open(LOG_FILE, "w", encoding="utf-8") as f: + f.write("") + st.success("Log-Datei wurde geleert!") + st.rerun() + except Exception as e: + st.error(f"Fehler beim Leeren der Log-Datei: {e}") + +with col2: + if st.button("📦 Log archivieren", use_container_width=True): + try: + archive_name = f"rss_tool_log_archive_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt" + with open(LOG_FILE, "r", encoding="utf-8") as f: + log_data = f.read() + + st.download_button( + label=f"💾 {archive_name}", + data=log_data, + file_name=archive_name, + mime="text/plain", + key="archive_download" + ) + except Exception as e: + st.error(f"Fehler beim Archivieren: {e}") + +with col3: + if st.button("📊 Log-Statistiken", use_container_width=True): + if os.path.exists(LOG_FILE): + try: + with open(LOG_FILE, "r", encoding="utf-8") as f: + all_lines = f.readlines() + + # Statistiken berechnen + total_lines = len(all_lines) + info_count = sum(1 for line in all_lines if " - INFO - " in line) + warning_count = sum(1 for line in all_lines if " - WARNING - " in line) + error_count = sum(1 for line in all_lines if " - ERROR - " in line) + debug_count = sum(1 for line in all_lines if " - DEBUG - " in line) + + st.subheader("📈 Log-Statistiken") + + col1, col2, col3, col4 = st.columns(4) + + with col1: + st.markdown(""" +
+
{}
+
🔵 INFO
+
+ """.format(info_count), unsafe_allow_html=True) + + with col2: + st.markdown(""" +
+
{}
+
🟡 WARNING
+
+ """.format(warning_count), unsafe_allow_html=True) + + with col3: + st.markdown(""" +
+
{}
+
🔴 ERROR
+
+ """.format(error_count), unsafe_allow_html=True) + + with col4: + st.markdown(""" +
+
{}
+
⚪ DEBUG
+
+ """.format(debug_count), unsafe_allow_html=True) + + except Exception as e: + st.error(f"Fehler beim Berechnen der Statistiken: {e}") + +# === Auto-Refresh Option === +if st.checkbox("🔄 Auto-Refresh (30s)", key="auto_refresh"): + import time + time.sleep(30) + st.rerun() \ No newline at end of file diff --git a/static/styles.css b/static/styles.css new file mode 100644 index 0000000..d2cbe35 --- /dev/null +++ b/static/styles.css @@ -0,0 +1,491 @@ +/* =============================================== + RSS Feed Manager - Zentrale CSS-Datei + Dark-Mode optimiert mit Fallbacks + =============================================== */ + +/* === ROOT VARIABLEN === */ +:root { + /* Dark Mode Farbpalette */ + --bg-primary: #1e1e1e; + --bg-secondary: #2d2d30; + --bg-card: #2d2d30; + --bg-header: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + --bg-filter: #363636; + + /* Text Farben */ + --text-primary: #ffffff; + --text-secondary: #b0b0b0; + --text-muted: #888888; + --text-accent: #667eea; + + /* Status Farben */ + --status-new: #2196f3; + --status-new-bg: #1565c0; + --status-rewrite: #ff9800; + --status-rewrite-bg: #ef6c00; + --status-process: #9c27b0; + --status-process-bg: #6a1b9a; + --status-online: #4caf50; + --status-online-bg: #2e7d32; + --status-hold: #e91e63; + --status-hold-bg: #ad1457; + --status-trash: #f44336; + --status-trash-bg: #c62828; + --status-wp-pending: #00bcd4; + --status-wp-pending-bg: #0097a7; + + /* Borders & Shadows */ + --border-color: #404040; + --shadow-light: 0 2px 8px rgba(0, 0, 0, 0.3); + --shadow-hover: 0 8px 20px rgba(0, 0, 0, 0.4); + + /* Accent Colors */ + --gradient-primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + --gradient-secondary: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); +} + +/* === LIGHT MODE FALLBACKS === */ +[data-theme="light"], .stApp[data-theme="light"] { + --bg-primary: #ffffff; + --bg-secondary: #f8f9fa; + --bg-card: #ffffff; + --bg-filter: #f0f2f6; + + --text-primary: #212529; + --text-secondary: #495057; + --text-muted: #6c757d; + --text-accent: #667eea; + + --border-color: #dee2e6; + --shadow-light: 0 2px 8px rgba(0, 0, 0, 0.1); + --shadow-hover: 0 8px 20px rgba(0, 0, 0, 0.15); +} + +/* === GLOBALE RESETS === */ +* { + box-sizing: border-box; +} + +/* === HAUPTCONTAINER === */ +.main-header { + background: var(--bg-header); + padding: 2rem; + border-radius: 12px; + margin-bottom: 2rem; + color: var(--text-primary); + text-align: center; + box-shadow: var(--shadow-light); +} + +.main-header h1 { + color: var(--text-primary) !important; + margin: 0 0 0.5rem 0; + font-size: 2.5rem; + font-weight: 700; +} + +.main-header p { + color: rgba(255, 255, 255, 0.9) !important; + margin: 0; + font-size: 1.1rem; +} + +/* === ARTIKEL CARDS === */ +.article-card { + background: var(--bg-card) !important; + border-radius: 12px; + padding: 1.5rem; + margin-bottom: 1rem; + box-shadow: var(--shadow-light); + border-left: 4px solid var(--text-accent); + border: 1px solid var(--border-color); + transition: all 0.3s ease; + color: var(--text-primary) !important; +} + +.article-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-hover); + border-color: var(--text-accent); +} + +.article-card h3, +.article-card .article-title { + color: var(--text-primary) !important; + margin: 0 0 0.5rem 0; + font-size: 1.2rem; + font-weight: 600; + line-height: 1.4; +} + +.article-card .article-meta { + color: var(--text-secondary) !important; + font-size: 0.9rem; + margin-bottom: 1rem; +} + +.article-card .article-summary { + color: var(--text-secondary) !important; + line-height: 1.5; + margin-bottom: 1rem; +} + +.article-card .article-footer { + color: var(--text-muted) !important; + font-size: 0.85rem; + display: flex; + justify-content: space-between; + align-items: center; +} + +/* === STATUS BADGES === */ +.status-badge { + padding: 0.3rem 0.8rem; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 600; + margin-right: 0.5rem; + display: inline-block; + color: white !important; +} + +.status-new { + background-color: var(--status-new-bg) !important; + color: white !important; +} + +.status-rewrite { + background-color: var(--status-rewrite-bg) !important; + color: white !important; +} + +.status-process { + background-color: var(--status-process-bg) !important; + color: white !important; +} + +.status-online { + background-color: var(--status-online-bg) !important; + color: white !important; +} + +.status-hold { + background-color: var(--status-hold-bg) !important; + color: white !important; +} + +.status-trash { + background-color: var(--status-trash-bg) !important; + color: white !important; +} + +.status-wp-pending { + background-color: var(--status-wp-pending-bg) !important; + color: white !important; +} + +/* === FILTER SECTION === */ +.filter-section { + background: var(--bg-filter) !important; + padding: 1.5rem; + border-radius: 12px; + margin-bottom: 2rem; + border: 1px solid var(--border-color); + box-shadow: var(--shadow-light); +} + +.filter-section h3 { + color: var(--text-primary) !important; + margin: 0 0 1rem 0; + font-size: 1.3rem; + font-weight: 600; +} + +/* === STATS CARDS === */ +.stats-card { + background: var(--bg-card) !important; + padding: 1.5rem; + border-radius: 12px; + text-align: center; + box-shadow: var(--shadow-light); + border: 1px solid var(--border-color); + transition: transform 0.2s ease; +} + +.stats-card:hover { + transform: translateY(-2px); +} + +.stats-number { + font-size: 2.5rem; + font-weight: 700; + color: var(--text-accent) !important; + margin-bottom: 0.5rem; + display: block; +} + +.stats-card div:last-child { + color: var(--text-secondary) !important; + font-weight: 500; + font-size: 1rem; +} + +/* === WORDPRESS STATUS === */ +.wp-status { + background: var(--bg-card) !important; + padding: 1rem; + border-radius: 8px; + margin: 1rem 0; + border-left: 4px solid var(--status-wp-pending); + border: 1px solid var(--border-color); + box-shadow: var(--shadow-light); +} + +.wp-status strong { + color: var(--text-primary) !important; +} + +.wp-status small { + color: var(--text-muted) !important; +} + +/* === IMAGE GALLERY === */ +.image-gallery { + display: flex; + gap: 1rem; + overflow-x: auto; + padding: 1rem 0; +} + +.image-item { + min-width: 200px; + text-align: center; + background: var(--bg-card); + padding: 1rem; + border-radius: 8px; + border: 1px solid var(--border-color); +} + +.image-item img { + border-radius: 6px; + max-width: 100%; +} + +.image-item strong, +.image-item p { + color: var(--text-primary) !important; +} + +.image-item small { + color: var(--text-muted) !important; +} + +/* === BUTTONS & ACTIONS === */ +.action-button { + margin: 0.25rem; + border-radius: 6px; +} + +/* Streamlit Button Overrides */ +.stButton > button { + background: var(--gradient-primary) !important; + color: white !important; + border: none !important; + border-radius: 8px !important; + font-weight: 600 !important; + transition: all 0.2s ease !important; +} + +.stButton > button:hover { + transform: translateY(-1px) !important; + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4) !important; +} + +/* === SELECTBOX & INPUT OVERRIDES === */ +.stSelectbox > div > div { + background-color: var(--bg-card) !important; + color: var(--text-primary) !important; + border: 1px solid var(--border-color) !important; +} + +.stTextInput > div > div > input { + background-color: var(--bg-card) !important; + color: var(--text-primary) !important; + border: 1px solid var(--border-color) !important; +} + +/* === TABS === */ +.stTabs [data-baseweb="tab-list"] { + background-color: var(--bg-secondary) !important; + border-radius: 8px; + padding: 0.25rem; +} + +.stTabs [data-baseweb="tab"] { + color: var(--text-secondary) !important; + background-color: transparent !important; + border-radius: 6px !important; + font-weight: 600 !important; +} + +.stTabs [aria-selected="true"] { + background-color: var(--text-accent) !important; + color: white !important; +} + +/* === EXPANDER === */ +.streamlit-expanderHeader { + background-color: var(--bg-card) !important; + color: var(--text-primary) !important; + border: 1px solid var(--border-color) !important; + border-radius: 8px !important; +} + +.streamlit-expanderContent { + background-color: var(--bg-card) !important; + border: 1px solid var(--border-color) !important; + border-top: none !important; +} + +/* === METRICS === */ +.metric-container { + background: var(--bg-card) !important; + padding: 1rem; + border-radius: 8px; + border: 1px solid var(--border-color); + text-align: center; +} + +.metric-container [data-testid="metric-container"] { + background: transparent !important; +} + +.metric-container [data-testid="metric-container"] > div { + color: var(--text-primary) !important; +} + +/* === CODE BLOCKS === */ +.stCodeBlock { + background-color: var(--bg-secondary) !important; + border: 1px solid var(--border-color) !important; + border-radius: 8px; +} + +/* === SUCCESS/ERROR/WARNING/INFO === */ +.stAlert { + border-radius: 8px !important; + border: 1px solid var(--border-color) !important; +} + +.stSuccess { + background-color: rgba(76, 175, 80, 0.1) !important; + color: var(--status-online) !important; + border-color: var(--status-online) !important; +} + +.stError { + background-color: rgba(244, 67, 54, 0.1) !important; + color: var(--status-trash) !important; + border-color: var(--status-trash) !important; +} + +.stWarning { + background-color: rgba(255, 152, 0, 0.1) !important; + color: var(--status-rewrite) !important; + border-color: var(--status-rewrite) !important; +} + +.stInfo { + background-color: rgba(33, 150, 243, 0.1) !important; + color: var(--status-new) !important; + border-color: var(--status-new) !important; +} + +/* === SIDEBAR === */ +.css-1d391kg { + background-color: var(--bg-secondary) !important; +} + +.css-1d391kg .stMarkdown { + color: var(--text-primary) !important; +} + +/* === RESPONSIVE DESIGN === */ +@media (max-width: 768px) { + .main-header { + padding: 1.5rem; + } + + .main-header h1 { + font-size: 2rem; + } + + .article-card { + padding: 1rem; + } + + .stats-card { + padding: 1rem; + } + + .stats-number { + font-size: 2rem; + } +} + +/* === UTILITY CLASSES === */ +.text-primary { color: var(--text-primary) !important; } +.text-secondary { color: var(--text-secondary) !important; } +.text-muted { color: var(--text-muted) !important; } +.text-accent { color: var(--text-accent) !important; } + +.bg-card { background-color: var(--bg-card) !important; } +.bg-secondary { background-color: var(--bg-secondary) !important; } + +.border-radius { border-radius: 8px; } +.shadow-light { box-shadow: var(--shadow-light); } +.shadow-hover { box-shadow: var(--shadow-hover); } + +/* === SCROLLBAR STYLING === */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: var(--bg-secondary); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb { + background: var(--text-muted); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--text-secondary); +} + +/* === LOADING SPINNER === */ +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.loading-spinner { + border: 4px solid var(--bg-secondary); + border-top: 4px solid var(--text-accent); + border-radius: 50%; + width: 40px; + height: 40px; + animation: spin 1s linear infinite; + margin: 0 auto 1rem auto; +} + +/* === FOCUS STATES === */ +.stButton > button:focus, +.stSelectbox > div > div:focus, +.stTextInput > div > div > input:focus { + outline: 2px solid var(--text-accent) !important; + outline-offset: 2px !important; +} \ No newline at end of file diff --git a/utils/css_loader.py b/utils/css_loader.py new file mode 100644 index 0000000..84ebc90 --- /dev/null +++ b/utils/css_loader.py @@ -0,0 +1,367 @@ +# utils/css_loader.py + +import streamlit as st +import os +from pathlib import Path + +def load_css(): + """ + Lädt die zentrale CSS-Datei und injiziert sie in die Streamlit-App + """ + try: + # Pfad zur CSS-Datei bestimmen + css_file = Path(__file__).parent.parent / "static" / "styles.css" + + if css_file.exists(): + with open(css_file, "r", encoding="utf-8") as f: + css_content = f.read() + + # CSS in Streamlit injizieren + st.markdown(f""" + + """, unsafe_allow_html=True) + + return True + else: + # Fallback: CSS-Datei erstellen + create_css_file() + return load_css() # Rekursiver Aufruf nach Erstellung + + except Exception as e: + st.error(f"Fehler beim Laden der CSS-Datei: {e}") + return False + +def create_css_file(): + """ + Erstellt die CSS-Datei falls sie nicht existiert + """ + css_content = """/* =============================================== + RSS Feed Manager - Zentrale CSS-Datei + Dark-Mode optimiert mit Fallbacks + =============================================== */ + +/* === ROOT VARIABLEN === */ +:root { + /* Dark Mode Farbpalette */ + --bg-primary: #1e1e1e; + --bg-secondary: #2d2d30; + --bg-card: #2d2d30; + --bg-header: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + --bg-filter: #363636; + + /* Text Farben */ + --text-primary: #ffffff; + --text-secondary: #b0b0b0; + --text-muted: #888888; + --text-accent: #667eea; + + /* Status Farben */ + --status-new: #2196f3; + --status-new-bg: #1565c0; + --status-rewrite: #ff9800; + --status-rewrite-bg: #ef6c00; + --status-process: #9c27b0; + --status-process-bg: #6a1b9a; + --status-online: #4caf50; + --status-online-bg: #2e7d32; + --status-hold: #e91e63; + --status-hold-bg: #ad1457; + --status-trash: #f44336; + --status-trash-bg: #c62828; + --status-wp-pending: #00bcd4; + --status-wp-pending-bg: #0097a7; + + /* Borders & Shadows */ + --border-color: #404040; + --shadow-light: 0 2px 8px rgba(0, 0, 0, 0.3); + --shadow-hover: 0 8px 20px rgba(0, 0, 0, 0.4); + + /* Accent Colors */ + --gradient-primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + --gradient-secondary: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); +} + +/* === LIGHT MODE FALLBACKS === */ +[data-theme="light"], .stApp[data-theme="light"] { + --bg-primary: #ffffff; + --bg-secondary: #f8f9fa; + --bg-card: #ffffff; + --bg-filter: #f0f2f6; + + --text-primary: #212529; + --text-secondary: #495057; + --text-muted: #6c757d; + --text-accent: #667eea; + + --border-color: #dee2e6; + --shadow-light: 0 2px 8px rgba(0, 0, 0, 0.1); + --shadow-hover: 0 8px 20px rgba(0, 0, 0, 0.15); +} + +/* === HAUPTCONTAINER === */ +.main-header { + background: var(--bg-header); + padding: 2rem; + border-radius: 12px; + margin-bottom: 2rem; + color: var(--text-primary); + text-align: center; + box-shadow: var(--shadow-light); +} + +.main-header h1 { + color: var(--text-primary) !important; + margin: 0 0 0.5rem 0; + font-size: 2.5rem; + font-weight: 700; +} + +.main-header p { + color: rgba(255, 255, 255, 0.9) !important; + margin: 0; + font-size: 1.1rem; +} + +/* === ARTIKEL CARDS === */ +.article-card { + background: var(--bg-card) !important; + border-radius: 12px; + padding: 1.5rem; + margin-bottom: 1rem; + box-shadow: var(--shadow-light); + border-left: 4px solid var(--text-accent); + border: 1px solid var(--border-color); + transition: all 0.3s ease; + color: var(--text-primary) !important; +} + +.article-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-hover); + border-color: var(--text-accent); +} + +.article-card h3, +.article-card .article-title { + color: var(--text-primary) !important; + margin: 0 0 0.5rem 0; + font-size: 1.2rem; + font-weight: 600; + line-height: 1.4; +} + +.article-card .article-meta { + color: var(--text-secondary) !important; + font-size: 0.9rem; + margin-bottom: 1rem; +} + +.article-card .article-summary { + color: var(--text-secondary) !important; + line-height: 1.5; + margin-bottom: 1rem; +} + +.article-card .article-footer { + color: var(--text-muted) !important; + font-size: 0.85rem; + display: flex; + justify-content: space-between; + align-items: center; +} + +/* === STATUS BADGES === */ +.status-badge { + padding: 0.3rem 0.8rem; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 600; + margin-right: 0.5rem; + display: inline-block; + color: white !important; +} + +.status-new { + background-color: var(--status-new-bg) !important; + color: white !important; +} + +.status-rewrite { + background-color: var(--status-rewrite-bg) !important; + color: white !important; +} + +.status-process { + background-color: var(--status-process-bg) !important; + color: white !important; +} + +.status-online { + background-color: var(--status-online-bg) !important; + color: white !important; +} + +.status-hold { + background-color: var(--status-hold-bg) !important; + color: white !important; +} + +.status-trash { + background-color: var(--status-trash-bg) !important; + color: white !important; +} + +.status-wp-pending { + background-color: var(--status-wp-pending-bg) !important; + color: white !important; +} + +/* === FILTER SECTION === */ +.filter-section { + background: var(--bg-filter) !important; + padding: 1.5rem; + border-radius: 12px; + margin-bottom: 2rem; + border: 1px solid var(--border-color); + box-shadow: var(--shadow-light); +} + +.filter-section h3 { + color: var(--text-primary) !important; + margin: 0 0 1rem 0; + font-size: 1.3rem; + font-weight: 600; +} + +/* === STATS CARDS === */ +.stats-card { + background: var(--bg-card) !important; + padding: 1.5rem; + border-radius: 12px; + text-align: center; + box-shadow: var(--shadow-light); + border: 1px solid var(--border-color); + transition: transform 0.2s ease; +} + +.stats-card:hover { + transform: translateY(-2px); +} + +.stats-number { + font-size: 2.5rem; + font-weight: 700; + color: var(--text-accent) !important; + margin-bottom: 0.5rem; + display: block; +} + +.stats-card div:last-child { + color: var(--text-secondary) !important; + font-weight: 500; + font-size: 1rem; +} + +/* === WORDPRESS STATUS === */ +.wp-status { + background: var(--bg-card) !important; + padding: 1rem; + border-radius: 8px; + margin: 1rem 0; + border-left: 4px solid var(--status-wp-pending); + border: 1px solid var(--border-color); + box-shadow: var(--shadow-light); +} + +.wp-status strong { + color: var(--text-primary) !important; +} + +.wp-status small { + color: var(--text-muted) !important; +} + +/* === BUTTONS & ACTIONS === */ +.stButton > button { + background: var(--gradient-primary) !important; + color: white !important; + border: none !important; + border-radius: 8px !important; + font-weight: 600 !important; + transition: all 0.2s ease !important; +} + +.stButton > button:hover { + transform: translateY(-1px) !important; + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4) !important; +} + +/* === SELECTBOX & INPUT OVERRIDES === */ +.stSelectbox > div > div { + background-color: var(--bg-card) !important; + color: var(--text-primary) !important; + border: 1px solid var(--border-color) !important; +} + +.stTextInput > div > div > input { + background-color: var(--bg-card) !important; + color: var(--text-primary) !important; + border: 1px solid var(--border-color) !important; +} + +/* === RESPONSIVE DESIGN === */ +@media (max-width: 768px) { + .main-header { + padding: 1.5rem; + } + + .main-header h1 { + font-size: 2rem; + } + + .article-card { + padding: 1rem; + } + + .stats-card { + padding: 1rem; + } + + .stats-number { + font-size: 2rem; + } +} +""" + + try: + # Static-Ordner erstellen falls nicht vorhanden + static_dir = Path(__file__).parent.parent / "static" + static_dir.mkdir(exist_ok=True) + + # CSS-Datei schreiben + css_file = static_dir / "styles.css" + with open(css_file, "w", encoding="utf-8") as f: + f.write(css_content) + + return True + except Exception as e: + st.error(f"Fehler beim Erstellen der CSS-Datei: {e}") + return False + +def apply_dark_theme(): + """ + Wendet das Dark Theme an (zusätzlich zur CSS-Datei) + """ + st.markdown(""" + + """, unsafe_allow_html=True) \ No newline at end of file From 46e0b9892832fcf31f55ced5156e0cd32168714b Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 18 Aug 2025 10:37:27 +0200 Subject: [PATCH 31/87] Update CHANGELOG.md --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c50eb8c..b8b58b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ ## [1.6.3] - 2025-08-18 -- Beschreibung... +### 🔧 Verbesserungen +- **SyleSheet erneut hinzugefügt + - Style wurde bei einem Release leider vergessen + - Style auf DarkMode angepasst + +--- ## [v1.6.2] - 2025-08-16 From a46d919118f176f9648bd02996cfa935e73b2e23 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sun, 24 Aug 2025 14:59:32 +0200 Subject: [PATCH 32/87] Bump version to v1.7.0 --- CHANGELOG.md | 4 + __version__.py | 2 +- app.py | 160 +- data/articles.json | 2037 +++++++++++++++++- data/feeds.json | 28 + logs/rss_tool.log | 4923 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 7145 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8b58b2..c15f26b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [1.7.0] - 2025-08-24 + +- Beschreibung... + ## [1.6.3] - 2025-08-18 ### 🔧 Verbesserungen diff --git a/__version__.py b/__version__.py index 1b702b1..32d334c 100644 --- a/__version__.py +++ b/__version__.py @@ -1 +1 @@ -VERSION = "1.6.3" +VERSION = "1.7.0" diff --git a/app.py b/app.py index 6d8b504..a6d2dfa 100644 --- a/app.py +++ b/app.py @@ -323,8 +323,148 @@ with tab2: or any(query in tag.lower() for tag in a.get("tags", [])) ] - # Ergebnisse anzeigen - st.write(f"**{len(filtered_articles)} Artikel gefunden**") + # Ergebnisse und Massenoperationen + col1, col2 = st.columns([2, 1]) + + with col1: + st.write(f"**{len(filtered_articles)} Artikel gefunden**") + + with col2: + # Select All / None Buttons + if filtered_articles: + col_select_1, col_select_2 = st.columns(2) + with col_select_1: + if st.button("✓ Alle auswählen", key="select_all"): + for article in filtered_articles: + st.session_state.selected_articles.add(article['id']) + st.rerun() + + with col_select_2: + if st.button("✗ Auswahl aufheben", key="select_none"): + st.session_state.selected_articles.clear() + st.rerun() + + # Bulk Operations Section + selected_count = len(st.session_state.selected_articles) + if selected_count > 0: + st.markdown(f""" +
+

⚡ Massenoperationen ({selected_count} Artikel ausgewählt)

+
+ """, unsafe_allow_html=True) + + # Quick Actions für ausgewählte Artikel + col1, col2, col3, col4, col5 = st.columns(5) + + with col1: + if st.button("🔄 Feeds aktualisieren", use_container_width=True, key="bulk_update_feeds"): + with st.spinner("Feeds werden aktualisiert..."): + existing_ids = [a["id"] for a in all_articles] + process_articles(existing_ids) + show_notification("Feeds erfolgreich aktualisiert!") + time.sleep(1) + st.rerun() + + with col2: + # Bulk Status Change + bulk_status = st.selectbox( + "Status ändern", + ["--Auswählen--"] + ["New", "Rewrite", "Process", "Online", "On Hold", "Trash", "WordPress Pending"], + key="bulk_status" + ) + + if bulk_status != "--Auswählen--" and st.button("Status anwenden", key="apply_bulk_status"): + changed_count = 0 + for article in all_articles: + if article["id"] in st.session_state.selected_articles: + article["status"] = bulk_status + changed_count += 1 + + if changed_count > 0: + save_articles(all_articles) + show_notification(f"{changed_count} Artikel auf '{bulk_status}' gesetzt!") + st.session_state.selected_articles.clear() + st.rerun() + + with col3: + # Bulk Rewrite + rewrite_selected_count = len([a for a in all_articles if a["id"] in st.session_state.selected_articles and a.get("status") != "Rewrite"]) + if st.button(f"✍️ Artikel umschreiben ({rewrite_selected_count})", use_container_width=True, key="bulk_rewrite"): + # Ausgewählte Artikel auf "Rewrite" setzen + for article in all_articles: + if article["id"] in st.session_state.selected_articles: + article["status"] = "Rewrite" + + save_articles(all_articles) + + # Umschreiben starten + with st.spinner(f"{rewrite_selected_count} Artikel werden umgeschrieben..."): + rewrite_articles() + show_notification(f"{rewrite_selected_count} Artikel erfolgreich umgeschrieben!") + st.session_state.selected_articles.clear() + time.sleep(1) + st.rerun() + + with col4: + # Bulk WordPress Upload + wp_ready_selected = len([a for a in all_articles if a["id"] in st.session_state.selected_articles and a.get("status") == "Process"]) + if wp_ready_selected > 0: + if st.button(f"📤 WordPress Upload ({wp_ready_selected})", use_container_width=True, key="bulk_wp_upload"): + with st.spinner(f"{wp_ready_selected} Artikel werden zu WordPress hochgeladen..."): + # Nur die ausgewählten "Process" Artikel hochladen + selected_process_articles = [a for a in all_articles if a["id"] in st.session_state.selected_articles and a.get("status") == "Process"] + + if selected_process_articles: + from utils.wordpress_uploader import upload_articles_to_wordpress + upload_results = upload_articles_to_wordpress(selected_process_articles) + + if upload_results.get('error'): + show_notification(f"Fehler beim WordPress-Upload: {upload_results['error']}", "error") + else: + successful = upload_results.get('successful', 0) + failed = upload_results.get('failed', 0) + duplicates = upload_results.get('duplicates', 0) + + # Status der erfolgreich hochgeladenen Artikel ändern + if successful > 0: + for detail in upload_results.get('details', []): + if detail.get('success'): + article_id = detail.get('article_id') + for article in all_articles: + if article.get('id') == article_id: + article['status'] = "WordPress Pending" + article['wp_upload_date'] = datetime.now().isoformat() + article['wp_post_id'] = detail.get('wp_post_id') + break + save_articles(all_articles) + + if successful > 0: + show_notification(f"✅ {successful} Artikel erfolgreich zu WordPress hochgeladen!") + if failed > 0: + show_notification(f"⚠️ {failed} Artikel konnten nicht hochgeladen werden.", "warning") + if duplicates > 0: + show_notification(f"ℹ️ {duplicates} Duplikate übersprungen.", "info") + + st.session_state.selected_articles.clear() + time.sleep(2) + st.rerun() + else: + st.markdown("*Keine Process-Artikel ausgewählt*") + + with col5: + # Bulk Delete/Trash + if st.button("🗑️ In Papierkorb", use_container_width=True, key="bulk_trash"): + trash_count = 0 + for article in all_articles: + if article["id"] in st.session_state.selected_articles: + article["status"] = "Trash" + trash_count += 1 + + if trash_count > 0: + save_articles(all_articles) + show_notification(f"{trash_count} Artikel in Papierkorb verschoben!") + st.session_state.selected_articles.clear() + st.rerun() # Artikel Cards for article in filtered_articles: @@ -336,10 +476,18 @@ with tab2: # Article Card st.markdown('
', unsafe_allow_html=True) - # Header - col1, col2 = st.columns([3, 1]) + # Header with Checkbox + col_check, col_content, col_status = st.columns([0.3, 2.7, 1]) - with col1: + with col_check: + # Checkbox für Artikel-Auswahl + is_selected = article["id"] in st.session_state.selected_articles + if st.checkbox("", value=is_selected, key=f"check_{article['id']}"): + st.session_state.selected_articles.add(article['id']) + else: + st.session_state.selected_articles.discard(article['id']) + + with col_content: title = article.get("title", "Kein Titel") if has_incomplete_images: title += " ⚠️" @@ -350,7 +498,7 @@ with tab2: if article.get("wp_post_id"): st.markdown(f'', unsafe_allow_html=True) - with col2: + with col_status: st.markdown(get_status_badge(article.get("status", "New")), unsafe_allow_html=True) # Content Preview diff --git a/data/articles.json b/data/articles.json index 514daff..4865188 100644 --- a/data/articles.json +++ b/data/articles.json @@ -6499,14 +6499,16 @@ "Straßenverkehrsordnung", "Umweltschutz" ], - "status": "Process", + "status": "Online", "link": "https://www.promobil.de/weitere-ratgeber/neue-bussgelder-in-italien-falsche-muellentsorgung-aus-dem-wohnmobil-wird-besonders-teuer/", "images": [], "source": "https://www.promobil.de/rss/ratgeber", "source_name": "ratgeber bei www.promobil.de", "created_at": "2025-08-16T12:49:47.652064", "word_count": 275, - "rewritten_at": "2025-08-18T10:30:43.148097" + "rewritten_at": "2025-08-18T10:30:43.148097", + "wp_upload_date": "2025-08-19T09:45:44.761954", + "wp_post_id": 3385 }, { "id": "13aafca64dc26e25ebc74baabef3257f", @@ -6522,5 +6524,2036 @@ "source_name": "ratgeber bei www.promobil.de", "created_at": "2025-08-18T10:29:00.444125", "word_count": 583 + }, + { + "id": "98c55ac19e688c7f19e8eba46ea29fe2", + "title": "Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper", + "date": "Mon, 18 Aug 2025 13:02:00 +0200", + "summary": "

FlexiCamper versprach Wohnmobile, kassierte Millionen – und lieferte nicht. Jetzt fällt das Gericht ein deutliches Urteil.

", + "text": "Im spektakulären Betrugsfall der deutschen Campingbranche \"FlexiCamper\" fiel vergangene Woche ein Urteil vor der zehnten großen Strafkammer des Landgerichts München II. Die beiden Hauptverantwortlichen, eine 36-jährige Geschäftsführerin und ein 63-jähriger faktischer Geschäftsführer, wurden wegen eines Schadens von insgesamt vier Millionen Euro, 54 betrogenen Wohnmobilkäufern und fünf getäuschten Banken zu mehrjährigen Haftstrafen verurteilt. Das Unternehmen war bereits Ende 2022 zahlungsunfähig, stellte jedoch erst im Mai 2023 einen Insolvenzantrag.\n\nDie beiden Angeklagten überzeugten mit manipulierten Bilanzen und Dokumenten fünf Banken von der Stabilität ihres Unternehmens, was zu einem Schaden von 1,6 Millionen Euro führte. Darüber hinaus verkauften sie Wohnmobile, obwohl sie nicht mehr in der Lage waren, die Verkaufsprozesse abzuwickeln, wodurch Kunden einen Schaden von insgesamt 2 Millionen Euro erlitten. Drei Leasingunternehmen wurden um 110.000 Euro betrogen und zusätzliche 500.000 Euro wurden von dem 63-jährigen Angeklagten zweckentfremdet.\n\nDie Strafkammer fand keine Hinweise auf ein absichtliches Veruntreuen der Gelder, sondern sprach von einem \"geschäftlichen Totalschaden\" aufgrund eines unrentablen Geschäftsmodells und chaotischer Buchhaltung. Trotz eines Jahresumsatzes von rund sechs Millionen Euro erlitt das Unternehmen einen Verlust von drei Millionen Euro.\n\nBeide Angeklagten wurden zu Haftstrafen verurteilt - vier Jahre für den 63-jährigen und drei Jahre für die 36-jährige - nach umfassenden Geständnissen und Beweisen ihrer Kooperation und Reue. Das Gericht stellte fest, dass die Ursachen der Vergehen weniger im gezielten Betrug lagen, sondern vielmehr in unternehmerischer Inkompetenz und einem nicht tragfähigen Geschäftsmodell.\n\nDer Fall FlexiCamper ist kein Einzelfall und unterstreicht die Bedeutung von Vorsicht und gesundem Menschenverstand beim Kauf eines Wohnmobils. Kunden, die hohe Summen im Voraus zahlen, ohne eine gesicherte Lieferzusage, riskieren viel. Vorkasse, Lieferverzögerung und Insolvenz sind gängige Muster in der Branche, die oft durch schlechtes Wirtschaften und fehlende externe Sicherheiten instabil wird und somit anfällig für Missbrauch und finanzielle Manipulationen ist.", + "tags": [ + "Betrugsfall", + "Campingbranche", + "FlexiCamper", + "Insolvenz", + "Wirtschaftskriminalität" + ], + "status": "Online", + "link": "https://www.promobil.de/weitere-ratgeber/flexicamper-skandal-harte-urteile-nach-millionenbetrug-im-wohnmobilhandel/", + "images": [], + "source": "https://www.promobil.de/rss/ratgeber", + "source_name": "ratgeber bei www.promobil.de", + "created_at": "2025-08-19T08:48:02.789703", + "word_count": 290, + "rewritten_at": "2025-08-19T08:56:18.555837", + "wp_upload_date": "2025-08-19T09:45:59.508091", + "wp_post_id": 3386 + }, + { + "id": "1209fbff9e284ff355e9d3c46e324528", + "title": "POL-D: Langenfeld - A3 Richtung Arnheim - Anschlussstelle Solingen - Motorradalleinunfall mit Sozia - Fahrer schwer und Sozia leicht verletzt", + "date": "Sat, 16 Aug 2025 13:27:18 +0200", + "summary": "Düsseldorf (ots) - Donnerstag, 14. August 2025, 22:59 Uhr Ein 18-jähriger Düsseldorfer verlor bei Langenfeld im Anschlussstellenbereich Solingen auf der A3 in Richtung Arnheim aus bislang unbekannter Ursache am Donnerstagabend die Kontrolle über ...", + "text": "Polizei Düsseldorf [ Newsroom ] Düsseldorf (ots) - Donnerstag, 14. August 2025, 22:59 Uhr Ein 18-jähriger Düsseldorfer verlor bei Langenfeld im Anschlussstellenbereich Solingen auf der A3 in Richtung Arnheim aus bislang unbekannter Ursache am Donnerstagabend die Kontrolle über ... Lesen Sie hier weiter... Original-Content von: Polizei Düsseldorf, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/13248/6098000", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:45.096514", + "word_count": 51 + }, + { + "id": "f5cd79dd49f2ab2039280604a9d332b0", + "title": "POL-ME: Die Polizei lädt zum Gespräch am \"STREIFENwagen\"", + "date": "Wed, 13 Aug 2025 08:10:00 +0200", + "summary": "Langenfeld (ots) - Er tourt schon seit einiger Zeit durchs Kreisgebiet und ist ein echter Hingucker: Der \"STREIFENwagen\" der Kreispolizeibehörde Mettmann. Mit dem auffälligen Fahrzeug sind die Polizistinnen und Polizisten des Bezirks- und ...", + "text": "Polizei Mettmann [ Newsroom ] Langenfeld (ots) - Er tourt schon seit einiger Zeit durchs Kreisgebiet und ist ein echter Hingucker: Der \"STREIFENwagen\" der Kreispolizeibehörde Mettmann. Mit dem auffälligen Fahrzeug sind die Polizistinnen und Polizisten des Bezirks- und ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6095749", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:45.377100", + "word_count": 51 + }, + { + "id": "538a150468cdf061026a6157e64a27c8", + "title": "POL-ME: Tragischer Verkehrsunfall - Zwei Insassen verstorben - 2508041", + "date": "Sun, 10 Aug 2025 11:13:26 +0200", + "summary": "Monheim am Rhein (ots) - Am späten Samstagabend, 9. August 2025, ist es auf einer außerörtlichen Kreisstraße in Monheim am Rhein zu einem tragischen Unfall gekommen in dessen Folge eine 17-jährige Langenfelderin sowie ein 15-Jähriger aus ...", + "text": "Polizei Mettmann [ Newsroom ] Monheim am Rhein (ots) - Am späten Samstagabend, 9. August 2025, ist es auf einer außerörtlichen Kreisstraße in Monheim am Rhein zu einem tragischen Unfall gekommen in dessen Folge eine 17-jährige Langenfelderin sowie ein 15-Jähriger aus ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6093692", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:45.632600", + "word_count": 54 + }, + { + "id": "d2399f6291831120ae5da83959e4e2c0", + "title": "POL-ME: Gabelstapler in Brand gesetzt: Polizei bittet um Hinweise - 2508033", + "date": "Fri, 08 Aug 2025 09:35:06 +0200", + "summary": "Langenfeld (ots) - In der Nacht auf Freitag, 8. August 2025, kam es in Langenfeld zu einer Brandstiftung, bei der ein Gabelstapler schwer beschädigt wurde. Die Polizei ermittelt und bittet um Hinweise. Das war nach dem aktuellen Stand der ...", + "text": "Polizei Mettmann [ Newsroom ] Langenfeld (ots) - In der Nacht auf Freitag, 8. August 2025, kam es in Langenfeld zu einer Brandstiftung, bei der ein Gabelstapler schwer beschädigt wurde. Die Polizei ermittelt und bittet um Hinweise. Das war nach dem aktuellen Stand der ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6092772", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:45.915950", + "word_count": 57 + }, + { + "id": "42f3d416c11efcda4f04a79e11812b53", + "title": "POL-ME: Porsche 911 Carrera entwendet: Polizei bittet um Hinweise - 2508025", + "date": "Wed, 06 Aug 2025 08:36:57 +0200", + "summary": "Langenfeld (ots) - In der Nacht auf Dienstag, 5. August 2025, wurde in Langenfeld-Richrath ein Sportwagen von Porsche gestohlen. Die Polizei ermittelt und bittet um Hinweise. Das war nach aktuellen Erkenntnissen passiert: Am Montagabend stellte eine ...", + "text": "Polizei Mettmann [ Newsroom ] Langenfeld (ots) - In der Nacht auf Dienstag, 5. August 2025, wurde in Langenfeld-Richrath ein Sportwagen von Porsche gestohlen. Die Polizei ermittelt und bittet um Hinweise. Das war nach aktuellen Erkenntnissen passiert: Am Montagabend stellte eine ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6091203", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:46.171556", + "word_count": 54 + }, + { + "id": "d2171eacae49b378fe97193f1c5d5e33", + "title": "POL-ME: Verkehrsunfallfluchten aus dem Kreisgebiet - 2508021", + "date": "Tue, 05 Aug 2025 14:49:57 +0200", + "summary": "Langenfeld (ots) - In den vergangenen Tagen registrierte die Polizei im Kreis Mettmann folgende Verkehrsunfallfluchten: - Eine Verkehrsunfallflucht ist kein Kavaliersdelikt, sondern eine Straftat! - Melden Sie Verkehrsunfallfluchten unverzüglich ...", + "text": "05.08.2025 – 14:49 Polizei Mettmann POL-ME: Verkehrsunfallfluchten aus dem Kreisgebiet - 2508021 Bild-Infos Download Langenfeld (ots) In den vergangenen Tagen registrierte die Polizei im Kreis Mettmann folgende Verkehrsunfallfluchten: --- Langenfeld --- Am Freitagnachmittag, 1. August 2025, kam es auf der Straße Weißenstein in Langenfeld-Berghausen zu einer Verkehrsunfallflucht. Gegen 15:30 Uhr verließ eine 60-Jährige das Grundstück eines Wohnhauses mit der Hausnummer 12 und betrat den asphaltierten Bereich, der parallel zur Fahrbahn liegt. Nach eigenen Angaben wurden sie unmittelbar von dem Fahrradlenker einer vorbeifahrenden Radfahrerin erfasst und fiel zu Boden. Ohne sich um die bei dem Sturz leicht verletzte Fußgängerin zu kümmern, entfernte sich die circa 40 bis 45 Jahre alte Radfahrerin, die schulterlange braune Haare zu einem Zopf gebunden trug und ein westeuropäisches Erscheinungsbild hatte, in unbekannte Richtung. Hinweise nimmt die Polizei in Langenfeld, Telefon 02173 288-6310, jederzeit entgegen. --- Hinweise und Tipps der Polizei --- - Eine Verkehrsunfallflucht ist kein Kavaliersdelikt, sondern eine Straftat! - Melden Sie Verkehrsunfallfluchten unverzüglich bei der nächsten Polizeidienststelle (auch über Notruf 110). - Belassen Sie das Fahrzeug wenn möglich unverändert am Unfallort. - Vermeiden Sie die Beseitigung oder Veränderung von Unfallspuren. Selbst kleinste Lacksplitter, Glasreste, etc. können für die polizeilichen Ermittlungen von Bedeutung sein. Fertigen Sie wenn möglich eigene Fotos von der Unfallsituation und vorgefundenen Spuren, wenn Veränderungen eintreten könnten oder unvermeidlich sind. Fragen bitte an: Kreispolizeibehörde Mettmann Polizeipressestelle Adalbert-Bach-Platz 1 40822 Mettmann Telefon: 02104 982-1010 Telefax: 02104 982-1028 E-Mail: pressestelle.mettmann@polizei.nrw.de Homepage: https://mettmann.polizei.nrw/ Facebook: http://www.facebook.com/Polizei.NRW.ME Instagram: https://www.instagram.com/polizei.nrw.me/?hl=de X: https://twitter.com/polizei_nrw_me WhatsApp-Kanal: https://www.whatsapp.com/channel/0029VaAl7vKEgGfNSUkFwp3g Wir haben jetzt auch einen eigenen WhatsApp-Kanal! Hier informieren wir über wichtige und interessante Polizeimeldungen: https://www.whatsapp.com/channel/0029VaAl7vKEgGfNSUkFwp3g Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6090985", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:46.700739", + "word_count": 270 + }, + { + "id": "e4ef744c22effe3467c7e9958aabf440", + "title": "POL-ME: Einbrüche aus dem Kreisgebiet - 2508020", + "date": "Tue, 05 Aug 2025 14:04:43 +0200", + "summary": "Kreis Mettmann (ots) - In den vergangenen Tagen registrierte die Polizei folgende Einbrüche im Kreis Mettmann: In der Nacht auf Dienstag, 5. August 2025, sind noch unbekannte Täterinnen oder Täter zwischen 0:20 und 0:30 Uhr in ein ...", + "text": "Polizei Mettmann [ Newsroom ] Kreis Mettmann (ots) - In den vergangenen Tagen registrierte die Polizei folgende Einbrüche im Kreis Mettmann: In der Nacht auf Dienstag, 5. August 2025, sind noch unbekannte Täterinnen oder Täter zwischen 0:20 und 0:30 Uhr in ein ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6090932", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:46.983083", + "word_count": 55 + }, + { + "id": "7b3f32ca27ff818d14af07cba980c9dc", + "title": "POL-ME: Harley-Davidson gestohlen: Polizei bittet um Hinweise - 2508017", + "date": "Tue, 05 Aug 2025 10:07:05 +0200", + "summary": "Langenfeld (ots) - In der Nacht auf Montag, 4. August 2025, wurde eine Harley-Davidson Street Glide Special aus einer Garage in Langenfeld entwendet. Die Polizei ermittelt und bittet um Hinweise. Das war nach aktuellen Erkenntnissen passiert: Am ...", + "text": "Polizei Mettmann [ Newsroom ] Langenfeld (ots) - In der Nacht auf Montag, 4. August 2025, wurde eine Harley-Davidson Street Glide Special aus einer Garage in Langenfeld entwendet. Die Polizei ermittelt und bittet um Hinweise. Das war nach aktuellen Erkenntnissen passiert: Am ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6090567", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:47.280393", + "word_count": 55 + }, + { + "id": "ad5f32907694ce0bfa8843bea71f1cae", + "title": "POL-ME: Einbrüche aus dem Kreisgebiet - 2508012", + "date": "Mon, 04 Aug 2025 13:43:34 +0200", + "summary": "Kreis Mettmann (ots) - In den vergangenen Tagen registrierte die Polizei folgende Einbrüche im Kreis Mettmann: In der Zeit von Mittwoch, 30. Juli 2025, gegen 10 Uhr, bis Freitag, 1. August 2025, gegen 11:20 Uhr, sind noch unbekannte Täterinnen ...", + "text": "Polizei Mettmann [ Newsroom ] Kreis Mettmann (ots) - In den vergangenen Tagen registrierte die Polizei folgende Einbrüche im Kreis Mettmann: In der Zeit von Mittwoch, 30. Juli 2025, gegen 10 Uhr, bis Freitag, 1. August 2025, gegen 11:20 Uhr, sind noch unbekannte Täterinnen ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6090066", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:47.558722", + "word_count": 57 + }, + { + "id": "88fefbec576ccd3d82ecf3da84e0c6e5", + "title": "POL-D: Meldung der Autobahnpolizei - A 3 - Verkehrsunfall bei Langenfeld - Pkw überschlägt sich in Baustelle - Eine lebensgefährlich verletzte Person", + "date": "Sun, 03 Aug 2025 12:02:43 +0200", + "summary": "Düsseldorf (ots) - Unfallzeit: Samstag, 02. August 2025, 06:30 Uhr Bei einem schweren Verkehrsunfall gestern Morgen auf der A 3 bei Langenfeld wurde ein Mann lebensgefährlich verletzt. Eine Frau erlitt schwere, zwei weitere leichte Verletzungen. ...", + "text": "Polizei Düsseldorf [ Newsroom ] Düsseldorf (ots) - Unfallzeit: Samstag, 02. August 2025, 06:30 Uhr Bei einem schweren Verkehrsunfall gestern Morgen auf der A 3 bei Langenfeld wurde ein Mann lebensgefährlich verletzt. Eine Frau erlitt schwere, zwei weitere leichte Verletzungen. ... Lesen Sie hier weiter... Original-Content von: Polizei Düsseldorf, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/13248/6089342", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:47.830886", + "word_count": 53 + }, + { + "id": "2ed8ff63dc8b92439e833a1a8c5dd3c7", + "title": "POL-ME: Einbrüche aus dem Kreisgebiet - 2508002", + "date": "Fri, 01 Aug 2025 09:43:47 +0200", + "summary": "Langenfeld (ots) - In den vergangenen Tagen registrierte die Polizei folgende Einbrüche im Kreis Mettmann: In der Nacht auf Freitag, 1. August 2025, sind noch unbekannte Täterinnen oder Täter gegen 1:10 Uhr in eine Firma in der Nähe der ...", + "text": "Polizei Mettmann [ Newsroom ] Langenfeld (ots) - In den vergangenen Tagen registrierte die Polizei folgende Einbrüche im Kreis Mettmann: In der Nacht auf Freitag, 1. August 2025, sind noch unbekannte Täterinnen oder Täter gegen 1:10 Uhr in eine Firma in der Nähe der ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6088459", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:48.124026", + "word_count": 57 + }, + { + "id": "8862dbc39cc2c8ba6927559701ee0bf9", + "title": "POL-ME: Einbrüche aus dem Kreisgebiet - 2507143", + "date": "Thu, 31 Jul 2025 08:19:41 +0200", + "summary": "Langenfeld (ots) - In den vergangenen Tagen registrierte die Polizei folgenden Einbruch im Kreis Mettmann: In der Zeit von Montag, 28. Juli 2025, gegen 11 Uhr, bis Mittwoch, 30. Juli 2025, gegen 18:15 Uhr, sind noch unbekannte Täterinnen oder ...", + "text": "Polizei Mettmann [ Newsroom ] Langenfeld (ots) - In den vergangenen Tagen registrierte die Polizei folgenden Einbruch im Kreis Mettmann: In der Zeit von Montag, 28. Juli 2025, gegen 11 Uhr, bis Mittwoch, 30. Juli 2025, gegen 18:15 Uhr, sind noch unbekannte Täterinnen oder ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6087627", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:48.446398", + "word_count": 57 + }, + { + "id": "ae2e6445342bab198b4aba85f4bb04d8", + "title": "POL-ME: Autos aufgebrochen: Reihenweise Scheiben eingeschlagen - 2507133", + "date": "Mon, 28 Jul 2025 15:25:04 +0200", + "summary": "Langenfeld (ots) - In den vergangenen Tagen kam es in Langenfeld an mehreren Orten zu Autoaufbrüchen. Die unbekannten Täterinnen oder Täter verwendeten dabei stets dieselbe Methode, in dem sie die Seitenscheiben der Autos einschlugen. Die Serie ...", + "text": "Polizei Mettmann [ Newsroom ] Langenfeld (ots) - In den vergangenen Tagen kam es in Langenfeld an mehreren Orten zu Autoaufbrüchen. Die unbekannten Täterinnen oder Täter verwendeten dabei stets dieselbe Methode, in dem sie die Seitenscheiben der Autos einschlugen. Die Serie ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6085822", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:48.712189", + "word_count": 54 + }, + { + "id": "aa49f4fadcbdf9bdee659692f428c939", + "title": "POL-ME: Polizei zieht verkehrsunsicheren Transporter aus dem Verkehr - 2507132", + "date": "Mon, 28 Jul 2025 14:58:33 +0200", + "summary": "Langenfeld (ots) - Die Polizei hat am Freitagabend, 25. Juli 2025, in Langenfeld einen verkehrsunsicheren Transporter aus dem Verkehr gezogen. Das Fahrzeug wurde stillgelegt. Das war nach aktuellen Erkenntnissen passiert: Gegen 18 Uhr überprüften ...", + "text": "Polizei Mettmann [ Newsroom ] Langenfeld (ots) - Die Polizei hat am Freitagabend, 25. Juli 2025, in Langenfeld einen verkehrsunsicheren Transporter aus dem Verkehr gezogen. Das Fahrzeug wurde stillgelegt. Das war nach aktuellen Erkenntnissen passiert: Gegen 18 Uhr überprüften ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6085785", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:48.999056", + "word_count": 52 + }, + { + "id": "3e546ee523fbf6e5c54e33346e46e883", + "title": "POL-ME: Bonn-Auerberg: Festnahme eines aus dem Maßregelvollzug entwichenen Strafgefangenen - 2507134", + "date": "Mon, 28 Jul 2025 14:56:42 +0200", + "summary": "Bonn / Langenfeld (ots) - Aus aktuellem Anlass und wegen der örtlichen Bezüge nach Langenfeld im Kreis Mettmann teilt die Kreispolizeibehörde Mettmann nachfolgende Pressemeldung des Polizeipräsidiums Bonn: \"Am Freitag (25.07.2025), gegen 15:00 ...", + "text": "Polizei Mettmann [ Newsroom ] Bonn / Langenfeld (ots) - Aus aktuellem Anlass und wegen der örtlichen Bezüge nach Langenfeld im Kreis Mettmann teilt die Kreispolizeibehörde Mettmann nachfolgende Pressemeldung des Polizeipräsidiums Bonn: \"Am Freitag (25.07.2025), gegen 15:00 ... Lesen Sie hier weiter... Original-Content von: Polizei Mettmann, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/blaulicht/pm/43777/6085781", + "images": [], + "source": "https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2", + "source_name": "Presseportal.de - Langenfeld (Rheinland)", + "created_at": "2025-08-19T10:05:49.289160", + "word_count": 50 + }, + { + "id": "bc68d305a762c8b808a88d8c39921c3e", + "title": "Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern", + "date": "Mon, 18 Aug 2025 13:26:55 +0200", + "summary": "Herbertz GmbH: Solingen (ots) - Stechmücken vermiesen im Sommer oft den Abend im Garten oder am See. Ein leichtes, geräuschloses Gerät soll jetzt für entspannte Stunden im Freien sorgen. Wenn die Temperaturen steigen, werden nicht nur Menschen aktiver - auch ...", + "text": "Die Herbertz GmbH aus Solingen hat ein neues, leichtes und geräuschloses Gerät entwickelt, das im Sommer ungestörte Abende im Freien ermöglicht. Dieses soll die Belästigung durch Stechmücken, die bei steigenden Temperaturen zunehmend aktiv werden, minimieren. Die Informationen wurden von Herbertz GmbH bereitgestellt und durch News Aktuell übermittelt.", + "tags": [ + "Herbertz GmbH", + "Stechmückenabwehr", + "Sommerabende", + "Geräuschloses Gerät", + "News Aktuell" + ], + "status": "Online", + "link": "https://www.presseportal.de/pm/180570/6098987", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:50.797639", + "word_count": 47, + "rewritten_at": "2025-08-19T10:32:05.202525", + "wp_upload_date": "2025-08-19T10:32:52.141101", + "wp_post_id": 3396 + }, + { + "id": "7b551a09157f0272fc9bdbbd0cdb163c", + "title": "Neue Folge \"Bella Italia - Camping auf Deutsch\": von Italien in die USA", + "date": "Mon, 18 Aug 2025 10:00:00 +0200", + "summary": "RTLZWEI: München (ots) - - Die Fingerhuth-Clique auf einem typisch amerikanischen BBQ-Festival - Sascha Bohner auf Abwegen in den USA - Neue Folge \"Bella Italia - Camping auf Deutsch\" am 18. August 2025, immer montags um 20:15 Uhr bei RTLZWEI und sieben ...", + "text": "RTLZWEI [ Newsroom ] München (ots) - - Die Fingerhuth-Clique auf einem typisch amerikanischen BBQ-Festival - Sascha Bohner auf Abwegen in den USA - Neue Folge \"Bella Italia - Camping auf Deutsch\" am 18. August 2025, immer montags um 20:15 Uhr bei RTLZWEI und sieben ... Lesen Sie hier weiter... Original-Content von: RTLZWEI, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/6605/6098566", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:51.071877", + "word_count": 57 + }, + { + "id": "ca7909c054c03ff01ad26821e5e77fbb", + "title": "IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem", + "date": "Mon, 18 Aug 2025 09:01:13 +0200", + "summary": "Jackery Inc.: Düsseldorf, Deutschland (ots/PRNewswire) - Als Pionier tragbarer, nachhaltiger Energielösungen präsentiert Jackery auf der IFA 2025 in Halle 2.2, Stand 119, seine neuesten Produktgenerationen für unterwegs und zu Hause. So feiert etwa die ...", + "text": "Jackery Inc. [ Newsroom ] Düsseldorf, Deutschland (ots/PRNewswire) - Als Pionier tragbarer, nachhaltiger Energielösungen präsentiert Jackery auf der IFA 2025 in Halle 2.2, Stand 119, seine neuesten Produktgenerationen für unterwegs und zu Hause. So feiert etwa die ... Lesen Sie hier weiter... Original-Content von: Jackery Inc., übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/161806/6098495", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:51.372728", + "word_count": 50 + }, + { + "id": "3b7e4b9526096a931c555a5a972a3029", + "title": "Inklusiver Campingurlaub am Gardasee", + "date": "Mon, 11 Aug 2025 13:03:35 +0200", + "summary": "Lago di Garda Camping: MEDIENINFORMATION Inklusiver Campingurlaub am Gardasee Naturnaher Urlaub, der keine Unterschiede macht. In den Campingdörfern von Lago di Garda Camping steht das Wohl aller Gäste im Mittelpunkt. München, 11. August 2025 – Auf den ...", + "text": "11.08.2025 – 13:03 Lago di Garda Camping Inklusiver Campingurlaub am Gardasee Bild-Infos Download 9 weitere Medieninhalte Ein Dokument 20250811_Inklusiver Urlaub.pdf PDF - 186 kB MEDIENINFORMATION Inklusiver Campingurlaub am Gardasee Naturnaher Urlaub, der keine Unterschiede macht. In den Campingdörfern von Lago di Garda Camping steht das Wohl aller Gäste im Mittelpunkt. München, 11. August 2025 – Auf den Campingplätzen von Lago di Garda Camping wird Gastfreundschaft neu gedacht – inklusiv, achtsam und mit Blick auf die individuellen Bedürfnisse jedes Gastes. Ob große oder kleine Gäste, Menschen mit körperlichen oder mentalen Beeinträchtigungen oder vierbeinige Familienmitglieder: Die Campingplätze rund um den Gardasee schaffen Orte, an denen Urlaub in der Natur für alle erlebbar ist, frei von Einschränkungen und voller Möglichkeiten. Camping Bergamini in Peschiera del Garda und das Camping Village San Francesco in Desenzano haben sich dem Qualitätsnetzwerk „Village for All“ angeschlossen, einer Initiative, die sich auf barrierefreie Gastfreundschaft spezialisiert hat. Ziel ist es, touristische Einrichtungen so zu gestalten, dass sie für möglichst viele Menschen, unabhängig von körperlichen, sensorischen oder kognitiven Einschränkungen, zugänglich und nutzbar sind. „Ein barrierefreier Urlaub bedeutet, frei wählen zu können, ohne sich erklären, anpassen oder verzichten zu müssen. Dafür müssen Informationen transparent und für alle zugänglich sein“ , so Elena Oppizzi, General Manager von Lago di Garda Camping. Einfacher Zugang – online und vor Ort Viele Campingplätze von Lago di Garda Camping bieten inzwischen barrierefreie Webseiten mit klarer Struktur, gut lesbaren Farbkontrasten und Sprachassistenten. So lässt sich der Urlaub auch mit Seh- oder Leseschwierigkeiten einfach und selbstständig planen. Vor Ort wird das barrierefreie Angebot stetig erweitert. Fußwege wurden neu angelegt und Mobilheime mit Rampen sowie Hebevorrichtungen an Pools erleichtern deren Nutzung. So bieten zum Beispiel Camping IdeaLazise und Camping Du Parc speziell ausgestattete Wohneinheiten für Menschen mit Behinderung an. Zur besseren Orientierung gibt es taktile Leitsysteme, fühlbare Karten und Infotafeln mit NFC-Technologie, die per Smartphone zusätzliche Hinweise geben. Auch in den Restaurants wird auf unterschiedliche Bedürfnisse geachtet: Speisekarten in Blindenschrift, Piktogramme sowie optimierte Menüangebote ermöglichen allen Gästen ihre Wahl zu treffen. Gastfreundschaft auf Augenhöhe Bei Lago di Garda Camping wird Inklusion nicht nur in der Architektur, sondern auch in der Begegnung aktiv gelebt. So wurden klassische Rezeptionstheken durch barrierefreie Begegnungstische ersetzt, die einen Empfang auf Augenhöhe ermöglichen. In einigen Anlagen sorgen akustische Verstärkungssysteme für bessere Verständlichkeit und reduzieren störende Hintergrundgeräusche. Auch an die jüngsten Gäste wurde gedacht: es wurden barrierefreie Spielgeräte aus Holz aufgestellt, teilweise in der Nähe der Rezeption, um die Wartezeit für die Kinder zu verkürzen. Für vierbeinige Familienmitglieder gibt es ausgewiesene Hundebereiche und speziell entwickelte Services. Die Campingplätze Fornella und Europa Silvella haben sogar einen Teil ihrer Strände für Hunde reserviert. Was all diese Maßnahmen verbindet, ist ein Anspruch, der über Standards hinausgeht, und die Überzeugung, dass echter Urlaub dort beginnt, wo sich jeder gesehen, verstanden und willkommen fühlt. Über Lago di Garda Camping: Mit rund 370 Quadratkilometern Fläche und 52 Kilometern Länge ist der Gardasee der größte See Italiens. Mediterrane Leichtigkeit und gelassenes Dolce Vita haben ihn seit den 1950-er Jahren zu einem der beliebtesten Reiseziele deutscher Urlauber gemacht. Bis heute ist die Region rund um den Gardasee ideal für alle, die einen naturnahen Urlaub dem klassischen Hotel oder einer Pension vorziehen. Die 17 Campingplätze und Feriendörfer von Lago di Garda Camping , die zwischen San Felice del Benaco am Südwestufer des Gardasees in der Region Lombardei und dem Ort Garda am Ostufer des Sees und Westrand der Provinz Verona liegen, verstehen sich als Gastgeber und Botschafter der Region Gardasee. Lago di Garda Camping c/o Global Communication Experts GmbH Claudia Dressler | Ida Heldt T. +49 89 – 2153793 -82 | -84 Mail: presse.lagodigardacamping@gce-agency.com Osterwaldstr. 10 /G19 80805 München, Deutschland Geschäftsführer: Dorothea Hohn, Ralf Engelhardt Firmensitz: Frankfurt Handelsregister Frankfurt, HRB 76467", + "tags": [], + "status": "Online", + "link": "https://www.presseportal.de/pm/153661/6094377", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:51.937018", + "word_count": 616, + "wp_upload_date": "2025-08-19T10:39:48.206661", + "wp_post_id": 3408 + }, + { + "id": "9dc76c4cd7fc40e529781fc4e74dd154", + "title": "Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025", + "date": "Mon, 11 Aug 2025 07:28:28 +0200", + "summary": "vanexxt Gmbh: Düsseldorf (ots) - Vom Prototyp zur Serienreife - der Caravelle wird zum Camper Nach der Vorstellung als Konzeptfahrzeug im Januar zeigt vanexxt den neuen VW Caravelle nun erstmals als Serienfahrzeug. Außerdem lassen sich auf dem Caravan Salon in ...", + "text": "vanexxt Gmbh [ Newsroom ] Düsseldorf (ots) - Vom Prototyp zur Serienreife - der Caravelle wird zum Camper Nach der Vorstellung als Konzeptfahrzeug im Januar zeigt vanexxt den neuen VW Caravelle nun erstmals als Serienfahrzeug. Außerdem lassen sich auf dem Caravan Salon in ... Lesen Sie hier weiter... Original-Content von: vanexxt Gmbh, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/172978/6093880", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:52.227933", + "word_count": 56 + }, + { + "id": "58a6e48424e6c016eada7ad99ad6c925", + "title": "Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf", + "date": "Wed, 06 Aug 2025 11:00:22 +0200", + "summary": "Vango: Liebe Camping-Expertinnen und Experten, Camping ist mehr als ein Trend – es ist ein Lebensgefühl. Vango, die traditionsreiche Outdoor-Marke aus Schottland, gibt auf dem Caravan Salon Düsseldorf 2025 einen Ausblick auf ihr bevorstehendes ...", + "text": "06.08.2025 – 11:00 Vango Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf Bild-Infos Download Ein Dokument VANGO Pressemitteilu~Düsseldorf 2025.pdf PDF - 434 kB Hier geht es zur Webseite von Vango Liebe Camping-Expertinnen und Experten, Camping ist mehr als ein Trend – es ist ein Lebensgefühl. Vango , die traditionsreiche Outdoor-Marke aus Schottland, gibt auf dem Caravan Salon Düsseldorf 2025 einen Ausblick auf ihr bevorstehendes 60-jähriges Jubiläum im kommenden Jahr und feiert das Draußen-Sein mit einer ganzen Reihe an Produktneuheiten. Wir laden Sie herzlich ein zur Pressekonferenz am Samstag, 30.08., um 15:05 Uhr in Halle 3, Stand C 54. Colin Maclean, Vango International Sales Manager, präsentiert Vango-Neuheiten und gibt einen Ausblick auf 2026. Wir laden Sie herzlich ein, auch gerne zu einem Einzeltermin am Vango-Stand vorbeizuschauen. Am Stand stehen Ihnen Miguel Ferreira, Trek Touren, Vertrieb Vango Deutschland, und Colin Maclean, Vango International Sales Manager, für Gespräche zur Verfügung. Wir freuen uns auf ein Treffen. Viele Grüße Johannes Wessel / Joachim Stark OUTDOOR SPORTS PR Steigenbergerstr. 19 82377 Penzberg T +49 (0) 8856 86 85 318 M Johannes Wessel: +49 (0)1590 5398581 / Jo Stark: +49 (0)176 - 21 61 89 53", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/170000/6091414", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:53.032900", + "word_count": 191 + }, + { + "id": "16253c613e6e422e43775a88fadecae7", + "title": "50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt", + "date": "Wed, 30 Jul 2025 13:09:10 +0200", + "summary": "ADAC: München (ots) - Das ADAC Tourset wird 50 Jahre alt - und bleibt ein beliebter Klassiker. Was 1975 als ADAC Tourenpaket begann, ist heute eine moderne Schnittstelle zwischen analoger und digitaler Reiseplanung. Es bietet individuell ...", + "text": "ADAC [ Newsroom ] München (ots) - Das ADAC Tourset wird 50 Jahre alt - und bleibt ein beliebter Klassiker. Was 1975 als ADAC Tourenpaket begann, ist heute eine moderne Schnittstelle zwischen analoger und digitaler Reiseplanung. Es bietet individuell ... Lesen Sie hier weiter... Original-Content von: ADAC, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/7849/6087294", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:53.311776", + "word_count": 51 + }, + { + "id": "9eaaac79401ab384b374d00ef01e1f99", + "title": "RTLZWEI: Erfolgreicher Montag mit \"Bella Italia - Camping auf Deutsch\"", + "date": "Tue, 29 Jul 2025 09:23:26 +0200", + "summary": "RTLZWEI: München (ots) - - Primetime: \"Bella Italia - Camping auf Deutsch\" mit 7,4 % MA (14-49) - RTLZWEI-Tagesmarktanteil: 4,7 % (14-49) Am gestrigen Montagabend konnte RTLZWEI in der Primetime mit einer neuen Folge von \"Bella Italia - Camping auf Deutsch\" ...", + "text": "RTLZWEI [ Newsroom ] München (ots) - - Primetime: \"Bella Italia - Camping auf Deutsch\" mit 7,4 % MA (14-49) - RTLZWEI-Tagesmarktanteil: 4,7 % (14-49) Am gestrigen Montagabend konnte RTLZWEI in der Primetime mit einer neuen Folge von \"Bella Italia - Camping auf Deutsch\" ... Lesen Sie hier weiter... Original-Content von: RTLZWEI, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/6605/6086102", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:53.636607", + "word_count": 56 + }, + { + "id": "6ff7e621d78be1c95dae357b4216f89c", + "title": "So ist man beim Camping richtig versichert", + "date": "Mon, 28 Jul 2025 09:50:40 +0200", + "summary": "Verbraucherzentrale Nordrhein-Westfalen e.V.: So ist man beim Camping richtig versichert Wer mit Wohnwagen oder Wohnmobil Urlaub macht, sollte an den passenden Versicherungsschutz denken Camping-Urlaub ist weiterhin sehr gefragt. Die Neuzulassungen für Privatkunden lagen im ersten Quartal ...", + "text": "28.07.2025 – 09:50 Verbraucherzentrale Nordrhein-Westfalen e.V. So ist man beim Camping richtig versichert Bild-Infos Download Ein Dokument 20250728_Tipp Camper-Versicherung.pdf PDF - 167 kB So ist man beim Camping richtig versichert Wer mit Wohnwagen oder Wohnmobil Urlaub macht, sollte an den passenden Versicherungsschutz denken Camping-Urlaub ist weiterhin sehr gefragt. Die Neuzulassungen für Privatkunden lagen im ersten Quartal 2025 über dem Vorjahresniveau. Die Nachfrage nach neuen und gebrauchten Wohnwagen und Wohnmobilen bleibt also hoch. Das Preisniveau jedoch ist aufgrund von Überkapazitäten etwas gesunken. „Bei aller Urlaubsfreude ist zu bedenken, dass nicht nur das Gefährt an sich wertvoll ist, sondern auch viel Gepäck und technisches Equipment an Bord ist“, sagt Elke Weidenbach, Versicherungsexpertin der Verbraucherzentrale NRW. „Ein möglicher Diebstahl oder Schaden ist in der Regel nicht über die Hausratversicherung abgedeckt. Die richtige Police spart hier viel Ärger und Enttäuschung.” Fünf Tipps für Wohnmobilisten: Das Wichtigste: Die Kfz-Haftpflicht Wie beim Auto ist auch für Wohnmobile und Wohnwagen eine Kfz-Haftpflichtversicherung gesetzlich vorgeschrieben. Sie ersetzt Schäden, die man bei anderen verursacht. Ratsam ist auch ein Voll- oder wenigstens Teilkaskoversicherungsschutz, damit Schäden am eigenen Fahrzeug abgedeckt sind. Das gilt besonders für hochpreisige Camper. Ratsam: Die Inhaltsversicherung Der bewegliche Besitz ist zu Hause über die Hausratversicherung abgesichert, also Möbel, Kleidung, Bargeld oder elektrische Geräte. Beim Camping-Urlaub gilt das nicht. Um im Wohnmobil oder Wohnwagen das persönliche Equipment gegen Diebstahl, Sturm- oder Wasserschäden zu versichern, gibt es die so genannte Inhaltsversicherung. Diese umfasst das Inventar, also die losen Teile im Fahrzeug. Je nach Vertrag ist nur das Reisegepäck eingeschlossen oder auch Elektronik (Laptop, Handy, Kamera, Tablet) oder Sportgeräte (Fahrrad, Surfbrett, Kajak). Die Inhaltsversicherung greift, wenn die Gegenstände gestohlen werden (Raub, Einbruch oder Diebstahl) oder durch Feuer, Sturm, Hagel, Blitzschlag, Überschwemmung oder eine Explosion beschädigt oder zerstört werden. Allerdings ist nur der bewegliche Besitz innerhalb des Fahrzeugs versichert. Was im Vorzelt aufbewahrt wird, fällt oft nicht darunter. Ausgenommen sind manchmal auch Bargeld, Geldkarten, Wertpapiere und Schmuck. Darum greifen die üblichen Versicherungen nicht Die normale Hausratversicherung umfasst zwar meist auch Gegenstände im Fahrzeug, das bezieht sich jedoch in der Regel nur auf normale Pkw. Auch eine Reisegepäckversicherung ist für Campingurlaub nicht geeignet, denn darüber ist nur Gepäck versichert, das man mit sich führt und dann auch nur während der Beförderung, also etwa im Zug oder Auto. Gepäck auf dem Campingplatz ist nicht versichert. Zudem sind die Versicherungs- und Entschädigungssummen eher niedrig und Dinge wie Elektrogeräte oft ausgeschlossen. Nur für Dauercamper gedacht ist die Campingkaskoversicherung (auch „Campingversicherung“ genannt). Diese Variante sichert Gegenstände ab, die dauerhaft im Fahrzeug aufbewahrt werden. Was bei einem gemieteten Wohnmobil zu beachten ist Bei einer gewerblichen Vermietung ist der Versicherungsschutz üblicherweise Teil des Mietvertrages. Das sollte man vor einer Unterschrift prüfen. Wenn kein ausreichender Versicherungsschutz enthalten ist, sollten Urlauber:innen klären, ob und zu welchem Preis dieser zusätzlich abgeschlossen werden kann. Auch Camper-Sharing-Plattformen im Internet sind eine Möglichkeit. Solche Fahrzeuge sind meist umfassend versichert. Die Kosten dafür sind häufig im Mietpreis inbegriffen. Vorsicht bei privaten Vermietungen: In der Regel ist bei normalen Haftpflicht- und Kaskoversicherungen eine Vermietung gegen Entgelt ausgeschlossen. Ausnahme: Der Camper ist laut Fahrzeugpapieren als „Selbstfahrer-Vermietfahrzeug“ zugelassen. Was gilt für Fahrräder? Hier kommt es auf die Bedingungen der jeweiligen Versicherung an. Vor allem bei teuren E-Bikes ist ein genauer Blick in die Bedingungen ratsam. Fahrräder im Camper sind versichert, Fahrräder auf einem Träger dagegen häufig nicht, da sie sich am, aber nicht im Fahrzeug befinden. Es gibt auch Anbieter, die Fahrräder und andere Sportgeräte vom Versicherungsschutz komplett ausnehmen. Bei anderen variieren die maximalen Entschädigungsgrenzen. Weiterführende Informationen: Tipps zu Versicherungen für Wohnmobil und Wohnwagen sind online hier zu finden: www.verbraucherzentrale.nrw/node/85308 -- Verbraucherzentrale NRW Pressestelle Helmholtzstraße 19, 40215 Düsseldorf T +49 21191380-1101", + "tags": [], + "status": "Online", + "link": "https://www.presseportal.de/pm/121716/6085196", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:54.235782", + "word_count": 603 + }, + { + "id": "d9aa796056ae1f9e97c194d43adf963e", + "title": "Family Spots: Diese Reiseziele begeistern Groß und Klein", + "date": "Mon, 28 Jul 2025 09:01:28 +0200", + "summary": "Global Communication Experts: PRESSEINFORMATION Family Spots: Diese Reiseziele begeistern Groß und Klein Frankfurt am Main, 28. Juli 2025 - Ein Familienurlaub soll vieles zugleich sein: spannend, erholsam, naturnah und kindgerecht – und dennoch möchten Erwachsene nicht auf ...", + "text": "28.07.2025 – 09:01 Global Communication Experts Family Spots: Diese Reiseziele begeistern Groß und Klein Bild-Infos Download 9 weitere Medieninhalte Ein Dokument 20250728_GCE_Listicle_Family Spots.pdf PDF - 478 kB PRESSEINFORMATION Family Spots: Diese Reiseziele begeistern Groß und Klein Frankfurt am Main, 28. Juli 2025 - Ein Familienurlaub soll vieles zugleich sein: spannend, erholsam, naturnah und kindgerecht – und dennoch möchten Erwachsene nicht auf Kultur, gutes Essen oder Komfort verzichten. Immer mehr Reiseziele zeigen, dass Ferien mit der Familie weit mehr bedeuten können als nur entspannte Tage am Strand. Die Tourismusexperten von Global Communication Experts präsentieren Orte, die mit besonderen Angeboten und kinderfreundlichen Aktivitäten überzeugen – und dabei dafür sorgen, dass sowohl kleine Abenteurer als auch große Genießer auf ihre Kosten kommen. Valencia – Sonne, Meer und Spaß für die ganze Familie Valencia begeistert Familien mit einer Mischung aus Stadt, Strand und kinderfreundlichen Highlights. Ein Muss: das Oceanogràfic , Europas größtes Aquarium. Für Bewegung sorgt der Gulliver Park im Turia-Garten – ein riesiger Abenteuerspielplatz in Form einer liegenden Märchenfigur. Natur pur erleben Familien im nahegelegenen Naturpark L’Albufera mit Bootstouren, Vogelbeobachtung und echter Paella direkt am See. Auch Wassersport-Fans kommen in Valencia auf ihre Kosten: An den weitläufigen Stadtstränden wie Malvarrosa oder El Saler laden das warme Mittelmeer, Paddleboarding und entspannte Badetage zum Verweilen ein. Alles bequem erreichbar – zu Fuß, per Rad oder mit der Valencia Tourist Card . Camping am Lago di Garda – das perfekte Familienabenteuer Die 17 familienfreundlichen Campingplätze rund um den Gardasee bieten flexible, naturnahe und unvergessliche Urlaubserlebnisse für die ganze Familie. Spielplätze gehören auf allen Plätzen zur Grundausstattung, 5 davon verfügen zusätzlich über Indoor-Spielbereiche für regnerische Tage. 11 Plätze begeistern mit Wasserrutschen und 16 bieten Animationsprogramme und direkten Zugang zum Seeufer. Auch sportlich hat der Gardasee einiges zu bieten: 13 Campingplätze organisieren Kurse und Turniere für Kinder und Erwachsene. Ein besonderes Highlight erwartet Familien auf dem Campingplatz La Rocca : ein eigener Bauernhof, auf dem Kinder Tiere hautnah erleben und spielerisch die Natur entdecken können. Madeira – Die Blumeninsel für kleine Entdecker Madeira ist keine klassische Familieninsel – und genau das macht sie spannend. Statt Strandurlaub gibt es hier Baden in natürlichen Felsenpools, Delfinbeobachtung auf hoher See, Kajaktouren entlang der Küste und Wandern entlang der Levadas. Kinder lernen, wie aus einer Bananenblüte ein Snack wird und wie Maracujas schmecken, frisch vom Strauch. Madeira ist ein Naturparadies, das Kinder wie Eltern begeistert. Dank mildem Klima und kurzer Flugzeit eignet sich die Insel perfekt für Familien. Lissabon – Zwischen Haien schlafen und auf dem Tejo Speed Boot fahren Lissabon überrascht Familien mit Orten, die Kinderaugen groß werden lassen: Im interaktiven Wissenschaftsmuseum wird mit Wind, Wasser und Schwerkraft gespielt, im Ozeanarium schlafen Kinder neben Haien und Rochen. Danach geht’s im Speed Boot über den Tejo oder an die Strände von Costa da Caparica. Und wer einen Ausflug nach Setúbal macht, kann mit etwas Glück Delfine in freier Wildbahn sehen. Eine Destination voller Abenteuer. Südafrika – Wo Kinder Tiere in freier Wildbahn erleben können Während in Deutschland der Sommer und die Ferienzeit beginnt, herrscht in Südafrika Winter – die beste Zeit für Wildtierbeobachtungen. Die trockene Landschaft und wenigen Wasserstellen machen die beliebten Big Five (Löwe, Elefant, Nashorn, Büffel, Leopard) leicht sichtbar. Neben klassischen Safaris bieten viele Lodges kinderfreundliche Aktivitäten wie Junior-Ranger-Kurse oder Nachtwanderungen an, wie z.B. die NYATI Safari Lodge in Limpopo, die Thornybush Game Lodge in Mpumalanga oder das Mattanu Private Game Reserve im Northern Cape. Und die Pinguine in Boulders Beach im Western Cape sind ganzjährig eine Attraktion auch und besonders für Familien. Familienzeit neu gedacht in Südtirol Familienurlaub auf Premium-Niveau bietet das Falkensteiner Family Resort Lido in Südtirol, das seit Juli 2025 mit innovativen Suiten und dem neuen Fine-Dining-Konzept DODICI neue Maßstäbe setzt. Drei neu gestaltete Suiten, vom kompakten Smart Family Room bis zur exklusiven Spa Suite mit Whirlpool und Gaming-Zone, bieten maßgeschneiderte Rückzugsorte für Familien mit unterschiedlichen Bedürfnissen. Highlight für kleine Abenteurer: die Falkytent Suite mit Spielhöhle im Zeltstil. Im neuen Restaurant DODICI genießen Familien ein saisonales Drei-Gänge-Menü mit regionalen und mediterranen Einflüssen – in exklusiver Atmosphäre und dennoch kinderfreundlich. Dazu locken der hoteleigene Naturbadesee, das 2.000 Quadratmeter große Falky-Land und ein eigener Zug ins Skigebiet Kronplatz. Ein Resort, das Familienurlaub völlig neu denkt. Bancal Hotel & Spa – Wo Kinder toben und Eltern entspannen können Im BANCAL Hotel & Spa kommen alle Gäste auf ihre Kosten: Nicht nur Erwachsene, sondern auch Kinder können in den Wellnessbereichen entspannen, denn es gibt einen eigenen Kids SPA-Bereich. Zusätzlich stehen zwei kindgerechte Planschbecken bereit. Drei Pools für Erwachsene runden das Angebot ab. Familienfreundliche Zimmer bieten den perfekten Rückzugsort. Im Hotel finden sich Bereiche für Kinder jeden Alters: Der Saal “Tierra y Fuego” für Kinder zwischen 4 und 11 Jahren bietet neben dem Hauptbereich auch einen kleinen Kino- und Theatersaal. Der Saal “Aire” für Kinder zwischen 12 und 16 Jahren verfügt über einen Tischtennistisch und einen Kicker. Im Außenbereich laden ein moderner Spielplatz und ein hauseigener Gemüsegarten zum Toben und Lernen ein. An Orten wie dem Garten „El Bosque“ können Kinder Pflanzen und Insekten entdecken und so die Bedeutung von Umweltschutz hautnah erfahren. So verbindet das BANCAL Hotel Naturerlebnisse mit einem verantwortungsvollen Familienurlaub. Fort Myers – Islands, Beaches and Neighborhoods: Ausflüge für Groß & Klein Im Urlaub auf Zeitreise zu gehen, ist immer spannend: In den Edison and Ford Winter Estates kann die ganze Familie auf den Spuren der Erfinder Thomas Alva Edison und Henry Ford wandeln. In den kommentierten Touren hören die Kinder \"Thomas Edison\" und \"Henry Ford\" beim Geschichtenerzählen zu und können Geschichte so spielerisch erleben. Für zusätzlichen Spaß sorgt eine Schnitzeljagd mit Jerry, dem Pelikan, der eines von Edisons Haustieren war und an mehreren Stellen auf dem Gelände versteckt ist. Eine andere Jagd voller Adrenalin können Familien im SunSplash Family Waterpark in Cape Coral erleben. Unzählige Rutschen und Attraktionen laden zu unvergesslichen Erlebnissen ein. Ein weiteres Highlight ist der Key West Express , der ganzjährig von Fort Myers Beach nach Key West fährt. Mit dieser Jet-Katamaranfahrt wird Sightseeing zu einem spektakulären Tagesausflug für die ganze Familie. Philadelphia – Exponate zum Anfassen und begehbare Herzen Die US-amerikanische Stadt Philadelphia hält für Kinder einige Abenteuer bereit. Eines der Highlights und ein Klassiker ist das Please Touch Museum , in dem Anfassen ausdrücklich erlaubt ist. Hier lädt ein Märchengarten zum Eintauchen in die Kulissen der Lieblingsgeschichten ein und im Raketenraum, können sich die Kids sogar als Astronauten versuchen und die Planeten von oben betrachten. Eine gute Adresse für kleine Wissenschaftler ist auch das Franklin Institute . Hier kann der Nachwuchs durch ein großes, menschliches Herz spazieren oder die vorherseherischen Fähigkeiten seines Gehirns testen. Das Institut gehört zu den ersten Wissenschaftsmuseen Amerikas und bringt seine Besucher mit Live-Demonstrationen und jeder Menge Interaktion zum Staunen. Über global communication experts Global Communication Experts GmbH (GCE) ist eine der führenden deutschen Repräsentanz-, Marketing- und Kommunikationsagenturen im Bereich Tourismus. Zu den Kunden der Agentur mit Hauptsitz in Frankfurt und einer Dependance in München gehören unter anderen die Tourismus-Organisationen, Kreuzfahrt-Unternehmen, Kunden aus dem Reisevertrieb und Mobilität sowie der Luxus-Hotellerie. Global Communication Experts GmbH ist Mitgründer und Gesellschafter der europäischen Agentur International Tourism Group ITG sowie Mitglied des Deutschen Reiseverbands (DRV), des Travel Industry Club und der touristischen Nachhaltigkeitsinitiative Futouris e.V. Global Communication Experts GmbH Hanauer Landstr. 184 60314 Frankfurt p: +49 69 17 53 71-00 f: +49 69 17 53 71-011 m: mail@gce-agency.com w: www.gce-agency.com www.facebook.com/GCEagency www.instagram.com/GCE_agency Geschäftsführer: Dorothea Hohn, Ralf Engelhardt Firmensitz: Frankfurt", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/102577/6085137", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-19T10:05:54.949236", + "word_count": 1226 + }, + { + "id": "e284564835ff0baa0e9e95a1ce9d33c6", + "title": "Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco", + "date": "Tue, 12 Aug 2025 09:00:13 +0200", + "summary": "ECOVACS GLOBAL PTE. LTD.: Neuss (ots) - Endlich vorbei mit der Suche nach der nächsten Steckdose: Die PURE ONE S Serie von Tineco bietet vier leistungsstarke Akkustaubsauger, die mit intelligenter Saugtechnologie, flexibler Handhabung und starker Saugleistung überzeugen. ...", + "text": "ECOVACS GLOBAL PTE. LTD. [ Newsroom ] Neuss (ots) - Endlich vorbei mit der Suche nach der nächsten Steckdose: Die PURE ONE S Serie von Tineco bietet vier leistungsstarke Akkustaubsauger, die mit intelligenter Saugtechnologie, flexibler Handhabung und starker Saugleistung überzeugen. ... Lesen Sie hier weiter... Original-Content von: ECOVACS GLOBAL PTE. LTD., übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/158602/6094967", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-19T10:05:56.502494", + "word_count": 55 + }, + { + "id": "a09539e807d8f0437f63ccd06a6f07d5", + "title": "Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall", + "date": "Thu, 07 Aug 2025 09:00:11 +0200", + "summary": "HUK-COBURG: Coburg (ots) - Freiheit pur: Urlaub mit dem Wohnmobil - Missgeschicke im Urlaub: Unfall oder Panne, welche Versicherung hilft - Wohnmobil - Haushalt auf vier Rädern: Hausrat ist auch außer Haus versichert - Passgenauer Versicherungsschutz spart ...", + "text": "HUK-COBURG [ Newsroom ] Coburg (ots) - Freiheit pur: Urlaub mit dem Wohnmobil - Missgeschicke im Urlaub: Unfall oder Panne, welche Versicherung hilft - Wohnmobil - Haushalt auf vier Rädern: Hausrat ist auch außer Haus versichert - Passgenauer Versicherungsschutz spart ... Lesen Sie hier weiter... Original-Content von: HUK-COBURG, übermittelt durch news aktuell", + "tags": [], + "status": "Online", + "link": "https://www.presseportal.de/pm/7239/6091976", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-19T10:05:56.802411", + "word_count": 52 + }, + { + "id": "3bbed4f8df37473a6898edf97fee9d73", + "title": "EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher", + "date": "Wed, 06 Aug 2025 17:53:09 +0200", + "summary": "Dr. Stoll & Sauer Rechtsanwaltsgesellschaft mbH: Der Europäische Gerichtshof hat am 1. August 2025 erneut eine Grundsatzentscheidung im Diesel-Abgasskandal gefällt. Käufer manipulierter Fahrzeuge erhalten künftig einen einheitlichen Anspruch auf Entschädigung – unabhängig vom Besitz, ...", + "text": "Dr. Stoll & Sauer Rechtsanwaltsgesellschaft mbH [ Newsroom ] Der Europäische Gerichtshof hat am 1. August 2025 erneut eine Grundsatzentscheidung im Diesel-Abgasskandal gefällt. Käufer manipulierter Fahrzeuge erhalten künftig einen einheitlichen Anspruch auf Entschädigung – unabhängig vom Besitz, ... Lesen Sie hier weiter...", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/105254/6091837", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-19T10:05:57.362059", + "word_count": 42 + }, + { + "id": "897946cff6c62a1c36ba85da5247b58c", + "title": "Trotz Camper-Hype: Der Pkw ist die unangefochtene Nummer 1 für Sommerreisen", + "date": "Thu, 24 Jul 2025 13:14:33 +0200", + "summary": "kfzteile24 GmbH: Berlin (ots) - - Klarer Favorit: Acht von zehn befragten Kunden* verreisen im Sommer 2025 mit dem Auto - Campingurlaub? Für mehr als die Hälfte (55,8 %) nicht vorstellbar - Pkw als unverzichtbarer Reisebegleiter: Flexibilität (82,4 %) und ...", + "text": "kfzteile24 GmbH [ Newsroom ] Berlin (ots) - - Klarer Favorit: Acht von zehn befragten Kunden* verreisen im Sommer 2025 mit dem Auto - Campingurlaub? Für mehr als die Hälfte (55,8 %) nicht vorstellbar - Pkw als unverzichtbarer Reisebegleiter: Flexibilität (82,4 %) und ... Lesen Sie hier weiter... Original-Content von: kfzteile24 GmbH, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/116585/6083456", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-19T10:05:57.995770", + "word_count": 56 + }, + { + "id": "2005f6a657f214a1e628a3b985108c93", + "title": "Doppelfolge am 24. Juli \"Oksana & Family - Alles auf Anfang\": Abwasserprobleme, Jobsuche und Tonstudiobesuch", + "date": "Thu, 24 Jul 2025 09:00:13 +0200", + "summary": "RTLZWEI: München (ots) - - Abwasseralarm im Wohnmobil und Songaufnahme mit der Familie - Doppelfolge am Donnerstag, den 24. Juli 2025, um 20:15 Uhr bei RTLZWEI und vorab auf RTL+ Auf ihrem abenteuerlichen Roadtrip steuern die Kolenitchenkos einen ...", + "text": "RTLZWEI [ Newsroom ] München (ots) - - Abwasseralarm im Wohnmobil und Songaufnahme mit der Familie - Doppelfolge am Donnerstag, den 24. Juli 2025, um 20:15 Uhr bei RTLZWEI und vorab auf RTL+ Auf ihrem abenteuerlichen Roadtrip steuern die Kolenitchenkos einen ... Lesen Sie hier weiter... Original-Content von: RTLZWEI, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/6605/6083013", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-19T10:05:58.255021", + "word_count": 53 + }, + { + "id": "d2d113b8b419140a9d0aa2b60f0720e4", + "title": "Neue Folge \"Oksana & Family - Alles auf Anfang\": Zwischen Camping-Chaos und einer schweren Entscheidung", + "date": "Thu, 17 Jul 2025 09:30:00 +0200", + "summary": "RTLZWEI: München (ots) - - Chaotische Vorbereitungen: Der Urlaub startet mit unerwarteten Hürden. - Milan vor einer großen Entscheidung: Fußball oder Filmrolle? - Am Donnerstag, den 17. Juli 2025 um 20:15 Uhr, bei RTLZWEI und sieben Tage vorab auf RTL+ ...", + "text": "RTLZWEI [ Newsroom ] München (ots) - - Chaotische Vorbereitungen: Der Urlaub startet mit unerwarteten Hürden. - Milan vor einer großen Entscheidung: Fußball oder Filmrolle? - Am Donnerstag, den 17. Juli 2025 um 20:15 Uhr, bei RTLZWEI und sieben Tage vorab auf RTL+ ... Lesen Sie hier weiter... Original-Content von: RTLZWEI, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/6605/6078446", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-19T10:05:58.509818", + "word_count": 55 + }, + { + "id": "fd927aa7c87099dc2a6c17fe3aa9db64", + "title": "Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper", + "date": "Wed, 16 Jul 2025 10:00:41 +0200", + "summary": "AutoScout24: Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper Jeder Vierte für komplette Liberalisierung von Campingfahrzeugen im öffentlichen Raum / 20 Prozent würden mehr Übernachtungen im eigenen Fahrzeug zulassen / Minderheit will ...", + "text": "16.07.2025 – 10:00 AutoScout24 Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper Ein Dokument AutoScout24_MI_Mehrh~ile und Camper .pdf PDF - 148 kB Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper Jeder Vierte für komplette Liberalisierung von Campingfahrzeugen im öffentlichen Raum / 20 Prozent würden mehr Übernachtungen im eigenen Fahrzeug zulassen / Minderheit will Campern hingegen selbst das Parken verbieten Grünwald, 16. Juli 2025. Deutschlands Autofahrer sprechen sich in ihrer Mehrheit für liberalere Regeln beim Campen und Übernachten in Wohnmobilen im öffentlichen Raum aus. So würde fast jeder Zweite den Reisenden mehr Freiheiten einräumen: 26 Prozent sind für die komplette Aufhebung von Campingverboten, 21 Prozent würden zumindest mehr Übernachtungen auf öffentlichen Plätzen im eigenen Fahrzeug gestatten. Das geht aus einer aktuellen, repräsentativen Umfrage von AutoScout24 unter Autohaltern in Deutschland* hervor. Demnach ist ein Großteil der Befragten mit der aktuellen Gesetzeslage einverstanden. Eine Minderheit fordert hingegen drastische Einschränkungen für freistehende Camper. Auch wenn der Boom seit der Coronakrise nachgelassen hat: Das Reisen in Campervan und Wohnmobil ist weiterhin extrem beliebt in Deutschland. So überstieg der Bestand an zugelassenen Reisemobilen hierzulande im April dieses Jahres erstmals die Millionengrenze. Doch so frei wie manche meinen, ist man mit Bulli & Co. keineswegs. Denn Wildcampen darf man mit den Fahrzeugen hierzulande nicht auf öffentlichen Plätzen. Es ist allenfalls erlaubt, eine Nacht im Wohnmobil zu verbringen, um damit die Fahrtüchtigkeit wiederherzustellen. Campingstühle und dergleichen dürfen dabei nicht rausgestellt werden. Doch sind diese Regeln im Herzland der Reisemobilisten überhaupt noch zeitgemäß? Sieht man sich die Ergebnisse der AutoScout24-Umfrage an, darf man daran seinen Zweifel haben. So vertritt jeder Vierte (26 Prozent) die Ansicht, dass es den Reisenden jederzeit und unbeschränkt gestattet sein sollte, mit ihren Fahrzeugen im öffentlichen Raum zu stehen und dort auf Wunsch auch zu campieren. Weitere 21 Prozent sind zwar dagegen, dass Stühle und Tische auf Stellplätzen aufgebaut werden, sie finden aber, es sollte erlaubt sein, auch mehrere Nächte im eigenen Fahrzeug zu übernachten. Damit sprechen sich 47 Prozent der deutschen Autohalter für liberalere Regeln beim Motorcamping im öffentlichen Raum aus. Für 39 Prozent der Befragten haben sich die geltenden Regeln hingegen bewährt: Eine Übernachtung zur Wiederherstellung der Fahrtüchtigkeit ist okay, aber mehr Freiheiten für Camper sind aus ihrer Sicht nicht wünschenswert . Die Umfrage verdeutlicht aber auch, dass Womos nicht nur Fans in Deutschland haben. So würden 2 Prozent der Befragten auch die eine erlaubte Übernachtung auf öffentlichen Plätzen am liebsten streichen – Wiederherstellung der Fahrtüchtigkeit hin oder her. Und 4 Prozent würden sogar noch einen Schritt weitergehen: Aus ihrer Sicht sollte nicht nur das Übernachten im Van untersagt werden, es sollte auch ein generelles Parkverbot für Wohnmobile im öffentlichen Raum geben. Was sich absurd anhört, ist mancherorts durchaus Realität: Mit Verbotsschildern und Höhenbegrenzungen wird Reisemobilen die Zufahrt zu Parkplätzen verwehrt. Jüngere für freies Campen, Ältere für Status quo Vor allem jüngere Befragte unter 40 Jahren sind für einen liberaleren Umgang bei dem Thema: 34 Prozent sprechen sich für ein komplett freies Camping aus, weitere 27 Prozent würden zumindest die Beschränkung auf nur eine Übernachtung zur Wiederherstellung der Fahrtüchtigkeit kippen . Unter dem Strich sind damit 61 Prozent in diesem Alterssegment für weniger Vorschriften beim Motorcampen. Auf der anderen Seite ist es die Gruppe der 50- bis 65-Jährigen , in der verstärkt für die Beibehaltung des Status quo argumentiert wird: 46 Prozent sind der Ansicht, die aktuelle Regelung habe sich bewährt und wollen daher alles so lassen , wie es ist. In der gleichen Alterskohorte finden sich aber auch überproportional viele, die dem wilden Campertreiben deutlichere Grenzen setzen würden. Insgesamt 7 Prozent der 50- bis 65-Jährigen fordern so ein Parkverbot für Wohnmobile im öffentlichen Raum. Allerdings spricht einiges dafür, dass sich die restriktiven Forderungen bei einigen der älteren Hardliner schon in wenigen Jahren in ihr Gegenteil verkehren werden. Denn eines der liebsten Hobbys der Deutschen im Ruhestand ist schließlich das Reisen im eigenen Wohnmobil – ein Zufahrtsverbot für den Parkplatz am See ist dann natürlich das letzte, was man sich wünscht. * Für die Umfrage hat AutoScout24 gemeinsam mit Innofact vom 4. bis zum 10. Juni dieses Jahres eine repräsentative Gruppe von 1.001 Autohaltern in Deutschland zwischen 18 und 65 Jahren befragt. Die Ergebnisstabelle finden Sie unten zum Download. Über AutoScout24 AutoScout24 ist mit über 2 Millionen Fahrzeuginseraten und rund 30 Millionen monatlichen Nutzern europaweit der größte Online-Automarkt. Neben Deutschland ist die AutoScout24 Gruppe auch in den europäischen Kernmärkten Belgien, Luxemburg, Niederlande, Italien, Frankreich, Österreich, Norwegen, Dänemark, Polen und Schweden vertreten. Durch gezielte Akquisitionen im B2B- und B2C-Bereich hat AutoScout24 sein Leistungsportfolio in den vergangenen Jahren maßgeblich erweitert. Mit der Übernahme von LeasingMarkt.de im Jahr 2020 wurde Deutschlands größter Marktplatz für Leasingangebote integriert. Seit 2022 gehört auch AutoProff , eine der am schnellsten wachsenden B2B-Plattformen für den digitalen Autohandel in Europa, zur AutoScout24 Familie. Mit der Übernahme der kanadischen Trader Corporation , Betreiber der Marktplätze AutoTrader.ca und AutoHebdo.net , erweiterte die Gruppe Ende 2024 ihre Präsenz schließlich auch nach Übersee. Als einer der führenden globalen Online-Automarktplätze beschäftigt die AutoScout24 Gruppe rund 2.000 Mitarbeitende und arbeitet mit mehr als 45.000 Händlern in 19 Ländern zusammen. Weitere Informationen finden Sie unter www.autoscout24.de Pressekontakt: Julia Gremmo I Public Relations I Fon +49 89 444 56-1185I presse@autoscout24.de ------------------------------------------------------------------------ AutoScout24 GmbH Tölzerstr. 16, 82031 Grünwald Geschäftsführer: Peter Brooks-Johnson, Biliana Alabatchka, Michael Luhnen Handelsregister: Amtsgericht München, HRB 128701 Sitz der Gesellschaft: Grünwald | USt-IdNr. DE 207254100 ------------------------------------------------------------------------ http://www.autoscout24.de", + "tags": [], + "status": "Online", + "link": "https://www.presseportal.de/pm/13984/6077676", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-19T10:05:59.107304", + "word_count": 891 + }, + { + "id": "e65f2a2e03f62303cfb202f1ac43ee5b", + "title": "Urlaub mit Wohnmobil: erhöhte Unfallgefahr", + "date": "Tue, 15 Jul 2025 10:40:00 +0200", + "summary": "R+V Infocenter: Wiesbaden (ots) - Reisen mit dem Wohnmobil sind sehr beliebt. Doch wer nur selten mit einem so großen Fahrzeug unterwegs ist, sollte sich gut vorbereiten. Der Camper \"tickt\" in vielen Verkehrssituationen anders als ein Pkw. Darauf macht das ...", + "text": "R+V Infocenter [ Newsroom ] Wiesbaden (ots) - Reisen mit dem Wohnmobil sind sehr beliebt. Doch wer nur selten mit einem so großen Fahrzeug unterwegs ist, sollte sich gut vorbereiten. Der Camper \"tickt\" in vielen Verkehrssituationen anders als ein Pkw. Darauf macht das ... Lesen Sie hier weiter... Original-Content von: R+V Infocenter, übermittelt durch news aktuell", + "tags": [], + "status": "Online", + "link": "https://www.presseportal.de/pm/63400/6076962", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-19T10:05:59.387537", + "word_count": 56 + }, + { + "id": "2bb2d39a4c649293b8524420eab1abf2", + "title": "Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online", + "date": "2025-08-19T07:13:13Z", + "summary": "2, Stover Strand Camping, Drage ; 3, Campingplatz Ecktannen, Waren ; 4, Campingpark Kalletal, Lippe ; 5, Südsee-Camp, Wietzendorf ...", + "text": "2, Stover Strand Camping, Drage ; 3, Campingplatz Ecktannen, Waren ; 4, Campingpark Kalletal, Lippe ; 5, Südsee-Camp, Wietzendorf ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:02.916939", + "word_count": 20 + }, + { + "id": "e1dc6cbadc08e0168b2b7b3493da8552", + "title": "Go's und No-Go's auf dem Husumer Campingplatz - SHZ", + "date": "2025-08-19T05:06:05Z", + "summary": "Es ist mitten in der Urlaubssaison, auf dem Husumer Campingplatz „Regenbogen“ am Dockkoog stehen derzeit so einige Wohnmobile, Wohnwagen und Zelte ...", + "text": "Es ist mitten in der Urlaubssaison, auf dem Husumer Campingplatz „Regenbogen“ am Dockkoog stehen derzeit so einige Wohnmobile, Wohnwagen und Zelte ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/husum/artikel/gos-und-no-gos-auf-dem-husumer-campingplatz-49140857&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2QF6COS0JJi1OJck-Moqnc", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:03.162820", + "word_count": 22 + }, + { + "id": "807545b7f424277288bc6e1725f2c346", + "title": "Camping: Grenzüberschreitung! Gäste greifen zu harten Maßnahmen - moin.de", + "date": "2025-08-18T21:33:27Z", + "summary": "Die Community ist fassungslos – und diskutiert hitzig über richtiges Verhalten auf dem Campingplatz! Der Newsletter von MOIN.DE mit dem ...", + "text": "Die Community ist fassungslos – und diskutiert hitzig über richtiges Verhalten auf dem Campingplatz ! Der Newsletter von MOIN.DE mit dem ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.moin.de/norddeutschland/camping-platz-nachbarn-was-tun-voll-verrueckt-plaetze-id300643691.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3yKD6zM5C0GGtXMIRQ476n", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:03.429480", + "word_count": 22 + }, + { + "id": "106602e3fd2a5c32de58ef0c1109c893", + "title": "Camping erobert neue Zielgruppen | Trends - Counter vor9", + "date": "2025-08-18T21:08:35Z", + "summary": "Campingplatz Barco Reale. Nicht nur Zelte: Der Campingplatz Barco Reale in Lamporecchio, Montalbano, Italien. Mit fast 43 Millionen Übernachtungen ...", + "text": "Campingplatz Barco Reale. Nicht nur Zelte: Der Campingplatz Barco Reale in Lamporecchio, Montalbano, Italien. Mit fast 43 Millionen Übernachtungen ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.countervor9.de/trends/camping-erobert-neue-zielgruppen&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw25FhwEFlV2_J6vE622fq-G", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:03.678520", + "word_count": 20 + }, + { + "id": "26a7bb1acc8a6662f065d3f1751eca49", + "title": "Liveschalte - Vom DDR-Intercamping zum modernen Campingplatz Berlin | rbb - rbb24", + "date": "2025-08-18T19:41:44Z", + "summary": "Der Platz, in DDR-Zeiten als „Intercamping am Krossinsee“ bekannt, wurde am 01. April 2010 unter dem Namen Campingplatz Krossinsee 1930 GmbH ...", + "text": "Der Platz, in DDR-Zeiten als „Intercamping am Krossinsee“ bekannt, wurde am 01. April 2010 unter dem Namen Campingplatz Krossinsee 1930 GmbH ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.rbb-online.de/der-tag/ort/schmoekwitzwerder-camping-am-krossinsee.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2DBDdZLr3yZhvUrdhKDBMZ", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:03.912613", + "word_count": 22 + }, + { + "id": "823b0cd7fb5a7022fbf1767c937c73d3", + "title": "Verträge laufen aus – Steht der Dauercampingplatz in Karlstein am Main vor dem Aus?", + "date": "2025-08-18T18:25:29Z", + "summary": "Seit Wochen sorgt der Campingplatz am Großwelzheimer Weißsee in Karlstein für Schlagzeilen. Die Gemeinde will den traditionsreichen Platz mit mehr ...", + "text": "Seit Wochen sorgt der Campingplatz am Großwelzheimer Weißsee in Karlstein für Schlagzeilen. Die Gemeinde will den traditionsreichen Platz mit mehr ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.tvmainfranken.de/mediathek/video/vertraege-laufen-aus-steht-der-dauercampingplatz-in-karlstein-am-main-vor-dem-aus/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1DnOUC_hBM-Pi_zSeQ-Agv", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:04.153398", + "word_count": 21 + }, + { + "id": "8f90724a995c1c4fee2e7b5cabe54562", + "title": "Urlaub mit Hund in Mecklenburg-Vorpommern: Hier sind Vierbeiner willkommen", + "date": "2025-08-18T17:17:33Z", + "summary": "Der Campingplatz in Kühlungsborn gilt als hundefreundlichster in ganz Deutschland. Urlaubsplanung mit Hund ist aber nicht immer einfach.", + "text": "Der Campingplatz in Kühlungsborn gilt als hundefreundlichster in ganz Deutschland. Urlaubsplanung mit Hund ist aber nicht immer einfach.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/mecklenburg-vorpommern/urlaub-mit-hund-in-mv-hier-sind-vierbeiner-willkommen-BRLVGYNE2VE6JCGSNWVMQ6MQ64.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28_kG-NzvJuF08jgbQyzeZ", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:04.399929", + "word_count": 18 + }, + { + "id": "cc004a5c0f1e1797062721173f219f95", + "title": "Deutsche auf größtem Campingplatz der Welt: „Musst du in Therapie“ - news38.de", + "date": "2025-08-18T17:05:13Z", + "summary": "Zwei deutsche Ehepaare machen Urlaub auf einem Campingplatz in den USA. Doch die Enttäuschung kommt sofort.", + "text": "Zwei deutsche Ehepaare machen Urlaub auf einem Campingplatz in den USA. Doch die Enttäuschung kommt sofort.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.news38.de/panorama/promi-tv/article300594965/camping-bella-italia-rtl2-usa-fingerhuth.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1LclJVLbC4CWJ-Z13ITJAE", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:04.637701", + "word_count": 16 + }, + { + "id": "ce298eea7e0afa87b9f8f744ef9374c5", + "title": "Hitze mit 30 Grad und mehr: Tropensturm bringt Europa nochmal Spätsommer-Wetter", + "date": "2025-08-18T16:14:54Z", + "summary": "Hurrikan Erin könnte Tropenluft nach Europa pumpen – Deutschland erlebt vielleicht noch einmal Sommerhitze. Eine Wetter-Kolumne von Dominik Jung.", + "text": "Hurrikan Erin könnte Tropenluft nach Europa pumpen – Deutschland erlebt vielleicht noch einmal Sommerhitze. Eine Wetter-Kolumne von Dominik Jung.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/hitze-mit-30-grad-und-mehr-tropensturm-bringt-europa-nochmal-spaetsommer-wetter-zr-93887738.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw04IwICepfw_rAkj4MdEEpf", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:04.883366", + "word_count": 19 + }, + { + "id": "c84bd15256c149f5c01fd4616cd7acbe", + "title": "Urlaub vor der Haustür: Warum der Innenhof des Zschopauer Seniorenzentrums für zwei ...", + "date": "2025-08-18T16:04:39Z", + "summary": "Für zwei Tage wurde der Innenhof der Einrichtung zu einem Campingplatz, der unweigerlich Urlaubsgefühle aufkommen ließ. Neben drei Wohnwagen und ...", + "text": "Für zwei Tage wurde der Innenhof der Einrichtung zu einem Campingplatz , der unweigerlich Urlaubsgefühle aufkommen ließ. Neben drei Wohnwagen und ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.freiepresse.de/erzgebirge/zschopau/urlaub-vor-der-haustuer-warum-der-innenhof-des-zschopauer-seniorenzentrums-fuer-zwei-tage-zum-campingplatz-wurde-artikel13923271&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw18Q6crLrGxT2s5ouNzshac", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:05.178635", + "word_count": 22 + }, + { + "id": "90f48afd220911f0435bf0c2397d42b2", + "title": "A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin", + "date": "2025-08-18T15:43:27Z", + "summary": "... Autobahn. Finde deinen Traum-Campingplatz. Anreise. -. Abreise. -. Gäste. 2 Erwachsene. 0 Kinder. Angebote ansehen. Reisedaten. Gäste: 2. Erwachsene.", + "text": "... Autobahn. Finde deinen Traum- Campingplatz . Anreise. -. Abreise. -. Gäste. 2 Erwachsene. 0 Kinder. Angebote ansehen. Reisedaten. Gäste: 2. Erwachsene.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:05.414824", + "word_count": 22 + }, + { + "id": "479995034ac0ecff58def14c0e0deef4", + "title": "Surfer (85) am Chiemsee verschwunden: Großanlegte Suchaktion auch am Montag - Rosenheim24", + "date": "2025-08-18T15:35:12Z", + "summary": "... Campingplatz Übersee“, teilte die Polizeiinspektion Traunstein in einer Pressemitteilung zu dem Einsatz bislang mit. Bei dem Vermissten handelt es ...", + "text": "... Campingplatz Übersee“, teilte die Polizeiinspektion Traunstein in einer Pressemitteilung zu dem Einsatz bislang mit. Bei dem Vermissten handelt es ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.rosenheim24.de/rosenheim/polizeimeldungen/uebersee-polizei-und-wasserwacht-suchen-vermissten-surfer-am-chiemsee-bis-dato-ohne-erfolg-93887306.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2w_irRYdoJKzLR0X84Ad8e", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:05.657279", + "word_count": 21 + }, + { + "id": "e155999f8061b5f7aa3ef42eeccc7fd3", + "title": "Toter 13-Jähriger: Ermittler gehen von Unfall aus - DieSachsen.de", + "date": "2025-08-18T14:51:39Z", + "summary": "Die Umstände und Hintergründe des Todes eines 13-Jährigen in der Oberlausitz sind weiter unklar. Der Junge war von ...", + "text": "Die Umstände und Hintergründe des Todes eines 13-Jährigen in der Oberlausitz sind weiter unklar. Der Junge war von ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.diesachsen.de/unfall-und-verkehr/toter-13-jaehriger-ermittler-gehen-von-unfall-aus-3045700&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2lqwMLXlVEe-Tds0lRaXMi", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:05.893366", + "word_count": 19 + }, + { + "id": "52c77988129ccf267dd662de288e549d", + "title": "Angriff mit Yoga-Matten: Mutter mit zwei Kindern auf Campingplatz Langlau in Not", + "date": "2025-08-18T14:43:36Z", + "summary": "Pfofeld - Was eine Mutter mit zwei Kindern auf dem Langlauer Campingplatz erlebte, war nicht gerade schön. Erst kam das Gewitter, dann wurden die ...", + "text": "Pfofeld - Was eine Mutter mit zwei Kindern auf dem Langlauer Campingplatz erlebte, war nicht gerade schön. Erst kam das Gewitter, dann wurden die ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/gunzenhausen/angriff-mit-yoga-matten-mutter-mit-zwei-kindern-auf-campingplatz-langlau-in-not-1.14800747&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ugUpG1IfTlR1FCFcgsHvG", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:06.146076", + "word_count": 25 + }, + { + "id": "4da3a058a1daa9efec5b52dc198909ca", + "title": "Übersee: 85-jähriger Surfer wird auf dem Chiemsee vermisst - Traunsteiner Tagblatt", + "date": "2025-08-18T14:12:04Z", + "summary": "Als er bis in die Abendstunden nicht zurückkehrte, wurden zahlreiche Rettungskräfte zum Campingplatz nach Übersee alarmiert. Neben einer Vielzahl ...", + "text": "Als er bis in die Abendstunden nicht zurückkehrte, wurden zahlreiche Rettungskräfte zum Campingplatz nach Übersee alarmiert. Neben einer Vielzahl ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.traunsteiner-tagblatt.de/region/landkreis-traunstein/uebersee_artikel,-85jaehriger-surfer-wird-auf-dem-chiemsee-vermisst-_arid,952723.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0dJa3tuybPxYdMYo3oV320", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:06.397206", + "word_count": 20 + }, + { + "id": "d7c8f35a7601bc3541443b1cf0c0417c", + "title": "Weinsberg CaraTour 600 ME im Test: Abenteuer auf vier Rädern? - IMTEST", + "date": "2025-08-18T14:08:48Z", + "summary": "Camping-Kastenwagen Weinsberg Weinsberg CaraTour 600 ME in seitlicher Ansicht auf einem Campingplatz. · Einblick ins Cockpit (mit Infotainment-Display) ...", + "text": "Camping-Kastenwagen Weinsberg Weinsberg CaraTour 600 ME in seitlicher Ansicht auf einem Campingplatz . · Einblick ins Cockpit (mit Infotainment-Display) ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.imtest.de/mobilitaet-reise/weinsberg-caratour-600-me-camping-van-kompakt-kastenwagen-test-ziemlich/424550&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3y4Gx77nyLDlu4T5QBAh_-", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:06.642649", + "word_count": 20 + }, + { + "id": "99c5b661fcce2f35e1c1d4018c513cad", + "title": "An Weilburger Tankstelle fliegen die Fäuste - Echo Online", + "date": "2025-08-18T14:01:27Z", + "summary": "Verlassener Campingplatz wird zu Lost Place und Müllkippe. Mehrere Jahrzehnte lebten auf dem Platz ganze Familien, doch im Dezember 2021 war ...", + "text": "Verlassener Campingplatz wird zu Lost Place und Müllkippe. Mehrere Jahrzehnte lebten auf dem Platz ganze Familien, doch im Dezember 2021 war ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/kreis-limburg-weilburg/weilburg/an-weilburger-tankstelle-fliegen-die-faeuste-4892024&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l7jUxG7664vJ69cHwv20M", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:06.878597", + "word_count": 22 + }, + { + "id": "1738787ebe5a9377046e001ef150eacb", + "title": "Ein spannendes Wochenende für kleine Abenteurer - BLICK aktuell", + "date": "2025-08-18T13:55:58Z", + "summary": "September um 15 Uhr verwandelt sich der Campingplatz im Eichenwald (57537 Mittelhof) in eine geheimnisvolle Dschungelwelt - voller spannender ...", + "text": "September um 15 Uhr verwandelt sich der Campingplatz im Eichenwald (57537 Mittelhof) in eine geheimnisvolle Dschungelwelt - voller spannender ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.blick-aktuell.de/Termine/Ein-spannendes-Wochenende-fuer-kleine-Abenteurer--636547.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0kVA76weLMICuiplUm9G5M", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:07.130889", + "word_count": 20 + }, + { + "id": "1351732007b9375b53a348b1da5b7ce9", + "title": "Woran ein Campingplatz-Experte des ADAC deutsche Urlauber direkt erkennt", + "date": "2025-08-18T13:36:11Z", + "summary": "Das ist auch das Erste, worauf ich achte, wenn ich auf einem Campingplatz ankomme“, berichtet ein Camping-Experte vom ADAC.", + "text": "Das ist auch das Erste, worauf ich achte, wenn ich auf einem Campingplatz ankomme“, berichtet ein Camping-Experte vom ADAC.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.lauterbacher-anzeiger.de/panorama/woran-ein-campingplatz-experte-des-adac-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw14jziy82R0xboz7sPEvmaR", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:07.387144", + "word_count": 19 + }, + { + "id": "1c7da660042000c4e8e395852b2d0d04", + "title": "Vermisster Junge bei Lohsa: Obduktion des toten 13-Jährigen abgeschlossen | Lausitzer Rundschau", + "date": "2025-08-18T13:14:37Z", + "summary": "13-Jähriger von Campingplatz verschwunden - Großeinsatz. Ein 13-jähriger Junge war von einem Campingplatz bei Lohsa verschwunden. Nach ...", + "text": "13-Jähriger von Campingplatz verschwunden - Großeinsatz. Ein 13-jähriger Junge war von einem Campingplatz bei Lohsa verschwunden. Nach ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.lr-online.de/lausitz/hoyerswerda/vermisster-junge-bei-lohsa-obduktion-des-toten-13-jaehrigen-abgeschlossen-78252705.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bCvU4jnneGEZTl3uf48qo", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T10:06:07.624555", + "word_count": 18 + }, + { + "id": "c54ba93aa39280671ca65feb724977dc", + "title": "Jeep Cherokee als Camper – der einfache Weg zum autarken Urlaub - vanlifemag.de", + "date": "2025-08-18T21:16:57Z", + "summary": "Vanlife Serie · News · Vanlife Custom · Vanlife Dachzelt · Vanlife on Tour ... Meet and PeopleVanlife Custom. ·7 Minuten Lesedauer. Jeep Cherokee als ...", + "text": "Vanlife Serie · News · Vanlife Custom · Vanlife Dachzelt · Vanlife on Tour ... Meet and People Vanlife Custom. ·7 Minuten Lesedauer. Jeep Cherokee als ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/jeep-cherokee-als-camper/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0A-3nq90dUx96JAA9j2VYX", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305", + "source_name": "Google Alert – Vanlife", + "created_at": "2025-08-19T10:06:09.494382", + "word_count": 27 + }, + { + "id": "729ec04387fdd2e3ae502f3432b27f15", + "title": "RC-1 SEMA Build: Ein Show-Camper setzt neue Maßstäbe - vanlifemag.de", + "date": "2025-08-18T07:02:27Z", + "summary": "Ein Showfahrzeug mit Vanlife im Blut. Rogue Vans hat mit dem RC-1 SEMA Build eindrucksvoll bewiesen, dass auch ein Campervan ein echter Showstar sein ...", + "text": "Ein Showfahrzeug mit Vanlife im Blut. Rogue Vans hat mit dem RC-1 SEMA Build eindrucksvoll bewiesen, dass auch ein Campervan ein echter Showstar sein ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/rc-1-sema-build-ein-show-camper-setzt-neue-massstaebe/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0gYNfiVFof8MRF16Pp8QEt", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305", + "source_name": "Google Alert – Vanlife", + "created_at": "2025-08-19T10:06:09.733009", + "word_count": 25 + }, + { + "id": "eb8a92177de6d9d862f889eb34f25502", + "title": "Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und", + "date": "2025-08-18T06:04:09Z", + "summary": "Unternehmensgruppe NOZ/mh:n - Vier Tage Messe, Festival und Vanlife-Community in Rendsburg – mit ...✚ Mehr lesen.", + "text": "Unternehmensgruppe NOZ/mh:n - Vier Tage Messe, Festival und Vanlife -Community in Rendsburg – mit ...✚ Mehr lesen.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305", + "source_name": "Google Alert – Vanlife", + "created_at": "2025-08-19T10:06:09.965845", + "word_count": 17 + }, + { + "id": "a9de2c1a677f2dbcbb300cea0fc97bff", + "title": "San Hejmo Festival 2026: Datum, Line-up, Neuheiten, Fotos - Düsseldorf Tonight", + "date": "2025-08-18T20:20:02Z", + "summary": "Die Termine fürs San Hejmo 2026 stehen: Welche Headliner sind dabei? Was kosten die Tickets, wie teuer ist Camping und wie gelingt die Anfahrt?", + "text": "Die Termine fürs San Hejmo 2026 stehen: Welche Headliner sind dabei? Was kosten die Tickets, wie teuer ist Camping und wie gelingt die Anfahrt?", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.tonight.de/freizeit/san-hejmo-festival-2026-datum-line-up-neuheiten-fotos_150121.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw1oblZYw0b618LHsaVJWsDI", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856", + "source_name": "Google Alert – Camping Termine 2024", + "created_at": "2025-08-19T10:06:11.588353", + "word_count": 24 + }, + { + "id": "a90be9a2e94cbe4d9ace0b660181a17c", + "title": "Familie Ochsenknecht: Camping-Urlaub mit Jimi Blue | GALA.de", + "date": "2025-08-18T14:59:19Z", + "summary": "Nach dem Camping-Abenteuer steht für Jimi Blue Ochsenknecht ein Gerichtstermin an, der laut der "Tiroler Tageszeitung" am 22. August stattfinden ...", + "text": "Nach dem Camping -Abenteuer steht für Jimi Blue Ochsenknecht ein Gerichtstermin an, der laut der \"Tiroler Tageszeitung\" am 22. August stattfinden ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.gala.de/stars/news/familie-ochsenknecht--camping-urlaub-mit-jimi-blue-24437026.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2sgq15V-Z-mJUEaEvTyAdQ", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856", + "source_name": "Google Alert – Camping Termine 2024", + "created_at": "2025-08-19T10:06:11.819871", + "word_count": 22 + }, + { + "id": "bf4569aa16b0d78869ded643a2fc5647", + "title": "Echo Open Air 2025 in Mindelheim (Westernach): Termin, Line-Up, Tickets, Bezahlung, Camping ...", + "date": "2025-08-18T14:33:33Z", + "summary": "Echo Open Air 2025 in Mindelheim (Westernach): Termin, Line-Up, Tickets, Bezahlung, Camping, Parken ... Bereits 2024 ...", + "text": "Echo Open Air 2025 in Mindelheim (Westernach): Termin , Line-Up, Tickets, Bezahlung, Camping , Parken ... Bereits 2024 ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.augsburger-allgemeine.de/mindelheim/echo-open-air-2025-mindelheim-westernach-am-wochenende-line-up-tickets-parken-camping-110529337&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2QZff-JniMKd0gb3ZzaRQ0", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856", + "source_name": "Google Alert – Camping Termine 2024", + "created_at": "2025-08-19T10:06:12.061280", + "word_count": 19 + }, + { + "id": "29037d96e0aa59c0f15ae65b20b05c54", + "title": "Gamescom 2025: Aston Martin im Zenless Zone Zero-Design - Autozeitung", + "date": "2025-08-18T14:37:32Z", + "summary": "... Spielemesse. Zwar wird kurz vor dem Start der Messe (20. bis 24. August 2025) nicht bekannt gegeben, welcher Autohersteller offiziell an der Messe ...", + "text": "... Spielemesse . Zwar wird kurz vor dem Start der Messe (20. bis 24. August 2025 ) nicht bekannt gegeben, welcher Autohersteller offiziell an der Messe ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/gamescom-2025-messe-highlights-fuer-autofans-209057.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0FXrDgBBR2LkRWJXcWhY_P", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-19T10:06:13.926099", + "word_count": 27 + }, + { + "id": "c8de25e901c4109954c2a8f1b658278f", + "title": "Caravan Salon und Ed Sheeran zeitgleich: Droht ein Verkehrskollaps? | Regional - BILD.de", + "date": "2025-08-18T13:05:18Z", + "summary": "Heißt: Jeweils mehr als 100.000 Camping- und Musik-Fans wird es an dem Freitag, Samstag und Sonntag in den Norden der NRW-Landeshauptstadt ziehen. Der ...", + "text": "Heißt: Jeweils mehr als 100.000 Camping - und Musik-Fans wird es an dem Freitag, Samstag und Sonntag in den Norden der NRW-Landeshauptstadt ziehen. Der ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.bild.de/regional/duesseldorf/caravan-salon-und-ed-sheeran-zeitgleich-droht-ein-verkehrskollaps-689c5654149faf081095d6cc&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1SRpJIm3W_DbR7mUVWZ4WS", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-19T10:06:14.169651", + "word_count": 25 + }, + { + "id": "9160268e00eebf06ae16136e264081a1", + "title": "Neu bei Steam: Die gamescom 2025 wirft ihren Schatten voraus - GameStar", + "date": "2025-08-18T12:06:22Z", + "summary": "... Messe | Ort: Köln | Termin: 20. bis 24. August 2025. Diese Woche ist es ... Caravanners: Co-op Open World Camping (Early Access): Virtuelles Camping ...", + "text": "... Messe | Ort: Köln | Termin: 20. bis 24. August 2025 . Diese Woche ist es ... Caravanners: Co-op Open World Camping (Early Access): Virtuelles Camping ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.gamestar.de/artikel/neu-bei-steam,3437937.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2sHEDYfSnIyZwh9_ssIU_y", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-19T10:06:14.422019", + "word_count": 28 + }, + { + "id": "6b165d5c34ca0f9bdeb384a8cd94e8ef", + "title": "MEORGA MSR-Spezialmesse in Ludwigshafen - klamm.de", + "date": "2025-08-18T09:39:33Z", + "summary": "Die MEORGA veranstaltet am 10. September 2025 in der Friedrich-Ebert-Halle in Ludwigshafen eine Fachmesse für Mess-, Steuerungs- und Regeltechnik, ...", + "text": "Die MEORGA veranstaltet am 10. September 2025 in der Friedrich-Ebert-Halle in Ludwigshafen eine Fachmesse für Mess-, Steuerungs- und Regeltechnik, ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.klamm.de/news/meorga-msr-spezialmesse-in-ludwigshafen-4N1254481.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11VrqOODIm34SfZyc87aDJ", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-19T10:06:14.787423", + "word_count": 20 + }, + { + "id": "7a6acb0a306eccab094279057ee22ac0", + "title": "Akku leer: Gefahren beim Laden von E-Bikes", + "date": "Tue, 19 Aug 2025 10:20:00 +0200", + "summary": "R+V Infocenter: Wiesbaden (ots) - E-Bike-Akkus wieder aufladen: In den eigenen vier Wänden ist das kein Problem. Anders sieht es in gemeinschaftlich genutzten Räumen oder am Arbeitsplatz aus. Dort ist eine Erlaubnis notwendig. Darauf macht das Infocenter der ...", + "text": "R+V Infocenter [ Newsroom ] Wiesbaden (ots) - E-Bike-Akkus wieder aufladen: In den eigenen vier Wänden ist das kein Problem. Anders sieht es in gemeinschaftlich genutzten Räumen oder am Arbeitsplatz aus. Dort ist eine Erlaubnis notwendig. Darauf macht das Infocenter der ... Lesen Sie hier weiter... Original-Content von: R+V Infocenter, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/63400/6099613", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-19T20:16:39.559235", + "word_count": 54 + }, + { + "id": "0e156dd4462d1d53b4c33d461492d1cc", + "title": "Winterthur: Campingplatz Schützenweiher kommt an die Urne - Tages-Anzeiger", + "date": "2025-08-19T16:25:21Z", + "summary": "Nun entscheidet die Winterthurer Bevölkerung über den Campingplatz Schützenweiher. Die IG Camping hat über 1500 Unterschriften gesammelt. Damit will ...", + "text": "Nun entscheidet die Winterthurer Bevölkerung über den Campingplatz Schützenweiher. Die IG Camping hat über 1500 Unterschriften gesammelt. Damit will ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.tagesanzeiger.ch/winterthur-campingplatz-schuetzenweiher-kommt-an-die-urne-637538306386&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0agfyAxzRqVvd3uX5bhaA-", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:46.788570", + "word_count": 20 + }, + { + "id": "e1f2dbd9ba6bcc54a89b956bf00ca38e", + "title": "Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail", + "date": "2025-08-19T15:44:59Z", + "summary": "Jede Nation hat ihre eigenen Vorlieben – auch beim Camping. Ein Experte verrät, woran er deutsche Urlauber auf einem Campingplatz erkennt.", + "text": "Jede Nation hat ihre eigenen Vorlieben – auch beim Camping. Ein Experte verrät, woran er deutsche Urlauber auf einem Campingplatz erkennt.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:47.679684", + "word_count": 21 + }, + { + "id": "40469f336d60d735ab2d0c3bb5f2a64e", + "title": "Woran ein Campingplatz-Experte deutsche Urlauber sofort erkennt", + "date": "2025-08-19T15:39:00Z", + "summary": "Das ist auch das Erste, worauf ich achte, wenn ich auf einem Campingplatz ankomme“, erklärt ein Camping-Experte vom ADAC.", + "text": "Das ist auch das Erste, worauf ich achte, wenn ich auf einem Campingplatz ankomme“, erklärt ein Camping-Experte vom ADAC.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-sofort-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bjSwJduCIDU44lYDuu22U", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:48.591816", + "word_count": 19 + }, + { + "id": "62c440deccbd30aad3c194f99100be54", + "title": "WTG-Insolvenz in Hooksiel: Investor für Campingplatz und Hallenbad gefunden", + "date": "2025-08-19T14:58:25Z", + "summary": "Der Campingplatz und Meerwasser-Hallenbad in Hooksiel sollen verkauft werden. Nach Abschluss des Interessenbekundungsverfahrens verhandelt die ...", + "text": "Die Verkaufsverhandlungen für den Campingplatz und das Meerwasser-Hallenbad in Hooksiel sind im Gange. Dies folgt dem Abschluss des Verfahrens zur Bekundung von Interesse.", + "tags": [ + "Campingplatz", + "Meerwasser-Hallenbad", + "Hooksiel", + "Verkaufsverhandlungen", + "Immobilienverkauf" + ], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.nwzonline.de/friesland/wtg-insolvenz-in-hooksiel-investor-fuer-campingplatz-und-hallenbad-gefunden_a_4,2,1744055285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2NSatmqIKkGVEo26UyQfCS", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:49.480625", + "word_count": 23, + "rewritten_at": "2025-08-20T08:20:56.738946" + }, + { + "id": "e21969aa8c882a748c6457a5b394c5d9", + "title": "Nach Krisentreffen in Karlstein: Mögliche Rettung für die Dauercamper am Großwelzheimer Weißsee", + "date": "2025-08-19T12:51:47Z", + "summary": "Davon schreibt das Campingplatz-Gremium auch in einem Brief an die Großwelzheimer Dauercamper. Dieser mögliche Investor kann sich demnach vorstellen, ...", + "text": "Davon schreibt das Campingplatz -Gremium auch in einem Brief an die Großwelzheimer Dauercamper. Dieser mögliche Investor kann sich demnach vorstellen, ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.main-echo.de/region/stadt-kreis-aschaffenburg/nach-dem-krisentreffen-in-karlstein-moegliche-rettung-fuer-die-dauercamper-art-8562505&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0F7beKEClnDEQsNAUMuWIr", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:50.400023", + "word_count": 21 + }, + { + "id": "2190ed396edb115ff9487f4693ce401c", + "title": "Sassari: Polizei greift bei illegalem Camping zwischen Lake Baratz und Porto Ferro ein.", + "date": "2025-08-19T11:58:27Z", + "summary": "Für den kleinen Campingplatz fehlte eine Genehmigung und er entsprach nicht den gesetzlichen Hygiene- und Sicherheitsstandards . Die Stadtpolizei ...", + "text": "Für den kleinen Campingplatz fehlte eine Genehmigung und er entsprach nicht den gesetzlichen Hygiene- und Sicherheitsstandards . Die Stadtpolizei ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.unionesarda.it/de/sardinien/sassari-polizei-greift-bei-illegalem-camping-zwischen-lake-baratz-und-porto-ferro-ein-gb90frrb&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2uUKNIFkm1Rvv58CAVg2_U", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:51.284329", + "word_count": 20 + }, + { + "id": "7ae73aec7cf384171c5c690e07855ebf", + "title": "Camping am See in Brandenburg – 5 besonders schöne Plätze", + "date": "2025-08-19T11:52:04Z", + "summary": "Ein Campingplatz direkt am See ist die perfekte Kombination für den Sommer. B.Z. stellt die besten Campingplätze in Brandenburg vor.", + "text": "Ein Campingplatz direkt am See ist die perfekte Kombination für den Sommer. B.Z. stellt die besten Campingplätze in Brandenburg vor.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.bz-berlin.de/ratgeber/camping-in-brandenburg-am-see&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28Yp1DHAiG7pUNIJF_tLkC", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:52.177950", + "word_count": 20 + }, + { + "id": "00bf563116da12cf7a1c055aa2f2edbd", + "title": "Lost Place im Odenwald: Verlassener Campingplatz lockt Menschen an - Echo Online", + "date": "2025-08-19T11:29:09Z", + "summary": "Ein verlassener Campingplatz im Odenwald wird zum Lost Place – und zur Müllkippe. Mehrere Jahrzehnte lebten auf dem Platz ganze Familien.", + "text": "Ein verlassener Campingplatz im Odenwald wird zum Lost Place – und zur Müllkippe. Mehrere Jahrzehnte lebten auf dem Platz ganze Familien.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/odenwaldkreis/oberzent-odenwaldkreis/lost-place-odenwald-verlassener-campingplatz-muellkippe-forum-oberzent-4805851&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39nSnV29WHn7ytbY8s4wkI", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:53.078459", + "word_count": 21 + }, + { + "id": "3af22c4774f5ab01262eff463b34dfbb", + "title": "Sachsens Campingplätze: Hier können Naturliebhaber Urlaub machen", + "date": "2025-08-19T10:52:42Z", + "summary": "Am größten sächsischen See bietet der Campingplatz sowohl klassisches Camping im Zelt oder Wohnmobil, als auch Glamping im Safari-Zelt. Der Trend des ...", + "text": "Am größten sächsischen See bietet der Campingplatz sowohl klassisches Camping im Zelt oder Wohnmobil, als auch Glamping im Safari-Zelt. Der Trend des ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.saechsische.de/sachsen/sachsens-campingplaetze-hier-koennen-naturliebhaber-urlaub-machen-LISYQBT5XRCHDEHUZUU66IKT7Y.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3LZG2TbqgyYMDOING19TpS", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:53.984044", + "word_count": 23 + }, + { + "id": "47f9d2ce09acd3acb5fde56b8797a326", + "title": "Herford: Betrüger mit Machete auf Campingplatz verhaftet - WELT", + "date": "2025-08-19T10:01:00Z", + "summary": "Auf einem Campingplatz bei Herford konnte die Polizei einen international gesuchten Betrüger festnehmen. Im Caravan waren Schusswaffen, ...", + "text": "Auf einem Campingplatz bei Herford konnte die Polizei einen international gesuchten Betrüger festnehmen. Im Caravan waren Schusswaffen, ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.welt.de/regionales/duesseldorf/article118823818/Herford-Betrueger-mit-Machete-auf-Campingplatz-verhaftet.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1SrZmj-KpWRtFejPpNVBcw", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:54.871491", + "word_count": 18 + }, + { + "id": "ac987638621cd9643930d9e8fc4a5603", + "title": "Neuer Campingplatz in Niedersachsen eröffnet: Betreiber sind europaweit bekannt - HNA", + "date": "2025-08-19T09:07:20Z", + "summary": "Bad Sachsa entwickelt sich zu einem Magneten für Camper. Ein neuer Platz wurde eröffnet. Ein digitales System soll den Gästen mehr Flexibilität ...", + "text": "Bad Sachsa entwickelt sich zu einem Magneten für Camper. Ein neuer Platz wurde eröffnet. Ein digitales System soll den Gästen mehr Flexibilität ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/in-europa-wohlbekannt-neuer-campingplatz-in-niedersachsen-eroeffnet-betreiber-93885856.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0KfYM1g3v_ASkaG5-L4e1w", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:55.766259", + "word_count": 23 + }, + { + "id": "704a16e9489da28f12e54f66c367bc4c", + "title": "Effizient und umweltfreundlich: Campingplatz in Erden mit neuer LED-Beleuchtung", + "date": "2025-08-19T07:55:26Z", + "summary": "Neuee LED-Beleuchtung: Gemeinsam mit der Ortsgemeinde Erden hat Westenergie die Beleuchtung auf dem Campingplatz am Moselufer 1 modernisiert.", + "text": "Neuee LED-Beleuchtung: Gemeinsam mit der Ortsgemeinde Erden hat Westenergie die Beleuchtung auf dem Campingplatz am Moselufer 1 modernisiert.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://lokalo.de/artikel/376714/effizient-und-umweltfreundlich-campingplatz-in-erden-mit-neuer-led-beleuchtung/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2fXa6aZmE3BqkAsNbHCnwC", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:56.668508", + "word_count": 18 + }, + { + "id": "384457fb35f9a8a4fc9871b6d19a23c9", + "title": "Seit 60 Jahren Campingurlaub auf Usedom: Leipzigerin hat sich ihren Stammplatz in ...", + "date": "2025-08-19T03:07:05Z", + "summary": "Als Monika Becker 1965 das erste Mal ihr Zelt auf dem Ückeritzer Campingplatz aufschlug, regierte in der DDR noch Walter Ulbricht, in der Schule war ...", + "text": "Als Monika Becker 1965 das erste Mal ihr Zelt auf dem Ückeritzer Campingplatz aufschlug, regierte in der DDR noch Walter Ulbricht, in der Schule war ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/lokales/vorpommern-greifswald/usedom/seit-60-jahren-campingurlaub-auf-usedom-leipzigerin-hat-sich-ihren-stammplatz-in-ueckeritz-YWTEPQ3CHBFIDJQZLTYNTQG3DU.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw02dVQz4QETTNH0fLbVCXSy", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-19T20:16:58.478264", + "word_count": 26 + }, + { + "id": "dafb25b91a77de2a89ce9941c8250bf1", + "title": "Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail", + "date": "2025-08-19T15:44:59Z", + "summary": "Laut dem Statistischen Bundesamt erreichte der Campingtrend 2024 mit knapp 42,9 Millionen Gästeübernachtungen einen neuen Rekord. Thomas Reimann ...", + "text": "Laut dem Statistischen Bundesamt erreichte der Campingtrend 2024 mit knapp 42,9 Millionen Gästeübernachtungen einen neuen Rekord. Thomas Reimann ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856", + "source_name": "Google Alert – Camping Termine 2024", + "created_at": "2025-08-19T20:17:08.247038", + "word_count": 19 + }, + { + "id": "fc082d7f623847d3566c399a06f57341", + "title": "Fahrzeugtechnik am Wohnmobil im Detail: Windschutzscheiben sind längst mehr als Glas", + "date": "Wed, 20 Aug 2025 06:00:00 +0200", + "summary": "

Wir vertrauen der Windschutzscheibe, wenn man’s genau nimmt, unser Leben an und sind uns sicher, dass sie nie bricht. Dafür gibt es Gründe.

", + "text": "Auf den ersten Blick ist die Windschutzscheibe eines Campingbusses nur ein großes Stück Glas. Wer das so sieht, unterschätzt die Komponente jedoch deutlich. Denn moderne Windschutzscheiben sind längst Hightech-Produkte – weit entfernt von simplem Glas. Sie sind Lebensretter, Sichtfenster für die Kameras und Sensoren der Assistenzsysteme und natürlich Einflussfaktoren fürs Raumklima. Schutzschild vor Wind, Wetter und Steinschlag Die wichtigste Funktion von Windschutzscheiben bleibt auch an Campingbussen und Wohnmobilen der Schutz vor Fahrtwind, Gischt und Regen oder umherfliegenden Gegenständen. Deshalb müssen sie enorm stabil sein und viele Schläge abhalten können, ohne zu zerspringen. Sie bestehen deshalb aus gleich mehreren Schichten. In der Mitte steckt eine zäh elastische Kunststofffolie, die meistens aus Polyvinylbutyral (PVB) ist. Diese ist zwischen zwei Scheiben aus speziellem Verbundglas eingebettet. Der Trick: Bei einem Aufprall zerspringt das Glas zwar in viele Teile, doch die Splitter bleiben an der Folie haften – und so werden die Insassen vor Verletzungen geschützt. Aber das ist noch nicht alles. Je nach Modell steckt noch viel mehr drin: Tönung gegen Sonnenblenden, Heizelemente gegen Beschlag. Manche Scheiben können sogar schalldämmend wirken oder Sonnenstrahlen reflektieren, um den Innenraum kühl zu halten. Sichtfeld für Menschen und Sensoren Genauso wie für uns Menschen sind die Windschutzscheiben, auch die \"Sichtfenster\" für moderne Assistenzsysteme. Deren Infrarotsensoren und Kameras sitzen oft direkt hinter der Windschutzscheibe – meist im oberen Teil. Regensensoren erkennen durch Lichtreflexion, ob Wasser auf der Scheibe steht – und aktivieren automatisch die Scheibenwischer. Viele Transporter wie der Mercedes Sprinter, Fiat Ducato oder Ford Transit Custom nutzen Kameras hinter der Scheibe für Spurhalte- oder Notbremssysteme. Diese Kameras \"blicken\" durch einen exakt definierten Bereich der Frontscheibe – und sind extrem empfindlich gegenüber Verzerrungen oder Lichtbrechungen. Deshalb muss die Scheibe perfekt zu diesen Systemen passen. Einfach eine Glasscheibe in der passenden Form einzusetzen, geht nciht. Schon kleinste Abweichungen im Glas – etwa durch nicht originale Ersatzscheiben – können dazu führen, dass die Kamera die Fahrbahn nicht mehr richtig erkennt. Nach einem Tausch muss die Sensorik neu kalibriert werden, sonst drohen Fehlfunktionen bei sicherheitsrelevanten Systemen. Die Windschutzscheibe ist also längst nicht mehr nur ein Sichtfenster – sie ist ein funktionaler Bestandteil moderner Fahrzeugtechnik. Bei Schäden Windschutzscheibe tauschen Doch auch Hightech ist nicht unverwundbar: Ein kleiner Steinschlag reicht manchmal, und es entsteht ein feiner Riss. Dieser kann sich durch Erschütterungen oder Temperaturschwankungen schnell ausbreiten. Die Folge: eingeschränkte Sicht und ein Sicherheitsrisiko. Deshalb gilt: Bei einem Steinschlag möglichst schnell handeln! Kleine Schäden können oft noch repariert werden – vorausgesetzt, sie sind nicht im direkten Sichtfeld des Fahrers und nicht größer als etwa eine Zwei-Euro-Münze. Also: nicht abwarten, sondern die Werkstatt ansteuern.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/moderne-windschutzscheiben-mehr-als-nur-glas/", + "images": [], + "source": "https://www.promobil.de/rss/ratgeber", + "source_name": "ratgeber bei www.promobil.de", + "created_at": "2025-08-20T08:27:09.594421", + "word_count": 428 + }, + { + "id": "ed173e5a76d183f8c48be9c12aa40492", + "title": "Campingplatz Arendsee: Handlungsbedarf bei Dauercampern - AZ-Online", + "date": "2025-08-20T05:28:11Z", + "summary": "Im AZ-Interview spricht Stefan Zierke, Präsident des BVCD über seine Eindrücke vom Campingplatz am Arendsee.", + "text": "Im AZ-Interview spricht Stefan Zierke, Präsident des BVCD über seine Eindrücke vom Campingplatz am Arendsee.", + "tags": [], + "status": "Online", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.az-online.de/altmark/arendsee/campingplatz-arendsee-handlungsbedarf-bei-dauercampern-93891117.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3pMfHlZ-X_c1tydcMGsUKz", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-20T08:27:18.448435", + "word_count": 15 + }, + { + "id": "3b2aa107d09760cf00a6f640fe764e5f", + "title": "„Tante Henni“: Haslohs idyllischer Mini-Campingplatz an der A7 - Hamburger Abendblatt", + "date": "2025-08-20T05:02:49Z", + "summary": "... Campingplatz. Auf einem der kleinsten Campingplätze in Schleswig-Holstein: „Tante Henni“ liegt direkt an der A7 bei Hasloh und gehört Norbert ...", + "text": "... Campingplatz . Auf einem der kleinsten Campingplätze in Schleswig-Holstein: „Tante Henni“ liegt direkt an der A7 bei Hasloh und gehört Norbert ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.abendblatt.de/schleswig-holstein/norderstedt/article409752359/tante-henni-haslohs-idyllischer-mini-campingplatz-an-der-a7.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l1jr7kdJVDA3nrTWt9vaE", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-20T08:27:18.845648", + "word_count": 23 + }, + { + "id": "769e7a1829c56dbc2bfe481581b3fa8f", + "title": "Toter 13-Jähriger: Jetzt liegt das Obduktionsergebnis vor - MSN", + "date": "2025-08-19T20:43:42Z", + "summary": "August von einem Campingplatz bei Lohsa verschwunden und zwei Tage später tot aufgefunden worden. Danilo Dittrich © Danilo Dittrich. Der in der ...", + "text": "August von einem Campingplatz bei Lohsa verschwunden und zwei Tage später tot aufgefunden worden. Danilo Dittrich © Danilo Dittrich. Der in der ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/toter-13-j%25C3%25A4hriger-jetzt-liegt-das-obduktionsergebnis-vor/ar-AA1KIBko&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3WZAfu7i39_TT7qgG7OXgi", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-20T08:27:19.270955", + "word_count": 23 + }, + { + "id": "60f2e274af6f4ec1a175e07f96b70214", + "title": "Woran ein Campingplatz-Experte deutsche Urlauber direkt erkennt", + "date": "2025-08-19T20:28:53Z", + "summary": "Das ist auch das Erste, worauf ich achte, wenn ich auf einem Campingplatz ankomme“, verrät ein Camping-Experte vom ADAC.", + "text": "Das ist auch das Erste, worauf ich achte, wenn ich auf einem Campingplatz ankomme“, verrät ein Camping-Experte vom ADAC.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3jJhVNzmOoLWdIEPL4NLUD", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-20T08:27:19.668465", + "word_count": 19 + }, + { + "id": "974a2be4fc1887bd8ea5abbc1926ceaa", + "title": "PicOli Light 2.0 im Praxistest: Vanlife-Grillaufsatz im Härtetest - Vanlifemag", + "date": "2025-08-20T02:58:54Z", + "summary": "Vanlife bedeutet Freiheit – aber in einem vollgepackten Camper zählt jeder Quadratzentimeter. Ein Grill für unterwegs muss daher klein, leicht und ...", + "text": "Vanlife bedeutet Freiheit – aber in einem vollgepackten Camper zählt jeder Quadratzentimeter. Ein Grill für unterwegs muss daher klein, leicht und ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/picoli-light-2-0-im-praxistest-vanlife-grillaufsatz-im-haertetest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1_sGi-W7VUoJmclmaolF5T", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305", + "source_name": "Google Alert – Vanlife", + "created_at": "2025-08-20T08:27:26.689217", + "word_count": 22 + }, + { + "id": "ea279103929d6ffc7e02e6ee44336399", + "title": "Einhell TE-COL 18/2 Li Kühlbox im Vanlife-Praxistest - vanlifemag.de", + "date": "2025-08-19T16:13:52Z", + "summary": "Vanlife-Fans kennen das Szenario: Man parkt den Camper am Ufer, will mit dem Boot hinaus oder am Strand liegen, aber wie bleiben die Getränke kühl?", + "text": "Vanlife -Fans kennen das Szenario: Man parkt den Camper am Ufer, will mit dem Boot hinaus oder am Strand liegen, aber wie bleiben die Getränke kühl?", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/einhell-te-col-18-2-li-kuehlbox-im-vanlife-praxistest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3Pcz_ZggLAFD6QGjl_LVMd", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305", + "source_name": "Google Alert – Vanlife", + "created_at": "2025-08-20T08:27:28.118595", + "word_count": 26 + }, + { + "id": "c943206eacf319e86fc3319c16bc326f", + "title": "Toyota Hilux mit Eigenbau-Wohnkabine - vanlifemag.de", + "date": "2025-08-19T06:40:18Z", + "summary": "Vanlife Serie · News · Vanlife Custom · Vanlife Dachzelt · Vanlife on Tour ... Meet and PeopleVanlife Custom. ·7 Minuten Lesedauer. Toyota Hilux mit ...", + "text": "Vanlife Serie · News · Vanlife Custom · Vanlife Dachzelt · Vanlife on Tour ... Meet and People Vanlife Custom. ·7 Minuten Lesedauer. Toyota Hilux mit ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/toyota-hilux-mit-eigenbau-wohnkabine/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3EAfLd1L-OC7rE84KQDRCE", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305", + "source_name": "Google Alert – Vanlife", + "created_at": "2025-08-20T08:27:28.993662", + "word_count": 27 + }, + { + "id": "823d283e0a3d67e8e395a7029a10ea99", + "title": "Opel Corsa GSE Vision (2025): Elektro-Studie auf Lambo-Niveau - Autozeitung", + "date": "2025-08-19T23:20:27Z", + "summary": "Camping Life · Elektroautos · Motorsport · Neuheiten · Tuning · Test ... Schon kurz nach der Messe im September 2025 (hier alle Infos zur IAA ...", + "text": "Camping Life · Elektroautos · Motorsport · Neuheiten · Tuning · Test ... Schon kurz nach der Messe im September 2025 (hier alle Infos zur IAA ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/opel-corsa-gse-vision-gran-turismo-2025-elektro-studie-209130.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1HzJt6GJ0DkRsbYPmlqUee", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-20T08:27:32.818096", + "word_count": 27 + }, + { + "id": "3286bb2c672f7dd8a5ed82d1eed769f2", + "title": "IFA 2025: Jackery mit Solarneuheiten - Presseportal fair-NEWS", + "date": "2025-08-19T23:13:22Z", + "summary": "... Camping, auf Festivals oder bei Outdoor-Aktivitäten wünschen. Zugleich ... Wörtlich: Denn die neue Location direkt neben der Messe punktet ...", + "text": "... Camping , auf Festivals oder bei Outdoor-Aktivitäten wünschen. Zugleich ... Wörtlich: Denn die neue Location direkt neben der Messe punktet ...", + "tags": [], + "status": "Online", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fair-news.de/3797899/ifa-2025-jackery-mit-solarneuheiten&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0dSlwjcVA83vgTV2l9TZ5-", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-20T08:27:33.268999", + "word_count": 22 + }, + { + "id": "238a279ff9dde4dec397a6b9bc4433be", + "title": "Gamescom 2025 in Köln: Harte Zeiten für die Spaßbranche - DER SPIEGEL", + "date": "2025-08-19T19:28:37Z", + "summary": "In Köln startet diesen Mittwoch die weltgrößte Spielemesse. Präsentiert werden Hunderte neue Games, doch die glitzernde Fassade täuscht: Viele ...", + "text": "In Köln startet diesen Mittwoch die weltgrößte Spielemesse . Präsentiert werden Hunderte neue Games, doch die glitzernde Fassade täuscht: Viele ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.spiegel.de/netzwelt/games/gamescom-2025-in-koeln-harte-zeiten-fuer-die-spassbranche-a-8c9bf6ff-7c79-4b41-a258-a8b0fe60c4f7&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3WHPfdQA9_GLb7dunmnB1a", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-20T08:27:33.707200", + "word_count": 21 + }, + { + "id": "2251e3248080e82de9e55a94c04386a9", + "title": "Videospiel-Messe in Köln: Gamescom 2025 – Parkplätze, Toiletten, Verpflegung", + "date": "2025-08-19T19:22:52Z", + "summary": "Videospiel-Messe in Köln: Gamescom 2025 – Parkplätze, Toiletten, Verpflegung ... Alternativ werden auch immer öfter Camping-Stühle mit aufs Gelände ...", + "text": "Videospiel- Messe in Köln: Gamescom 2025 – Parkplätze, Toiletten, Verpflegung ... Alternativ werden auch immer öfter Camping -Stühle mit aufs Gelände ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://rp-online.de/digitales/games/gamescom/videospiel-messe-in-koeln-gamescom-2025-parkplaetze-toiletten-verpflegung-v1_aid-24360691&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0gvygeAFwk9oOITrE1LeGY", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-20T08:27:34.185116", + "word_count": 22 + }, + { + "id": "874181c5247f0b46ce74e7adac501bd0", + "title": "Das sind die Spiele der gamescom 2025 - Fragster", + "date": "2025-08-19T17:02:04Z", + "summary": "Ubisoft (Halle 6). In Halle 6 wird Ubisoft mit dem Game Anno 117: Pax Romana vertreten sein, das ihr auf der Messe auch ausprobieren könnt. Die ...", + "text": "Ubisoft (Halle 6). In Halle 6 wird Ubisoft mit dem Game Anno 117: Pax Romana vertreten sein, das ihr auf der Messe auch ausprobieren könnt. Die ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fragster.de/das-sind-die-spiele-der-gamescom-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3zb8d-Ga08YcvwVYYzFYlH", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-20T08:27:34.603225", + "word_count": 27 + }, + { + "id": "8293e15aa1fe849859204f53b390bdd0", + "title": "5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping", + "date": "Fri, 22 Aug 2025 14:00:00 +0200", + "summary": "

Lesen bildet und macht Spaß. Wie gut, dass es so viele Bücher über unsere liebste Reiseform gibt. Hier kommen 5 Buchtipps übers Camping.

", + "text": "Camping-Liebhaber, die auf der Suche nach einer passenden Lesung sind, können aus einer breiten Auswahl an Büchern wählen, die alle Aspekte des Campings abdecken, von humorvollen bis zu politisch unkorrekten Themen. \n\nDas Buch \"Nicht ohne meinen Wohnwagen\" von Frauke Vonk erzählt die Geschichte der Familie Gerber, die sich zwischen einem Campingausflug und einem Hotelaufenthalt entscheiden muss. Die Abenteuer, die sie erleben, sind vielseitig und mit viel Humor geschildert. Das Buch ist als Taschenbuch für 9,99 Euro und als E-Book für 2,99 Euro erhältlich.\n\nEin weiteres Buch, \"Der CaraWahn kommt selten allein\" von Micha H. Echt, handelt von Oberamtsrat Klaus Dipendenti, der sich mit seiner Frau Gertrude auf ein Campingabenteuer begibt. Es kostet ab 11,80 Euro.\n\nBernd Stelters \"Der Tod hat eine Anhängerkupplung\" ist ein Krimi, der auf einem Campingplatz in Holland spielt. \n\nZum 75. Jahrestag des VW Bulli ist \"Bulli – eine Ikone feiert Geburtstag\" von Arne Olerth, Christian Schlüter und Heiko P. Wacker erschienen. Dieses Buch zeichnet die Geschichte des legendären VW Bulli nach und kostet 39,75 Euro. \n\nFür Reisebegeisterte, die Deutschland auf ungewöhnliche Weise erkunden möchten, bietet der Reiseführer \"Guck mal: Verrückte Orte in Deutschland\" von Marco Polo eine Sammlung von 222 ungewöhnlichen Reisezielen. Das Buch ist für 19,95 Euro erhältlich.", + "tags": [ + "Camping", + "Buchempfehlungen", + "Reiseliteratur", + "VW Bulli", + "Deutschland Reiseführer" + ], + "status": "Online", + "link": "https://www.promobil.de/tipps/lesestoff-buch-tipps-camping-freizeit/", + "images": [], + "source": "https://www.promobil.de/rss/ratgeber", + "source_name": "ratgeber bei www.promobil.de", + "created_at": "2025-08-24T10:10:21.750203", + "word_count": 203, + "rewritten_at": "2025-08-24T10:20:31.816662", + "wp_upload_date": "2025-08-24T10:21:40.901242", + "wp_post_id": 3450 + }, + { + "id": "a918d66ffa6ccae238d6410872ec769f", + "title": "Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen", + "date": "Thu, 21 Aug 2025 17:00:00 +0200", + "summary": "

Mit den neuen Funktionen des Stellplatz-Radar finden Sie europaweit noch einfacher Ihren Wunschstellplatz für Campervan, Wohnmobil oder Wohnwagen. Erfahren Sie alles über das aktuelle Upgrade.

", + "text": "Die promobil-Stellplatz-Radar-App, die kostenfrei für Android und iPhones verfügbar ist, bietet Wohnmobilisten und Campern europaweit einfachen Zugang zu über 30.000 Stell- und Campingplätzen. Sie enthält detaillierte Informationen und Bilder der Plätze und über 170.000 Bewertungen von Nutzern. Zusätzliche Funktionen wie Tourenplanung, erweiterte Suchfilter, ein Offline-Modus und eine Favoriten- und Notizfunktion erweitern das Nutzererlebnis.\n\nIm August 2025 wird die App um zwei neue Funktionen erweitert. Der Active Camper Club ist ein Belohnungssystem, das Nutzer für ihre Beiträge zur App belohnt, wie das Melden neuer Stellplätze, das Verfassen von Bewertungen oder das Hochladen von Fotos. Ein neues personalisiertes Push-Benachrichtigungssystem versorgt die Nutzer gezielt mit relevanten Informationen.\n\nZusätzlich ist nun der Dark Mode verfügbar und die App ist auch auf Englisch und Französisch verfügbar. Durch eine Kooperation mit Energie-Rath können Nutzer nun auch Orte zum Gasflaschen-Tausch in der App finden. Eine neue Funktion ermöglicht es Nutzern, individuelle Camping-Touren zu erstellen und zu speichern.\n\nDie App bietet eine gewaltige Datenbank mit über 30.000 europaweiten Plätzen, die ständig aktualisiert wird. Alle Plätze werden von der promobil-Redaktion geprüft und erweitert. Die App präsentiert umfangreiche Beschreibungen der Stellplätze und bietet eine integrierte Suchfunktion, Karte und Ergebnisliste auf einer Seite.\n\nDie Basisfunktionen der App sind kostenlos, aber ein Plus-Abo für 2,99 Euro pro Monat oder 9,99 Euro pro Jahr bietet zusätzliche Funktionen wie erweiterte Suchfilter, Favoritenfunktion, Notizfunktion, Offline-Nutzung und werbefreie Nutzung.\n\nMit den erweiterten Suchfiltern können Nutzer ihre Suche personalisieren und die favorisierten Sucheinstellungen im Profil speichern. Die Favoritenfunktion ermöglicht es Nutzern, einzelne Plätze zu speichern und Notizen zu erstellen. Mit der Offline-Funktion haben Nutzer vollen Zugriff auf die Stellplatz-Datenbank, auch in Gebieten mit schlechtem Empfang oder im Ausland.", + "tags": [ + "Camping-App", + "Stellplatz-Suche", + "Tourenplanung", + "Belohnungssystem", + "Offline-Nutzung" + ], + "status": "Online", + "link": "https://www.promobil.de/tipps/download-stellplatz-radar-app-kostenlos/", + "images": [ + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:243/rt:fill/w:430/plain/2232522.jpg", + "alt": "Stellplatz-Radar-App", + "caption": "Stellplatz-Radar-App", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/download-stellplatz-radar-app-kostenlos/", + "width": 430, + "height": 243, + "title": "Stellplatz-Radar-App" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2232520.jpg", + "alt": "Stellplatz-Radar-App", + "caption": "Stellplatz-Radar-App", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/download-stellplatz-radar-app-kostenlos/", + "width": 430, + "height": 241, + "title": "Stellplatz-Radar-App" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2232521.jpg", + "alt": "Stellplatz-Radar-App", + "caption": "Stellplatz-Radar-App", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/download-stellplatz-radar-app-kostenlos/", + "width": 430, + "height": 241, + "title": "Stellplatz-Radar-App" + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2132175.jpg", + "alt": "Mit der Touren-Funktion können Sie Ihre ganz persönliche Reiseroute gestalten und Stell- und Campingplätze entlang der Route hinzufügen.", + "caption": "Mit der Touren-Funktion können Sie Ihre ganz persönliche Reiseroute gestalten und Stell- und Campingplätze entlang der Route hinzufügen.", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/download-stellplatz-radar-app-kostenlos/", + "width": 430, + "height": 241, + "title": "Mit der Touren-Funktion können Sie Ihre ganz persönliche Reiseroute gestalten und Stell- und Campingplätze entlang der Route hinzufügen." + }, + { + "url": "https://img.promobil.de/_/bg:FFFFFF/f:best/h:241/rt:fill/w:430/plain/2132222.jpg", + "alt": "Einfache Suche - entweder direkt über die Karte mit Preisorientierung durch verschiedene Farben oder in der Listenansicht mit mehr Details.", + "caption": "Einfache Suche - entweder direkt über die Karte mit Preisorientierung durch verschiedene Farben oder in der Listenansicht mit mehr Details.", + "copyright": "Unbekannt", + "copyright_url": "https://www.promobil.de/tipps/download-stellplatz-radar-app-kostenlos/", + "width": 430, + "height": 241, + "title": "Einfache Suche - entweder direkt über die Karte mit Preisorientierung durch verschiedene Farben oder in der Listenansicht mit mehr Details." + } + ], + "source": "https://www.promobil.de/rss/ratgeber", + "source_name": "ratgeber bei www.promobil.de", + "created_at": "2025-08-24T10:10:22.248640", + "word_count": 271, + "rewritten_at": "2025-08-24T10:20:56.786151", + "wp_upload_date": "2025-08-24T10:21:57.170006", + "wp_post_id": 3451 + }, + { + "id": "d24dd1ee8a2fd0d6109562216ef8b0c0", + "title": "Fast jeder Zweite träumt vom Van-Life / HEM-Umfrage zeigt: Das Fahrzeug wird immer häufiger zur mobilen Unterkunft", + "date": "Thu, 21 Aug 2025 10:00:11 +0200", + "summary": "Deutsche Tamoil GmbH: Hamburg (ots) - Für viele Menschen ist das Auto mehr als nur ein Fortbewegungsmittel. Es dient als Frühstücksplatz, als Rückzugsort für ruhige Momente oder als mobiles Stück Freiheit im Alltag. In Kombination mit Camper, Wohnmobil oder ...", + "text": "Deutsche Tamoil GmbH [ Newsroom ] Hamburg (ots) - Für viele Menschen ist das Auto mehr als nur ein Fortbewegungsmittel. Es dient als Frühstücksplatz, als Rückzugsort für ruhige Momente oder als mobiles Stück Freiheit im Alltag. In Kombination mit Camper, Wohnmobil oder ... Lesen Sie hier weiter... Original-Content von: Deutsche Tamoil GmbH, übermittelt durch news aktuell", + "tags": [], + "status": "Online", + "link": "https://www.presseportal.de/pm/67955/6101192", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-24T10:10:27.600267", + "word_count": 56 + }, + { + "id": "5575dc4642083c14905572349ad2eec8", + "title": "TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen", + "date": "Wed, 20 Aug 2025 08:30:00 +0200", + "summary": "TÜV-Verband e. V.: Berlin (ots) - Konkrete Anforderungen an technische und elektrische Sicherheit: Das Merkblatt 769 bietet Orientierung für den sicheren Einbau nachgerüsteter Photovoltaikanlagen an Wohnmobilen. Hinweise für Selbstbauer und eine einheitliche ...", + "text": "20.08.2025 – 08:30 TÜV-Verband e. V. TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen Berlin (ots) Konkrete Anforderungen an technische und elektrische Sicherheit: Das Merkblatt 769 bietet Orientierung für den sicheren Einbau nachgerüsteter Photovoltaikanlagen an Wohnmobilen. Hinweise für Selbstbauer und eine einheitliche Prüfgrundlage für Sachverständige. Selbstausbau ein Thema bei der Wohnmobilmesse \"Caravan Salon Düsseldorf 2025\". Ob an der Küste, in den Bergen oder mitten im Nirgendwo: Wohnmobile ermöglichen unabhängiges Reisen. Damit Licht, Kühlschrank oder Wasserpumpe ohne Stromanschluss zuverlässig funktionieren, setzen Halter:innen immer häufiger auf Solarenergie. \"Die Installation einer Photovoltaikanlage am Fahrzeug ist eine praktikable Lösung, um elektrischen Strom autark und emissionsfrei zu erzeugen - vorausgesetzt, sie wird fachgerecht montiert\", sagt Frank Schneider, Referent für Fahrzeugtechnik beim TÜV-Verband. \"Sachverständige begegnen in der Praxis immer wieder abenteuerlichen Konstruktionen Marke Eigenbau, die grundlegende Sicherheitsanforderungen missachten.\" So können sich unzureichend befestigte oder ungeschützte Bauteile bei Bremsmanövern lösen oder verrutschen. Schneider: \"Kritisch sind falsch dimensionierte Kabel, fehlende Sicherungen oder thermische Überlastung. Das führt im schlimmsten Fall zu Kurzschlüssen oder Bränden.\" Gerade beim nachträglichen Einbau ist viel technisches Know-how gefragt. Welche Kabel dürfen verwendet werden? Wie müssen Module befestigt oder Batteriesysteme abgesichert sein? Welche An- und Umbauten sind überhaupt zulässig? Und was könnte später bei der Hauptuntersuchung beanstandet werden? Antworten liefert das neue Merkblatt 769 \"Photovoltaikanlagen in/an Fahrzeugen \" , das der TÜV-Verband jetzt veröffentlicht hat. Auch als Hilfe für den fachgerechten Einbau geeignet Das Merkblatt richtet sich in erster Linie an Sachverständige, die mit Einzelbegutachtungen, Änderungsabnahmen oder der Fahrzeugprüfung im Rahmen der Hauptuntersuchung betraut sind. Darüber hinaus enthält es fundierte Hinweise, die auch Selbstausbauenden helfen können, PV-Systeme fachgerecht und sicher zu installieren. \"Wer sich am Merkblatt orientiert, reduziert die Wahrscheinlichkeit teurer Nachbesserungen und erhöht die Chance, dass Umbauten bei der Begutachtung auf Anhieb bestehen\", sagt Schneider. Die wesentlichen Inhalte des Merkblatts sind unter anderem: Anforderungen an die elektrische Sicherheit, zum Beispiel Leitungsdimensionierung, Sicherungen, Elektromagnetische Verträglichkeit (EMV) Vorgaben zur mechanischen Befestigung von Modulen, Energiespeichern und Reglern Hinweise zu Masseverteilung, Brandschutz, Reflexionsverhalten und Dachlast Technische Regeln zu Kabelschutz, Verbindungstechnik und Isolationsüberwachung Verweise auf relevante Normen wie DIN VDE 0100-721, DIN EN 50618, UN-Regelungen Ergänzt wird das Merkblatt durch Hinweise zu Cybersicherheit, Software-Aktualisierung und Prüfgrundlagen bei Lithiumbatterien oder Hochvoltsystemen. Neues Merkblatt online verfügbar Das neue TÜV-Verband Merkblatt 769 \"Photovoltaikanlagen in/an Fahrzeugen\" ist ab sofort als digitale Version im Onlineshop des TÜV-Verbands erhältlich und kostet 24,90 Euro: https://ots.de/OmC1wB Ergänzend dazu ist weiterhin das TÜV-Verband Merkblatt 740 \"Anforderungen an die Fahrzeugart Wohnmobil\" verfügbar. Es beschreibt grundlegende technische Anforderungen für den Um- und Ausbau von Wohnmobilen. Das Merkblatt 740 ist als PDF-Version ebenfalls im Online-Shop des TÜV-Verbands abrufbar und kostet 42,64 Euro: https://ots.de/UNb8Vr Bei der weltweit größten Wohnmobilmesse \"Caravan Salon Düsseldorf 2025\" ist der Selbstausbau ebenfalls ein wichtiges Thema. Die Messe findet vom 29.8. bis 7.9.2025 in den Düsseldorfer Messehallen statt. Über den TÜV-Verband: Als TÜV-Verband e.V. vertreten wir die politischen Interessen der TÜV-Prüforganisationen und fördern den fachlichen Austausch unserer Mitglieder. Wir setzen uns für die technische und digitale Sicherheit sowie die Nachhaltigkeit von Fahrzeugen, Produkten, Anlagen und Dienstleistungen ein. Grundlage dafür sind allgemeingültige Standards, unabhängige Prüfungen und qualifizierte Weiterbildung. Unser Ziel ist es, das hohe Niveau der technischen Sicherheit zu wahren, Vertrauen in die digitale Welt zu schaffen und unsere Lebensgrundlagen zu erhalten. Dafür sind wir im regelmäßigen Austausch mit Politik, Behörden, Medien, Unternehmen und Verbraucher:innen. Pressekontakt: Maurice Shahd Pressesprecher TÜV-Verband e. V. Friedrichstraße 136 | 10117 Berlin 030 760095-320, presse@tuev-verband.de www.tuev-verband.de | www.linkedin.com/company/tuevverband | www.x.com/tuevverband Original-Content von: TÜV-Verband e. V., übermittelt durch news aktuell", + "tags": [], + "status": "Online", + "link": "https://www.presseportal.de/pm/65031/6100268", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-24T10:10:28.393900", + "word_count": 576 + }, + { + "id": "81910bea0e1aeeafba88d6ea1036a19f", + "title": "Camping auf Schloss Sigrön: Natururlaub mit Stil in Brandenburg - AUTO BILD", + "date": "2025-08-24T07:20:25Z", + "summary": "Svenja und Wolfgang Schwarte haben sich einen Lebenstraum erfüllt. Sie betreiben einen Premium-Campingplatz mit angeschlossenem Schlosshotel.", + "text": "Svenja und Wolfgang Schwarte haben sich einen Lebenstraum erfüllt. Sie betreiben einen Premium- Campingplatz mit angeschlossenem Schlosshotel.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.autobild.de/artikel/luxus-camping-auf-schloss-sigroen-28240471.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zNVAffLcLpjFYvlSTrl2J", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:33.138310", + "word_count": 17 + }, + { + "id": "58cf4e6b43850569474a49c39fcc1e9b", + "title": "Baden-Württemberg punktet mit einem der schönsten Wellness-Campingplätze - FNP", + "date": "2025-08-24T07:13:58Z", + "summary": "Ein idyllischer Campingplatz bringt Erholungssuchende und Naturfreunde ins Schwärmen. Was ihn so besonders macht, bleibt oft verborgen.", + "text": "Ein idyllischer Campingplatz bringt Erholungssuchende und Naturfreunde ins Schwärmen. Was ihn so besonders macht, bleibt oft verborgen.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/deutschland/wellness-campingplatz-schoenster-europas-baden-wuerttemberg-schwarzwaelder-hof-zr-93897610.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0B3Cmtfk2_cSBV9jpW2E29", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:33.682516", + "word_count": 17 + }, + { + "id": "e998a1d9032abed613030c32ae76073d", + "title": "Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus", + "date": "2025-08-24T06:08:48Z", + "summary": "Wir müssen genau hinschauen“: Bildungsexpertinnen schlagen Alarm wegen einer problematischen Entwicklung an deutschen Schulen.", + "text": "Wir müssen genau hinschauen“: Bildungsexpertinnen schlagen Alarm wegen einer problematischen Entwicklung an deutschen Schulen.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0gk8c4QL1MtBwuHQJQHYXL", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:34.216335", + "word_count": 14 + }, + { + "id": "83432be9d34fa9ac40ff4aa2d6bf5e68", + "title": "Falkensteiner Favorit - Containerdorf als Nächtigungskrösus Klagenfurts | krone.at", + "date": "2025-08-24T06:01:10Z", + "summary": "Ein großes Containerdorf ist der größte Nächtigungsbringer von Klagenfurt, trotz einiger Handicaps wird heuer am Campingplatz im Strandbad mit ...", + "text": "Ein großes Containerdorf ist der größte Nächtigungsbringer von Klagenfurt, trotz einiger Handicaps wird heuer am Campingplatz im Strandbad mit ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.krone.at/3876891&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1woffiV_WLFd90nrB2FkoT", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:34.711550", + "word_count": 20 + }, + { + "id": "3845519e77f66b40f1320322ed6ab24d", + "title": "Markanter Umschwung steht bevor – Am 27. August dreht sich das Wetter erneut", + "date": "2025-08-24T05:44:32Z", + "summary": "Im Süden prasselten enorme Regenmengen herab, doch schon bald kündigt sich landesweit Hitze statt Nässe an. Eine Wetter-Kolumne von Dominik Jung.", + "text": "Im Süden prasselten enorme Regenmengen herab, doch schon bald kündigt sich landesweit Hitze statt Nässe an. Eine Wetter-Kolumne von Dominik Jung.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/sich-das-wetter-erneut-naechster-markanter-umschwung-bevor-am-27-august-dreht-zr-93893449.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ML-ydsKFV3aAS_kW-OJoY", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:35.267824", + "word_count": 21 + }, + { + "id": "05f130760242e46d7a99bdceeaa8444a", + "title": "Reportage: Sommerparadies Bodensee - Camping in Gohren - SWR Aktuell", + "date": "2025-08-24T05:42:52Z", + "summary": "Den Alltagssorgen entkommen, ohne weite Reise - das genießen die Camper in Gohren. Eine Dokumentation über das Leben auf einem Campingplatz.", + "text": "Den Alltagssorgen entkommen, ohne weite Reise - das genießen die Camper in Gohren. Eine Dokumentation über das Leben auf einem Campingplatz .", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/sommerparadies-bodensee-dokumentation-vom-campingplatz-gohren-bei-kressbronn-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3dRHXspfNHNEiPRBrJOeLi", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:35.821875", + "word_count": 22 + }, + { + "id": "b0808a4fa0b30ec9e77e110bf2b92348", + "title": "Im Video: Wie Nadine Zappe Marmeladenglasmomente auf ihrem Campingplatz schafft", + "date": "2025-08-24T04:16:58Z", + "summary": "Mitten in Nordschleswig bei Fohl liegt der kleine Campingplatz „Hyggelake“ von Nadine Zappe. Was ihr wichtig ist, was die Gäste mitnehmen sollen ...", + "text": "Mitten in Nordschleswig bei Fohl liegt der kleine Campingplatz „Hyggelake“ von Nadine Zappe. Was ihr wichtig ist, was die Gäste mitnehmen sollen ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.nordschleswiger.dk/de/nordschleswig-hadersleben/im-video-wie-nadine-zappe-marmeladenglasmomente-ihrem-campingplatz&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0GFYeBShFgu1NUoM6G-5G_", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:36.379110", + "word_count": 23 + }, + { + "id": "7f6ad6659c1a44c13447cec63edd4ec7", + "title": "Hund bei Eisenhüttenstadt: Badestellen in der Region – wo Hunde erlaubt sind - MOZ.de", + "date": "2025-08-24T04:09:03Z", + "summary": "Hundefreundlicher Campingplatz am Schervenzsee. Die Betreiber sorgen ... „Wir haben hier am See viele schöne Buchten, die man vom Campingplatz aus in ...", + "text": "Hundefreundlicher Campingplatz am Schervenzsee. Die Betreiber sorgen ... „Wir haben hier am See viele schöne Buchten, die man vom Campingplatz aus in ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.moz.de/lokales/eisenhuettenstadt/hund-in-eisenhuettenstadt-badestellen-in-der-region-wo-hunde-erlaubt-sind-78262165.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0AJpWSxdJOcPug6TRkVtzZ", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:36.921360", + "word_count": 23 + }, + { + "id": "33de9b70798ddaf3fdeed4599c873b43", + "title": "Beliebtes Medikament löst Krebs aus – Forschende entschlüsseln rätselhaften Mechanismus", + "date": "2025-08-24T02:34:02Z", + "summary": "Das Brustkrebs-Medikament Tamoxifen kann – selten – Gebärmutterkrebs auslösen. Das haben Forschende der Berliner Charité festgestellt.", + "text": "Das Brustkrebs-Medikament Tamoxifen kann – selten – Gebärmutterkrebs auslösen. Das haben Forschende der Berliner Charité festgestellt.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/brustkrebs-medikament-loest-gebaermutterkrebs-forschende-entschluesseln-raetselhaften-mechanismus-93897055.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw29FN0GWoPTgcf0krxruWOo", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:37.474633", + "word_count": 16 + }, + { + "id": "c5e0bc2bb58c41606a891ba4d194d747", + "title": "Massive Unwetter an Adria-Küste: Sintflutartige Regenfälle, Hagel und Sturm über Italien ...", + "date": "2025-08-24T01:36:36Z", + "summary": "Heftige Gewitter und Starkregen sorgen am Mittelmeer für Chaos. Besonders Norditalien und Kroatien sind betroffen. Eine Wetter-Kolumne von Dominik ...", + "text": "Heftige Gewitter und Starkregen sorgen am Mittelmeer für Chaos. Besonders Norditalien und Kroatien sind betroffen. Eine Wetter-Kolumne von Dominik ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/und-sturm-ueber-italien-und-kroatien-massive-unwetter-an-adria-kueste-sintflutartige-regenfaelle-hagel-zr-93892020.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1nftLRtaIVhcLaTEABSHrB", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:37.980803", + "word_count": 20 + }, + { + "id": "3fcb40d40dc501e5afaec4329c389ac7", + "title": "Hurrikan Erin rast über Atlantik – Überreste bescheren Europa völlig neues August-Wetter", + "date": "2025-08-24T01:36:35Z", + "summary": "Hurrikan Erin sorgt für Schlagzeilen. Seine Überreste könnten das Wetter in Europa entscheidend beeinflussen. Eine Wetter-Kolumne von Dominik ...", + "text": "Hurrikan Erin sorgt für Schlagzeilen. Seine Überreste könnten das Wetter in Europa entscheidend beeinflussen. Eine Wetter-Kolumne von Dominik ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/ueberreste-bescheren-europa-voellig-neues-august-wetter-hurrikan-erin-rast-ueber-atlantik-zr-93891473.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3MwCg1CMlAsF_p3SDGs51a", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:38.630745", + "word_count": 19 + }, + { + "id": "6de9e7ba5a7fb8a81105060ddbd12e78", + "title": "Grabenstätt: Urlauberin verletzt sich bei Auffahrunfall - Bayernwelle", + "date": "2025-08-24T01:36:25Z", + "summary": "Eine 55-jährige Urlauberin wollte heute mit ihrem BMW von der Staatstraße 2096 bei Unterhochstätt in Richtung Campingplatz abbiegen.", + "text": "Eine 55-jährige Urlauberin wollte heute mit ihrem BMW von der Staatstraße 2096 bei Unterhochstätt in Richtung Campingplatz abbiegen.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.bayernwelle.de/grabenstaett-urlauberin-verletzt-sich-bei-auffahrunfall-181471/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zpwbOIg41UNO80I-NPAJa", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:39.345708", + "word_count": 18 + }, + { + "id": "9c4b55dce8b40f9bc14133d4c0c2a9d2", + "title": "Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show", + "date": "2025-08-23T22:10:36Z", + "summary": "Heftige Gewitter haben Europas größten Campingplatz in Italien zeitweise überflutet. Straßen und Stellplätze standen unter Wasser.", + "text": "Heftige Gewitter haben Europas größten Campingplatz in Italien zeitweise überflutet. Straßen und Stellplätze standen unter Wasser.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897475.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2oJIq2dgPq8t0LP0XDZdKi", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:39.991347", + "word_count": 16 + }, + { + "id": "b1f07af140efc6604b309880a9f40355", + "title": "Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show", + "date": "2025-08-23T18:48:59Z", + "summary": "Das bewiesen auch die Urlauber auf dem Campingplatz Marina di Venezia als heftige Gewitter den größten Campingplatz Europas kurzzeitig in ein ...", + "text": "Das bewiesen auch die Urlauber auf dem Campingplatz Marina di Venezia als heftige Gewitter den größten Campingplatz Europas kurzzeitig in ein ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/welt/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897439.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0jViaY7obKQso9Kan2s9bu", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:40.627693", + "word_count": 22 + }, + { + "id": "3dfc609c0dc9d469c7bff5ab8f075e68", + "title": "Kroatien: Unwetter nach spektakulärer Wolkenfront an Adria-Küste schocken Camper", + "date": "2025-08-23T17:54:13Z", + "summary": "Blitze, Überflutung, Stromausfall - die starken Unwetter in der Nacht auf Donnerstag haben einen Campingplatz in Kroatien beinahe verwüstet.", + "text": "Blitze, Überflutung, Stromausfall - die starken Unwetter in der Nacht auf Donnerstag haben einen Campingplatz in Kroatien beinahe verwüstet.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.wa.de/welt/unwetter-verwuesten-campingplaetze-in-kroatien-spektakulaere-wolkenfront-ueber-adria-kueste-sind-abgereist-93896644.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1A80We_i-8fwM_o4mV4XtR", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:41.124428", + "word_count": 19 + }, + { + "id": "2c34cb6ec948fdc63468b385c3915e9e", + "title": "Campingplatz am Nidda-Stausee mit guter sehr Auslastung - FNP", + "date": "2025-08-23T17:15:01Z", + "summary": "Wir haben in diesem Jahr eine sehr zufriedenstellende Auslastung«, sagt Platzwart Oliver Petermann. Der städtische Campingplatz am Nidda-Stausee ...", + "text": "Wir haben in diesem Jahr eine sehr zufriedenstellende Auslastung«, sagt Platzwart Oliver Petermann. Der städtische Campingplatz am Nidda-Stausee ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/lokales/wetteraukreis/campingplatz-am-nidda-stausee-mit-guter-sehr-auslastung-93896554.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2kxM3SOZlO-z81GBidTt9J", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:41.673070", + "word_count": 19 + }, + { + "id": "d880e9c03a550dd7923f3d8babfae686", + "title": "Ein beliebter DDR-Campingplatz auf Ostsee-Insel könnte verschwinden - Nordkurier", + "date": "2025-08-23T16:57:53Z", + "summary": "Jedes Jahr brechen meterweise Düne auf der Ostsee-Insel Usedom ab. Ein Campingplatz aus DDR-Zeiten ist jetzt in ernsthafter Gefahr.", + "text": "Jedes Jahr brechen meterweise Düne auf der Ostsee-Insel Usedom ab. Ein Campingplatz aus DDR-Zeiten ist jetzt in ernsthafter Gefahr.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/usedom/dieser-beliebte-ddr-campingplatz-auf-ostsee-insel-koennte-verschwinden-3838218&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3O6pcTG4aS_ju-I0Zfu9Qo", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:42.295200", + "word_count": 19 + }, + { + "id": "eeb9a5e10f7ce41a4d2b73e0c3fed059", + "title": "Unfall auf Campingplatz bei Cavallino - jesolo-magazin.com", + "date": "2025-08-23T16:52:35Z", + "summary": "Unfall auf Campingplatz bei Cavallino. Ein Urlaubstag am Meer nahm für eine Familie in Cavallino eine dramatische Wendung. Am Samstagmittag.", + "text": "Unfall auf Campingplatz bei Cavallino. Ein Urlaubstag am Meer nahm für eine Familie in Cavallino eine dramatische Wendung. Am Samstagmittag.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://jesolo-magazin.com/unfall-auf-campingplatz-bei-cavallino/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13Q4Q-rLFodoIaqrD3ZobU", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:43.016555", + "word_count": 20 + }, + { + "id": "25e8840a98191fcd67791f7897fb0dd4", + "title": "„Drei Nächte durchvisioniert“: Freystädter Paar verliebt sich in Campingplatz in Thüringen", + "date": "2025-08-23T14:58:41Z", + "summary": "Freystadt - Mit Eisbaden, Sauna und Wildcamping-Gefühl: Andreas aus Freystadt und Stella aus Österreich haben die Fellbergbaude in Thüringen ...", + "text": "Freystadt - Mit Eisbaden, Sauna und Wildcamping-Gefühl: Andreas aus Freystadt und Stella aus Österreich haben die Fellbergbaude in Thüringen ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/neumarkt/drei-nachte-durchvisioniert-freystadter-paar-verliebt-sich-in-campingplatz-in-thuringen-1.14802417&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1vOac9UH70ipnEbOKDZ0De", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:43.542783", + "word_count": 20 + }, + { + "id": "9bfb59307bd05399d013e99cbf8221ab", + "title": "Schwimmbad und Campingplatz: Mieses Wetter, mieses Geschäft? - Badische Zeitung", + "date": "2025-08-23T14:11:47Z", + "summary": "Es ist ein richtiger Schaukelsommer: Mal superheiß, dann wieder lange Perioden mit Regenwetter. Was macht das, mit denen, die auf schönes Wetter ...", + "text": "Es ist ein richtiger Schaukelsommer: Mal superheiß, dann wieder lange Perioden mit Regenwetter. Was macht das, mit denen, die auf schönes Wetter ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.badische-zeitung.de/schwimmbad-und-campingplatz-mieses-wetter-mieses-geschaeft&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ztU82SEKVMrArG_bbQbUi", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T10:10:44.066716", + "word_count": 23 + }, + { + "id": "ff59b9d1a1fcb27e80e345259469b262", + "title": "In Düsseldorf schlägt das „Herz des Caravanings“ - Niederrhein Nachrichten", + "date": "2025-08-23T16:40:34Z", + "summary": "Dachzelte gehören zu den absoluten Top-Trends im Camping- und Caravaningbereich. 23. August 2025 Von NN-Online · Was läuft am Niederrhein. In ...", + "text": "Dachzelte gehören zu den absoluten Top-Trends im Camping - und Caravaningbereich. 23. August 2025 Von NN-Online · Was läuft am Niederrhein. In ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.niederrhein-nachrichten.de/nachrichten/in-duesseldorf-schlaegt-das-herz-des-caravanings-11957.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11bSejssd9woRFps5qaXVQ", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-24T10:10:49.311133", + "word_count": 23 + }, + { + "id": "2b741f52eb4a69912829f8bcb8fde1a9", + "title": "Wanderin stürzt in Inzigkofen in Felsspalte und verletzt sich schwer - SWR", + "date": "2025-08-24T09:56:44Z", + "summary": "Mit einer Seilwinde und einem Hubschrauber konnte die Frau geborgen werden. Sanitäter brachten die schwer Verletzte in ein Krankenhaus. Die 69-Jährige ...", + "text": "Mit einer Seilwinde und einem Hubschrauber konnte die Frau geborgen werden. Sanitäter brachten die schwer Verletzte in ein Krankenhaus. Die 69-Jährige ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/rettungseinsatz-verunfallte-wanderin-auf-gespaltenem-felsen-in-inzigkofen-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gMED6SXGchOupYUXtrmm5", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T12:35:03.563054", + "word_count": 22 + }, + { + "id": "c249d33d9ba4bbeaaf4a4d7137358345", + "title": "Feuerwehr-Großeinsatz: Brand auf Campingplatz - Waldsee/Altrip - DIE RHEINPFALZ", + "date": "2025-08-24T09:55:03Z", + "summary": "Waldsee / Altrip Feuerwehr-​Großeinsatz: Brand auf Campingplatz. Ein Carport ist in der ...", + "text": "Waldsee / Altrip Feuerwehr-​Großeinsatz: Brand auf Campingplatz . Ein Carport ist in der ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/rhein-pfalz-kreis_artikel,-feuerwehr-gro%25C3%259Feinsatz-brand-auf-campingplatz-_arid,5805271.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1TSMKiXF4mmTlvxWL7YX5l", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T12:35:04.125673", + "word_count": 14 + }, + { + "id": "102121e46fffde7e044b9dd6da6da4b4", + "title": "Campingplatz Rheinblick in Baumberg: Beliebte Anlage stets ausgebucht - ANTENNE NRW", + "date": "2025-08-24T09:15:02Z", + "summary": "Der Campingplatz Rheinblick in Baumberg ist im Sommer heiß begehrt und bietet familienfreundliche Preise. Idyllische Anlage am Rhein.", + "text": "Der Campingplatz Rheinblick in Baumberg ist im Sommer heiß begehrt und bietet familienfreundliche Preise. Idyllische Anlage am Rhein.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://antenne.nrw/nrw/campingplatz-rheinblick-in-baumberg-beliebte-anlage-stets-ausgebucht/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2SXFc61ANwrL7rZl7c_Nfl", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T12:35:04.835998", + "word_count": 18 + }, + { + "id": "4cd714fb0cc8437c3def63c987195c12", + "title": "Bauernregeln für den September 2025: Prognose im 100-jährigen Kalender hat es in sich", + "date": "2025-08-24T09:10:43Z", + "summary": "Nach dem Sommer hoffen viele auf einen goldenen September. Bauernregeln und der 100-jährige Kalender haben konkrete Wetterprognosen.", + "text": "Nach dem Sommer hoffen viele auf einen goldenen September. Bauernregeln und der 100-jährige Kalender haben konkrete Wetterprognosen.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bauernregeln-fuer-den-september-2025-prognose-im-100-jaehrigen-kalender-hat-es-in-sich-93896711.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3Kgg_g2rdEMvf_9AOgPtGj", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T12:35:05.355973", + "word_count": 17 + }, + { + "id": "2dc35d950a53c567623dffc698037a16", + "title": "Kirche auf dem Campingplatz - Erzbistum Freiburg", + "date": "2025-08-24T06:01:06Z", + "summary": "Kirche auf dem Campingplatz. 24.08.2025 |. Es ist Urlaubszeit. Und so machen sich die Mitarbeiter der Kirche auf den Weg zu den Campingplätzen der ...", + "text": "Kirche auf dem Campingplatz . 24.08.2025 |. Es ist Urlaubszeit. Und so machen sich die Mitarbeiter der Kirche auf den Weg zu den Campingplätzen der ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.ebfr.de/detail/nachricht/id/227960-kirche-auf-dem-campingplatz/%3Fcb-id%3D12338393&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9x3XKrza6eMUdU7OgV2Y", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T12:35:07.057253", + "word_count": 26 + }, + { + "id": "d0643ad00e504089ac7584fe71855001", + "title": "Letzter Ausweg Campingplatz - Flucht aus der Großstadt - Programme TV ce soir - Télérama", + "date": "2025-08-24T06:00:29Z", + "summary": "Großstadtflucht statt Dauerstress: Immer mehr Menschen tauschen Lärm und Unsicherheit gegen ein Leben als Dauercamper auf dem Campingplatz. Auf der ...", + "text": "Großstadtflucht statt Dauerstress: Immer mehr Menschen tauschen Lärm und Unsicherheit gegen ein Leben als Dauercamper auf dem Campingplatz . Auf der ...", + "tags": [], + "status": "Online", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://television.telerama.fr/tele/documentaire/letzter-ausweg-campingplatz-flucht-aus-der-gro-stadt-1-386085864.php&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0yphKSHd_DWg5hgH0yY59p", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T12:35:07.690889", + "word_count": 22 + }, + { + "id": "7074a4ca8418e0f5bd5902b8f25bbb29", + "title": "Campingfreunde: Schauspielkomödie im Theater Fabelhaft - Lübeck live", + "date": "2025-08-24T11:49:28Z", + "summary": "Doch leider hat er die Rechnung ohne den skrupellosen Baulöwen Sebastian von Falkenstein (Simon Hillebrand) gemacht. Der hat mit dem Campingplatz ...", + "text": "Doch leider hat er die Rechnung ohne den skrupellosen Baulöwen Sebastian von Falkenstein (Simon Hillebrand) gemacht. Der hat mit dem Campingplatz ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.hl-live.de/text.php%3Fid%3D174396&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw249DjhpXTHiYIncHlUdDPR", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T14:52:20.474592", + "word_count": 22 + }, + { + "id": "7b3d1ba80058f4c59305d3169f789fad", + "title": "„Unumgänglich“: Insolvenz zwingt beliebtes Nordsee-Bad zur Schließung – zwei weitere wackeln", + "date": "2025-08-24T10:45:07Z", + "summary": "In den kommenden Wochen soll ein tragfähiges Konzept entstehen, das dem Bad und dem angeschlossenen Campingplatz eine Zukunft sichert.", + "text": "In den kommenden Wochen soll ein tragfähiges Konzept entstehen, das dem Bad und dem angeschlossenen Campingplatz eine Zukunft sichert.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/schluss-trotz-insolvenz-nach-kosten-explosion-beliebte-baeder-an-der-nordsee-bangen-fuer-eins-ist-endgueltig-93897627.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0az_FaAh6V7hKPgd8NUW8L", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T14:52:21.259632", + "word_count": 19 + }, + { + "id": "dce734092d6e2f55b57deadebf1672c7", + "title": "Die Ruheoase im stillen Inselwinkel: So geht es auf dem ersten Campingplatz auf Mallorca zu", + "date": "2025-08-24T10:39:30Z", + "summary": "Wobei der Terminus Campingplatz für das, was angelegt wurde, etwas zu hochgegriffen ist: Toiletten gibt es nicht, einen Kiosk, eine Rasenfläche mit ...", + "text": "Wobei der Terminus Campingplatz für das, was angelegt wurde, etwas zu hochgegriffen ist: Toiletten gibt es nicht, einen Kiosk, eine Rasenfläche mit ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.mallorcamagazin.com/nachrichten/tourismus/2025/08/24/141169/die-ruheoase-stillen-inselwinkel-geht-auf-dem-ersten-campingplatz-auf-mallorca-zu.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3xWU_Q-zQrsTo6QcL_jTJN", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T14:52:21.772703", + "word_count": 23 + }, + { + "id": "eec2a6784ddaf34b33337000966463d9", + "title": "Geplanter Karten-Zwang sorgt für dicke Luft an der Ostsee - Nordkurier", + "date": "2025-08-24T10:14:45Z", + "summary": "... Campingplatz auf Ostsee-Insel könnte verschwinden. Akut gefährdet. Dieser beliebte DDR-Campingplatz auf Ostsee-Insel könnte verschwinden. q Zempin.", + "text": "... Campingplatz auf Ostsee-Insel könnte verschwinden. Akut gefährdet. Dieser beliebte DDR- Campingplatz auf Ostsee-Insel könnte verschwinden. q Zempin.", + "tags": [], + "status": "New", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/mecklenburg-vorpommern/geplanter-karten-zwang-sorgt-fuer-dicke-luft-an-der-ostsee-3864013&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1uwWy7IibmrXt4TIIcCHuT", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T14:52:22.301490", + "word_count": 18 + }, + { + "id": "f4a7aa8e51b6ca3570965088ebe1a5e7", + "title": "Loch Ness in Schottland: Kind auf Campingplatz sexuell missbraucht - MSN", + "date": "2025-08-24T10:11:02Z", + "summary": "Vor 3 Wo. Auf Campingplatz. Unbekannter missbraucht Urlauber-Kind am berüchtigten Loch Ness.", + "text": "Vor 3 Wo. Auf Campingplatz . Unbekannter missbraucht Urlauber-Kind am berüchtigten Loch Ness.", + "tags": [], + "status": "New", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/loch-ness-in-schottland-kind-auf-campingplatz-sexuell-missbraucht/ar-AA1JLKJo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1Jv92jULmjoLLuKh5FsN1C", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-24T14:52:22.825563", + "word_count": 13 + }, + { + "id": "7a579e6e85e2ac494008f2fde2bcfd0d", + "title": "Hörstein feiert 400 Jahre Pestwunder - Primavera24.de", + "date": "2025-08-24T09:43:31Z", + "summary": "Hörstein feiert 400 Jahre Pestwunder. 24.08.2025, 10:48 Uhr in Kreis Aschaffenburg. Symbolbild Heiliger. ALZENAU HÖRSTEIN. Vor genau 400 Jahren ...", + "text": "Hörstein feiert 400 Jahre Pestwunder. 24.08. 2025 , 10:48 Uhr in Kreis Aschaffenburg. Symbolbild Heiliger. ALZENAU HÖRSTEIN. Vor genau 400 Jahren ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.primavera24.de/aktuelles/news/hoerstein-feiert-400-jahre-pestwunder&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2ZPN_Php6BmAsnv-79P-zZ", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-24T14:52:32.784324", + "word_count": 22 } ] \ No newline at end of file diff --git a/data/feeds.json b/data/feeds.json index 87fd371..eaac8a5 100644 --- a/data/feeds.json +++ b/data/feeds.json @@ -10,5 +10,33 @@ { "url": "https://www.promobil.de/rss/ratgeber", "name": "Promobil Ratgeber" + }, + { + "url": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "name": "Presseportal Camping" + }, + { + "url": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "name": "Presseportal Wohnmobil" + }, + { + "url": "https://caravan-news.de/rss/schlagzeilen.php", + "name": "Caravan News" + }, + { + "url": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "name": "Google Campingplatz" + }, + { + "url": "https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305", + "name": "Google VanLife" + }, + { + "url": "https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856", + "name": "Google Camping Termine" + }, + { + "url": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "name": "Google Camping Messe 2025" } ] \ No newline at end of file diff --git a/logs/rss_tool.log b/logs/rss_tool.log index 2a2db22..7463634 100644 --- a/logs/rss_tool.log +++ b/logs/rss_tool.log @@ -1043,3 +1043,4926 @@ die Großen 2025-08-18 10:30:46,246 - INFO - load_feeds:93 - ✅ 3 Feeds geladen 2025-08-18 10:30:55,147 - INFO - load_articles:124 - ✅ 56 Artikel geladen 2025-08-18 10:30:55,147 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:47:45,346 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-19 08:47:45,347 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:47:53,442 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-19 08:47:53,443 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:47:53,448 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-19 08:47:53,449 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:47:53,454 - INFO - load_articles:124 - ✅ 56 Artikel geladen +2025-08-19 08:47:53,455 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-19 08:47:53,813 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-19 08:47:53,813 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 08:47:53,814 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-19 08:47:53,815 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-19 08:47:53,815 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-19 08:47:53,816 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-19 08:47:53,816 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-19 08:47:53,817 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-19 08:47:53,818 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-19 08:47:53,818 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-19 08:47:53,819 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-19 08:47:53,819 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-19 08:47:53,819 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-19 08:47:54,821 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-19 08:47:55,324 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-19 08:47:55,324 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 08:47:55,324 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-19 08:47:55,324 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-19 08:47:55,608 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:55,610 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:55,611 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-19 08:47:55,612 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-19 08:47:55,612 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-19 08:47:55,612 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-19 08:47:55,612 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-19 08:47:55,955 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:55,956 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:55,958 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-19 08:47:55,958 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-19 08:47:55,958 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-19 08:47:55,959 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-19 08:47:55,959 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-19 08:47:56,275 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:56,276 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:56,278 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-19 08:47:56,278 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-19 08:47:56,278 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-19 08:47:56,278 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-19 08:47:56,278 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-19 08:47:56,581 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:56,582 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:56,582 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-19 08:47:56,582 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-19 08:47:56,582 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-19 08:47:56,583 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-19 08:47:56,583 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-19 08:47:56,833 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:56,833 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:56,834 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-19 08:47:56,835 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-19 08:47:56,835 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-19 08:47:56,835 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-19 08:47:56,835 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-19 08:47:57,142 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:57,142 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:57,142 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-19 08:47:57,142 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-19 08:47:57,142 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-19 08:47:57,143 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-19 08:47:57,143 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-19 08:47:57,416 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:57,416 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:57,417 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 08:47:57,417 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-19 08:47:57,417 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 08:47:57,418 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-19 08:47:57,418 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-19 08:47:57,418 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-19 08:47:57,418 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-19 08:47:57,757 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:57,758 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:57,759 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-19 08:47:57,759 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-19 08:47:57,760 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-19 08:47:57,760 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-19 08:47:57,760 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-19 08:47:58,079 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:58,080 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:58,081 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-19 08:47:58,081 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-19 08:47:58,082 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-19 08:47:58,082 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-19 08:47:58,082 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-19 08:47:58,398 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:58,398 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:58,399 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-19 08:47:58,399 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-19 08:47:58,400 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-19 08:47:58,400 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-19 08:47:58,400 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-19 08:47:58,687 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:58,687 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:58,688 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-19 08:47:58,688 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-19 08:47:58,688 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-19 08:47:58,688 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-19 08:47:58,688 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-19 08:47:58,688 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-19 08:47:58,985 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:58,985 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:58,986 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-19 08:47:58,986 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-19 08:47:58,986 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-19 08:47:58,986 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-19 08:47:58,986 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-19 08:47:59,377 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:59,378 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:59,379 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-19 08:47:59,379 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-19 08:47:59,379 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-19 08:47:59,380 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-19 08:47:59,380 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-19 08:47:59,671 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:59,671 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:59,672 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-19 08:47:59,672 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-19 08:47:59,672 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-19 08:47:59,672 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-19 08:47:59,672 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-19 08:47:59,981 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:47:59,982 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:47:59,982 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-19 08:47:59,982 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-19 08:47:59,983 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-19 08:47:59,983 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-19 08:47:59,983 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-19 08:48:00,293 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:48:00,294 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:48:00,295 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-19 08:48:00,295 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-19 08:48:00,295 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-19 08:48:00,295 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-19 08:48:00,295 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-19 08:48:00,619 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:48:00,620 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:48:00,620 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-19 08:48:00,620 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-19 08:48:00,621 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-19 08:48:00,621 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-19 08:48:00,621 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-19 08:48:00,910 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:48:00,911 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:48:00,911 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-19 08:48:00,911 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-19 08:48:00,911 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-19 08:48:00,912 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-19 08:48:00,912 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-19 08:48:01,197 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 08:48:01,198 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 08:48:01,198 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 08:48:01,198 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-19 08:48:01,198 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 08:48:01,200 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-19 08:48:01,200 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-19 08:48:01,200 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-19 08:48:02,205 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-19 08:48:02,788 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-19 08:48:02,788 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 08:48:02,789 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.promobil.de/weitere-ratgeber/flexicamper-skandal-harte-urteile-nach-millionenbetrug-im-wohnmobilhandel/ +2025-08-19 08:48:03,091 - INFO - extract_images_with_metadata:167 - 🔍 13 img-Tags gefunden +2025-08-19 08:48:03,092 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Gericht, Hammer, Wohnmobile, Wohnmobilhandel... +2025-08-19 08:48:03,092 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-19 08:48:03,092 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.promobil.de/weitere-ratgeber/flexicamper-skandal-harte-urteile-nach-millionenbetrug-im-wohnmobilhandel/: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-19 08:48:03,092 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper' extrahiert +2025-08-19 08:48:03,093 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-19 08:48:03,094 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-19 08:48:03,095 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-19 08:48:03,097 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-19 08:48:03,098 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-19 08:48:03,099 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-19 08:48:03,102 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-19 08:48:03,103 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-19 08:48:03,112 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-19 08:48:03,113 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-19 08:48:03,114 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-19 08:48:03,115 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-19 08:48:03,116 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-19 08:48:03,117 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-19 08:48:03,118 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-19 08:48:03,119 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-19 08:48:03,122 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-19 08:48:03,124 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dethleffs Reiselust-Prämie: Bis zu 20.000 Euro Rabatt auf Wohnmobile +2025-08-19 08:48:03,125 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue promobil-Newsletter - gratis!: Zum Frühstück die spannendsten Camping-Themen +2025-08-19 08:48:03,126 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Drittes Camping-Rekordjahr in Folge: Süd schlägt Nord – Hier wird am häufigsten gecampt +2025-08-19 08:48:03,126 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-19 08:48:04,155 - INFO - save_articles:144 - ✅ 57 Artikel gespeichert +2025-08-19 08:48:04,155 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 1 neue Artikel in 10.71s hinzugefügt +2025-08-19 08:48:05,231 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 08:48:05,231 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:48:31,615 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 08:48:31,617 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:55:47,155 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 08:55:47,157 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:55:47,177 - INFO - save_articles:144 - ✅ 57 Artikel gespeichert +2025-08-19 08:55:47,752 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 08:55:47,753 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:55:54,799 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 08:55:54,799 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:55:54,804 - INFO - rewrite_articles:320 - ✍️ Starte Artikel-Umschreibung +2025-08-19 08:55:54,809 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 08:55:54,810 - INFO - rewrite_articles:337 - ✍️ Umschreiben von: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-19 08:56:16,151 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-19 08:56:18,547 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-19 08:56:18,555 - INFO - rewrite_articles:392 - ✅ Artikel erfolgreich umgeschrieben: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-19 08:56:20,573 - INFO - save_articles:144 - ✅ 57 Artikel gespeichert +2025-08-19 08:56:20,573 - INFO - rewrite_articles:404 - 🎉 1 Artikel erfolgreich umgeschrieben +2025-08-19 08:56:21,650 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 08:56:21,651 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 08:56:32,708 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 08:56:32,709 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:45:38,755 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 09:45:38,758 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:45:38,768 - INFO - __init__:51 - ✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String +2025-08-19 09:45:39,345 - INFO - _get_default_category_id:87 - ✅ Standard-Kategorie 'Allgemein' gefunden: ID 1 +2025-08-19 09:45:39,345 - INFO - test_connection:338 - 🔧 Teste WordPress-API-Verbindung mit Base64-Auth... +2025-08-19 09:45:39,345 - INFO - test_connection:342 - 🔑 Authorization Header: Basic b2dpZXJ0ejp3aE... +2025-08-19 09:45:39,842 - INFO - test_connection:351 - 📡 API-Response Status: 200 +2025-08-19 09:45:39,842 - INFO - test_connection:352 - 📡 API-Response Headers: {'Content-Type': 'application/json; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-WS-RateLimit-Limit': '1000', 'X-WS-RateLimit-Remaining': '998', 'Date': 'Tue, 19 Aug 2025 07:45:39 GMT', 'Server': 'Apache', 'X-Powered-By': 'PHP/8.2.29', 'Pragma': 'no-cache', 'X-Robots-Tag': 'noindex', 'X-Content-Type-Options': 'nosniff', 'Access-Control-Expose-Headers': 'X-WP-Total, X-WP-TotalPages, Link', 'Access-Control-Allow-Headers': 'Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type', 'X-WP-Total': '4', 'X-WP-TotalPages': '4', 'Link': '; rel="next"', 'Allow': 'GET, POST', 'Expires': 'Wed, 11 Jan 1984 05:00:00 GMT', 'Cache-Control': 'no-cache, must-revalidate, max-age=0, no-store, private'} +2025-08-19 09:45:39,843 - INFO - test_connection:355 - ✅ WordPress-API-Verbindung erfolgreich +2025-08-19 09:45:39,843 - INFO - upload_article:249 - 📤 Starte WordPress-Upload: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-19 09:45:40,763 - INFO - _get_or_create_tags:135 - ✅ Existierender Tag gefunden: 'Italien' (ID: 681) +2025-08-19 09:45:41,149 - INFO - _get_or_create_tags:135 - ✅ Existierender Tag gefunden: 'Camping' (ID: 194) +2025-08-19 09:45:42,095 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Müllentsorgung' (ID: 893) +2025-08-19 09:45:42,914 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Straßenverkehrsordnung' (ID: 894) +2025-08-19 09:45:43,836 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Umweltschutz' (ID: 895) +2025-08-19 09:45:43,837 - INFO - _get_or_create_tags:158 - 🏷️ Tags verarbeitet: 5 Tag-IDs erstellt +2025-08-19 09:45:43,837 - INFO - _prepare_post_data:194 - 📝 Post-Daten vorbereitet: Titel='Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper', Tags=5, Kategorie=1 +2025-08-19 09:45:44,759 - INFO - upload_article:274 - ✅ WordPress-Upload erfolgreich: 'Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper' (ID: 3385) +2025-08-19 09:45:44,759 - INFO - upload_article:275 - 🔗 WordPress-URL: https://vanityontour.de/?p=3385 +2025-08-19 09:45:44,785 - INFO - save_articles:144 - ✅ 57 Artikel gespeichert +2025-08-19 09:45:45,875 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 09:45:45,876 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:45:54,026 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 09:45:54,026 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:45:54,035 - INFO - __init__:51 - ✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String +2025-08-19 09:45:54,587 - INFO - _get_default_category_id:87 - ✅ Standard-Kategorie 'Allgemein' gefunden: ID 1 +2025-08-19 09:45:54,587 - INFO - test_connection:338 - 🔧 Teste WordPress-API-Verbindung mit Base64-Auth... +2025-08-19 09:45:54,587 - INFO - test_connection:342 - 🔑 Authorization Header: Basic b2dpZXJ0ejp3aE... +2025-08-19 09:45:54,996 - INFO - test_connection:351 - 📡 API-Response Status: 200 +2025-08-19 09:45:54,996 - INFO - test_connection:352 - 📡 API-Response Headers: {'Content-Type': 'application/json; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-WS-RateLimit-Limit': '1000', 'X-WS-RateLimit-Remaining': '998', 'Date': 'Tue, 19 Aug 2025 07:45:54 GMT', 'Server': 'Apache', 'X-Powered-By': 'PHP/8.2.29', 'Pragma': 'no-cache', 'X-Robots-Tag': 'noindex', 'X-Content-Type-Options': 'nosniff', 'Access-Control-Expose-Headers': 'X-WP-Total, X-WP-TotalPages, Link', 'Access-Control-Allow-Headers': 'Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type', 'X-WP-Total': '4', 'X-WP-TotalPages': '4', 'Link': '; rel="next"', 'Allow': 'GET, POST', 'Expires': 'Wed, 11 Jan 1984 05:00:00 GMT', 'Cache-Control': 'no-cache, must-revalidate, max-age=0, no-store, private'} +2025-08-19 09:45:54,996 - INFO - test_connection:355 - ✅ WordPress-API-Verbindung erfolgreich +2025-08-19 09:45:54,996 - INFO - upload_article:249 - 📤 Starte WordPress-Upload: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-19 09:45:56,226 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Betrugsfall' (ID: 896) +2025-08-19 09:45:56,635 - INFO - _get_or_create_tags:135 - ✅ Existierender Tag gefunden: 'Campingbranche' (ID: 695) +2025-08-19 09:45:57,659 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'FlexiCamper' (ID: 897) +2025-08-19 09:45:58,085 - INFO - _get_or_create_tags:135 - ✅ Existierender Tag gefunden: 'Insolvenz' (ID: 661) +2025-08-19 09:45:58,993 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Wirtschaftskriminalität' (ID: 898) +2025-08-19 09:45:58,994 - INFO - _get_or_create_tags:158 - 🏷️ Tags verarbeitet: 5 Tag-IDs erstellt +2025-08-19 09:45:58,994 - INFO - _prepare_post_data:194 - 📝 Post-Daten vorbereitet: Titel='Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper', Tags=5, Kategorie=1 +2025-08-19 09:45:59,507 - INFO - upload_article:274 - ✅ WordPress-Upload erfolgreich: 'Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper' (ID: 3386) +2025-08-19 09:45:59,507 - INFO - upload_article:275 - 🔗 WordPress-URL: https://vanityontour.de/?p=3386 +2025-08-19 09:45:59,527 - INFO - save_articles:144 - ✅ 57 Artikel gespeichert +2025-08-19 09:46:00,591 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 09:46:00,591 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:57:30,336 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 09:57:30,338 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:57:36,564 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 09:57:36,565 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:57:36,587 - INFO - save_articles:144 - ✅ 57 Artikel gespeichert +2025-08-19 09:57:37,156 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 09:57:37,157 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:57:41,844 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 09:57:41,844 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:57:41,869 - INFO - save_articles:144 - ✅ 57 Artikel gespeichert +2025-08-19 09:57:42,447 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 09:57:42,447 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:58:10,378 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 09:58:10,380 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:01:54,864 - INFO - load_feeds:93 - ✅ 3 Feeds geladen +2025-08-19 10:01:54,872 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:01:54,877 - INFO - save_feeds:104 - ✅ 4 Feeds gespeichert +2025-08-19 10:01:54,877 - INFO - :51 - 🔗 Neuer Feed hinzugefügt: Presseportal Polizei Langenfeld (https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2) +2025-08-19 10:01:54,943 - INFO - load_feeds:93 - ✅ 4 Feeds geladen +2025-08-19 10:01:54,945 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:02:41,223 - INFO - load_feeds:93 - ✅ 4 Feeds geladen +2025-08-19 10:02:41,231 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:02:41,255 - INFO - save_feeds:104 - ✅ 5 Feeds gespeichert +2025-08-19 10:02:41,255 - INFO - :51 - 🔗 Neuer Feed hinzugefügt: Presseportal Camping (https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ) +2025-08-19 10:02:41,304 - INFO - load_feeds:93 - ✅ 5 Feeds geladen +2025-08-19 10:02:41,306 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:03:08,043 - INFO - load_feeds:93 - ✅ 5 Feeds geladen +2025-08-19 10:03:08,048 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:03:08,053 - INFO - save_feeds:104 - ✅ 6 Feeds gespeichert +2025-08-19 10:03:08,054 - INFO - :51 - 🔗 Neuer Feed hinzugefügt: Presseportal Wohnmobil (https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ) +2025-08-19 10:03:08,122 - INFO - load_feeds:93 - ✅ 6 Feeds geladen +2025-08-19 10:03:08,125 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:03:28,863 - INFO - load_feeds:93 - ✅ 6 Feeds geladen +2025-08-19 10:03:28,868 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:03:28,872 - INFO - save_feeds:104 - ✅ 7 Feeds gespeichert +2025-08-19 10:03:28,872 - INFO - :51 - 🔗 Neuer Feed hinzugefügt: Caravan News (https://caravan-news.de/rss/schlagzeilen.php) +2025-08-19 10:03:28,917 - INFO - load_feeds:93 - ✅ 7 Feeds geladen +2025-08-19 10:03:28,919 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:03:54,060 - INFO - load_feeds:93 - ✅ 7 Feeds geladen +2025-08-19 10:03:54,066 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:03:54,072 - INFO - save_feeds:104 - ✅ 8 Feeds gespeichert +2025-08-19 10:03:54,073 - INFO - :51 - 🔗 Neuer Feed hinzugefügt: Google Campingplatz (https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294) +2025-08-19 10:03:54,122 - INFO - load_feeds:93 - ✅ 8 Feeds geladen +2025-08-19 10:03:54,124 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:04:06,328 - INFO - load_feeds:93 - ✅ 8 Feeds geladen +2025-08-19 10:04:06,333 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:04:06,337 - INFO - save_feeds:104 - ✅ 9 Feeds gespeichert +2025-08-19 10:04:06,338 - INFO - :51 - 🔗 Neuer Feed hinzugefügt: Google VanLife (https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305) +2025-08-19 10:04:06,384 - INFO - load_feeds:93 - ✅ 9 Feeds geladen +2025-08-19 10:04:06,386 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:04:29,364 - INFO - load_feeds:93 - ✅ 9 Feeds geladen +2025-08-19 10:04:29,370 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:04:29,375 - INFO - save_feeds:104 - ✅ 10 Feeds gespeichert +2025-08-19 10:04:29,375 - INFO - :51 - 🔗 Neuer Feed hinzugefügt: Google Camping Termine (https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856) +2025-08-19 10:04:29,425 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 10:04:29,428 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:04:55,582 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 10:04:55,587 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:04:55,591 - INFO - save_feeds:104 - ✅ 11 Feeds gespeichert +2025-08-19 10:04:55,591 - INFO - :51 - 🔗 Neuer Feed hinzugefügt: Google Camping Messe 2025 (https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493) +2025-08-19 10:04:55,639 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:04:55,641 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:05:31,452 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:05:31,456 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:05:35,551 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:05:35,557 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:05:37,200 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:05:37,205 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:05:37,229 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-19 10:05:37,230 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:05:37,234 - INFO - load_articles:124 - ✅ 57 Artikel geladen +2025-08-19 10:05:37,235 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-19 10:05:37,569 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-19 10:05:37,570 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 10:05:37,573 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-19 10:05:37,575 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-19 10:05:37,576 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-19 10:05:37,577 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-19 10:05:37,580 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-19 10:05:37,582 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-19 10:05:37,582 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-19 10:05:37,583 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-19 10:05:37,584 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-19 10:05:37,585 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-19 10:05:37,585 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-19 10:05:38,590 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-19 10:05:38,874 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-19 10:05:38,874 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 10:05:38,874 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-19 10:05:38,874 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-19 10:05:39,060 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:39,062 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:39,064 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-19 10:05:39,065 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-19 10:05:39,065 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-19 10:05:39,065 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-19 10:05:39,065 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-19 10:05:39,260 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:39,261 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:39,262 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-19 10:05:39,263 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-19 10:05:39,263 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-19 10:05:39,263 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-19 10:05:39,263 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-19 10:05:39,482 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:39,484 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:39,485 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-19 10:05:39,485 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-19 10:05:39,485 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-19 10:05:39,486 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-19 10:05:39,486 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-19 10:05:39,663 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:39,664 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:39,665 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-19 10:05:39,665 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-19 10:05:39,665 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-19 10:05:39,665 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-19 10:05:39,665 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-19 10:05:39,841 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:39,843 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:39,845 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-19 10:05:39,845 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-19 10:05:39,846 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-19 10:05:39,846 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-19 10:05:39,846 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-19 10:05:40,008 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:40,009 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:40,009 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-19 10:05:40,010 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-19 10:05:40,010 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-19 10:05:40,010 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-19 10:05:40,010 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-19 10:05:40,184 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:40,185 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:40,185 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:05:40,185 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-19 10:05:40,186 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:05:40,188 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-19 10:05:40,189 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-19 10:05:40,189 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-19 10:05:40,189 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-19 10:05:40,378 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:40,380 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:40,383 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-19 10:05:40,384 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-19 10:05:40,384 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-19 10:05:40,384 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-19 10:05:40,384 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-19 10:05:40,605 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:40,607 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:40,609 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-19 10:05:40,609 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-19 10:05:40,610 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-19 10:05:40,610 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-19 10:05:40,610 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-19 10:05:40,797 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:40,798 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:40,799 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-19 10:05:40,800 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-19 10:05:40,800 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-19 10:05:40,800 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-19 10:05:40,800 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-19 10:05:40,968 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:40,969 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:40,970 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-19 10:05:40,970 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-19 10:05:40,970 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-19 10:05:40,971 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-19 10:05:40,971 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-19 10:05:40,971 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-19 10:05:41,146 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:41,147 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:41,148 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-19 10:05:41,149 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-19 10:05:41,149 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-19 10:05:41,149 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-19 10:05:41,149 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-19 10:05:41,361 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:41,363 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:41,364 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-19 10:05:41,365 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-19 10:05:41,365 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-19 10:05:41,365 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-19 10:05:41,365 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-19 10:05:41,521 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:41,522 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:41,523 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-19 10:05:41,523 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-19 10:05:41,524 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-19 10:05:41,524 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-19 10:05:41,524 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-19 10:05:41,704 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:41,705 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:41,706 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-19 10:05:41,706 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-19 10:05:41,707 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-19 10:05:41,707 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-19 10:05:41,707 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-19 10:05:41,900 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:41,902 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:41,903 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-19 10:05:41,903 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-19 10:05:41,903 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-19 10:05:41,904 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-19 10:05:41,904 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-19 10:05:42,092 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:42,094 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:42,096 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-19 10:05:42,096 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-19 10:05:42,096 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-19 10:05:42,096 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-19 10:05:42,097 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-19 10:05:42,255 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:42,256 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:42,256 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-19 10:05:42,256 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-19 10:05:42,257 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-19 10:05:42,257 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-19 10:05:42,257 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-19 10:05:42,423 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:05:42,423 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:42,424 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:05:42,424 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-19 10:05:42,425 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:05:42,427 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-19 10:05:42,428 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-19 10:05:42,428 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-19 10:05:43,433 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-19 10:05:43,805 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-19 10:05:43,805 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 10:05:43,807 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-19 10:05:43,807 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-19 10:05:43,808 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-19 10:05:43,809 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-19 10:05:43,809 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-19 10:05:43,810 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-19 10:05:43,812 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-19 10:05:43,812 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-19 10:05:43,813 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-19 10:05:43,814 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-19 10:05:43,815 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-19 10:05:43,815 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-19 10:05:43,816 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-19 10:05:43,817 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-19 10:05:43,818 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-19 10:05:43,818 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-19 10:05:43,820 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-19 10:05:43,821 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dethleffs Reiselust-Prämie: Bis zu 20.000 Euro Rabatt auf Wohnmobile +2025-08-19 10:05:43,822 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue promobil-Newsletter - gratis!: Zum Frühstück die spannendsten Camping-Themen +2025-08-19 10:05:43,822 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Drittes Camping-Rekordjahr in Folge: Süd schlägt Nord – Hier wird am häufigsten gecampt +2025-08-19 10:05:43,822 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-19 10:05:44,823 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2 +2025-08-19 10:05:45,095 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Langenfeld (Rheinland) +2025-08-19 10:05:45,095 - INFO - fetch_and_process_feed:187 - 📰 15 Einträge gefunden +2025-08-19 10:05:45,097 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/13248/6098000 +2025-08-19 10:05:45,375 - INFO - extract_images_with_metadata:167 - 🔍 8 img-Tags gefunden +2025-08-19 10:05:45,376 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/13248/6098000 +2025-08-19 10:05:45,376 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-D: Langenfeld - A3 Richtung Arnheim - Anschlussstelle Solingen - Motorradalleinunfall mit Sozia - Fahrer schwer und Sozia leicht verletzt' extrahiert +2025-08-19 10:05:45,376 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-D: Langenfeld - A3 Richtung Arnheim - Anschlussstelle Solingen - Motorradalleinunfall mit Sozia - Fahrer schwer und Sozia leicht verletzt +2025-08-19 10:05:45,377 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6095749 +2025-08-19 10:05:45,631 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:45,631 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6095749 +2025-08-19 10:05:45,631 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Die Polizei lädt zum Gespräch am "STREIFENwagen"' extrahiert +2025-08-19 10:05:45,631 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Die Polizei lädt zum Gespräch am "STREIFENwagen" +2025-08-19 10:05:45,633 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6093692 +2025-08-19 10:05:45,914 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:45,914 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6093692 +2025-08-19 10:05:45,915 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Tragischer Verkehrsunfall - Zwei Insassen verstorben - 2508041' extrahiert +2025-08-19 10:05:45,915 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Tragischer Verkehrsunfall - Zwei Insassen verstorben - 2508041 +2025-08-19 10:05:45,916 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6092772 +2025-08-19 10:05:46,169 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:46,170 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6092772 +2025-08-19 10:05:46,170 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Gabelstapler in Brand gesetzt: Polizei bittet um Hinweise - 2508033' extrahiert +2025-08-19 10:05:46,170 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Gabelstapler in Brand gesetzt: Polizei bittet um Hinweise - 2508033 +2025-08-19 10:05:46,171 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6091203 +2025-08-19 10:05:46,432 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:46,433 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6091203 +2025-08-19 10:05:46,433 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Porsche 911 Carrera entwendet: Polizei bittet um Hinweise - 2508025' extrahiert +2025-08-19 10:05:46,433 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Porsche 911 Carrera entwendet: Polizei bittet um Hinweise - 2508025 +2025-08-19 10:05:46,434 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: POL-ME: Verkehrsunfallfluchten aus dem Kreisgebiet - 2508021 +2025-08-19 10:05:46,434 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6090985 (Versuch 1) +2025-08-19 10:05:46,699 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:46,700 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 270 Wörter +2025-08-19 10:05:46,700 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 270 Wörter +2025-08-19 10:05:46,701 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6090985 +2025-08-19 10:05:46,981 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:46,982 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6090985 +2025-08-19 10:05:46,982 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Verkehrsunfallfluchten aus dem Kreisgebiet - 2508021' extrahiert +2025-08-19 10:05:46,982 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Verkehrsunfallfluchten aus dem Kreisgebiet - 2508021 +2025-08-19 10:05:46,983 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6090932 +2025-08-19 10:05:47,278 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:47,279 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6090932 +2025-08-19 10:05:47,279 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Einbrüche aus dem Kreisgebiet - 2508020' extrahiert +2025-08-19 10:05:47,279 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Einbrüche aus dem Kreisgebiet - 2508020 +2025-08-19 10:05:47,280 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6090567 +2025-08-19 10:05:47,556 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:47,557 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6090567 +2025-08-19 10:05:47,558 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Harley-Davidson gestohlen: Polizei bittet um Hinweise - 2508017' extrahiert +2025-08-19 10:05:47,558 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Harley-Davidson gestohlen: Polizei bittet um Hinweise - 2508017 +2025-08-19 10:05:47,559 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6090066 +2025-08-19 10:05:47,829 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:47,829 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6090066 +2025-08-19 10:05:47,830 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Einbrüche aus dem Kreisgebiet - 2508012' extrahiert +2025-08-19 10:05:47,830 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Einbrüche aus dem Kreisgebiet - 2508012 +2025-08-19 10:05:47,831 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/13248/6089342 +2025-08-19 10:05:48,122 - INFO - extract_images_with_metadata:167 - 🔍 7 img-Tags gefunden +2025-08-19 10:05:48,122 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/13248/6089342 +2025-08-19 10:05:48,123 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-D: Meldung der Autobahnpolizei - A 3 - Verkehrsunfall bei Langenfeld - Pkw überschlägt sich in Baustelle - Eine lebensgefährlich verletzte Person' extrahiert +2025-08-19 10:05:48,123 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-D: Meldung der Autobahnpolizei - A 3 - Verkehrsunfall bei Langenfeld - Pkw überschlägt sich in Baustelle - Eine lebensgefährlich verletzte Person +2025-08-19 10:05:48,124 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6088459 +2025-08-19 10:05:48,444 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:48,445 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6088459 +2025-08-19 10:05:48,445 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Einbrüche aus dem Kreisgebiet - 2508002' extrahiert +2025-08-19 10:05:48,445 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Einbrüche aus dem Kreisgebiet - 2508002 +2025-08-19 10:05:48,446 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6087627 +2025-08-19 10:05:48,710 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:48,711 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6087627 +2025-08-19 10:05:48,711 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Einbrüche aus dem Kreisgebiet - 2507143' extrahiert +2025-08-19 10:05:48,711 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Einbrüche aus dem Kreisgebiet - 2507143 +2025-08-19 10:05:48,712 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6085822 +2025-08-19 10:05:48,997 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:48,998 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6085822 +2025-08-19 10:05:48,998 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Autos aufgebrochen: Reihenweise Scheiben eingeschlagen - 2507133' extrahiert +2025-08-19 10:05:48,998 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Autos aufgebrochen: Reihenweise Scheiben eingeschlagen - 2507133 +2025-08-19 10:05:48,999 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6085785 +2025-08-19 10:05:49,287 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:49,288 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6085785 +2025-08-19 10:05:49,288 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Polizei zieht verkehrsunsicheren Transporter aus dem Verkehr - 2507132' extrahiert +2025-08-19 10:05:49,288 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Polizei zieht verkehrsunsicheren Transporter aus dem Verkehr - 2507132 +2025-08-19 10:05:49,289 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/blaulicht/pm/43777/6085781 +2025-08-19 10:05:49,564 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:49,565 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/blaulicht/pm/43777/6085781 +2025-08-19 10:05:49,565 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-ME: Bonn-Auerberg: Festnahme eines aus dem Maßregelvollzug entwichenen Strafgefangenen - 2507134' extrahiert +2025-08-19 10:05:49,565 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-ME: Bonn-Auerberg: Festnahme eines aus dem Maßregelvollzug entwichenen Strafgefangenen - 2507134 +2025-08-19 10:05:49,565 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 15 neue Artikel aus https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2 +2025-08-19 10:05:50,570 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-19 10:05:50,796 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach camping +2025-08-19 10:05:50,796 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 10:05:50,798 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/180570/6098987 +2025-08-19 10:05:51,070 - INFO - extract_images_with_metadata:167 - 🔍 10 img-Tags gefunden +2025-08-19 10:05:51,070 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/180570/6098987 +2025-08-19 10:05:51,071 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern' extrahiert +2025-08-19 10:05:51,071 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-19 10:05:51,072 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/6605/6098566 +2025-08-19 10:05:51,371 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:51,371 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/6605/6098566 +2025-08-19 10:05:51,372 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA' extrahiert +2025-08-19 10:05:51,372 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-19 10:05:51,373 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/161806/6098495 +2025-08-19 10:05:51,639 - INFO - extract_images_with_metadata:167 - 🔍 7 img-Tags gefunden +2025-08-19 10:05:51,639 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/161806/6098495 +2025-08-19 10:05:51,640 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem' extrahiert +2025-08-19 10:05:51,640 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem +2025-08-19 10:05:51,640 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Inklusiver Campingurlaub am Gardasee +2025-08-19 10:05:51,640 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/153661/6094377 (Versuch 1) +2025-08-19 10:05:51,935 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:51,936 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 616 Wörter +2025-08-19 10:05:51,936 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 616 Wörter +2025-08-19 10:05:51,937 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/153661/6094377 +2025-08-19 10:05:52,225 - INFO - extract_images_with_metadata:167 - 🔍 21 img-Tags gefunden +2025-08-19 10:05:52,226 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Inklusiver Campingurlaub am Gardasee... +2025-08-19 10:05:52,226 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Inklusiver Campingurlaub am Gardasee... +2025-08-19 10:05:52,226 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Inklusiver Campingurlaub am Gardasee... +2025-08-19 10:05:52,226 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Inklusiver Campingurlaub am Gardasee... +2025-08-19 10:05:52,226 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Inklusiver Campingurlaub am Gardasee... +2025-08-19 10:05:52,226 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.presseportal.de/pm/153661/6094377: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-19 10:05:52,227 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Inklusiver Campingurlaub am Gardasee' extrahiert +2025-08-19 10:05:52,227 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Inklusiver Campingurlaub am Gardasee +2025-08-19 10:05:52,228 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/172978/6093880 +2025-08-19 10:05:52,582 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:52,583 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/172978/6093880 +2025-08-19 10:05:52,583 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025' extrahiert +2025-08-19 10:05:52,583 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025 +2025-08-19 10:05:52,584 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-19 10:05:52,584 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/170000/6091414 (Versuch 1) +2025-08-19 10:05:53,031 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:53,032 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 191 Wörter +2025-08-19 10:05:53,032 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 191 Wörter +2025-08-19 10:05:53,033 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/170000/6091414 +2025-08-19 10:05:53,310 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:53,310 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/170000/6091414 +2025-08-19 10:05:53,311 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf' extrahiert +2025-08-19 10:05:53,311 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-19 10:05:53,312 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/7849/6087294 +2025-08-19 10:05:53,634 - INFO - extract_images_with_metadata:167 - 🔍 16 img-Tags gefunden +2025-08-19 10:05:53,634 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digita... +2025-08-19 10:05:53,634 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digita... +2025-08-19 10:05:53,635 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digita... +2025-08-19 10:05:53,635 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digita... +2025-08-19 10:05:53,635 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digita... +2025-08-19 10:05:53,635 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.presseportal.de/pm/7849/6087294: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-19 10:05:53,635 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für '50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt' extrahiert +2025-08-19 10:05:53,635 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt +2025-08-19 10:05:53,637 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/6605/6086102 +2025-08-19 10:05:53,900 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:53,901 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/6605/6086102 +2025-08-19 10:05:53,901 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'RTLZWEI: Erfolgreicher Montag mit "Bella Italia - Camping auf Deutsch"' extrahiert +2025-08-19 10:05:53,901 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: RTLZWEI: Erfolgreicher Montag mit "Bella Italia - Camping auf Deutsch" +2025-08-19 10:05:53,902 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-19 10:05:53,902 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-19 10:05:54,234 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:54,235 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-19 10:05:54,235 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-19 10:05:54,236 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/121716/6085196 +2025-08-19 10:05:54,595 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:54,595 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/121716/6085196 +2025-08-19 10:05:54,596 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'So ist man beim Camping richtig versichert' extrahiert +2025-08-19 10:05:54,596 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: So ist man beim Camping richtig versichert +2025-08-19 10:05:54,596 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-19 10:05:54,596 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/102577/6085137 (Versuch 1) +2025-08-19 10:05:54,946 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:54,948 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 1226 Wörter +2025-08-19 10:05:54,949 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1226 Wörter +2025-08-19 10:05:54,949 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/102577/6085137 +2025-08-19 10:05:55,269 - INFO - extract_images_with_metadata:167 - 🔍 20 img-Tags gefunden +2025-08-19 10:05:55,270 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Family Spots: Diese Reiseziele begeistern Groß und... +2025-08-19 10:05:55,270 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Family Spots: Diese Reiseziele begeistern Groß und... +2025-08-19 10:05:55,270 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Family Spots: Diese Reiseziele begeistern Groß und... +2025-08-19 10:05:55,270 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Family Spots: Diese Reiseziele begeistern Groß und... +2025-08-19 10:05:55,271 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Family Spots: Diese Reiseziele begeistern Groß und... +2025-08-19 10:05:55,271 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.presseportal.de/pm/102577/6085137: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-19 10:05:55,271 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Family Spots: Diese Reiseziele begeistern Groß und Klein' extrahiert +2025-08-19 10:05:55,271 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-19 10:05:55,271 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 10 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-19 10:05:56,274 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-19 10:05:56,499 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil +2025-08-19 10:05:56,500 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 10:05:56,501 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-19 10:05:56,503 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/158602/6094967 +2025-08-19 10:05:56,800 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:56,800 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: ECOVACS GLOBAL PTE. LTD.... +2025-08-19 10:05:56,801 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.presseportal.de/pm/158602/6094967: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-19 10:05:56,801 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco' extrahiert +2025-08-19 10:05:56,801 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco +2025-08-19 10:05:56,803 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/7239/6091976 +2025-08-19 10:05:57,076 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:57,077 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/7239/6091976 +2025-08-19 10:05:57,077 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall' extrahiert +2025-08-19 10:05:57,077 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall +2025-08-19 10:05:57,078 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-19 10:05:57,078 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/105254/6091837 (Versuch 1) +2025-08-19 10:05:57,361 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:57,362 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/105254/6091837 +2025-08-19 10:05:57,694 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:57,694 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/105254/6091837 +2025-08-19 10:05:57,695 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher' extrahiert +2025-08-19 10:05:57,695 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-19 10:05:57,695 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-19 10:05:57,695 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-19 10:05:57,993 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:57,994 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-19 10:05:57,994 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-19 10:05:57,995 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-19 10:05:57,996 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/116585/6083456 +2025-08-19 10:05:58,253 - INFO - extract_images_with_metadata:167 - 🔍 7 img-Tags gefunden +2025-08-19 10:05:58,253 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/116585/6083456 +2025-08-19 10:05:58,254 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Trotz Camper-Hype: Der Pkw ist die unangefochtene Nummer 1 für Sommerreisen' extrahiert +2025-08-19 10:05:58,254 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Trotz Camper-Hype: Der Pkw ist die unangefochtene Nummer 1 für Sommerreisen +2025-08-19 10:05:58,255 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/6605/6083013 +2025-08-19 10:05:58,509 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:58,509 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/6605/6083013 +2025-08-19 10:05:58,509 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Doppelfolge am 24. Juli "Oksana & Family - Alles auf Anfang": Abwasserprobleme, Jobsuche und Tonstudiobesuch' extrahiert +2025-08-19 10:05:58,509 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Doppelfolge am 24. Juli "Oksana & Family - Alles auf Anfang": Abwasserprobleme, Jobsuche und Tonstudiobesuch +2025-08-19 10:05:58,510 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/6605/6078446 +2025-08-19 10:05:58,789 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-19 10:05:58,790 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/6605/6078446 +2025-08-19 10:05:58,790 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Neue Folge "Oksana & Family - Alles auf Anfang": Zwischen Camping-Chaos und einer schweren Entscheidung' extrahiert +2025-08-19 10:05:58,790 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Neue Folge "Oksana & Family - Alles auf Anfang": Zwischen Camping-Chaos und einer schweren Entscheidung +2025-08-19 10:05:58,791 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper +2025-08-19 10:05:58,791 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/13984/6077676 (Versuch 1) +2025-08-19 10:05:59,104 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:05:59,106 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 891 Wörter +2025-08-19 10:05:59,107 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 891 Wörter +2025-08-19 10:05:59,107 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/13984/6077676 +2025-08-19 10:05:59,386 - INFO - extract_images_with_metadata:167 - 🔍 7 img-Tags gefunden +2025-08-19 10:05:59,386 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/13984/6077676 +2025-08-19 10:05:59,386 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper' extrahiert +2025-08-19 10:05:59,386 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper +2025-08-19 10:05:59,388 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/63400/6076962 +2025-08-19 10:05:59,675 - INFO - extract_images_with_metadata:167 - 🔍 7 img-Tags gefunden +2025-08-19 10:05:59,675 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: R+V Infocenter... +2025-08-19 10:05:59,676 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.presseportal.de/pm/63400/6076962: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-19 10:05:59,676 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Urlaub mit Wohnmobil: erhöhte Unfallgefahr' extrahiert +2025-08-19 10:05:59,676 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Urlaub mit Wohnmobil: erhöhte Unfallgefahr +2025-08-19 10:05:59,676 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 8 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-19 10:06:00,681 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://caravan-news.de/rss/schlagzeilen.php +2025-08-19 10:06:00,966 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: CARAVAN-NEWS.de +2025-08-19 10:06:00,966 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://caravan-news.de/rss/schlagzeilen.php +2025-08-19 10:06:01,968 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-19 10:06:02,749 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Campingplatz +2025-08-19 10:06:02,749 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 10:06:02,750 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online +2025-08-19 10:06:02,750 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 (Versuch 1) +2025-08-19 10:06:02,915 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:02,916 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:02,916 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:02,916 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 +2025-08-19 10:06:02,918 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 +2025-08-19 10:06:03,042 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:03,043 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 +2025-08-19 10:06:03,044 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online' extrahiert +2025-08-19 10:06:03,044 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online +2025-08-19 10:06:03,045 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Go's und No-Go's auf dem Husumer Campingplatz - SHZ +2025-08-19 10:06:03,045 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/husum/artikel/gos-und-no-gos-auf-dem-husumer-campingplatz-49140857&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2QF6COS0JJi1OJck-Moqnc (Versuch 1) +2025-08-19 10:06:03,161 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:03,162 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:03,162 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:03,162 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/husum/artikel/gos-und-no-gos-auf-dem-husumer-campingplatz-49140857&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2QF6COS0JJi1OJck-Moqnc +2025-08-19 10:06:03,163 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/husum/artikel/gos-und-no-gos-auf-dem-husumer-campingplatz-49140857&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2QF6COS0JJi1OJck-Moqnc +2025-08-19 10:06:03,298 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:03,298 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/husum/artikel/gos-und-no-gos-auf-dem-husumer-campingplatz-49140857&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2QF6COS0JJi1OJck-Moqnc +2025-08-19 10:06:03,299 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Go's und No-Go's auf dem Husumer Campingplatz - SHZ' extrahiert +2025-08-19 10:06:03,299 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Go's und No-Go's auf dem Husumer Campingplatz - SHZ +2025-08-19 10:06:03,299 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping: Grenzüberschreitung! Gäste greifen zu harten Maßnahmen - moin.de +2025-08-19 10:06:03,300 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.moin.de/norddeutschland/camping-platz-nachbarn-was-tun-voll-verrueckt-plaetze-id300643691.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3yKD6zM5C0GGtXMIRQ476n (Versuch 1) +2025-08-19 10:06:03,426 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:03,426 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:03,428 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:03,428 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.moin.de/norddeutschland/camping-platz-nachbarn-was-tun-voll-verrueckt-plaetze-id300643691.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3yKD6zM5C0GGtXMIRQ476n +2025-08-19 10:06:03,431 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.moin.de/norddeutschland/camping-platz-nachbarn-was-tun-voll-verrueckt-plaetze-id300643691.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3yKD6zM5C0GGtXMIRQ476n +2025-08-19 10:06:03,552 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:03,552 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.moin.de/norddeutschland/camping-platz-nachbarn-was-tun-voll-verrueckt-plaetze-id300643691.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3yKD6zM5C0GGtXMIRQ476n +2025-08-19 10:06:03,553 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Camping: Grenzüberschreitung! Gäste greifen zu harten Maßnahmen - moin.de' extrahiert +2025-08-19 10:06:03,553 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Camping: Grenzüberschreitung! Gäste greifen zu harten Maßnahmen - moin.de +2025-08-19 10:06:03,554 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping erobert neue Zielgruppen | Trends - Counter vor9 +2025-08-19 10:06:03,554 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.countervor9.de/trends/camping-erobert-neue-zielgruppen&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw25FhwEFlV2_J6vE622fq-G (Versuch 1) +2025-08-19 10:06:03,676 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:03,677 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:03,677 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:03,678 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.countervor9.de/trends/camping-erobert-neue-zielgruppen&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw25FhwEFlV2_J6vE622fq-G +2025-08-19 10:06:03,679 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.countervor9.de/trends/camping-erobert-neue-zielgruppen&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw25FhwEFlV2_J6vE622fq-G +2025-08-19 10:06:03,796 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:03,796 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.countervor9.de/trends/camping-erobert-neue-zielgruppen&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw25FhwEFlV2_J6vE622fq-G +2025-08-19 10:06:03,797 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Camping erobert neue Zielgruppen | Trends - Counter vor9' extrahiert +2025-08-19 10:06:03,797 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Camping erobert neue Zielgruppen | Trends - Counter vor9 +2025-08-19 10:06:03,797 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Liveschalte - Vom DDR-Intercamping zum modernen Campingplatz Berlin | rbb - rbb24 +2025-08-19 10:06:03,798 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rbb-online.de/der-tag/ort/schmoekwitzwerder-camping-am-krossinsee.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2DBDdZLr3yZhvUrdhKDBMZ (Versuch 1) +2025-08-19 10:06:03,911 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:03,911 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:03,911 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:03,912 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.rbb-online.de/der-tag/ort/schmoekwitzwerder-camping-am-krossinsee.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2DBDdZLr3yZhvUrdhKDBMZ +2025-08-19 10:06:03,913 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rbb-online.de/der-tag/ort/schmoekwitzwerder-camping-am-krossinsee.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2DBDdZLr3yZhvUrdhKDBMZ +2025-08-19 10:06:04,035 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:04,036 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.rbb-online.de/der-tag/ort/schmoekwitzwerder-camping-am-krossinsee.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2DBDdZLr3yZhvUrdhKDBMZ +2025-08-19 10:06:04,036 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Liveschalte - Vom DDR-Intercamping zum modernen Campingplatz Berlin | rbb - rbb24' extrahiert +2025-08-19 10:06:04,036 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Liveschalte - Vom DDR-Intercamping zum modernen Campingplatz Berlin | rbb - rbb24 +2025-08-19 10:06:04,037 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Verträge laufen aus – Steht der Dauercampingplatz in Karlstein am Main vor dem Aus? +2025-08-19 10:06:04,037 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tvmainfranken.de/mediathek/video/vertraege-laufen-aus-steht-der-dauercampingplatz-in-karlstein-am-main-vor-dem-aus/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1DnOUC_hBM-Pi_zSeQ-Agv (Versuch 1) +2025-08-19 10:06:04,151 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:04,152 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:04,152 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:04,152 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.tvmainfranken.de/mediathek/video/vertraege-laufen-aus-steht-der-dauercampingplatz-in-karlstein-am-main-vor-dem-aus/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1DnOUC_hBM-Pi_zSeQ-Agv +2025-08-19 10:06:04,154 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tvmainfranken.de/mediathek/video/vertraege-laufen-aus-steht-der-dauercampingplatz-in-karlstein-am-main-vor-dem-aus/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1DnOUC_hBM-Pi_zSeQ-Agv +2025-08-19 10:06:04,276 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:04,276 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.tvmainfranken.de/mediathek/video/vertraege-laufen-aus-steht-der-dauercampingplatz-in-karlstein-am-main-vor-dem-aus/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1DnOUC_hBM-Pi_zSeQ-Agv +2025-08-19 10:06:04,277 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Verträge laufen aus – Steht der Dauercampingplatz in Karlstein am Main vor dem Aus?' extrahiert +2025-08-19 10:06:04,277 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Verträge laufen aus – Steht der Dauercampingplatz in Karlstein am Main vor dem Aus? +2025-08-19 10:06:04,278 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Urlaub mit Hund in Mecklenburg-Vorpommern: Hier sind Vierbeiner willkommen +2025-08-19 10:06:04,278 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/mecklenburg-vorpommern/urlaub-mit-hund-in-mv-hier-sind-vierbeiner-willkommen-BRLVGYNE2VE6JCGSNWVMQ6MQ64.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28_kG-NzvJuF08jgbQyzeZ (Versuch 1) +2025-08-19 10:06:04,397 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:04,399 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:04,399 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:04,399 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/mecklenburg-vorpommern/urlaub-mit-hund-in-mv-hier-sind-vierbeiner-willkommen-BRLVGYNE2VE6JCGSNWVMQ6MQ64.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28_kG-NzvJuF08jgbQyzeZ +2025-08-19 10:06:04,400 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/mecklenburg-vorpommern/urlaub-mit-hund-in-mv-hier-sind-vierbeiner-willkommen-BRLVGYNE2VE6JCGSNWVMQ6MQ64.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28_kG-NzvJuF08jgbQyzeZ +2025-08-19 10:06:04,518 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:04,519 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/mecklenburg-vorpommern/urlaub-mit-hund-in-mv-hier-sind-vierbeiner-willkommen-BRLVGYNE2VE6JCGSNWVMQ6MQ64.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28_kG-NzvJuF08jgbQyzeZ +2025-08-19 10:06:04,519 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Urlaub mit Hund in Mecklenburg-Vorpommern: Hier sind Vierbeiner willkommen' extrahiert +2025-08-19 10:06:04,520 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Urlaub mit Hund in Mecklenburg-Vorpommern: Hier sind Vierbeiner willkommen +2025-08-19 10:06:04,520 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Deutsche auf größtem Campingplatz der Welt: „Musst du in Therapie“ - news38.de +2025-08-19 10:06:04,521 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.news38.de/panorama/promi-tv/article300594965/camping-bella-italia-rtl2-usa-fingerhuth.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1LclJVLbC4CWJ-Z13ITJAE (Versuch 1) +2025-08-19 10:06:04,636 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:04,637 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:04,637 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:04,637 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.news38.de/panorama/promi-tv/article300594965/camping-bella-italia-rtl2-usa-fingerhuth.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1LclJVLbC4CWJ-Z13ITJAE +2025-08-19 10:06:04,638 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.news38.de/panorama/promi-tv/article300594965/camping-bella-italia-rtl2-usa-fingerhuth.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1LclJVLbC4CWJ-Z13ITJAE +2025-08-19 10:06:04,759 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:04,760 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.news38.de/panorama/promi-tv/article300594965/camping-bella-italia-rtl2-usa-fingerhuth.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1LclJVLbC4CWJ-Z13ITJAE +2025-08-19 10:06:04,760 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Deutsche auf größtem Campingplatz der Welt: „Musst du in Therapie“ - news38.de' extrahiert +2025-08-19 10:06:04,760 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Deutsche auf größtem Campingplatz der Welt: „Musst du in Therapie“ - news38.de +2025-08-19 10:06:04,761 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hitze mit 30 Grad und mehr: Tropensturm bringt Europa nochmal Spätsommer-Wetter +2025-08-19 10:06:04,761 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/hitze-mit-30-grad-und-mehr-tropensturm-bringt-europa-nochmal-spaetsommer-wetter-zr-93887738.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw04IwICepfw_rAkj4MdEEpf (Versuch 1) +2025-08-19 10:06:04,881 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:04,882 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:04,882 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:04,882 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/hitze-mit-30-grad-und-mehr-tropensturm-bringt-europa-nochmal-spaetsommer-wetter-zr-93887738.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw04IwICepfw_rAkj4MdEEpf +2025-08-19 10:06:04,884 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/hitze-mit-30-grad-und-mehr-tropensturm-bringt-europa-nochmal-spaetsommer-wetter-zr-93887738.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw04IwICepfw_rAkj4MdEEpf +2025-08-19 10:06:05,048 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:05,048 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/hitze-mit-30-grad-und-mehr-tropensturm-bringt-europa-nochmal-spaetsommer-wetter-zr-93887738.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw04IwICepfw_rAkj4MdEEpf +2025-08-19 10:06:05,049 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Hitze mit 30 Grad und mehr: Tropensturm bringt Europa nochmal Spätsommer-Wetter' extrahiert +2025-08-19 10:06:05,049 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Hitze mit 30 Grad und mehr: Tropensturm bringt Europa nochmal Spätsommer-Wetter +2025-08-19 10:06:05,050 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Urlaub vor der Haustür: Warum der Innenhof des Zschopauer Seniorenzentrums für zwei ... +2025-08-19 10:06:05,050 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.freiepresse.de/erzgebirge/zschopau/urlaub-vor-der-haustuer-warum-der-innenhof-des-zschopauer-seniorenzentrums-fuer-zwei-tage-zum-campingplatz-wurde-artikel13923271&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw18Q6crLrGxT2s5ouNzshac (Versuch 1) +2025-08-19 10:06:05,177 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:05,177 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:05,177 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:05,178 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.freiepresse.de/erzgebirge/zschopau/urlaub-vor-der-haustuer-warum-der-innenhof-des-zschopauer-seniorenzentrums-fuer-zwei-tage-zum-campingplatz-wurde-artikel13923271&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw18Q6crLrGxT2s5ouNzshac +2025-08-19 10:06:05,179 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.freiepresse.de/erzgebirge/zschopau/urlaub-vor-der-haustuer-warum-der-innenhof-des-zschopauer-seniorenzentrums-fuer-zwei-tage-zum-campingplatz-wurde-artikel13923271&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw18Q6crLrGxT2s5ouNzshac +2025-08-19 10:06:05,294 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:05,295 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.freiepresse.de/erzgebirge/zschopau/urlaub-vor-der-haustuer-warum-der-innenhof-des-zschopauer-seniorenzentrums-fuer-zwei-tage-zum-campingplatz-wurde-artikel13923271&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw18Q6crLrGxT2s5ouNzshac +2025-08-19 10:06:05,295 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Urlaub vor der Haustür: Warum der Innenhof des Zschopauer Seniorenzentrums für zwei ...' extrahiert +2025-08-19 10:06:05,295 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Urlaub vor der Haustür: Warum der Innenhof des Zschopauer Seniorenzentrums für zwei ... +2025-08-19 10:06:05,296 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 10:06:05,296 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO (Versuch 1) +2025-08-19 10:06:05,412 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:05,413 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:05,413 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:05,414 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO +2025-08-19 10:06:05,416 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO +2025-08-19 10:06:05,537 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:05,537 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO +2025-08-19 10:06:05,537 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin' extrahiert +2025-08-19 10:06:05,538 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 10:06:05,538 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Surfer (85) am Chiemsee verschwunden: Großanlegte Suchaktion auch am Montag - Rosenheim24 +2025-08-19 10:06:05,538 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rosenheim24.de/rosenheim/polizeimeldungen/uebersee-polizei-und-wasserwacht-suchen-vermissten-surfer-am-chiemsee-bis-dato-ohne-erfolg-93887306.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2w_irRYdoJKzLR0X84Ad8e (Versuch 1) +2025-08-19 10:06:05,655 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:05,656 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:05,656 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:05,656 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.rosenheim24.de/rosenheim/polizeimeldungen/uebersee-polizei-und-wasserwacht-suchen-vermissten-surfer-am-chiemsee-bis-dato-ohne-erfolg-93887306.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2w_irRYdoJKzLR0X84Ad8e +2025-08-19 10:06:05,658 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rosenheim24.de/rosenheim/polizeimeldungen/uebersee-polizei-und-wasserwacht-suchen-vermissten-surfer-am-chiemsee-bis-dato-ohne-erfolg-93887306.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2w_irRYdoJKzLR0X84Ad8e +2025-08-19 10:06:05,772 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:05,773 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.rosenheim24.de/rosenheim/polizeimeldungen/uebersee-polizei-und-wasserwacht-suchen-vermissten-surfer-am-chiemsee-bis-dato-ohne-erfolg-93887306.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2w_irRYdoJKzLR0X84Ad8e +2025-08-19 10:06:05,773 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Surfer (85) am Chiemsee verschwunden: Großanlegte Suchaktion auch am Montag - Rosenheim24' extrahiert +2025-08-19 10:06:05,773 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Surfer (85) am Chiemsee verschwunden: Großanlegte Suchaktion auch am Montag - Rosenheim24 +2025-08-19 10:06:05,773 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Toter 13-Jähriger: Ermittler gehen von Unfall aus - DieSachsen.de +2025-08-19 10:06:05,773 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.diesachsen.de/unfall-und-verkehr/toter-13-jaehriger-ermittler-gehen-von-unfall-aus-3045700&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2lqwMLXlVEe-Tds0lRaXMi (Versuch 1) +2025-08-19 10:06:05,892 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:05,892 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:05,892 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:05,892 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.diesachsen.de/unfall-und-verkehr/toter-13-jaehriger-ermittler-gehen-von-unfall-aus-3045700&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2lqwMLXlVEe-Tds0lRaXMi +2025-08-19 10:06:05,894 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.diesachsen.de/unfall-und-verkehr/toter-13-jaehriger-ermittler-gehen-von-unfall-aus-3045700&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2lqwMLXlVEe-Tds0lRaXMi +2025-08-19 10:06:06,018 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:06,018 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.diesachsen.de/unfall-und-verkehr/toter-13-jaehriger-ermittler-gehen-von-unfall-aus-3045700&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2lqwMLXlVEe-Tds0lRaXMi +2025-08-19 10:06:06,019 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Toter 13-Jähriger: Ermittler gehen von Unfall aus - DieSachsen.de' extrahiert +2025-08-19 10:06:06,020 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Toter 13-Jähriger: Ermittler gehen von Unfall aus - DieSachsen.de +2025-08-19 10:06:06,020 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Angriff mit Yoga-Matten: Mutter mit zwei Kindern auf Campingplatz Langlau in Not +2025-08-19 10:06:06,021 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/gunzenhausen/angriff-mit-yoga-matten-mutter-mit-zwei-kindern-auf-campingplatz-langlau-in-not-1.14800747&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ugUpG1IfTlR1FCFcgsHvG (Versuch 1) +2025-08-19 10:06:06,144 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:06,144 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:06,145 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:06,145 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/gunzenhausen/angriff-mit-yoga-matten-mutter-mit-zwei-kindern-auf-campingplatz-langlau-in-not-1.14800747&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ugUpG1IfTlR1FCFcgsHvG +2025-08-19 10:06:06,147 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/gunzenhausen/angriff-mit-yoga-matten-mutter-mit-zwei-kindern-auf-campingplatz-langlau-in-not-1.14800747&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ugUpG1IfTlR1FCFcgsHvG +2025-08-19 10:06:06,269 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:06,270 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/gunzenhausen/angriff-mit-yoga-matten-mutter-mit-zwei-kindern-auf-campingplatz-langlau-in-not-1.14800747&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ugUpG1IfTlR1FCFcgsHvG +2025-08-19 10:06:06,270 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Angriff mit Yoga-Matten: Mutter mit zwei Kindern auf Campingplatz Langlau in Not' extrahiert +2025-08-19 10:06:06,270 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Angriff mit Yoga-Matten: Mutter mit zwei Kindern auf Campingplatz Langlau in Not +2025-08-19 10:06:06,271 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Übersee: 85-jähriger Surfer wird auf dem Chiemsee vermisst - Traunsteiner Tagblatt +2025-08-19 10:06:06,271 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.traunsteiner-tagblatt.de/region/landkreis-traunstein/uebersee_artikel,-85jaehriger-surfer-wird-auf-dem-chiemsee-vermisst-_arid,952723.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0dJa3tuybPxYdMYo3oV320 (Versuch 1) +2025-08-19 10:06:06,395 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:06,396 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:06,396 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:06,396 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.traunsteiner-tagblatt.de/region/landkreis-traunstein/uebersee_artikel,-85jaehriger-surfer-wird-auf-dem-chiemsee-vermisst-_arid,952723.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0dJa3tuybPxYdMYo3oV320 +2025-08-19 10:06:06,398 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.traunsteiner-tagblatt.de/region/landkreis-traunstein/uebersee_artikel,-85jaehriger-surfer-wird-auf-dem-chiemsee-vermisst-_arid,952723.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0dJa3tuybPxYdMYo3oV320 +2025-08-19 10:06:06,520 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:06,520 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.traunsteiner-tagblatt.de/region/landkreis-traunstein/uebersee_artikel,-85jaehriger-surfer-wird-auf-dem-chiemsee-vermisst-_arid,952723.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0dJa3tuybPxYdMYo3oV320 +2025-08-19 10:06:06,521 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Übersee: 85-jähriger Surfer wird auf dem Chiemsee vermisst - Traunsteiner Tagblatt' extrahiert +2025-08-19 10:06:06,521 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Übersee: 85-jähriger Surfer wird auf dem Chiemsee vermisst - Traunsteiner Tagblatt +2025-08-19 10:06:06,522 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Weinsberg CaraTour 600 ME im Test: Abenteuer auf vier Rädern? - IMTEST +2025-08-19 10:06:06,522 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.imtest.de/mobilitaet-reise/weinsberg-caratour-600-me-camping-van-kompakt-kastenwagen-test-ziemlich/424550&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3y4Gx77nyLDlu4T5QBAh_- (Versuch 1) +2025-08-19 10:06:06,640 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:06,641 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:06,641 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:06,641 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.imtest.de/mobilitaet-reise/weinsberg-caratour-600-me-camping-van-kompakt-kastenwagen-test-ziemlich/424550&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3y4Gx77nyLDlu4T5QBAh_- +2025-08-19 10:06:06,643 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.imtest.de/mobilitaet-reise/weinsberg-caratour-600-me-camping-van-kompakt-kastenwagen-test-ziemlich/424550&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3y4Gx77nyLDlu4T5QBAh_- +2025-08-19 10:06:06,762 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:06,763 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.imtest.de/mobilitaet-reise/weinsberg-caratour-600-me-camping-van-kompakt-kastenwagen-test-ziemlich/424550&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3y4Gx77nyLDlu4T5QBAh_- +2025-08-19 10:06:06,763 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Weinsberg CaraTour 600 ME im Test: Abenteuer auf vier Rädern? - IMTEST' extrahiert +2025-08-19 10:06:06,763 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Weinsberg CaraTour 600 ME im Test: Abenteuer auf vier Rädern? - IMTEST +2025-08-19 10:06:06,764 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: An Weilburger Tankstelle fliegen die Fäuste - Echo Online +2025-08-19 10:06:06,764 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/kreis-limburg-weilburg/weilburg/an-weilburger-tankstelle-fliegen-die-faeuste-4892024&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l7jUxG7664vJ69cHwv20M (Versuch 1) +2025-08-19 10:06:06,876 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:06,877 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:06,877 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:06,877 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/kreis-limburg-weilburg/weilburg/an-weilburger-tankstelle-fliegen-die-faeuste-4892024&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l7jUxG7664vJ69cHwv20M +2025-08-19 10:06:06,879 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/kreis-limburg-weilburg/weilburg/an-weilburger-tankstelle-fliegen-die-faeuste-4892024&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l7jUxG7664vJ69cHwv20M +2025-08-19 10:06:07,005 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:07,005 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/kreis-limburg-weilburg/weilburg/an-weilburger-tankstelle-fliegen-die-faeuste-4892024&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l7jUxG7664vJ69cHwv20M +2025-08-19 10:06:07,006 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'An Weilburger Tankstelle fliegen die Fäuste - Echo Online' extrahiert +2025-08-19 10:06:07,006 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: An Weilburger Tankstelle fliegen die Fäuste - Echo Online +2025-08-19 10:06:07,007 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Ein spannendes Wochenende für kleine Abenteurer - BLICK aktuell +2025-08-19 10:06:07,007 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.blick-aktuell.de/Termine/Ein-spannendes-Wochenende-fuer-kleine-Abenteurer--636547.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0kVA76weLMICuiplUm9G5M (Versuch 1) +2025-08-19 10:06:07,129 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:07,130 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:07,130 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:07,130 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.blick-aktuell.de/Termine/Ein-spannendes-Wochenende-fuer-kleine-Abenteurer--636547.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0kVA76weLMICuiplUm9G5M +2025-08-19 10:06:07,131 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.blick-aktuell.de/Termine/Ein-spannendes-Wochenende-fuer-kleine-Abenteurer--636547.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0kVA76weLMICuiplUm9G5M +2025-08-19 10:06:07,257 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:07,257 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.blick-aktuell.de/Termine/Ein-spannendes-Wochenende-fuer-kleine-Abenteurer--636547.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0kVA76weLMICuiplUm9G5M +2025-08-19 10:06:07,258 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Ein spannendes Wochenende für kleine Abenteurer - BLICK aktuell' extrahiert +2025-08-19 10:06:07,259 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Ein spannendes Wochenende für kleine Abenteurer - BLICK aktuell +2025-08-19 10:06:07,259 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Woran ein Campingplatz-Experte des ADAC deutsche Urlauber direkt erkennt +2025-08-19 10:06:07,259 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.lauterbacher-anzeiger.de/panorama/woran-ein-campingplatz-experte-des-adac-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw14jziy82R0xboz7sPEvmaR (Versuch 1) +2025-08-19 10:06:07,385 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:07,386 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:07,386 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:07,386 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.lauterbacher-anzeiger.de/panorama/woran-ein-campingplatz-experte-des-adac-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw14jziy82R0xboz7sPEvmaR +2025-08-19 10:06:07,387 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.lauterbacher-anzeiger.de/panorama/woran-ein-campingplatz-experte-des-adac-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw14jziy82R0xboz7sPEvmaR +2025-08-19 10:06:07,505 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:07,505 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.lauterbacher-anzeiger.de/panorama/woran-ein-campingplatz-experte-des-adac-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw14jziy82R0xboz7sPEvmaR +2025-08-19 10:06:07,505 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Woran ein Campingplatz-Experte des ADAC deutsche Urlauber direkt erkennt' extrahiert +2025-08-19 10:06:07,506 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Woran ein Campingplatz-Experte des ADAC deutsche Urlauber direkt erkennt +2025-08-19 10:06:07,506 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vermisster Junge bei Lohsa: Obduktion des toten 13-Jährigen abgeschlossen | Lausitzer Rundschau +2025-08-19 10:06:07,506 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.lr-online.de/lausitz/hoyerswerda/vermisster-junge-bei-lohsa-obduktion-des-toten-13-jaehrigen-abgeschlossen-78252705.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bCvU4jnneGEZTl3uf48qo (Versuch 1) +2025-08-19 10:06:07,622 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:07,623 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:07,623 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:07,623 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.lr-online.de/lausitz/hoyerswerda/vermisster-junge-bei-lohsa-obduktion-des-toten-13-jaehrigen-abgeschlossen-78252705.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bCvU4jnneGEZTl3uf48qo +2025-08-19 10:06:07,626 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.lr-online.de/lausitz/hoyerswerda/vermisster-junge-bei-lohsa-obduktion-des-toten-13-jaehrigen-abgeschlossen-78252705.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bCvU4jnneGEZTl3uf48qo +2025-08-19 10:06:07,744 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:07,745 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.lr-online.de/lausitz/hoyerswerda/vermisster-junge-bei-lohsa-obduktion-des-toten-13-jaehrigen-abgeschlossen-78252705.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bCvU4jnneGEZTl3uf48qo +2025-08-19 10:06:07,745 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Vermisster Junge bei Lohsa: Obduktion des toten 13-Jährigen abgeschlossen | Lausitzer Rundschau' extrahiert +2025-08-19 10:06:07,745 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Vermisster Junge bei Lohsa: Obduktion des toten 13-Jährigen abgeschlossen | Lausitzer Rundschau +2025-08-19 10:06:07,745 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 20 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-19 10:06:08,751 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-19 10:06:09,373 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Vanlife +2025-08-19 10:06:09,373 - INFO - fetch_and_process_feed:187 - 📰 3 Einträge gefunden +2025-08-19 10:06:09,374 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Jeep Cherokee als Camper – der einfache Weg zum autarken Urlaub - vanlifemag.de +2025-08-19 10:06:09,375 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/jeep-cherokee-als-camper/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0A-3nq90dUx96JAA9j2VYX (Versuch 1) +2025-08-19 10:06:09,493 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:09,493 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:09,493 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:09,493 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/jeep-cherokee-als-camper/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0A-3nq90dUx96JAA9j2VYX +2025-08-19 10:06:09,495 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/jeep-cherokee-als-camper/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0A-3nq90dUx96JAA9j2VYX +2025-08-19 10:06:09,613 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:09,613 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/jeep-cherokee-als-camper/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0A-3nq90dUx96JAA9j2VYX +2025-08-19 10:06:09,614 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Jeep Cherokee als Camper – der einfache Weg zum autarken Urlaub - vanlifemag.de' extrahiert +2025-08-19 10:06:09,614 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Jeep Cherokee als Camper – der einfache Weg zum autarken Urlaub - vanlifemag.de +2025-08-19 10:06:09,615 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: RC-1 SEMA Build: Ein Show-Camper setzt neue Maßstäbe - vanlifemag.de +2025-08-19 10:06:09,615 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/rc-1-sema-build-ein-show-camper-setzt-neue-massstaebe/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0gYNfiVFof8MRF16Pp8QEt (Versuch 1) +2025-08-19 10:06:09,731 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:09,732 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:09,732 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:09,732 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/rc-1-sema-build-ein-show-camper-setzt-neue-massstaebe/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0gYNfiVFof8MRF16Pp8QEt +2025-08-19 10:06:09,733 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/rc-1-sema-build-ein-show-camper-setzt-neue-massstaebe/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0gYNfiVFof8MRF16Pp8QEt +2025-08-19 10:06:09,850 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:09,851 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/rc-1-sema-build-ein-show-camper-setzt-neue-massstaebe/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0gYNfiVFof8MRF16Pp8QEt +2025-08-19 10:06:09,851 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'RC-1 SEMA Build: Ein Show-Camper setzt neue Maßstäbe - vanlifemag.de' extrahiert +2025-08-19 10:06:09,852 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: RC-1 SEMA Build: Ein Show-Camper setzt neue Maßstäbe - vanlifemag.de +2025-08-19 10:06:09,852 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und +2025-08-19 10:06:09,852 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee (Versuch 1) +2025-08-19 10:06:09,964 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:09,965 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:09,965 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:09,965 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee +2025-08-19 10:06:09,966 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee +2025-08-19 10:06:10,090 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:10,090 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee +2025-08-19 10:06:10,091 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und' extrahiert +2025-08-19 10:06:10,091 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und +2025-08-19 10:06:10,091 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 3 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-19 10:06:11,093 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-19 10:06:11,457 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Camping Termine 2024 +2025-08-19 10:06:11,458 - INFO - fetch_and_process_feed:187 - 📰 3 Einträge gefunden +2025-08-19 10:06:11,463 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: San Hejmo Festival 2026: Datum, Line-up, Neuheiten, Fotos - Düsseldorf Tonight +2025-08-19 10:06:11,466 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tonight.de/freizeit/san-hejmo-festival-2026-datum-line-up-neuheiten-fotos_150121.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw1oblZYw0b618LHsaVJWsDI (Versuch 1) +2025-08-19 10:06:11,587 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:11,587 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:11,587 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:11,588 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.tonight.de/freizeit/san-hejmo-festival-2026-datum-line-up-neuheiten-fotos_150121.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw1oblZYw0b618LHsaVJWsDI +2025-08-19 10:06:11,589 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tonight.de/freizeit/san-hejmo-festival-2026-datum-line-up-neuheiten-fotos_150121.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw1oblZYw0b618LHsaVJWsDI +2025-08-19 10:06:11,701 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:11,702 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.tonight.de/freizeit/san-hejmo-festival-2026-datum-line-up-neuheiten-fotos_150121.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw1oblZYw0b618LHsaVJWsDI +2025-08-19 10:06:11,702 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'San Hejmo Festival 2026: Datum, Line-up, Neuheiten, Fotos - Düsseldorf Tonight' extrahiert +2025-08-19 10:06:11,702 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: San Hejmo Festival 2026: Datum, Line-up, Neuheiten, Fotos - Düsseldorf Tonight +2025-08-19 10:06:11,703 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Familie Ochsenknecht: Camping-Urlaub mit Jimi Blue | GALA.de +2025-08-19 10:06:11,703 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.gala.de/stars/news/familie-ochsenknecht--camping-urlaub-mit-jimi-blue-24437026.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2sgq15V-Z-mJUEaEvTyAdQ (Versuch 1) +2025-08-19 10:06:11,817 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:11,818 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:11,818 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:11,819 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.gala.de/stars/news/familie-ochsenknecht--camping-urlaub-mit-jimi-blue-24437026.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2sgq15V-Z-mJUEaEvTyAdQ +2025-08-19 10:06:11,822 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.gala.de/stars/news/familie-ochsenknecht--camping-urlaub-mit-jimi-blue-24437026.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2sgq15V-Z-mJUEaEvTyAdQ +2025-08-19 10:06:11,936 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:11,936 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.gala.de/stars/news/familie-ochsenknecht--camping-urlaub-mit-jimi-blue-24437026.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2sgq15V-Z-mJUEaEvTyAdQ +2025-08-19 10:06:11,936 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Familie Ochsenknecht: Camping-Urlaub mit Jimi Blue | GALA.de' extrahiert +2025-08-19 10:06:11,937 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Familie Ochsenknecht: Camping-Urlaub mit Jimi Blue | GALA.de +2025-08-19 10:06:11,937 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Echo Open Air 2025 in Mindelheim (Westernach): Termin, Line-Up, Tickets, Bezahlung, Camping ... +2025-08-19 10:06:11,937 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.augsburger-allgemeine.de/mindelheim/echo-open-air-2025-mindelheim-westernach-am-wochenende-line-up-tickets-parken-camping-110529337&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2QZff-JniMKd0gb3ZzaRQ0 (Versuch 1) +2025-08-19 10:06:12,060 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:12,060 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:12,060 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:12,061 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.augsburger-allgemeine.de/mindelheim/echo-open-air-2025-mindelheim-westernach-am-wochenende-line-up-tickets-parken-camping-110529337&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2QZff-JniMKd0gb3ZzaRQ0 +2025-08-19 10:06:12,061 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.augsburger-allgemeine.de/mindelheim/echo-open-air-2025-mindelheim-westernach-am-wochenende-line-up-tickets-parken-camping-110529337&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2QZff-JniMKd0gb3ZzaRQ0 +2025-08-19 10:06:12,176 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:12,177 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.augsburger-allgemeine.de/mindelheim/echo-open-air-2025-mindelheim-westernach-am-wochenende-line-up-tickets-parken-camping-110529337&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2QZff-JniMKd0gb3ZzaRQ0 +2025-08-19 10:06:12,178 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Echo Open Air 2025 in Mindelheim (Westernach): Termin, Line-Up, Tickets, Bezahlung, Camping ...' extrahiert +2025-08-19 10:06:12,178 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Echo Open Air 2025 in Mindelheim (Westernach): Termin, Line-Up, Tickets, Bezahlung, Camping ... +2025-08-19 10:06:12,178 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 3 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-19 10:06:13,180 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-19 10:06:13,683 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert - Camping Messe 2025 +2025-08-19 10:06:13,683 - INFO - fetch_and_process_feed:187 - 📰 6 Einträge gefunden +2025-08-19 10:06:13,684 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 10:06:13,684 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO (Versuch 1) +2025-08-19 10:06:13,802 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:13,802 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:13,803 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:13,803 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO +2025-08-19 10:06:13,804 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 10:06:13,805 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gamescom 2025: Aston Martin im Zenless Zone Zero-Design - Autozeitung +2025-08-19 10:06:13,805 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/gamescom-2025-messe-highlights-fuer-autofans-209057.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0FXrDgBBR2LkRWJXcWhY_P (Versuch 1) +2025-08-19 10:06:13,924 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:13,925 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:13,925 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:13,925 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/gamescom-2025-messe-highlights-fuer-autofans-209057.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0FXrDgBBR2LkRWJXcWhY_P +2025-08-19 10:06:13,927 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/gamescom-2025-messe-highlights-fuer-autofans-209057.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0FXrDgBBR2LkRWJXcWhY_P +2025-08-19 10:06:14,043 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:14,043 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/gamescom-2025-messe-highlights-fuer-autofans-209057.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0FXrDgBBR2LkRWJXcWhY_P +2025-08-19 10:06:14,044 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Gamescom 2025: Aston Martin im Zenless Zone Zero-Design - Autozeitung' extrahiert +2025-08-19 10:06:14,044 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Gamescom 2025: Aston Martin im Zenless Zone Zero-Design - Autozeitung +2025-08-19 10:06:14,044 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Caravan Salon und Ed Sheeran zeitgleich: Droht ein Verkehrskollaps? | Regional - BILD.de +2025-08-19 10:06:14,045 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.bild.de/regional/duesseldorf/caravan-salon-und-ed-sheeran-zeitgleich-droht-ein-verkehrskollaps-689c5654149faf081095d6cc&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1SRpJIm3W_DbR7mUVWZ4WS (Versuch 1) +2025-08-19 10:06:14,166 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:14,167 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:14,168 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:14,169 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.bild.de/regional/duesseldorf/caravan-salon-und-ed-sheeran-zeitgleich-droht-ein-verkehrskollaps-689c5654149faf081095d6cc&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1SRpJIm3W_DbR7mUVWZ4WS +2025-08-19 10:06:14,170 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.bild.de/regional/duesseldorf/caravan-salon-und-ed-sheeran-zeitgleich-droht-ein-verkehrskollaps-689c5654149faf081095d6cc&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1SRpJIm3W_DbR7mUVWZ4WS +2025-08-19 10:06:14,289 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:14,289 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.bild.de/regional/duesseldorf/caravan-salon-und-ed-sheeran-zeitgleich-droht-ein-verkehrskollaps-689c5654149faf081095d6cc&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1SRpJIm3W_DbR7mUVWZ4WS +2025-08-19 10:06:14,289 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Caravan Salon und Ed Sheeran zeitgleich: Droht ein Verkehrskollaps? | Regional - BILD.de' extrahiert +2025-08-19 10:06:14,290 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Caravan Salon und Ed Sheeran zeitgleich: Droht ein Verkehrskollaps? | Regional - BILD.de +2025-08-19 10:06:14,290 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Neu bei Steam: Die gamescom 2025 wirft ihren Schatten voraus - GameStar +2025-08-19 10:06:14,290 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.gamestar.de/artikel/neu-bei-steam,3437937.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2sHEDYfSnIyZwh9_ssIU_y (Versuch 1) +2025-08-19 10:06:14,419 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:14,420 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:14,420 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:14,421 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.gamestar.de/artikel/neu-bei-steam,3437937.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2sHEDYfSnIyZwh9_ssIU_y +2025-08-19 10:06:14,424 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.gamestar.de/artikel/neu-bei-steam,3437937.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2sHEDYfSnIyZwh9_ssIU_y +2025-08-19 10:06:14,543 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:14,544 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.gamestar.de/artikel/neu-bei-steam,3437937.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2sHEDYfSnIyZwh9_ssIU_y +2025-08-19 10:06:14,545 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Neu bei Steam: Die gamescom 2025 wirft ihren Schatten voraus - GameStar' extrahiert +2025-08-19 10:06:14,545 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Neu bei Steam: Die gamescom 2025 wirft ihren Schatten voraus - GameStar +2025-08-19 10:06:14,546 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und +2025-08-19 10:06:14,546 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee (Versuch 1) +2025-08-19 10:06:14,664 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:14,665 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:14,665 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:14,665 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee +2025-08-19 10:06:14,667 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und +2025-08-19 10:06:14,667 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: MEORGA MSR-Spezialmesse in Ludwigshafen - klamm.de +2025-08-19 10:06:14,668 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.klamm.de/news/meorga-msr-spezialmesse-in-ludwigshafen-4N1254481.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11VrqOODIm34SfZyc87aDJ (Versuch 1) +2025-08-19 10:06:14,785 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:06:14,786 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:06:14,786 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:06:14,786 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.klamm.de/news/meorga-msr-spezialmesse-in-ludwigshafen-4N1254481.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11VrqOODIm34SfZyc87aDJ +2025-08-19 10:06:14,789 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.klamm.de/news/meorga-msr-spezialmesse-in-ludwigshafen-4N1254481.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11VrqOODIm34SfZyc87aDJ +2025-08-19 10:06:14,928 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 10:06:14,928 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.klamm.de/news/meorga-msr-spezialmesse-in-ludwigshafen-4N1254481.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11VrqOODIm34SfZyc87aDJ +2025-08-19 10:06:14,929 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'MEORGA MSR-Spezialmesse in Ludwigshafen - klamm.de' extrahiert +2025-08-19 10:06:14,929 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: MEORGA MSR-Spezialmesse in Ludwigshafen - klamm.de +2025-08-19 10:06:14,929 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 4 neue Artikel aus https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-19 10:06:15,965 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:06:15,965 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 63 neue Artikel in 38.74s hinzugefügt +2025-08-19 10:06:16,038 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:06:16,041 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:24:43,436 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:24:43,438 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:24:51,539 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:24:51,539 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:01,705 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:01,706 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:01,725 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:02,297 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:02,298 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:13,459 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:13,460 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:13,478 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:14,047 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:14,047 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:19,529 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:19,530 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:19,549 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:20,120 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:20,120 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:27,387 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:27,387 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:27,408 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:27,980 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:27,980 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:32,071 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:32,072 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:32,097 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:32,670 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:32,671 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:37,131 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:37,132 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:37,161 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:37,734 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:37,734 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:42,628 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:42,628 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:42,647 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:43,223 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:43,224 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:47,404 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:47,405 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:47,423 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:47,997 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:47,997 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:51,836 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:51,836 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:51,858 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:52,433 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:52,433 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:58,146 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:58,146 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:25:58,171 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:25:58,730 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:25:58,730 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:03,756 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:03,757 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:03,781 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:04,343 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:04,343 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:07,942 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:07,943 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:07,958 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:08,534 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:08,534 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:14,079 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:14,080 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:14,099 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:14,665 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:14,665 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:19,227 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:19,228 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:19,247 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:19,818 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:19,818 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:25,052 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:25,053 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:25,073 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:25,641 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:25,642 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:33,187 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:33,188 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:33,214 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:33,784 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:33,785 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:39,391 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:39,392 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:39,420 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:39,998 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:39,999 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:45,663 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:45,663 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:45,686 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:46,258 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:46,258 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:50,175 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:50,175 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:50,203 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:50,776 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:50,777 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:58,995 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:58,996 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:26:59,021 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:26:59,593 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:26:59,593 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:03,510 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:03,511 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:03,536 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:04,114 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:04,114 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:10,060 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:10,060 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:10,087 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:10,660 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:10,660 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:15,004 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:15,005 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:15,031 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:15,606 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:15,606 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:24,590 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:24,591 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:24,627 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:25,198 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:25,198 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:29,518 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:29,519 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:29,551 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:30,123 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:30,123 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:34,340 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:34,342 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:34,372 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:34,945 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:34,945 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:43,341 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:43,342 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:43,382 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:43,959 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:43,959 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:48,574 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:48,575 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:48,613 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:49,181 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:49,182 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:54,237 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:54,238 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:54,285 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:54,857 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:54,858 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:58,184 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:58,185 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:27:58,221 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:27:58,790 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:27:58,790 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:03,675 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:03,676 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:03,715 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:04,289 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:04,290 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:08,692 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:08,693 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:08,776 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:09,351 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:09,352 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:13,518 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:13,519 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:13,554 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:14,119 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:14,120 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:18,749 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:18,750 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:18,790 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:19,368 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:19,368 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:25,252 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:25,253 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:25,295 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:25,852 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:25,853 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:31,237 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:31,238 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:31,275 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:31,843 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:31,843 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:34,370 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:34,370 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:34,411 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:34,981 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:34,981 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:40,640 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:40,641 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:40,675 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:41,247 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:41,247 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:43,475 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:43,476 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:43,517 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:44,092 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:44,092 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:52,446 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:52,446 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:52,482 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:53,064 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:53,064 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:57,230 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:57,231 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:28:57,321 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:28:57,900 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:28:57,900 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:03,913 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:03,914 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:03,951 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:04,519 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:04,520 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:06,736 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:06,737 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:06,776 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:07,348 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:07,348 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:14,816 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:14,816 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:14,850 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:15,425 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:15,425 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:25,048 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:25,049 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:25,089 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:25,658 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:25,658 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:27,821 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:27,822 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:27,851 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:28,415 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:28,415 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:36,217 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:36,218 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:36,252 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:36,825 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:36,825 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:41,841 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:41,841 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:41,878 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:42,443 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:42,443 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:44,451 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:44,452 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:44,484 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:45,058 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:45,058 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:50,510 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:50,510 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:50,578 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:51,151 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:51,151 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:53,204 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:53,204 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:53,239 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:53,814 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:53,814 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:58,498 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:58,500 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:29:58,536 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:29:59,105 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:29:59,105 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:30:01,455 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:30:01,456 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:30:01,491 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:30:02,060 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:30:02,060 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:30:09,302 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:30:09,302 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:30:09,344 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:30:09,921 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:30:09,921 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:30:11,853 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:30:11,857 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:30:11,900 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:30:12,472 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:30:12,472 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:30:17,911 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:30:17,912 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:30:17,949 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:30:18,523 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:30:18,523 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:30:29,753 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:30:29,754 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:31:51,355 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:31:51,357 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:31:51,371 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:31:51,972 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:31:51,972 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:31:57,470 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:31:57,470 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:31:57,476 - INFO - rewrite_articles:320 - ✍️ Starte Artikel-Umschreibung +2025-08-19 10:31:57,480 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:31:57,480 - INFO - rewrite_articles:337 - ✍️ Umschreiben von: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-19 10:32:02,795 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-19 10:32:05,200 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-19 10:32:05,202 - INFO - rewrite_articles:392 - ✅ Artikel erfolgreich umgeschrieben: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-19 10:32:07,234 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:32:07,234 - INFO - rewrite_articles:404 - 🎉 1 Artikel erfolgreich umgeschrieben +2025-08-19 10:32:08,316 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:32:08,316 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:32:45,740 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:32:45,741 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:32:45,743 - INFO - upload_articles_to_wp:412 - 📤 Starte WordPress-Upload +2025-08-19 10:32:45,746 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:32:45,746 - INFO - upload_articles_to_wp:421 - 📦 1 Artikel für WordPress-Upload gefunden +2025-08-19 10:32:45,746 - INFO - __init__:51 - ✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String +2025-08-19 10:32:46,245 - INFO - _get_default_category_id:87 - ✅ Standard-Kategorie 'Allgemein' gefunden: ID 1 +2025-08-19 10:32:46,245 - INFO - test_connection:338 - 🔧 Teste WordPress-API-Verbindung mit Base64-Auth... +2025-08-19 10:32:46,246 - INFO - test_connection:342 - 🔑 Authorization Header: Basic b2dpZXJ0ejp3aE... +2025-08-19 10:32:46,728 - INFO - test_connection:351 - 📡 API-Response Status: 200 +2025-08-19 10:32:46,728 - INFO - test_connection:352 - 📡 API-Response Headers: {'Content-Type': 'application/json; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-WS-RateLimit-Limit': '1000', 'X-WS-RateLimit-Remaining': '998', 'Date': 'Tue, 19 Aug 2025 08:32:46 GMT', 'Server': 'Apache', 'X-Powered-By': 'PHP/8.2.29', 'Pragma': 'no-cache', 'X-Robots-Tag': 'noindex', 'X-Content-Type-Options': 'nosniff', 'Access-Control-Expose-Headers': 'X-WP-Total, X-WP-TotalPages, Link', 'Access-Control-Allow-Headers': 'Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type', 'X-WP-Total': '4', 'X-WP-TotalPages': '4', 'Link': '; rel="next"', 'Allow': 'GET, POST', 'Expires': 'Wed, 11 Jan 1984 05:00:00 GMT', 'Cache-Control': 'no-cache, must-revalidate, max-age=0, no-store, private'} +2025-08-19 10:32:46,728 - INFO - test_connection:355 - ✅ WordPress-API-Verbindung erfolgreich +2025-08-19 10:32:46,729 - INFO - upload_multiple_articles:392 - 📦 Starte Batch-Upload von 1 Artikeln zu WordPress +2025-08-19 10:32:46,729 - INFO - upload_multiple_articles:396 - 📤 Upload 1/1: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-19 10:32:46,729 - INFO - upload_article:249 - 📤 Starte WordPress-Upload: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-19 10:32:48,058 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Herbertz GmbH' (ID: 899) +2025-08-19 10:32:48,979 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Stechmückenabwehr' (ID: 900) +2025-08-19 10:32:49,799 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Sommerabende' (ID: 901) +2025-08-19 10:32:50,618 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Geräuschloses Gerät' (ID: 902) +2025-08-19 10:32:51,662 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'News Aktuell' (ID: 903) +2025-08-19 10:32:51,662 - INFO - _get_or_create_tags:158 - 🏷️ Tags verarbeitet: 5 Tag-IDs erstellt +2025-08-19 10:32:51,662 - INFO - _prepare_post_data:194 - 📝 Post-Daten vorbereitet: Titel='Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern', Tags=5, Kategorie=1 +2025-08-19 10:32:52,139 - INFO - upload_article:274 - ✅ WordPress-Upload erfolgreich: 'Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern' (ID: 3396) +2025-08-19 10:32:52,140 - INFO - upload_article:275 - 🔗 WordPress-URL: https://vanityontour.de/?p=3396 +2025-08-19 10:32:52,140 - INFO - upload_multiple_articles:422 - 📊 Batch-Upload abgeschlossen: 1 erfolgreich, 0 fehlgeschlagen, 0 Duplikate +2025-08-19 10:32:52,141 - INFO - upload_articles_to_wp:441 - ✅ Status geändert für 'Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern': Process → WordPress Pending +2025-08-19 10:32:52,166 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:32:52,166 - INFO - upload_articles_to_wp:446 - 💾 Artikel-Status nach WordPress-Upload aktualisiert +2025-08-19 10:32:54,241 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:32:54,241 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:35:11,740 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:35:11,741 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:39:32,617 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:39:32,618 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:39:32,638 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:39:33,231 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:39:33,232 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:39:46,149 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:39:46,150 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:39:46,157 - INFO - upload_articles_to_wp:412 - 📤 Starte WordPress-Upload +2025-08-19 10:39:46,161 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:39:46,161 - INFO - upload_articles_to_wp:421 - 📦 1 Artikel für WordPress-Upload gefunden +2025-08-19 10:39:46,161 - INFO - __init__:51 - ✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String +2025-08-19 10:39:46,771 - INFO - _get_default_category_id:87 - ✅ Standard-Kategorie 'Allgemein' gefunden: ID 1 +2025-08-19 10:39:46,772 - INFO - test_connection:338 - 🔧 Teste WordPress-API-Verbindung mit Base64-Auth... +2025-08-19 10:39:46,772 - INFO - test_connection:342 - 🔑 Authorization Header: Basic b2dpZXJ0ejp3aE... +2025-08-19 10:39:47,284 - INFO - test_connection:351 - 📡 API-Response Status: 200 +2025-08-19 10:39:47,284 - INFO - test_connection:352 - 📡 API-Response Headers: {'Content-Type': 'application/json; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-WS-RateLimit-Limit': '1000', 'X-WS-RateLimit-Remaining': '998', 'Date': 'Tue, 19 Aug 2025 08:39:46 GMT', 'Server': 'Apache', 'X-Powered-By': 'PHP/8.2.29', 'Pragma': 'no-cache', 'X-Robots-Tag': 'noindex', 'X-Content-Type-Options': 'nosniff', 'Access-Control-Expose-Headers': 'X-WP-Total, X-WP-TotalPages, Link', 'Access-Control-Allow-Headers': 'Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type', 'X-WP-Total': '4', 'X-WP-TotalPages': '4', 'Link': '; rel="next"', 'Allow': 'GET, POST', 'Expires': 'Wed, 11 Jan 1984 05:00:00 GMT', 'Cache-Control': 'no-cache, must-revalidate, max-age=0, no-store, private'} +2025-08-19 10:39:47,285 - INFO - test_connection:355 - ✅ WordPress-API-Verbindung erfolgreich +2025-08-19 10:39:47,285 - INFO - upload_multiple_articles:392 - 📦 Starte Batch-Upload von 1 Artikeln zu WordPress +2025-08-19 10:39:47,285 - INFO - upload_multiple_articles:396 - 📤 Upload 1/1: Inklusiver Campingurlaub am Gardasee +2025-08-19 10:39:47,286 - INFO - upload_article:249 - 📤 Starte WordPress-Upload: Inklusiver Campingurlaub am Gardasee +2025-08-19 10:39:47,749 - INFO - _prepare_post_data:194 - 📝 Post-Daten vorbereitet: Titel='Inklusiver Campingurlaub am Gardasee', Tags=0, Kategorie=1 +2025-08-19 10:39:48,205 - INFO - upload_article:274 - ✅ WordPress-Upload erfolgreich: 'Inklusiver Campingurlaub am Gardasee' (ID: 3408) +2025-08-19 10:39:48,206 - INFO - upload_article:275 - 🔗 WordPress-URL: https://vanityontour.de/?p=3408 +2025-08-19 10:39:48,206 - INFO - upload_multiple_articles:422 - 📊 Batch-Upload abgeschlossen: 1 erfolgreich, 0 fehlgeschlagen, 0 Duplikate +2025-08-19 10:39:48,206 - INFO - upload_articles_to_wp:441 - ✅ Status geändert für 'Inklusiver Campingurlaub am Gardasee': Process → WordPress Pending +2025-08-19 10:39:48,231 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:39:48,232 - INFO - upload_articles_to_wp:446 - 💾 Artikel-Status nach WordPress-Upload aktualisiert +2025-08-19 10:39:50,306 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:39:50,306 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:46:57,515 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:46:57,517 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:46:57,538 - INFO - save_articles:144 - ✅ 120 Artikel gespeichert +2025-08-19 10:46:58,118 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:46:58,119 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:47:16,327 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:47:16,333 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:47:24,707 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:47:24,712 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:47:28,922 - INFO - load_feeds:93 - ✅ 11 Feeds geladen +2025-08-19 10:47:28,927 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:47:28,940 - INFO - save_feeds:104 - ✅ 10 Feeds gespeichert +2025-08-19 10:47:28,941 - INFO - :116 - ❌ Feed gelöscht: Presseportal Polizei Langenfeld (https://www.presseportal.de/rss/polizei/r/Langenfeld+%28Rheinland%29.rss2) +2025-08-19 10:47:28,989 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 10:47:28,992 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:47:41,357 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:47:41,358 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 10:47:46,135 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:47:46,136 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 10:47:46,140 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-19 10:47:46,141 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 10:47:46,145 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:47:46,145 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-19 10:47:46,432 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-19 10:47:46,433 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 10:47:46,434 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-19 10:47:46,434 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-19 10:47:46,435 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-19 10:47:46,435 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-19 10:47:46,436 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-19 10:47:46,436 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-19 10:47:46,437 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-19 10:47:46,437 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-19 10:47:46,438 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-19 10:47:46,438 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-19 10:47:46,438 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-19 10:47:47,443 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-19 10:47:47,686 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-19 10:47:47,687 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 10:47:47,687 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-19 10:47:47,687 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-19 10:47:47,863 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:47,864 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:47,866 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-19 10:47:47,867 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-19 10:47:47,867 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-19 10:47:47,867 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-19 10:47:47,867 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-19 10:47:48,064 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:48,065 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:48,067 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-19 10:47:48,067 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-19 10:47:48,068 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-19 10:47:48,068 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-19 10:47:48,068 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-19 10:47:48,280 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:48,281 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:48,283 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-19 10:47:48,283 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-19 10:47:48,283 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-19 10:47:48,283 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-19 10:47:48,283 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-19 10:47:48,459 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:48,460 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:48,461 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-19 10:47:48,461 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-19 10:47:48,462 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-19 10:47:48,462 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-19 10:47:48,462 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-19 10:47:48,657 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:48,658 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:48,660 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-19 10:47:48,661 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-19 10:47:48,661 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-19 10:47:48,661 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-19 10:47:48,662 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-19 10:47:48,820 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:48,820 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:48,821 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-19 10:47:48,821 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-19 10:47:48,821 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-19 10:47:48,822 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-19 10:47:48,822 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-19 10:47:49,004 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:49,005 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:49,005 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:47:49,006 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-19 10:47:49,006 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:47:49,008 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-19 10:47:49,009 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-19 10:47:49,009 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-19 10:47:49,009 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-19 10:47:49,214 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:49,216 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:49,218 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-19 10:47:49,219 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-19 10:47:49,219 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-19 10:47:49,220 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-19 10:47:49,220 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-19 10:47:49,424 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:49,426 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:49,428 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-19 10:47:49,429 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-19 10:47:49,429 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-19 10:47:49,429 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-19 10:47:49,429 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-19 10:47:49,610 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:49,611 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:49,613 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-19 10:47:49,613 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-19 10:47:49,614 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-19 10:47:49,614 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-19 10:47:49,614 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-19 10:47:49,789 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:49,790 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:49,791 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-19 10:47:49,791 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-19 10:47:49,791 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-19 10:47:49,792 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-19 10:47:49,792 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-19 10:47:49,792 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-19 10:47:49,964 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:49,965 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:49,966 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-19 10:47:49,966 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-19 10:47:49,967 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-19 10:47:49,967 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-19 10:47:49,967 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-19 10:47:50,189 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:50,190 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:50,192 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-19 10:47:50,192 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-19 10:47:50,192 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-19 10:47:50,193 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-19 10:47:50,193 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-19 10:47:50,373 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:50,374 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:50,375 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-19 10:47:50,376 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-19 10:47:50,376 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-19 10:47:50,376 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-19 10:47:50,376 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-19 10:47:50,614 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:50,615 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:50,616 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-19 10:47:50,616 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-19 10:47:50,616 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-19 10:47:50,617 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-19 10:47:50,617 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-19 10:47:50,809 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:50,810 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:50,811 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-19 10:47:50,812 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-19 10:47:50,812 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-19 10:47:50,812 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-19 10:47:50,813 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-19 10:47:51,018 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:51,020 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:51,021 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-19 10:47:51,022 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-19 10:47:51,022 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-19 10:47:51,022 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-19 10:47:51,022 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-19 10:47:51,183 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:51,184 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:51,184 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-19 10:47:51,185 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-19 10:47:51,185 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-19 10:47:51,185 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-19 10:47:51,185 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-19 10:47:51,353 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:47:51,354 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:51,354 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:47:51,355 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-19 10:47:51,355 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:47:51,358 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-19 10:47:51,358 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-19 10:47:51,359 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-19 10:47:52,364 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-19 10:47:52,734 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-19 10:47:52,734 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 10:47:52,735 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-19 10:47:52,736 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-19 10:47:52,737 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-19 10:47:52,737 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-19 10:47:52,738 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-19 10:47:52,738 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-19 10:47:52,740 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-19 10:47:52,740 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-19 10:47:52,742 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-19 10:47:52,743 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-19 10:47:52,743 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-19 10:47:52,744 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-19 10:47:52,745 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-19 10:47:52,746 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-19 10:47:52,746 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-19 10:47:52,747 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-19 10:47:52,749 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-19 10:47:52,749 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dethleffs Reiselust-Prämie: Bis zu 20.000 Euro Rabatt auf Wohnmobile +2025-08-19 10:47:52,750 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue promobil-Newsletter - gratis!: Zum Frühstück die spannendsten Camping-Themen +2025-08-19 10:47:52,751 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Drittes Camping-Rekordjahr in Folge: Süd schlägt Nord – Hier wird am häufigsten gecampt +2025-08-19 10:47:52,751 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-19 10:47:53,756 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-19 10:47:54,012 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach camping +2025-08-19 10:47:54,012 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 10:47:54,013 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-19 10:47:54,014 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-19 10:47:54,015 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem +2025-08-19 10:47:54,016 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Inklusiver Campingurlaub am Gardasee +2025-08-19 10:47:54,016 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/153661/6094377 (Versuch 1) +2025-08-19 10:47:54,365 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:54,366 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 616 Wörter +2025-08-19 10:47:54,367 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 616 Wörter +2025-08-19 10:47:54,367 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Inklusiver Campingurlaub am Gardasee +2025-08-19 10:47:54,368 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025 +2025-08-19 10:47:54,369 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-19 10:47:54,369 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/170000/6091414 (Versuch 1) +2025-08-19 10:47:54,651 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:54,652 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 191 Wörter +2025-08-19 10:47:54,652 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 191 Wörter +2025-08-19 10:47:54,653 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-19 10:47:54,654 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt +2025-08-19 10:47:54,655 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: RTLZWEI: Erfolgreicher Montag mit "Bella Italia - Camping auf Deutsch" +2025-08-19 10:47:54,656 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-19 10:47:54,656 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-19 10:47:54,968 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:54,969 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-19 10:47:54,969 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-19 10:47:54,970 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-19 10:47:54,971 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-19 10:47:54,971 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/102577/6085137 (Versuch 1) +2025-08-19 10:47:55,258 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:55,260 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 1226 Wörter +2025-08-19 10:47:55,260 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1226 Wörter +2025-08-19 10:47:55,261 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-19 10:47:55,261 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-19 10:47:56,266 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-19 10:47:56,520 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil +2025-08-19 10:47:56,520 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 10:47:56,522 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-19 10:47:56,523 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco +2025-08-19 10:47:56,524 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall +2025-08-19 10:47:56,525 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-19 10:47:56,525 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/105254/6091837 (Versuch 1) +2025-08-19 10:47:56,793 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:56,794 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-19 10:47:56,795 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-19 10:47:56,795 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-19 10:47:57,102 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:57,103 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-19 10:47:57,103 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-19 10:47:57,104 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-19 10:47:57,105 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Trotz Camper-Hype: Der Pkw ist die unangefochtene Nummer 1 für Sommerreisen +2025-08-19 10:47:57,106 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Doppelfolge am 24. Juli "Oksana & Family - Alles auf Anfang": Abwasserprobleme, Jobsuche und Tonstudiobesuch +2025-08-19 10:47:57,108 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Oksana & Family - Alles auf Anfang": Zwischen Camping-Chaos und einer schweren Entscheidung +2025-08-19 10:47:57,108 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper +2025-08-19 10:47:57,108 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/13984/6077676 (Versuch 1) +2025-08-19 10:47:57,397 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 10:47:57,398 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 891 Wörter +2025-08-19 10:47:57,399 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 891 Wörter +2025-08-19 10:47:57,400 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper +2025-08-19 10:47:57,401 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub mit Wohnmobil: erhöhte Unfallgefahr +2025-08-19 10:47:57,401 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-19 10:47:58,406 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://caravan-news.de/rss/schlagzeilen.php +2025-08-19 10:47:58,919 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: CARAVAN-NEWS.de +2025-08-19 10:47:58,919 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://caravan-news.de/rss/schlagzeilen.php +2025-08-19 10:47:59,923 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-19 10:48:00,447 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Campingplatz +2025-08-19 10:48:00,448 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 10:48:00,448 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online +2025-08-19 10:48:00,448 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 (Versuch 1) +2025-08-19 10:48:00,609 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:00,610 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:00,610 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:00,610 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 +2025-08-19 10:48:00,613 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online +2025-08-19 10:48:00,613 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Go's und No-Go's auf dem Husumer Campingplatz - SHZ +2025-08-19 10:48:00,614 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/husum/artikel/gos-und-no-gos-auf-dem-husumer-campingplatz-49140857&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2QF6COS0JJi1OJck-Moqnc (Versuch 1) +2025-08-19 10:48:00,729 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:00,729 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:00,730 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:00,730 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/husum/artikel/gos-und-no-gos-auf-dem-husumer-campingplatz-49140857&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2QF6COS0JJi1OJck-Moqnc +2025-08-19 10:48:00,732 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Go's und No-Go's auf dem Husumer Campingplatz - SHZ +2025-08-19 10:48:00,733 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping: Grenzüberschreitung! Gäste greifen zu harten Maßnahmen - moin.de +2025-08-19 10:48:00,733 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.moin.de/norddeutschland/camping-platz-nachbarn-was-tun-voll-verrueckt-plaetze-id300643691.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3yKD6zM5C0GGtXMIRQ476n (Versuch 1) +2025-08-19 10:48:00,853 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:00,854 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:00,854 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:00,855 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.moin.de/norddeutschland/camping-platz-nachbarn-was-tun-voll-verrueckt-plaetze-id300643691.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3yKD6zM5C0GGtXMIRQ476n +2025-08-19 10:48:00,857 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping: Grenzüberschreitung! Gäste greifen zu harten Maßnahmen - moin.de +2025-08-19 10:48:00,858 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping erobert neue Zielgruppen | Trends - Counter vor9 +2025-08-19 10:48:00,858 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.countervor9.de/trends/camping-erobert-neue-zielgruppen&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw25FhwEFlV2_J6vE622fq-G (Versuch 1) +2025-08-19 10:48:00,971 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:00,972 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:00,972 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:00,972 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.countervor9.de/trends/camping-erobert-neue-zielgruppen&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw25FhwEFlV2_J6vE622fq-G +2025-08-19 10:48:00,974 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping erobert neue Zielgruppen | Trends - Counter vor9 +2025-08-19 10:48:00,975 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Liveschalte - Vom DDR-Intercamping zum modernen Campingplatz Berlin | rbb - rbb24 +2025-08-19 10:48:00,975 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rbb-online.de/der-tag/ort/schmoekwitzwerder-camping-am-krossinsee.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2DBDdZLr3yZhvUrdhKDBMZ (Versuch 1) +2025-08-19 10:48:01,093 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:01,094 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:01,094 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:01,095 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.rbb-online.de/der-tag/ort/schmoekwitzwerder-camping-am-krossinsee.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2DBDdZLr3yZhvUrdhKDBMZ +2025-08-19 10:48:01,097 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Liveschalte - Vom DDR-Intercamping zum modernen Campingplatz Berlin | rbb - rbb24 +2025-08-19 10:48:01,098 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Verträge laufen aus – Steht der Dauercampingplatz in Karlstein am Main vor dem Aus? +2025-08-19 10:48:01,098 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tvmainfranken.de/mediathek/video/vertraege-laufen-aus-steht-der-dauercampingplatz-in-karlstein-am-main-vor-dem-aus/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1DnOUC_hBM-Pi_zSeQ-Agv (Versuch 1) +2025-08-19 10:48:01,217 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:01,218 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:01,218 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:01,219 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.tvmainfranken.de/mediathek/video/vertraege-laufen-aus-steht-der-dauercampingplatz-in-karlstein-am-main-vor-dem-aus/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1DnOUC_hBM-Pi_zSeQ-Agv +2025-08-19 10:48:01,221 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Verträge laufen aus – Steht der Dauercampingplatz in Karlstein am Main vor dem Aus? +2025-08-19 10:48:01,222 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Urlaub mit Hund in Mecklenburg-Vorpommern: Hier sind Vierbeiner willkommen +2025-08-19 10:48:01,222 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/mecklenburg-vorpommern/urlaub-mit-hund-in-mv-hier-sind-vierbeiner-willkommen-BRLVGYNE2VE6JCGSNWVMQ6MQ64.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28_kG-NzvJuF08jgbQyzeZ (Versuch 1) +2025-08-19 10:48:01,335 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:01,336 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:01,336 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:01,337 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/mecklenburg-vorpommern/urlaub-mit-hund-in-mv-hier-sind-vierbeiner-willkommen-BRLVGYNE2VE6JCGSNWVMQ6MQ64.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28_kG-NzvJuF08jgbQyzeZ +2025-08-19 10:48:01,339 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub mit Hund in Mecklenburg-Vorpommern: Hier sind Vierbeiner willkommen +2025-08-19 10:48:01,339 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Deutsche auf größtem Campingplatz der Welt: „Musst du in Therapie“ - news38.de +2025-08-19 10:48:01,340 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.news38.de/panorama/promi-tv/article300594965/camping-bella-italia-rtl2-usa-fingerhuth.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1LclJVLbC4CWJ-Z13ITJAE (Versuch 1) +2025-08-19 10:48:01,470 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:01,470 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:01,471 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:01,471 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.news38.de/panorama/promi-tv/article300594965/camping-bella-italia-rtl2-usa-fingerhuth.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1LclJVLbC4CWJ-Z13ITJAE +2025-08-19 10:48:01,473 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Deutsche auf größtem Campingplatz der Welt: „Musst du in Therapie“ - news38.de +2025-08-19 10:48:01,474 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hitze mit 30 Grad und mehr: Tropensturm bringt Europa nochmal Spätsommer-Wetter +2025-08-19 10:48:01,474 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/hitze-mit-30-grad-und-mehr-tropensturm-bringt-europa-nochmal-spaetsommer-wetter-zr-93887738.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw04IwICepfw_rAkj4MdEEpf (Versuch 1) +2025-08-19 10:48:01,594 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:01,594 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:01,595 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:01,595 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/hitze-mit-30-grad-und-mehr-tropensturm-bringt-europa-nochmal-spaetsommer-wetter-zr-93887738.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw04IwICepfw_rAkj4MdEEpf +2025-08-19 10:48:01,597 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hitze mit 30 Grad und mehr: Tropensturm bringt Europa nochmal Spätsommer-Wetter +2025-08-19 10:48:01,598 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Urlaub vor der Haustür: Warum der Innenhof des Zschopauer Seniorenzentrums für zwei ... +2025-08-19 10:48:01,598 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.freiepresse.de/erzgebirge/zschopau/urlaub-vor-der-haustuer-warum-der-innenhof-des-zschopauer-seniorenzentrums-fuer-zwei-tage-zum-campingplatz-wurde-artikel13923271&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw18Q6crLrGxT2s5ouNzshac (Versuch 1) +2025-08-19 10:48:01,753 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:01,753 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:01,754 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:01,754 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.freiepresse.de/erzgebirge/zschopau/urlaub-vor-der-haustuer-warum-der-innenhof-des-zschopauer-seniorenzentrums-fuer-zwei-tage-zum-campingplatz-wurde-artikel13923271&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw18Q6crLrGxT2s5ouNzshac +2025-08-19 10:48:01,757 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub vor der Haustür: Warum der Innenhof des Zschopauer Seniorenzentrums für zwei ... +2025-08-19 10:48:01,757 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 10:48:01,758 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO (Versuch 1) +2025-08-19 10:48:01,877 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:01,878 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:01,878 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:01,878 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO +2025-08-19 10:48:01,881 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 10:48:01,882 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Surfer (85) am Chiemsee verschwunden: Großanlegte Suchaktion auch am Montag - Rosenheim24 +2025-08-19 10:48:01,882 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rosenheim24.de/rosenheim/polizeimeldungen/uebersee-polizei-und-wasserwacht-suchen-vermissten-surfer-am-chiemsee-bis-dato-ohne-erfolg-93887306.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2w_irRYdoJKzLR0X84Ad8e (Versuch 1) +2025-08-19 10:48:01,995 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:01,996 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:01,996 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:01,997 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.rosenheim24.de/rosenheim/polizeimeldungen/uebersee-polizei-und-wasserwacht-suchen-vermissten-surfer-am-chiemsee-bis-dato-ohne-erfolg-93887306.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2w_irRYdoJKzLR0X84Ad8e +2025-08-19 10:48:01,999 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Surfer (85) am Chiemsee verschwunden: Großanlegte Suchaktion auch am Montag - Rosenheim24 +2025-08-19 10:48:02,000 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Toter 13-Jähriger: Ermittler gehen von Unfall aus - DieSachsen.de +2025-08-19 10:48:02,000 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.diesachsen.de/unfall-und-verkehr/toter-13-jaehriger-ermittler-gehen-von-unfall-aus-3045700&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2lqwMLXlVEe-Tds0lRaXMi (Versuch 1) +2025-08-19 10:48:02,114 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:02,114 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:02,115 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:02,115 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.diesachsen.de/unfall-und-verkehr/toter-13-jaehriger-ermittler-gehen-von-unfall-aus-3045700&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2lqwMLXlVEe-Tds0lRaXMi +2025-08-19 10:48:02,117 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Toter 13-Jähriger: Ermittler gehen von Unfall aus - DieSachsen.de +2025-08-19 10:48:02,118 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Angriff mit Yoga-Matten: Mutter mit zwei Kindern auf Campingplatz Langlau in Not +2025-08-19 10:48:02,118 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/gunzenhausen/angriff-mit-yoga-matten-mutter-mit-zwei-kindern-auf-campingplatz-langlau-in-not-1.14800747&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ugUpG1IfTlR1FCFcgsHvG (Versuch 1) +2025-08-19 10:48:02,235 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:02,235 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:02,236 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:02,236 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/gunzenhausen/angriff-mit-yoga-matten-mutter-mit-zwei-kindern-auf-campingplatz-langlau-in-not-1.14800747&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ugUpG1IfTlR1FCFcgsHvG +2025-08-19 10:48:02,238 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Angriff mit Yoga-Matten: Mutter mit zwei Kindern auf Campingplatz Langlau in Not +2025-08-19 10:48:02,239 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Übersee: 85-jähriger Surfer wird auf dem Chiemsee vermisst - Traunsteiner Tagblatt +2025-08-19 10:48:02,239 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.traunsteiner-tagblatt.de/region/landkreis-traunstein/uebersee_artikel,-85jaehriger-surfer-wird-auf-dem-chiemsee-vermisst-_arid,952723.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0dJa3tuybPxYdMYo3oV320 (Versuch 1) +2025-08-19 10:48:02,357 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:02,357 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:02,358 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:02,358 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.traunsteiner-tagblatt.de/region/landkreis-traunstein/uebersee_artikel,-85jaehriger-surfer-wird-auf-dem-chiemsee-vermisst-_arid,952723.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0dJa3tuybPxYdMYo3oV320 +2025-08-19 10:48:02,360 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Übersee: 85-jähriger Surfer wird auf dem Chiemsee vermisst - Traunsteiner Tagblatt +2025-08-19 10:48:02,361 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Weinsberg CaraTour 600 ME im Test: Abenteuer auf vier Rädern? - IMTEST +2025-08-19 10:48:02,361 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.imtest.de/mobilitaet-reise/weinsberg-caratour-600-me-camping-van-kompakt-kastenwagen-test-ziemlich/424550&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3y4Gx77nyLDlu4T5QBAh_- (Versuch 1) +2025-08-19 10:48:02,476 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:02,477 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:02,477 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:02,477 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.imtest.de/mobilitaet-reise/weinsberg-caratour-600-me-camping-van-kompakt-kastenwagen-test-ziemlich/424550&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3y4Gx77nyLDlu4T5QBAh_- +2025-08-19 10:48:02,480 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Weinsberg CaraTour 600 ME im Test: Abenteuer auf vier Rädern? - IMTEST +2025-08-19 10:48:02,481 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: An Weilburger Tankstelle fliegen die Fäuste - Echo Online +2025-08-19 10:48:02,481 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/kreis-limburg-weilburg/weilburg/an-weilburger-tankstelle-fliegen-die-faeuste-4892024&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l7jUxG7664vJ69cHwv20M (Versuch 1) +2025-08-19 10:48:02,601 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:02,602 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:02,602 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:02,603 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/kreis-limburg-weilburg/weilburg/an-weilburger-tankstelle-fliegen-die-faeuste-4892024&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l7jUxG7664vJ69cHwv20M +2025-08-19 10:48:02,605 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: An Weilburger Tankstelle fliegen die Fäuste - Echo Online +2025-08-19 10:48:02,606 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Ein spannendes Wochenende für kleine Abenteurer - BLICK aktuell +2025-08-19 10:48:02,606 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.blick-aktuell.de/Termine/Ein-spannendes-Wochenende-fuer-kleine-Abenteurer--636547.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0kVA76weLMICuiplUm9G5M (Versuch 1) +2025-08-19 10:48:02,734 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:02,735 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:02,735 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:02,735 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.blick-aktuell.de/Termine/Ein-spannendes-Wochenende-fuer-kleine-Abenteurer--636547.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0kVA76weLMICuiplUm9G5M +2025-08-19 10:48:02,737 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Ein spannendes Wochenende für kleine Abenteurer - BLICK aktuell +2025-08-19 10:48:02,738 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Woran ein Campingplatz-Experte des ADAC deutsche Urlauber direkt erkennt +2025-08-19 10:48:02,738 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.lauterbacher-anzeiger.de/panorama/woran-ein-campingplatz-experte-des-adac-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw14jziy82R0xboz7sPEvmaR (Versuch 1) +2025-08-19 10:48:02,853 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:02,853 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:02,853 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:02,854 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.lauterbacher-anzeiger.de/panorama/woran-ein-campingplatz-experte-des-adac-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw14jziy82R0xboz7sPEvmaR +2025-08-19 10:48:02,855 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Woran ein Campingplatz-Experte des ADAC deutsche Urlauber direkt erkennt +2025-08-19 10:48:02,855 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vermisster Junge bei Lohsa: Obduktion des toten 13-Jährigen abgeschlossen | Lausitzer Rundschau +2025-08-19 10:48:02,855 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.lr-online.de/lausitz/hoyerswerda/vermisster-junge-bei-lohsa-obduktion-des-toten-13-jaehrigen-abgeschlossen-78252705.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bCvU4jnneGEZTl3uf48qo (Versuch 1) +2025-08-19 10:48:02,995 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:02,996 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:02,996 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:02,996 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.lr-online.de/lausitz/hoyerswerda/vermisster-junge-bei-lohsa-obduktion-des-toten-13-jaehrigen-abgeschlossen-78252705.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bCvU4jnneGEZTl3uf48qo +2025-08-19 10:48:02,997 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vermisster Junge bei Lohsa: Obduktion des toten 13-Jährigen abgeschlossen | Lausitzer Rundschau +2025-08-19 10:48:02,997 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-19 10:48:03,999 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-19 10:48:04,574 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Vanlife +2025-08-19 10:48:04,574 - INFO - fetch_and_process_feed:187 - 📰 3 Einträge gefunden +2025-08-19 10:48:04,575 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Jeep Cherokee als Camper – der einfache Weg zum autarken Urlaub - vanlifemag.de +2025-08-19 10:48:04,575 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/jeep-cherokee-als-camper/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0A-3nq90dUx96JAA9j2VYX (Versuch 1) +2025-08-19 10:48:04,695 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:04,696 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:04,696 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:04,696 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/jeep-cherokee-als-camper/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0A-3nq90dUx96JAA9j2VYX +2025-08-19 10:48:04,699 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Jeep Cherokee als Camper – der einfache Weg zum autarken Urlaub - vanlifemag.de +2025-08-19 10:48:04,700 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: RC-1 SEMA Build: Ein Show-Camper setzt neue Maßstäbe - vanlifemag.de +2025-08-19 10:48:04,700 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/rc-1-sema-build-ein-show-camper-setzt-neue-massstaebe/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0gYNfiVFof8MRF16Pp8QEt (Versuch 1) +2025-08-19 10:48:04,817 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:04,818 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:04,818 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:04,818 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/rc-1-sema-build-ein-show-camper-setzt-neue-massstaebe/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0gYNfiVFof8MRF16Pp8QEt +2025-08-19 10:48:04,821 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: RC-1 SEMA Build: Ein Show-Camper setzt neue Maßstäbe - vanlifemag.de +2025-08-19 10:48:04,821 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und +2025-08-19 10:48:04,822 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee (Versuch 1) +2025-08-19 10:48:04,950 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:04,950 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:04,951 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:04,951 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee +2025-08-19 10:48:04,953 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und +2025-08-19 10:48:04,954 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-19 10:48:05,956 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-19 10:48:06,521 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Camping Termine 2024 +2025-08-19 10:48:06,522 - INFO - fetch_and_process_feed:187 - 📰 3 Einträge gefunden +2025-08-19 10:48:06,522 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: San Hejmo Festival 2026: Datum, Line-up, Neuheiten, Fotos - Düsseldorf Tonight +2025-08-19 10:48:06,523 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tonight.de/freizeit/san-hejmo-festival-2026-datum-line-up-neuheiten-fotos_150121.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw1oblZYw0b618LHsaVJWsDI (Versuch 1) +2025-08-19 10:48:06,643 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:06,643 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:06,644 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:06,644 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.tonight.de/freizeit/san-hejmo-festival-2026-datum-line-up-neuheiten-fotos_150121.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw1oblZYw0b618LHsaVJWsDI +2025-08-19 10:48:06,646 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: San Hejmo Festival 2026: Datum, Line-up, Neuheiten, Fotos - Düsseldorf Tonight +2025-08-19 10:48:06,647 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Familie Ochsenknecht: Camping-Urlaub mit Jimi Blue | GALA.de +2025-08-19 10:48:06,648 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.gala.de/stars/news/familie-ochsenknecht--camping-urlaub-mit-jimi-blue-24437026.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2sgq15V-Z-mJUEaEvTyAdQ (Versuch 1) +2025-08-19 10:48:06,763 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:06,764 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:06,764 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:06,764 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.gala.de/stars/news/familie-ochsenknecht--camping-urlaub-mit-jimi-blue-24437026.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2sgq15V-Z-mJUEaEvTyAdQ +2025-08-19 10:48:06,767 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Familie Ochsenknecht: Camping-Urlaub mit Jimi Blue | GALA.de +2025-08-19 10:48:06,768 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Echo Open Air 2025 in Mindelheim (Westernach): Termin, Line-Up, Tickets, Bezahlung, Camping ... +2025-08-19 10:48:06,768 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.augsburger-allgemeine.de/mindelheim/echo-open-air-2025-mindelheim-westernach-am-wochenende-line-up-tickets-parken-camping-110529337&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2QZff-JniMKd0gb3ZzaRQ0 (Versuch 1) +2025-08-19 10:48:06,890 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:06,890 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:06,891 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:06,891 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.augsburger-allgemeine.de/mindelheim/echo-open-air-2025-mindelheim-westernach-am-wochenende-line-up-tickets-parken-camping-110529337&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw2QZff-JniMKd0gb3ZzaRQ0 +2025-08-19 10:48:06,894 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Echo Open Air 2025 in Mindelheim (Westernach): Termin, Line-Up, Tickets, Bezahlung, Camping ... +2025-08-19 10:48:06,894 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-19 10:48:07,898 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-19 10:48:08,472 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert - Camping Messe 2025 +2025-08-19 10:48:08,472 - INFO - fetch_and_process_feed:187 - 📰 6 Einträge gefunden +2025-08-19 10:48:08,473 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 10:48:08,473 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO (Versuch 1) +2025-08-19 10:48:08,592 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:08,593 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:08,594 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:08,594 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO +2025-08-19 10:48:08,596 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 10:48:08,597 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gamescom 2025: Aston Martin im Zenless Zone Zero-Design - Autozeitung +2025-08-19 10:48:08,598 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/gamescom-2025-messe-highlights-fuer-autofans-209057.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0FXrDgBBR2LkRWJXcWhY_P (Versuch 1) +2025-08-19 10:48:08,743 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:08,744 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:08,744 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:08,744 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/gamescom-2025-messe-highlights-fuer-autofans-209057.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0FXrDgBBR2LkRWJXcWhY_P +2025-08-19 10:48:08,747 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gamescom 2025: Aston Martin im Zenless Zone Zero-Design - Autozeitung +2025-08-19 10:48:08,748 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Caravan Salon und Ed Sheeran zeitgleich: Droht ein Verkehrskollaps? | Regional - BILD.de +2025-08-19 10:48:08,748 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.bild.de/regional/duesseldorf/caravan-salon-und-ed-sheeran-zeitgleich-droht-ein-verkehrskollaps-689c5654149faf081095d6cc&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1SRpJIm3W_DbR7mUVWZ4WS (Versuch 1) +2025-08-19 10:48:08,862 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:08,862 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:08,862 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:08,862 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.bild.de/regional/duesseldorf/caravan-salon-und-ed-sheeran-zeitgleich-droht-ein-verkehrskollaps-689c5654149faf081095d6cc&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1SRpJIm3W_DbR7mUVWZ4WS +2025-08-19 10:48:08,864 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Caravan Salon und Ed Sheeran zeitgleich: Droht ein Verkehrskollaps? | Regional - BILD.de +2025-08-19 10:48:08,865 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Neu bei Steam: Die gamescom 2025 wirft ihren Schatten voraus - GameStar +2025-08-19 10:48:08,865 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.gamestar.de/artikel/neu-bei-steam,3437937.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2sHEDYfSnIyZwh9_ssIU_y (Versuch 1) +2025-08-19 10:48:08,981 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:08,981 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:08,982 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:08,982 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.gamestar.de/artikel/neu-bei-steam,3437937.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2sHEDYfSnIyZwh9_ssIU_y +2025-08-19 10:48:08,985 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neu bei Steam: Die gamescom 2025 wirft ihren Schatten voraus - GameStar +2025-08-19 10:48:08,986 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und +2025-08-19 10:48:08,986 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee (Versuch 1) +2025-08-19 10:48:09,104 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:09,105 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:09,105 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:09,106 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.presseportal.de/pm/179965/6098434&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2Lv2GimqzrQfgtJIY7asee +2025-08-19 10:48:09,108 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Festival-Flair, Fachwissen und Musik – das bietet das Rahmenprogramm der CARAVAN und +2025-08-19 10:48:09,109 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: MEORGA MSR-Spezialmesse in Ludwigshafen - klamm.de +2025-08-19 10:48:09,110 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.klamm.de/news/meorga-msr-spezialmesse-in-ludwigshafen-4N1254481.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11VrqOODIm34SfZyc87aDJ (Versuch 1) +2025-08-19 10:48:09,230 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 10:48:09,230 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 10:48:09,231 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 10:48:09,231 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.klamm.de/news/meorga-msr-spezialmesse-in-ludwigshafen-4N1254481.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11VrqOODIm34SfZyc87aDJ +2025-08-19 10:48:09,233 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: MEORGA MSR-Spezialmesse in Ludwigshafen - klamm.de +2025-08-19 10:48:09,233 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-19 10:48:10,234 - INFO - process_articles:312 - ℹ️ Keine neuen Artikel gefunden +2025-08-19 10:48:11,323 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 10:48:11,323 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:11:25,473 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 20:11:25,474 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:15:53,507 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 20:15:53,508 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:16:08,327 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 20:16:08,328 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:16:08,333 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-19 20:16:08,334 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:16:08,340 - INFO - load_articles:124 - ✅ 120 Artikel geladen +2025-08-19 20:16:08,340 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-19 20:16:09,007 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-19 20:16:09,007 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 20:16:09,008 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-19 20:16:09,009 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-19 20:16:09,010 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-19 20:16:09,010 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-19 20:16:09,011 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-19 20:16:09,011 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-19 20:16:09,012 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-19 20:16:09,012 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-19 20:16:09,013 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-19 20:16:09,013 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-19 20:16:09,013 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-19 20:16:10,018 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-19 20:16:10,812 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-19 20:16:10,812 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 20:16:10,813 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-19 20:16:10,813 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-19 20:16:11,348 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:11,350 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:11,351 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-19 20:16:11,352 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-19 20:16:11,352 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-19 20:16:11,352 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-19 20:16:11,352 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-19 20:16:12,024 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:12,026 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:12,027 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-19 20:16:12,028 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-19 20:16:12,028 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-19 20:16:12,028 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-19 20:16:12,029 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-19 20:16:12,619 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:12,621 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:12,622 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-19 20:16:12,622 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-19 20:16:12,623 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-19 20:16:12,623 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-19 20:16:12,623 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-19 20:16:13,162 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:13,164 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:13,164 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-19 20:16:13,165 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-19 20:16:13,165 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-19 20:16:13,165 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-19 20:16:13,165 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-19 20:16:13,811 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:13,812 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:13,815 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-19 20:16:13,815 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-19 20:16:13,816 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-19 20:16:13,816 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-19 20:16:13,816 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-19 20:16:14,585 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:14,592 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:14,592 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-19 20:16:14,593 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-19 20:16:14,594 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-19 20:16:14,594 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-19 20:16:14,594 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-19 20:16:16,206 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:16,208 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:16,208 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:16,209 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-19 20:16:16,209 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:16,212 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-19 20:16:16,212 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-19 20:16:16,213 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-19 20:16:16,213 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-19 20:16:16,824 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:16,825 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:16,828 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-19 20:16:16,828 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-19 20:16:16,828 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-19 20:16:16,829 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-19 20:16:16,829 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-19 20:16:17,589 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:17,591 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:17,592 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-19 20:16:17,592 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-19 20:16:17,593 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-19 20:16:17,593 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-19 20:16:17,593 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-19 20:16:18,185 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:18,187 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:18,189 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-19 20:16:18,189 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-19 20:16:18,190 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-19 20:16:18,190 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-19 20:16:18,190 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-19 20:16:20,607 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:20,608 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:20,609 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-19 20:16:20,610 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-19 20:16:20,610 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-19 20:16:20,610 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-19 20:16:20,611 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-19 20:16:20,611 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-19 20:16:21,540 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:21,541 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:21,541 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-19 20:16:21,541 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-19 20:16:21,542 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-19 20:16:21,542 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-19 20:16:21,542 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-19 20:16:22,632 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:22,634 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:22,634 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-19 20:16:22,635 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-19 20:16:22,635 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-19 20:16:22,635 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-19 20:16:22,635 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-19 20:16:24,007 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:24,008 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:24,009 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-19 20:16:24,010 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-19 20:16:24,010 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-19 20:16:24,010 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-19 20:16:24,010 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-19 20:16:25,160 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:25,162 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:25,163 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-19 20:16:25,163 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-19 20:16:25,164 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-19 20:16:25,164 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-19 20:16:25,164 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-19 20:16:26,436 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:26,438 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:26,439 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-19 20:16:26,439 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-19 20:16:26,440 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-19 20:16:26,440 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-19 20:16:26,440 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-19 20:16:28,093 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:28,094 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:28,095 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-19 20:16:28,095 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-19 20:16:28,095 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-19 20:16:28,096 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-19 20:16:28,096 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-19 20:16:29,390 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:29,391 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:29,392 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-19 20:16:29,392 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-19 20:16:29,392 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-19 20:16:29,393 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-19 20:16:29,393 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-19 20:16:30,593 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:30,594 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:30,595 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:30,595 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-19 20:16:30,596 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:30,599 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-19 20:16:30,599 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-19 20:16:30,599 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-19 20:16:31,605 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-19 20:16:32,631 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-19 20:16:32,631 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 20:16:32,632 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-19 20:16:32,633 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-19 20:16:32,634 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-19 20:16:32,635 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-19 20:16:32,635 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-19 20:16:32,636 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-19 20:16:32,644 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-19 20:16:32,644 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-19 20:16:32,645 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-19 20:16:32,646 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-19 20:16:32,647 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-19 20:16:32,647 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-19 20:16:32,648 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-19 20:16:32,649 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-19 20:16:32,649 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-19 20:16:32,650 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-19 20:16:32,652 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-19 20:16:32,653 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dethleffs Reiselust-Prämie: Bis zu 20.000 Euro Rabatt auf Wohnmobile +2025-08-19 20:16:32,653 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue promobil-Newsletter - gratis!: Zum Frühstück die spannendsten Camping-Themen +2025-08-19 20:16:32,654 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Drittes Camping-Rekordjahr in Folge: Süd schlägt Nord – Hier wird am häufigsten gecampt +2025-08-19 20:16:32,654 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-19 20:16:33,659 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-19 20:16:34,380 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach camping +2025-08-19 20:16:34,380 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 20:16:34,382 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-19 20:16:34,384 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-19 20:16:34,385 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem +2025-08-19 20:16:34,385 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Inklusiver Campingurlaub am Gardasee +2025-08-19 20:16:34,385 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/153661/6094377 (Versuch 1) +2025-08-19 20:16:35,040 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:35,041 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 616 Wörter +2025-08-19 20:16:35,041 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 616 Wörter +2025-08-19 20:16:35,041 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Inklusiver Campingurlaub am Gardasee +2025-08-19 20:16:35,042 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025 +2025-08-19 20:16:35,042 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-19 20:16:35,042 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/170000/6091414 (Versuch 1) +2025-08-19 20:16:35,671 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:35,671 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 191 Wörter +2025-08-19 20:16:35,672 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 191 Wörter +2025-08-19 20:16:35,672 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-19 20:16:35,673 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt +2025-08-19 20:16:35,674 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: RTLZWEI: Erfolgreicher Montag mit "Bella Italia - Camping auf Deutsch" +2025-08-19 20:16:35,675 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-19 20:16:35,675 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-19 20:16:36,793 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:36,794 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-19 20:16:36,795 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-19 20:16:36,796 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-19 20:16:36,796 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-19 20:16:36,796 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/102577/6085137 (Versuch 1) +2025-08-19 20:16:38,021 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:38,022 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 1226 Wörter +2025-08-19 20:16:38,022 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1226 Wörter +2025-08-19 20:16:38,023 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-19 20:16:38,023 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-19 20:16:39,028 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-19 20:16:39,558 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil +2025-08-19 20:16:39,558 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-19 20:16:39,560 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/63400/6099613 +2025-08-19 20:16:40,137 - INFO - extract_images_with_metadata:167 - 🔍 7 img-Tags gefunden +2025-08-19 20:16:40,138 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: R+V Infocenter... +2025-08-19 20:16:40,138 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.presseportal.de/pm/63400/6099613: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-19 20:16:40,139 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Akku leer: Gefahren beim Laden von E-Bikes' extrahiert +2025-08-19 20:16:40,139 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Akku leer: Gefahren beim Laden von E-Bikes +2025-08-19 20:16:40,140 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-19 20:16:40,141 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco +2025-08-19 20:16:40,142 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall +2025-08-19 20:16:40,143 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-19 20:16:40,143 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/105254/6091837 (Versuch 1) +2025-08-19 20:16:40,747 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:40,749 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-19 20:16:40,749 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-19 20:16:40,749 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-19 20:16:41,370 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:41,372 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-19 20:16:41,372 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-19 20:16:41,373 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-19 20:16:41,374 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Trotz Camper-Hype: Der Pkw ist die unangefochtene Nummer 1 für Sommerreisen +2025-08-19 20:16:41,375 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Doppelfolge am 24. Juli "Oksana & Family - Alles auf Anfang": Abwasserprobleme, Jobsuche und Tonstudiobesuch +2025-08-19 20:16:41,376 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Oksana & Family - Alles auf Anfang": Zwischen Camping-Chaos und einer schweren Entscheidung +2025-08-19 20:16:41,376 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper +2025-08-19 20:16:41,376 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/13984/6077676 (Versuch 1) +2025-08-19 20:16:41,930 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-19 20:16:41,931 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 891 Wörter +2025-08-19 20:16:41,932 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 891 Wörter +2025-08-19 20:16:41,933 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper +2025-08-19 20:16:41,933 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-19 20:16:42,938 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://caravan-news.de/rss/schlagzeilen.php +2025-08-19 20:16:43,694 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: CARAVAN-NEWS.de +2025-08-19 20:16:43,694 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://caravan-news.de/rss/schlagzeilen.php +2025-08-19 20:16:44,700 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-19 20:16:46,176 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Campingplatz +2025-08-19 20:16:46,176 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-19 20:16:46,176 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Winterthur: Campingplatz Schützenweiher kommt an die Urne - Tages-Anzeiger +2025-08-19 20:16:46,176 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tagesanzeiger.ch/winterthur-campingplatz-schuetzenweiher-kommt-an-die-urne-637538306386&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0agfyAxzRqVvd3uX5bhaA- (Versuch 1) +2025-08-19 20:16:46,787 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:46,787 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:46,787 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:46,788 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.tagesanzeiger.ch/winterthur-campingplatz-schuetzenweiher-kommt-an-die-urne-637538306386&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0agfyAxzRqVvd3uX5bhaA- +2025-08-19 20:16:46,789 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tagesanzeiger.ch/winterthur-campingplatz-schuetzenweiher-kommt-an-die-urne-637538306386&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0agfyAxzRqVvd3uX5bhaA- +2025-08-19 20:16:47,258 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:47,259 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.tagesanzeiger.ch/winterthur-campingplatz-schuetzenweiher-kommt-an-die-urne-637538306386&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0agfyAxzRqVvd3uX5bhaA- +2025-08-19 20:16:47,259 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Winterthur: Campingplatz Schützenweiher kommt an die Urne - Tages-Anzeiger' extrahiert +2025-08-19 20:16:47,259 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Winterthur: Campingplatz Schützenweiher kommt an die Urne - Tages-Anzeiger +2025-08-19 20:16:47,260 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail +2025-08-19 20:16:47,260 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 (Versuch 1) +2025-08-19 20:16:47,678 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:47,679 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:47,679 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:47,679 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 +2025-08-19 20:16:47,680 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 +2025-08-19 20:16:48,151 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:48,151 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 +2025-08-19 20:16:48,152 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail' extrahiert +2025-08-19 20:16:48,152 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail +2025-08-19 20:16:48,152 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Woran ein Campingplatz-Experte deutsche Urlauber sofort erkennt +2025-08-19 20:16:48,153 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-sofort-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bjSwJduCIDU44lYDuu22U (Versuch 1) +2025-08-19 20:16:48,589 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:48,590 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:48,590 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:48,591 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-sofort-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bjSwJduCIDU44lYDuu22U +2025-08-19 20:16:48,593 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-sofort-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bjSwJduCIDU44lYDuu22U +2025-08-19 20:16:49,108 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:49,108 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-sofort-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bjSwJduCIDU44lYDuu22U +2025-08-19 20:16:49,109 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Woran ein Campingplatz-Experte deutsche Urlauber sofort erkennt' extrahiert +2025-08-19 20:16:49,109 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Woran ein Campingplatz-Experte deutsche Urlauber sofort erkennt +2025-08-19 20:16:49,110 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: WTG-Insolvenz in Hooksiel: Investor für Campingplatz und Hallenbad gefunden +2025-08-19 20:16:49,110 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nwzonline.de/friesland/wtg-insolvenz-in-hooksiel-investor-fuer-campingplatz-und-hallenbad-gefunden_a_4,2,1744055285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2NSatmqIKkGVEo26UyQfCS (Versuch 1) +2025-08-19 20:16:49,478 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:49,479 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:49,479 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:49,479 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nwzonline.de/friesland/wtg-insolvenz-in-hooksiel-investor-fuer-campingplatz-und-hallenbad-gefunden_a_4,2,1744055285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2NSatmqIKkGVEo26UyQfCS +2025-08-19 20:16:49,481 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nwzonline.de/friesland/wtg-insolvenz-in-hooksiel-investor-fuer-campingplatz-und-hallenbad-gefunden_a_4,2,1744055285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2NSatmqIKkGVEo26UyQfCS +2025-08-19 20:16:49,957 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:49,957 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.nwzonline.de/friesland/wtg-insolvenz-in-hooksiel-investor-fuer-campingplatz-und-hallenbad-gefunden_a_4,2,1744055285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2NSatmqIKkGVEo26UyQfCS +2025-08-19 20:16:49,958 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'WTG-Insolvenz in Hooksiel: Investor für Campingplatz und Hallenbad gefunden' extrahiert +2025-08-19 20:16:49,958 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: WTG-Insolvenz in Hooksiel: Investor für Campingplatz und Hallenbad gefunden +2025-08-19 20:16:49,959 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Nach Krisentreffen in Karlstein: Mögliche Rettung für die Dauercamper am Großwelzheimer Weißsee +2025-08-19 20:16:49,959 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.main-echo.de/region/stadt-kreis-aschaffenburg/nach-dem-krisentreffen-in-karlstein-moegliche-rettung-fuer-die-dauercamper-art-8562505&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0F7beKEClnDEQsNAUMuWIr (Versuch 1) +2025-08-19 20:16:50,397 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:50,398 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:50,398 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:50,399 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.main-echo.de/region/stadt-kreis-aschaffenburg/nach-dem-krisentreffen-in-karlstein-moegliche-rettung-fuer-die-dauercamper-art-8562505&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0F7beKEClnDEQsNAUMuWIr +2025-08-19 20:16:50,402 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.main-echo.de/region/stadt-kreis-aschaffenburg/nach-dem-krisentreffen-in-karlstein-moegliche-rettung-fuer-die-dauercamper-art-8562505&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0F7beKEClnDEQsNAUMuWIr +2025-08-19 20:16:50,852 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:50,853 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.main-echo.de/region/stadt-kreis-aschaffenburg/nach-dem-krisentreffen-in-karlstein-moegliche-rettung-fuer-die-dauercamper-art-8562505&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0F7beKEClnDEQsNAUMuWIr +2025-08-19 20:16:50,853 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Nach Krisentreffen in Karlstein: Mögliche Rettung für die Dauercamper am Großwelzheimer Weißsee' extrahiert +2025-08-19 20:16:50,853 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Nach Krisentreffen in Karlstein: Mögliche Rettung für die Dauercamper am Großwelzheimer Weißsee +2025-08-19 20:16:50,854 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sassari: Polizei greift bei illegalem Camping zwischen Lake Baratz und Porto Ferro ein. +2025-08-19 20:16:50,854 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.unionesarda.it/de/sardinien/sassari-polizei-greift-bei-illegalem-camping-zwischen-lake-baratz-und-porto-ferro-ein-gb90frrb&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2uUKNIFkm1Rvv58CAVg2_U (Versuch 1) +2025-08-19 20:16:51,282 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:51,283 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:51,283 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:51,283 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.unionesarda.it/de/sardinien/sassari-polizei-greift-bei-illegalem-camping-zwischen-lake-baratz-und-porto-ferro-ein-gb90frrb&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2uUKNIFkm1Rvv58CAVg2_U +2025-08-19 20:16:51,287 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.unionesarda.it/de/sardinien/sassari-polizei-greift-bei-illegalem-camping-zwischen-lake-baratz-und-porto-ferro-ein-gb90frrb&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2uUKNIFkm1Rvv58CAVg2_U +2025-08-19 20:16:51,750 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:51,751 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.unionesarda.it/de/sardinien/sassari-polizei-greift-bei-illegalem-camping-zwischen-lake-baratz-und-porto-ferro-ein-gb90frrb&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2uUKNIFkm1Rvv58CAVg2_U +2025-08-19 20:16:51,751 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sassari: Polizei greift bei illegalem Camping zwischen Lake Baratz und Porto Ferro ein.' extrahiert +2025-08-19 20:16:51,751 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sassari: Polizei greift bei illegalem Camping zwischen Lake Baratz und Porto Ferro ein. +2025-08-19 20:16:51,752 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping am See in Brandenburg – 5 besonders schöne Plätze +2025-08-19 20:16:51,752 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.bz-berlin.de/ratgeber/camping-in-brandenburg-am-see&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28Yp1DHAiG7pUNIJF_tLkC (Versuch 1) +2025-08-19 20:16:52,175 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:52,176 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:52,177 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:52,177 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.bz-berlin.de/ratgeber/camping-in-brandenburg-am-see&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28Yp1DHAiG7pUNIJF_tLkC +2025-08-19 20:16:52,179 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.bz-berlin.de/ratgeber/camping-in-brandenburg-am-see&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28Yp1DHAiG7pUNIJF_tLkC +2025-08-19 20:16:52,653 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:52,654 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.bz-berlin.de/ratgeber/camping-in-brandenburg-am-see&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28Yp1DHAiG7pUNIJF_tLkC +2025-08-19 20:16:52,654 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Camping am See in Brandenburg – 5 besonders schöne Plätze' extrahiert +2025-08-19 20:16:52,655 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Camping am See in Brandenburg – 5 besonders schöne Plätze +2025-08-19 20:16:52,655 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Lost Place im Odenwald: Verlassener Campingplatz lockt Menschen an - Echo Online +2025-08-19 20:16:52,655 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/odenwaldkreis/oberzent-odenwaldkreis/lost-place-odenwald-verlassener-campingplatz-muellkippe-forum-oberzent-4805851&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39nSnV29WHn7ytbY8s4wkI (Versuch 1) +2025-08-19 20:16:53,075 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:53,076 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:53,077 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:53,077 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/odenwaldkreis/oberzent-odenwaldkreis/lost-place-odenwald-verlassener-campingplatz-muellkippe-forum-oberzent-4805851&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39nSnV29WHn7ytbY8s4wkI +2025-08-19 20:16:53,079 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/odenwaldkreis/oberzent-odenwaldkreis/lost-place-odenwald-verlassener-campingplatz-muellkippe-forum-oberzent-4805851&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39nSnV29WHn7ytbY8s4wkI +2025-08-19 20:16:53,551 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:53,552 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/odenwaldkreis/oberzent-odenwaldkreis/lost-place-odenwald-verlassener-campingplatz-muellkippe-forum-oberzent-4805851&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39nSnV29WHn7ytbY8s4wkI +2025-08-19 20:16:53,552 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Lost Place im Odenwald: Verlassener Campingplatz lockt Menschen an - Echo Online' extrahiert +2025-08-19 20:16:53,553 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Lost Place im Odenwald: Verlassener Campingplatz lockt Menschen an - Echo Online +2025-08-19 20:16:53,553 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sachsens Campingplätze: Hier können Naturliebhaber Urlaub machen +2025-08-19 20:16:53,553 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.saechsische.de/sachsen/sachsens-campingplaetze-hier-koennen-naturliebhaber-urlaub-machen-LISYQBT5XRCHDEHUZUU66IKT7Y.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3LZG2TbqgyYMDOING19TpS (Versuch 1) +2025-08-19 20:16:53,982 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:53,983 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:53,983 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:53,983 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.saechsische.de/sachsen/sachsens-campingplaetze-hier-koennen-naturliebhaber-urlaub-machen-LISYQBT5XRCHDEHUZUU66IKT7Y.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3LZG2TbqgyYMDOING19TpS +2025-08-19 20:16:53,984 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.saechsische.de/sachsen/sachsens-campingplaetze-hier-koennen-naturliebhaber-urlaub-machen-LISYQBT5XRCHDEHUZUU66IKT7Y.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3LZG2TbqgyYMDOING19TpS +2025-08-19 20:16:54,450 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:54,450 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.saechsische.de/sachsen/sachsens-campingplaetze-hier-koennen-naturliebhaber-urlaub-machen-LISYQBT5XRCHDEHUZUU66IKT7Y.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3LZG2TbqgyYMDOING19TpS +2025-08-19 20:16:54,451 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sachsens Campingplätze: Hier können Naturliebhaber Urlaub machen' extrahiert +2025-08-19 20:16:54,451 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sachsens Campingplätze: Hier können Naturliebhaber Urlaub machen +2025-08-19 20:16:54,452 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Herford: Betrüger mit Machete auf Campingplatz verhaftet - WELT +2025-08-19 20:16:54,453 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.welt.de/regionales/duesseldorf/article118823818/Herford-Betrueger-mit-Machete-auf-Campingplatz-verhaftet.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1SrZmj-KpWRtFejPpNVBcw (Versuch 1) +2025-08-19 20:16:54,870 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:54,870 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:54,870 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:54,871 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.welt.de/regionales/duesseldorf/article118823818/Herford-Betrueger-mit-Machete-auf-Campingplatz-verhaftet.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1SrZmj-KpWRtFejPpNVBcw +2025-08-19 20:16:54,873 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.welt.de/regionales/duesseldorf/article118823818/Herford-Betrueger-mit-Machete-auf-Campingplatz-verhaftet.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1SrZmj-KpWRtFejPpNVBcw +2025-08-19 20:16:55,350 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:55,350 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.welt.de/regionales/duesseldorf/article118823818/Herford-Betrueger-mit-Machete-auf-Campingplatz-verhaftet.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1SrZmj-KpWRtFejPpNVBcw +2025-08-19 20:16:55,351 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Herford: Betrüger mit Machete auf Campingplatz verhaftet - WELT' extrahiert +2025-08-19 20:16:55,351 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Herford: Betrüger mit Machete auf Campingplatz verhaftet - WELT +2025-08-19 20:16:55,351 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Neuer Campingplatz in Niedersachsen eröffnet: Betreiber sind europaweit bekannt - HNA +2025-08-19 20:16:55,351 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/in-europa-wohlbekannt-neuer-campingplatz-in-niedersachsen-eroeffnet-betreiber-93885856.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0KfYM1g3v_ASkaG5-L4e1w (Versuch 1) +2025-08-19 20:16:55,765 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:55,765 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:55,765 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:55,765 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/in-europa-wohlbekannt-neuer-campingplatz-in-niedersachsen-eroeffnet-betreiber-93885856.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0KfYM1g3v_ASkaG5-L4e1w +2025-08-19 20:16:55,767 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/in-europa-wohlbekannt-neuer-campingplatz-in-niedersachsen-eroeffnet-betreiber-93885856.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0KfYM1g3v_ASkaG5-L4e1w +2025-08-19 20:16:56,250 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:56,250 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/in-europa-wohlbekannt-neuer-campingplatz-in-niedersachsen-eroeffnet-betreiber-93885856.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0KfYM1g3v_ASkaG5-L4e1w +2025-08-19 20:16:56,250 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Neuer Campingplatz in Niedersachsen eröffnet: Betreiber sind europaweit bekannt - HNA' extrahiert +2025-08-19 20:16:56,251 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Neuer Campingplatz in Niedersachsen eröffnet: Betreiber sind europaweit bekannt - HNA +2025-08-19 20:16:56,251 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Effizient und umweltfreundlich: Campingplatz in Erden mit neuer LED-Beleuchtung +2025-08-19 20:16:56,251 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://lokalo.de/artikel/376714/effizient-und-umweltfreundlich-campingplatz-in-erden-mit-neuer-led-beleuchtung/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2fXa6aZmE3BqkAsNbHCnwC (Versuch 1) +2025-08-19 20:16:56,667 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:56,667 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:56,668 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:56,668 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://lokalo.de/artikel/376714/effizient-und-umweltfreundlich-campingplatz-in-erden-mit-neuer-led-beleuchtung/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2fXa6aZmE3BqkAsNbHCnwC +2025-08-19 20:16:56,669 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://lokalo.de/artikel/376714/effizient-und-umweltfreundlich-campingplatz-in-erden-mit-neuer-led-beleuchtung/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2fXa6aZmE3BqkAsNbHCnwC +2025-08-19 20:16:57,156 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:57,156 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://lokalo.de/artikel/376714/effizient-und-umweltfreundlich-campingplatz-in-erden-mit-neuer-led-beleuchtung/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2fXa6aZmE3BqkAsNbHCnwC +2025-08-19 20:16:57,157 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Effizient und umweltfreundlich: Campingplatz in Erden mit neuer LED-Beleuchtung' extrahiert +2025-08-19 20:16:57,157 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Effizient und umweltfreundlich: Campingplatz in Erden mit neuer LED-Beleuchtung +2025-08-19 20:16:57,157 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online +2025-08-19 20:16:57,157 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 (Versuch 1) +2025-08-19 20:16:57,571 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:57,572 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:57,572 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:57,572 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 +2025-08-19 20:16:57,574 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online +2025-08-19 20:16:57,575 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Go's und No-Go's auf dem Husumer Campingplatz - SHZ +2025-08-19 20:16:57,575 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/husum/artikel/gos-und-no-gos-auf-dem-husumer-campingplatz-49140857&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2QF6COS0JJi1OJck-Moqnc (Versuch 1) +2025-08-19 20:16:58,050 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:58,050 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:58,051 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:58,051 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/husum/artikel/gos-und-no-gos-auf-dem-husumer-campingplatz-49140857&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2QF6COS0JJi1OJck-Moqnc +2025-08-19 20:16:58,054 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Go's und No-Go's auf dem Husumer Campingplatz - SHZ +2025-08-19 20:16:58,054 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Seit 60 Jahren Campingurlaub auf Usedom: Leipzigerin hat sich ihren Stammplatz in ... +2025-08-19 20:16:58,055 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/lokales/vorpommern-greifswald/usedom/seit-60-jahren-campingurlaub-auf-usedom-leipzigerin-hat-sich-ihren-stammplatz-in-ueckeritz-YWTEPQ3CHBFIDJQZLTYNTQG3DU.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw02dVQz4QETTNH0fLbVCXSy (Versuch 1) +2025-08-19 20:16:58,476 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:16:58,477 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:16:58,477 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:16:58,477 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/lokales/vorpommern-greifswald/usedom/seit-60-jahren-campingurlaub-auf-usedom-leipzigerin-hat-sich-ihren-stammplatz-in-ueckeritz-YWTEPQ3CHBFIDJQZLTYNTQG3DU.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw02dVQz4QETTNH0fLbVCXSy +2025-08-19 20:16:58,480 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/lokales/vorpommern-greifswald/usedom/seit-60-jahren-campingurlaub-auf-usedom-leipzigerin-hat-sich-ihren-stammplatz-in-ueckeritz-YWTEPQ3CHBFIDJQZLTYNTQG3DU.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw02dVQz4QETTNH0fLbVCXSy +2025-08-19 20:16:59,366 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:16:59,366 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/lokales/vorpommern-greifswald/usedom/seit-60-jahren-campingurlaub-auf-usedom-leipzigerin-hat-sich-ihren-stammplatz-in-ueckeritz-YWTEPQ3CHBFIDJQZLTYNTQG3DU.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw02dVQz4QETTNH0fLbVCXSy +2025-08-19 20:16:59,366 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Seit 60 Jahren Campingurlaub auf Usedom: Leipzigerin hat sich ihren Stammplatz in ...' extrahiert +2025-08-19 20:16:59,367 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Seit 60 Jahren Campingurlaub auf Usedom: Leipzigerin hat sich ihren Stammplatz in ... +2025-08-19 20:16:59,367 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping: Grenzüberschreitung! Gäste greifen zu harten Maßnahmen - moin.de +2025-08-19 20:16:59,367 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.moin.de/norddeutschland/camping-platz-nachbarn-was-tun-voll-verrueckt-plaetze-id300643691.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3yKD6zM5C0GGtXMIRQ476n (Versuch 1) +2025-08-19 20:17:00,570 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:00,571 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:00,571 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:00,571 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.moin.de/norddeutschland/camping-platz-nachbarn-was-tun-voll-verrueckt-plaetze-id300643691.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3yKD6zM5C0GGtXMIRQ476n +2025-08-19 20:17:00,573 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping: Grenzüberschreitung! Gäste greifen zu harten Maßnahmen - moin.de +2025-08-19 20:17:00,574 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping erobert neue Zielgruppen | Trends - Counter vor9 +2025-08-19 20:17:00,574 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.countervor9.de/trends/camping-erobert-neue-zielgruppen&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw25FhwEFlV2_J6vE622fq-G (Versuch 1) +2025-08-19 20:17:01,790 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:01,793 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:01,793 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:01,793 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.countervor9.de/trends/camping-erobert-neue-zielgruppen&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw25FhwEFlV2_J6vE622fq-G +2025-08-19 20:17:01,794 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping erobert neue Zielgruppen | Trends - Counter vor9 +2025-08-19 20:17:01,795 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Liveschalte - Vom DDR-Intercamping zum modernen Campingplatz Berlin | rbb - rbb24 +2025-08-19 20:17:01,795 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rbb-online.de/der-tag/ort/schmoekwitzwerder-camping-am-krossinsee.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2DBDdZLr3yZhvUrdhKDBMZ (Versuch 1) +2025-08-19 20:17:02,584 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:02,585 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:02,585 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:02,586 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.rbb-online.de/der-tag/ort/schmoekwitzwerder-camping-am-krossinsee.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2DBDdZLr3yZhvUrdhKDBMZ +2025-08-19 20:17:02,587 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Liveschalte - Vom DDR-Intercamping zum modernen Campingplatz Berlin | rbb - rbb24 +2025-08-19 20:17:02,588 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Verträge laufen aus – Steht der Dauercampingplatz in Karlstein am Main vor dem Aus? +2025-08-19 20:17:02,588 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tvmainfranken.de/mediathek/video/vertraege-laufen-aus-steht-der-dauercampingplatz-in-karlstein-am-main-vor-dem-aus/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1DnOUC_hBM-Pi_zSeQ-Agv (Versuch 1) +2025-08-19 20:17:03,181 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:03,181 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:03,181 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:03,181 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.tvmainfranken.de/mediathek/video/vertraege-laufen-aus-steht-der-dauercampingplatz-in-karlstein-am-main-vor-dem-aus/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1DnOUC_hBM-Pi_zSeQ-Agv +2025-08-19 20:17:03,183 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Verträge laufen aus – Steht der Dauercampingplatz in Karlstein am Main vor dem Aus? +2025-08-19 20:17:03,184 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: An Weilburger Tankstelle fliegen die Fäuste - Echo Online +2025-08-19 20:17:03,184 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/kreis-limburg-weilburg/weilburg/an-weilburger-tankstelle-fliegen-die-faeuste-4892024&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l7jUxG7664vJ69cHwv20M (Versuch 1) +2025-08-19 20:17:03,764 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:03,765 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:03,765 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:03,766 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/kreis-limburg-weilburg/weilburg/an-weilburger-tankstelle-fliegen-die-faeuste-4892024&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l7jUxG7664vJ69cHwv20M +2025-08-19 20:17:03,768 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: An Weilburger Tankstelle fliegen die Fäuste - Echo Online +2025-08-19 20:17:03,768 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 13 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-19 20:17:04,774 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-19 20:17:05,553 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Vanlife +2025-08-19 20:17:05,554 - INFO - fetch_and_process_feed:187 - 📰 1 Einträge gefunden +2025-08-19 20:17:05,555 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Jeep Cherokee als Camper – der einfache Weg zum autarken Urlaub - vanlifemag.de +2025-08-19 20:17:05,555 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/jeep-cherokee-als-camper/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0A-3nq90dUx96JAA9j2VYX (Versuch 1) +2025-08-19 20:17:05,970 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:05,971 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:05,971 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:05,971 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/jeep-cherokee-als-camper/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw0A-3nq90dUx96JAA9j2VYX +2025-08-19 20:17:05,974 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Jeep Cherokee als Camper – der einfache Weg zum autarken Urlaub - vanlifemag.de +2025-08-19 20:17:05,974 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-19 20:17:06,979 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-19 20:17:07,756 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Camping Termine 2024 +2025-08-19 20:17:07,756 - INFO - fetch_and_process_feed:187 - 📰 2 Einträge gefunden +2025-08-19 20:17:07,757 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail +2025-08-19 20:17:07,757 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 (Versuch 1) +2025-08-19 20:17:08,246 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:08,246 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:08,246 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:08,246 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 +2025-08-19 20:17:08,247 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 +2025-08-19 20:17:08,556 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-19 20:17:08,556 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 +2025-08-19 20:17:08,557 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail' extrahiert +2025-08-19 20:17:08,557 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail +2025-08-19 20:17:08,558 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: San Hejmo Festival 2026: Datum, Line-up, Neuheiten, Fotos - Düsseldorf Tonight +2025-08-19 20:17:08,558 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tonight.de/freizeit/san-hejmo-festival-2026-datum-line-up-neuheiten-fotos_150121.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw1oblZYw0b618LHsaVJWsDI (Versuch 1) +2025-08-19 20:17:08,978 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:08,979 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:08,979 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:08,979 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.tonight.de/freizeit/san-hejmo-festival-2026-datum-line-up-neuheiten-fotos_150121.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw1oblZYw0b618LHsaVJWsDI +2025-08-19 20:17:08,982 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: San Hejmo Festival 2026: Datum, Line-up, Neuheiten, Fotos - Düsseldorf Tonight +2025-08-19 20:17:08,982 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-19 20:17:09,984 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-19 20:17:10,723 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert - Camping Messe 2025 +2025-08-19 20:17:10,723 - INFO - fetch_and_process_feed:187 - 📰 2 Einträge gefunden +2025-08-19 20:17:10,724 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 20:17:10,724 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO (Versuch 1) +2025-08-19 20:17:11,065 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:11,066 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:11,066 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:11,066 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.pincamp.de/magazin/nachrichten/a40-vollsperrung-zwischen-bochum-und-essen-kostet-nerven&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1CIEQ13m8IuurSSpp6nZFO +2025-08-19 20:17:11,067 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: A40: Vollsperrung zwischen Bochum und Essen kostet Nerven - PiNCAMP Magazin +2025-08-19 20:17:11,068 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gamescom 2025: Aston Martin im Zenless Zone Zero-Design - Autozeitung +2025-08-19 20:17:11,069 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/gamescom-2025-messe-highlights-fuer-autofans-209057.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0FXrDgBBR2LkRWJXcWhY_P (Versuch 1) +2025-08-19 20:17:11,647 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-19 20:17:11,647 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-19 20:17:11,647 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-19 20:17:11,647 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/gamescom-2025-messe-highlights-fuer-autofans-209057.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0FXrDgBBR2LkRWJXcWhY_P +2025-08-19 20:17:11,649 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gamescom 2025: Aston Martin im Zenless Zone Zero-Design - Autozeitung +2025-08-19 20:17:11,649 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-19 20:17:12,683 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:17:12,683 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 15 neue Artikel in 64.35s hinzugefügt +2025-08-19 20:17:13,777 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:17:13,777 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:17:50,843 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:17:50,844 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:17:50,872 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:17:51,442 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:17:51,442 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:17:56,956 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:17:56,957 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:17:56,986 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:17:57,554 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:17:57,554 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:03,052 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:03,053 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:03,084 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:18:03,653 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:03,653 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:20,105 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:20,106 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:20,138 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:18:20,703 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:20,704 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:25,426 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:25,426 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:25,461 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:18:26,024 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:26,024 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:35,133 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:35,134 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:35,186 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:18:35,752 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:35,752 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:41,945 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:41,946 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:41,980 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:18:42,545 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:42,545 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:50,303 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:50,304 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:50,340 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:18:50,905 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:50,906 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:54,819 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:54,820 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:18:54,872 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:18:55,435 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:18:55,435 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:19:02,633 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:19:02,634 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:19:02,672 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:19:03,238 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:19:03,238 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:19:08,802 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:19:08,803 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:19:08,850 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:19:09,416 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:19:09,416 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:19:38,588 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:19:38,589 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:20:37,310 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:20:37,311 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:40:25,582 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:40:25,583 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:40:25,605 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:40:26,188 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:40:26,188 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:40:37,384 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:40:37,384 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-19 20:40:37,408 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-19 20:40:37,997 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-19 20:40:37,997 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:02:34,003 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:02:34,003 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:02:52,568 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:02:52,570 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:10:21,160 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:10:21,162 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:10:21,182 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-20 08:10:21,778 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:10:21,779 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:10:26,302 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:10:26,303 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:18:20,909 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:18:20,910 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:18:20,930 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-20 08:18:21,507 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:18:21,508 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:19:31,891 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:19:31,892 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:19:57,300 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:19:57,301 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:19:57,327 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-20 08:19:57,912 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:19:57,912 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:20:02,632 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:20:02,633 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:20:17,376 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:20:17,378 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:20:17,397 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-20 08:20:17,986 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:20:17,986 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:20:23,654 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:20:23,655 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:20:40,375 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:20:40,378 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:20:40,416 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-20 08:20:41,004 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:20:41,004 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:20:49,837 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:20:49,837 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:20:49,843 - INFO - rewrite_articles:320 - ✍️ Starte Artikel-Umschreibung +2025-08-20 08:20:49,846 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:20:49,847 - INFO - rewrite_articles:337 - ✍️ Umschreiben von: WTG-Insolvenz in Hooksiel: Investor für Campingplatz und Hallenbad gefunden +2025-08-20 08:20:54,066 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-20 08:20:56,726 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-20 08:20:56,739 - INFO - rewrite_articles:392 - ✅ Artikel erfolgreich umgeschrieben: WTG-Insolvenz in Hooksiel: Investor für Campingplatz und Hallenbad gefunden +2025-08-20 08:20:58,766 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-20 08:20:58,766 - INFO - rewrite_articles:404 - 🎉 1 Artikel erfolgreich umgeschrieben +2025-08-20 08:20:59,847 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:20:59,848 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:21:09,618 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:21:09,619 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:21:18,981 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:21:18,982 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:21:35,338 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:21:35,339 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:21:53,776 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:21:53,777 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:21:53,796 - INFO - save_articles:144 - ✅ 135 Artikel gespeichert +2025-08-20 08:21:54,371 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:21:54,372 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:26:38,905 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:26:38,906 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:26:50,782 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:26:50,783 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:26:50,789 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-20 08:26:50,789 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:26:50,795 - INFO - load_articles:124 - ✅ 135 Artikel geladen +2025-08-20 08:26:50,795 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-20 08:26:51,301 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-20 08:26:51,302 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-20 08:26:51,303 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-20 08:26:51,304 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-20 08:26:51,304 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-20 08:26:51,305 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-20 08:26:51,305 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-20 08:26:51,306 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-20 08:26:51,306 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-20 08:26:51,307 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-20 08:26:51,307 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-20 08:26:51,308 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-20 08:26:51,308 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-20 08:26:52,313 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-20 08:26:52,749 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-20 08:26:52,750 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-20 08:26:52,750 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-20 08:26:52,751 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-20 08:26:53,389 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:53,390 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:53,391 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-20 08:26:53,392 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-20 08:26:53,392 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-20 08:26:53,392 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-20 08:26:53,392 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-20 08:26:54,544 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:54,545 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:54,547 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-20 08:26:54,547 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-20 08:26:54,547 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-20 08:26:54,548 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-20 08:26:54,548 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-20 08:26:54,882 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:54,883 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:54,885 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-20 08:26:54,885 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-20 08:26:54,885 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-20 08:26:54,885 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-20 08:26:54,886 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-20 08:26:55,665 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:55,666 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:55,667 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-20 08:26:55,667 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-20 08:26:55,667 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-20 08:26:55,668 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-20 08:26:55,668 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-20 08:26:55,951 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:55,952 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:55,955 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-20 08:26:55,955 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-20 08:26:55,956 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-20 08:26:55,956 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-20 08:26:55,956 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-20 08:26:56,539 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:56,540 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:56,541 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-20 08:26:56,541 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-20 08:26:56,541 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-20 08:26:56,542 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-20 08:26:56,542 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-20 08:26:58,036 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:58,037 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:58,037 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:26:58,038 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-20 08:26:58,038 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:26:58,041 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-20 08:26:58,041 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-20 08:26:58,041 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-20 08:26:58,041 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-20 08:26:58,726 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:58,728 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:58,730 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-20 08:26:58,731 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-20 08:26:58,731 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-20 08:26:58,732 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-20 08:26:58,732 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-20 08:26:59,047 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:59,049 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:59,051 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-20 08:26:59,051 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-20 08:26:59,052 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-20 08:26:59,052 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-20 08:26:59,052 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-20 08:26:59,688 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:26:59,689 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:26:59,691 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-20 08:26:59,691 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-20 08:26:59,692 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-20 08:26:59,692 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-20 08:26:59,692 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-20 08:27:01,058 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:01,059 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:01,060 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-20 08:27:01,061 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-20 08:27:01,061 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-20 08:27:01,061 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-20 08:27:01,061 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-20 08:27:01,062 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-20 08:27:01,778 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:01,779 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:01,780 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-20 08:27:01,780 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-20 08:27:01,781 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-20 08:27:01,781 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-20 08:27:01,781 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-20 08:27:03,047 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:03,048 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:03,050 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-20 08:27:03,050 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-20 08:27:03,050 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-20 08:27:03,051 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-20 08:27:03,051 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-20 08:27:03,833 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:03,834 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:03,836 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-20 08:27:03,836 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-20 08:27:03,836 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-20 08:27:03,837 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-20 08:27:03,837 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-20 08:27:04,557 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:04,558 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:04,559 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-20 08:27:04,560 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-20 08:27:04,560 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-20 08:27:04,560 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-20 08:27:04,560 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-20 08:27:05,494 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:05,496 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:05,497 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-20 08:27:05,497 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-20 08:27:05,497 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-20 08:27:05,497 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-20 08:27:05,497 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-20 08:27:06,217 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:06,219 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:06,220 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-20 08:27:06,220 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-20 08:27:06,221 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-20 08:27:06,221 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-20 08:27:06,221 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-20 08:27:06,988 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:06,989 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:06,990 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-20 08:27:06,990 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-20 08:27:06,990 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-20 08:27:06,991 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-20 08:27:06,991 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-20 08:27:08,021 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:08,022 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:08,022 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:08,023 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-20 08:27:08,023 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:08,026 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-20 08:27:08,027 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-20 08:27:08,027 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-20 08:27:09,032 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-20 08:27:09,593 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-20 08:27:09,594 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-20 08:27:09,595 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.promobil.de/weitere-ratgeber/moderne-windschutzscheiben-mehr-als-nur-glas/ +2025-08-20 08:27:09,826 - INFO - extract_images_with_metadata:167 - 🔍 13 img-Tags gefunden +2025-08-20 08:27:09,827 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Windschutzsscheibe, Aufbau... +2025-08-20 08:27:09,827 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-20 08:27:09,827 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.promobil.de/weitere-ratgeber/moderne-windschutzscheiben-mehr-als-nur-glas/: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-20 08:27:09,828 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Fahrzeugtechnik am Wohnmobil im Detail: Windschutzscheiben sind längst mehr als Glas' extrahiert +2025-08-20 08:27:09,828 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Fahrzeugtechnik am Wohnmobil im Detail: Windschutzscheiben sind längst mehr als Glas +2025-08-20 08:27:09,830 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-20 08:27:09,831 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-20 08:27:09,832 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-20 08:27:09,834 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-20 08:27:09,835 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-20 08:27:09,836 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-20 08:27:09,839 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-20 08:27:09,840 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-20 08:27:09,842 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-20 08:27:09,843 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-20 08:27:09,844 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-20 08:27:09,846 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-20 08:27:09,847 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-20 08:27:09,848 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-20 08:27:09,849 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-20 08:27:09,850 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-20 08:27:09,853 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-20 08:27:09,855 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dethleffs Reiselust-Prämie: Bis zu 20.000 Euro Rabatt auf Wohnmobile +2025-08-20 08:27:09,856 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue promobil-Newsletter - gratis!: Zum Frühstück die spannendsten Camping-Themen +2025-08-20 08:27:09,856 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-20 08:27:10,862 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-20 08:27:11,197 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach camping +2025-08-20 08:27:11,197 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-20 08:27:11,199 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-20 08:27:11,200 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-20 08:27:11,201 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem +2025-08-20 08:27:11,202 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Inklusiver Campingurlaub am Gardasee +2025-08-20 08:27:11,202 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/153661/6094377 (Versuch 1) +2025-08-20 08:27:11,556 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:11,557 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 616 Wörter +2025-08-20 08:27:11,558 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 616 Wörter +2025-08-20 08:27:11,558 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Inklusiver Campingurlaub am Gardasee +2025-08-20 08:27:11,559 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025 +2025-08-20 08:27:11,560 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-20 08:27:11,560 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/170000/6091414 (Versuch 1) +2025-08-20 08:27:11,989 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:11,989 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 191 Wörter +2025-08-20 08:27:11,990 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 191 Wörter +2025-08-20 08:27:11,990 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-20 08:27:11,992 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt +2025-08-20 08:27:11,993 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: RTLZWEI: Erfolgreicher Montag mit "Bella Italia - Camping auf Deutsch" +2025-08-20 08:27:11,993 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-20 08:27:11,993 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-20 08:27:12,353 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:12,354 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-20 08:27:12,355 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-20 08:27:12,356 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-20 08:27:12,356 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-20 08:27:12,356 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/102577/6085137 (Versuch 1) +2025-08-20 08:27:12,781 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:12,783 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 1226 Wörter +2025-08-20 08:27:12,783 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1226 Wörter +2025-08-20 08:27:12,784 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-20 08:27:12,784 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-20 08:27:13,789 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-20 08:27:14,088 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil +2025-08-20 08:27:14,088 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-20 08:27:14,090 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Akku leer: Gefahren beim Laden von E-Bikes +2025-08-20 08:27:14,091 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-20 08:27:14,093 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco +2025-08-20 08:27:14,094 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall +2025-08-20 08:27:14,095 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-20 08:27:14,095 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/105254/6091837 (Versuch 1) +2025-08-20 08:27:14,416 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:14,418 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-20 08:27:14,419 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-20 08:27:14,419 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-20 08:27:14,801 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:14,802 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-20 08:27:14,802 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-20 08:27:14,803 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-20 08:27:14,804 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Trotz Camper-Hype: Der Pkw ist die unangefochtene Nummer 1 für Sommerreisen +2025-08-20 08:27:14,805 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Doppelfolge am 24. Juli "Oksana & Family - Alles auf Anfang": Abwasserprobleme, Jobsuche und Tonstudiobesuch +2025-08-20 08:27:14,807 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Oksana & Family - Alles auf Anfang": Zwischen Camping-Chaos und einer schweren Entscheidung +2025-08-20 08:27:14,807 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper +2025-08-20 08:27:14,807 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/13984/6077676 (Versuch 1) +2025-08-20 08:27:15,183 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-20 08:27:15,185 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 891 Wörter +2025-08-20 08:27:15,185 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 891 Wörter +2025-08-20 08:27:15,186 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage: Mehrheit will mehr Freiheiten für Wohnmobile und Camper +2025-08-20 08:27:15,186 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-20 08:27:16,192 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://caravan-news.de/rss/schlagzeilen.php +2025-08-20 08:27:16,581 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: CARAVAN-NEWS.de +2025-08-20 08:27:16,581 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://caravan-news.de/rss/schlagzeilen.php +2025-08-20 08:27:17,582 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-20 08:27:18,188 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Campingplatz +2025-08-20 08:27:18,189 - INFO - fetch_and_process_feed:187 - 📰 18 Einträge gefunden +2025-08-20 08:27:18,189 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Campingplatz Arendsee: Handlungsbedarf bei Dauercampern - AZ-Online +2025-08-20 08:27:18,189 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.az-online.de/altmark/arendsee/campingplatz-arendsee-handlungsbedarf-bei-dauercampern-93891117.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3pMfHlZ-X_c1tydcMGsUKz (Versuch 1) +2025-08-20 08:27:18,446 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:18,447 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:18,447 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:18,447 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.az-online.de/altmark/arendsee/campingplatz-arendsee-handlungsbedarf-bei-dauercampern-93891117.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3pMfHlZ-X_c1tydcMGsUKz +2025-08-20 08:27:18,450 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.az-online.de/altmark/arendsee/campingplatz-arendsee-handlungsbedarf-bei-dauercampern-93891117.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3pMfHlZ-X_c1tydcMGsUKz +2025-08-20 08:27:18,647 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:18,648 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.az-online.de/altmark/arendsee/campingplatz-arendsee-handlungsbedarf-bei-dauercampern-93891117.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3pMfHlZ-X_c1tydcMGsUKz +2025-08-20 08:27:18,648 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Campingplatz Arendsee: Handlungsbedarf bei Dauercampern - AZ-Online' extrahiert +2025-08-20 08:27:18,648 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Campingplatz Arendsee: Handlungsbedarf bei Dauercampern - AZ-Online +2025-08-20 08:27:18,649 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: „Tante Henni“: Haslohs idyllischer Mini-Campingplatz an der A7 - Hamburger Abendblatt +2025-08-20 08:27:18,649 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.abendblatt.de/schleswig-holstein/norderstedt/article409752359/tante-henni-haslohs-idyllischer-mini-campingplatz-an-der-a7.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l1jr7kdJVDA3nrTWt9vaE (Versuch 1) +2025-08-20 08:27:18,843 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:18,844 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:18,844 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:18,845 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.abendblatt.de/schleswig-holstein/norderstedt/article409752359/tante-henni-haslohs-idyllischer-mini-campingplatz-an-der-a7.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l1jr7kdJVDA3nrTWt9vaE +2025-08-20 08:27:18,847 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.abendblatt.de/schleswig-holstein/norderstedt/article409752359/tante-henni-haslohs-idyllischer-mini-campingplatz-an-der-a7.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l1jr7kdJVDA3nrTWt9vaE +2025-08-20 08:27:19,072 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:19,072 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.abendblatt.de/schleswig-holstein/norderstedt/article409752359/tante-henni-haslohs-idyllischer-mini-campingplatz-an-der-a7.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l1jr7kdJVDA3nrTWt9vaE +2025-08-20 08:27:19,073 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für '„Tante Henni“: Haslohs idyllischer Mini-Campingplatz an der A7 - Hamburger Abendblatt' extrahiert +2025-08-20 08:27:19,073 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: „Tante Henni“: Haslohs idyllischer Mini-Campingplatz an der A7 - Hamburger Abendblatt +2025-08-20 08:27:19,074 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Toter 13-Jähriger: Jetzt liegt das Obduktionsergebnis vor - MSN +2025-08-20 08:27:19,074 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/toter-13-j%25C3%25A4hriger-jetzt-liegt-das-obduktionsergebnis-vor/ar-AA1KIBko&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3WZAfu7i39_TT7qgG7OXgi (Versuch 1) +2025-08-20 08:27:19,269 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:19,269 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:19,270 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:19,270 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/toter-13-j%25C3%25A4hriger-jetzt-liegt-das-obduktionsergebnis-vor/ar-AA1KIBko&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3WZAfu7i39_TT7qgG7OXgi +2025-08-20 08:27:19,273 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/toter-13-j%25C3%25A4hriger-jetzt-liegt-das-obduktionsergebnis-vor/ar-AA1KIBko&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3WZAfu7i39_TT7qgG7OXgi +2025-08-20 08:27:19,469 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:19,470 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/toter-13-j%25C3%25A4hriger-jetzt-liegt-das-obduktionsergebnis-vor/ar-AA1KIBko&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3WZAfu7i39_TT7qgG7OXgi +2025-08-20 08:27:19,470 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Toter 13-Jähriger: Jetzt liegt das Obduktionsergebnis vor - MSN' extrahiert +2025-08-20 08:27:19,470 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Toter 13-Jähriger: Jetzt liegt das Obduktionsergebnis vor - MSN +2025-08-20 08:27:19,470 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Woran ein Campingplatz-Experte deutsche Urlauber direkt erkennt +2025-08-20 08:27:19,471 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3jJhVNzmOoLWdIEPL4NLUD (Versuch 1) +2025-08-20 08:27:19,667 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:19,667 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:19,667 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:19,668 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3jJhVNzmOoLWdIEPL4NLUD +2025-08-20 08:27:19,669 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3jJhVNzmOoLWdIEPL4NLUD +2025-08-20 08:27:19,872 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:19,873 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-direkt-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3jJhVNzmOoLWdIEPL4NLUD +2025-08-20 08:27:19,873 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Woran ein Campingplatz-Experte deutsche Urlauber direkt erkennt' extrahiert +2025-08-20 08:27:19,874 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Woran ein Campingplatz-Experte deutsche Urlauber direkt erkennt +2025-08-20 08:27:19,874 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Winterthur: Campingplatz Schützenweiher kommt an die Urne - Tages-Anzeiger +2025-08-20 08:27:19,874 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tagesanzeiger.ch/winterthur-campingplatz-schuetzenweiher-kommt-an-die-urne-637538306386&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0agfyAxzRqVvd3uX5bhaA- (Versuch 1) +2025-08-20 08:27:20,068 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:20,069 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:20,069 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:20,069 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.tagesanzeiger.ch/winterthur-campingplatz-schuetzenweiher-kommt-an-die-urne-637538306386&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0agfyAxzRqVvd3uX5bhaA- +2025-08-20 08:27:20,072 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Winterthur: Campingplatz Schützenweiher kommt an die Urne - Tages-Anzeiger +2025-08-20 08:27:20,072 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail +2025-08-20 08:27:20,073 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 (Versuch 1) +2025-08-20 08:27:20,272 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:20,272 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:20,273 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:20,273 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 +2025-08-20 08:27:20,276 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail +2025-08-20 08:27:20,276 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Woran ein Campingplatz-Experte deutsche Urlauber sofort erkennt +2025-08-20 08:27:20,277 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-sofort-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bjSwJduCIDU44lYDuu22U (Versuch 1) +2025-08-20 08:27:20,478 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:20,479 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:20,479 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:20,480 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/deutschland/woran-ein-campingplatz-experte-deutsche-urlauber-sofort-erkennt-zr-93886767.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2bjSwJduCIDU44lYDuu22U +2025-08-20 08:27:20,482 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Woran ein Campingplatz-Experte deutsche Urlauber sofort erkennt +2025-08-20 08:27:20,482 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: WTG-Insolvenz in Hooksiel: Investor für Campingplatz und Hallenbad gefunden +2025-08-20 08:27:20,483 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nwzonline.de/friesland/wtg-insolvenz-in-hooksiel-investor-fuer-campingplatz-und-hallenbad-gefunden_a_4,2,1744055285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2NSatmqIKkGVEo26UyQfCS (Versuch 1) +2025-08-20 08:27:20,672 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:20,672 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:20,673 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:20,673 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nwzonline.de/friesland/wtg-insolvenz-in-hooksiel-investor-fuer-campingplatz-und-hallenbad-gefunden_a_4,2,1744055285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2NSatmqIKkGVEo26UyQfCS +2025-08-20 08:27:20,675 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: WTG-Insolvenz in Hooksiel: Investor für Campingplatz und Hallenbad gefunden +2025-08-20 08:27:20,676 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Nach Krisentreffen in Karlstein: Mögliche Rettung für die Dauercamper am Großwelzheimer Weißsee +2025-08-20 08:27:20,676 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.main-echo.de/region/stadt-kreis-aschaffenburg/nach-dem-krisentreffen-in-karlstein-moegliche-rettung-fuer-die-dauercamper-art-8562505&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0F7beKEClnDEQsNAUMuWIr (Versuch 1) +2025-08-20 08:27:20,876 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:20,877 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:20,877 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:20,878 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.main-echo.de/region/stadt-kreis-aschaffenburg/nach-dem-krisentreffen-in-karlstein-moegliche-rettung-fuer-die-dauercamper-art-8562505&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0F7beKEClnDEQsNAUMuWIr +2025-08-20 08:27:20,881 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Nach Krisentreffen in Karlstein: Mögliche Rettung für die Dauercamper am Großwelzheimer Weißsee +2025-08-20 08:27:20,882 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sassari: Polizei greift bei illegalem Camping zwischen Lake Baratz und Porto Ferro ein. +2025-08-20 08:27:20,882 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.unionesarda.it/de/sardinien/sassari-polizei-greift-bei-illegalem-camping-zwischen-lake-baratz-und-porto-ferro-ein-gb90frrb&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2uUKNIFkm1Rvv58CAVg2_U (Versuch 1) +2025-08-20 08:27:21,098 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:21,099 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:21,099 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:21,099 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.unionesarda.it/de/sardinien/sassari-polizei-greift-bei-illegalem-camping-zwischen-lake-baratz-und-porto-ferro-ein-gb90frrb&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2uUKNIFkm1Rvv58CAVg2_U +2025-08-20 08:27:21,102 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sassari: Polizei greift bei illegalem Camping zwischen Lake Baratz und Porto Ferro ein. +2025-08-20 08:27:21,103 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping am See in Brandenburg – 5 besonders schöne Plätze +2025-08-20 08:27:21,103 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.bz-berlin.de/ratgeber/camping-in-brandenburg-am-see&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28Yp1DHAiG7pUNIJF_tLkC (Versuch 1) +2025-08-20 08:27:21,312 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:21,313 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:21,313 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:21,313 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.bz-berlin.de/ratgeber/camping-in-brandenburg-am-see&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw28Yp1DHAiG7pUNIJF_tLkC +2025-08-20 08:27:21,316 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping am See in Brandenburg – 5 besonders schöne Plätze +2025-08-20 08:27:21,317 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Lost Place im Odenwald: Verlassener Campingplatz lockt Menschen an - Echo Online +2025-08-20 08:27:21,317 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/odenwaldkreis/oberzent-odenwaldkreis/lost-place-odenwald-verlassener-campingplatz-muellkippe-forum-oberzent-4805851&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39nSnV29WHn7ytbY8s4wkI (Versuch 1) +2025-08-20 08:27:21,543 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:21,544 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:21,544 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:21,544 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.echo-online.de/lokales/odenwaldkreis/oberzent-odenwaldkreis/lost-place-odenwald-verlassener-campingplatz-muellkippe-forum-oberzent-4805851&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39nSnV29WHn7ytbY8s4wkI +2025-08-20 08:27:21,547 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Lost Place im Odenwald: Verlassener Campingplatz lockt Menschen an - Echo Online +2025-08-20 08:27:21,548 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sachsens Campingplätze: Hier können Naturliebhaber Urlaub machen +2025-08-20 08:27:21,548 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.saechsische.de/sachsen/sachsens-campingplaetze-hier-koennen-naturliebhaber-urlaub-machen-LISYQBT5XRCHDEHUZUU66IKT7Y.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3LZG2TbqgyYMDOING19TpS (Versuch 1) +2025-08-20 08:27:22,107 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:22,107 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:22,108 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:22,108 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.saechsische.de/sachsen/sachsens-campingplaetze-hier-koennen-naturliebhaber-urlaub-machen-LISYQBT5XRCHDEHUZUU66IKT7Y.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3LZG2TbqgyYMDOING19TpS +2025-08-20 08:27:22,110 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sachsens Campingplätze: Hier können Naturliebhaber Urlaub machen +2025-08-20 08:27:22,112 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Herford: Betrüger mit Machete auf Campingplatz verhaftet - WELT +2025-08-20 08:27:22,112 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.welt.de/regionales/duesseldorf/article118823818/Herford-Betrueger-mit-Machete-auf-Campingplatz-verhaftet.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1SrZmj-KpWRtFejPpNVBcw (Versuch 1) +2025-08-20 08:27:22,773 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:22,773 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:22,774 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:22,774 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.welt.de/regionales/duesseldorf/article118823818/Herford-Betrueger-mit-Machete-auf-Campingplatz-verhaftet.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1SrZmj-KpWRtFejPpNVBcw +2025-08-20 08:27:22,776 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Herford: Betrüger mit Machete auf Campingplatz verhaftet - WELT +2025-08-20 08:27:22,777 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Neuer Campingplatz in Niedersachsen eröffnet: Betreiber sind europaweit bekannt - HNA +2025-08-20 08:27:22,777 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/in-europa-wohlbekannt-neuer-campingplatz-in-niedersachsen-eroeffnet-betreiber-93885856.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0KfYM1g3v_ASkaG5-L4e1w (Versuch 1) +2025-08-20 08:27:23,147 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:23,147 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:23,148 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:23,148 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/in-europa-wohlbekannt-neuer-campingplatz-in-niedersachsen-eroeffnet-betreiber-93885856.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0KfYM1g3v_ASkaG5-L4e1w +2025-08-20 08:27:23,150 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neuer Campingplatz in Niedersachsen eröffnet: Betreiber sind europaweit bekannt - HNA +2025-08-20 08:27:23,151 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Effizient und umweltfreundlich: Campingplatz in Erden mit neuer LED-Beleuchtung +2025-08-20 08:27:23,151 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://lokalo.de/artikel/376714/effizient-und-umweltfreundlich-campingplatz-in-erden-mit-neuer-led-beleuchtung/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2fXa6aZmE3BqkAsNbHCnwC (Versuch 1) +2025-08-20 08:27:23,567 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:23,567 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:23,568 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:23,568 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://lokalo.de/artikel/376714/effizient-und-umweltfreundlich-campingplatz-in-erden-mit-neuer-led-beleuchtung/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2fXa6aZmE3BqkAsNbHCnwC +2025-08-20 08:27:23,571 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Effizient und umweltfreundlich: Campingplatz in Erden mit neuer LED-Beleuchtung +2025-08-20 08:27:23,571 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online +2025-08-20 08:27:23,571 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 (Versuch 1) +2025-08-20 08:27:23,952 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:23,953 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:23,953 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:23,953 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.t-online.de/leben/reisen/deutschland/id_100871658/hundefreundliche-campingplaetze-top-10-von-ostsee-bis-nrw-entdecken.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2MLwYap5S4s8YXemp9_4B7 +2025-08-20 08:27:23,955 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hundefreundliche Campingplätze: Top 10 von Ostsee bis NRW entdecken - T-Online +2025-08-20 08:27:23,956 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Seit 60 Jahren Campingurlaub auf Usedom: Leipzigerin hat sich ihren Stammplatz in ... +2025-08-20 08:27:23,956 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/lokales/vorpommern-greifswald/usedom/seit-60-jahren-campingurlaub-auf-usedom-leipzigerin-hat-sich-ihren-stammplatz-in-ueckeritz-YWTEPQ3CHBFIDJQZLTYNTQG3DU.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw02dVQz4QETTNH0fLbVCXSy (Versuch 1) +2025-08-20 08:27:24,373 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:24,374 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:24,374 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:24,374 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.ostsee-zeitung.de/lokales/vorpommern-greifswald/usedom/seit-60-jahren-campingurlaub-auf-usedom-leipzigerin-hat-sich-ihren-stammplatz-in-ueckeritz-YWTEPQ3CHBFIDJQZLTYNTQG3DU.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw02dVQz4QETTNH0fLbVCXSy +2025-08-20 08:27:24,377 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Seit 60 Jahren Campingurlaub auf Usedom: Leipzigerin hat sich ihren Stammplatz in ... +2025-08-20 08:27:24,378 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 4 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-20 08:27:25,380 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-20 08:27:26,033 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Vanlife +2025-08-20 08:27:26,033 - INFO - fetch_and_process_feed:187 - 📰 3 Einträge gefunden +2025-08-20 08:27:26,033 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: PicOli Light 2.0 im Praxistest: Vanlife-Grillaufsatz im Härtetest - Vanlifemag +2025-08-20 08:27:26,033 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/picoli-light-2-0-im-praxistest-vanlife-grillaufsatz-im-haertetest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1_sGi-W7VUoJmclmaolF5T (Versuch 1) +2025-08-20 08:27:26,687 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:26,688 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:26,688 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:26,688 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/picoli-light-2-0-im-praxistest-vanlife-grillaufsatz-im-haertetest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1_sGi-W7VUoJmclmaolF5T +2025-08-20 08:27:26,691 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/picoli-light-2-0-im-praxistest-vanlife-grillaufsatz-im-haertetest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1_sGi-W7VUoJmclmaolF5T +2025-08-20 08:27:27,435 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:27,435 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/picoli-light-2-0-im-praxistest-vanlife-grillaufsatz-im-haertetest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1_sGi-W7VUoJmclmaolF5T +2025-08-20 08:27:27,436 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'PicOli Light 2.0 im Praxistest: Vanlife-Grillaufsatz im Härtetest - Vanlifemag' extrahiert +2025-08-20 08:27:27,436 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: PicOli Light 2.0 im Praxistest: Vanlife-Grillaufsatz im Härtetest - Vanlifemag +2025-08-20 08:27:27,437 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Einhell TE-COL 18/2 Li Kühlbox im Vanlife-Praxistest - vanlifemag.de +2025-08-20 08:27:27,437 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/einhell-te-col-18-2-li-kuehlbox-im-vanlife-praxistest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3Pcz_ZggLAFD6QGjl_LVMd (Versuch 1) +2025-08-20 08:27:28,117 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:28,117 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:28,118 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:28,118 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/einhell-te-col-18-2-li-kuehlbox-im-vanlife-praxistest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3Pcz_ZggLAFD6QGjl_LVMd +2025-08-20 08:27:28,119 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/einhell-te-col-18-2-li-kuehlbox-im-vanlife-praxistest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3Pcz_ZggLAFD6QGjl_LVMd +2025-08-20 08:27:28,646 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:28,647 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/einhell-te-col-18-2-li-kuehlbox-im-vanlife-praxistest/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3Pcz_ZggLAFD6QGjl_LVMd +2025-08-20 08:27:28,647 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Einhell TE-COL 18/2 Li Kühlbox im Vanlife-Praxistest - vanlifemag.de' extrahiert +2025-08-20 08:27:28,648 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Einhell TE-COL 18/2 Li Kühlbox im Vanlife-Praxistest - vanlifemag.de +2025-08-20 08:27:28,649 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Toyota Hilux mit Eigenbau-Wohnkabine - vanlifemag.de +2025-08-20 08:27:28,649 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/toyota-hilux-mit-eigenbau-wohnkabine/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3EAfLd1L-OC7rE84KQDRCE (Versuch 1) +2025-08-20 08:27:28,992 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:28,992 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:28,993 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:28,993 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/toyota-hilux-mit-eigenbau-wohnkabine/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3EAfLd1L-OC7rE84KQDRCE +2025-08-20 08:27:28,994 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/toyota-hilux-mit-eigenbau-wohnkabine/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3EAfLd1L-OC7rE84KQDRCE +2025-08-20 08:27:29,326 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:29,326 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/toyota-hilux-mit-eigenbau-wohnkabine/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw3EAfLd1L-OC7rE84KQDRCE +2025-08-20 08:27:29,327 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Toyota Hilux mit Eigenbau-Wohnkabine - vanlifemag.de' extrahiert +2025-08-20 08:27:29,327 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Toyota Hilux mit Eigenbau-Wohnkabine - vanlifemag.de +2025-08-20 08:27:29,327 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 3 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-20 08:27:30,331 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-20 08:27:30,864 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Camping Termine 2024 +2025-08-20 08:27:30,865 - INFO - fetch_and_process_feed:187 - 📰 1 Einträge gefunden +2025-08-20 08:27:30,865 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail +2025-08-20 08:27:30,866 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 (Versuch 1) +2025-08-20 08:27:31,072 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:31,072 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:31,072 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:31,073 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.focus.de/reisen/erste-worauf-ich-achte-camping-experte-erkennt-deutsche-sofort-an-einem-detail_b0ccac54-bb2b-4d0a-be65-f76fca52e00d.html&ct=ga&cd=CAIyGTU5MzhlYmNkNDkzNWFiYWI6ZGU6ZGU6REU&usg=AOvVaw0oZHkJrCJTQ2P3DjOmaMq1 +2025-08-20 08:27:31,078 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Erste, worauf ich achte": Camping-Experte erkennt Deutsche sofort an einem Detail +2025-08-20 08:27:31,080 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-20 08:27:32,085 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-20 08:27:32,576 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert - Camping Messe 2025 +2025-08-20 08:27:32,576 - INFO - fetch_and_process_feed:187 - 📰 5 Einträge gefunden +2025-08-20 08:27:32,577 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Opel Corsa GSE Vision (2025): Elektro-Studie auf Lambo-Niveau - Autozeitung +2025-08-20 08:27:32,577 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/opel-corsa-gse-vision-gran-turismo-2025-elektro-studie-209130.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1HzJt6GJ0DkRsbYPmlqUee (Versuch 1) +2025-08-20 08:27:32,816 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:32,817 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:32,817 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:32,817 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/opel-corsa-gse-vision-gran-turismo-2025-elektro-studie-209130.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1HzJt6GJ0DkRsbYPmlqUee +2025-08-20 08:27:32,820 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/opel-corsa-gse-vision-gran-turismo-2025-elektro-studie-209130.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1HzJt6GJ0DkRsbYPmlqUee +2025-08-20 08:27:33,052 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:33,052 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.autozeitung.de/opel-corsa-gse-vision-gran-turismo-2025-elektro-studie-209130.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1HzJt6GJ0DkRsbYPmlqUee +2025-08-20 08:27:33,053 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Opel Corsa GSE Vision (2025): Elektro-Studie auf Lambo-Niveau - Autozeitung' extrahiert +2025-08-20 08:27:33,053 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Opel Corsa GSE Vision (2025): Elektro-Studie auf Lambo-Niveau - Autozeitung +2025-08-20 08:27:33,053 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: IFA 2025: Jackery mit Solarneuheiten - Presseportal fair-NEWS +2025-08-20 08:27:33,053 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fair-news.de/3797899/ifa-2025-jackery-mit-solarneuheiten&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0dSlwjcVA83vgTV2l9TZ5- (Versuch 1) +2025-08-20 08:27:33,266 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:33,267 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:33,267 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:33,268 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fair-news.de/3797899/ifa-2025-jackery-mit-solarneuheiten&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0dSlwjcVA83vgTV2l9TZ5- +2025-08-20 08:27:33,270 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fair-news.de/3797899/ifa-2025-jackery-mit-solarneuheiten&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0dSlwjcVA83vgTV2l9TZ5- +2025-08-20 08:27:33,484 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:33,485 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fair-news.de/3797899/ifa-2025-jackery-mit-solarneuheiten&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0dSlwjcVA83vgTV2l9TZ5- +2025-08-20 08:27:33,485 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'IFA 2025: Jackery mit Solarneuheiten - Presseportal fair-NEWS' extrahiert +2025-08-20 08:27:33,486 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: IFA 2025: Jackery mit Solarneuheiten - Presseportal fair-NEWS +2025-08-20 08:27:33,486 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gamescom 2025 in Köln: Harte Zeiten für die Spaßbranche - DER SPIEGEL +2025-08-20 08:27:33,487 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.spiegel.de/netzwelt/games/gamescom-2025-in-koeln-harte-zeiten-fuer-die-spassbranche-a-8c9bf6ff-7c79-4b41-a258-a8b0fe60c4f7&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3WHPfdQA9_GLb7dunmnB1a (Versuch 1) +2025-08-20 08:27:33,705 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:33,706 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:33,706 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:33,706 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.spiegel.de/netzwelt/games/gamescom-2025-in-koeln-harte-zeiten-fuer-die-spassbranche-a-8c9bf6ff-7c79-4b41-a258-a8b0fe60c4f7&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3WHPfdQA9_GLb7dunmnB1a +2025-08-20 08:27:33,709 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.spiegel.de/netzwelt/games/gamescom-2025-in-koeln-harte-zeiten-fuer-die-spassbranche-a-8c9bf6ff-7c79-4b41-a258-a8b0fe60c4f7&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3WHPfdQA9_GLb7dunmnB1a +2025-08-20 08:27:33,946 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:33,946 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.spiegel.de/netzwelt/games/gamescom-2025-in-koeln-harte-zeiten-fuer-die-spassbranche-a-8c9bf6ff-7c79-4b41-a258-a8b0fe60c4f7&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3WHPfdQA9_GLb7dunmnB1a +2025-08-20 08:27:33,947 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Gamescom 2025 in Köln: Harte Zeiten für die Spaßbranche - DER SPIEGEL' extrahiert +2025-08-20 08:27:33,947 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Gamescom 2025 in Köln: Harte Zeiten für die Spaßbranche - DER SPIEGEL +2025-08-20 08:27:33,948 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Videospiel-Messe in Köln: Gamescom 2025 – Parkplätze, Toiletten, Verpflegung +2025-08-20 08:27:33,948 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://rp-online.de/digitales/games/gamescom/videospiel-messe-in-koeln-gamescom-2025-parkplaetze-toiletten-verpflegung-v1_aid-24360691&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0gvygeAFwk9oOITrE1LeGY (Versuch 1) +2025-08-20 08:27:34,183 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:34,183 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:34,184 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:34,184 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://rp-online.de/digitales/games/gamescom/videospiel-messe-in-koeln-gamescom-2025-parkplaetze-toiletten-verpflegung-v1_aid-24360691&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0gvygeAFwk9oOITrE1LeGY +2025-08-20 08:27:34,187 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://rp-online.de/digitales/games/gamescom/videospiel-messe-in-koeln-gamescom-2025-parkplaetze-toiletten-verpflegung-v1_aid-24360691&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0gvygeAFwk9oOITrE1LeGY +2025-08-20 08:27:34,390 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:34,390 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://rp-online.de/digitales/games/gamescom/videospiel-messe-in-koeln-gamescom-2025-parkplaetze-toiletten-verpflegung-v1_aid-24360691&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0gvygeAFwk9oOITrE1LeGY +2025-08-20 08:27:34,391 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Videospiel-Messe in Köln: Gamescom 2025 – Parkplätze, Toiletten, Verpflegung' extrahiert +2025-08-20 08:27:34,391 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Videospiel-Messe in Köln: Gamescom 2025 – Parkplätze, Toiletten, Verpflegung +2025-08-20 08:27:34,392 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Das sind die Spiele der gamescom 2025 - Fragster +2025-08-20 08:27:34,392 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fragster.de/das-sind-die-spiele-der-gamescom-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3zb8d-Ga08YcvwVYYzFYlH (Versuch 1) +2025-08-20 08:27:34,601 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-20 08:27:34,602 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-20 08:27:34,602 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-20 08:27:34,602 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fragster.de/das-sind-die-spiele-der-gamescom-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3zb8d-Ga08YcvwVYYzFYlH +2025-08-20 08:27:34,605 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fragster.de/das-sind-die-spiele-der-gamescom-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3zb8d-Ga08YcvwVYYzFYlH +2025-08-20 08:27:34,860 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-20 08:27:34,860 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fragster.de/das-sind-die-spiele-der-gamescom-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3zb8d-Ga08YcvwVYYzFYlH +2025-08-20 08:27:34,861 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Das sind die Spiele der gamescom 2025 - Fragster' extrahiert +2025-08-20 08:27:34,861 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Das sind die Spiele der gamescom 2025 - Fragster +2025-08-20 08:27:34,862 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 5 neue Artikel aus https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-20 08:27:35,885 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:27:35,885 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 13 neue Artikel in 45.10s hinzugefügt +2025-08-20 08:27:36,966 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:27:36,966 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:11,800 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:11,802 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:11,836 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:28:12,432 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:12,432 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:25,058 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:25,060 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:25,091 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:28:25,661 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:25,661 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:29,947 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:29,948 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:29,979 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:28:30,551 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:30,551 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:35,883 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:35,884 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:35,926 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:28:36,526 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:36,526 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:47,735 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:47,736 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:47,769 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:28:48,373 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:48,374 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:52,801 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:52,802 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:52,837 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:28:53,418 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:53,418 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:58,392 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:58,393 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:28:58,426 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:28:59,019 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:28:59,019 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:29:51,584 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:29:51,586 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:30:30,725 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:30:30,726 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:30:30,760 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:30:31,336 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:30:31,337 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:30:43,469 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:30:43,470 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:30:43,507 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:30:44,085 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:30:44,086 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:30:52,581 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:30:52,582 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:30:52,606 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:30:53,170 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:30:53,170 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:31:02,271 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:31:02,272 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:38:33,587 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:38:33,590 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:38:33,620 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:38:34,244 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:38:34,244 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:38:38,790 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:38:38,790 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:38:58,420 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:38:58,421 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-20 08:38:58,440 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-20 08:38:59,018 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-20 08:38:59,018 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-22 20:04:02,055 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-22 20:04:02,056 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-22 20:04:19,289 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-22 20:04:19,290 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-22 20:12:56,470 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-22 20:12:56,472 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-22 20:12:56,489 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-22 20:12:57,079 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-22 20:12:57,079 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-22 20:13:00,439 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-22 20:13:00,440 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-22 20:24:28,719 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-22 20:24:28,721 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-22 20:24:28,739 - INFO - save_articles:144 - ✅ 148 Artikel gespeichert +2025-08-22 20:24:29,312 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-22 20:24:29,312 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:09:59,010 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-24 10:09:59,012 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:10:03,980 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-24 10:10:03,980 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:10:03,984 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-24 10:10:03,984 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:10:03,987 - INFO - load_articles:124 - ✅ 148 Artikel geladen +2025-08-24 10:10:03,987 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-24 10:10:04,472 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-24 10:10:04,472 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-24 10:10:04,474 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-24 10:10:04,474 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-24 10:10:04,475 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-24 10:10:04,475 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-24 10:10:04,476 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-24 10:10:04,477 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-24 10:10:04,477 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-24 10:10:04,478 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-24 10:10:04,478 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-24 10:10:04,479 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-24 10:10:04,479 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-24 10:10:05,485 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-24 10:10:05,997 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-24 10:10:05,998 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-24 10:10:05,999 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-24 10:10:05,999 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-24 10:10:06,364 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:06,365 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:06,367 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-24 10:10:06,367 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-24 10:10:06,368 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-24 10:10:06,368 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-24 10:10:06,368 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-24 10:10:07,473 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:07,475 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:07,477 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-24 10:10:07,477 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-24 10:10:07,477 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-24 10:10:07,478 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-24 10:10:07,478 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-24 10:10:07,990 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:07,991 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:07,991 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-24 10:10:07,992 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-24 10:10:07,992 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-24 10:10:07,992 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-24 10:10:07,992 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-24 10:10:08,630 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:08,631 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:08,632 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-24 10:10:08,632 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-24 10:10:08,632 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-24 10:10:08,633 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-24 10:10:08,633 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-24 10:10:09,006 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:09,008 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:09,010 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-24 10:10:09,010 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-24 10:10:09,011 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-24 10:10:09,011 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-24 10:10:09,011 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-24 10:10:09,530 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:09,531 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:09,532 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-24 10:10:09,532 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-24 10:10:09,532 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-24 10:10:09,532 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-24 10:10:09,532 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-24 10:10:09,773 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:09,774 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:09,774 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:09,775 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-24 10:10:09,775 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:09,778 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-24 10:10:09,778 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-24 10:10:09,779 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-24 10:10:09,779 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-24 10:10:10,672 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:10,674 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:10,677 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-24 10:10:10,686 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-24 10:10:10,686 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-24 10:10:10,687 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-24 10:10:10,687 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-24 10:10:10,946 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:10,948 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:10,950 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-24 10:10:10,951 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-24 10:10:10,951 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-24 10:10:10,951 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-24 10:10:10,951 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-24 10:10:11,784 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:11,785 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:11,787 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-24 10:10:11,787 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-24 10:10:11,788 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-24 10:10:11,788 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-24 10:10:11,788 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-24 10:10:12,934 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:12,935 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:12,936 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-24 10:10:12,937 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-24 10:10:12,937 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-24 10:10:12,937 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-24 10:10:12,937 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-24 10:10:12,938 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-24 10:10:13,832 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:13,834 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:13,834 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-24 10:10:13,835 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-24 10:10:13,835 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-24 10:10:13,835 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-24 10:10:13,836 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-24 10:10:14,887 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:14,889 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:14,890 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-24 10:10:14,890 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-24 10:10:14,891 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-24 10:10:14,891 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-24 10:10:14,891 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-24 10:10:15,824 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:15,825 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:15,826 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-24 10:10:15,827 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-24 10:10:15,827 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-24 10:10:15,827 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-24 10:10:15,827 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-24 10:10:16,519 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:16,520 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:16,521 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-24 10:10:16,521 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-24 10:10:16,522 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-24 10:10:16,522 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-24 10:10:16,522 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-24 10:10:17,373 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:17,374 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:17,375 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-24 10:10:17,376 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-24 10:10:17,376 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-24 10:10:17,376 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-24 10:10:17,376 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-24 10:10:18,466 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:18,468 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:18,469 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-24 10:10:18,470 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-24 10:10:18,470 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-24 10:10:18,470 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-24 10:10:18,470 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-24 10:10:19,250 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:19,251 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:19,252 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-24 10:10:19,252 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-24 10:10:19,252 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-24 10:10:19,253 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-24 10:10:19,253 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-24 10:10:20,159 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:20,160 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:20,161 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:20,161 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-24 10:10:20,162 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:20,165 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-24 10:10:20,165 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-24 10:10:20,166 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-24 10:10:21,171 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-24 10:10:21,749 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-24 10:10:21,749 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-24 10:10:21,750 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.promobil.de/tipps/lesestoff-buch-tipps-camping-freizeit/ +2025-08-24 10:10:22,243 - INFO - extract_images_with_metadata:167 - 🔍 16 img-Tags gefunden +2025-08-24 10:10:22,244 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Frau lesend beim Camping... +2025-08-24 10:10:22,244 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Buchtipps, Lesestoff, Camping, Bücher... +2025-08-24 10:10:22,244 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-24 10:10:22,245 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-24 10:10:22,245 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.promobil.de/tipps/lesestoff-buch-tipps-camping-freizeit/: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-24 10:10:22,245 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für '5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping' extrahiert +2025-08-24 10:10:22,245 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: 5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping +2025-08-24 10:10:22,249 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.promobil.de/tipps/download-stellplatz-radar-app-kostenlos/ +2025-08-24 10:10:22,651 - INFO - extract_images_with_metadata:167 - 🔍 25 img-Tags gefunden +2025-08-24 10:10:22,651 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Stellplatz-Radar-App... +2025-08-24 10:10:22,652 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Stellplatz-Radar-App... +2025-08-24 10:10:22,652 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Stellplatz-Radar-App... +2025-08-24 10:10:22,652 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Mit der Touren-Funktion können Sie Ihre ganz persö... +2025-08-24 10:10:22,652 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Einfache Suche - entweder direkt über die Karte mi... +2025-08-24 10:10:22,652 - INFO - extract_images_with_metadata:193 - 🎉 5 Bilder erfolgreich extrahiert von https://www.promobil.de/tipps/download-stellplatz-radar-app-kostenlos/ +2025-08-24 10:10:22,653 - INFO - fetch_and_process_feed:244 - 🖼️ 5 Bilder für 'Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen' extrahiert +2025-08-24 10:10:22,653 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen +2025-08-24 10:10:22,654 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrzeugtechnik am Wohnmobil im Detail: Windschutzscheiben sind längst mehr als Glas +2025-08-24 10:10:22,657 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-24 10:10:22,658 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-24 10:10:22,659 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-24 10:10:22,660 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-24 10:10:22,661 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-24 10:10:22,662 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-24 10:10:22,664 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-24 10:10:22,665 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-24 10:10:22,667 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-24 10:10:22,668 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-24 10:10:22,669 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-24 10:10:22,670 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-24 10:10:22,671 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-24 10:10:22,673 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-24 10:10:22,673 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-24 10:10:22,674 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-24 10:10:22,677 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-24 10:10:22,677 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 2 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-24 10:10:23,682 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-24 10:10:24,170 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach camping +2025-08-24 10:10:24,170 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-24 10:10:24,172 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-24 10:10:24,174 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-24 10:10:24,176 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem +2025-08-24 10:10:24,177 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Inklusiver Campingurlaub am Gardasee +2025-08-24 10:10:24,177 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/153661/6094377 (Versuch 1) +2025-08-24 10:10:24,509 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:24,510 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 616 Wörter +2025-08-24 10:10:24,510 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 616 Wörter +2025-08-24 10:10:24,511 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Inklusiver Campingurlaub am Gardasee +2025-08-24 10:10:24,512 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025 +2025-08-24 10:10:24,512 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-24 10:10:24,512 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/170000/6091414 (Versuch 1) +2025-08-24 10:10:25,296 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:25,297 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 191 Wörter +2025-08-24 10:10:25,297 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 191 Wörter +2025-08-24 10:10:25,298 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-24 10:10:25,299 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt +2025-08-24 10:10:25,300 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: RTLZWEI: Erfolgreicher Montag mit "Bella Italia - Camping auf Deutsch" +2025-08-24 10:10:25,301 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-24 10:10:25,301 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-24 10:10:25,781 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:25,783 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-24 10:10:25,783 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-24 10:10:25,784 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-24 10:10:25,785 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-24 10:10:25,785 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/102577/6085137 (Versuch 1) +2025-08-24 10:10:26,326 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:26,328 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 1226 Wörter +2025-08-24 10:10:26,328 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1226 Wörter +2025-08-24 10:10:26,329 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-24 10:10:26,329 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-24 10:10:27,334 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-24 10:10:27,599 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil +2025-08-24 10:10:27,599 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-24 10:10:27,601 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/67955/6101192 +2025-08-24 10:10:28,082 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-24 10:10:28,083 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/67955/6101192 +2025-08-24 10:10:28,083 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Fast jeder Zweite träumt vom Van-Life / HEM-Umfrage zeigt: Das Fahrzeug wird immer häufiger zur mobilen Unterkunft' extrahiert +2025-08-24 10:10:28,083 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Fast jeder Zweite träumt vom Van-Life / HEM-Umfrage zeigt: Das Fahrzeug wird immer häufiger zur mobilen Unterkunft +2025-08-24 10:10:28,083 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen +2025-08-24 10:10:28,083 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/65031/6100268 (Versuch 1) +2025-08-24 10:10:28,393 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:28,393 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 576 Wörter +2025-08-24 10:10:28,393 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 576 Wörter +2025-08-24 10:10:28,394 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/65031/6100268 +2025-08-24 10:10:28,703 - INFO - extract_images_with_metadata:167 - 🔍 7 img-Tags gefunden +2025-08-24 10:10:28,703 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/65031/6100268 +2025-08-24 10:10:28,703 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen' extrahiert +2025-08-24 10:10:28,703 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen +2025-08-24 10:10:28,704 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Akku leer: Gefahren beim Laden von E-Bikes +2025-08-24 10:10:28,705 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-24 10:10:28,705 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco +2025-08-24 10:10:28,706 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall +2025-08-24 10:10:28,706 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-24 10:10:28,706 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/105254/6091837 (Versuch 1) +2025-08-24 10:10:29,188 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:29,190 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-24 10:10:29,190 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-24 10:10:29,190 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-24 10:10:29,684 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 10:10:29,685 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-24 10:10:29,686 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-24 10:10:29,686 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-24 10:10:29,688 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Trotz Camper-Hype: Der Pkw ist die unangefochtene Nummer 1 für Sommerreisen +2025-08-24 10:10:29,689 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Doppelfolge am 24. Juli "Oksana & Family - Alles auf Anfang": Abwasserprobleme, Jobsuche und Tonstudiobesuch +2025-08-24 10:10:29,689 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 2 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-24 10:10:30,694 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://caravan-news.de/rss/schlagzeilen.php +2025-08-24 10:10:31,177 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: CARAVAN-NEWS.de +2025-08-24 10:10:31,177 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://caravan-news.de/rss/schlagzeilen.php +2025-08-24 10:10:32,182 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-24 10:10:32,757 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Campingplatz +2025-08-24 10:10:32,757 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-24 10:10:32,758 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping auf Schloss Sigrön: Natururlaub mit Stil in Brandenburg - AUTO BILD +2025-08-24 10:10:32,758 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autobild.de/artikel/luxus-camping-auf-schloss-sigroen-28240471.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zNVAffLcLpjFYvlSTrl2J (Versuch 1) +2025-08-24 10:10:33,136 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:33,137 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:33,137 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:33,137 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.autobild.de/artikel/luxus-camping-auf-schloss-sigroen-28240471.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zNVAffLcLpjFYvlSTrl2J +2025-08-24 10:10:33,140 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autobild.de/artikel/luxus-camping-auf-schloss-sigroen-28240471.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zNVAffLcLpjFYvlSTrl2J +2025-08-24 10:10:33,347 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:33,347 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.autobild.de/artikel/luxus-camping-auf-schloss-sigroen-28240471.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zNVAffLcLpjFYvlSTrl2J +2025-08-24 10:10:33,348 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Camping auf Schloss Sigrön: Natururlaub mit Stil in Brandenburg - AUTO BILD' extrahiert +2025-08-24 10:10:33,348 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Camping auf Schloss Sigrön: Natururlaub mit Stil in Brandenburg - AUTO BILD +2025-08-24 10:10:33,348 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Baden-Württemberg punktet mit einem der schönsten Wellness-Campingplätze - FNP +2025-08-24 10:10:33,349 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/deutschland/wellness-campingplatz-schoenster-europas-baden-wuerttemberg-schwarzwaelder-hof-zr-93897610.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0B3Cmtfk2_cSBV9jpW2E29 (Versuch 1) +2025-08-24 10:10:33,680 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:33,681 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:33,681 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:33,681 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/deutschland/wellness-campingplatz-schoenster-europas-baden-wuerttemberg-schwarzwaelder-hof-zr-93897610.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0B3Cmtfk2_cSBV9jpW2E29 +2025-08-24 10:10:33,684 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/deutschland/wellness-campingplatz-schoenster-europas-baden-wuerttemberg-schwarzwaelder-hof-zr-93897610.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0B3Cmtfk2_cSBV9jpW2E29 +2025-08-24 10:10:33,876 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:33,876 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/deutschland/wellness-campingplatz-schoenster-europas-baden-wuerttemberg-schwarzwaelder-hof-zr-93897610.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0B3Cmtfk2_cSBV9jpW2E29 +2025-08-24 10:10:33,877 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Baden-Württemberg punktet mit einem der schönsten Wellness-Campingplätze - FNP' extrahiert +2025-08-24 10:10:33,877 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Baden-Württemberg punktet mit einem der schönsten Wellness-Campingplätze - FNP +2025-08-24 10:10:33,878 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus +2025-08-24 10:10:33,878 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0gk8c4QL1MtBwuHQJQHYXL (Versuch 1) +2025-08-24 10:10:34,215 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:34,215 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:34,215 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:34,215 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0gk8c4QL1MtBwuHQJQHYXL +2025-08-24 10:10:34,217 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0gk8c4QL1MtBwuHQJQHYXL +2025-08-24 10:10:34,403 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:34,403 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0gk8c4QL1MtBwuHQJQHYXL +2025-08-24 10:10:34,403 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus' extrahiert +2025-08-24 10:10:34,403 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus +2025-08-24 10:10:34,403 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Falkensteiner Favorit - Containerdorf als Nächtigungskrösus Klagenfurts | krone.at +2025-08-24 10:10:34,403 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.krone.at/3876891&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1woffiV_WLFd90nrB2FkoT (Versuch 1) +2025-08-24 10:10:34,709 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:34,710 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:34,710 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:34,710 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.krone.at/3876891&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1woffiV_WLFd90nrB2FkoT +2025-08-24 10:10:34,713 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.krone.at/3876891&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1woffiV_WLFd90nrB2FkoT +2025-08-24 10:10:34,918 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:34,918 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.krone.at/3876891&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1woffiV_WLFd90nrB2FkoT +2025-08-24 10:10:34,919 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Falkensteiner Favorit - Containerdorf als Nächtigungskrösus Klagenfurts | krone.at' extrahiert +2025-08-24 10:10:34,919 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Falkensteiner Favorit - Containerdorf als Nächtigungskrösus Klagenfurts | krone.at +2025-08-24 10:10:34,920 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Markanter Umschwung steht bevor – Am 27. August dreht sich das Wetter erneut +2025-08-24 10:10:34,920 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/sich-das-wetter-erneut-naechster-markanter-umschwung-bevor-am-27-august-dreht-zr-93893449.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ML-ydsKFV3aAS_kW-OJoY (Versuch 1) +2025-08-24 10:10:35,265 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:35,266 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:35,266 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:35,267 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/sich-das-wetter-erneut-naechster-markanter-umschwung-bevor-am-27-august-dreht-zr-93893449.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ML-ydsKFV3aAS_kW-OJoY +2025-08-24 10:10:35,270 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/sich-das-wetter-erneut-naechster-markanter-umschwung-bevor-am-27-august-dreht-zr-93893449.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ML-ydsKFV3aAS_kW-OJoY +2025-08-24 10:10:35,490 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:35,491 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/sich-das-wetter-erneut-naechster-markanter-umschwung-bevor-am-27-august-dreht-zr-93893449.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ML-ydsKFV3aAS_kW-OJoY +2025-08-24 10:10:35,491 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Markanter Umschwung steht bevor – Am 27. August dreht sich das Wetter erneut' extrahiert +2025-08-24 10:10:35,491 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Markanter Umschwung steht bevor – Am 27. August dreht sich das Wetter erneut +2025-08-24 10:10:35,492 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Reportage: Sommerparadies Bodensee - Camping in Gohren - SWR Aktuell +2025-08-24 10:10:35,492 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/sommerparadies-bodensee-dokumentation-vom-campingplatz-gohren-bei-kressbronn-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3dRHXspfNHNEiPRBrJOeLi (Versuch 1) +2025-08-24 10:10:35,819 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:35,820 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:35,821 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:35,821 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/sommerparadies-bodensee-dokumentation-vom-campingplatz-gohren-bei-kressbronn-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3dRHXspfNHNEiPRBrJOeLi +2025-08-24 10:10:35,824 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/sommerparadies-bodensee-dokumentation-vom-campingplatz-gohren-bei-kressbronn-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3dRHXspfNHNEiPRBrJOeLi +2025-08-24 10:10:36,026 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:36,026 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/sommerparadies-bodensee-dokumentation-vom-campingplatz-gohren-bei-kressbronn-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3dRHXspfNHNEiPRBrJOeLi +2025-08-24 10:10:36,027 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Reportage: Sommerparadies Bodensee - Camping in Gohren - SWR Aktuell' extrahiert +2025-08-24 10:10:36,027 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Reportage: Sommerparadies Bodensee - Camping in Gohren - SWR Aktuell +2025-08-24 10:10:36,028 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Video: Wie Nadine Zappe Marmeladenglasmomente auf ihrem Campingplatz schafft +2025-08-24 10:10:36,028 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nordschleswiger.dk/de/nordschleswig-hadersleben/im-video-wie-nadine-zappe-marmeladenglasmomente-ihrem-campingplatz&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0GFYeBShFgu1NUoM6G-5G_ (Versuch 1) +2025-08-24 10:10:36,377 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:36,378 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:36,378 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:36,378 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nordschleswiger.dk/de/nordschleswig-hadersleben/im-video-wie-nadine-zappe-marmeladenglasmomente-ihrem-campingplatz&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0GFYeBShFgu1NUoM6G-5G_ +2025-08-24 10:10:36,380 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nordschleswiger.dk/de/nordschleswig-hadersleben/im-video-wie-nadine-zappe-marmeladenglasmomente-ihrem-campingplatz&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0GFYeBShFgu1NUoM6G-5G_ +2025-08-24 10:10:36,572 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:36,572 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.nordschleswiger.dk/de/nordschleswig-hadersleben/im-video-wie-nadine-zappe-marmeladenglasmomente-ihrem-campingplatz&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0GFYeBShFgu1NUoM6G-5G_ +2025-08-24 10:10:36,573 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Im Video: Wie Nadine Zappe Marmeladenglasmomente auf ihrem Campingplatz schafft' extrahiert +2025-08-24 10:10:36,573 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Im Video: Wie Nadine Zappe Marmeladenglasmomente auf ihrem Campingplatz schafft +2025-08-24 10:10:36,574 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hund bei Eisenhüttenstadt: Badestellen in der Region – wo Hunde erlaubt sind - MOZ.de +2025-08-24 10:10:36,574 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.moz.de/lokales/eisenhuettenstadt/hund-in-eisenhuettenstadt-badestellen-in-der-region-wo-hunde-erlaubt-sind-78262165.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0AJpWSxdJOcPug6TRkVtzZ (Versuch 1) +2025-08-24 10:10:36,920 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:36,920 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:36,920 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:36,921 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.moz.de/lokales/eisenhuettenstadt/hund-in-eisenhuettenstadt-badestellen-in-der-region-wo-hunde-erlaubt-sind-78262165.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0AJpWSxdJOcPug6TRkVtzZ +2025-08-24 10:10:36,922 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.moz.de/lokales/eisenhuettenstadt/hund-in-eisenhuettenstadt-badestellen-in-der-region-wo-hunde-erlaubt-sind-78262165.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0AJpWSxdJOcPug6TRkVtzZ +2025-08-24 10:10:37,253 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:37,253 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.moz.de/lokales/eisenhuettenstadt/hund-in-eisenhuettenstadt-badestellen-in-der-region-wo-hunde-erlaubt-sind-78262165.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0AJpWSxdJOcPug6TRkVtzZ +2025-08-24 10:10:37,254 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Hund bei Eisenhüttenstadt: Badestellen in der Region – wo Hunde erlaubt sind - MOZ.de' extrahiert +2025-08-24 10:10:37,254 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Hund bei Eisenhüttenstadt: Badestellen in der Region – wo Hunde erlaubt sind - MOZ.de +2025-08-24 10:10:37,254 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Beliebtes Medikament löst Krebs aus – Forschende entschlüsseln rätselhaften Mechanismus +2025-08-24 10:10:37,255 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/brustkrebs-medikament-loest-gebaermutterkrebs-forschende-entschluesseln-raetselhaften-mechanismus-93897055.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw29FN0GWoPTgcf0krxruWOo (Versuch 1) +2025-08-24 10:10:37,472 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:37,473 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:37,473 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:37,473 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/brustkrebs-medikament-loest-gebaermutterkrebs-forschende-entschluesseln-raetselhaften-mechanismus-93897055.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw29FN0GWoPTgcf0krxruWOo +2025-08-24 10:10:37,476 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/brustkrebs-medikament-loest-gebaermutterkrebs-forschende-entschluesseln-raetselhaften-mechanismus-93897055.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw29FN0GWoPTgcf0krxruWOo +2025-08-24 10:10:37,775 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:37,775 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/brustkrebs-medikament-loest-gebaermutterkrebs-forschende-entschluesseln-raetselhaften-mechanismus-93897055.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw29FN0GWoPTgcf0krxruWOo +2025-08-24 10:10:37,776 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Beliebtes Medikament löst Krebs aus – Forschende entschlüsseln rätselhaften Mechanismus' extrahiert +2025-08-24 10:10:37,776 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Beliebtes Medikament löst Krebs aus – Forschende entschlüsseln rätselhaften Mechanismus +2025-08-24 10:10:37,776 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Massive Unwetter an Adria-Küste: Sintflutartige Regenfälle, Hagel und Sturm über Italien ... +2025-08-24 10:10:37,776 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/und-sturm-ueber-italien-und-kroatien-massive-unwetter-an-adria-kueste-sintflutartige-regenfaelle-hagel-zr-93892020.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1nftLRtaIVhcLaTEABSHrB (Versuch 1) +2025-08-24 10:10:37,979 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:37,980 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:37,980 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:37,980 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/und-sturm-ueber-italien-und-kroatien-massive-unwetter-an-adria-kueste-sintflutartige-regenfaelle-hagel-zr-93892020.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1nftLRtaIVhcLaTEABSHrB +2025-08-24 10:10:37,981 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/und-sturm-ueber-italien-und-kroatien-massive-unwetter-an-adria-kueste-sintflutartige-regenfaelle-hagel-zr-93892020.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1nftLRtaIVhcLaTEABSHrB +2025-08-24 10:10:38,427 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:38,427 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/und-sturm-ueber-italien-und-kroatien-massive-unwetter-an-adria-kueste-sintflutartige-regenfaelle-hagel-zr-93892020.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1nftLRtaIVhcLaTEABSHrB +2025-08-24 10:10:38,427 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Massive Unwetter an Adria-Küste: Sintflutartige Regenfälle, Hagel und Sturm über Italien ...' extrahiert +2025-08-24 10:10:38,428 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Massive Unwetter an Adria-Küste: Sintflutartige Regenfälle, Hagel und Sturm über Italien ... +2025-08-24 10:10:38,428 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hurrikan Erin rast über Atlantik – Überreste bescheren Europa völlig neues August-Wetter +2025-08-24 10:10:38,428 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/ueberreste-bescheren-europa-voellig-neues-august-wetter-hurrikan-erin-rast-ueber-atlantik-zr-93891473.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3MwCg1CMlAsF_p3SDGs51a (Versuch 1) +2025-08-24 10:10:38,629 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:38,629 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:38,630 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:38,630 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/ueberreste-bescheren-europa-voellig-neues-august-wetter-hurrikan-erin-rast-ueber-atlantik-zr-93891473.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3MwCg1CMlAsF_p3SDGs51a +2025-08-24 10:10:38,633 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/ueberreste-bescheren-europa-voellig-neues-august-wetter-hurrikan-erin-rast-ueber-atlantik-zr-93891473.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3MwCg1CMlAsF_p3SDGs51a +2025-08-24 10:10:39,024 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:39,024 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/ueberreste-bescheren-europa-voellig-neues-august-wetter-hurrikan-erin-rast-ueber-atlantik-zr-93891473.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3MwCg1CMlAsF_p3SDGs51a +2025-08-24 10:10:39,025 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Hurrikan Erin rast über Atlantik – Überreste bescheren Europa völlig neues August-Wetter' extrahiert +2025-08-24 10:10:39,025 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Hurrikan Erin rast über Atlantik – Überreste bescheren Europa völlig neues August-Wetter +2025-08-24 10:10:39,026 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Grabenstätt: Urlauberin verletzt sich bei Auffahrunfall - Bayernwelle +2025-08-24 10:10:39,026 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.bayernwelle.de/grabenstaett-urlauberin-verletzt-sich-bei-auffahrunfall-181471/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zpwbOIg41UNO80I-NPAJa (Versuch 1) +2025-08-24 10:10:39,344 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:39,345 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:39,345 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:39,345 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.bayernwelle.de/grabenstaett-urlauberin-verletzt-sich-bei-auffahrunfall-181471/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zpwbOIg41UNO80I-NPAJa +2025-08-24 10:10:39,346 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.bayernwelle.de/grabenstaett-urlauberin-verletzt-sich-bei-auffahrunfall-181471/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zpwbOIg41UNO80I-NPAJa +2025-08-24 10:10:39,599 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:39,599 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.bayernwelle.de/grabenstaett-urlauberin-verletzt-sich-bei-auffahrunfall-181471/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zpwbOIg41UNO80I-NPAJa +2025-08-24 10:10:39,600 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Grabenstätt: Urlauberin verletzt sich bei Auffahrunfall - Bayernwelle' extrahiert +2025-08-24 10:10:39,600 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Grabenstätt: Urlauberin verletzt sich bei Auffahrunfall - Bayernwelle +2025-08-24 10:10:39,600 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show +2025-08-24 10:10:39,600 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897475.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2oJIq2dgPq8t0LP0XDZdKi (Versuch 1) +2025-08-24 10:10:39,989 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:39,990 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:39,990 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:39,990 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897475.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2oJIq2dgPq8t0LP0XDZdKi +2025-08-24 10:10:39,993 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897475.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2oJIq2dgPq8t0LP0XDZdKi +2025-08-24 10:10:40,399 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:40,399 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897475.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2oJIq2dgPq8t0LP0XDZdKi +2025-08-24 10:10:40,400 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show' extrahiert +2025-08-24 10:10:40,400 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show +2025-08-24 10:10:40,400 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show +2025-08-24 10:10:40,400 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/welt/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897439.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0jViaY7obKQso9Kan2s9bu (Versuch 1) +2025-08-24 10:10:40,625 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:40,626 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:40,626 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:40,627 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/welt/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897439.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0jViaY7obKQso9Kan2s9bu +2025-08-24 10:10:40,630 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/welt/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897439.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0jViaY7obKQso9Kan2s9bu +2025-08-24 10:10:40,920 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:40,921 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/welt/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897439.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0jViaY7obKQso9Kan2s9bu +2025-08-24 10:10:40,921 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show' extrahiert +2025-08-24 10:10:40,921 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show +2025-08-24 10:10:40,922 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Kroatien: Unwetter nach spektakulärer Wolkenfront an Adria-Küste schocken Camper +2025-08-24 10:10:40,922 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.wa.de/welt/unwetter-verwuesten-campingplaetze-in-kroatien-spektakulaere-wolkenfront-ueber-adria-kueste-sind-abgereist-93896644.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1A80We_i-8fwM_o4mV4XtR (Versuch 1) +2025-08-24 10:10:41,122 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:41,123 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:41,123 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:41,123 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.wa.de/welt/unwetter-verwuesten-campingplaetze-in-kroatien-spektakulaere-wolkenfront-ueber-adria-kueste-sind-abgereist-93896644.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1A80We_i-8fwM_o4mV4XtR +2025-08-24 10:10:41,126 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.wa.de/welt/unwetter-verwuesten-campingplaetze-in-kroatien-spektakulaere-wolkenfront-ueber-adria-kueste-sind-abgereist-93896644.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1A80We_i-8fwM_o4mV4XtR +2025-08-24 10:10:41,448 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:41,448 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.wa.de/welt/unwetter-verwuesten-campingplaetze-in-kroatien-spektakulaere-wolkenfront-ueber-adria-kueste-sind-abgereist-93896644.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1A80We_i-8fwM_o4mV4XtR +2025-08-24 10:10:41,449 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Kroatien: Unwetter nach spektakulärer Wolkenfront an Adria-Küste schocken Camper' extrahiert +2025-08-24 10:10:41,449 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Kroatien: Unwetter nach spektakulärer Wolkenfront an Adria-Küste schocken Camper +2025-08-24 10:10:41,449 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Campingplatz am Nidda-Stausee mit guter sehr Auslastung - FNP +2025-08-24 10:10:41,450 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/lokales/wetteraukreis/campingplatz-am-nidda-stausee-mit-guter-sehr-auslastung-93896554.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2kxM3SOZlO-z81GBidTt9J (Versuch 1) +2025-08-24 10:10:41,671 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:41,672 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:41,672 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:41,672 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/lokales/wetteraukreis/campingplatz-am-nidda-stausee-mit-guter-sehr-auslastung-93896554.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2kxM3SOZlO-z81GBidTt9J +2025-08-24 10:10:41,675 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/lokales/wetteraukreis/campingplatz-am-nidda-stausee-mit-guter-sehr-auslastung-93896554.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2kxM3SOZlO-z81GBidTt9J +2025-08-24 10:10:42,078 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:42,079 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/lokales/wetteraukreis/campingplatz-am-nidda-stausee-mit-guter-sehr-auslastung-93896554.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2kxM3SOZlO-z81GBidTt9J +2025-08-24 10:10:42,079 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Campingplatz am Nidda-Stausee mit guter sehr Auslastung - FNP' extrahiert +2025-08-24 10:10:42,080 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Campingplatz am Nidda-Stausee mit guter sehr Auslastung - FNP +2025-08-24 10:10:42,080 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Ein beliebter DDR-Campingplatz auf Ostsee-Insel könnte verschwinden - Nordkurier +2025-08-24 10:10:42,081 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/usedom/dieser-beliebte-ddr-campingplatz-auf-ostsee-insel-koennte-verschwinden-3838218&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3O6pcTG4aS_ju-I0Zfu9Qo (Versuch 1) +2025-08-24 10:10:42,293 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:42,294 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:42,294 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:42,294 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/usedom/dieser-beliebte-ddr-campingplatz-auf-ostsee-insel-koennte-verschwinden-3838218&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3O6pcTG4aS_ju-I0Zfu9Qo +2025-08-24 10:10:42,296 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/usedom/dieser-beliebte-ddr-campingplatz-auf-ostsee-insel-koennte-verschwinden-3838218&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3O6pcTG4aS_ju-I0Zfu9Qo +2025-08-24 10:10:42,664 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:42,664 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/usedom/dieser-beliebte-ddr-campingplatz-auf-ostsee-insel-koennte-verschwinden-3838218&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3O6pcTG4aS_ju-I0Zfu9Qo +2025-08-24 10:10:42,665 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Ein beliebter DDR-Campingplatz auf Ostsee-Insel könnte verschwinden - Nordkurier' extrahiert +2025-08-24 10:10:42,665 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Ein beliebter DDR-Campingplatz auf Ostsee-Insel könnte verschwinden - Nordkurier +2025-08-24 10:10:42,666 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Unfall auf Campingplatz bei Cavallino - jesolo-magazin.com +2025-08-24 10:10:42,666 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://jesolo-magazin.com/unfall-auf-campingplatz-bei-cavallino/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13Q4Q-rLFodoIaqrD3ZobU (Versuch 1) +2025-08-24 10:10:43,014 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:43,015 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:43,015 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:43,015 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://jesolo-magazin.com/unfall-auf-campingplatz-bei-cavallino/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13Q4Q-rLFodoIaqrD3ZobU +2025-08-24 10:10:43,018 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://jesolo-magazin.com/unfall-auf-campingplatz-bei-cavallino/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13Q4Q-rLFodoIaqrD3ZobU +2025-08-24 10:10:43,245 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:43,245 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://jesolo-magazin.com/unfall-auf-campingplatz-bei-cavallino/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13Q4Q-rLFodoIaqrD3ZobU +2025-08-24 10:10:43,246 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Unfall auf Campingplatz bei Cavallino - jesolo-magazin.com' extrahiert +2025-08-24 10:10:43,246 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Unfall auf Campingplatz bei Cavallino - jesolo-magazin.com +2025-08-24 10:10:43,247 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: „Drei Nächte durchvisioniert“: Freystädter Paar verliebt sich in Campingplatz in Thüringen +2025-08-24 10:10:43,247 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/neumarkt/drei-nachte-durchvisioniert-freystadter-paar-verliebt-sich-in-campingplatz-in-thuringen-1.14802417&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1vOac9UH70ipnEbOKDZ0De (Versuch 1) +2025-08-24 10:10:43,540 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:43,541 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:43,541 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:43,541 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/neumarkt/drei-nachte-durchvisioniert-freystadter-paar-verliebt-sich-in-campingplatz-in-thuringen-1.14802417&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1vOac9UH70ipnEbOKDZ0De +2025-08-24 10:10:43,545 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/neumarkt/drei-nachte-durchvisioniert-freystadter-paar-verliebt-sich-in-campingplatz-in-thuringen-1.14802417&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1vOac9UH70ipnEbOKDZ0De +2025-08-24 10:10:43,735 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:43,736 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.nn.de/region/neumarkt/drei-nachte-durchvisioniert-freystadter-paar-verliebt-sich-in-campingplatz-in-thuringen-1.14802417&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1vOac9UH70ipnEbOKDZ0De +2025-08-24 10:10:43,737 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für '„Drei Nächte durchvisioniert“: Freystädter Paar verliebt sich in Campingplatz in Thüringen' extrahiert +2025-08-24 10:10:43,737 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: „Drei Nächte durchvisioniert“: Freystädter Paar verliebt sich in Campingplatz in Thüringen +2025-08-24 10:10:43,737 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schwimmbad und Campingplatz: Mieses Wetter, mieses Geschäft? - Badische Zeitung +2025-08-24 10:10:43,737 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.badische-zeitung.de/schwimmbad-und-campingplatz-mieses-wetter-mieses-geschaeft&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ztU82SEKVMrArG_bbQbUi (Versuch 1) +2025-08-24 10:10:44,064 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:44,065 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:44,065 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:44,066 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.badische-zeitung.de/schwimmbad-und-campingplatz-mieses-wetter-mieses-geschaeft&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ztU82SEKVMrArG_bbQbUi +2025-08-24 10:10:44,068 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.badische-zeitung.de/schwimmbad-und-campingplatz-mieses-wetter-mieses-geschaeft&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ztU82SEKVMrArG_bbQbUi +2025-08-24 10:10:44,269 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:44,269 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.badische-zeitung.de/schwimmbad-und-campingplatz-mieses-wetter-mieses-geschaeft&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ztU82SEKVMrArG_bbQbUi +2025-08-24 10:10:44,270 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Schwimmbad und Campingplatz: Mieses Wetter, mieses Geschäft? - Badische Zeitung' extrahiert +2025-08-24 10:10:44,270 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Schwimmbad und Campingplatz: Mieses Wetter, mieses Geschäft? - Badische Zeitung +2025-08-24 10:10:44,270 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 20 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-24 10:10:45,275 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-24 10:10:45,876 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Vanlife +2025-08-24 10:10:45,877 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-24 10:10:46,882 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-24 10:10:47,381 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Camping Termine 2024 +2025-08-24 10:10:47,382 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-24 10:10:48,387 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-24 10:10:48,877 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert - Camping Messe 2025 +2025-08-24 10:10:48,878 - INFO - fetch_and_process_feed:187 - 📰 1 Einträge gefunden +2025-08-24 10:10:48,878 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: In Düsseldorf schlägt das „Herz des Caravanings“ - Niederrhein Nachrichten +2025-08-24 10:10:48,879 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.niederrhein-nachrichten.de/nachrichten/in-duesseldorf-schlaegt-das-herz-des-caravanings-11957.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11bSejssd9woRFps5qaXVQ (Versuch 1) +2025-08-24 10:10:49,310 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 10:10:49,310 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 10:10:49,310 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 10:10:49,310 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.niederrhein-nachrichten.de/nachrichten/in-duesseldorf-schlaegt-das-herz-des-caravanings-11957.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11bSejssd9woRFps5qaXVQ +2025-08-24 10:10:49,312 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.niederrhein-nachrichten.de/nachrichten/in-duesseldorf-schlaegt-das-herz-des-caravanings-11957.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11bSejssd9woRFps5qaXVQ +2025-08-24 10:10:49,560 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 10:10:49,560 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.niederrhein-nachrichten.de/nachrichten/in-duesseldorf-schlaegt-das-herz-des-caravanings-11957.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11bSejssd9woRFps5qaXVQ +2025-08-24 10:10:49,561 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'In Düsseldorf schlägt das „Herz des Caravanings“ - Niederrhein Nachrichten' extrahiert +2025-08-24 10:10:49,561 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: In Düsseldorf schlägt das „Herz des Caravanings“ - Niederrhein Nachrichten +2025-08-24 10:10:49,561 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-24 10:10:50,591 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:10:50,591 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 25 neue Artikel in 46.61s hinzugefügt +2025-08-24 10:10:51,681 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:10:51,682 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:14,975 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:14,976 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:15,002 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:11:15,569 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:15,570 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:37,133 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:37,134 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:37,167 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:11:37,734 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:37,735 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:43,062 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:43,062 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:43,093 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:11:43,662 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:43,663 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:50,638 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:50,639 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:50,672 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:11:51,228 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:51,228 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:54,885 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:54,885 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:11:54,924 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:11:55,488 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:11:55,489 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:03,451 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:03,452 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:03,498 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:04,067 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:04,067 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:08,142 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:08,142 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:08,187 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:08,754 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:08,754 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:13,133 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:13,134 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:13,184 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:13,745 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:13,745 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:20,577 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:20,578 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:20,618 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:21,187 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:21,187 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:26,560 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:26,561 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:26,597 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:27,163 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:27,163 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:39,394 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:39,395 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:39,429 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:39,999 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:39,999 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:43,287 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:43,287 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:43,319 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:43,882 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:43,883 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:48,525 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:48,526 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:48,569 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:49,131 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:49,131 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:52,629 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:52,630 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:52,660 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:53,228 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:53,228 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:57,904 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:57,905 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:12:57,944 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:12:58,512 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:12:58,513 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:03,089 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:03,090 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:03,120 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:13:03,689 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:03,689 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:08,281 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:08,282 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:08,313 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:13:08,877 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:08,877 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:12,776 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:12,776 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:12,812 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:13:13,376 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:13,376 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:19,128 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:19,129 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:19,159 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:13:19,720 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:19,721 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:34,473 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:34,474 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:34,495 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:13:35,060 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:35,060 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:42,250 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:42,251 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:42,272 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:13:42,840 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:42,840 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:57,801 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:57,801 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:13:57,824 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:13:58,389 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:13:58,389 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:14:03,902 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:14:03,903 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:14:03,925 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:14:04,462 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:14:04,463 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:14:15,464 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:14:15,465 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:19:19,298 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:19:19,300 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:19:19,320 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:19:19,938 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:19:19,938 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:19:24,733 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:19:24,734 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:20:00,917 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:20:00,918 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:20:00,937 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:20:01,520 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:20:01,520 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:20:15,308 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:20:15,309 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:20:15,314 - INFO - rewrite_articles:320 - ✍️ Starte Artikel-Umschreibung +2025-08-24 10:20:15,320 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:20:15,320 - INFO - rewrite_articles:337 - ✍️ Umschreiben von: 5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping +2025-08-24 10:20:29,212 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-24 10:20:31,802 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-24 10:20:31,816 - INFO - rewrite_articles:392 - ✅ Artikel erfolgreich umgeschrieben: 5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping +2025-08-24 10:20:33,821 - INFO - rewrite_articles:337 - ✍️ Umschreiben von: Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen +2025-08-24 10:20:55,230 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-24 10:20:56,784 - INFO - _send_single_request:1025 - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" +2025-08-24 10:20:56,786 - INFO - rewrite_articles:392 - ✅ Artikel erfolgreich umgeschrieben: Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen +2025-08-24 10:20:58,822 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:20:58,822 - INFO - rewrite_articles:404 - 🎉 2 Artikel erfolgreich umgeschrieben +2025-08-24 10:20:59,902 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:20:59,903 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:21:13,570 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:21:13,571 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:21:33,232 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:21:33,232 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:21:33,248 - INFO - __init__:51 - ✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String +2025-08-24 10:21:34,068 - INFO - _get_default_category_id:87 - ✅ Standard-Kategorie 'Allgemein' gefunden: ID 1 +2025-08-24 10:21:34,068 - INFO - test_connection:338 - 🔧 Teste WordPress-API-Verbindung mit Base64-Auth... +2025-08-24 10:21:34,068 - INFO - test_connection:342 - 🔑 Authorization Header: Basic b2dpZXJ0ejp3aE... +2025-08-24 10:21:34,537 - INFO - test_connection:351 - 📡 API-Response Status: 200 +2025-08-24 10:21:34,538 - INFO - test_connection:352 - 📡 API-Response Headers: {'Content-Type': 'application/json; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-WS-RateLimit-Limit': '1000', 'X-WS-RateLimit-Remaining': '998', 'Date': 'Sun, 24 Aug 2025 08:21:34 GMT', 'Server': 'Apache', 'X-Powered-By': 'PHP/8.2.29', 'Pragma': 'no-cache', 'X-Robots-Tag': 'noindex', 'X-Content-Type-Options': 'nosniff', 'Access-Control-Expose-Headers': 'X-WP-Total, X-WP-TotalPages, Link', 'Access-Control-Allow-Headers': 'Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type', 'X-WP-Total': '4', 'X-WP-TotalPages': '4', 'Link': '; rel="next"', 'Allow': 'GET, POST', 'Expires': 'Wed, 11 Jan 1984 05:00:00 GMT', 'Cache-Control': 'no-cache, must-revalidate, max-age=0, no-store, private'} +2025-08-24 10:21:34,538 - INFO - test_connection:355 - ✅ WordPress-API-Verbindung erfolgreich +2025-08-24 10:21:34,538 - INFO - upload_article:249 - 📤 Starte WordPress-Upload: 5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping +2025-08-24 10:21:36,177 - INFO - _get_or_create_tags:135 - ✅ Existierender Tag gefunden: 'Camping' (ID: 194) +2025-08-24 10:21:37,200 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Buchempfehlungen' (ID: 952) +2025-08-24 10:21:38,429 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Reiseliteratur' (ID: 953) +2025-08-24 10:21:39,452 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'VW Bulli' (ID: 954) +2025-08-24 10:21:40,374 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Deutschland Reiseführer' (ID: 955) +2025-08-24 10:21:40,374 - INFO - _get_or_create_tags:158 - 🏷️ Tags verarbeitet: 5 Tag-IDs erstellt +2025-08-24 10:21:40,374 - INFO - _prepare_post_data:194 - 📝 Post-Daten vorbereitet: Titel='5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping', Tags=5, Kategorie=1 +2025-08-24 10:21:40,899 - INFO - upload_article:274 - ✅ WordPress-Upload erfolgreich: '5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping' (ID: 3450) +2025-08-24 10:21:40,900 - INFO - upload_article:275 - 🔗 WordPress-URL: https://vanityontour.de/?p=3450 +2025-08-24 10:21:40,930 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:21:42,006 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:21:42,006 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:21:48,829 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:21:48,830 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:21:48,847 - INFO - __init__:51 - ✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String +2025-08-24 10:21:49,897 - INFO - _get_default_category_id:87 - ✅ Standard-Kategorie 'Allgemein' gefunden: ID 1 +2025-08-24 10:21:49,898 - INFO - test_connection:338 - 🔧 Teste WordPress-API-Verbindung mit Base64-Auth... +2025-08-24 10:21:49,898 - INFO - test_connection:342 - 🔑 Authorization Header: Basic b2dpZXJ0ejp3aE... +2025-08-24 10:21:50,303 - INFO - test_connection:351 - 📡 API-Response Status: 200 +2025-08-24 10:21:50,303 - INFO - test_connection:352 - 📡 API-Response Headers: {'Content-Type': 'application/json; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-WS-RateLimit-Limit': '1000', 'X-WS-RateLimit-Remaining': '998', 'Date': 'Sun, 24 Aug 2025 08:21:49 GMT', 'Server': 'Apache', 'X-Powered-By': 'PHP/8.2.29', 'Pragma': 'no-cache', 'X-Robots-Tag': 'noindex', 'X-Content-Type-Options': 'nosniff', 'Access-Control-Expose-Headers': 'X-WP-Total, X-WP-TotalPages, Link', 'Access-Control-Allow-Headers': 'Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type', 'X-WP-Total': '4', 'X-WP-TotalPages': '4', 'Link': '; rel="next"', 'Allow': 'GET, POST', 'Expires': 'Wed, 11 Jan 1984 05:00:00 GMT', 'Cache-Control': 'no-cache, must-revalidate, max-age=0, no-store, private'} +2025-08-24 10:21:50,303 - INFO - test_connection:355 - ✅ WordPress-API-Verbindung erfolgreich +2025-08-24 10:21:50,304 - INFO - upload_article:249 - 📤 Starte WordPress-Upload: Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen +2025-08-24 10:21:51,827 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Camping-App' (ID: 956) +2025-08-24 10:21:52,874 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Stellplatz-Suche' (ID: 957) +2025-08-24 10:21:54,505 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Tourenplanung' (ID: 958) +2025-08-24 10:21:55,531 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Belohnungssystem' (ID: 959) +2025-08-24 10:21:56,552 - INFO - _get_or_create_tags:149 - ✅ Neuer Tag erstellt: 'Offline-Nutzung' (ID: 960) +2025-08-24 10:21:56,553 - INFO - _get_or_create_tags:158 - 🏷️ Tags verarbeitet: 5 Tag-IDs erstellt +2025-08-24 10:21:56,553 - INFO - _prepare_post_data:194 - 📝 Post-Daten vorbereitet: Titel='Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen', Tags=5, Kategorie=1 +2025-08-24 10:21:57,168 - INFO - upload_article:274 - ✅ WordPress-Upload erfolgreich: 'Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen' (ID: 3451) +2025-08-24 10:21:57,169 - INFO - upload_article:275 - 🔗 WordPress-URL: https://vanityontour.de/?p=3451 +2025-08-24 10:21:57,198 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:21:58,273 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:21:58,273 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:22:04,650 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:22:04,650 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:22:18,508 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:22:18,508 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:22:25,053 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:22:25,054 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:23:19,394 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:23:19,396 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:23:19,416 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:23:20,016 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:23:20,017 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:23:24,070 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:23:24,070 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:23:24,093 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:23:24,741 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:23:24,742 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:23:28,665 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:23:28,665 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:23:28,691 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:23:29,266 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:23:29,266 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:23:34,957 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:23:34,957 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 10:23:34,972 - INFO - save_articles:144 - ✅ 173 Artikel gespeichert +2025-08-24 10:23:35,545 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 10:23:35,545 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:25:18,745 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 12:25:18,748 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:25:30,654 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 12:25:30,654 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:25:44,151 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 12:25:44,152 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:34:34,587 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 12:34:34,588 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:34:34,590 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-24 12:34:34,591 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:34:34,595 - INFO - load_articles:124 - ✅ 173 Artikel geladen +2025-08-24 12:34:34,595 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-24 12:34:35,252 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-24 12:34:35,252 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-24 12:34:35,256 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-24 12:34:35,256 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-24 12:34:35,257 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-24 12:34:35,258 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-24 12:34:35,258 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-24 12:34:35,259 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-24 12:34:35,259 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-24 12:34:35,260 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-24 12:34:35,260 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-24 12:34:35,261 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-24 12:34:35,261 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-24 12:34:36,266 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-24 12:34:36,832 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-24 12:34:36,833 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-24 12:34:36,833 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-24 12:34:36,833 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-24 12:34:37,689 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:37,691 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:37,693 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-24 12:34:37,693 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-24 12:34:37,693 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-24 12:34:37,694 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-24 12:34:37,694 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-24 12:34:37,992 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:37,994 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:37,995 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-24 12:34:37,996 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-24 12:34:37,996 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-24 12:34:37,996 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-24 12:34:37,996 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-24 12:34:38,444 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:38,445 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:38,446 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-24 12:34:38,447 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-24 12:34:38,447 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-24 12:34:38,447 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-24 12:34:38,447 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-24 12:34:39,357 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:39,358 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:39,359 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-24 12:34:39,359 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-24 12:34:39,359 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-24 12:34:39,360 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-24 12:34:39,360 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-24 12:34:39,787 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:39,788 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:39,790 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-24 12:34:39,790 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-24 12:34:39,791 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-24 12:34:39,791 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-24 12:34:39,791 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-24 12:34:40,289 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:40,289 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:40,289 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-24 12:34:40,290 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-24 12:34:40,290 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-24 12:34:40,290 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-24 12:34:40,290 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-24 12:34:41,843 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:41,844 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:41,844 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:34:41,845 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-24 12:34:41,845 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:34:41,848 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-24 12:34:41,848 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-24 12:34:41,848 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-24 12:34:41,848 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-24 12:34:42,638 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:42,640 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:42,643 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-24 12:34:42,643 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-24 12:34:42,643 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-24 12:34:42,644 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-24 12:34:42,644 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-24 12:34:43,069 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:43,071 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:43,073 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-24 12:34:43,074 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-24 12:34:43,074 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-24 12:34:43,074 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-24 12:34:43,074 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-24 12:34:43,436 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:43,437 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:43,438 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-24 12:34:43,438 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-24 12:34:43,439 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-24 12:34:43,439 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-24 12:34:43,439 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-24 12:34:44,580 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:44,581 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:44,581 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-24 12:34:44,582 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-24 12:34:44,582 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-24 12:34:44,582 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-24 12:34:44,583 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-24 12:34:44,583 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-24 12:34:45,232 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:45,233 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:45,234 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-24 12:34:45,234 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-24 12:34:45,234 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-24 12:34:45,235 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-24 12:34:45,235 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-24 12:34:46,657 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:46,659 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:46,660 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-24 12:34:46,660 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-24 12:34:46,661 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-24 12:34:46,661 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-24 12:34:46,661 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-24 12:34:47,643 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:47,644 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:47,645 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-24 12:34:47,646 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-24 12:34:47,646 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-24 12:34:47,646 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-24 12:34:47,646 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-24 12:34:48,298 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:48,300 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:48,301 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-24 12:34:48,301 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-24 12:34:48,302 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-24 12:34:48,302 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-24 12:34:48,302 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-24 12:34:49,285 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:49,287 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:49,288 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-24 12:34:49,289 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-24 12:34:49,289 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-24 12:34:49,289 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-24 12:34:49,289 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-24 12:34:50,849 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:50,851 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:50,853 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-24 12:34:50,853 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-24 12:34:50,853 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-24 12:34:50,854 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-24 12:34:50,854 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-24 12:34:51,762 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:51,763 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:51,764 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-24 12:34:51,764 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-24 12:34:51,764 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-24 12:34:51,765 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-24 12:34:51,765 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-24 12:34:52,579 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:34:52,580 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:52,581 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:34:52,581 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-24 12:34:52,581 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:34:52,584 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-24 12:34:52,585 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-24 12:34:52,585 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-24 12:34:53,590 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-24 12:34:54,224 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-24 12:34:54,224 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-24 12:34:54,225 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping +2025-08-24 12:34:54,227 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen +2025-08-24 12:34:54,228 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrzeugtechnik am Wohnmobil im Detail: Windschutzscheiben sind längst mehr als Glas +2025-08-24 12:34:54,229 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-24 12:34:54,229 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-24 12:34:54,230 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-24 12:34:54,231 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-24 12:34:54,232 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-24 12:34:54,232 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-24 12:34:54,233 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-24 12:34:54,234 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-24 12:34:54,235 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-24 12:34:54,235 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-24 12:34:54,236 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-24 12:34:54,237 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-24 12:34:54,238 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-24 12:34:54,239 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-24 12:34:54,240 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-24 12:34:54,241 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-24 12:34:54,243 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-24 12:34:54,243 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-24 12:34:55,248 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-24 12:34:55,731 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach camping +2025-08-24 12:34:55,731 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-24 12:34:55,733 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-24 12:34:55,734 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-24 12:34:55,735 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem +2025-08-24 12:34:55,736 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Inklusiver Campingurlaub am Gardasee +2025-08-24 12:34:55,736 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/153661/6094377 (Versuch 1) +2025-08-24 12:34:56,227 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:56,228 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 616 Wörter +2025-08-24 12:34:56,229 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 616 Wörter +2025-08-24 12:34:56,229 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Inklusiver Campingurlaub am Gardasee +2025-08-24 12:34:56,230 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025 +2025-08-24 12:34:56,230 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-24 12:34:56,230 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/170000/6091414 (Versuch 1) +2025-08-24 12:34:56,707 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:56,707 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 191 Wörter +2025-08-24 12:34:56,708 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 191 Wörter +2025-08-24 12:34:56,708 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-24 12:34:56,710 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt +2025-08-24 12:34:56,711 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: RTLZWEI: Erfolgreicher Montag mit "Bella Italia - Camping auf Deutsch" +2025-08-24 12:34:56,711 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-24 12:34:56,711 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-24 12:34:57,013 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:57,013 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-24 12:34:57,013 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-24 12:34:57,014 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-24 12:34:57,014 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-24 12:34:57,014 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/102577/6085137 (Versuch 1) +2025-08-24 12:34:57,353 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:57,355 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 1226 Wörter +2025-08-24 12:34:57,356 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1226 Wörter +2025-08-24 12:34:57,356 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-24 12:34:57,356 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-24 12:34:58,362 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-24 12:34:58,814 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil +2025-08-24 12:34:58,814 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-24 12:34:58,817 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fast jeder Zweite träumt vom Van-Life / HEM-Umfrage zeigt: Das Fahrzeug wird immer häufiger zur mobilen Unterkunft +2025-08-24 12:34:58,817 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen +2025-08-24 12:34:58,817 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/65031/6100268 (Versuch 1) +2025-08-24 12:34:59,284 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:59,285 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 576 Wörter +2025-08-24 12:34:59,286 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 576 Wörter +2025-08-24 12:34:59,287 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen +2025-08-24 12:34:59,288 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Akku leer: Gefahren beim Laden von E-Bikes +2025-08-24 12:34:59,289 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-24 12:34:59,290 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco +2025-08-24 12:34:59,290 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall +2025-08-24 12:34:59,291 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-24 12:34:59,291 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/105254/6091837 (Versuch 1) +2025-08-24 12:34:59,666 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:34:59,668 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-24 12:34:59,668 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-24 12:34:59,668 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-24 12:35:00,137 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 12:35:00,138 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-24 12:35:00,138 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-24 12:35:00,138 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-24 12:35:00,139 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Trotz Camper-Hype: Der Pkw ist die unangefochtene Nummer 1 für Sommerreisen +2025-08-24 12:35:00,139 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Doppelfolge am 24. Juli "Oksana & Family - Alles auf Anfang": Abwasserprobleme, Jobsuche und Tonstudiobesuch +2025-08-24 12:35:00,139 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-24 12:35:01,144 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://caravan-news.de/rss/schlagzeilen.php +2025-08-24 12:35:01,501 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: CARAVAN-NEWS.de +2025-08-24 12:35:01,502 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://caravan-news.de/rss/schlagzeilen.php +2025-08-24 12:35:02,506 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-24 12:35:03,268 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Campingplatz +2025-08-24 12:35:03,268 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-24 12:35:03,268 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Wanderin stürzt in Inzigkofen in Felsspalte und verletzt sich schwer - SWR +2025-08-24 12:35:03,268 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/rettungseinsatz-verunfallte-wanderin-auf-gespaltenem-felsen-in-inzigkofen-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gMED6SXGchOupYUXtrmm5 (Versuch 1) +2025-08-24 12:35:03,561 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:03,561 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:03,562 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:03,562 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/rettungseinsatz-verunfallte-wanderin-auf-gespaltenem-felsen-in-inzigkofen-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gMED6SXGchOupYUXtrmm5 +2025-08-24 12:35:03,566 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/rettungseinsatz-verunfallte-wanderin-auf-gespaltenem-felsen-in-inzigkofen-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gMED6SXGchOupYUXtrmm5 +2025-08-24 12:35:03,900 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 12:35:03,901 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/rettungseinsatz-verunfallte-wanderin-auf-gespaltenem-felsen-in-inzigkofen-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gMED6SXGchOupYUXtrmm5 +2025-08-24 12:35:03,901 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Wanderin stürzt in Inzigkofen in Felsspalte und verletzt sich schwer - SWR' extrahiert +2025-08-24 12:35:03,902 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Wanderin stürzt in Inzigkofen in Felsspalte und verletzt sich schwer - SWR +2025-08-24 12:35:03,902 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Feuerwehr-Großeinsatz: Brand auf Campingplatz - Waldsee/Altrip - DIE RHEINPFALZ +2025-08-24 12:35:03,902 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/rhein-pfalz-kreis_artikel,-feuerwehr-gro%25C3%259Feinsatz-brand-auf-campingplatz-_arid,5805271.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1TSMKiXF4mmTlvxWL7YX5l (Versuch 1) +2025-08-24 12:35:04,123 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:04,124 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:04,124 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:04,124 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/rhein-pfalz-kreis_artikel,-feuerwehr-gro%25C3%259Feinsatz-brand-auf-campingplatz-_arid,5805271.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1TSMKiXF4mmTlvxWL7YX5l +2025-08-24 12:35:04,128 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/rhein-pfalz-kreis_artikel,-feuerwehr-gro%25C3%259Feinsatz-brand-auf-campingplatz-_arid,5805271.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1TSMKiXF4mmTlvxWL7YX5l +2025-08-24 12:35:04,491 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 12:35:04,491 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/rhein-pfalz-kreis_artikel,-feuerwehr-gro%25C3%259Feinsatz-brand-auf-campingplatz-_arid,5805271.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1TSMKiXF4mmTlvxWL7YX5l +2025-08-24 12:35:04,492 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Feuerwehr-Großeinsatz: Brand auf Campingplatz - Waldsee/Altrip - DIE RHEINPFALZ' extrahiert +2025-08-24 12:35:04,492 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Feuerwehr-Großeinsatz: Brand auf Campingplatz - Waldsee/Altrip - DIE RHEINPFALZ +2025-08-24 12:35:04,492 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Campingplatz Rheinblick in Baumberg: Beliebte Anlage stets ausgebucht - ANTENNE NRW +2025-08-24 12:35:04,493 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://antenne.nrw/nrw/campingplatz-rheinblick-in-baumberg-beliebte-anlage-stets-ausgebucht/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2SXFc61ANwrL7rZl7c_Nfl (Versuch 1) +2025-08-24 12:35:04,833 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:04,834 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:04,835 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:04,835 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://antenne.nrw/nrw/campingplatz-rheinblick-in-baumberg-beliebte-anlage-stets-ausgebucht/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2SXFc61ANwrL7rZl7c_Nfl +2025-08-24 12:35:04,838 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://antenne.nrw/nrw/campingplatz-rheinblick-in-baumberg-beliebte-anlage-stets-ausgebucht/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2SXFc61ANwrL7rZl7c_Nfl +2025-08-24 12:35:05,063 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 12:35:05,064 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://antenne.nrw/nrw/campingplatz-rheinblick-in-baumberg-beliebte-anlage-stets-ausgebucht/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2SXFc61ANwrL7rZl7c_Nfl +2025-08-24 12:35:05,064 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Campingplatz Rheinblick in Baumberg: Beliebte Anlage stets ausgebucht - ANTENNE NRW' extrahiert +2025-08-24 12:35:05,064 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Campingplatz Rheinblick in Baumberg: Beliebte Anlage stets ausgebucht - ANTENNE NRW +2025-08-24 12:35:05,065 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Bauernregeln für den September 2025: Prognose im 100-jährigen Kalender hat es in sich +2025-08-24 12:35:05,065 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bauernregeln-fuer-den-september-2025-prognose-im-100-jaehrigen-kalender-hat-es-in-sich-93896711.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3Kgg_g2rdEMvf_9AOgPtGj (Versuch 1) +2025-08-24 12:35:05,354 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:05,355 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:05,355 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:05,355 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bauernregeln-fuer-den-september-2025-prognose-im-100-jaehrigen-kalender-hat-es-in-sich-93896711.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3Kgg_g2rdEMvf_9AOgPtGj +2025-08-24 12:35:05,357 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bauernregeln-fuer-den-september-2025-prognose-im-100-jaehrigen-kalender-hat-es-in-sich-93896711.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3Kgg_g2rdEMvf_9AOgPtGj +2025-08-24 12:35:05,573 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 12:35:05,573 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bauernregeln-fuer-den-september-2025-prognose-im-100-jaehrigen-kalender-hat-es-in-sich-93896711.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3Kgg_g2rdEMvf_9AOgPtGj +2025-08-24 12:35:05,573 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Bauernregeln für den September 2025: Prognose im 100-jährigen Kalender hat es in sich' extrahiert +2025-08-24 12:35:05,573 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Bauernregeln für den September 2025: Prognose im 100-jährigen Kalender hat es in sich +2025-08-24 12:35:05,574 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping auf Schloss Sigrön: Natururlaub mit Stil in Brandenburg - AUTO BILD +2025-08-24 12:35:05,574 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autobild.de/artikel/luxus-camping-auf-schloss-sigroen-28240471.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zNVAffLcLpjFYvlSTrl2J (Versuch 1) +2025-08-24 12:35:05,880 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:05,881 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:05,881 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:05,882 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.autobild.de/artikel/luxus-camping-auf-schloss-sigroen-28240471.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zNVAffLcLpjFYvlSTrl2J +2025-08-24 12:35:05,884 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping auf Schloss Sigrön: Natururlaub mit Stil in Brandenburg - AUTO BILD +2025-08-24 12:35:05,884 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Baden-Württemberg punktet mit einem der schönsten Wellness-Campingplätze - FNP +2025-08-24 12:35:05,885 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/deutschland/wellness-campingplatz-schoenster-europas-baden-wuerttemberg-schwarzwaelder-hof-zr-93897610.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0B3Cmtfk2_cSBV9jpW2E29 (Versuch 1) +2025-08-24 12:35:06,120 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:06,121 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:06,121 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:06,121 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/deutschland/wellness-campingplatz-schoenster-europas-baden-wuerttemberg-schwarzwaelder-hof-zr-93897610.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0B3Cmtfk2_cSBV9jpW2E29 +2025-08-24 12:35:06,125 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Baden-Württemberg punktet mit einem der schönsten Wellness-Campingplätze - FNP +2025-08-24 12:35:06,125 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus +2025-08-24 12:35:06,126 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0gk8c4QL1MtBwuHQJQHYXL (Versuch 1) +2025-08-24 12:35:06,408 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:06,409 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:06,409 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:06,409 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0gk8c4QL1MtBwuHQJQHYXL +2025-08-24 12:35:06,413 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus +2025-08-24 12:35:06,413 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Falkensteiner Favorit - Containerdorf als Nächtigungskrösus Klagenfurts | krone.at +2025-08-24 12:35:06,414 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.krone.at/3876891&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1woffiV_WLFd90nrB2FkoT (Versuch 1) +2025-08-24 12:35:06,641 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:06,641 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:06,642 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:06,642 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.krone.at/3876891&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1woffiV_WLFd90nrB2FkoT +2025-08-24 12:35:06,645 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Falkensteiner Favorit - Containerdorf als Nächtigungskrösus Klagenfurts | krone.at +2025-08-24 12:35:06,646 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Kirche auf dem Campingplatz - Erzbistum Freiburg +2025-08-24 12:35:06,646 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.ebfr.de/detail/nachricht/id/227960-kirche-auf-dem-campingplatz/%3Fcb-id%3D12338393&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9x3XKrza6eMUdU7OgV2Y (Versuch 1) +2025-08-24 12:35:07,055 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:07,056 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:07,056 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:07,056 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.ebfr.de/detail/nachricht/id/227960-kirche-auf-dem-campingplatz/%3Fcb-id%3D12338393&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9x3XKrza6eMUdU7OgV2Y +2025-08-24 12:35:07,059 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.ebfr.de/detail/nachricht/id/227960-kirche-auf-dem-campingplatz/%3Fcb-id%3D12338393&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9x3XKrza6eMUdU7OgV2Y +2025-08-24 12:35:07,458 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 12:35:07,459 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.ebfr.de/detail/nachricht/id/227960-kirche-auf-dem-campingplatz/%3Fcb-id%3D12338393&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9x3XKrza6eMUdU7OgV2Y +2025-08-24 12:35:07,460 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Kirche auf dem Campingplatz - Erzbistum Freiburg' extrahiert +2025-08-24 12:35:07,460 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Kirche auf dem Campingplatz - Erzbistum Freiburg +2025-08-24 12:35:07,460 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Letzter Ausweg Campingplatz - Flucht aus der Großstadt - Programme TV ce soir - Télérama +2025-08-24 12:35:07,460 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://television.telerama.fr/tele/documentaire/letzter-ausweg-campingplatz-flucht-aus-der-gro-stadt-1-386085864.php&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0yphKSHd_DWg5hgH0yY59p (Versuch 1) +2025-08-24 12:35:07,688 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:07,689 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:07,689 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:07,690 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://television.telerama.fr/tele/documentaire/letzter-ausweg-campingplatz-flucht-aus-der-gro-stadt-1-386085864.php&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0yphKSHd_DWg5hgH0yY59p +2025-08-24 12:35:07,693 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://television.telerama.fr/tele/documentaire/letzter-ausweg-campingplatz-flucht-aus-der-gro-stadt-1-386085864.php&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0yphKSHd_DWg5hgH0yY59p +2025-08-24 12:35:08,131 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 12:35:08,131 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://television.telerama.fr/tele/documentaire/letzter-ausweg-campingplatz-flucht-aus-der-gro-stadt-1-386085864.php&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0yphKSHd_DWg5hgH0yY59p +2025-08-24 12:35:08,132 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Letzter Ausweg Campingplatz - Flucht aus der Großstadt - Programme TV ce soir - Télérama' extrahiert +2025-08-24 12:35:08,132 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Letzter Ausweg Campingplatz - Flucht aus der Großstadt - Programme TV ce soir - Télérama +2025-08-24 12:35:08,133 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Markanter Umschwung steht bevor – Am 27. August dreht sich das Wetter erneut +2025-08-24 12:35:08,133 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/sich-das-wetter-erneut-naechster-markanter-umschwung-bevor-am-27-august-dreht-zr-93893449.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ML-ydsKFV3aAS_kW-OJoY (Versuch 1) +2025-08-24 12:35:08,502 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:08,503 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:08,503 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:08,503 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/sich-das-wetter-erneut-naechster-markanter-umschwung-bevor-am-27-august-dreht-zr-93893449.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ML-ydsKFV3aAS_kW-OJoY +2025-08-24 12:35:08,507 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Markanter Umschwung steht bevor – Am 27. August dreht sich das Wetter erneut +2025-08-24 12:35:08,508 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Reportage: Sommerparadies Bodensee - Camping in Gohren - SWR Aktuell +2025-08-24 12:35:08,508 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/sommerparadies-bodensee-dokumentation-vom-campingplatz-gohren-bei-kressbronn-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3dRHXspfNHNEiPRBrJOeLi (Versuch 1) +2025-08-24 12:35:08,732 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:08,733 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:08,733 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:08,733 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/sommerparadies-bodensee-dokumentation-vom-campingplatz-gohren-bei-kressbronn-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3dRHXspfNHNEiPRBrJOeLi +2025-08-24 12:35:08,736 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Reportage: Sommerparadies Bodensee - Camping in Gohren - SWR Aktuell +2025-08-24 12:35:08,737 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Video: Wie Nadine Zappe Marmeladenglasmomente auf ihrem Campingplatz schafft +2025-08-24 12:35:08,737 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nordschleswiger.dk/de/nordschleswig-hadersleben/im-video-wie-nadine-zappe-marmeladenglasmomente-ihrem-campingplatz&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0GFYeBShFgu1NUoM6G-5G_ (Versuch 1) +2025-08-24 12:35:09,026 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:09,027 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:09,027 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:09,027 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nordschleswiger.dk/de/nordschleswig-hadersleben/im-video-wie-nadine-zappe-marmeladenglasmomente-ihrem-campingplatz&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0GFYeBShFgu1NUoM6G-5G_ +2025-08-24 12:35:09,030 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Video: Wie Nadine Zappe Marmeladenglasmomente auf ihrem Campingplatz schafft +2025-08-24 12:35:09,031 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hund bei Eisenhüttenstadt: Badestellen in der Region – wo Hunde erlaubt sind - MOZ.de +2025-08-24 12:35:09,031 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.moz.de/lokales/eisenhuettenstadt/hund-in-eisenhuettenstadt-badestellen-in-der-region-wo-hunde-erlaubt-sind-78262165.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0AJpWSxdJOcPug6TRkVtzZ (Versuch 1) +2025-08-24 12:35:09,248 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:09,248 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:09,248 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:09,249 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.moz.de/lokales/eisenhuettenstadt/hund-in-eisenhuettenstadt-badestellen-in-der-region-wo-hunde-erlaubt-sind-78262165.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0AJpWSxdJOcPug6TRkVtzZ +2025-08-24 12:35:09,251 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hund bei Eisenhüttenstadt: Badestellen in der Region – wo Hunde erlaubt sind - MOZ.de +2025-08-24 12:35:09,251 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Beliebtes Medikament löst Krebs aus – Forschende entschlüsseln rätselhaften Mechanismus +2025-08-24 12:35:09,251 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/brustkrebs-medikament-loest-gebaermutterkrebs-forschende-entschluesseln-raetselhaften-mechanismus-93897055.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw29FN0GWoPTgcf0krxruWOo (Versuch 1) +2025-08-24 12:35:09,550 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:09,551 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:09,551 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:09,552 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/brustkrebs-medikament-loest-gebaermutterkrebs-forschende-entschluesseln-raetselhaften-mechanismus-93897055.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw29FN0GWoPTgcf0krxruWOo +2025-08-24 12:35:09,556 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Beliebtes Medikament löst Krebs aus – Forschende entschlüsseln rätselhaften Mechanismus +2025-08-24 12:35:09,557 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Massive Unwetter an Adria-Küste: Sintflutartige Regenfälle, Hagel und Sturm über Italien ... +2025-08-24 12:35:09,557 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/und-sturm-ueber-italien-und-kroatien-massive-unwetter-an-adria-kueste-sintflutartige-regenfaelle-hagel-zr-93892020.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1nftLRtaIVhcLaTEABSHrB (Versuch 1) +2025-08-24 12:35:09,773 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:09,774 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:09,774 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:09,775 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/und-sturm-ueber-italien-und-kroatien-massive-unwetter-an-adria-kueste-sintflutartige-regenfaelle-hagel-zr-93892020.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1nftLRtaIVhcLaTEABSHrB +2025-08-24 12:35:09,778 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Massive Unwetter an Adria-Küste: Sintflutartige Regenfälle, Hagel und Sturm über Italien ... +2025-08-24 12:35:09,779 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hurrikan Erin rast über Atlantik – Überreste bescheren Europa völlig neues August-Wetter +2025-08-24 12:35:09,779 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/ueberreste-bescheren-europa-voellig-neues-august-wetter-hurrikan-erin-rast-ueber-atlantik-zr-93891473.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3MwCg1CMlAsF_p3SDGs51a (Versuch 1) +2025-08-24 12:35:10,075 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:10,076 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:10,076 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:10,076 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/ueberreste-bescheren-europa-voellig-neues-august-wetter-hurrikan-erin-rast-ueber-atlantik-zr-93891473.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3MwCg1CMlAsF_p3SDGs51a +2025-08-24 12:35:10,079 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hurrikan Erin rast über Atlantik – Überreste bescheren Europa völlig neues August-Wetter +2025-08-24 12:35:10,080 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Grabenstätt: Urlauberin verletzt sich bei Auffahrunfall - Bayernwelle +2025-08-24 12:35:10,080 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.bayernwelle.de/grabenstaett-urlauberin-verletzt-sich-bei-auffahrunfall-181471/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zpwbOIg41UNO80I-NPAJa (Versuch 1) +2025-08-24 12:35:10,300 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:10,300 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:10,300 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:10,300 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.bayernwelle.de/grabenstaett-urlauberin-verletzt-sich-bei-auffahrunfall-181471/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zpwbOIg41UNO80I-NPAJa +2025-08-24 12:35:10,302 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Grabenstätt: Urlauberin verletzt sich bei Auffahrunfall - Bayernwelle +2025-08-24 12:35:10,302 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show +2025-08-24 12:35:10,302 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897475.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2oJIq2dgPq8t0LP0XDZdKi (Versuch 1) +2025-08-24 12:35:10,597 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:10,597 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:10,598 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:10,598 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897475.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2oJIq2dgPq8t0LP0XDZdKi +2025-08-24 12:35:10,600 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show +2025-08-24 12:35:10,600 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show +2025-08-24 12:35:10,600 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/welt/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897439.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0jViaY7obKQso9Kan2s9bu (Versuch 1) +2025-08-24 12:35:10,808 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:10,809 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:10,809 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:10,809 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.merkur.de/welt/groesster-campingplatz-europas-knietief-unter-wasser-deutsche-kennen-ihn-aus-tv-show-93897439.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0jViaY7obKQso9Kan2s9bu +2025-08-24 12:35:10,812 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Größter Campingplatz Europas knietief unter Wasser – Deutsche kennen ihn aus TV-Show +2025-08-24 12:35:10,812 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 6 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-24 12:35:11,818 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-24 12:35:12,313 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Vanlife +2025-08-24 12:35:12,314 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-24 12:35:13,319 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-24 12:35:13,773 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Camping Termine 2024 +2025-08-24 12:35:13,773 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-24 12:35:14,779 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-24 12:35:15,318 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert - Camping Messe 2025 +2025-08-24 12:35:15,319 - INFO - fetch_and_process_feed:187 - 📰 1 Einträge gefunden +2025-08-24 12:35:15,320 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: In Düsseldorf schlägt das „Herz des Caravanings“ - Niederrhein Nachrichten +2025-08-24 12:35:15,320 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.niederrhein-nachrichten.de/nachrichten/in-duesseldorf-schlaegt-das-herz-des-caravanings-11957.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11bSejssd9woRFps5qaXVQ (Versuch 1) +2025-08-24 12:35:15,552 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 12:35:15,553 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 12:35:15,553 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 12:35:15,553 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.niederrhein-nachrichten.de/nachrichten/in-duesseldorf-schlaegt-das-herz-des-caravanings-11957.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11bSejssd9woRFps5qaXVQ +2025-08-24 12:35:15,557 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: In Düsseldorf schlägt das „Herz des Caravanings“ - Niederrhein Nachrichten +2025-08-24 12:35:15,558 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-24 12:35:16,598 - INFO - save_articles:144 - ✅ 179 Artikel gespeichert +2025-08-24 12:35:16,598 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 6 neue Artikel in 42.01s hinzugefügt +2025-08-24 12:35:17,695 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:35:17,696 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:35:26,462 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:35:26,463 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:35:32,795 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:35:32,796 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:35:58,472 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:35:58,472 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:36:27,960 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:36:27,961 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:36:27,983 - INFO - save_articles:144 - ✅ 179 Artikel gespeichert +2025-08-24 12:36:28,557 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:36:28,557 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:36:45,792 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:36:45,792 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:36:45,814 - INFO - save_articles:144 - ✅ 179 Artikel gespeichert +2025-08-24 12:36:46,373 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:36:46,373 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:36:53,032 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:36:53,033 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:36:53,064 - INFO - save_articles:144 - ✅ 179 Artikel gespeichert +2025-08-24 12:36:53,639 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:36:53,640 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:37:00,227 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:37:00,228 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:37:00,250 - INFO - save_articles:144 - ✅ 179 Artikel gespeichert +2025-08-24 12:37:00,820 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:37:00,821 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:37:04,670 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:37:04,670 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:37:04,692 - INFO - save_articles:144 - ✅ 179 Artikel gespeichert +2025-08-24 12:37:05,265 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:37:05,265 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:37:10,222 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:37:10,222 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:51:20,972 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:51:20,973 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 12:51:21,001 - INFO - save_articles:144 - ✅ 179 Artikel gespeichert +2025-08-24 12:51:21,656 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 12:51:21,656 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:44:20,962 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 14:44:20,964 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:50:51,769 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 14:50:51,769 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:51:02,077 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 14:51:02,078 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:51:34,824 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 14:51:34,824 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:51:48,532 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 14:51:48,532 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:51:48,538 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-24 14:51:48,539 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:51:48,545 - INFO - load_articles:124 - ✅ 179 Artikel geladen +2025-08-24 14:51:48,546 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-24 14:51:49,021 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-24 14:51:49,021 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-24 14:51:49,023 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 15 Jahre PremiumCamps +2025-08-24 14:51:49,024 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Der neue Eriba Feeling und Novaline +2025-08-24 14:51:49,025 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Den eigenen Verbrauchszahlen auf der Spur +2025-08-24 14:51:49,026 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Abenteuer für die Kleinen, Entspannung für +die Großen +2025-08-24 14:51:49,027 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Das weltweit größte Caravaning-Erlebnis +2025-08-24 14:51:49,028 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Komfort und Flexibilität für moderne Camper +2025-08-24 14:51:49,028 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Frühjahrsaktionen vom Verein WOHNmobil für Klimaschutz +2025-08-24 14:51:49,029 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Viel los auf dem Klaukenhof +2025-08-24 14:51:49,029 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping Resort Allweglehen bietet "Wellness plus" +2025-08-24 14:51:49,030 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EU-Führerscheinreform kommt +2025-08-24 14:51:49,030 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-24 14:51:50,035 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-24 14:51:50,625 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-24 14:51:50,625 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-24 14:51:50,626 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-24 14:51:50,626 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-24 14:51:51,515 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:51,517 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:51,518 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-24 14:51:51,519 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-24 14:51:51,520 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-24 14:51:51,520 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-24 14:51:51,521 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-24 14:51:51,943 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:51,944 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:51,946 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-24 14:51:51,946 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-24 14:51:51,947 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-24 14:51:51,947 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-24 14:51:51,947 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-24 14:51:53,695 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:53,696 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:53,697 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-24 14:51:53,698 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-24 14:51:53,698 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-24 14:51:53,698 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-24 14:51:53,698 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-24 14:51:54,495 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:54,496 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:54,497 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-24 14:51:54,497 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-24 14:51:54,498 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-24 14:51:54,498 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-24 14:51:54,498 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-24 14:51:55,096 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:55,097 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:55,099 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-24 14:51:55,100 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-24 14:51:55,100 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-24 14:51:55,100 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-24 14:51:55,100 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-24 14:51:55,632 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:55,633 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:55,633 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-24 14:51:55,633 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-24 14:51:55,633 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-24 14:51:55,633 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-24 14:51:55,634 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-24 14:51:56,926 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:56,927 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:56,927 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:51:56,927 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-24 14:51:56,928 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:51:56,930 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-24 14:51:56,931 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-24 14:51:56,931 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-24 14:51:56,931 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-24 14:51:57,831 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:57,833 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:57,835 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-24 14:51:57,836 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-24 14:51:57,836 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-24 14:51:57,837 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-24 14:51:57,837 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-24 14:51:58,842 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:58,845 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:58,847 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-24 14:51:58,847 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-24 14:51:58,847 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-24 14:51:58,847 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-24 14:51:58,847 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-24 14:51:59,472 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:51:59,473 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:51:59,475 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-24 14:51:59,475 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-24 14:51:59,476 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-24 14:51:59,476 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-24 14:51:59,476 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-24 14:52:01,376 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:01,377 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:01,378 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-24 14:52:01,378 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-24 14:52:01,379 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-24 14:52:01,379 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-24 14:52:01,379 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-24 14:52:01,379 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-24 14:52:02,000 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:02,001 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:02,002 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-24 14:52:02,002 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-24 14:52:02,003 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-24 14:52:02,003 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-24 14:52:02,003 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-24 14:52:03,273 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:03,275 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:03,276 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-24 14:52:03,277 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-24 14:52:03,277 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-24 14:52:03,277 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-24 14:52:03,277 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-24 14:52:04,295 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:04,296 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:04,297 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-24 14:52:04,298 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-24 14:52:04,298 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-24 14:52:04,298 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-24 14:52:04,299 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-24 14:52:05,125 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:05,126 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:05,127 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-24 14:52:05,127 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-24 14:52:05,128 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-24 14:52:05,128 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-24 14:52:05,128 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-24 14:52:06,271 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:06,273 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:06,274 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-24 14:52:06,274 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-24 14:52:06,274 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-24 14:52:06,275 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-24 14:52:06,275 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-24 14:52:07,247 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:07,248 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:07,250 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-24 14:52:07,250 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-24 14:52:07,250 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-24 14:52:07,250 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-24 14:52:07,250 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-24 14:52:08,178 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:08,179 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:08,180 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-24 14:52:08,180 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-24 14:52:08,180 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-24 14:52:08,181 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-24 14:52:08,181 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-24 14:52:08,963 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:08,964 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:08,965 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:08,965 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-24 14:52:08,965 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:08,968 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-24 14:52:08,969 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-24 14:52:08,969 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-24 14:52:09,974 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-24 14:52:10,923 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-24 14:52:10,923 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-24 14:52:10,924 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping +2025-08-24 14:52:10,926 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen +2025-08-24 14:52:10,927 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrzeugtechnik am Wohnmobil im Detail: Windschutzscheiben sind längst mehr als Glas +2025-08-24 14:52:10,928 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-24 14:52:10,928 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-24 14:52:10,929 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-24 14:52:10,930 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-24 14:52:10,931 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-24 14:52:10,931 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-24 14:52:10,932 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-24 14:52:10,933 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-24 14:52:10,934 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-24 14:52:10,935 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-24 14:52:10,935 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-24 14:52:10,936 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-24 14:52:10,936 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-24 14:52:10,937 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-24 14:52:10,938 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-24 14:52:10,939 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-24 14:52:10,940 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Sommerhitze im Wohnmobil & Wohnwagen: Die besten Tipps gegen Hitze im Camper +2025-08-24 14:52:10,940 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-24 14:52:11,945 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-24 14:52:12,486 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach camping +2025-08-24 14:52:12,486 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-24 14:52:12,487 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-24 14:52:12,489 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-24 14:52:12,490 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem +2025-08-24 14:52:12,491 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Inklusiver Campingurlaub am Gardasee +2025-08-24 14:52:12,491 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/153661/6094377 (Versuch 1) +2025-08-24 14:52:12,939 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:12,941 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 616 Wörter +2025-08-24 14:52:12,941 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 616 Wörter +2025-08-24 14:52:12,942 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Inklusiver Campingurlaub am Gardasee +2025-08-24 14:52:12,943 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025 +2025-08-24 14:52:12,943 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-24 14:52:12,943 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/170000/6091414 (Versuch 1) +2025-08-24 14:52:13,446 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:13,446 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 191 Wörter +2025-08-24 14:52:13,447 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 191 Wörter +2025-08-24 14:52:13,447 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-24 14:52:13,451 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt +2025-08-24 14:52:13,451 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: RTLZWEI: Erfolgreicher Montag mit "Bella Italia - Camping auf Deutsch" +2025-08-24 14:52:13,452 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-24 14:52:13,452 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-24 14:52:13,954 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:13,955 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-24 14:52:13,956 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-24 14:52:13,956 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-24 14:52:13,957 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-24 14:52:13,957 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/102577/6085137 (Versuch 1) +2025-08-24 14:52:14,306 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:14,308 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 1226 Wörter +2025-08-24 14:52:14,309 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1226 Wörter +2025-08-24 14:52:14,310 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Family Spots: Diese Reiseziele begeistern Groß und Klein +2025-08-24 14:52:14,310 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-24 14:52:15,315 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-24 14:52:15,734 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil +2025-08-24 14:52:15,734 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-24 14:52:15,737 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fast jeder Zweite träumt vom Van-Life / HEM-Umfrage zeigt: Das Fahrzeug wird immer häufiger zur mobilen Unterkunft +2025-08-24 14:52:15,738 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen +2025-08-24 14:52:15,738 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/65031/6100268 (Versuch 1) +2025-08-24 14:52:16,083 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:16,084 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 576 Wörter +2025-08-24 14:52:16,085 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 576 Wörter +2025-08-24 14:52:16,086 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen +2025-08-24 14:52:16,087 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Akku leer: Gefahren beim Laden von E-Bikes +2025-08-24 14:52:16,088 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-24 14:52:16,089 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco +2025-08-24 14:52:16,090 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall +2025-08-24 14:52:16,091 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-24 14:52:16,091 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/105254/6091837 (Versuch 1) +2025-08-24 14:52:16,371 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:16,372 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-24 14:52:16,372 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-24 14:52:16,372 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-24 14:52:16,850 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-24 14:52:16,851 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-24 14:52:16,852 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-24 14:52:16,852 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-24 14:52:16,853 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Trotz Camper-Hype: Der Pkw ist die unangefochtene Nummer 1 für Sommerreisen +2025-08-24 14:52:16,855 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Doppelfolge am 24. Juli "Oksana & Family - Alles auf Anfang": Abwasserprobleme, Jobsuche und Tonstudiobesuch +2025-08-24 14:52:16,855 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-24 14:52:17,860 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://caravan-news.de/rss/schlagzeilen.php +2025-08-24 14:52:18,322 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: CARAVAN-NEWS.de +2025-08-24 14:52:18,322 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://caravan-news.de/rss/schlagzeilen.php +2025-08-24 14:52:19,327 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-24 14:52:19,985 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Campingplatz +2025-08-24 14:52:19,985 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-24 14:52:19,986 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Campingfreunde: Schauspielkomödie im Theater Fabelhaft - Lübeck live +2025-08-24 14:52:19,986 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.hl-live.de/text.php%3Fid%3D174396&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw249DjhpXTHiYIncHlUdDPR (Versuch 1) +2025-08-24 14:52:20,472 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:20,473 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:20,473 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:20,473 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.hl-live.de/text.php%3Fid%3D174396&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw249DjhpXTHiYIncHlUdDPR +2025-08-24 14:52:20,477 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.hl-live.de/text.php%3Fid%3D174396&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw249DjhpXTHiYIncHlUdDPR +2025-08-24 14:52:20,880 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 14:52:20,880 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.hl-live.de/text.php%3Fid%3D174396&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw249DjhpXTHiYIncHlUdDPR +2025-08-24 14:52:20,881 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Campingfreunde: Schauspielkomödie im Theater Fabelhaft - Lübeck live' extrahiert +2025-08-24 14:52:20,881 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Campingfreunde: Schauspielkomödie im Theater Fabelhaft - Lübeck live +2025-08-24 14:52:20,882 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: „Unumgänglich“: Insolvenz zwingt beliebtes Nordsee-Bad zur Schließung – zwei weitere wackeln +2025-08-24 14:52:20,882 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/schluss-trotz-insolvenz-nach-kosten-explosion-beliebte-baeder-an-der-nordsee-bangen-fuer-eins-ist-endgueltig-93897627.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0az_FaAh6V7hKPgd8NUW8L (Versuch 1) +2025-08-24 14:52:21,258 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:21,259 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:21,259 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:21,259 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/schluss-trotz-insolvenz-nach-kosten-explosion-beliebte-baeder-an-der-nordsee-bangen-fuer-eins-ist-endgueltig-93897627.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0az_FaAh6V7hKPgd8NUW8L +2025-08-24 14:52:21,261 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/schluss-trotz-insolvenz-nach-kosten-explosion-beliebte-baeder-an-der-nordsee-bangen-fuer-eins-ist-endgueltig-93897627.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0az_FaAh6V7hKPgd8NUW8L +2025-08-24 14:52:21,474 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 14:52:21,474 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.hna.de/niedersachsen/schluss-trotz-insolvenz-nach-kosten-explosion-beliebte-baeder-an-der-nordsee-bangen-fuer-eins-ist-endgueltig-93897627.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0az_FaAh6V7hKPgd8NUW8L +2025-08-24 14:52:21,475 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für '„Unumgänglich“: Insolvenz zwingt beliebtes Nordsee-Bad zur Schließung – zwei weitere wackeln' extrahiert +2025-08-24 14:52:21,475 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: „Unumgänglich“: Insolvenz zwingt beliebtes Nordsee-Bad zur Schließung – zwei weitere wackeln +2025-08-24 14:52:21,476 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die Ruheoase im stillen Inselwinkel: So geht es auf dem ersten Campingplatz auf Mallorca zu +2025-08-24 14:52:21,476 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.mallorcamagazin.com/nachrichten/tourismus/2025/08/24/141169/die-ruheoase-stillen-inselwinkel-geht-auf-dem-ersten-campingplatz-auf-mallorca-zu.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3xWU_Q-zQrsTo6QcL_jTJN (Versuch 1) +2025-08-24 14:52:21,771 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:21,772 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:21,772 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:21,772 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.mallorcamagazin.com/nachrichten/tourismus/2025/08/24/141169/die-ruheoase-stillen-inselwinkel-geht-auf-dem-ersten-campingplatz-auf-mallorca-zu.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3xWU_Q-zQrsTo6QcL_jTJN +2025-08-24 14:52:21,774 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.mallorcamagazin.com/nachrichten/tourismus/2025/08/24/141169/die-ruheoase-stillen-inselwinkel-geht-auf-dem-ersten-campingplatz-auf-mallorca-zu.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3xWU_Q-zQrsTo6QcL_jTJN +2025-08-24 14:52:21,991 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 14:52:21,992 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.mallorcamagazin.com/nachrichten/tourismus/2025/08/24/141169/die-ruheoase-stillen-inselwinkel-geht-auf-dem-ersten-campingplatz-auf-mallorca-zu.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3xWU_Q-zQrsTo6QcL_jTJN +2025-08-24 14:52:21,992 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Die Ruheoase im stillen Inselwinkel: So geht es auf dem ersten Campingplatz auf Mallorca zu' extrahiert +2025-08-24 14:52:21,992 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Die Ruheoase im stillen Inselwinkel: So geht es auf dem ersten Campingplatz auf Mallorca zu +2025-08-24 14:52:21,993 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Geplanter Karten-Zwang sorgt für dicke Luft an der Ostsee - Nordkurier +2025-08-24 14:52:21,993 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/mecklenburg-vorpommern/geplanter-karten-zwang-sorgt-fuer-dicke-luft-an-der-ostsee-3864013&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1uwWy7IibmrXt4TIIcCHuT (Versuch 1) +2025-08-24 14:52:22,299 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:22,300 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:22,300 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:22,300 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/mecklenburg-vorpommern/geplanter-karten-zwang-sorgt-fuer-dicke-luft-an-der-ostsee-3864013&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1uwWy7IibmrXt4TIIcCHuT +2025-08-24 14:52:22,304 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/mecklenburg-vorpommern/geplanter-karten-zwang-sorgt-fuer-dicke-luft-an-der-ostsee-3864013&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1uwWy7IibmrXt4TIIcCHuT +2025-08-24 14:52:22,527 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 14:52:22,527 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/mecklenburg-vorpommern/geplanter-karten-zwang-sorgt-fuer-dicke-luft-an-der-ostsee-3864013&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1uwWy7IibmrXt4TIIcCHuT +2025-08-24 14:52:22,528 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Geplanter Karten-Zwang sorgt für dicke Luft an der Ostsee - Nordkurier' extrahiert +2025-08-24 14:52:22,528 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Geplanter Karten-Zwang sorgt für dicke Luft an der Ostsee - Nordkurier +2025-08-24 14:52:22,528 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Loch Ness in Schottland: Kind auf Campingplatz sexuell missbraucht - MSN +2025-08-24 14:52:22,529 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/loch-ness-in-schottland-kind-auf-campingplatz-sexuell-missbraucht/ar-AA1JLKJo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1Jv92jULmjoLLuKh5FsN1C (Versuch 1) +2025-08-24 14:52:22,823 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:22,824 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:22,824 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:22,824 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/loch-ness-in-schottland-kind-auf-campingplatz-sexuell-missbraucht/ar-AA1JLKJo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1Jv92jULmjoLLuKh5FsN1C +2025-08-24 14:52:22,828 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/loch-ness-in-schottland-kind-auf-campingplatz-sexuell-missbraucht/ar-AA1JLKJo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1Jv92jULmjoLLuKh5FsN1C +2025-08-24 14:52:23,046 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 14:52:23,046 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/loch-ness-in-schottland-kind-auf-campingplatz-sexuell-missbraucht/ar-AA1JLKJo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1Jv92jULmjoLLuKh5FsN1C +2025-08-24 14:52:23,047 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Loch Ness in Schottland: Kind auf Campingplatz sexuell missbraucht - MSN' extrahiert +2025-08-24 14:52:23,047 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Loch Ness in Schottland: Kind auf Campingplatz sexuell missbraucht - MSN +2025-08-24 14:52:23,047 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Wanderin stürzt in Inzigkofen in Felsspalte und verletzt sich schwer - SWR +2025-08-24 14:52:23,047 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/rettungseinsatz-verunfallte-wanderin-auf-gespaltenem-felsen-in-inzigkofen-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gMED6SXGchOupYUXtrmm5 (Versuch 1) +2025-08-24 14:52:23,346 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:23,347 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:23,347 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:23,347 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/rettungseinsatz-verunfallte-wanderin-auf-gespaltenem-felsen-in-inzigkofen-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gMED6SXGchOupYUXtrmm5 +2025-08-24 14:52:23,351 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Wanderin stürzt in Inzigkofen in Felsspalte und verletzt sich schwer - SWR +2025-08-24 14:52:23,351 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Feuerwehr-Großeinsatz: Brand auf Campingplatz - Waldsee/Altrip - DIE RHEINPFALZ +2025-08-24 14:52:23,351 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/rhein-pfalz-kreis_artikel,-feuerwehr-gro%25C3%259Feinsatz-brand-auf-campingplatz-_arid,5805271.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1TSMKiXF4mmTlvxWL7YX5l (Versuch 1) +2025-08-24 14:52:23,591 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:23,592 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:23,592 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:23,592 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/rhein-pfalz-kreis_artikel,-feuerwehr-gro%25C3%259Feinsatz-brand-auf-campingplatz-_arid,5805271.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1TSMKiXF4mmTlvxWL7YX5l +2025-08-24 14:52:23,595 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Feuerwehr-Großeinsatz: Brand auf Campingplatz - Waldsee/Altrip - DIE RHEINPFALZ +2025-08-24 14:52:23,596 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Campingplatz Rheinblick in Baumberg: Beliebte Anlage stets ausgebucht - ANTENNE NRW +2025-08-24 14:52:23,596 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://antenne.nrw/nrw/campingplatz-rheinblick-in-baumberg-beliebte-anlage-stets-ausgebucht/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2SXFc61ANwrL7rZl7c_Nfl (Versuch 1) +2025-08-24 14:52:23,881 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:23,882 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:23,882 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:23,882 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://antenne.nrw/nrw/campingplatz-rheinblick-in-baumberg-beliebte-anlage-stets-ausgebucht/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2SXFc61ANwrL7rZl7c_Nfl +2025-08-24 14:52:23,885 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingplatz Rheinblick in Baumberg: Beliebte Anlage stets ausgebucht - ANTENNE NRW +2025-08-24 14:52:23,886 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Bauernregeln für den September 2025: Prognose im 100-jährigen Kalender hat es in sich +2025-08-24 14:52:23,886 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bauernregeln-fuer-den-september-2025-prognose-im-100-jaehrigen-kalender-hat-es-in-sich-93896711.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3Kgg_g2rdEMvf_9AOgPtGj (Versuch 1) +2025-08-24 14:52:24,104 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:24,105 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:24,105 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:24,105 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bauernregeln-fuer-den-september-2025-prognose-im-100-jaehrigen-kalender-hat-es-in-sich-93896711.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3Kgg_g2rdEMvf_9AOgPtGj +2025-08-24 14:52:24,108 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Bauernregeln für den September 2025: Prognose im 100-jährigen Kalender hat es in sich +2025-08-24 14:52:24,110 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping auf Schloss Sigrön: Natururlaub mit Stil in Brandenburg - AUTO BILD +2025-08-24 14:52:24,110 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.autobild.de/artikel/luxus-camping-auf-schloss-sigroen-28240471.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zNVAffLcLpjFYvlSTrl2J (Versuch 1) +2025-08-24 14:52:24,396 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:24,397 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:24,397 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:24,397 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.autobild.de/artikel/luxus-camping-auf-schloss-sigroen-28240471.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0zNVAffLcLpjFYvlSTrl2J +2025-08-24 14:52:24,400 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping auf Schloss Sigrön: Natururlaub mit Stil in Brandenburg - AUTO BILD +2025-08-24 14:52:24,400 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Baden-Württemberg punktet mit einem der schönsten Wellness-Campingplätze - FNP +2025-08-24 14:52:24,401 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/deutschland/wellness-campingplatz-schoenster-europas-baden-wuerttemberg-schwarzwaelder-hof-zr-93897610.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0B3Cmtfk2_cSBV9jpW2E29 (Versuch 1) +2025-08-24 14:52:24,659 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:24,660 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:24,660 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:24,660 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fnp.de/deutschland/wellness-campingplatz-schoenster-europas-baden-wuerttemberg-schwarzwaelder-hof-zr-93897610.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0B3Cmtfk2_cSBV9jpW2E29 +2025-08-24 14:52:24,662 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Baden-Württemberg punktet mit einem der schönsten Wellness-Campingplätze - FNP +2025-08-24 14:52:24,662 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus +2025-08-24 14:52:24,663 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0gk8c4QL1MtBwuHQJQHYXL (Versuch 1) +2025-08-24 14:52:25,026 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:25,027 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:25,027 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:25,027 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0gk8c4QL1MtBwuHQJQHYXL +2025-08-24 14:52:25,029 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus +2025-08-24 14:52:25,030 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Falkensteiner Favorit - Containerdorf als Nächtigungskrösus Klagenfurts | krone.at +2025-08-24 14:52:25,030 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.krone.at/3876891&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1woffiV_WLFd90nrB2FkoT (Versuch 1) +2025-08-24 14:52:25,236 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:25,237 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:25,238 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:25,238 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.krone.at/3876891&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1woffiV_WLFd90nrB2FkoT +2025-08-24 14:52:25,241 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Falkensteiner Favorit - Containerdorf als Nächtigungskrösus Klagenfurts | krone.at +2025-08-24 14:52:25,242 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Kirche auf dem Campingplatz - Erzbistum Freiburg +2025-08-24 14:52:25,242 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.ebfr.de/detail/nachricht/id/227960-kirche-auf-dem-campingplatz/%3Fcb-id%3D12338393&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9x3XKrza6eMUdU7OgV2Y (Versuch 1) +2025-08-24 14:52:25,615 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:25,616 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:25,616 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:25,616 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.ebfr.de/detail/nachricht/id/227960-kirche-auf-dem-campingplatz/%3Fcb-id%3D12338393&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9x3XKrza6eMUdU7OgV2Y +2025-08-24 14:52:25,619 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Kirche auf dem Campingplatz - Erzbistum Freiburg +2025-08-24 14:52:25,620 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Letzter Ausweg Campingplatz - Flucht aus der Großstadt - Programme TV ce soir - Télérama +2025-08-24 14:52:25,620 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://television.telerama.fr/tele/documentaire/letzter-ausweg-campingplatz-flucht-aus-der-gro-stadt-1-386085864.php&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0yphKSHd_DWg5hgH0yY59p (Versuch 1) +2025-08-24 14:52:25,969 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:25,970 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:25,970 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:25,970 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://television.telerama.fr/tele/documentaire/letzter-ausweg-campingplatz-flucht-aus-der-gro-stadt-1-386085864.php&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0yphKSHd_DWg5hgH0yY59p +2025-08-24 14:52:25,974 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Letzter Ausweg Campingplatz - Flucht aus der Großstadt - Programme TV ce soir - Télérama +2025-08-24 14:52:25,975 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Markanter Umschwung steht bevor – Am 27. August dreht sich das Wetter erneut +2025-08-24 14:52:25,975 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/sich-das-wetter-erneut-naechster-markanter-umschwung-bevor-am-27-august-dreht-zr-93893449.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ML-ydsKFV3aAS_kW-OJoY (Versuch 1) +2025-08-24 14:52:26,186 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:26,186 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:26,187 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:26,187 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/sich-das-wetter-erneut-naechster-markanter-umschwung-bevor-am-27-august-dreht-zr-93893449.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2ML-ydsKFV3aAS_kW-OJoY +2025-08-24 14:52:26,190 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Markanter Umschwung steht bevor – Am 27. August dreht sich das Wetter erneut +2025-08-24 14:52:26,191 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Reportage: Sommerparadies Bodensee - Camping in Gohren - SWR Aktuell +2025-08-24 14:52:26,191 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/sommerparadies-bodensee-dokumentation-vom-campingplatz-gohren-bei-kressbronn-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3dRHXspfNHNEiPRBrJOeLi (Versuch 1) +2025-08-24 14:52:26,494 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:26,494 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:26,495 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:26,495 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.swr.de/swraktuell/baden-wuerttemberg/friedrichshafen/sommerparadies-bodensee-dokumentation-vom-campingplatz-gohren-bei-kressbronn-100.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3dRHXspfNHNEiPRBrJOeLi +2025-08-24 14:52:26,498 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Reportage: Sommerparadies Bodensee - Camping in Gohren - SWR Aktuell +2025-08-24 14:52:26,499 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Video: Wie Nadine Zappe Marmeladenglasmomente auf ihrem Campingplatz schafft +2025-08-24 14:52:26,499 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.nordschleswiger.dk/de/nordschleswig-hadersleben/im-video-wie-nadine-zappe-marmeladenglasmomente-ihrem-campingplatz&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0GFYeBShFgu1NUoM6G-5G_ (Versuch 1) +2025-08-24 14:52:26,727 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:26,727 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:26,728 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:26,728 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.nordschleswiger.dk/de/nordschleswig-hadersleben/im-video-wie-nadine-zappe-marmeladenglasmomente-ihrem-campingplatz&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0GFYeBShFgu1NUoM6G-5G_ +2025-08-24 14:52:26,731 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Video: Wie Nadine Zappe Marmeladenglasmomente auf ihrem Campingplatz schafft +2025-08-24 14:52:26,732 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hund bei Eisenhüttenstadt: Badestellen in der Region – wo Hunde erlaubt sind - MOZ.de +2025-08-24 14:52:26,732 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.moz.de/lokales/eisenhuettenstadt/hund-in-eisenhuettenstadt-badestellen-in-der-region-wo-hunde-erlaubt-sind-78262165.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0AJpWSxdJOcPug6TRkVtzZ (Versuch 1) +2025-08-24 14:52:27,015 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:27,016 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:27,016 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:27,016 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.moz.de/lokales/eisenhuettenstadt/hund-in-eisenhuettenstadt-badestellen-in-der-region-wo-hunde-erlaubt-sind-78262165.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0AJpWSxdJOcPug6TRkVtzZ +2025-08-24 14:52:27,018 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hund bei Eisenhüttenstadt: Badestellen in der Region – wo Hunde erlaubt sind - MOZ.de +2025-08-24 14:52:27,018 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Beliebtes Medikament löst Krebs aus – Forschende entschlüsseln rätselhaften Mechanismus +2025-08-24 14:52:27,018 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/brustkrebs-medikament-loest-gebaermutterkrebs-forschende-entschluesseln-raetselhaften-mechanismus-93897055.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw29FN0GWoPTgcf0krxruWOo (Versuch 1) +2025-08-24 14:52:27,249 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:27,250 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:27,250 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:27,250 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/brustkrebs-medikament-loest-gebaermutterkrebs-forschende-entschluesseln-raetselhaften-mechanismus-93897055.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw29FN0GWoPTgcf0krxruWOo +2025-08-24 14:52:27,254 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Beliebtes Medikament löst Krebs aus – Forschende entschlüsseln rätselhaften Mechanismus +2025-08-24 14:52:27,254 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 5 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-24 14:52:28,259 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-24 14:52:28,941 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Vanlife +2025-08-24 14:52:28,941 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-24 14:52:29,945 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-24 14:52:30,731 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Camping Termine 2024 +2025-08-24 14:52:30,731 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-24 14:52:31,736 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-24 14:52:32,492 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert - Camping Messe 2025 +2025-08-24 14:52:32,492 - INFO - fetch_and_process_feed:187 - 📰 2 Einträge gefunden +2025-08-24 14:52:32,493 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hörstein feiert 400 Jahre Pestwunder - Primavera24.de +2025-08-24 14:52:32,493 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.primavera24.de/aktuelles/news/hoerstein-feiert-400-jahre-pestwunder&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2ZPN_Php6BmAsnv-79P-zZ (Versuch 1) +2025-08-24 14:52:32,783 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:32,783 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:32,783 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:32,783 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.primavera24.de/aktuelles/news/hoerstein-feiert-400-jahre-pestwunder&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2ZPN_Php6BmAsnv-79P-zZ +2025-08-24 14:52:32,786 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.primavera24.de/aktuelles/news/hoerstein-feiert-400-jahre-pestwunder&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2ZPN_Php6BmAsnv-79P-zZ +2025-08-24 14:52:33,046 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-24 14:52:33,046 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.primavera24.de/aktuelles/news/hoerstein-feiert-400-jahre-pestwunder&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw2ZPN_Php6BmAsnv-79P-zZ +2025-08-24 14:52:33,047 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Hörstein feiert 400 Jahre Pestwunder - Primavera24.de' extrahiert +2025-08-24 14:52:33,047 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Hörstein feiert 400 Jahre Pestwunder - Primavera24.de +2025-08-24 14:52:33,048 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: In Düsseldorf schlägt das „Herz des Caravanings“ - Niederrhein Nachrichten +2025-08-24 14:52:33,048 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.niederrhein-nachrichten.de/nachrichten/in-duesseldorf-schlaegt-das-herz-des-caravanings-11957.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11bSejssd9woRFps5qaXVQ (Versuch 1) +2025-08-24 14:52:33,415 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-24 14:52:33,415 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-24 14:52:33,416 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-24 14:52:33,416 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.niederrhein-nachrichten.de/nachrichten/in-duesseldorf-schlaegt-das-herz-des-caravanings-11957.html&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw11bSejssd9woRFps5qaXVQ +2025-08-24 14:52:33,419 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: In Düsseldorf schlägt das „Herz des Caravanings“ - Niederrhein Nachrichten +2025-08-24 14:52:33,420 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-24 14:52:34,453 - INFO - save_articles:144 - ✅ 185 Artikel gespeichert +2025-08-24 14:52:34,453 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 6 neue Artikel in 45.92s hinzugefügt +2025-08-24 14:52:35,533 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 14:52:35,533 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:55:16,337 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 14:55:16,339 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:55:24,320 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 14:55:24,321 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:55:29,118 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 14:55:29,118 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:55:32,455 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 14:55:32,456 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:55:38,984 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 14:55:38,987 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:55:51,859 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 14:55:51,860 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:55:59,312 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 14:55:59,313 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 14:55:59,345 - INFO - save_articles:144 - ✅ 185 Artikel gespeichert +2025-08-24 14:55:59,381 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 14:55:59,381 - INFO - load_feeds:93 - ✅ 10 Feeds geladen From d65c55d315f583fd3ec15706d137be08b8c75d2c Mon Sep 17 00:00:00 2001 From: Oliver G Date: Thu, 28 Aug 2025 11:18:30 +0200 Subject: [PATCH 33/87] Bump version to v1.7.1 --- .env.example | 16 + AGENTS.md | 40 ++ CHANGELOG.md | 4 + README.md | 13 + __version__.py | 2 +- app.py | 65 ++-- data/articles.json | 589 +++++++++++++++++++++++++++- logs/rss_tool.log | 749 ++++++++++++++++++++++++++++++++++++ utils/config.py | 51 +++ utils/wordpress_uploader.py | 66 ++-- 10 files changed, 1520 insertions(+), 75 deletions(-) create mode 100644 .env.example create mode 100644 AGENTS.md create mode 100644 utils/config.py diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..fd3ded5 --- /dev/null +++ b/.env.example @@ -0,0 +1,16 @@ +# Copy to .env and fill in values + +# WordPress base URL (required) +WP_BASE_URL=https://your-site.tld + +# Authentication: prefer WP_AUTH_BASE64 OR use USERNAME+PASSWORD (Application Password) +# Example to generate: base64(username:application_password) +WP_AUTH_BASE64= + +# Alternatively provide username and application password +WP_USERNAME= +WP_PASSWORD= + +# OpenAI API key (optional, enables rewrite) +OPENAI_API_KEY= + diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..7251de6 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,40 @@ +# Repository Guidelines + +## Project Structure & Module Organization +- `app.py`: Streamlit UI (entry point for the app). +- `main.py`: RSS fetching, rewrite, and WordPress upload logic. +- `utils/`: Helpers (image/article extraction, WP uploader, UI helpers). +- `pages/`: Streamlit pages (e.g., `01_feed_manager.py`, `log_viewer.py`). +- `data/`: JSON state (`articles.json`, `feeds.json`). +- `logs/`: Runtime logs (`rss_tool.log`). +- `docs/`: Project notes (e.g., roadmap). +- `__version__.py`: Version string written by `versioning.py`. + +## Build, Test, and Development Commands +- Create env: `python -m venv .venv && source .venv/bin/activate` +- Install deps: `pip install -r requirements.txt` +- Run app: `streamlit run app.py` +- Version bump: `python versioning.py --level patch --push` (updates `__version__.py`, prepares `CHANGELOG.md`, creates tag; see `--help`). + +## Coding Style & Naming Conventions +- Python 3.10+, PEP 8, 4-space indentation, type hints where practical. +- Modules and functions: `snake_case`; classes: `PascalCase`. +- Streamlit pages: numeric prefix for order, e.g., `pages/01_feature.py`. +- Keep functions small and pure in `utils/`; isolate I/O in app layers. +- Suggested tools (optional): Black (`black .`) and Ruff (`ruff check .`). + +## Testing Guidelines +- Framework: pytest (recommended). Place tests under `tests/` with `test_*.py`. +- Unit tests for `utils/*`; light integration checks for `main.py` with temporary files. +- Run: `pytest -q`. Add coverage if needed (e.g., `pytest --cov=utils`). +- Test data: avoid mutating files in `data/`; use temp dirs or fixtures. + +## Commit & Pull Request Guidelines +- Commits: imperative mood, concise; examples: `Add feed dedupe`, `Fix WP upload retry`, `Bump version to v1.7.0`. +- PRs: clear description, linked issue, screenshots/GIFs for UI changes, note env variables touched. +- Update `CHANGELOG.md` and bump version via `versioning.py` before release PRs. + +## Security & Configuration Tips +- Required env: `OPENAI_API_KEY`, `WP_BASE_URL`, `WP_USERNAME`, `WP_PASSWORD` or `WP_AUTH_BASE64` (see `.env`). +- Never commit secrets; `.env` is git-ignored. Avoid hardcoded credentials; prefer `os.getenv`. +- Logs and data may contain content; do not commit `logs/` or large `data/` snapshots. diff --git a/CHANGELOG.md b/CHANGELOG.md index c15f26b..fa80967 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [1.7.1] - 2025-08-28 + +- Beschreibung... + ## [1.7.0] - 2025-08-24 - Beschreibung... diff --git a/README.md b/README.md index 0f3d86c..6846a41 100644 --- a/README.md +++ b/README.md @@ -74,3 +74,16 @@ bash update.sh streamlit run app.py +--- + +## 🔐 Konfiguration (.env) + +Lege eine `.env` im Projekt an (siehe `.env.example`). Erforderliche Variablen: + +- `WP_BASE_URL`: Basis-URL deiner WordPress-Seite (z. B. https://example.com) +- Authentifizierung (eine Option wählen): + - `WP_AUTH_BASE64`: Bevorzugt. Base64 von `username:application_password` + - oder `WP_USERNAME` und `WP_PASSWORD`: Benutzer + Anwendungspasswort +- Optional: `OPENAI_API_KEY` für das Umschreiben von Artikeln + +Hinweis: Der Code liest ausschließlich aus `.env`. Es gibt keine hartkodierten Standard-Credentials. diff --git a/__version__.py b/__version__.py index 32d334c..6a6d0f8 100644 --- a/__version__.py +++ b/__version__.py @@ -1 +1 @@ -VERSION = "1.7.0" +VERSION = "1.7.1" diff --git a/app.py b/app.py index a6d2dfa..f161a65 100644 --- a/app.py +++ b/app.py @@ -14,6 +14,7 @@ from main import ( from utils.dalle_generator import generate_dalle_image from utils.wordpress_uploader import WordPressUploader from utils.css_loader import load_css, apply_dark_theme +from utils.config import validate_env import os from collections import Counter import time @@ -29,6 +30,19 @@ st.set_page_config( load_css() apply_dark_theme() +# === Environment-Validierung (.env) === +env_check = validate_env() +if not env_check.get("ok"): + st.error("🔒 Sicherheits-/Konfigurationshinweis: Bitte .env korrekt konfigurieren.") + for msg in env_check.get("errors", []): + st.markdown(f"- ❌ {msg}") + for msg in env_check.get("warnings", []): + st.markdown(f"- ⚠️ {msg}") +elif env_check.get("warnings"): + st.info("ℹ️ Hinweise zur Konfiguration:") + for msg in env_check.get("warnings", []): + st.markdown(f"- ⚠️ {msg}") + # === Initialize Session State === if 'selected_articles' not in st.session_state: st.session_state.selected_articles = set() @@ -928,20 +942,7 @@ with tab6:
""", unsafe_allow_html=True) - # WordPress Auth Debug (nur für Entwicklung) - if st.checkbox("🔧 Debug-Modus (Auth-Details anzeigen)", value=False): - st.warning("⚠️ Nur für Entwicklung - zeigt Auth-Details!") - - wp_base64 = os.getenv("WP_AUTH_BASE64", "") - if wp_base64: - try: - import base64 - decoded = base64.b64decode(wp_base64).decode('utf-8') - st.code(f"Base64: {wp_base64}\nDecoded: {decoded}") - except Exception as e: - st.error(f"Fehler beim Dekodieren: {e}") - else: - st.info("Kein Base64-String konfiguriert") + # Sicherheit: Kein Anzeigen sensibler Auth-Details mehr # Bulk Upload st.subheader("📦 Massenupload") @@ -1062,15 +1063,16 @@ with tab6: with st.expander("📋 .env-Datei Vorlage", expanded=False): st.code(""" # WordPress-Konfiguration -WP_BASE_URL=https://vanityontour.de -WP_USERNAME=ogiertz -WP_PASSWORD=whNEx9aZCIUXViV89Z3e7Z03 +WP_BASE_URL=https://your-site.tld -# WordPress Base64-Authentifizierung (bevorzugte Methode) -WP_AUTH_BASE64=b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM= +# Entweder Base64 (empfohlen) ODER Benutzername/Passwort (Application Password) +WP_AUTH_BASE64= +# Oder alternativ: +WP_USERNAME= +WP_PASSWORD= -# OpenAI-Konfiguration (für Artikel-Umschreibung) -OPENAI_API_KEY=sk-... +# OpenAI-Konfiguration (optional für Umschreibung) +OPENAI_API_KEY= """, language="bash") with st.expander("🔑 Base64-Authentifizierung verstehen", expanded=False): @@ -1078,21 +1080,10 @@ OPENAI_API_KEY=sk-...

WordPress REST API Authentifizierung:

- Die WordPress REST API erfordert eine Base64-kodierte Authentifizierung im Format:
- Authorization: Basic <base64_encoded_credentials> -

- Ihr bereitgestellter Base64-String:
- • b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM=
- • Dekodiert: ogiertz:whNEx9aZCIUXViV89Z3e7Z03 -

- So funktioniert es:
- 1. Benutzername und Anwendungspasswort werden kombiniert: username:password
- 2. Dieser String wird Base64-kodiert
- 3. Im Authorization-Header verwendet: Basic <base64_string> -

- Fallback-Verhalten:
- • Wenn WP_AUTH_BASE64 gesetzt ist → Direkter Base64-String verwendet
- • Wenn nicht gesetzt → Base64 wird aus WP_USERNAME:WP_PASSWORD generiert + Die WordPress REST API nutzt Basic-Auth mit Base64-kodierten Zugangsdaten:
+ Authorization: Basic <base64(username:password)>

+ Empfehlung: In der .env WP_AUTH_BASE64 setzen (aus username:application_password erzeugt).
+ Alternativ können WP_USERNAME und WP_PASSWORD gesetzt werden; dann wird Base64 zur Laufzeit generiert.
""", unsafe_allow_html=True) @@ -1115,4 +1106,4 @@ OPENAI_API_KEY=sk-... 4. Generiertes Passwort in .env-Datei eintragen
- """, unsafe_allow_html=True) \ No newline at end of file + """, unsafe_allow_html=True) diff --git a/data/articles.json b/data/articles.json index 4865188..071aac7 100644 --- a/data/articles.json +++ b/data/articles.json @@ -8518,7 +8518,7 @@ "summary": "... Campingplatz auf Ostsee-Insel könnte verschwinden. Akut gefährdet. Dieser beliebte DDR-Campingplatz auf Ostsee-Insel könnte verschwinden. q Zempin.", "text": "... Campingplatz auf Ostsee-Insel könnte verschwinden. Akut gefährdet. Dieser beliebte DDR- Campingplatz auf Ostsee-Insel könnte verschwinden. q Zempin.", "tags": [], - "status": "New", + "status": "Trash", "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.nordkurier.de/regional/mecklenburg-vorpommern/geplanter-karten-zwang-sorgt-fuer-dicke-luft-an-der-ostsee-3864013&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1uwWy7IibmrXt4TIIcCHuT", "images": [], "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", @@ -8533,7 +8533,7 @@ "summary": "Vor 3 Wo. Auf Campingplatz. Unbekannter missbraucht Urlauber-Kind am berüchtigten Loch Ness.", "text": "Vor 3 Wo. Auf Campingplatz . Unbekannter missbraucht Urlauber-Kind am berüchtigten Loch Ness.", "tags": [], - "status": "New", + "status": "Trash", "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/loch-ness-in-schottland-kind-auf-campingplatz-sexuell-missbraucht/ar-AA1JLKJo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1Jv92jULmjoLLuKh5FsN1C", "images": [], "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", @@ -8555,5 +8555,590 @@ "source_name": "Google Alert - Camping Messe 2025", "created_at": "2025-08-24T14:52:32.784324", "word_count": 22 + }, + { + "id": "5addbde3367ba80d9f3563fb191ca2ac", + "title": "VWN feiert 20 Jahre California \nBeach und zeigt Sondermodell", + "date": "Wed, 27 Aug 2025 00:00:00 +0200", + "summary": "Premiere: Sondermodell \n„California Energy“", + "text": "Volkwagen Nutzfahrzeuge (VWN) feiert 20 Jahre California Beach. Das Schweizer Taschenmesser der VW Bus-Welt ist ein Crossover aus Multivan und California. Perfekt auf den privaten wie geschäftlichen Alltag zugeschnitten und permanent in Stand-by für den Trip ins Wochenende oder gar um die halbe Welt. 2005 kam die erste Generation des Allrounders auf den Markt – zunächst unter der Bezeichnung Multivan Beach; seit 2007 wird er als California Beach angeboten. Heute ist die mittlerweile dritte Generation im Handel. Perfektes Timing: Zum Jubiläum der Reisemobil-Ikone wird Volkswagen Nutzfahrzeuge auf dem Caravan-Salon (29.08 bis 07.09.2025) in Düsseldorf eine besonders attraktive neue Version des Bestsellers vorstellen: das Sondermodell „Beach Camper Energy“ mit Serien-Features wie Standheizung, Markise, 17-Zoll-Leichtmetallrädern und einem Preisvorteil von bis zu 4.600 Euro . Hier sind alle Fakten zur Geschichte des „Beach“ und erste Details zum neuen Sondermodell, dessen Vorverkauf bereits im Rahmen des Caravan Salons starten wird: 2005 – „BEACH“ AUF BASIS DES T5 Endless-summer-Feeling: Im Sommer 2005 überraschte Volkswagen Nutzfahrzeuge die Bulli-Community mit ersten Fakten und Fotos zum neuen Multivan Beach. Die markante Optik des Weltpremieren-Fahrzeugs war selbst mit der dunkelsten Sonnenbrille unverkennbar: Eine umlaufende Folierung im leuchtenden „Sundown Orange“ auf der in „Offroad Grey Metallic“ lackierten Karosserie machte sofort Lust auf einen Abstecher an den nächsten Strand. Farblich und thematisch perfekt darauf abgestimmt waren die zwei Surfboards, die der Fotowagen auf dem Dachgepäckträger transportierte – das Spiegelbild einer automobilen Lebenseinstellung, die auch heute noch jeden Bulli umweht. Entscheidend war 2005, dass auch der Multivan Beach rein faktisch und funktional einlöste, war er optisch versprach: Mit einem bis in das kleinste Detail durchdachten Innenraum, in dem die Features eines multivariablen Alltagsautos und eines Reisemobils zu einer neuen Modellversion mit Kultpotenzial verschmolzen: dem Crossover aus Multivan und California als flexibler Einstieg in die Welt der Camper. Modularer Raum zum Reisen: Vorausgegangen waren dem Serienmodell zwei Fahrzeugstudien, die Volkswagen Nutzfahrzeuge auf dem Caravan-Salon 2004 vorgestellt hatte: California Beach und California Tramper – zwei Reisemobile mit konzeptioneller Nähe zum Multivan. Die im Rahmen der Messe und weiterer Marktstudien befragen Besucher respektive Bulli-Fahrer votierten eindeutig für die an Bord der California Beach-Studie realisierten Lösungen. „Diese Studie auf der Basis des Transporters mit Flachdach“, so Volkswagen im Jahr 2004, „greift einen konstruktiven Gedanken aus der Frühzeit der mobilen Freizeit auf: Schon Anfang der 50er Jahre wurde der VW Bus zusammen mit der herausnehmbaren Campingbox zum Inbegriff der Reisemobile.“ Das modular aufgebaute Interieur des Concept Cars griff genau diesen Konzeptansatz eines clever zum Camper erweiterten VW Bus auf und interpretierte ihn neu. Bereits im Folgejahr kam die Serienversion der heutigen Reisemobil-Ikone, wie skizziert zuerst als Multivan Beach, auf den Markt – mit durchschlagendem Erfolg. Clever durchdachter Camper: Der „Beach“ überzeugte auf Anhieb mit seinem konstruktiv konsequent durchdachten Interieur. Die Basis für den modularen Aufbau des Campers lieferte ein Schienensystem im Innenraumboden hinter den Vordersitzen. Dort arretiert war die aus dem California mit integrierter Küchenzeile bereits bekannte Rücksitzbank. Um sie in ein bequemes Bett für zwei Personen zu verwandeln, wurde die Zweierbank mit einem Griff nach vorn gezogen und die Lehne umgeklappt. Die einteilige Rücklehne der Bank ging dabei in die als Bettverlängerung konzipierte Laderaum-Abdeckung über. Auf der Beifahrerseite hatten die findigen Konstrukteure aus Hannover zudem einen Staukasten integriert, der ebenfalls mit einer Polsterfläche ausgestattet war. So entstand eine 2.000 mm lange Liegefläche, die bequem zwei Personen Platz bot. Das Bettzeug und Campingzubehör fand in den herausnehmbaren Boxen des Staukastens und der Rücksitzbank Platz. Ebenfalls serienmäßig: die fürs Wohnen im Auto unabdingbare Drehfunktion des Fahrer- und Beifahrersitzes. Optional ließ sich der „Beach“ über einen auf dem Schienensystem integrierbaren Einzelsitz im Fond zum Fünfsitzer ausbauen. Profilschienen und Privatsphäre: Eine ebenso clevere Lösung wie die Schienen im Boden waren die Profilschienen in den Seitenwänden und im Dachbereich. In der Seitenwand (Fahrerseite) konnte so ein Campingtisch verankert werden; der Tisch war gleichzeitig für den Außenbereich nutzbar. Zwei serienmäßige Falt-Campingstühle ermöglichten lange sommerliche Dinner-Nächte draußen neben dem „Beach“. Für die Privatsphäre im Innenraum sorgten per Magnet an den Karosserieflächen zu befestigende Vorhänge; im Fahrerhaus kamen Spanntücher zum Einsatz. Perfektioniert wurde das Reisen und Campen durch zwei seitliche Profilschienen im Dachhimmel, in die zwei große Multifunktionstaschen für Kleidung und Accessoires einhängt werden konnten. Weitere Utensilien nahm zudem ein Gepäcknetz im hinteren Dachhimmel auf. 2007 – DER „BEACH“ WIRD ZUM CALIFORNIA BEACH Aufstelldach für den Allrounder: Als Volkswagen Nutzfahrzeuge den Multivan Beach 2007 in California Beach umtaufte, war das nur konsequent. Denn von diesem Moment an war der Camper optional mit einem großen Aufstelldach samt Faltenbalg und dem 1.200 x 2.000 mm breiten Dachbett erhältlich. Das Aufstelldach bot (und bietet) zahlreiche Vorteile: Wer zu zweit reiste, stieg zum Schlafen einfach nach oben. Familien mit zwei oder drei Kindern konnten nun alle gemeinsam im „Beach“ übernachten. Und wenn das Dach samt dort integriertem Bett nach oben geklappt wurde, ergab sich im Wohnraum eine Stehhöhe, wie sie sonst nur in größeren Reisemobilen zu finden war. 2009 – GLOBETROTTER-SONDERMODELL UND EIN GROSSE FACELIFT Cape-2-Cape mit dem California Beach: Auf der Automobil International (AMI) in Leipzig präsentierte Volkswagen Nutzfahrzeuge 2009 auf der Basis des T5 das Sondermodell California Cape2Cape. Die Inspiration dafür lieferte eine Expedition des deutschen Extremsportlers Joachim Franz, der 2008 – begleitet von fünf gelb lackierten California Beach – in nur 60 Tagen die 24.000 Kilometer lange Distanz vom Nordkap in Norwegen bis in das südafrikanische Kapstadt zurücklegte. Das im auffälligen Gelb lackierte und besonders robust ausgeführte Sondermodell war eine Hommage an diese transkontinentale Reise und konsequenterweise an seinen großen „cape2cape“-Logos auf den Seitenpartien zu erkennen. Hier integriert: die Umrisse der von Franz durchquerten Teile Europas sowie der afrikanische Kontinent. Konzipiert für aktive Freizeitsportler und Globetrotter, war der California Cape2Cape optional mit Allradantrieb, Differenzialsperre, Höherlegung des Fahrwerks, Allterrain Reifen und einem Motorluftfilter für besonders staubreiche Regionen erhältlich. Großes Update des Generalisten: Da immer mehr Kunden das optionale Aufstelldach bestellten und die Vorteile derart überzeugten, nahm es Volkswagen Nutzfahrzeuge im Rahmen einer sogenannten „großen Produktpflege“ (GP) in die Serienausstattung des California Beach auf. Standardmäßig wurde das Aluminium-Aufstelldach manuell geöffnet und geschlossen, optional über eine automatisch arbeitende Elektrohydraulik. Vollverkleidungen der Seitenwände und integrierte Rollos verfeinerten den Innenraum. Die Kunden hatten nun zudem die Wahl zwischen der 3er-Sitzbank des Multivan oder der 2er-Sitzbank des California Trendline. Von diesen zwei Versionen übernahm der „Beach“ auch das clevere Konzept der in Reißverschluss-Fächern der Heckklappe verstauten Camping-Stühle. Antriebsseitig lösten leisere und sparsamere Common-Rail-Turbodieselmotoren (TDI) die zuvor eingesetzten Pumpe-Düse-Direkteinspritzer ab. Automatische Doppelkupplungsgetriebe (DSG) ersetzten parallel die Wandlerautomatik. Eine neue 4MOTION-Generation sorgte für noch bessere On- und Offroad-Eigenschaften. Darüber hinaus war eine neue Infotainment-Generation an Bord. 2015 – NEUE „BEACH“-GENERATION AUT BASIS DES T6 Generation 2 auf Basis der Generation 6: Zehn Jahre nach dem ersten „Beach“ debütierte im Sommer 2015 die zweite Generation des California Beach auf der Basis der umfangreich weiterentwickelten sechsten Generation des Transporters (T6). Sie war optisch an ihrer neu designten Frontpartie, einer noch geradlinigeren Heckpartie sowie neuen Scheinwerfern und Rückleuchten zu erkennen. Der California Beach profitierte ebenso vom neuen Design wie von den neuen Antriebs, Assistenz- und Infotainment-Systemen sowie einer ebenfalls neuen Cockpitlandschaft. Eine Neuheit war rein optischer Natur, wurde aber sofort zum Bestseller: Erstmals seit Jahrzehnten gab es wieder Zweifarblackierungen – eine Hommage an den T1 und T2. News gab es auch beim Faltenbalg des Ausstelldaches: Statt aus Baumwolle bestand er nun aus einem synthetischen Stoff, der wasserdichter und widerstandsfähiger war. Ab dem Folgejahr war der Faltenbalg alternativ zu Grau („Alpin Grey“) zudem auch in Rot („Strawberry Red“) und Blau („Glacier Blue“) erhältlich. 2019 – IM T6.1 ERHÄLT DER „BEACH\" OPTIONAL EINE MINIKÜCHE Maximale Ausbaustufe mit Miniküche: Einen großen Sprung machte der California Beach 2019 mit dem Debüt der optisch und technisch weiterentwickelten Transporter Generation T6.1. Erstmals gab es den „Beach“ nun in zwei Versionen: als „Beach Camper“ mit Wohnmobilzulassung und „Beach Tour“ mit Pkw-Zulassung. Das Highlight der neuen Ausstattungsversion California Beach Camper war eine komplett neu entwickelte Miniküche. Sie wurde zur Nutzung einfach aus der linken Seitenverkleidung zwischen der B- und C-Säule nach oben gezogen und herausgeklappt. Das Edelstahlelement bot auf der linken Seite einen einflammigen Gaskocher sowie rechts ein Arbeits- und Ablagenfeld. Über dem Gaskocher befand sich zudem eine Abdeckplatte, die hochgeklappt beim Kochen als Abschirmblech diente. Unterhalb der Koch- und Arbeitsplatte befanden sich an der Seitenwand ein großes, offenes Staufach und ein geschlossenes Fach für eine 1,8-kg-Gasflasche. Während der „Coast“ und „Ocean“ aufgrund der breiter bauenden Küchenzeile (inklusive zweiflammigem Gaskocher, Kühlschrank und Spüle) generell mit einer Zweiersitzbank im Wohnraum angeboten wurden, konnte auch der neue California Beach Camper dank der Miniküche weiterhin mit einer Dreiersitzbank bestellt werden – ein Plus für Familien mit drei Kindern. Alternativ wurde der Beach in der Version „Tour“ auch ohne die Miniküche angeboten. In diesem Fall konnte der Bulli nicht nur rechts, sondern erstmals auch links mit einer Schiebetür ausgestattet werden. Camper-Bedienteil für den T6.1 Camper: Ein weiteres Novum an Bord aller neuen California war das komplett neu entwickelte Camper-Bedienteil mit Touchscreen in der Dachkonsole. Über diesen Screen wurden erstmals im Beach alle Camper Funktionen wie etwa – je nach Ausstattung – das elektrohydraulische Aufstelldach, die Standheizung, die Landstromversorgung oder das Wohnraumlicht gesteuert. Zudem beinhaltete das Camper-Bedienteil eine elektronische Wasserwagen, über die der California auf dem Stellplatz genau waagerecht ausgerichtet werden konnten. Zu den weiteren generellen Highlights des T6.1 gehörten neue Assistenzsysteme wie ein Seitenwindassistent oder der „Trailer Assist“ (Anhängerrangierassistent) sowie eine komplett neue Schalttafel, die erstmals mit digitalen Instrumenten („Digital Cockpit“) geordert werden konnte. Ebenfalls neu: eine große Frontöffnung für den Faltenbalg, die per Reisverschluss komplett geöffnet werden konnte. Im California Ocean war dieses neue Aufstellfach inklusive drei Fenstern serienmäßig an Bord; für alle anderen Versionen stand das Panoramadach-Feature optional zur Verfügung. 2024 – MODERNSTER „BEACH“ ALLER ZEITEN AUF DER BASIS DES MQB „Beach“ auf neuer Multivan-Basis: 2024 brachte Volkswagen Nutzfahrzeuge den bis in das letzte Detail neu entwickelten California auf den Markt. Er basiert seitdem auf der Langversion des aktuellen Multivan – ein Bulli der siebten Generation. Angeboten wird der neue California als „Beach“, „Beach Tour“, Beach Camper“ mit Mini-Küche im Heck sowie als „Coast“ und „Ocean“ (letztere mit voller Küchenzeile). Fakt ist, dass die auf dem innovativen Modularen Querbaukasten (MQB) basierenden California Modelle geräumiger, smarter, durchdachter und vielseitiger wurden. Natürlich hielt Volkswagen Nutzfahrzeuge an typischen California Details wie dem Aufstelldach fest. Und selbstverständlich ist der „Beach“ auch in der neusten Version zugleich der VW Bus für den Alltag und der Camper fürs Reisen. All das gelingt mit den modernsten Antriebs-, Assistenz- und Infotainmentsystemen und einer neuen Reisemobilarchitektur nun noch besser. Zudem gilt: Erstmals gibt es alle California Versionen serienmäßig mit zwei Schiebetüren – damit erschließen sich noch vielseitigere Nutzungsmöglichkeiten. Darüber hinaus wird der California Beach durch den neuen optionalen und ersten Plug-in-Hybrid-Allradantrieb (eHybrid 4MOTION) dieser Klasse temporär zum Elektroauto, das gleichzeitig große Gesamtdistanzen ermöglicht. 20 Jahre nach seinem Debüt sieht das Modellprogramm des „Beach“ 2025 wie folgt aus: California Beach: Den Einstieg in das aktuelle Programm markiert der California Beach mit Pkw-Zulassung – im Grunde ist er konzeptionell ein Multivan mit manuellem Aufstelldach. Der California Beach bietet sechs Sitzplätze (2+2+2). Die herausnehmbaren Einzelsitze in der zweiten und dritten Reihe sind deutlich leichter als die Pendants des Vorgängers. Ebenfalls serienmäßig: zwei Schlafplätze im manuell mit einem einfach bedienbaren Mechanismus zu öffnenden und schließenden Aufstelldach. Das Dachbett ist 2.054 x 1.137 mm groß und mit einer bequemen Auflage samt Tellerfedern ausgestattet. California Beach Tour: Die zweite Ausbaustufe ist der California Beach Tour. Er ist serienmäßig mit einem drehbaren sowie in der Höhe einstellbaren Fahrer- und Beifahrersitz, zwei Camping-Stühlen in der Heckklappe, einem Camping-Tisch, einer Beleuchtung im Aufstelldach (inkl. Schwanenhalsleuchte und 45-Watt-USB Schnittstellen), Schiebefenstern in der linken und rechten Schiebetür sowie einer Camper-Bedieneinheit (Screen) in der C-Säule auf der Beifahrerseite ausgerüstet. Zudem hat der „Beach Tour“ eine zusätzliche Camper-Batterie an Bord (40 Ah LiFePo). Der fünfsitzige California Beach Tour ist im Fond mit drei Einzelsitzen ausgestattet; die Lehnen der zwei äußeren Fondsitze können – anders als im „Beach“ und Multivan – komplett zurückgeklappt werden. Damit wird die Voraussetzung geschaffen, dass im Wohnraum zwei weitere Schlafplätze entstehen. Dazu hat der California Beach Tour eine ausklappbare weitere Matratze (1.980 x 1.330 mm) an Bord, die auf den umgeklappten Einzelsitzen aufliegt und bei Nichtgebrauch kompakt gefaltet als Gepäckablage im Kofferraum untergebracht ist. Auch der „Beach Tour“ hat eine Pkw-Zulassung. California Beach Camper: Der California Beach Camper hat eine klassische Wohnmobil-Zulassung. Wie der „Beach Tour“ ist er ein Fünfsitzer, aber zusätzlich mit einer äußerst kompakt bauenden Miniküche und einem 230-Volt-Landstrom Anschluss ausgestattet. Die Küche mit Einflammen-Gaskocher, einer Besteckschublade und weiterem Stauraum befindet sich in einem fest installierten Modul im Laderaum. Zur Nutzung wird die Küche bei geöffneter Heckklappe (gleichzeitig Regenschutz) nach hinten herausgezogen. Die weitere Ausstattung entspricht dem California Beach Tour. 2025 – SONDERMODELL „ENERGY“ DEBÜTIERT AUF DEM CARAVAN-SALON Premiere in Düsseldorf: Mit dem Start des Caravan-Salons beginnt auch der Vorverkauf des gänzlich neuen und besonders attraktiv ausgestatteten Sondermodells „Energy“. Der Name sagt es: Das neue Modell basiert auf dem California Beach Camper, ist aber – bei einem Preisvorteil von bis zu 4.600 Euro – nochmals umfangreicher ausgestattet. Die erweiterte Ausstattung umfasst eine Markise (auf Beifahrerseite montiert, Markisenschienen auf beiden Fahrzeugseiten), die Camper-Standheizung inklusive Fernbedienung (plus Frontscheibenenteisung), die 3-Zonen-Klimaanlage „Air Care Climatronic“, ein Verdunkelungssystem mit Rollos und Thermomatten, den „Travel Assist“ (assistierte Quer- und Längsführung) und das Parkpaket Basic (mit Parklenkassistent „Park Assist“, Einparkhilfe im Front- und Heckbereich und Rückfahrkamera „Rear View“). Darüber hinaus gehört zur „Energy“ Ausstattung ein Lichtpaket. Es beinhaltet den Fernlichtassistent „Light Assist“, die dynamische Leuchtweitenregulierung, den Regensensor, das sogenannte Schlechtwetterlicht inklusive Abbiegelicht, einen automatisch abblendenden Innenspiegel und die ebenfalls automatische Tagfahrlichtschaltung samt „Coming home“- und „Leaving home“-Funktion. Gleichfalls Serie: der proaktive Insassenschutz, die Sitzheizung vorn und das beheizbare Multifunktions Lederlenkrad mit Schaltwippen und „Energy“-Logo. Außen individualisieren die 17 Zoll-Leichtmetallräder des Typs „Dundrod“ in Schwarz mit glanzgedrehten Oberflächen den „Beach Camper Energy“. Produktoffensive auf dem Caravan-Salon: Ebenfalls als Sondermodell „Energy“ werden auf dem Caravan-Salon die California Versionen „Coast“ und „Ocean“ debütieren. Darüber hinaus gilt: Volkswagen Nutzfahrzeuge wird mit seinem kompletten Reisemobil-Programm inklusive der neuen Grand California Modelle und des Caddy California präsent sein. Sie alle sind zu 100 Prozent Eigenentwicklungen, die komplett bei Volkswagen Nutzfahrzeug gefertigt werden.", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5939", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:32.728961", + "word_count": 2337 + }, + { + "id": "9635294fe16689c035b7cd137f56cf8d", + "title": "Bliessteig im Saarland ist Deutschlands schönster Wanderweg", + "date": "Tue, 26 Aug 2025 00:00:00 +0200", + "summary": "46.000 Wanderfans aus ganz Deutschland haben abgestimmt", + "text": "Die Entscheidung ist gefallen: Bei der Publikumswahl „Deutschlands Schönster Wanderweg 2025“ haben über 46.000 Wanderfans aus ganz Deutschland ihre Stimme abgegeben. Insgesamt wurden mehr als 67.000 Häkchen in den Kategorien Tagestouren und Mehrtagestouren gesetzt – ein deutliches Zeichen für die große Begeisterung für das Wandern quer durch das Bundesgebiet. Der „Bliessteig“ im Saarland wurde in der Kategorie Mehrtagestouren mit 7.557 Stimmen zum Sieger gekürt. Der Fernwanderweg ist als „Langer Qualitätsweg Wanderbares Deutschland“ zertifiziert und trägt das Gütezeichen „Leading Quality Trails – Best of Europe“. Auf 108 Kilometern durchquert der Wanderweg das UNESCO-Biosphärenreservat Bliesgau. Die neun Etappen führen durch sanfte Hügel, entlang von Streuobstwiesen und buntsandsteinreichen Felsen bis hin zu waldreichen Gebieten. Besonders hervorzuheben ist die nachhaltige Ausrichtung der Route, die durch öffentliche Verkehrsmittel bequem zugänglich ist. Die Start- und Zielpunkte der Etappen sowie zahlreiche Zwischenstationen sind regelmäßig, auch am Wochenende, mit Bus und Bahn erreichbar.Das Saarland gehört zu einer der schönsten Wanderregionen in Deutschland und hat bereits mehrmals mit seinen Wanderwegen den begehrten Publikumspreis gewonnen. Wirtschafts- und Tourismusminister Jürgen Barke: „Der Bliessteig ist Deutschlands schönster Wanderweg 2025 – und das völlig verdient! Die Publikumswahl hat gezeigt, dass das Saarland zu den attraktivsten Wanderregionen der Republik gehört. Ich gratuliere dem Saarpfalz-Kreis, Landrat Frank John und der Saarpfalz-Touristik herzlich zu diesem Erfolg. Der Bliessteig verbindet Naturerlebnisse und Nachhaltigkeit auf besondere Weise – und zieht damit Menschen weit über die Landesgrenzen hinaus an. Die Investitionen der Landesregierung in die touristische Infrastruktur zahlen sich aus: Das Saarland ist so beliebt wie nie und gehört heute zu den Top-Kurzreisezielen für Wandern, Radfahren, Natur und Kulinarik.“ Die JURY Vor der Abstimmung, die vom 01. März 2025 bis zum 30. Juni 2025 lief, hatte eine Jury mit prominenten Persönlichkeiten der Wanderszene die aus über 100 Bewerbungen ausgewählten Wanderwege bewertet. Unter den Juroren waren Manuel Andrack, Wanderexperte und Autor; Kathrin Heckmann (alias Fräulein Draußen), Spiegel-Bestsellerautorin; Extremwanderer Thorsten Hoyer sowie der Chefredakteur des Wandermagazins. Ergänzt wurde das Gremium durch „Hegefire“, eine der reichweitenstärksten deutschen Outdoor-Influencer mit über 300.000 Followern.", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5937", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:33.324062", + "word_count": 330 + }, + { + "id": "417a901404e26e10cb32739b5e18bf9b", + "title": "Hotspot der mobilen Freiheit", + "date": "Tue, 26 Aug 2025 00:00:00 +0200", + "summary": "CARAVAN SALON Düsseldorf 2025", + "text": "Zehn Tage lang wird Düsseldorf zum Hotspot für alle, die mobiles Reisen lieben – das Messegelände verwandelt sich zum CARAVAN SALON vom 29. August bis 7. September 2025 in das internationale Zentrum der Caravaning-Welt. Der CARAVAN SALON 2025 präsentiert alles, was das Herz der Caravaning-Community höherschlagen lässt, von den aktuellsten Fahrzeugmodellen über eine riesige Zubehörpalette bis hin zu den traumhaften Camping-Reisezielen. „Wir blicken voller Vorfreude auf den Jahreshöhepunkt der gesamten Branche. Wer Freiheit auf vier Rädern liebt, wer Flexibilität und Nähe zur Natur sucht, ist beim CARAVAN SALON genau richtig. In 15 Hallen und auf dem Freigelände des Düsseldorfer Messegeländes werden sich erstmals über 800 nationale und internationale Aussteller präsentieren – so viele wie niemals zuvor. Die Vielfalt an Marken, Modellen und Grundrissen ist in diesem Jahr noch einmal gewachsen. Nirgendwo sonst gibt es eine größere Auswahl rund um die mobile Freizeit – ergänzt durch ein inspirierendes Rahmenprogramm voller Innovationen, Ideen und dem puren Caravaning-Erlebnis“, sagt CARAVAN SALON Director Stefan Koschke. Bühne für Produktneuheiten und Branchentrends Daniel Onggowinarso, Geschäftsführer des Caravaning Industrie Verbandes (CIVD): Caravaning hat sich in den vergangenen Jahrzehnten weltweit zu einer tragenden Säule von Tourismus und Wirtschaft entwickelt. Diese Entwicklung spiegelt sich auch im CARAVAN SALON wider, der längst über seine Rolle als größte und wichtigste Bühne für Produktneuheiten und Branchentrends hinausgewachsen ist. Gemeinsam mit der Messe Düsseldorf arbeitet der CIVD kontinuierlich daran, die Messe auch als Forum für fachlichen Austausch weiterzuentwickeln. Einen wichtigen Beitrag dazu leistet das umfangreiche Rahmenprogramm für Fachbesucher, das Expertinnen und Experten aus unterschiedlichen Disziplinen zusammenführt und Themen aufgreift, die über unsere Branche hinausreichen. Auch in diesem Jahr freuen wir uns auf den Dialog mit Politik, Wirtschaft und Wissenschaft sowie auf wichtige Impulse, die nicht nur die Zukunft der Caravaningbranche, sondern auch die der Tourismusbranche insgesamt mitgestalten. Neben den Präsentationen der Aussteller erwartet die Besucher in den Messehallen und auf dem Freigelände ein vielfältiges Rahmenprogramm mit spannenden Sonderthemen rund um das mobile Reisen. „StarterWelt“ im Freigelände – perfekt für Neueinsteiger Caravaning erfreut sich einer stetig wachsenden Beliebtheit. Beim vergangenen CARAVAN SALON zählten 38 Prozent der Besucherinnen und Besucher zu den Neueinsteigern und nahmen erstmals an der Messe teil. Für diese Zielgruppe bietet ausschließlich der CARAVAN SALON mit der „StarterWelt“ ein in dieser Form einzigartiges Informations- und Beratungsangebot. Im Freigelände zwischen den Hallen 5 und 9 informieren erfahrene Expertinnen und Experten persönlich zu Themen wie der Wahl des passenden Fahrzeugmodells, dem zulässigen Gesamtgewicht oder technischen Details. Verschiedene Fahrzeugtypen können direkt vor Ort besichtigt werden und veranschaulichen praxisnah, für welche Einsatzbereiche sie besonders geeignet sind. Ergänzt wird das Angebot durch ein abwechslungsreiches Bühnenprogramm, das vielfältige Einblicke in die Welt des Caravanings vermittelt und den Einstieg in diese Urlaubsform nachhaltig erleichtert.. Verschiedene Fahrzeugtypen stehen direkt vor Ort bereit, um in der Praxis zu zeigen, für welche Zielgruppen sie sich besonders eignen. Ergänzend zur persönlichen Beratung sorgt ein abwechslungsreiches Bühnenprogramm für spannende Einblicke in die Vielfalt des Caravanings und erleichtert Einsteigern die Orientierung. Abenteuer Selbstausbau Das Interesse am fachgerechten Umbau des eigenen Freizeitfahrzeugs wächst stetig – viele suchen gezielt nach professioneller Unterstützung und fundiertem Expertenwissen. Die Erlebniszone „Abenteuer Selbstausbau“ in Zusammenarbeit mit dem explorer- und dem VANderlust-Magazin wird aufgrund der großen Nachfrage noch einmal vergrößert und inhaltlich vertieft. Im Freigelände direkt vor den Hallen 13 und 14 finden Interessierte vier selbstausgebaute Freizeitfahrzeuge, die einen Eindruck über die Bandbreite des Themas aufzeigen. Täglich finden praxisnahe Vorträge und Expertenfragerunden rund um Themen wie Projektmanagement; Nachhaltiges Ausbauen; Photovoltaik; Fenstereinbau; Elektroinstallation; Kleben, Dichten und Versiegeln; Toilettensysteme und Materialkunde statt. h Halle 7: Travel & Nature CONNECTED Der Tourismusbereich des CARAVAN SALON präsentiert sich in diesem Jahr in Halle 7 – direkt am Eingang Nord. Besucher erwartet hier eine große Auswahl an Traumzielen, attraktiven Camping- und Stellplätzen sowie perfekten Caravaning-Destinationen für Outdoor-Aktivitäten wie Wandern, Klettern oder Biken. Abgerundet wird das Angebot durch das abwechslungsreiche Programm auf der „Travel & Nature CONNECTED“-Bühne, das gleichermaßen zum Träumen wie zur konkreten Planung der nächsten Reise einlädt. Traumtouren-Kino und spektakuläre EOFT-Filme Im Traumtouren-Kino in Halle 1 / 1. OG (Raum 16) können Besucher auch in diesem Jahr faszinierende Caravaning-Destinationen entdecken. Die Reiseexperten Konstantin Abert und Uwe Hamm entführen das Publikum mit beeindruckenden Bildern in nahe und ferne Traumziele. Spektakuläre Aufnahmen und mitreißende Geschichten rund um den Globus gibt es bei folgenden Shows: Island & Färöer - ein Traum aus Feuer und Eis, Oman und Saudiland - neue Destinationen für das perfekte Überwintern mit dem Wohnmobil, Patagonien & Feuerland – im Camper zum südlichsten Zipfel der Welt, Viva México! – Mit dem Wohnmobil durch ein Land voller Magie, Maya, Mezcal und Meer, Faszination Norden – Vom Baltikum bis nach Norwegen sowie 1000 Gründe für ein Reisemobil – Europa von Spanien bis in den Kaukasus. Ein besonderes Highlight erwartet die CARAVAN SALON-Gäste zudem auf der Bühne „Travel & Nature CONNECTED“ in Halle 7: Am Freitag, 5. September, präsentiert die European Outdoor Film Tour (EOFT) von 17.30 Uhr bis 19.30 Uhr in einer kostenlosen Sondervorstellung die spektakuläre Welt des Outdoor- und Abenteuersports. Mal leise und nachdenklich, mal temporeich und mitreißend, aber immer mitten ins Herz. Starke Persönlichkeiten und beeindruckende Naturbilder sorgen für echtes Outdoor-Feeling und Gänsehaut-Momente. Musterstellplatz im Freigelände Praxisnah wird es auch auf dem CIVD-Musterstellplatz, der erneut im Freigelände zwischen Halle 10 und 17 zu finden ist. Dort präsentieren Hersteller und Dienstleister unter anderem technische Lösungen für den Betrieb und die Ausstattung moderner Reisemobilstellplätze. Interessierte können sich direkt vor Ort von Experten beraten lassen. Konferenzprogramm „Destination Zukunft“ Der CARAVAN SALON Düsseldorf ist nicht nur die weltgrößte Messe für mobiles Reisen, sondern entwickelt sich zunehmend zu der zentralen Plattform für die Destinationsentwicklung des Caravaning-Tourismus. Vom 1. bis 4. September 2025 veranstaltet die Messe Düsseldorf zum zweiten Mal das Fachprogramm „Destination Zukunft“. Diese Veranstaltung bietet Destinationsexperten, Touristikern, Unternehmen und politischen Entscheidungsträgern die Möglichkeit, sich über die Chancen des Caravaning- und Outdoor-Tourismus für Städte, Gemeinden und Regionen in Deutschland und Europa auszutauschen. Rund 30 Fachreferentinnen und -referenten stellen praxisnahe Projekte, Erfahrungen und Best-Practice-Beispiele vor, die den Teilnehmenden wertvolle Impulse für ihre Arbeit liefern. „Camper des Jahres 2025“ Der ADAC sucht auf dem CARVAN SALON den „Camper des Jahres 2025“. Das Finale des bundesweiten Wettbewerbs findet am Samstag, 6. September, von 10 bis 16 Uhr auf dem Freigelände vor Halle 10 statt. Wohnmobilisten aus ganz Deutschland haben sich in regionalen Vorrunden für das große Finale qualifiziert und müssen in verschiedenen Fahrdisziplinen sowie mehreren Spezialaufgaben nun erneut ihre Camping-Fähigkeiten unter Beweis stellen. Im Vordergrund steht beim „ADAC Camper des Jahres“ neben einer großen Portion Spaß vor allem die Verkehrssicherheit. Auf die Gewinner wartet eine Traum-Campingreise nach Kanada inkl. Flug im Wert von mehr als 8000 Euro. Die Plätze zwei und drei bekommen Zubehör-Gutscheine von AL-KO in Höhe von 2000 und 1000 Euro. E-Bike-Parcours Radfahren gehört für viele Caravaning-Enthusiasten einfach dazu – ob zur entspannten Erkundung der Umgebung oder als sportlicher Ausgleich unterwegs. Besonders E-Bikes liegen voll im Trend und sind längst zum beliebten Begleiter für die Wege zwischen Stellplatz und Ausflugsziel geworden. Wer die neuesten Modelle testen möchte, ist auf dem „E-Bike-Parcours“ im Freigelände vor Halle 15 genau richtig: Hier können Besucher in einem eigens eingerichteten Bereich die Fahreigenschaften von E-Bikes, E-Scootern und Elektro-Rollern live erleben und auf Herz und Nieren prüfen. Rallye für Kinder und Adventure Camp Der CARAVAN SALON ist ein Rundum-Erlebnis – mit einem vielfältigen Rahmenprogramm, das den Messebesuch perfekt abrundet. Auch für die jüngsten Gäste ist gesorgt: An den Wochenenden lädt das AdventureCamp im Freigelände zwischen den Hallen 10 und 16 Kinder und Jugendliche zum Toben und Spielen ein. In Halle 3 und Halle 7 veranstalten der Deutsche Wanderverband und die Messe Düsseldorf während der gesamten Messelaufzeit eine spannende Rallye, bei der Kinder an verschiedenen Ständen knifflige Rätsel lösen oder bei abwechslungsreichen Mitmachaktionen ihr Können unter Beweis stellen können. Das Freigelände zwischen den Hallen ist nicht nur Ausstellungsareal, sondern auch Erholungsoase und Cateringzone. Infostand von sonnigekarriere.de Am Info-Stand im Freigelände informiert der CIVD über Ausbildungs- und Karrieremöglichkeiten in der Caravaningbranche – insbesondere in der Fachrichtung Caravan- und Reisemobiltechnik. Unternehmen können sich ebenfalls über das Thema Ausbildung informieren. Goldmobil gewinnen Im April 2025 wurde in Deutschland erstmals die Marke von einer Million zugelassener Reisemobile überschritten – ein bedeutender Meilenstein und ein starkes Zeichen für die wachsende Beliebtheit des Caravanings als Urlaubsform. Um diesen Erfolg gebührend zu feiern, startete der CIVD eine bundesweite Kommunikationskampagne mit einem besonderen Blickfang: dem Goldmobil – ein vollständig in Gold foliertes Reisemobil, das im Rahmen einer großen Roadshow quer durch Deutschland tourte. Jetzt ist die Tour zu Ende – und das Goldmobil steht zum Abschluss auf dem CARAVAN SALON in Halle 17 (Stand A 06). Alle Interessierten können es dort aus nächster Nähe bewundern, sich über die Welt des Caravanings informieren und beim großen Gewinnspiel teilnehmen: Zu gewinnen gibt es das Goldmobil. Tickets und Preise zum CARAVAN SALON Düsseldorf 2025: Die Tageskarte kostet für Erwachsene am Wochenende 20 Euro, werktags 18 Euro; Ermäßigt (Schüler, Studenten, Club CARAVAN SALON & boot, ADAC) am Wochenende 18 Euro, werktags 16 Euro, für Kinder (6 bis 12 Jahre) beträgt das Tagesticket am Wochenende und werktags 6 Euro. Darüber hinaus wird von Montag bis Freitag ein Nachmittagsticket für 10 Euro angeboten (von 14 bis 18 Uhr). Die Preise für den Preview Day liegen für Erwachsene bei 39 Euro (ermäßigt 35 Euro), Kinder von 6 bis 12 Jahren zahlen 6 Euro. Der Preview Day am 29. August bietet mit begrenztem Ticketkontingent eine besonders entspannte Atmosphäre für alle, die die Neuheiten der Branche in Ruhe entdecken wollen. Die Tickets können nur online bestellt werden. Aktuelle Informationen und Neuigkeiten gibt es unter www.caravan-salon.de .", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5938", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:33.610731", + "word_count": 1580 + }, + { + "id": "dd538a0ea4a550484605cd9dacabac94", + "title": "Aktuelle Trends auf dem CARAVAN SALON 2025", + "date": "Mon, 25 Aug 2025 00:00:00 +0200", + "summary": "Caravaning beliebter denn je", + "text": "Immer mehr Urlauber entdecken im Caravan oder Reisemobil ihre schönste Art des Reisens. Deutschland nimmt dabei eine besondere Doppelrolle ein: Als führender Industriestandort und größter Fahrzeugmarkt ist die Bundesrepublik nicht nur Zentrum der europäischen Branche, sondern zählt auch zu den beliebtesten Reisezielen für Caravaning-Fans aus dem In- und Ausland. Die Gründe für das anhaltend große Interesse am mobilen Urlaub sind vielfältig, wie Daniel Onggowinarso, Geschäftsführer des Caravaning Industrie Verbandes (CIVD), betont: „Die Wünsche und Ansprüche der Urlauber haben sich in den vergangenen Jahrzehnten grundlegend verändert. Heute legen Reisende in ihrer Freizeit mehr denn je Wert auf Individualität und Flexibilität, zugleich ist auch die Sehnsucht nach Naturerlebnissen noch größer geworden. Neben dem klassischen Sommerurlaub gewinnen auch Kurztrips und spontane Auszeiten zunehmend an Bedeutung bei den Urlaubern. Caravaning vereint all diese Bedürfnisse auf einzigartige Weise und eröffnet Freiräume, wie sie wohl kaum eine andere Urlaubsform bieten kann.“. Herausragende Produktvielfalt: Für jeden Urlaubstyp das passende Fahrzeug Vielfalt und Individualität prägen nicht nur die Reisegestaltung, sondern auch das Produktangebot der Branche. Die große Auswahl an Fahrzeuggrundrissen, Ausstattungsvarianten und Zubehör gilt als Markenzeichen der Caravaning-Industrie. Sie eröffnet Urlaubern die Möglichkeit, ihr Wunschfahrzeug ganz nach den eigenen Vorstellungen auszusuchen oder individuell zu konfigurieren: Caravans stehen für ein komfortables Reiseerlebnis mit großzügigem Raumgefühl und maximaler Freiheit am Zielort. Durch das Abkoppeln des Pkw lassen sich Einkäufe oder Ausflüge bequem erledigen, während das mobile Zuhause am Lieblingsstellplatz bleibt. Ob Modelle mit großem Stauraum, die auch reichlich Platz für Sportausrüstung bieten, oder kompakte Varianten für Paare – die Vielfalt der Caravan-Sparte spricht längst nicht mehr nur Familien an, sondern begeistert eine breite Zielgruppe. Auch das Angebot an Reisemobilen ist heute so vielfältig wie nie. Neben kompakten Kastenwagen mit oder ohne Bad, die in den letzten Jahren immer beliebter wurden, rücken inzwischen auch die klassischen Reisemobiltypen wie teilintegrierte und vollintegrierte Modelle wieder stärker ins Blickfeld der Kunden. Innenraum: Modern, komfortabel und flexibel Die Ansprüche der Kunden an das Interieur entwickeln sich kontinuierlich weiter. Besonders gefragt sind helle Farben, warme Holztöne sowie natürliche und nachhaltige Materialien, die eine wohnliche Atmosphäre schaffen und Komfort mit hochwertigem Design verbinden. Die stetig wachsende Auswahl an Gestaltungsvarianten eröffnet Reisenden zudem die Möglichkeit, ihren mobilen Wohnraum ganz nach den eigenen Vorstellungen individuell und stilvoll einzurichten. Einen besonderen Stellenwert haben flexible Raumlösungen: Klapp- und Hubbetten, verschiebbare Wände oder variable Arbeitsflächen ermöglichen eine optimale Nutzung des verfügbaren Platzes. So lassen sich Sitzecken im Handumdrehen in komfortable Schlafplätze verwandeln, während Bäder oder Stauraum bei Bedarf vergrößert werden können. Auch Sport- und Freizeitgeräte finden dank durchdachter Konzepte mühelos Platz. Zur modernen Ausstattung zählt heute außerdem smarte Bordtechnik: Über Tablet oder Smartphone lassen sich Klimaanlage und Heizung bequem steuern – auch aus der Ferne. Wasser- und Gasvorräte sind auch digital abrufbar. Auf diese Weise verbinden aktuelle Modelle stilvolles Design, clevere Raumkonzepte und digitale Innovation zu einem zeitgemäßen und komfortablen Reiseerlebnis. Autarkie: Freiheit ohne Grenzen Autarkes Reisen hat sich zu einem zentralen Trend unter Caravaning-Urlaubern entwickelt. Immer mehr Reisende suchen bewusst Orte abseits der großen Touristenzentren und bevorzugen naturnahe Stell- und Campingplätze. Der Wunsch nach Unabhängigkeit erhöht die Nachfrage nach moderner Ausstattung wie leistungsstarken Akkupaketen und Solarpanels, die längere Aufenthalte fernab klassischer Infrastruktur ermöglichen. Zudem wächst das Interesse an Reisemobilen mit Allradantrieb, die selbst entlegene Stell- und Campingplätze unabhängig von Bodenbeschaffenheit und Witterung sicher erreichbar machen. Damit werden die Fahrzeuge zur idealen Wahl für Urlauber, die Abenteuerlust, Flexibilität und Naturverbundenheit miteinander verbinden möchten. Die Entwicklung verdeutlicht, dass die Ansprüche an Caravans und Reisemobile kontinuierlich steigen. Die Branche reagiert darauf mit innovativen Lösungen, die Funktionalität, Komfort und moderne Technik vereinen und sowohl langjährige Caravaning-Fans als auch neue Generationen von Outdoor-Enthusiasten begeistern. Tickets und Preise zum CARAVAN SALON Düsseldorf 2025: Die Tageskarte kostet für Erwachsene am Wochenende 20 Euro, werktags 18 Euro; Ermäßigt (Schüler, Studenten, Club CARAVAN SALON & boot, ADAC) am Wochenende 18 Euro, werktags 16 Euro), für Kinder (6 bis 12 Jahre) beträgt das Tagesticket am Wochenende und werktags 6 Euro. Darüber hinaus wird von Montag bis Freitag ein Nachmittagsticket für 10 Euro angeboten (von 14 bis 18 Uhr). Die Preise für den Preview Day liegen für Erwachsene bei 39 Euro (ermäßigt 35 Euro), Kinder von 6 bis 12 Jahren zahlen 6 Euro. Die Tickets können ausschließlich online bestellt werden. Aktuelle Informationen und Neuigkeiten gibt es unter www.caravan-salon.de .", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5936", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:33.893395", + "word_count": 707 + }, + { + "id": "db4ed5039438fa815131edfc2fe1f18d", + "title": "Neue Baureihen und Sondermodelle machen Caravaning noch attraktiver", + "date": "Fri, 22 Aug 2025 00:00:00 +0200", + "summary": "CARAVAN SALON DÜSSELDORF 2025", + "text": "Der CARAVAN SALON DÜSSELDORF, die weltgrößte Messe für die mobile Freizeit, zeigt vom 29. August bis 7. September 2025 die wichtigsten Innovationen der Caravaning-Branche. In 15 Hallen und im Freigelände präsentieren über 800 Austeller die neuesten Caravans, Reisemobile und Campervans sowie Zubehör, Ausbauteile, Zelte und Mobilheime. Auch Urlaubsdestinationen, Camping- und Reisemobilstellplätze erwarten die Besucher. Kaufinteressenten wird es freuen: Mit zahlreichen neuen Baureihen und Sondermodellen machen die Hersteller von Caravans und Reisemobilen den Einstieg in die Freizeitform Caravaning einfacher, attraktiver und preisgünstiger. Neben den Neuheiten im Einstiegssegment sind in der Mittel- und Oberklasse auch Autarkie und Komfort weiterhin im Fokus. Mehr Unabhängigkeit von Infrastruktur schaffen bei Reisemobilen der zunehmend beliebte Allradantrieb, Solaranlagen zur Stromerzeugung und Systeme zur Wasseraufbereitung. Bei den Ausstattungen moderner Freizeitfahrzeuge setzt sich die Vernetzung aller Systeme mit dem Smartphone unter dem Schlagwort Smart Caravaning auf breiter Front durch. Kaum ein Hersteller hat diese moderne Form der Steuerung nicht in Serie oder optional im Angebot. Das macht den Umgang mit dem Freizeitfahrzeug deutlich komfortabler. Manches Highlight wird traditionsgemäß erst am ersten Messetag enthüllt. Die Besucher des CARAVAN SALON 2025 können sich also noch auf manche Überraschung freuen – zusätzlich zu den folgenden 269 Premieren, die hier in alphabetischer Reihenfolge aufgeführt sind. Adria, Halle 10/A29 Der slowenische Hersteller Adria feiert 60jähriges Jubiläum und bringt daher in allen Baureihen Sondermodelle in „60Y“-Ausstattung nach Düsseldorf. Insgesamt sechs Modelle der Twin Matrix-, Coral- und Compact-Baureihen profitieren so von üppiger Ausstattung zum Vorzugspreis. Die Kastenwagenausbauten der Slowenen haben ab 2026 zwei neue Spitzenmodelle. Unter dem Namen Supertwin starten zwei Grundrisse auf Mercedes Sprinter mit Allradantrieb und gehobener Ausstattung. Zum Geburtstag präsentiert Adria außerdem die neue Teilintegrierten-Baureihe Compact Max auf Volkswagen Crafter. Drei Varianten davon bringen die Slowenen nach Düsseldorf. Bei den Caravans hat Adria seinen kompakten Klassiker Action komplett überarbeitet. Modernes Styling sowie ein Aufbau mit XPS Dämmung und GfK Boden werten den nur 5,94 Meter kurzen Touringcaravan auf. Zudem bringt Adria zwei Caravans der Altea-Baureihe als „60Y“ Sondermodell heraus: Den 502 UL für Paare und den 552 OPK für Familien. Ahorn Camp, Halle 11/A06 Ahorn Camp aus Speyer hat seine komplette Modellpalette überarbeitet und auf dem neuen Renault Master aufgebaut. Zudem werden alle Fahrzeuge nun in Italien im Laika-Werk in San Casciano gefertigt. Die Isolierung der Wohnkabinen erfolgt nun in GfK-Sandwichbauweise mit XPS-Isolierung. Der umfassende Neuaufbau der Modellplatte startet mit elf Modellen in den Aufbauformen Kastenwagenausbau, Teilintegrierte und Alkoven. Aquatec, Halle 3/A04 WM Aquatec zeigt mit der neuen UV-8 Steel eine kompakte UV-C-LED-Einheit für die chemiefreie Wasserdesinfektion mit UV-Licht in Freizeitfahrzeugen. Die Anlage eignet sich für alle Pumpensysteme und verarbeitet bis zu acht Liter Wasser pro Minute. Ein integrierter Durchflusssensor aktiviert das System, sobald Wasser entnommen wird. Batterium, Halle 13/F17 Unter dem Markennamen Ective präsentiert Batterium zahlreiche Komponenten für Solaranlagen in Reisemobilen und Caravans. Neu ist eine Markise, die mit flexiblen aufrollbaren Solarmodulen Strom erzeugt. Die biegsamen CGIS Module sind wie bei einer herkömmlichen Markise während der Fahrt in der Markisenkassette untergerbacht. Im ausgerollten Zustand fangen Sie die Sonnenstrahlen ein und produzieren laut Hersteller bis zu 4,5 kWh Strom pro Sonnentag. Benimar, Halle 10/A21 Die zur Trigano-Gruppe gehörende spanische Marke Benimar bringt mit dem Benimar Tessoro 425 ist ein neues Familienmodell in seiner Teilintegrierten-Baureihe. Der ungewöhnliche Grundriss hat serienmäßig zwei Etagenbetten im Heck und optional ein Hubbett für zwei über der geräumigen Sitzgruppe. Auch diese lässt sich zum Doppelbett umbauen. So könnten sogar sechs Personen im 7,20 Meter langen Tessoro 425 schlafen. Bürstner, Halle 6/B05 Bürstner stellt zum Modelljahr 2026 sein Reisemobilportfolio vollständig neu auf. In den drei Baureihen Papillon, Habiton und Signature werden zunächst vier Modelle neu vorgestellt, die in Zukunft nach und nach ergänzt werden. Der Kastenwagenausbau Papillon startet auf Citroën Jumper mit einem 6 Meter Modell, dessen Preisliste bei unter 40.000 Euro beginnen soll. Habiton ist ein Kastenwagenausbau auf Mercedes Sprinter, dessen Clou – ein verschiebbares Bad – Längseinzelbetten bei unter 6 Metern Gesamtlänge ermöglicht. Signature schließlich umfasst zwei teilintegrierte Modelle, eines mit Längseinzelbetten und eines mit Queensbett. Drei seiner bewährten Campervans und Teilintegrierten belässt Bürstner als „B66“ Sondermodelle mit erweiterter Ausstattung und Preisvorteil im Angebot. Auch bei den Caravans stellt Bürstner acht Modelle als „B66“ Sondermodell zur Wahl. Sie umfassen sowohl Grundrisse für Paare als auch Familien in der mittleren Größe zwischen 6,80 und 8 Metern Länge. Carado, Halle 6/A07 Carado zeigt mit dem Van V347 ein neues teilintegriertes Reisemobil mit Längseinzelbetten im Heck. Der Clou des V347 ist ein neuartiges Schwingbett das neben der Sitzgruppe im vorderen Wagenteil an der rechten Wand montiert ist. Bei Bedarf schwingt es mithilfe eines Stahlgestänges über die Sitzgruppe und bietet einen zusätzlichen Schlafplatz mit bis zu 100 Kilogramm Traglast. Carado nennt es Clever-Lift-Bett. Zudem zeigt Carado mit dem T 328 ein teilintegriertes Reisemobil mit fünf für die Fahrt zugelassenen Sitzplätzen und fünf Schlafplätzen: Zwei in den Längseinzelbetten im Heck, zwei weitere im Hubbett über der Sitzgruppe und einem in der umgebauten Sitzgruppe darunter. Bei den Kastenwagenausbauten zeigt Carado mit dem CV 541 pro einen ungewöhnlichen Grundriss auf einen 5,41 Meter kurzen Fiat Ducato. Das Fahrerhaus bleibt dabei komplett mit einer Wand abgetrennt. Betreten wird der Wohnraum durch die Schiebetür. Im Erdgeschoss stehen Koch-/Wohnbereich und Bad zur Verfügung. Eine Treppe führt hinauf zum Schlafplatz unter dem Klappdach. Caravelair, Halle 11/C44 Die zum französischen Trigano Konzern gehörende Marke Caravelair bringt mit dem Alba 462 einen neuen kompakten Touringcaravan auf den Markt. Bei 6,65 Metern Gesamtlänge ist der Wohnwagen nur 2,10 Meter breit und dadurch leichter durch Ortsdurchfahrten manövrierbar. Längseinzelbetten im Bug, Sitzgruppe für zwei und Sanitärraum im Heck sowie ein Küchenblock in der Mitte kennzeichnen den Grundriss. Carthago, Halle 4/A12 Carthago hat seine Chic C-Line-Baureihe einer gründlichen Überarbeitung unterzogen. Die sechs vollintegrierten Reisemobile sind nun wahlweise auf Fiat Ducato oder Mercedes Sprinter zu haben, jeweils mit AL-KO Tiefrahmenchassis. Das Außendesign ist durch eine neue Front dynamischer geworden. Im Innenraum wirken die Integrierten nun geradliniger und klarer. Mit Längen zwischen 7,39 und 8,78 Metern richten sich die Modelle an Kunden mit hohem Anspruch an Wohnkomfort. Challenger, Halle 10/C20 Die Trigano-Marke Challenger erweitert ihre S-Baureihe der schmalen teilintegrierten Reisemobile mit 2,10 Metern Breite um das neue Modell S 294. Hier finden vier Personen Platz. Zwei im Querdoppelbett im Heck und zwei auf dem serienmäßigen Hubbett über der Sitzgruppe im Bug des S 294. Chausson, Halle 11/A45 Auch Chausson, die Schwestermarke von Challenger aus der Trigano Gruppe, bringt den schmalen S 294 im Modelljahr 2026 neu heraus. Die beiden Schwestermodelle unterscheiden sich lediglich hinsichtlich Innen- und Außendekor, Ausstattung und Preis. Clever Mobile, Halle 12/B03 Die Marke Clever zeigt auf dem CARAVAN SALON den neuen Kastenwagenausbau 636 Active. Charakteristisch ist sein Längsdoppelbett im Heck, das elektrisch in der Höhe verstellt werden kann und so darunter viel Stauraum für sperrige Sportgeräte schafft. Basis des Ausbaus ist ein Citroën Jumper oder Fiat Ducato mit einer Länge von 6,36 Metern. Concorde Reisemobile, Halle 16/E24 Concorde hat seine Carver-Baureihe überarbeitet. Ebenfalls auf Iveco Daily bis 7,5 Tonnen gebaut, erhalten die sieben Liner-Modelle ein neues Cockpit mit einem Monitor mit 360 Grad Bird-View Ansicht zum leichteren Rangieren und einem zweiten Monitor für Navigation. Corigon, Halle 6/B07 Die Hymer Gruppe erweitert ihr Produktangebot gleich um eine neue Marke. Unter dem Namen Corigon sollen in Zukunft Reisemobile präsentiert werden, die sich auf das Wesentliche konzentrieren. Vier Baureihen mit insgesamt zwölf Modellen machen im Modelljahr 2026 den Anfang. Drei Kastenwagenausbauten gehen unter dem Namen Camper Van CV an den Start. Drei teilintegrierte Modelle umfasst die Slim-Baureihe auf Ford Transit, zwei weitere die „Pure“ genannten Teilintegrierten auf Fiat Ducato und vier Grundrisse bietet die Advanced-Baureihe ebenfalls auf Fiat Ducato. Dethleffs, Halle 6/D05 Dethleffs hat zum Modelljahr 2026 vier seiner beliebtesten Reisemobil-Baureihen als Sondermodell Active aufgelegt. Insgesamt 19 Modelle kommen als Trend Active, JustGo Active, Globebus Go Active und Globetrail Active auf den Markt. Reichlich Ausstattung mit großem Preisvorteil soll die Kunden von den teilintegrierten und integrierten Reisemobilen überzeugen. Bei den vollintegrierten Reisemobilen ergänzt Dethleffs einen in dieser Fahrzeugklasse eher selten zu findenden Grundriss: Ein Vollintegrierter für Familien. Bis zu fünf Personen finden im XL Family einen Schlafplatz. Dazu hat er zwei Längseinzelbetten im Heck, ein Hubbett über den Fahrersitzen und eine zum Bett umbaubare L-Sitzgruppe. Auch bei den Wohnwagen hat Dethleffs Active Sondermodelle zusammengestellt. Drei Vertreter der C’Joy-Baureihe und vier Varianten der C’Go-Serie kommen mit reichlich Ausstattung und attraktivem Preisvorteil zum CARAVAN SALON nach Düsseldorf. Dreamer, Halle 4/B01 Zwei neue Kastenwagenausbauten zeigt die Marke Dreamer der französischen Rapido Gruppe zur Saison 2026: Den Campervan Dreamer Fun D 68 mit 6,36 Metern Länge und Längseinzelbetten im Heck sowie den 5,41 Meter kurzen Dreamer Select D 43 Up mit Querdoppelbett im Heck. Eberspächer, Halle 13/A49 Die neuen Dachklimaanlagen der Breezonic Slim-Serie von Eberspächer sind mit 22 Zentimetern Höhe besonders flach und können dank integrierter Wärmepumpe nicht nur kühlen, sondern auch heizen. Eifelland, Halle 15/A09 Die junge Campervan-Marke Eifelland zeigt als drittes Modell ihres Portfolios zur Saison 2026 den Eifelland Relax Master auf Basis des Renault Master. Trotz 6,38 Metern Gesamtlänge verzichtet der Ausbau auf einen Sanitärraum und setzt dafür voll auf ein großes Längsdoppelbett und reichlich Stauraum darunter. Eriba, Halle 6/B07 Die Marke Eriba aus dem Hymer-Konzern hat für den CARAVAN SALON ihre Caravan-Baureihen Feeling und Novaline komplett überarbeitet. Drei Modelle der Feeling-Baureihe und sechs Varianten der Novaline-Serie stellen kompakte Abmessungen und niedriges Gewicht ins Zentrum der Entwicklung. Der Feeling hat ein Hubdach, das im angehobenen Zustand volle Stehhöhe herstellt. Die Novaline-Modelle haben stets volle Stehhöhe mit festem Dach. Außen- und Innengestaltung wurden erneuert und auch die technische Ausstattung mit einer App-Steuerung der Bordtechnik modernisiert. E-Trailer, Halle 13/F90 Mit seinem neuen Linked-System zur Integration von Fremdgeräten zeigt E-Trailer auf dem CARAVAN SALON 2025 erstmals die dritte Ausbaustufe seiner Smart Caravaning-Lösung zur Steuerung von Campingfahrzeugen per App. E-Trailer Linked kann nun über verschiedene BUS-Systeme zum Beispiel mit dem Kühlschrank oder der Klimaanlage kommunizieren, diese an- und ausschalten und steuern. Das Linked-System ist als OEM-Produkt für Reisemobil und Caravanhersteller konzipiert. Es wird in Abstimmung mit den Herstellern auf die Anforderungen der jeweiligen Fahrzeuge angepasst und ab Werk in Neufahrzeuge integriert. Etrusco, Halle 6/A01 Der italienische Hersteller Etrusco aus der Hymer-Gruppe bringt drei neue Modelle zum CARAVAN SALON. Zwei davon sind Alkoven Reisemobile auf Fiat Ducato mit vier Schlafplätzen und 6,99 Metern Gesamtlänge. Der A 6.9 DB und A 6.9 SB unterscheiden sich dabei nur durch die Anordnung der Betten im Heck – einmal als Querdoppelbett und einmal als Längseinzelbetten. Das dritte Modell ist der Kastenwagenausbau CV 600 SB auf Fiat Ducato mit Einzelbetten im Heck bei einer Gesamtlänge von knapp 6 Metern. Eura Mobil, Halle 10/C43 Mit der Baureihe Profila T Freestyle möchte Eura Mobil ein größeres Raumangebot in die Klasse der teilintegrierten Reisemobile bis 3,5 Tonnen bringen. Der Profila Freestsyle ist daher konsequent auf Leichtbau ausgerichtet. Zwei Grundrisse stehen im Modelljahr 2026 zur Auswahl: Der 726 EF mit Längseinzelbetten im Heck und der 726 QF mit Queensbett im Heck. Das Modell QF bietet mit stolzen 7,66 Metern Länge eine für die 3,5 Tonnen-Klasse bisher ungekannte Größe. Mit dem Integra Line GT 726 QF zeigt Eura Mobil den zweiten Vertreter der neuen Integrierten-Baureihe auf Mercedes Benz Sprinter erstmals dem Publikum. Das neue Modell 726 QF mit Queensbett im Heck ist mit 7,64 Metern Länge gut 17 Zentimeter länger als die bereits bekannte Einzelbett-Variante. Fendt Caravan, Halle 5/C03 Fendt Caravan erweitert seine Bianco-Baureihe um das Modell Bianco Selection 495 SG. Der Zwei-Personen-Caravan verfügt über eine Sitzgruppe im Bug und Längseinzelbetten im Heck. Dazwischen sind Bad, Küche und Schränke angeordnet. Zusätzlich nimmt Fendt zwei neue Activ-Grundrisse in der Baureihe Apero ins Programm. Der Apero Activ 560 SKM ist ein Familien-Caravan mit Stockbetten, der Apero Activ 390 FH ein kompakter Touringcaravan für Paare. Zudem präsentiert Fendt seine neue Marke Next (siehe unter N). Fleurette, Halle 4/D12 Die französische Marke Fleurette aus der Rapido-Gruppe stellt auf dem CARAVAN SALON den neuen Teilintegrierten Migrateur 69 LJG auf Fiat Ducato Basis vor. Längseinzelbetten im Heck, davor Küchenblock und Bad im Mittelteil sowie eine Sitzgruppe mit Face-to-Face-Sitzbänken und drehbaren Fahrerhaussitzen im Bug kennzeichnen den 6,99 Meter langen Grundriss. Unter dem Markennamen Florium bietet Fleurette zudem zwei neue Kastenwagenausbauten auf Fiat Ducato an. Der Black Pearl 59 LT und 63 LJ unterscheiden sich in Länge und Bettenanordnung im Heck. Während der 5,99 Meter lange 59 LT ein Quer-Doppelbett im Heck hat, wartet der 6,36 Meter lange 63 LJ mit Längseinzelbetten im Heck auf. Forster, Halle 10/C25 Forster stellt zur Saison 2026 die Kastenwagen-Baureihe Livin’up Pro mit drei Grundrissen auf Basis des Citroën Jumper vor. Mit Längen von 5,41 bis 6,36 Metern, solider Ausstattung und attraktivem Preis sollen vor allem Caravaning-Neueinsteiger gewonnen werden. Zudem präsentiert Forster mit den I 745 QF und I 745 EF zwei neue Vollintegrierte in der Einsteigerklasse. Der 745 EF setzt dabei auf Längseinzelbetten im Heck, der 745 QF auf ein zentrales Doppelbett. Davor befindet sich ein Raumbad mit Dusche und schließlich die Küche und die Sitzgruppe. Beide Vollintegrierten sind 7,45 Meter lang und bauen auf dem Fiat Ducato-Chassis auf. Frankia, Halle 17/B22 Der Next:Cruiser 7.6 L soll für Frankia die Keimzelle einer neuen Premium-Baureihe von autarken teilintegrierten Reisemobilen sein. Auf Basis des Mercedes Sprinter oder Fiat Ducato setzt der Next:Cruiser auf Stromspeicher mit bis 470 Ah und drei Solarpanele auf dem Dach. 180 Liter Frischwasser und eine ALDE-Warmwasserheizung sollen für Autarkie zu allen Jahreszeiten sorgen. Zusätzlich präsentiert Frankia anlässlich des 65 Jährigen Firmenjubiläums vier Sondermodelle namens Together. Die Together A 680 und Together A 740 als Alkoven-Variante und Together I 680 und I 740 als integrierte Version. Alle vier bauen auf dem Fiat Ducato auf und haben eine Rundsitzgruppe im Heck und Längsbetten im Alkoven beziehungsweise im Hubbett über den Fahrersitzen. Dazu eine großzügige Ausstattung mit Preisvorteil wie bei Sondermodellen üblich. Freedo, Halle 12/C81 Freedo ist die Tochtermarke des polnischen Kastenwagenausbauers Affinity. Zum CARAVAN SALON 2025 zeigt sie den M 599 auf Basis eines MAN TGE. Multifunktionalität steht im Mittelpunkt des Fahrzeugs. So kann die große Rundsitzgruppe im Heck nachts als Bett umgebaut werden und tagsüber als Sitzgruppe fungieren. Giottiline, Halle 11/D27 Der italienische Hersteller Giottiline ergänzt seine Auswahl von teilintegrierten Reisemobilen um drei neue Modelle. Die beiden Compact CX 60 und CX 66 mit 5,99 und 6,60 Metern Länge bieten ein optionales Hubbett über der Sitzgruppe und ermöglichen damit vier Schlafplätze. Der Teilintegrierte Siena 396 bringt auf 7,4 Metern Länge einen Familiengrundriss mit Etagenbetten im Heck und Hubbett über der Sitzgruppe im vorderen Wagenteil. Zusätzlich wird der Giottivan 64 G erstmals in Düsseldorf gezeigt: Ein 6,36 Meter langer Kastenwagenausbau mit Längseinzelbetten im Heck. Als Basisfahrzeug haben die Kunden dabei die Wahl zwischen Fiat Ducato, Citroën Jumper oder Peugeot Boxer. Der Giottiline Siena 485 schließlich ist ein neues Alkoven-Reisemobil mit 6,99 Metern Länge und Längseinzelbetten im Heck zusätzlich zum großen Alkovenbett über dem Fahrerhaus. Goldschmitt, Halle 14/D05 Goldschmitt erweitert die Steuerung seiner RHC-Zusatzluftfederungen um eine Wiegefunktion für die Hinterachse: Damit lässt sich das tatsächliche Gewicht der Hinterachse über die Smartphone-App ermitteln und anzeigen. Ein wichtiger Zugewinn an Sicherheit und Kontrolle zur Vermeidung von Überladung. Hymer, Halle 6/B07 Sowohl die Teilintegrierten B-MC T als auch die vollintegrierten Reisemobile B-MC I unterzieht der Traditionshersteller aus Bad Waldsee einem gründlichen Update. Neben dem neuen Design fällt besonders der neu gestaltete Badbereich mit großzügiger Dusche ins Auge sowie die smarte Hymer Connect App, durch die sich viele Funktionen vom Smartphone aus prüfen und schalten lassen. Zu Beginn stehen zwei teilintegrierte und zwei vollintegrierte Grundrisse auf Basis des Mercedes Sprinter zur Auswahl. Zudem zeigt Hymer eine neue Campervan-Baureihe auf Fiat Ducato unter dem Namen Columbia, die zunächst mit den zwei Modellen 600 und 601 startet. Itineo, Halle 4/C02 Itineo baut das teilintegrierte Reisemobil Cozi PS 740 zum Familienmobil um. Im Heck steht nun ein Etagenbett für zwei Kinder mit Sitzgruppe davor. Eine Schiebetür schließt das Kinderzimmer vom Rest des Wohnmobils ab. Die Eltern schlafen im Hubbett über der Sitzgruppe im vorderen Teil des Reisemobils. Ebenfalls neu ist das vollintegrierte Reisemobil Famili JC 740. Auf 7,42 Metern Länge hat es Platz für eine fünfköpfige Familie. Als Schlafstätten dienen dabei Längseinzelbetten im Heck, ein Hubbett über den Fahrerhaussitzen sowie ein Schlafplatz in der umbaubaren Sitzgruppe. Die Längseinzelbetten im Heck lassen sich elektrisch in der Höhe verstellen, um mehr Stauraum in der Heckgarage darunter zu schaffen. Karmann Mobil, Halle 15/E24 Im Heck des neuen Karmann Dexter 635 dominiert ein Längsdoppelbett den Raum, das elektrisch höhenverstellbar ist. Der opulente Stauraum darunter lässt sich so flexibel nutzen. Flexibilität ist auch die Devise beim Schwenkbad: Dank einer klappbaren Wand lässt sich das Bad als Dusche oder Toilette nutzen. Karoo Oy, Halle 7a/B18 Das finnische Designerteam von Karoo kündigt für den CARAVAN SALON 2025 einen neuen kompakten Touringcaravan mit unter 750 Kilogramm zulässigem Gesamtgewicht an. Er soll gerade einmal fünf Meter lang sein und 2,05 Meter breit. Ein Aluminiumchassis und ein leichter GfK-Aufbau sparen Gewicht. Der Wohnwagen ist besonders für E-Autos mit niedrigen Zuggewichten konzipiert. Knaus, Halle 1/A01 Knaus zeigt auf dem CARAVAN SALON 2025 die neue Campervan-Baureihe Boxtime. Die vier Modelle setzen beim Innenausbau vor allem auf Leichtigkeit. Bis zu 60 Kilogramm Gewichtsersparnis wurde aus dem Möbelbau der 5,41 bis 6,36 Meter langen Modelle herausgeholt. Ein neues Schwenkband mit Thetford Kassettentoilette lässt sich dank einer klappbaren Wand auch als Dusche nutzen. Bei den Caravans sortiert Knaus seine Südwind-Baureihe neu. Einige Grundrisse fallen weg, dafür werden drei neue Familien-Caravans 580 UF, 650 UK und 650 UDF ins Programm aufgenommen. Alle drei haben ein französisches Bett im Heck und einen daneben platzierten Sanitärraum. La Strada, Halle 15/D26 la strada Fahrzeugbau gönnt allen Modellen der Saison 2026 eine neue Smart Caravaning Elektronikausstattung. Am neuen digitalen Bedienpanel und per App auf seinem Smartphone kann der Kunde dann Füllstände, Temperatur und Fahrzeugneigung ablesen. Heizung, Kühlschrank, Wasserpumpe, Außenbeleuchtung und 12-Volt-Strom lassen sich auch per App ein- und ausschalten. Je nach Version geschieht das serienmäßig im Nahbereich um das Fahrzeug oder optional auch per Fernabfrage von überall auf der Welt. LMC Caravan, Halle 6/A04 Zum Modelljahr 2026 führt LMC die neue Tracer-Baureihe ein. Fünf teilintegrierte Reisemobile auf Basis des Fiat Ducato oder Citroën Jumper setzen vor allem auf Leichtbau, um mit Längen zwischen 6 und 7,3 Metern noch in der 3,5 Tonnen Klasse zu fahren. Leicht und günstig ist wohl auch das Motto der zwei neuen Caravan-Modelle in der LMC e:dero-Baureihe. Der 470 k ist mit vier Schlafplätzen für Familien konzipiert, der kompakte 400 c richtet sich an Paare. Malibu, Halle 4/B22 Zur Saison 2026 hat Malibu seine vollintegrierten Reisemobile rundum neu gestaltet. Mit fünf Grundrissen geht die Integrierten-Baureihe von Malibu dabei an den Start. Ein neues kantigeres Front- und Heckdesign verleiht den Modellen mehr Dynamik. Im Innenraum prägen klare Linien und konkave Hängeschranklappen ohne Griffe das Bild. Kunden können zwischen dem Fiat Ducato und dem Mercedes Sprinter als Basis wählen. Mit dem Relax 640 LE R zeigt Malibu zudem einen neuen Kastenwagenausbau, der den Grundstein für die neue Relax-Baureihe legen soll. Im 6,36 Meter langen Fiat Ducato baut Malibu dazu Längseinzelbetten im Heck ein, einen kompakten Küchenblock und ein für diese Fahrzeugklasse geräumiges Bad. Masuria, Halle 11/B07 Erstmals auf dem CARAVAN SALON vertreten ist die neue polnische Marke Masuria. Sie präsentiert zwei teilintegrierte Reisemobile auf Basis des Ford Transit. Sie unterscheiden sich vor allem durch die Bettenanordnung im Schlafbereich. Der 780 TL setzt auf Längseinzelbetten im Heck, der 790 TL auf ein Queensbett. Davor befindet sich jeweils ein Raumbad und der Koch-/Wohnbereich. Optional ist ein Hubbett über der Sitzgruppe als weitere Schlafstatt für zwei verfügbar. Megasat, Halle 13/C60 Der Hersteller für Satellitentechnik und Camping-TVs zeigt gleich acht Neuheiten auf dem CARAVAN SALON. Mit der tragbaren vollautomatische Sat-Anlage Campingman Portable 2 stellt Megasat erstmals eine Antenne mit integrierter Sat-Hold-Technologie vor. Das Gerät hält das Signal auch bei einer Signalstärkeänderung oder nach einem Stromausfall. Eine erneute Suche entfällt. Zusätzlich zeigt Megasat die neuen Empfangsgeräte Caravanman Kompakt 4, Traveller-Man 4 und Caravanman 55 Professional GPS. Dazu noch vier Smart-TV-Screens mit 19, 22, 24 und 27 Zoll Bildschirmgröße der neuen Royal Line V Smart-Serie. Mobilvetta, Halle 10/A18 Der italienische Reisemobil-Hersteller Mobilvetta hat zum Modelljahr 2026 seine Kea-Baureihe komplett überarbeitet. Vier Grundrisse teilen sich auf zwei Aufbauformen auf: Zwei als Integrierte Kea I und zwei als Teilintegrierte Kea P. Alle vier bauen auf Fiat Ducato auf und sind 7,47 Meter lang. Im Innenraum möchte Mobilvetta Design und Alltagstauglichkeit miteinander verbinden. Morelo, Halle 16/A04 Der Luxusmobile-Hersteller aus Franken hat seine Einsteiger Baureihe Home komplett überarbeitet. Auf Basis des Iveco Daily baut Morelo drei Grundrisse, die den Einstieg in die Welt der „Liner“ genannten Landyachten darstellen. Das leichteste und kürzeste Modell der Morelo-Familie ist zukünftig der Home 78 L, der mit 5,6 Tonnen zulässigem Gesamtgewicht und 7,81 Metern Länge noch mit der C1 Fahrerlaubnis zu fahren ist. Next, Halle 5/C03 Mit Next stellt Fendt Caravan eine neue Marke vor, die vor allem leichte und unkomplizierte Wohnwagen für kleine Zugwagen und E-Autos repräsentieren soll. Den Anfang macht auf dem CARAVAN SALON 2025 der Next 380. Er bietet drei Schlafplätze, Sitzgruppe, Küchenblock und Bad bei einer Gesamtlänge von nur 5,88 Meter und einem zulässigen Gesamtgewicht von 1.000 Kilogramm. Niesmann + Bischoff, Halle 6/C01 Der Hersteller von Luxusmobilen aus der Hymer-Gruppe ergänzt zum CARAVAN SALON 2025 die Arto-Baureihe um das neue Modell Arto 84. Der 8,45 Meter lange Arto 84 bildet nun die Mitte der drei Modelle in der Arto Baureihe auf Mercedes Sprinter. Die luxuriösen Liner bieten höchsten Wohnkomfort mit edlem Ambiente und hochwertiger technischer Ausstattung. Niewiadow, Halle 11/C03 Zum 50ten Jubiläum zeigt der traditionsreiche polnische Caravanhersteller seinen Erstling N126-D in einer farbenfrohen Gelato-Edition. Innen- und Außendesign heben sich durch die drei wählbaren Farbtöne Himbeere, Limone und Pistazie deutlich ab. Inspiriert wurde die Gestaltung vom italienischen Eismacherhandwerk. Der N126-D ist seit Firmengründung im Programm und hat sich seither technisch weiterentwickelt. Mit seinen kompakten Abmessungen von 4,5 Metern Gesamtlänge und 850 Kilogramm zulässigem Gesamtgewicht ist er inzwischen ein Klassiker der kompakten Touringcaravans. Zusätzlich präsentiert der polnische Hersteller mit dem neuen Villetta 780 seinen bisher größten Caravan. Im Stil eines Tiny Houses mit viel Holz eingerichtet, bringt der Doppelachser mit 9,37 Metern Gesamtlänge rund 2.700 Kilogramm Gesamtgewicht auf die Waage. Notin, Halle 4/A06 Neu im Programm des französischen Herstellers Notin sind die zwei teilintegrierten Reisemobile Victoria und Bruges. Victoria baut auf Fiat Ducato auf und ist 6,99 Meter lang, der ebenfalls knapp sieben Meter lange Bruges basiert auf einem Mercedes Sprinter. Outwell, Halle 3/C70 Unter dem Namen Road Trip Air zeigt der dänische Vorzelt- und Campingzubehör-Spezialist auf dem CARAVAN SALON 2025 drei Luftvorzelte für kompakte Campingbusse. Talladega, Daytona und Santa Monica heißen die frei stehenden Vorzelte in verschiedenen Größen für Campingbusse und Kastenwagenausbauten in unterschiedlichen Basisfahrzeugen. Panama, Halle 11/A57 Der Campingbus-Spezialist aus Spanien zeigt zwei neue Modelle auf Ford Transit Custom. Der P09 ist das neue Einstiegsmodell mit Fokus auf hoher Alltagstauglichkeit mit zwei Schiebetüren im Fond und zum Bett umbaubarer Rücksitzbank. Der P59+ mit langem Radstand bietet hingegen schon eine Heckküche und Banktoilette sowie eine Duschmöglichkeit. Phoenix, Halle 16/E04 Der neue Phoenix Maxi-Alkoven 7800 RSL verzichtet vollständig auf Gas als Brennstoff. Der 7,5 Tonner auf Iveco Daily heizt mit Diesel, kocht mit Induktion und kühlt die Lebensmittel mit Strom. Alkoven mit Längseinzelbetten, dahinter ein großes Raumbad mit separater Dusche, Küche und Schränke im Mittelteil und eine geräumige Rundsitzgruppe im Heck kennzeichnen den Grundriss des Premium-Reisemobils für zwei Personen. Pilote, Halle 17/A20 Der französische Reisemobil Hersteller Pilote erweitert seine Atlas-Baureihe auf Basis des Ford Transit um zwei weitere teilintegrierte Modelle. Der Atlas 630 G mit Querbett im Heck ist rund 6,3 Meter kurz, das Modell Atlas 670 Gj mit Längseinzelbetten bringt es auf 6,7 Meter Länge. Bei beiden steht optional ein Hubbett über der Sitzgruppe als zweite Schafstatt zur Wahl. Bei den Kastenwagenausbauten bringt Pilote mit dem neuen Vega 630S ein Modell auf Basis des Fiat Ducato, in dem im Heck zwei Doppelbetten übereinander Schlafplatz für vier Personen schaffen. Pioneer Electronics, Halle 13/A44 Ein Mediacenter mit 10,1 Zoll Bildschirm speziell für Reisemobile stellt Pioneer unter dem Namen SPH-EV0107DAB vor. Das Besondere: Das Modell gibt es als Ein- und Zwei-Schacht Variante und es lässt sich auf alle gängigen Basisfahrzeuge für Reisemobile anpassen: Fiat Ducato und die Stellantis-Schwestermodelle, Mercedes Sprinter, Ford Transit, Renault Master und Volkswagen Transporter. Pössl, Halle 12/A02 Der neue Pössl Summit 600 L ergänzt die Auswahl des Marktführers im Segment der Kastenwagenausbauten. Dabei bringt Pössl in einem 5,99 Meter langen Fiat Ducato Längseinzelbetten im Heck unter. Der Marktführer setzt dabei auf eine moderne Innenraumgestaltung und eine günstigen Einstiegspreis. Rapido, Halle 4/C05 Der französische Hersteller Rapido hat seine zwei vollintegrierten Reisemobile 850F und 80dF vollständig überarbeitet. Die neuen Modelle erhalten eine neue Front mit größerer Windschutzscheibe für bessere Sicht und bessere Geräuschdämmung. Der 80 dF erhält zudem auch ein neues Heckdesign. Basis der Vollintegrierten ist der Fiat Ducato. Reich, Halle 14/C07 Reich bringt zum 50 Firmenjubiläum gleich drei neue Produkte für das Wasserssystem in Freizeitfahrzeugen nach Düsseldorf. Der Myclean active ist ein externer Aktivkohlefilter zur Befüllung von Wassertanks, der dank Gardena-Anschlüssen schnell und einfach zwischen Einfüllstutzen und Schlauch montiert wird. Zusätzlich kann der neue Myclean water steril ergänzt werden, der für mikrobiologisch einwandfreies Wasser sorgt. Dazu feiert die neue Powerflow-Druckpumpe mit einer Förderleistung von 12 L/min und 2,7 bar Druck Premiere. Rimor, Halle 11/B60 Rimor nimmt zum Modelljahr 2026 umfassende Änderungen an seiner Modellpalette vor. Gleich sechs neue Alkoven-Reisemobile stellt Rimor auf dem CARAVAN SALON 2025 aus. Sarus nennt sich die neue Baureihe, zu der auch acht teilintegrierte Grundrisse gehören. Die Alkoven-Modelle zielen vor allem auf Familien und bieten entsprechend bis zu sieben Schlafplätze. Die Teilintegrierten sind eher für Paare oder bis zu vier Personen geeignet, je nach Einsatz eines Hubbettes über der Sitzgruppe im vorderen Wagenteil. Zudem baut Rimor seine beliebte Super-Brigg-Alkovenreihe nun auf Ford Transit mit Vorderradantrieb auf und unterzieht die vier Modelle einer gründlichen Überarbeitung des Interieurs. Die gleiche Behandlung erfahren die fünf Grundrisse teilintegrierten Sailer-Baureihe. Roller Team, Halle 10/B23 Mit dem Kronos 266 TL zeigt Roller Team einen neuen Teilintegrierten auf dem CARAVAN SALON: Queensbett im Heck, davor ein Raumbad und Koch-/Wohnbereich im Bug kennzeichnen das 7,45 Meter lange Reisemobil. Zudem zeigt Roller Team die neue Kastenwagen-Baureihe Livingston Go, die Einsteiger in vier Modellen mit umfangreicher Ausstattung und attraktiven Preisen überzeugen möchte. Als Basis dient dabei der Citroën Jumper mit Längen zwischen 5,41 und 6,36 Metern. Sprite Caravans, Halle 7a/A12 Der britische Hersteller Sprite bringt zehn überarbeitete Caravans der Saison 2026 mit nach Düsseldorf. Vier Modelle aus der Mondial-Baureihe und sechs Grundrisse aus der Cruzer-Modellpalette stehen zur Wahl. Die Grundrisse unterscheiden sich von den europäischen Modellen vor allem durch große Bäder mit Duschkabinen und die typisch britischen dreiteiligen Bugfenster. Sterckeman, Halle 11/B55 Die zur französischen Trigano-Gruppe gehörende Caravan Marke Sterckeman zeigt auf dem CARAVAN SALON 2025 den neuen Grundriss Sport Edition 492 LJ mit 6,65 Metern Gesamtlänge und lediglich 1.300 Kilogramm zulässigem Gesamtgewicht. Die Längseinzelbetten im Bug und die ebenfalls zum Bett umbaubare Rundsitzgruppe im Heck machen ihn für Paare oder sogar kleine Familien einsetzbar. Zudem hat Sterckeman seine Caravan-Baureihe Open Edition überarbeitet und präsentiert drei Grundrisse mit GfK Aufbau und XPS-Isolierung in Sandwich-Bauweise mit gehobener Oberklasse-Ausstattung. Dazu gehört auch eine optionale Smart Caravaning Steuerung, mit der Füllstände, Temperatur und weitere Informationen über eine Smartphone-App abrufbar sind. Tabbert, Halle 1/A01 Tabbert möchte mit den sechs Sondermodellen der Pantiga Finest Edition den Premiumanspruch der Caravan Marke neu aufleben lassen. Die zwischen 4,94 und 7,52 Metern langen Wohnwagen für Paare oder Familien sind mit reichlich Ausstattung zu einem erheblichen Preisvorteil kalkuliert. Thetford, Halle 14/B03 Der Marktführer für Campingtoiletten zeigte im vergangenen Jahr einen Prototypen einer Trockentrenntoilette. Auf dem CARAVAN SALON 2025 stellt Thetford nun die serienreife neue Trenntoilette der S-Serie vor sowie ein Umrüstkit der SK Serie für bereits eingebaute Wassertoiletten, die auf den Cassettentoiletten C220 und C260 basieren. Truma, Halle 14/B07 Warmwasser in Rekordzeit verspricht die neue Truma Heizung Combi Neo. Dabei soll sie nicht nur leistungsfähiger sein als das nun fast schon 20 Jahre im Markt befindliche Vorgängermodell, sondern zugleich auch kompakter und leichter. Zunächst wird sie Gas und Strom als Kraftstoff kombinieren, in späteren Varianten auch Diesel. Vario Mobil, Halle 16/C23 Perfect Assoluto nennt Vario Mobil sein neues Flaggschiff, das zeigen soll, was im Segment der Luxusliner möglich ist. 26 Tonnen bringt die 12 Meter lange Landyacht auf die Waage. Vier Slide-Outs vergrößern das mit rund 30 Quadratmetern schon im eingefahrenen Zustand großzügige Raumangebot. Sind sie ausgefahren, hat allein das Schlafzimmer zehn Quadratmeter Grundfläche. Natürlich befindet sich darunter eine PKW-Garage. Die Modelle werden nach Kundenwunsch gestaltet und ausgestattet. Nur feinste Materialien werden mit größter handwerklicher Sorgfalt verarbeitet. Nach der Individualisierung sind siebenstellige Preise wahrscheinlich, aber darüber herrscht Diskretion. Weinsberg, Halle 1/A01 Weinsberg ergänzt die CaraSuite-Baureihe im Modelljahr 2026 um zwei neue Grundrisse. Die beiden teilintegrierten Reisemobile unterscheiden sich vor allem im Schlafbereich: Der 650 MEG kommt mit Längseinzelbetten im Heck, der 700 DX mit einem mittig angeordneten Queensbett. Bei den Caravans hat Weinsberg seine CaraOne Baureihe innen grundlegend überarbeitet. Die elf Modelle, die das komplette Größenspektrum von Touring- bis zum Großraumwohnwagen abdecken, sind funktional und schnörkellos eingerichtet. So wollen sie in jeder Größenklasse vor allem preisbewusste Käufer ansprechen. Westfalia, Halle 15/E04 Auf dem Ford Transit Custom zeigt Westfalia den neuen kompakten Campingbus namens Kipling. Mit Hilfe von Karosserieverbreiterungen im Heck installiert Westfalia ein Querbett mit immerhin 1,90 Meter Länge und 1,30 Meter Breite im Heck des Ford. Zusätzlich sind zwei Schlafplätze unter dem Aufstelldach nutzbar. Daten und Fakten zum CARAVAN SALON DÜSSELDORF Der CARAVAN SALON DÜSSELDORF 2025 ist von Samstag, 30. August bis Sonntag, 7. September 2025 jeweils von 10 bis 18 Uhr geöffnet. Am Preview Day, Freitag, 29. August, ist die Ausstellung für Fachbesucher, Medienvertreter und eingeladene Gäste geöffnet. Die Tageskarte kostet für Erwachsene am Wochenende 20 Euro, werktags 18 Euro; Ermäßigt (Schüler, Studenten, Club CARAVAN SALON & boot, ADAC) am Wochenende 18 Euro, werktags 16 Euro), für Kinder (6 bis 12 Jahre) beträgt das Tagesticket am Wochenende und werktags 6 Euro. Darüber hinaus wird von Montag bis Freitag ein Nachmittagsticket für 10 Euro angeboten (von 14 bis 18 Uhr). Die Preise für den Preview Day liegen für Erwachsene bei 39 Euro (ermäßigt 35 Euro), Kinder von 6 bis 12 Jahren zahlen 6 Euro. Die Tickets können ausschließlich online bestellt werden. Aktuelle Informationen und Neuigkeiten gibt es unter www.caravan-salon.de .", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5935", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:34.155078", + "word_count": 4993 + }, + { + "id": "743bd82985bc239c4b853d963d5a4066", + "title": "Mercedes trifft Innovation - der variable \nCampervan unter 6 Metern", + "date": "Fri, 08 Aug 2025 00:00:00 +0200", + "summary": "Bürstner Habiton 2026", + "text": "Patentiertes Schiebebad für maximale Flexibilität bei Tag und Nacht • Komfortabel reisen auf unter 6 Metern: zwei Einzelbetten, Halbdinette, Küche und Bad • Mercedes-Benz Sprinter als Basis – wahlweise mit Frontantrieb (ab 72.999 €) oder Allrad (ab 86.999 €) • Optimierter Innenraum mit klappbaren Betten, verschiebbarem Bad und cleverer Stauraumorganisation Mit dem neuen Habiton bringt Bürstner zur Saison 2026 einen innovativen Campervan auf Mercedes-Benz Sprinter-Basis an den Start – kompakt, alltagstauglich und technisch durchdacht. Unter 6 Meter lang, aber mit zwei echten Einzelbetten, optionalem Aufstelldach, patentierter verschiebbarer Nasszelle und großzügiger Halbdinette setzt der Habiton neue Maßstäbe in der Klasse der kompakten Premium-Campervans. Der Bürstner Habiton: Kompaktklasse mit Charakter Der Habiton positioniert sich klar im Segment der Mercedes-Campervans – aber mit einem klaren USP: Mehr Raum auf weniger Länge. Möglich macht das eine patentierte Nasszelle, die tagsüber nach vorne verschoben werden kann und so Platz in der Sitzgruppe schafft. Abends wird sie zurückgeschoben, sodass die zwei Einzellängsbetten vollständig ausgeklappt werden können. Auch die Küche ist mitgedacht: Sie ist mit Spüle, Gaskocher und Kompressor Kühlschrank ausgestattet – und bleibt dabei von außen zugänglich. So wird der Habiton auch im Alltag zum flexiblen Begleiter. Raumgefühl trifft Technik: Innen vielfältig, außen kompakt Ob im Zwei-Personen-Modus oder mit optionalem Aufstelldach für bis zu vier Schlafplätze – der Habiton überzeugt durch Vielseitigkeit. Die Halbdinette mit drehbaren Vordersitzen schafft zusammen mit der flexiblen Badlösung und den klappbaren Betten ein überraschend offenes Raumgefühl. Vielfältige Dekor- und Polsteroptionen bieten Individualisierung auf Serienniveau – und bleiben dennoch produktionsfreundlich, kalkulier- und bezahlbar. Aus der Produktion „Die Arbeit mit dem neuen Mercedes-Chassis war anspruchsvoll – besonders in Kombination mit unserer patentierten Schiebebad-Lösung. Aber genau diese Herausforderung hat uns angespornt. Wir wollten ein Fahrzeug, das vier Personen echten Wohnkomfort auf unter sechs Metern bietet – das gibt es so in der Branche nicht. Unsere größte Herausforderung war es, diese technische Innovation mit einer standardisierten, produktionsoptimierten Innenraumvielfalt und einem attraktiven Preis zu verbinden. Dass uns das gelungen ist, macht uns besonders stolz.“ — Felix Sturm, Director Operations & Production, Bürstner Positionierung im Modellportfolio Mit dem Habiton erweitert Bürstner seine Modellpalette um ein durchdachtes Mercedes-Van-Konzept im mittleren Preissegment. Im Gegensatz zu: • Papillon, der als Einstiegsmodell auf Preisbewusstsein setzt, und • Signature, der design- und komfortorientierte Käufer im Bereich unter 3,5 t anspricht, richtet sich der Habiton an mobile, aktive Reisende mit Mercedes-Affinität, die auf kompakter Grundfläche nicht auf Wohnkomfort verzichten wollen. Verfügbarkeit: Produktionsstart des Bürstner Habiton ist ab Jahresbeginn 2026 geplant. Er ist kurz danach bei allen Bürstner Fachhändlern erhältlich. Mehr auf https://www.buerstner.com", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5934", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:34.486575", + "word_count": 419 + }, + { + "id": "90656d3e3633c1d51404504d9137b283", + "title": "Die neue Wellness Oim am Camping Resort Allweglehen", + "date": "Wed, 06 Aug 2025 00:00:00 +0200", + "summary": "Entspannung mit Weitblick", + "text": "Ein Wohlfühlort mit alpinem Herzschlag: Am Rande des Nationalparks Berchtesgaden lädt die neugestaltete und liebevoll benannte „WellnessOim“ am Camping Resort Allweglehen zu einem alpinen Lebensgefühl mit Rundumverwöhnung ein. Ursprünglichkeit und Regeneration verbinden sich hier auf besondere Weise. Wellness im neuen Glanz Erst kürzlich wurde sie grundlegend renoviert und umgestaltet. Holz, Naturelemente und liebevolle Details aus der regionalen Almkultur erzählen vom Leben in den Bergen, schaffen eine ursprüngliche Atmosphäre, in der man sehr gerne mal die Zeit vergisst und in dem man sofort zur Ruhe kommt. Mit einem eigens dafür fest engagierten Team bietet das Allweglehen vielseitige Massagebehandlungen an, individuell buchbar und abgestimmt auf die persönlichen Bedürfnisse. Das kommt bei den Gästen richtig gut an. Die Angebote wechseln regelmäßig und tragen bezeichnende Namen, die neugierig machen. „Gipfelstürmer, Ruf des Adlers, Bergsteigermassage oder Entspannung unterm Watzmann“ sind nur ein kleiner Ausschnitt und spiegeln die kraftvolle Umgebung wieder. Wohlfühlen mit Panoramablick In den frühen Abendstunden zwischen 17 und 21 Uhr wird die neue WellnessOim samt den weiteren Entspannungsorten am Allweglehen zum beliebten Anlaufpunkt, besonders an regnerischen Tagen oder nach aktiven Touren im Nationalpark Berchtesgaden. Umhüllt von sanfter Wärme schweift der Blick aus der Sauna heraus durch großzügige Panoramafenster auf Watzmann und den daneben liegenden Hochkalter. Der Saunagarten mit der 95 Grad Panorama- und 60 Grad Heusauna, einer Infrarotkabine sowie dem Ruheraum mit Teelounge bietet eine massiv entspannte Umgebung zum Loslassen und einen sanften Übergang zwischen Aktivität und wohltuendem Tagesausklang. Parallel dazu lädt draußen der im Winter bis 32 Grad beheizte Infinity-Pool zum Eintauchen und zu beruhigenden Schwimmzügen ein. Das warme Wasser, kombiniert mit der frischen Bergluft verleiht eine wohltuend befreiende Leichtigkeit. Feste Größe im Wellness-Angebot Zunehmend etabliert haben sich inzwischen in der Hauptsaison die Yoga-Einheiten am Donnerstag sowie Aqua-Gym am Dienstagmorgen – kraftvoll und doch ruhig geführte Bewegungsformen, die Körper wie Geist in Einklang bringen. Die Teilnahme erfolgt unkompliziert über Anmeldung an der Rezeption. Klar ist definitiv, die neue WellnessOim ist mehr als nur ein Ort zum Wohlfühlen und Regenerieren, vielmehr ist sie ein Erlebnis zwischen Ursprünglichkeit, Komfort, Bewegung und Ruhephase. Ein feines Zusammenspiel alpiner Verwurzelung und moderner Entspannung. Aktiv unterwegs im goldenen Herbst In perfekter Kombination dazu stehen die mit regionalen Partnern durchgeführten und ebenfalls direkt am Platz buchbaren Allweglehen Adventures. Zu Land, zu Wasser und in luftige Höhen geht es dabei auf Klettertouren, Wanderungen, Rafting, Canyoning und zu aussichtsreichen Tandemflügen, stets in Begleitung erfahrener Guides. Sind das nicht verlockende Aussichten gerade für den anstehenden Herbst inmitten der Berchtesgadener Bergwelt? Wenn diese sich von ihrer schönsten Seite zeigt, die frische Bergluft für klare Fernsichten sorgt und die behagliche Wärme der „Wellness-Oim“ das Wohlbefinden steigert, dann wird das Camping Resort zu einem echten Kraftort für aktive Entdecker ebenso wie für Ruhesuchende. Informationen über die neuen Wellness- und Aktiv-Angebote unter www.allweglehen.de", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5933", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:34.739073", + "word_count": 457 + }, + { + "id": "d632c9951fd5849ffe94b0e495c55665", + "title": "Premiere des Modelljahrs 2026 auf diesjährigem Caravan-Salon", + "date": "Tue, 05 Aug 2025 00:00:00 +0200", + "summary": "Neue Evolutionsstufe des Grand \nCalifornia", + "text": "• Avantgardemodell : Neue Holzoptik verstärkt lounge-artige Atmosphäre im hellen und freundlichen Wohn- und Küchenbereich des Grand California • Neue Detaillösungen: Zusätzliche Gepäcknetze perfektionieren den Stauraum; Interieur-Esstisch kann erstmals auch im Außenbereich genutzt werden • Neues Verdunkelungsset: Passgenaue Thermomatten für die Scheiben im Fahrerhaus des Grand California sperren Hitze, Kälte und Blicke aus • Progressives Basisfahrzeug: Der Grand California basiert auf der neusten Version des Crafter; er hat modernste Assistenz- und Infotainmentsystem an Bord Er ist das Avantgardemodell unter den Reisemobilen: der Grand California auf der Basis des progressiven Crafter. Die neuste Evolutionsstufe des Campers wird Volkswagen Nutzfahrzeuge vom 29. August bis 07. September auf dem Caravan-Salon in Düsseldorf vorstellen. Zahlreiche optische und konstruktive Perfektionierungen verbessern den Wohnraum des weiterentwickelten Grand California. Alle neuen Features des in zwei Radständen angebotenen Reisemobils werden im Herbst dieses Jahres in die Baureihe einfließen. Parallel zum Update des Grand California wird Volkswagen Nutzfahrzeuge auf seinem Stand in der Messehalle 16 des Salons zahlreiche weitere neue Camper-Highlights präsentieren. Die Vorab-News zum Grand California des Modelljahres 2026 im Detail: Neue Lounge-Optik: Den Innenraum des Grand California kennzeichnet fortan das neue Dekor „Atami Bambus“, in dem die Tischplatte und die Arbeitsfläche der Küchenzeile ausgeführt sind. Die gleiche Oberflächenoptik besitzt auch der neue Bodenbelag (Küche, Dinette, Laderaum), der aus widerstandsfähigem PVC gefertigt wird. Ebenfalls neu designt wurde der nun schwarze Wasserhahn in der Küche. Gemeinsam mit der neuen Holzoptik setzen sie einen loungeartigen Kontrast zum weißen Interieur und hinterlassen einen fast schon mediterranen Yacht-Charakter. Perfektion im Detail: Der mobile Esstisch kann künftig zudem blitzschnell außen am Küchenblock arretiert werden, um die Mahlzeiten oder das abendliche Glas Wein unter freiem Himmel genießen zu können. Ebenfalls neu an Bord des California 600 (6,0 Meter, Querschläfer) und California 680 (6,8 Meter, Längsschläfer) sind Gepäcknetze in den Oberschränken, die das Verstauen der Kleidung und Utensilien jeglicher Art erleichtern. Zu den neuen optionalen Ausstattungen zählt ein passgenaues Thermomatten- und Verdunkelungsset für die Scheiben im Fahrerhaus. Innovatives Basisfahrzeug: Wie alle aktuellen Crafter, so sind auch die Grand California Modelle bereits seit Juli 2024 serienmäßig mit zusätzlichen neuen Details wie digitalen Instrumenten („Digital Cockpit Pro“), einem neuen Infotainmentsystem mit optisch freistehendem Touchscreen (26 cm, 10,4 Zoll Durchmesser, optional 32 cm und 12,9 Zoll) und Assistenzsystemen wie „Front Assist“ (Notbremsassistent inklusive Radfahrer- und Fußgängererkennung), „Lane Assist“ (Spurhalteassistent), einer Einparkhilfe (Front und Heck) sowie der Verkehrszeichenerkennung ausgestattet. Optional wird seitdem zudem der „Travel Assist“ angeboten, der die assistierte Längs- und Querführung ermöglicht. Gerade im Grand California besonders praktisch ist die elektronische Parkbremse, die über einen Schalter in der Instrumententafel betätigt wird: Da diese neue Lösung den klassischen Handbremshebel im Fußraum ersetzt hat, lässt sich der Fahrersitz nun noch einfacher und schneller in den Wohnraum drehen.", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5932", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:35.027021", + "word_count": 448 + }, + { + "id": "4ebc6e182dae99dabf74b81e9387fec2", + "title": "Erfolgsmodell TRAIL 280S mit überarbeitetem Grundriss", + "date": "Mon, 04 Aug 2025 00:00:00 +0200", + "summary": "TISCHER Absetzkabine", + "text": "Wenn Ende August am Düsseldorfer Messegelände die Tore zum diesjährigen Caravan Salon (29.08.- 07.09.2025) aufgehen, ist man am Messestand der TISCHER Freizeitfahrzeuge GmbH (Halle 12/Stand B30) voll auf Innovation gepolt. Geschäftsführer Patrick Sauer und die gesamte Belegschaft des renommierten Mainfränkischen Manufaktur-Betriebs ruhen sich nicht auf vergangenen Erfolgsjahren aus. Vielmehr möchten sie das eigenständige Profil des Unternehmens mit spannenden Neuheiten schärfen und fokussieren: „Wie unsere Marktbeobachtung und vor allem zahlreiche konkrete Kundenanfragen zeigen, liegen kompakte Absetzkabinen als Krönung wendiger Pick-ups neuerdings auch bei jüngeren Zielgruppen, kleinen Familien und sportiven Camping-Fans im Trend. Für uns ist das der Anlass, bei Kabinenkonzepten noch familienfreundlicher und vor allem auch an jüngere Adventure-Fans zu denken. Ausgehend davon zeigen wir innovative Lösungen, die wir neu geschaffen, verfeinert und optimiert haben. Wichtig ist immer das Potenzial für individuelle, einzigartige und autarke Freizeitabenteuer.“ Erfolgsmodell TRAIL 280S: familienfreundlicher – auch für den VW T7 Mit den Kabinenmodellen TRAIL/BOX 280/280S konnte TISCHER schon vor Jahren das komfortabel mitfahrende Zuhause speziell für die Pritschenfahrzeuge VW T4, T5 und T6 vorstellen. Nun haben Entwickler und Konstrukteure nochmals konzentriert an Grundriss und Aufteilung gearbeitet, um die Modellvariante TRAIL 280S mit Seiteneinstieg noch familienfreundlicher zu machen. Dazu kommt als weitere Messe-News, dass die 280er-Kabinenvarianten auf Wunsch auch perfekt auf den neuen Pritschenwagen VW T7 passen. Er ist das Nachfolgemodell des VW T6 und lieferbar ab Jahresbeginn 2026. TISCHER Kabinenkonzept für Flatbed-Pick-ups Als Spezialist für Individual- und Sonderaufbauten nutzt TISCHER die vorhandene Kompetenz immer wieder für frappierende Weiterentwicklungen der verschiedenen Produktlinien. So geht nun bald auch eine neue Kabine speziell für Basisfahrzeuge mit Flachpritsche an den Start. Pick-ups dieses Typs werden in Deutschland häufig als Kommunal-Pritsche, Tray-Model oder UTE-Bed bezeichnet. Bei diesen Fahrzeugmodellen ist die Ladefläche hinter dem Fahrerhaus durchgehend flach sowie seitlich und hinten mit abklappbaren, abnehmbaren Bordwänden versehen. So steht viel Fläche für den Kabinengrundriss zur Verfügung. • Gedacht ist das neue TISCHER Kabinenkonzept insbesondere für Camping-Fans, die mit Pferde- oder Motorradanhänger verreisen möchten, für die gleichzeitig aber auch eine Anhängelast von 3,5 Tonnen relevant ist. • Eine exzellente Lösung kann sich damit auch für Familien mit 2 bis 3 kleineren Kindern ergeben. Dafür bietet TISCHER optional den Einbau eines bequemen Stockbetts mit an, so dass genügend Schlafplätze vorhanden sind. • Die neue Kabine eignet sich aber auch sehr gut für Camper mit teuren E-Bikes und Fahrrädern, die nicht außen am Fahrradträger hängen, sondern gut geschützt in einem Segment der Kabine transportiert werden sollen. Mehr auf www.tischer-pickup.com .", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5931", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:35.311397", + "word_count": 405 + }, + { + "id": "b2c3c88e498e79526c52d7fafccc702a", + "title": "Aufblasbares Vorzelt für Wohnwagen-Camper", + "date": "Fri, 01 Aug 2025 00:00:00 +0200", + "summary": "Travel Comfort Air", + "text": "• Perfekt fürs Reisecamping mit hohem Komfort und vielen praktischen Funktionen • Stabiles Luftschlauch-System zum Aufpumpen, um das mobile Zuhause schneller zu errichten Für den diesjährigen Caravan Salon Düsseldorf (29.08. bis 07.09.2025) werden dwt Geschäftsführer Claus Winneknecht und sein Messe-Team am Stand (Halle 3/Stand-Nr. C89) mehrere Zeltmodelle komplett aufgebaut präsentieren. Gezeigt werden die Wohnwagen-Ganzzelte Ambassador III, Jubilee 40 und Polo exemplarisch für hochwertige dwt Gestängezelte. Dazu kommen mit dem Caravan-Ganzzelt Scala Air 280 und dem Wohnwagen-Teilzelt Space Air HQ zwei Air-In-Modelle. Ein Highlight wird am Stand das aufblasbare Wohnwagen-Ganzzelt Travel Comfort Air setzen. In ihm spielen Ästhetik und Funktionalität eng zusammen. Wie die anderen ausgestellten Modelle, so können Messebesucher auch dieses extra komfortable und geräumige Reisezelt von außen und innen erleben. Dabei lassen sich die verwendeten Zeltmaterialien ebenso begutachten und prüfen wie die vielen intelligenten Details. Wie dwt Geschäftsführer Claus Winneknecht erläutert, steht bei der reichen dwt Modellauswahl immer die sichere Wunscherfüllung für Kunden im Fokus: „Entscheidend ist im 1. Schritt immer, was sich der einzelne Kunde als persönlichen Traumurlaub vorstellt. Als Experten sind wir zusammen mit dem Fachhandel gerne da, um individuelle Wünsche und Anforderungen zu reflektieren, zu bündeln und dafür das passende Zelt zu empfehlen. Im Fall von Travel Comfort Air heißt das, seine herausragenden Vorzüge für aktive Reisecamper zu betonen. Ausstattung, Qualität und der vereinfachte Aufbau machen dieses Zelt zu einer wirklich guten Wahl für Reisecamper, die in punkto Komfort, Flexibilität und Raumangebot auf nichts verzichten möchten.“ Modell-Highlights auf einen Blick: • Robustes Air-In-System mit 10 cm starken TPU Luftschläuchen. Das sicher eingebettete Luftschlauch-System lässt sich mechanisch oder elektrisch aufpumpen. Zeitraubendes Sortieren und Auslegen von Zeltstangen entfällt. • Zelthaut gefertigt aus Texolan 150 HQ mit PU-Beschichtung. Das langlebige, abwaschbare Material kann Wind, Regen, Sonne und UV-Strahlung dauerhaft trotzen. • Effektives Rundum-Belüftungskonzept durch große Moskitofenster mit rollbaren Klappen und einseitig ausstellbaren Lüftungshauben für konstante Frischluft auch an feuchten oder regnerischen Tagen. • Luftiges Raumgefühl und flexible Gestaltungsmöglichkeiten mit optional wegrollbaren oder herausnehmbaren Elementen. • Höhenausgleichs-Blocks in Serienausstattung enthalten, um auch auf unebenem Gelände und bei Höhenunterschieden zwischen Zelt und Wohnwagen für ein harmonisches Ganzes zu sorgen. Technische Spezifikationen: • Zelttiefe ca. 240 cm + 20 cm Vordach • Zeltkonstruktion mit innenliegendem Air-In-System und stabilisierenden Dach- und Frontschläuchen • Erhältlich in 5 Größen für Umlaufmaße von ca. 906 bis 1.030 cm • Unverbindliche Preisempfehlung beginnt bei ca. 1.855 € für Größe 31 Mher Informationen auf https://dwt-zelte.de", + "tags": [], + "status": "Trash", + "link": "https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5930", + "images": [], + "source": "https://www.camping-news.de/rss/", + "source_name": "Camping-News", + "created_at": "2025-08-28T10:29:35.607061", + "word_count": 397 + }, + { + "id": "c23153f2222bbc5a7bbae11367995e73", + "title": "Reisetipps für die letzten Ferienwochen: Dem schlechten Wetter davon fahren", + "date": "Tue, 26 Aug 2025 17:00:00 +0200", + "summary": "

Schneller Wetter-Check für die beliebtesten Campingregionen Europas: Hier können Sie in den letzten Ferienwochen auf Sonne zählen.

", + "text": "Die letzten drei Wochen der Sommerferien in Bayern und Baden-Württemberg stehen vor der Tür. Viele Camperinnen und Camper überlegen jetzt spontan, wohin es gehen könnte – dafür lohnt ein Blick auf die Wetterlage. In Italien meldete man die vergangenen Wochen erneut extreme Wetterereignisse: Unwetter, Überschwemmungen und Stürme trafen unter anderem Venetien , Sizilien und die Toskana. Die Wetterlage hat sich dort zum Glück kurzfristig wieder beruhigt. Für Urlaubende mit Wohnmobil stellen Schlechtwetterfronten Planungsschwierigkeiten dar. Vor diesem Hintergrund haben wir Regionen zusammengestellt, die in den kommenden Wochen gute Wetterbedingungen erwarten lassen – ideal für spontane Campingtrips. Deutschland: Alpen, Mittelgebirge und Küsten im Überblick In Bayern und Baden-Württemberg bleibt das Wetter in den kommenden Wochen wechselhaft. Besonders in den Alpen und südlichen Mittelgebirgen können Gewitter und punktueller Starkregen auftreten, während andere Landesteile sommerlich warm bleiben. Beste Bedingungen für Urlauberinnen und Urlauber, dem schlechten Wetter an anderer Stelle zu entfliehen. Vielleicht sogar in Deutschland selbst? An der deutschen Nord- und Ostseeküste zeigen sich die letzten Sommerwochen von ihrer freundlichen Seite. Die Küstenregionen erleben meist stabiles Sommerwetter, nur einzelne Regenschauer trüben den Tag. Temperaturen zwischen 20 und 25 °C, kühler direkt am Wasser Hier zeigen wir die Top 10 Stellplätze an der Nordsee . Österreich & Schweiz: Stabiler Sommer für Outdoor-Fans In Wien und Graz bleibt es überwiegend trocken, die Temperaturen liegen angenehm im sommerlichen Bereich. Ab Ende August kann es vereinzelt zu etwas kühleren Abschnitten kommen, die Wetterlage bleibt aber mehrheitlich stabil. Wien : Tageswerte 27–29 °C, wenig Niederschlag Graz : mild 24–28 °C, einzelne Gewitter möglich Salzburg und Kärnten bieten zum Monatswechsel stabile, sonnige Tage mit sehr geringen Niederschlagsmengen – ideal für Camping und Outdoor-Aktivitäten. Beispielsweise an einem der 7 schönen Campingplätze am Millstätter See . Tageshöchstwerte 23–27 °C Zürich zeigt sich in den letzten Wochen der Sommerferien moderat warm und insgesamt trocken. Gelegentliche Regentage sind möglich, die Nächte fallen jedoch kühler aus. Tageshöchstwerte 20–25 °C, Nächte um 12 °C Graubünden und Tessin bieten familienfreundliches Sommerwetter mit stabiler Lage. Kaum Gewitter, und die Temperaturen bleiben angenehm. Temperaturen 21–27 °C Italien: Vom Gardasee bis Sizilien – wo das Wetter stimmt In Venetien und der Toskana zeigt sich das typische mediterrane Sommerwetter: warm, meist sonnig, Regen nur vereinzelt. Lokale Hitze- und Gewitterperioden können auftreten, sind aber kurzzeitig. Wie wär's mit einem Trip zu einem toskanischen Agricamping oder nach Friaul-Julisch in Venetien? Toskana : 28–31 °C tagsüber, 15–17 °C nachts, wenige Regentage Venetien : ähnliche Werte, kurze Gewitter möglich Süditalien , insbesondere Sizilien und Kalabrien , erlebt weiterhin sehr heißes, sommerliches Wetter. Die Wassertemperaturen sind hoch, Regen selten, die Sonne scheint täglich lange – ideal für Badeurlaub. Tageshöchstwerte 30–35 °C (Küste 27–31 °C), Nächte 20–24 °C Sonnenscheindauer bis 12 Stunden, kaum Regen Gardasee und Südtirol stabilisieren sich ab Ende August, perfekt für Outdoor-Aktivitäten wie Wandern, Radfahren oder Sightseeing. Temperaturen 26–30 °C, wenig Niederschlag Spanien & Frankreich: Sonne, Strand und mildes Klima An der Costa Brava , Costa Dorada sowie in Katalonien und Aragonien herrscht stabiles Sommerwetter, ideal für Strand- und Campingurlaub. Nur vereinzelte Wärmegewitter sind möglich. Schöne Campingplätze direkt am Meer sind beispielsweise der Camping El Templo del Sol oder der Camping Sangulí . Tageswerte 25–30 °C, geringe Niederschlagswahrscheinlichkeit In der Provence und an der Côte d’Azur zeigt sich die Sonne ebenfalls sehr häufig. Kurze Regenschauer treten vor allem in den Bergen auf. Tageshöchstwerte 28–32 °C Polen & Kroatien: Entspanntes Camping an der Ostsee und Adria Die Ostsee und Masuren in Polen bieten moderates, stabiles Wetter mit vielen Sonnenstunden – optimal für Strandtage oder Radtouren. Hier unsere Touren-Tipps für die Region . Temperaturen 20–25 °C, sehr wenig Niederschlag In Kroatien sind Istrien und Dalmatien weiterhin sonnig und warm, ideal für Strandferien, Wassersport und Camping. Temperaturen 27–33 °C, kaum Regen Quellenhinweis: Die Wetterprognosen für Ende August und Anfang September 2025 basieren auf aktuellen Vorhersagen offizieller Wetterdienste und Fachportale, darunter der Deutsche Wetterdienst (DWD), Wetter.de, Wetter.com, sowie regionale Klima- und Reisewetterseiten für internationale Regionen.", + "tags": [], + "status": "Trash", + "link": "https://www.promobil.de/weitere-ratgeber/sommerferien-endspurt-wohin-mit-dem-wohnmobil/", + "images": [], + "source": "https://www.promobil.de/rss/ratgeber", + "source_name": "ratgeber bei www.promobil.de", + "created_at": "2025-08-28T10:29:41.996070", + "word_count": 647 + }, + { + "id": "9f67bade03c8c72c2b043d85fea6100c", + "title": "Camping-Boom: Wohnmobil im Urlaub richtig absichern / Wie Sie im Urlaub typische Versicherungsfallen vermeiden", + "date": "Tue, 26 Aug 2025 09:35:00 +0200", + "summary": "Verti Versicherung AG: Berlin (ots) - Deutschland erlebt einen nie dagewesenen Camping-Boom. Doch viele, die mit dem Wohnmobil oder dem Wohnwagen in den Urlaub fahren, sind unzureichend abgesichert, denn Standardversicherungen greifen hier oft nicht. Ein Experte der Verti ...", + "text": "Verti Versicherung AG [ Newsroom ] Berlin (ots) - Deutschland erlebt einen nie dagewesenen Camping-Boom. Doch viele, die mit dem Wohnmobil oder dem Wohnwagen in den Urlaub fahren, sind unzureichend abgesichert, denn Standardversicherungen greifen hier oft nicht. Ein Experte der Verti ... Lesen Sie hier weiter... Original-Content von: Verti Versicherung AG, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/43258/6104183", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-28T10:29:43.438069", + "word_count": 55 + }, + { + "id": "608509dfc6997b9dcee06767fcbeba9e", + "title": "\"Deutschlands Beste Online-Shops 2025\" / Renommierter E-Commerce-Award - Votum aus rund 70.000 Kundenmeinungen - Feierliche Preisverleihung", + "date": "Tue, 26 Aug 2025 09:00:06 +0200", + "summary": "DISQ Deutsches Institut für Service-Qualität GmbH & Co. KG: Berlin (ots) - Ob Mode, Technik oder Möbel - wer online einkauft, profitiert von großer Auswahl, flexibler Lieferung und komfortablen Rückgabemöglichkeiten. Kein Wunder, dass das Shopping im Netz boomt. Doch nicht alle Anbieter halten, was ...", + "text": "DISQ Deutsches Institut für Service-Qualität GmbH & Co. KG [ Newsroom ] Berlin (ots) - Ob Mode, Technik oder Möbel - wer online einkauft, profitiert von großer Auswahl, flexibler Lieferung und komfortablen Rückgabemöglichkeiten. Kein Wunder, dass das Shopping im Netz boomt. Doch nicht alle Anbieter halten, was sie ... Lesen Sie hier weiter... Original-Content von: DISQ Deutsches Institut für Service-Qualität GmbH & Co. KG, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/64471/6104130", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-28T10:29:43.728527", + "word_count": 68 + }, + { + "id": "ad593eb7c57c94ceeb49df82517d80a9", + "title": "Neue Folge \"Bella Italia - Camping auf Deutsch\": Liebe, Abenteuer und große Überraschungen in den USA", + "date": "Mon, 25 Aug 2025 09:00:00 +0200", + "summary": "RTLZWEI: München (ots) - - Sascha und Nicole Fingerhuth heiraten in Las Vegas - Überraschungsausflug für Angelika - Neue Folge \"Bella Italia - Camping auf Deutsch\" am 25. August 2025, immer montags um 20:15 Uhr bei RTLZWEI und sieben Tage vorab auf RTL+ ...", + "text": "RTLZWEI [ Newsroom ] München (ots) - - Sascha und Nicole Fingerhuth heiraten in Las Vegas - Überraschungsausflug für Angelika - Neue Folge \"Bella Italia - Camping auf Deutsch\" am 25. August 2025, immer montags um 20:15 Uhr bei RTLZWEI und sieben Tage vorab auf RTL+ ... Lesen Sie hier weiter... Original-Content von: RTLZWEI, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/6605/6103157", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach camping", + "created_at": "2025-08-28T10:29:44.000018", + "word_count": 58 + }, + { + "id": "b39e1e356bae5d46d960baa7e58223f0", + "title": "66 Lovemobile in Niedersachsen - Zahl leicht gestiegen / Mehr als 80 Prozent der mobilen Bordelle in Niedersachsen auf drei Kreise verteilt", + "date": "Tue, 26 Aug 2025 05:00:00 +0200", + "summary": "Neue Osnabrücker Zeitung: Osnabrück (ots) - Die Zahl der Lovemobile an Niedersachsens Straßen ist in diesem Jahr leicht gestiegen. Aktuell gibt es 66 solcher Fahrzeuge, wie eine Abfrage der \"Neuen Osnabrücker Zeitung\" (NOZ) bei allen Kreisen und kreisfreien Städten ...", + "text": "Neue Osnabrücker Zeitung [ Newsroom ] Osnabrück (ots) - Die Zahl der Lovemobile an Niedersachsens Straßen ist in diesem Jahr leicht gestiegen. Aktuell gibt es 66 solcher Fahrzeuge, wie eine Abfrage der \"Neuen Osnabrücker Zeitung\" (NOZ) bei allen Kreisen und kreisfreien Städten ... Lesen Sie hier weiter... Original-Content von: Neue Osnabrücker Zeitung, übermittelt durch news aktuell", + "tags": [], + "status": "Trash", + "link": "https://www.presseportal.de/pm/58964/6104008", + "images": [], + "source": "https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 ", + "source_name": "Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil", + "created_at": "2025-08-28T10:29:46.104385", + "word_count": 56 + }, + { + "id": "3a8a1b6243fba59fd4ef2af096b0f4c2", + "title": "Brand auf Campingplatz in Otterstadt - Speyer-Kurier", + "date": "2025-08-28T06:18:50Z", + "summary": "Brand auf Campingplatz in Otterstadt. 28.08.2025 Blaulicht. Personen wurden keine verletzt. Otterstadt (ots). Aus bislang ungeklärter Ursache kam ...", + "text": "Brand auf Campingplatz in Otterstadt. 28.08.2025 Blaulicht. Personen wurden keine verletzt. Otterstadt (ots). Aus bislang ungeklärter Ursache kam ...", + "tags": [], + "status": "New", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.speyer-kurier.de/blaulicht/artikel/brand-auf-campingplatz-in-otterstadt&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw37x8Ph29lBv4K9sjZjZNlH", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:50.494296", + "word_count": 19 + }, + { + "id": "7e2f03b974e9a7689fb33be871dc93ff", + "title": "Zehn Jahre Stillstand: Letzter Versuch für geplanten Campingplatz? - Kusel - Die Rheinpfalz", + "date": "2025-08-28T06:14:23Z", + "summary": "Seit Jahren liegt das Gelände der SG Blaubach-Diedelkopf in Kusel brach. Jetzt will die Stadt das Gelände für den geplanten Campingplatz neu ...", + "text": "Seit Jahren liegt das Gelände der SG Blaubach-Diedelkopf in Kusel brach. Jetzt will die Stadt das Gelände für den geplanten Campingplatz neu ...", + "tags": [], + "status": "New", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/kreis-kusel_artikel,-zehn-jahre-stillstand-letzter-versuch-f%25C3%25BCr-geplanten-campingplatz-_arid,5806398.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw03Sz4h5yKhs00d4HecyABq", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:50.730462", + "word_count": 23 + }, + { + "id": "0de60a37f728ee74d9e08ebd3b16dbcb", + "title": "Landvergnügen: Statt Campingplatz, jede Nacht ein anderer Bauernhof - Kleine Zeitung", + "date": "2025-08-28T04:24:30Z", + "summary": "Statt Campingplatz, jede Nacht ein anderer Bauernhof. Das Konzept „Landvergnügen“ führt Reisende je für eine Nacht zu Gastgebern in Österreich ...", + "text": "Statt Campingplatz , jede Nacht ein anderer Bauernhof. Das Konzept „Landvergnügen“ führt Reisende je für eine Nacht zu Gastgebern in Österreich ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.kleinezeitung.at/lebensart/20031453/statt-campingplatz-jede-nacht-ein-anderer-bauernhof&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Fnz1ORv1BbfIEZfTG432j", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:50.989071", + "word_count": 22 + }, + { + "id": "1980f292e4ebb870afec9440c5e681c8", + "title": "Rheinland-Pfalz & Saarland: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt", + "date": "2025-08-28T03:28:01Z", + "summary": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. Otterstadt/Ludwigshafen (dpa/lrs) - Aus ...", + "text": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. Otterstadt/Ludwigshafen (dpa/lrs) - Aus ...", + "tags": [], + "status": "New", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.n-tv.de/regionales/rheinland-pfalz-und-saarland/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-article25992761.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1d142-8q28VLBMt44GmQQm", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:51.235517", + "word_count": 19 + }, + { + "id": "c49d323b86bbc175dcdf7a0e9ecbf49c", + "title": "Klima-Ereignis könnte Europas Wetter radikal verändern und den Winter völlig auf den Kopf stellen", + "date": "2025-08-28T00:12:51Z", + "summary": "Ein Blick auf den Pazifik zeigt, warum das Wetter bald ganz anders verlaufen könnte. Experten warnen vor den Folgen. Eine Wetter-Kolumne von ...", + "text": "Ein Blick auf den Pazifik zeigt, warum das Wetter bald ganz anders verlaufen könnte. Experten warnen vor den Folgen. Eine Wetter-Kolumne von ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/veraendern-winter-voellig-auf-den-kopf-stellen-raetselhaftes-klima-ereignis-europa-wetter-radikal-zr-93889387.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13FBKqr1NahvNwZSiFQUpS", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:51.495370", + "word_count": 23 + }, + { + "id": "5d296d6de97a620fee1ed01fca902581", + "title": "Lebensgefahr durch extreme Unwetter: Mittelmeer-Phänomen treibt Gefahr nun auch nach ...", + "date": "2025-08-27T23:42:49Z", + "summary": "Das warme Mittelmeer liefert Feuchtigkeit für gefährliche Unwetter – die Lage in Südeuropa ist nur der Anfang. Eine Wetter-Kolumne von Dominik ...", + "text": "Das warme Mittelmeer liefert Feuchtigkeit für gefährliche Unwetter – die Lage in Südeuropa ist nur der Anfang. Eine Wetter-Kolumne von Dominik ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/lebensgefahr-durch-extreme-unwetter-in-italien-warum-die-gefahr-nun-auch-nach-deutschland-schwappt-zr-93902987.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1iZO1swk8NP-QaytJ1i_fH", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:51.741625", + "word_count": 22 + }, + { + "id": "37047836ad4d40f1fe34a7e5786d6c87", + "title": "Sachschaden: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Rheinland-Pfalz", + "date": "2025-08-27T20:56:09Z", + "summary": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. Artikel teilen. Artikel teilen ...", + "text": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. Artikel teilen. Artikel teilen ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.rhein-zeitung.de/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_arid-4064379.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39vzojQNhBpnUVvyBovqdG", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:51.994857", + "word_count": 19 + }, + { + "id": "20e782032e93bb2fb089a759a2665862", + "title": "Campingplatz steht unter neuer Leitung - Mühlacker Tagblatt", + "date": "2025-08-27T19:39:59Z", + "summary": "Von Volker Henkel Knittlingen-Freudenstein. Aus dem „Stromberg Camping“ wird der „Campingpark Stromberg“, und die neue Bezeichnung geht mit einem ...", + "text": "Von Volker Henkel Knittlingen-Freudenstein. Aus dem „Stromberg Camping“ wird der „Campingpark Stromberg“, und die neue Bezeichnung geht mit einem ...", + "tags": [], + "status": "New", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.muehlacker-tagblatt.de/Knittlingen/Campingplatz-steht-unter-neuer-Leitung-404285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ohQMvQLwZB15jBj2h_aGm", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:52.251368", + "word_count": 20 + }, + { + "id": "c80be32c43658d16bf506caebc0dcc92", + "title": "Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Saarbrücker Zeitung", + "date": "2025-08-27T18:53:10Z", + "summary": "Otterstadt/Ludwigshafen · Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. 27.08.2025 , 18:55 ...", + "text": "Otterstadt/Ludwigshafen · Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. 27.08.2025 , 18:55 ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.saarbruecker-zeitung.de/saarland/blickzumnachbarn/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771593&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1lKkodrkZcnrbfts2GayPR", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:52.531755", + "word_count": 20 + }, + { + "id": "073634bbe5c2896217086a84a0abcf70", + "title": "Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - MSN", + "date": "2025-08-27T17:51:54Z", + "summary": "Aus zunächst ungeklärter Ursache sind auf einem Campingplatz in Otterstadt im Rhein-Pfalz-Kreis zwei Wohnwagen vollständig ausgebrannt.", + "text": "Aus zunächst ungeklärter Ursache sind auf einem Campingplatz in Otterstadt im Rhein-Pfalz-Kreis zwei Wohnwagen vollständig ausgebrannt.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/sieben-wohnwagen-bei-feuer-auf-campingplatz-besch%25C3%25A4digt/ar-AA1Ll6Lo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2OKEXFNNohu7Fa2qjUumRZ", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:52.898469", + "word_count": 16 + }, + { + "id": "c8ee7736835d656e0ac79fb5919e469a", + "title": "Rhein-Pfalz-Kreis – Brand auf einem Campingplatz - MRN-News.de", + "date": "2025-08-27T17:27:38Z", + "summary": "... Campingplatz in Otterstadt. Hierbei brannten zwei Wohnwägen vollständig aus und fünf weitere wurden durch Feuer und Hitzeeinwirkung zum Teil ...", + "text": "... Campingplatz in Otterstadt. Hierbei brannten zwei Wohnwägen vollständig aus und fünf weitere wurden durch Feuer und Hitzeeinwirkung zum Teil ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.mrn-news.de/2025/08/27/rhein-pfalz-kreis-brand-auf-einem-campingplatz-600056/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gcVfYYMPsTSp0-8Fh1ov1", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:53.157433", + "word_count": 21 + }, + { + "id": "146fc80441ebb47cee942e51c7e1edcd", + "title": "Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Trierischer Volksfreund", + "date": "2025-08-27T17:25:51Z", + "summary": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen.", + "text": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.volksfreund.de/region/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771597&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2sDVmOAKfpSHhFZvLdbm_5", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:53.422723", + "word_count": 14 + }, + { + "id": "16b416971a7b08b595bc1b54f997359f", + "title": "FAQ: Alles Wichtige zum Wasser mit Geschmack Festival 2025 in Heubach - Gmünder Tagespost", + "date": "2025-08-27T17:25:00Z", + "summary": "... Campingplatz. In unseren FAQ findest du alle wichtigen Infos auf einen Blick: wann, wo, wer, wie und warum. Wann und wo findet das Festival statt ...", + "text": "... Campingplatz . In unseren FAQ findest du alle wichtigen Infos auf einen Blick: wann, wo, wer, wie und warum. Wann und wo findet das Festival statt ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.gmuender-tagespost.de/ostalb/rosenstein/heubach/wasser-mit-geschmack-festival-2025-musik-kunst-gemeinschaft-93892202.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9cgUIrS9AjBrhtVSwwib", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:53.663311", + "word_count": 28 + }, + { + "id": "53e54f88cd9649a983f15d03eaef9cbf", + "title": "Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Borkener Zeitung", + "date": "2025-08-27T17:24:11Z", + "summary": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. Von dpa. 27.08.2025.", + "text": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. Von dpa. 27.08.2025.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.borkenerzeitung.de/welt/in-ausland/panorama/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-663729.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1L3D8uGuPKbB4qBB-8a8I3", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:53.917331", + "word_count": 17 + }, + { + "id": "1bed652ee77f7ef75b068536cb021393", + "title": "POL-PPRP: Brand auf einem Campingplatz - freenet.de", + "date": "2025-08-27T17:17:05Z", + "summary": "Aus bislang ungeklärter Ursache kam es am Nachmittag des 27.08.2025 zu einem Brand auf einem Campingplatz in Otterstadt.", + "text": "Aus bislang ungeklärter Ursache kam es am Nachmittag des 27.08.2025 zu einem Brand auf einem Campingplatz in Otterstadt.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.freenet.de/polizeimeldungen/rheinland-pfalz/pol-pprp-brand-auf-einem-campingplatz_6105496-40501654.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Pns94-kd2inHfns451qxb", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:54.205549", + "word_count": 18 + }, + { + "id": "0f11abc3b36924d6cb05dfc36fc39dcf", + "title": "Brand auf einem Campingplatz - aktuell mit der meinestadt.de", + "date": "2025-08-27T17:14:58Z", + "summary": "Aus bislang ungeklärter Ursache kam es am Nachmittag des 27.08.2025 zu einem Brand auf einem Campingplatz in Otterstadt. Hierbei brannten zwei ...", + "text": "Aus bislang ungeklärter Ursache kam es am Nachmittag des 27.08.2025 zu einem Brand auf einem Campingplatz in Otterstadt. Hierbei brannten zwei ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://aktuell.meinestadt.de/rhein-pfalz-kreis/polizeimeldungen/5690769&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1fAhNsv2Uiz0FUuFmtx4U1", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:54.474512", + "word_count": 22 + }, + { + "id": "433e42de8aff2d321ccebdbf02d0fcd8", + "title": "Sachschaden: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt | STERN.de", + "date": "2025-08-27T17:05:24Z", + "summary": "Otterstadt/Ludwigshafen (lrs) - Aus zunächst ungeklärter Ursache sind auf einem Campingplatz in Otterstadt im Rhein-Pfalz-Kreis zwei Wohnwagen ...", + "text": "Otterstadt/Ludwigshafen (lrs) - Aus zunächst ungeklärter Ursache sind auf einem Campingplatz in Otterstadt im Rhein-Pfalz-Kreis zwei Wohnwagen ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.stern.de/gesellschaft/regional/rheinland-pfalz-saarland/sachschaden--sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-36007106.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ln89AKet0fsmPLwqvKSRZ", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:54.733973", + "word_count": 18 + }, + { + "id": "bf865af200b2e154262373f6816df567", + "title": "Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - TV Mittelrhein", + "date": "2025-08-27T17:02:48Z", + "summary": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen.Otterstadt/Ludwigshafen (dpa/lrs) - Aus ...", + "text": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen.Otterstadt/Ludwigshafen (dpa/lrs) - Aus ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.tv-mittelrhein.de/mediathek/news/25450/Sieben_Wohnwagen_bei_Feuer_auf_Campingplatz_beschaedigt.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0he2tUV25IuvO5osNw1xgo", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:54.986278", + "word_count": 18 + }, + { + "id": "b6d9558875ac17588367f5ebbdc63055", + "title": "Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Mittelhessen", + "date": "2025-08-27T17:01:55Z", + "summary": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. ... Otterstadt/Ludwigshafen (dpa/lrs) - . Aus ...", + "text": "Am helllichten Nachmittag brennen auf einem Campingplatz mehrere Wohnwagen. Warum, ist noch völlig offen. ... Otterstadt/Ludwigshafen (dpa/lrs) - . Aus ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.mittelhessen.de/lokales/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-4919360&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2wXuKqnmu2I73TfXwRGof4", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294", + "source_name": "Google Alert – Campingplatz", + "created_at": "2025-08-28T10:29:55.247935", + "word_count": 21 + }, + { + "id": "6660d50ec20104435c0c847f41c23f88", + "title": "VanCraft Waypoint XL: Vanlife in Übergröße aus den USA - vanlifemag.de", + "date": "2025-08-27T13:08:53Z", + "summary": "Vanlife steht für Freiheit und Abenteuer auf vier Rädern – mit dem ausgebauten Camper dem Sonnenuntergang entgegen. Der Van Craft Waypoint XL ...", + "text": "Vanlife steht für Freiheit und Abenteuer auf vier Rädern – mit dem ausgebauten Camper dem Sonnenuntergang entgegen. Der Van Craft Waypoint XL ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/van-craft-waypoint-xl-vanlife-in-uebergroesse-aus-den-usa/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1BVz5EAVRoCLYXzxYhRJfy", + "images": [], + "source": "https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305", + "source_name": "Google Alert – Vanlife", + "created_at": "2025-08-28T10:29:57.026295", + "word_count": 23 + }, + { + "id": "4e1e9019d478ef56aa880eb5fcd345e7", + "title": "Rendsburger Herbst 2025: Das müssen Besucher zum Stadtfest wissen - SHZ", + "date": "2025-08-27T16:55:23Z", + "summary": "Messe für Camping-Fans: Was Besucher auf der Caravan und Co. in Rendsburg erwartet. ADVERTORIAL_Caravan und CO. Die Besucher können sich auf ...", + "text": "Messe für Camping -Fans: Was Besucher auf der Caravan und Co. in Rendsburg erwartet. ADVERTORIAL_Caravan und CO. Die Besucher können sich auf ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/rendsburg/artikel/rendsburger-herbst-2025-das-muessen-besucher-zum-stadtfest-wissen-49189798&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3Q0vDLWiKVxjzAHNaBAL9Q", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-28T10:30:00.261326", + "word_count": 23 + }, + { + "id": "875f559e6343a02f03cdca5405280a81", + "title": "Messebesuch planen: Das sind die besten Tage für einen Besuch auf dem Caravan Salon 2025", + "date": "2025-08-27T15:13:39Z", + "summary": "So reisen Sie entspannt zur Camping-Messe. Park- und Stellplätze sind ... Die Messe findet vom 30. August bis 8. September 2025 statt. Am ...", + "text": "So reisen Sie entspannt zur Camping - Messe . Park- und Stellplätze sind ... Die Messe findet vom 30. August bis 8. September 2025 statt. Am ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/weitere-ratgeber/messebesuch-planen-caravan-salon-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1GqhXPxrlBChDZ5bo-u9xR", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-28T10:30:00.719086", + "word_count": 27 + }, + { + "id": "989e6e92c21bc62baa6b0cf73dbb3825", + "title": "Caravan Salon: Dieser Fiat 616N Retro-Umbau wird der Hingucker der Messe! - Promobil", + "date": "2025-08-27T10:10:21Z", + "summary": "Auf dem Caravan Salon Düsseldorf 2025 wird die 616N Retro Edition erstmals als modernes Wohnmobil präsentiert. ... Mountain biker coming back to camping ...", + "text": "Auf dem Caravan Salon Düsseldorf 2025 wird die 616N Retro Edition erstmals als modernes Wohnmobil präsentiert. ... Mountain biker coming back to camping ...", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/neuheiten/caravan-salon-dieser-fiat-616n-retro-umbau-wird-der-hingucker-der-messe/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw05o4wpeT1ZYzAngJCJ5rbe", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-28T10:30:00.962051", + "word_count": 24 + }, + { + "id": "8b88bde8f44852c2fd538c8c34cb8a9c", + "title": "Welche Aktien von Luxusmarken sollten Anleger im Blick behalten? - Shots Magazin", + "date": "2025-08-27T08:37:13Z", + "summary": "Beitrags-Navigation. Reisemobile. Wow. Caravan Salon Düsseldorf 2025 - Top-Messe für Reisemobile und Camping. Exklusive Inhalte.", + "text": "Beitrags-Navigation. Reisemobile. Wow. Caravan Salon Düsseldorf 2025 - Top- Messe für Reisemobile und Camping . Exklusive Inhalte.", + "tags": [], + "status": "Trash", + "link": "https://www.google.com/url?rct=j&sa=t&url=https://www.shots.media/accessoires/2025/welche-aktien-von-luxusmarken-sollten-anleger-im-blick-behalten/109756&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0qlDEuhncZhWTz-dL6IaNA", + "images": [], + "source": "https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493", + "source_name": "Google Alert - Camping Messe 2025", + "created_at": "2025-08-28T10:30:01.194625", + "word_count": 17 } ] \ No newline at end of file diff --git a/logs/rss_tool.log b/logs/rss_tool.log index 7463634..b724579 100644 --- a/logs/rss_tool.log +++ b/logs/rss_tool.log @@ -5966,3 +5966,752 @@ die Großen 2025-08-24 14:55:59,345 - INFO - save_articles:144 - ✅ 185 Artikel gespeichert 2025-08-24 14:55:59,381 - INFO - load_articles:124 - ✅ 185 Artikel geladen 2025-08-24 14:55:59,381 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 15:00:44,577 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 15:00:44,579 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 15:01:32,927 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 15:01:32,928 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 15:01:32,952 - INFO - save_articles:144 - ✅ 185 Artikel gespeichert +2025-08-24 15:01:33,531 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 15:01:33,531 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 15:01:43,611 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 15:01:43,612 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 15:01:49,714 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 15:01:49,715 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 15:01:59,256 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 15:01:59,257 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-24 15:02:05,664 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-24 15:02:05,664 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:27:55,892 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-28 10:27:55,894 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:29:25,237 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-28 10:29:25,238 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:29:32,381 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-28 10:29:32,381 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:29:32,387 - INFO - process_articles:268 - 🚀 Starte Artikel-Verarbeitung +2025-08-28 10:29:32,388 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:29:32,393 - INFO - load_articles:124 - ✅ 185 Artikel geladen +2025-08-28 10:29:32,394 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.camping-news.de/rss/ +2025-08-28 10:29:32,726 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Camping-News +2025-08-28 10:29:32,726 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-28 10:29:32,729 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5939 +2025-08-28 10:29:33,322 - INFO - extract_images_with_metadata:167 - 🔍 14 img-Tags gefunden +2025-08-28 10:29:33,323 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:33,323 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:33,323 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:33,323 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:33,323 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Bürstner GmbH & Co. KG... +2025-08-28 10:29:33,323 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5939: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:33,323 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'VWN feiert 20 Jahre California +Beach und zeigt Sondermodell' extrahiert +2025-08-28 10:29:33,323 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: VWN feiert 20 Jahre California +Beach und zeigt Sondermodell +2025-08-28 10:29:33,324 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5937 +2025-08-28 10:29:33,608 - INFO - extract_images_with_metadata:167 - 🔍 13 img-Tags gefunden +2025-08-28 10:29:33,608 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Messe Essen GmbH... +2025-08-28 10:29:33,608 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:33,608 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Caravaning-Boom bietet enormes Potenzial, bede... +2025-08-28 10:29:33,609 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw... +2025-08-28 10:29:33,609 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Volkswagen Nutzfahrzeuge... +2025-08-28 10:29:33,609 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5937: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:33,609 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Bliessteig im Saarland ist Deutschlands schönster Wanderweg' extrahiert +2025-08-28 10:29:33,609 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Bliessteig im Saarland ist Deutschlands schönster Wanderweg +2025-08-28 10:29:33,611 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5938 +2025-08-28 10:29:33,891 - INFO - extract_images_with_metadata:167 - 🔍 14 img-Tags gefunden +2025-08-28 10:29:33,891 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:33,892 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Volkswagen Nutzfahrzeuge... +2025-08-28 10:29:33,892 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:33,892 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:33,892 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Bürstner GmbH & Co. KG... +2025-08-28 10:29:33,892 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5938: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:33,892 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Hotspot der mobilen Freiheit' extrahiert +2025-08-28 10:29:33,892 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Hotspot der mobilen Freiheit +2025-08-28 10:29:33,893 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5936 +2025-08-28 10:29:34,147 - INFO - extract_images_with_metadata:167 - 🔍 13 img-Tags gefunden +2025-08-28 10:29:34,147 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Messe Essen GmbH... +2025-08-28 10:29:34,147 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:34,148 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Caravaning-Boom bietet enormes Potenzial, bede... +2025-08-28 10:29:34,148 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw... +2025-08-28 10:29:34,148 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Volkswagen Nutzfahrzeuge... +2025-08-28 10:29:34,148 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5936: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:34,148 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Aktuelle Trends auf dem CARAVAN SALON 2025' extrahiert +2025-08-28 10:29:34,148 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Aktuelle Trends auf dem CARAVAN SALON 2025 +2025-08-28 10:29:34,155 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5935 +2025-08-28 10:29:34,485 - INFO - extract_images_with_metadata:167 - 🔍 14 img-Tags gefunden +2025-08-28 10:29:34,485 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:34,485 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Volkswagen Nutzfahrzeuge... +2025-08-28 10:29:34,485 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:34,485 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:34,485 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Bürstner GmbH & Co. KG... +2025-08-28 10:29:34,485 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5935: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:34,485 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Neue Baureihen und Sondermodelle machen Caravaning noch attraktiver' extrahiert +2025-08-28 10:29:34,485 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Neue Baureihen und Sondermodelle machen Caravaning noch attraktiver +2025-08-28 10:29:34,487 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5934 +2025-08-28 10:29:34,737 - INFO - extract_images_with_metadata:167 - 🔍 14 img-Tags gefunden +2025-08-28 10:29:34,738 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:34,738 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Volkswagen Nutzfahrzeuge... +2025-08-28 10:29:34,738 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:34,738 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:34,738 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:34,738 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5934: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:34,738 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Mercedes trifft Innovation - der variable +Campervan unter 6 Metern' extrahiert +2025-08-28 10:29:34,738 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Mercedes trifft Innovation - der variable +Campervan unter 6 Metern +2025-08-28 10:29:34,739 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5933 +2025-08-28 10:29:35,025 - INFO - extract_images_with_metadata:167 - 🔍 21 img-Tags gefunden +2025-08-28 10:29:35,025 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:35,025 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:35,026 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) PremiumCamps... +2025-08-28 10:29:35,026 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:35,026 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Camping Kirchzarten... +2025-08-28 10:29:35,026 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5933: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:35,026 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Die neue Wellness Oim am Camping Resort Allweglehen' extrahiert +2025-08-28 10:29:35,026 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Die neue Wellness Oim am Camping Resort Allweglehen +2025-08-28 10:29:35,027 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5932 +2025-08-28 10:29:35,310 - INFO - extract_images_with_metadata:167 - 🔍 14 img-Tags gefunden +2025-08-28 10:29:35,310 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:35,310 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Volkswagen Nutzfahrzeuge... +2025-08-28 10:29:35,310 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:35,310 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:35,310 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:35,310 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5932: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:35,310 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Premiere des Modelljahrs 2026 auf diesjährigem Caravan-Salon' extrahiert +2025-08-28 10:29:35,310 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Premiere des Modelljahrs 2026 auf diesjährigem Caravan-Salon +2025-08-28 10:29:35,311 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5931 +2025-08-28 10:29:35,605 - INFO - extract_images_with_metadata:167 - 🔍 14 img-Tags gefunden +2025-08-28 10:29:35,605 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:35,605 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Volkswagen Nutzfahrzeuge... +2025-08-28 10:29:35,606 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:35,606 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:35,606 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:35,606 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5931: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:35,606 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Erfolgsmodell TRAIL 280S mit überarbeitetem Grundriss' extrahiert +2025-08-28 10:29:35,606 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Erfolgsmodell TRAIL 280S mit überarbeitetem Grundriss +2025-08-28 10:29:35,607 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5930 +2025-08-28 10:29:35,828 - INFO - extract_images_with_metadata:167 - 🔍 14 img-Tags gefunden +2025-08-28 10:29:35,829 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:35,829 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) Volkswagen Nutzfahrzeuge... +2025-08-28 10:29:35,829 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:35,829 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:35,829 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: (c) snw/jb... +2025-08-28 10:29:35,829 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.camping-in-deutschland.de/index.php?pid=meldung&id=5930: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:35,829 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Aufblasbares Vorzelt für Wohnwagen-Camper' extrahiert +2025-08-28 10:29:35,829 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Aufblasbares Vorzelt für Wohnwagen-Camper +2025-08-28 10:29:35,829 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 10 neue Artikel aus https://www.camping-news.de/rss/ +2025-08-28 10:29:36,834 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/news +2025-08-28 10:29:37,132 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: News bei www.promobil.de +2025-08-28 10:29:37,132 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-28 10:29:37,133 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-28 10:29:37,133 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/termine-veranstaltungen-juni-juli/ (Versuch 1) +2025-08-28 10:29:37,310 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:37,312 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:37,313 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 649 Wörter +2025-08-28 10:29:37,313 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 649 Wörter +2025-08-28 10:29:37,314 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Vanlife-Events im Juni bis November 2025: Events für Bulli-Lover und Campervan-Fans +2025-08-28 10:29:37,314 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-28 10:29:37,314 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sicherheitszubehoer-wohnmobil-schutz-einbruch-diebstahl-gase/ (Versuch 1) +2025-08-28 10:29:37,502 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:37,504 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:37,505 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1134 Wörter +2025-08-28 10:29:37,505 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1134 Wörter +2025-08-28 10:29:37,506 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Schutz vor Einbruch und Diebstahl fürs Wohnmobil: Wie schütze ich mein Wohnmobil vor Diebstahl? +2025-08-28 10:29:37,506 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-28 10:29:37,506 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/corigon-neue-hymer-marke-sommer-2025/ (Versuch 1) +2025-08-28 10:29:37,729 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:37,730 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:37,731 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 874 Wörter +2025-08-28 10:29:37,732 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 874 Wörter +2025-08-28 10:29:37,732 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Hymer kündigt neue Wohnmobil-Marke Corigon an: Hymer bringt neue Günstig-Marke für Camper +2025-08-28 10:29:37,732 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-28 10:29:37,732 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/sieger-frosch-campfire-der-ideen-2025/ (Versuch 1) +2025-08-28 10:29:37,910 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:37,911 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:37,912 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 452 Wörter +2025-08-28 10:29:37,912 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 452 Wörter +2025-08-28 10:29:37,912 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Die besten Camper-Innovationen 2025: „Frosch“ ist das genialste neue Camping-Zubehör +2025-08-28 10:29:37,913 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-28 10:29:37,913 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/fiat-ducato-9-gang-automatik-softwareupdate/ (Versuch 1) +2025-08-28 10:29:38,095 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:38,096 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:38,099 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1546 Wörter +2025-08-28 10:29:38,100 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1546 Wörter +2025-08-28 10:29:38,100 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Leserstimmen zum Update der 9-Gang-Automatik: Was bringt das Softwareupdate für den Ducato 8? +2025-08-28 10:29:38,100 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-28 10:29:38,101 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/caravaning-jahrgangs-archiv-als-pdf-download/ (Versuch 1) +2025-08-28 10:29:38,231 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:38,231 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:38,231 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 136 Wörter +2025-08-28 10:29:38,232 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 136 Wörter +2025-08-28 10:29:38,232 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CARAVANING Jahrgangs Archiv 2024: CARAVANING fürs Archiv +2025-08-28 10:29:38,232 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-28 10:29:38,232 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/top-10-clever-campen-videos-2024/ (Versuch 1) +2025-08-28 10:29:38,414 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:38,415 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:38,415 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:38,415 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 18 Paragraphen +2025-08-28 10:29:38,415 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:38,417 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-28 10:29:38,418 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top 10 Clever-Campen-Videos 2024: Die beliebtesten Camping-Videos +2025-08-28 10:29:38,418 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-28 10:29:38,418 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/retro-wohnmobile-2004-nuller-jahre-rueckblick-promobil/ (Versuch 1) +2025-08-28 10:29:38,582 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:38,583 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:38,584 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1870 Wörter +2025-08-28 10:29:38,585 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1870 Wörter +2025-08-28 10:29:38,585 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Retro-Campingfahrzeuge aus den Nuller-Jahren: Das waren die heißesten Wohnmobile 2004 +2025-08-28 10:29:38,585 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-28 10:29:38,585 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/gaswarner-wohnmobil-schutz-gas/ (Versuch 1) +2025-08-28 10:29:38,793 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:38,795 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:38,797 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 1796 Wörter +2025-08-28 10:29:38,797 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 1796 Wörter +2025-08-28 10:29:38,798 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Gaswarner im Wohnmobil: So schütze Sie sich vor unsichtbaren Gasen +2025-08-28 10:29:38,798 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-28 10:29:38,798 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/versicherungen-werden-2025-teuerer-tipps-und-tricks-um-die-kosten-zu-senken/ (Versuch 1) +2025-08-28 10:29:38,971 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:38,973 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:38,974 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 942 Wörter +2025-08-28 10:29:38,975 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 942 Wörter +2025-08-28 10:29:38,975 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Preisschock bei Wohnmobilversicherungen: Versicherung gestiegen? Das können Sie tun! +2025-08-28 10:29:38,975 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-28 10:29:38,975 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/dailycamper-trekking-mini-camper-fiat-doblo/ (Versuch 1) +2025-08-28 10:29:39,152 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:39,153 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:39,154 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 416 Wörter +2025-08-28 10:29:39,154 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 416 Wörter +2025-08-28 10:29:39,154 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Dailycamper Trekking (2025): Neuer Mini-Camper auf Fiat Doblo +2025-08-28 10:29:39,155 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingbus Rocket Camper Ryzon beim Weltrekord: Jonas Deichmanns Camper für Ironman-Rekord +2025-08-28 10:29:39,155 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-28 10:29:39,155 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/e-trailer-system-kontrollboard-wohnwagen-camper/ (Versuch 1) +2025-08-28 10:29:39,330 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:39,331 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:39,331 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 499 Wörter +2025-08-28 10:29:39,332 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 499 Wörter +2025-08-28 10:29:39,332 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: E-Trailer für die Campingfahrzeug-Steuerung per App: So werden Wohnwagen & Camper zum Smarthome +2025-08-28 10:29:39,332 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-28 10:29:39,332 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-red-bull-arena-leipzig/ (Versuch 1) +2025-08-28 10:29:39,547 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:39,549 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:39,550 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 894 Wörter +2025-08-28 10:29:39,551 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 894 Wörter +2025-08-28 10:29:39,551 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Im Wohnmobil zum 2024-EM-Spielort Leipzig: Nach Leipzig in die Red Bull Arena zur Fußball-EM +2025-08-28 10:29:39,551 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-28 10:29:39,551 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/can-kasim-dogan-interview-westfalia/ (Versuch 1) +2025-08-28 10:29:39,747 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:39,748 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:39,749 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 599 Wörter +2025-08-28 10:29:39,749 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 599 Wörter +2025-08-28 10:29:39,750 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Can-Kasim Dogan von Westfalen Mobil im Interview : Wie sieht der Westfalia-CEO die Camping-Zukunft? +2025-08-28 10:29:39,750 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-28 10:29:39,750 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/promobil-leser-meinung-mobilitaet-fortbewegungsmittel-fahrrad/ (Versuch 1) +2025-08-28 10:29:39,934 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:39,935 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:39,936 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 639 Wörter +2025-08-28 10:29:39,937 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 639 Wörter +2025-08-28 10:29:39,937 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Top-Fortbewegungsmittel für Wohnmobil-Reisende: Wie bleiben Sie im Campingurlaub mobil? +2025-08-28 10:29:39,938 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-28 10:29:39,938 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/spielorte-em-2024-frankfurt/ (Versuch 1) +2025-08-28 10:29:40,119 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:40,121 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:40,122 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 691 Wörter +2025-08-28 10:29:40,122 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 691 Wörter +2025-08-28 10:29:40,122 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Tipps für EM-Spielorte 2024 : Frankfurt für Fußball-Fans im Wohnmobil +2025-08-28 10:29:40,123 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-28 10:29:40,123 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/stuttgart-em-2024-fussball-stellplaetze-wohnmobil-camping/ (Versuch 1) +2025-08-28 10:29:40,310 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:40,311 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:40,311 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 923 Wörter +2025-08-28 10:29:40,312 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 923 Wörter +2025-08-28 10:29:40,312 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Spielorte und Stellplätze zur Fußball-EM 2024 : Mit dem Wohnmobil zur Euro 2024 in Stuttgart +2025-08-28 10:29:40,312 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-28 10:29:40,312 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/camper-radio-radiosender-caravan-fm/ (Versuch 1) +2025-08-28 10:29:40,492 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:40,492 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:40,493 - INFO - extract_full_article:257 - 🎉 Erfolgreiche Extraktion (generisch): 258 Wörter +2025-08-28 10:29:40,493 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 258 Wörter +2025-08-28 10:29:40,493 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camper-Radio​ Caravan.fm : Radiosender speziell für Camping-Fans +2025-08-28 10:29:40,493 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-28 10:29:40,493 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.promobil.de/tourismus-management-armin-brysch-interview-virtuelle-reisen/ (Versuch 1) +2025-08-28 10:29:40,643 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:40,643 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:40,644 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:40,644 - INFO - extract_from_paragraphs:194 - ✅ Fallback-Extraktion aus 8 Paragraphen +2025-08-28 10:29:40,644 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:40,645 - INFO - extract_full_article:281 - ⚠️ Body-Extraktion: 0 Wörter +2025-08-28 10:29:40,645 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Professor für Tourismus-Management im Interview: Armin Brysch spricht über virtuelle Reisen +2025-08-28 10:29:40,645 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 0 neue Artikel aus https://www.promobil.de/rss/news +2025-08-28 10:29:41,651 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.promobil.de/rss/ratgeber +2025-08-28 10:29:41,993 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: ratgeber bei www.promobil.de +2025-08-28 10:29:41,994 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-28 10:29:41,996 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.promobil.de/weitere-ratgeber/sommerferien-endspurt-wohin-mit-dem-wohnmobil/ +2025-08-28 10:29:42,154 - INFO - extract_images_with_metadata:167 - 🔍 13 img-Tags gefunden +2025-08-28 10:29:42,154 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Symbolbild, Wetter, Sonne, Regen... +2025-08-28 10:29:42,154 - INFO - extract_images_with_metadata:180 - ✅ Bild hinzugefügt: Bild aus Originalartikel... +2025-08-28 10:29:42,155 - ERROR - extract_images_with_metadata:200 - ❌ Unerwarteter Fehler bei Bildextraktion von https://www.promobil.de/weitere-ratgeber/sommerferien-endspurt-wohin-mit-dem-wohnmobil/: unsupported operand type(s) for *: 'NoneType' and 'NoneType' +2025-08-28 10:29:42,155 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Reisetipps für die letzten Ferienwochen: Dem schlechten Wetter davon fahren' extrahiert +2025-08-28 10:29:42,155 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Reisetipps für die letzten Ferienwochen: Dem schlechten Wetter davon fahren +2025-08-28 10:29:42,157 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 5 Buchtipps für Campingfans: Spannende und lustige Bücher rund ums Camping +2025-08-28 10:29:42,160 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Campingplätze, Stellplätze und mehr finden : „Stellplatz-Radar“-App bekommt neue Funktionen +2025-08-28 10:29:42,161 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrzeugtechnik am Wohnmobil im Detail: Windschutzscheiben sind längst mehr als Glas +2025-08-28 10:29:42,163 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Betrug im Wohnmobilhandel: Haftstrafen für Chefs von FlexiCamper +2025-08-28 10:29:42,164 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum perfekten Campingtag: Wo verbringen Sie den perfekten Campingurlaub? +2025-08-28 10:29:42,165 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tauschautomat für Gasflaschen im Praxischeck: Wie funktioniert der 24/7-Service für Camper +2025-08-28 10:29:42,166 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Italien verschärft Regeln zur Müllentsorgung: Bis zu 18.000 Euro Strafe für Müll vor dem Camper +2025-08-28 10:29:42,166 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Regeln auf Frankreichs Autobahnen im Pannenfall: Kein Schutz durch ADAC & Co. auf Autobahnen +2025-08-28 10:29:42,167 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fahrradtransport in Italien: Warntafel bei Fahrradträgern doch wieder Pflicht? +2025-08-28 10:29:42,169 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Mautregeln für Wohnmobile mit 3,5 t: Diese Camper brauchen ab dem Stichtag eine GO-Box +2025-08-28 10:29:42,170 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Film-Stunt mit Caravan – wie realistisch ist das?: Sexsymbol Jensen Ackles wagt Stunt auf Wohnwagen +2025-08-28 10:29:42,171 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: CLEVER CAMPEN Podcast Folge 40: Gravelbikes und Camping – die beste Kombi? +2025-08-28 10:29:42,172 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Stellplatz-Radar Sommeraktion 2025: 30 Tage Stellplatz-Radar PLUS gratis testen +2025-08-28 10:29:42,173 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Digitaler Fahrzeugschein für Camper: promobil testet den digitalen Fahrzeugschein +2025-08-28 10:29:42,174 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Badezimmer beim Camping - Umfrage: Welches Bad brauchen Sie im Wohnmobil? +2025-08-28 10:29:42,175 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Umfrage zum Kaffeegenuss beim Camping: So kochen Sie am liebsten Ihren Kaffee +2025-08-28 10:29:42,176 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zwei Menschen, zwei Meinungen: Das Mietbad spaltet die Campingwelt +2025-08-28 10:29:42,177 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Zubehör auf der größten Campingmesse kaufen: Deshalb müssen Zubehör-Shopper zum Caravan Salon +2025-08-28 10:29:42,178 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Tipps für die größte Camping-Messe Deutschlands: Darum dürfen Sie den Caravan Salon nicht verpassen +2025-08-28 10:29:42,178 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.promobil.de/rss/ratgeber +2025-08-28 10:29:43,183 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-28 10:29:43,436 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach camping +2025-08-28 10:29:43,437 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-28 10:29:43,440 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/43258/6104183 +2025-08-28 10:29:43,726 - INFO - extract_images_with_metadata:167 - 🔍 9 img-Tags gefunden +2025-08-28 10:29:43,727 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/43258/6104183 +2025-08-28 10:29:43,727 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Camping-Boom: Wohnmobil im Urlaub richtig absichern / Wie Sie im Urlaub typische Versicherungsfallen vermeiden' extrahiert +2025-08-28 10:29:43,727 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Camping-Boom: Wohnmobil im Urlaub richtig absichern / Wie Sie im Urlaub typische Versicherungsfallen vermeiden +2025-08-28 10:29:43,730 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/64471/6104130 +2025-08-28 10:29:43,998 - INFO - extract_images_with_metadata:167 - 🔍 7 img-Tags gefunden +2025-08-28 10:29:43,999 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/64471/6104130 +2025-08-28 10:29:43,999 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für '"Deutschlands Beste Online-Shops 2025" / Renommierter E-Commerce-Award - Votum aus rund 70.000 Kundenmeinungen - Feierliche Preisverleihung' extrahiert +2025-08-28 10:29:43,999 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: "Deutschlands Beste Online-Shops 2025" / Renommierter E-Commerce-Award - Votum aus rund 70.000 Kundenmeinungen - Feierliche Preisverleihung +2025-08-28 10:29:44,001 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/6605/6103157 +2025-08-28 10:29:44,267 - INFO - extract_images_with_metadata:167 - 🔍 11 img-Tags gefunden +2025-08-28 10:29:44,268 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/6605/6103157 +2025-08-28 10:29:44,268 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Neue Folge "Bella Italia - Camping auf Deutsch": Liebe, Abenteuer und große Überraschungen in den USA' extrahiert +2025-08-28 10:29:44,268 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Neue Folge "Bella Italia - Camping auf Deutsch": Liebe, Abenteuer und große Überraschungen in den USA +2025-08-28 10:29:44,269 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Endlich Ruhe: Dieses Outdoor-Gadget hält Mücken zuverlässig fern +2025-08-28 10:29:44,271 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-28 10:29:44,272 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: IFA 2025: Jackery präsentiert neue 500-Watt-Powerstation im flachen Format, Solardachziegel und DIY-Balkonkraftwerk mit integriertem Brandschutzsystem +2025-08-28 10:29:44,272 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Inklusiver Campingurlaub am Gardasee +2025-08-28 10:29:44,272 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/153661/6094377 (Versuch 1) +2025-08-28 10:29:44,551 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:44,553 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 616 Wörter +2025-08-28 10:29:44,553 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 616 Wörter +2025-08-28 10:29:44,554 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Inklusiver Campingurlaub am Gardasee +2025-08-28 10:29:44,555 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neuheiten-Feuerwerk bei vanexxt auf dem Caravan Salon Düsseldorf 2025 +2025-08-28 10:29:44,556 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-28 10:29:44,556 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/170000/6091414 (Versuch 1) +2025-08-28 10:29:44,874 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:44,875 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 191 Wörter +2025-08-28 10:29:44,875 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 191 Wörter +2025-08-28 10:29:44,876 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Clevere Vorzelte - Vango beim Caravan Salon in Düsseldorf +2025-08-28 10:29:44,877 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: 50 Jahre ADAC Tourset: Vom Kartenstapel zum digitalen Reisebegleiter / Erfolgreicher Reisebegleiter / 657.000 Toursets in 2024 bestellt +2025-08-28 10:29:44,877 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 3 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=camping&langid=1 +2025-08-28 10:29:45,882 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-28 10:29:46,101 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Presseportal.de - Ergebnis der Suchanfrage nach wohnmobil +2025-08-28 10:29:46,101 - INFO - fetch_and_process_feed:187 - 📰 10 Einträge gefunden +2025-08-28 10:29:46,103 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Camping-Boom: Wohnmobil im Urlaub richtig absichern / Wie Sie im Urlaub typische Versicherungsfallen vermeiden +2025-08-28 10:29:46,106 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.presseportal.de/pm/58964/6104008 +2025-08-28 10:29:46,344 - INFO - extract_images_with_metadata:167 - 🔍 7 img-Tags gefunden +2025-08-28 10:29:46,345 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.presseportal.de/pm/58964/6104008 +2025-08-28 10:29:46,345 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für '66 Lovemobile in Niedersachsen - Zahl leicht gestiegen / Mehr als 80 Prozent der mobilen Bordelle in Niedersachsen auf drei Kreise verteilt' extrahiert +2025-08-28 10:29:46,345 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: 66 Lovemobile in Niedersachsen - Zahl leicht gestiegen / Mehr als 80 Prozent der mobilen Bordelle in Niedersachsen auf drei Kreise verteilt +2025-08-28 10:29:46,347 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Fast jeder Zweite träumt vom Van-Life / HEM-Umfrage zeigt: Das Fahrzeug wird immer häufiger zur mobilen Unterkunft +2025-08-28 10:29:46,348 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen +2025-08-28 10:29:46,350 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/65031/6100268 (Versuch 1) +2025-08-28 10:29:46,664 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:46,665 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 576 Wörter +2025-08-28 10:29:46,666 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 576 Wörter +2025-08-28 10:29:46,667 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: TÜV-Verband: Neues Merkblatt zum Anbau von Solaranlagen an Wohnmobilen +2025-08-28 10:29:46,668 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Akku leer: Gefahren beim Laden von E-Bikes +2025-08-28 10:29:46,669 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Neue Folge "Bella Italia - Camping auf Deutsch": von Italien in die USA +2025-08-28 10:29:46,670 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Maximale Flexibilität trifft volle Power: Intelligente Tiefenreinigung ohne Kabel mit der PURE ONE S Serie von Tineco +2025-08-28 10:29:46,672 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Urlaub mit dem Wohnmobil: Was tun bei Panne oder Unfall +2025-08-28 10:29:46,672 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-28 10:29:46,672 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/105254/6091837 (Versuch 1) +2025-08-28 10:29:46,973 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:46,975 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: EuGH fordert im Diesel-Abgasskandal angemessene Entschädigung für Verbraucher +2025-08-28 10:29:46,976 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: So ist man beim Camping richtig versichert +2025-08-28 10:29:46,976 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.presseportal.de/pm/121716/6085196 (Versuch 1) +2025-08-28 10:29:47,450 - INFO - extract_with_selectors:165 - ✅ Erfolgreiche Extraktion mit Selektor: {'tag': 'article', 'class': None} +2025-08-28 10:29:47,452 - INFO - extract_full_article:248 - 🎉 Erfolgreiche Extraktion: 603 Wörter +2025-08-28 10:29:47,452 - INFO - fetch_and_process_feed:215 - ✅ Volltext extrahiert: 603 Wörter +2025-08-28 10:29:47,453 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: So ist man beim Camping richtig versichert +2025-08-28 10:29:47,453 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.presseportal.de/rss/rss2_vts.htx?q=wohnmobil&langid=1 +2025-08-28 10:29:48,456 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://caravan-news.de/rss/schlagzeilen.php +2025-08-28 10:29:48,734 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: CARAVAN-NEWS.de +2025-08-28 10:29:48,734 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://caravan-news.de/rss/schlagzeilen.php +2025-08-28 10:29:49,738 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-28 10:29:50,380 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Campingplatz +2025-08-28 10:29:50,380 - INFO - fetch_and_process_feed:187 - 📰 20 Einträge gefunden +2025-08-28 10:29:50,381 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Brand auf Campingplatz in Otterstadt - Speyer-Kurier +2025-08-28 10:29:50,381 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.speyer-kurier.de/blaulicht/artikel/brand-auf-campingplatz-in-otterstadt&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw37x8Ph29lBv4K9sjZjZNlH (Versuch 1) +2025-08-28 10:29:50,491 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:50,492 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:50,492 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:50,493 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.speyer-kurier.de/blaulicht/artikel/brand-auf-campingplatz-in-otterstadt&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw37x8Ph29lBv4K9sjZjZNlH +2025-08-28 10:29:50,496 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.speyer-kurier.de/blaulicht/artikel/brand-auf-campingplatz-in-otterstadt&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw37x8Ph29lBv4K9sjZjZNlH +2025-08-28 10:29:50,613 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:50,614 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.speyer-kurier.de/blaulicht/artikel/brand-auf-campingplatz-in-otterstadt&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw37x8Ph29lBv4K9sjZjZNlH +2025-08-28 10:29:50,614 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Brand auf Campingplatz in Otterstadt - Speyer-Kurier' extrahiert +2025-08-28 10:29:50,615 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Brand auf Campingplatz in Otterstadt - Speyer-Kurier +2025-08-28 10:29:50,615 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Zehn Jahre Stillstand: Letzter Versuch für geplanten Campingplatz? - Kusel - Die Rheinpfalz +2025-08-28 10:29:50,615 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/kreis-kusel_artikel,-zehn-jahre-stillstand-letzter-versuch-f%25C3%25BCr-geplanten-campingplatz-_arid,5806398.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw03Sz4h5yKhs00d4HecyABq (Versuch 1) +2025-08-28 10:29:50,728 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:50,729 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:50,729 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:50,729 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/kreis-kusel_artikel,-zehn-jahre-stillstand-letzter-versuch-f%25C3%25BCr-geplanten-campingplatz-_arid,5806398.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw03Sz4h5yKhs00d4HecyABq +2025-08-28 10:29:50,733 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/kreis-kusel_artikel,-zehn-jahre-stillstand-letzter-versuch-f%25C3%25BCr-geplanten-campingplatz-_arid,5806398.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw03Sz4h5yKhs00d4HecyABq +2025-08-28 10:29:50,868 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:50,868 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.rheinpfalz.de/lokal/kreis-kusel_artikel,-zehn-jahre-stillstand-letzter-versuch-f%25C3%25BCr-geplanten-campingplatz-_arid,5806398.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw03Sz4h5yKhs00d4HecyABq +2025-08-28 10:29:50,869 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Zehn Jahre Stillstand: Letzter Versuch für geplanten Campingplatz? - Kusel - Die Rheinpfalz' extrahiert +2025-08-28 10:29:50,869 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Zehn Jahre Stillstand: Letzter Versuch für geplanten Campingplatz? - Kusel - Die Rheinpfalz +2025-08-28 10:29:50,870 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Landvergnügen: Statt Campingplatz, jede Nacht ein anderer Bauernhof - Kleine Zeitung +2025-08-28 10:29:50,870 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.kleinezeitung.at/lebensart/20031453/statt-campingplatz-jede-nacht-ein-anderer-bauernhof&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Fnz1ORv1BbfIEZfTG432j (Versuch 1) +2025-08-28 10:29:50,987 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:50,987 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:50,988 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:50,988 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.kleinezeitung.at/lebensart/20031453/statt-campingplatz-jede-nacht-ein-anderer-bauernhof&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Fnz1ORv1BbfIEZfTG432j +2025-08-28 10:29:50,992 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.kleinezeitung.at/lebensart/20031453/statt-campingplatz-jede-nacht-ein-anderer-bauernhof&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Fnz1ORv1BbfIEZfTG432j +2025-08-28 10:29:51,116 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:51,117 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.kleinezeitung.at/lebensart/20031453/statt-campingplatz-jede-nacht-ein-anderer-bauernhof&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Fnz1ORv1BbfIEZfTG432j +2025-08-28 10:29:51,117 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Landvergnügen: Statt Campingplatz, jede Nacht ein anderer Bauernhof - Kleine Zeitung' extrahiert +2025-08-28 10:29:51,117 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Landvergnügen: Statt Campingplatz, jede Nacht ein anderer Bauernhof - Kleine Zeitung +2025-08-28 10:29:51,118 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Rheinland-Pfalz & Saarland: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt +2025-08-28 10:29:51,118 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.n-tv.de/regionales/rheinland-pfalz-und-saarland/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-article25992761.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1d142-8q28VLBMt44GmQQm (Versuch 1) +2025-08-28 10:29:51,233 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:51,234 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:51,234 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:51,234 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.n-tv.de/regionales/rheinland-pfalz-und-saarland/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-article25992761.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1d142-8q28VLBMt44GmQQm +2025-08-28 10:29:51,238 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.n-tv.de/regionales/rheinland-pfalz-und-saarland/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-article25992761.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1d142-8q28VLBMt44GmQQm +2025-08-28 10:29:51,367 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:51,368 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.n-tv.de/regionales/rheinland-pfalz-und-saarland/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-article25992761.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1d142-8q28VLBMt44GmQQm +2025-08-28 10:29:51,368 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Rheinland-Pfalz & Saarland: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt' extrahiert +2025-08-28 10:29:51,368 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Rheinland-Pfalz & Saarland: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt +2025-08-28 10:29:51,369 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Klima-Ereignis könnte Europas Wetter radikal verändern und den Winter völlig auf den Kopf stellen +2025-08-28 10:29:51,369 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/veraendern-winter-voellig-auf-den-kopf-stellen-raetselhaftes-klima-ereignis-europa-wetter-radikal-zr-93889387.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13FBKqr1NahvNwZSiFQUpS (Versuch 1) +2025-08-28 10:29:51,492 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:51,494 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:51,494 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:51,494 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/veraendern-winter-voellig-auf-den-kopf-stellen-raetselhaftes-klima-ereignis-europa-wetter-radikal-zr-93889387.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13FBKqr1NahvNwZSiFQUpS +2025-08-28 10:29:51,497 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/veraendern-winter-voellig-auf-den-kopf-stellen-raetselhaftes-klima-ereignis-europa-wetter-radikal-zr-93889387.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13FBKqr1NahvNwZSiFQUpS +2025-08-28 10:29:51,620 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:51,620 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/veraendern-winter-voellig-auf-den-kopf-stellen-raetselhaftes-klima-ereignis-europa-wetter-radikal-zr-93889387.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw13FBKqr1NahvNwZSiFQUpS +2025-08-28 10:29:51,621 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Klima-Ereignis könnte Europas Wetter radikal verändern und den Winter völlig auf den Kopf stellen' extrahiert +2025-08-28 10:29:51,621 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Klima-Ereignis könnte Europas Wetter radikal verändern und den Winter völlig auf den Kopf stellen +2025-08-28 10:29:51,622 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Lebensgefahr durch extreme Unwetter: Mittelmeer-Phänomen treibt Gefahr nun auch nach ... +2025-08-28 10:29:51,622 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/lebensgefahr-durch-extreme-unwetter-in-italien-warum-die-gefahr-nun-auch-nach-deutschland-schwappt-zr-93902987.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1iZO1swk8NP-QaytJ1i_fH (Versuch 1) +2025-08-28 10:29:51,739 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:51,740 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:51,740 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:51,740 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/lebensgefahr-durch-extreme-unwetter-in-italien-warum-die-gefahr-nun-auch-nach-deutschland-schwappt-zr-93902987.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1iZO1swk8NP-QaytJ1i_fH +2025-08-28 10:29:51,744 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/lebensgefahr-durch-extreme-unwetter-in-italien-warum-die-gefahr-nun-auch-nach-deutschland-schwappt-zr-93902987.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1iZO1swk8NP-QaytJ1i_fH +2025-08-28 10:29:51,869 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:51,869 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/lebensgefahr-durch-extreme-unwetter-in-italien-warum-die-gefahr-nun-auch-nach-deutschland-schwappt-zr-93902987.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1iZO1swk8NP-QaytJ1i_fH +2025-08-28 10:29:51,869 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Lebensgefahr durch extreme Unwetter: Mittelmeer-Phänomen treibt Gefahr nun auch nach ...' extrahiert +2025-08-28 10:29:51,870 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Lebensgefahr durch extreme Unwetter: Mittelmeer-Phänomen treibt Gefahr nun auch nach ... +2025-08-28 10:29:51,870 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sachschaden: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Rheinland-Pfalz +2025-08-28 10:29:51,871 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rhein-zeitung.de/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_arid-4064379.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39vzojQNhBpnUVvyBovqdG (Versuch 1) +2025-08-28 10:29:51,992 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:51,993 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:51,993 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:51,994 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.rhein-zeitung.de/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_arid-4064379.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39vzojQNhBpnUVvyBovqdG +2025-08-28 10:29:51,997 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.rhein-zeitung.de/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_arid-4064379.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39vzojQNhBpnUVvyBovqdG +2025-08-28 10:29:52,120 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:52,120 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.rhein-zeitung.de/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_arid-4064379.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw39vzojQNhBpnUVvyBovqdG +2025-08-28 10:29:52,121 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sachschaden: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Rheinland-Pfalz' extrahiert +2025-08-28 10:29:52,121 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sachschaden: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Rheinland-Pfalz +2025-08-28 10:29:52,121 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Campingplatz steht unter neuer Leitung - Mühlacker Tagblatt +2025-08-28 10:29:52,122 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.muehlacker-tagblatt.de/Knittlingen/Campingplatz-steht-unter-neuer-Leitung-404285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ohQMvQLwZB15jBj2h_aGm (Versuch 1) +2025-08-28 10:29:52,244 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:52,249 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:52,249 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:52,250 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.muehlacker-tagblatt.de/Knittlingen/Campingplatz-steht-unter-neuer-Leitung-404285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ohQMvQLwZB15jBj2h_aGm +2025-08-28 10:29:52,253 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.muehlacker-tagblatt.de/Knittlingen/Campingplatz-steht-unter-neuer-Leitung-404285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ohQMvQLwZB15jBj2h_aGm +2025-08-28 10:29:52,405 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:52,406 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.muehlacker-tagblatt.de/Knittlingen/Campingplatz-steht-unter-neuer-Leitung-404285.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ohQMvQLwZB15jBj2h_aGm +2025-08-28 10:29:52,406 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Campingplatz steht unter neuer Leitung - Mühlacker Tagblatt' extrahiert +2025-08-28 10:29:52,406 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Campingplatz steht unter neuer Leitung - Mühlacker Tagblatt +2025-08-28 10:29:52,407 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Saarbrücker Zeitung +2025-08-28 10:29:52,407 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.saarbruecker-zeitung.de/saarland/blickzumnachbarn/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771593&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1lKkodrkZcnrbfts2GayPR (Versuch 1) +2025-08-28 10:29:52,529 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:52,530 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:52,530 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:52,531 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.saarbruecker-zeitung.de/saarland/blickzumnachbarn/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771593&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1lKkodrkZcnrbfts2GayPR +2025-08-28 10:29:52,534 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.saarbruecker-zeitung.de/saarland/blickzumnachbarn/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771593&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1lKkodrkZcnrbfts2GayPR +2025-08-28 10:29:52,657 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:52,657 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.saarbruecker-zeitung.de/saarland/blickzumnachbarn/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771593&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1lKkodrkZcnrbfts2GayPR +2025-08-28 10:29:52,658 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Saarbrücker Zeitung' extrahiert +2025-08-28 10:29:52,658 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Saarbrücker Zeitung +2025-08-28 10:29:52,659 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus +2025-08-28 10:29:52,659 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-schule-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2aoxqFIuFPH9fpfTh4KbQ2 (Versuch 1) +2025-08-28 10:29:52,775 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:52,775 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:52,776 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:52,776 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.fr.de/panorama/bleibt-haeufig-unbemerkt-problematischer-trend-bei-schulausfluegen-breitet-sich-aus-schule-zr-93893032.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2aoxqFIuFPH9fpfTh4KbQ2 +2025-08-28 10:29:52,779 - INFO - fetch_and_process_feed:251 - 🔄 Duplikat übersprungen: Bleibt häufig unbemerkt: Problematischer Trend bei Schulausflügen breitet sich aus +2025-08-28 10:29:52,780 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - MSN +2025-08-28 10:29:52,780 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/sieben-wohnwagen-bei-feuer-auf-campingplatz-besch%25C3%25A4digt/ar-AA1Ll6Lo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2OKEXFNNohu7Fa2qjUumRZ (Versuch 1) +2025-08-28 10:29:52,896 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:52,897 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:52,897 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:52,897 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/sieben-wohnwagen-bei-feuer-auf-campingplatz-besch%25C3%25A4digt/ar-AA1Ll6Lo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2OKEXFNNohu7Fa2qjUumRZ +2025-08-28 10:29:52,901 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/sieben-wohnwagen-bei-feuer-auf-campingplatz-besch%25C3%25A4digt/ar-AA1Ll6Lo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2OKEXFNNohu7Fa2qjUumRZ +2025-08-28 10:29:53,017 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:53,017 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.msn.com/de-de/nachrichten/panorama/sieben-wohnwagen-bei-feuer-auf-campingplatz-besch%25C3%25A4digt/ar-AA1Ll6Lo&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2OKEXFNNohu7Fa2qjUumRZ +2025-08-28 10:29:53,017 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - MSN' extrahiert +2025-08-28 10:29:53,018 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - MSN +2025-08-28 10:29:53,018 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Rhein-Pfalz-Kreis – Brand auf einem Campingplatz - MRN-News.de +2025-08-28 10:29:53,018 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.mrn-news.de/2025/08/27/rhein-pfalz-kreis-brand-auf-einem-campingplatz-600056/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gcVfYYMPsTSp0-8Fh1ov1 (Versuch 1) +2025-08-28 10:29:53,155 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:53,156 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:53,156 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:53,156 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.mrn-news.de/2025/08/27/rhein-pfalz-kreis-brand-auf-einem-campingplatz-600056/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gcVfYYMPsTSp0-8Fh1ov1 +2025-08-28 10:29:53,160 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.mrn-news.de/2025/08/27/rhein-pfalz-kreis-brand-auf-einem-campingplatz-600056/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gcVfYYMPsTSp0-8Fh1ov1 +2025-08-28 10:29:53,294 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:53,295 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.mrn-news.de/2025/08/27/rhein-pfalz-kreis-brand-auf-einem-campingplatz-600056/&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1gcVfYYMPsTSp0-8Fh1ov1 +2025-08-28 10:29:53,296 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Rhein-Pfalz-Kreis – Brand auf einem Campingplatz - MRN-News.de' extrahiert +2025-08-28 10:29:53,296 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Rhein-Pfalz-Kreis – Brand auf einem Campingplatz - MRN-News.de +2025-08-28 10:29:53,296 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Trierischer Volksfreund +2025-08-28 10:29:53,296 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.volksfreund.de/region/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771597&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2sDVmOAKfpSHhFZvLdbm_5 (Versuch 1) +2025-08-28 10:29:53,421 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:53,422 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:53,422 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:53,422 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.volksfreund.de/region/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771597&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2sDVmOAKfpSHhFZvLdbm_5 +2025-08-28 10:29:53,424 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.volksfreund.de/region/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771597&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2sDVmOAKfpSHhFZvLdbm_5 +2025-08-28 10:29:53,548 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:53,549 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.volksfreund.de/region/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt_aid-133771597&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2sDVmOAKfpSHhFZvLdbm_5 +2025-08-28 10:29:53,550 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Trierischer Volksfreund' extrahiert +2025-08-28 10:29:53,550 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Trierischer Volksfreund +2025-08-28 10:29:53,550 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: FAQ: Alles Wichtige zum Wasser mit Geschmack Festival 2025 in Heubach - Gmünder Tagespost +2025-08-28 10:29:53,551 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.gmuender-tagespost.de/ostalb/rosenstein/heubach/wasser-mit-geschmack-festival-2025-musik-kunst-gemeinschaft-93892202.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9cgUIrS9AjBrhtVSwwib (Versuch 1) +2025-08-28 10:29:53,662 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:53,662 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:53,662 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:53,662 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.gmuender-tagespost.de/ostalb/rosenstein/heubach/wasser-mit-geschmack-festival-2025-musik-kunst-gemeinschaft-93892202.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9cgUIrS9AjBrhtVSwwib +2025-08-28 10:29:53,664 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.gmuender-tagespost.de/ostalb/rosenstein/heubach/wasser-mit-geschmack-festival-2025-musik-kunst-gemeinschaft-93892202.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9cgUIrS9AjBrhtVSwwib +2025-08-28 10:29:53,791 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:53,791 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.gmuender-tagespost.de/ostalb/rosenstein/heubach/wasser-mit-geschmack-festival-2025-musik-kunst-gemeinschaft-93892202.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2l9cgUIrS9AjBrhtVSwwib +2025-08-28 10:29:53,792 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'FAQ: Alles Wichtige zum Wasser mit Geschmack Festival 2025 in Heubach - Gmünder Tagespost' extrahiert +2025-08-28 10:29:53,793 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: FAQ: Alles Wichtige zum Wasser mit Geschmack Festival 2025 in Heubach - Gmünder Tagespost +2025-08-28 10:29:53,793 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Borkener Zeitung +2025-08-28 10:29:53,794 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.borkenerzeitung.de/welt/in-ausland/panorama/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-663729.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1L3D8uGuPKbB4qBB-8a8I3 (Versuch 1) +2025-08-28 10:29:53,915 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:53,916 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:53,916 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:53,916 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.borkenerzeitung.de/welt/in-ausland/panorama/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-663729.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1L3D8uGuPKbB4qBB-8a8I3 +2025-08-28 10:29:53,920 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.borkenerzeitung.de/welt/in-ausland/panorama/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-663729.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1L3D8uGuPKbB4qBB-8a8I3 +2025-08-28 10:29:54,078 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:54,078 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.borkenerzeitung.de/welt/in-ausland/panorama/Sieben-Wohnwagen-bei-Feuer-auf-Campingplatz-beschaedigt-663729.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1L3D8uGuPKbB4qBB-8a8I3 +2025-08-28 10:29:54,079 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Borkener Zeitung' extrahiert +2025-08-28 10:29:54,079 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Borkener Zeitung +2025-08-28 10:29:54,080 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: POL-PPRP: Brand auf einem Campingplatz - freenet.de +2025-08-28 10:29:54,080 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.freenet.de/polizeimeldungen/rheinland-pfalz/pol-pprp-brand-auf-einem-campingplatz_6105496-40501654.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Pns94-kd2inHfns451qxb (Versuch 1) +2025-08-28 10:29:54,203 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:54,204 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:54,204 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:54,204 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.freenet.de/polizeimeldungen/rheinland-pfalz/pol-pprp-brand-auf-einem-campingplatz_6105496-40501654.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Pns94-kd2inHfns451qxb +2025-08-28 10:29:54,207 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.freenet.de/polizeimeldungen/rheinland-pfalz/pol-pprp-brand-auf-einem-campingplatz_6105496-40501654.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Pns94-kd2inHfns451qxb +2025-08-28 10:29:54,349 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:54,350 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.freenet.de/polizeimeldungen/rheinland-pfalz/pol-pprp-brand-auf-einem-campingplatz_6105496-40501654.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0Pns94-kd2inHfns451qxb +2025-08-28 10:29:54,350 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'POL-PPRP: Brand auf einem Campingplatz - freenet.de' extrahiert +2025-08-28 10:29:54,351 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: POL-PPRP: Brand auf einem Campingplatz - freenet.de +2025-08-28 10:29:54,351 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Brand auf einem Campingplatz - aktuell mit der meinestadt.de +2025-08-28 10:29:54,351 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://aktuell.meinestadt.de/rhein-pfalz-kreis/polizeimeldungen/5690769&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1fAhNsv2Uiz0FUuFmtx4U1 (Versuch 1) +2025-08-28 10:29:54,473 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:54,473 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:54,474 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:54,474 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://aktuell.meinestadt.de/rhein-pfalz-kreis/polizeimeldungen/5690769&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1fAhNsv2Uiz0FUuFmtx4U1 +2025-08-28 10:29:54,476 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://aktuell.meinestadt.de/rhein-pfalz-kreis/polizeimeldungen/5690769&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1fAhNsv2Uiz0FUuFmtx4U1 +2025-08-28 10:29:54,611 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:54,611 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://aktuell.meinestadt.de/rhein-pfalz-kreis/polizeimeldungen/5690769&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw1fAhNsv2Uiz0FUuFmtx4U1 +2025-08-28 10:29:54,612 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Brand auf einem Campingplatz - aktuell mit der meinestadt.de' extrahiert +2025-08-28 10:29:54,612 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Brand auf einem Campingplatz - aktuell mit der meinestadt.de +2025-08-28 10:29:54,613 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sachschaden: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt | STERN.de +2025-08-28 10:29:54,613 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.stern.de/gesellschaft/regional/rheinland-pfalz-saarland/sachschaden--sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-36007106.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ln89AKet0fsmPLwqvKSRZ (Versuch 1) +2025-08-28 10:29:54,731 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:54,732 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:54,732 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:54,733 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.stern.de/gesellschaft/regional/rheinland-pfalz-saarland/sachschaden--sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-36007106.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ln89AKet0fsmPLwqvKSRZ +2025-08-28 10:29:54,736 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.stern.de/gesellschaft/regional/rheinland-pfalz-saarland/sachschaden--sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-36007106.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ln89AKet0fsmPLwqvKSRZ +2025-08-28 10:29:54,863 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:54,863 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.stern.de/gesellschaft/regional/rheinland-pfalz-saarland/sachschaden--sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-36007106.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw3ln89AKet0fsmPLwqvKSRZ +2025-08-28 10:29:54,864 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sachschaden: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt | STERN.de' extrahiert +2025-08-28 10:29:54,864 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sachschaden: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt | STERN.de +2025-08-28 10:29:54,864 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - TV Mittelrhein +2025-08-28 10:29:54,865 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tv-mittelrhein.de/mediathek/news/25450/Sieben_Wohnwagen_bei_Feuer_auf_Campingplatz_beschaedigt.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0he2tUV25IuvO5osNw1xgo (Versuch 1) +2025-08-28 10:29:54,984 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:54,985 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:54,985 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:54,985 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.tv-mittelrhein.de/mediathek/news/25450/Sieben_Wohnwagen_bei_Feuer_auf_Campingplatz_beschaedigt.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0he2tUV25IuvO5osNw1xgo +2025-08-28 10:29:54,989 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.tv-mittelrhein.de/mediathek/news/25450/Sieben_Wohnwagen_bei_Feuer_auf_Campingplatz_beschaedigt.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0he2tUV25IuvO5osNw1xgo +2025-08-28 10:29:55,122 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:55,122 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.tv-mittelrhein.de/mediathek/news/25450/Sieben_Wohnwagen_bei_Feuer_auf_Campingplatz_beschaedigt.html&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw0he2tUV25IuvO5osNw1xgo +2025-08-28 10:29:55,123 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - TV Mittelrhein' extrahiert +2025-08-28 10:29:55,123 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - TV Mittelrhein +2025-08-28 10:29:55,123 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Mittelhessen +2025-08-28 10:29:55,124 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.mittelhessen.de/lokales/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-4919360&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2wXuKqnmu2I73TfXwRGof4 (Versuch 1) +2025-08-28 10:29:55,246 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:55,247 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:55,247 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:55,247 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.mittelhessen.de/lokales/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-4919360&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2wXuKqnmu2I73TfXwRGof4 +2025-08-28 10:29:55,249 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.mittelhessen.de/lokales/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-4919360&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2wXuKqnmu2I73TfXwRGof4 +2025-08-28 10:29:55,374 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:55,375 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.mittelhessen.de/lokales/rheinland-pfalz/sieben-wohnwagen-bei-feuer-auf-campingplatz-beschaedigt-4919360&ct=ga&cd=CAIyGTQxY2RjNDZkNDExY2M5OTc6ZGU6ZGU6REU&usg=AOvVaw2wXuKqnmu2I73TfXwRGof4 +2025-08-28 10:29:55,376 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Mittelhessen' extrahiert +2025-08-28 10:29:55,377 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Sieben Wohnwagen bei Feuer auf Campingplatz beschädigt - Mittelhessen +2025-08-28 10:29:55,377 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 19 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/16793724126187652294 +2025-08-28 10:29:56,382 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-28 10:29:56,902 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Vanlife +2025-08-28 10:29:56,902 - INFO - fetch_and_process_feed:187 - 📰 1 Einträge gefunden +2025-08-28 10:29:56,903 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: VanCraft Waypoint XL: Vanlife in Übergröße aus den USA - vanlifemag.de +2025-08-28 10:29:56,903 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/van-craft-waypoint-xl-vanlife-in-uebergroesse-aus-den-usa/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1BVz5EAVRoCLYXzxYhRJfy (Versuch 1) +2025-08-28 10:29:57,023 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:29:57,024 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:29:57,024 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:29:57,025 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/van-craft-waypoint-xl-vanlife-in-uebergroesse-aus-den-usa/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1BVz5EAVRoCLYXzxYhRJfy +2025-08-28 10:29:57,029 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/van-craft-waypoint-xl-vanlife-in-uebergroesse-aus-den-usa/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1BVz5EAVRoCLYXzxYhRJfy +2025-08-28 10:29:57,153 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:29:57,154 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://vanlifemag.de/van-craft-waypoint-xl-vanlife-in-uebergroesse-aus-den-usa/&ct=ga&cd=CAIyGWNlNzIxOWZkNzJmZTQwNDU6ZGU6ZGU6REU&usg=AOvVaw1BVz5EAVRoCLYXzxYhRJfy +2025-08-28 10:29:57,154 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'VanCraft Waypoint XL: Vanlife in Übergröße aus den USA - vanlifemag.de' extrahiert +2025-08-28 10:29:57,154 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: VanCraft Waypoint XL: Vanlife in Übergröße aus den USA - vanlifemag.de +2025-08-28 10:29:57,155 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 1 neue Artikel aus https://www.google.de/alerts/feeds/03077836356662926441/987500860911797305 +2025-08-28 10:29:58,160 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-28 10:29:58,642 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert – Camping Termine 2024 +2025-08-28 10:29:58,643 - WARNING - fetch_and_process_feed:184 - ⚠️ Keine Einträge in Feed gefunden: https://www.google.de/alerts/feeds/03077836356662926441/4770194054838089856 +2025-08-28 10:29:59,649 - INFO - fetch_and_process_feed:174 - 🔄 Verarbeite Feed: https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-28 10:30:00,140 - INFO - fetch_and_process_feed:181 - 📡 Feed-Name: Google Alert - Camping Messe 2025 +2025-08-28 10:30:00,141 - INFO - fetch_and_process_feed:187 - 📰 4 Einträge gefunden +2025-08-28 10:30:00,142 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Rendsburger Herbst 2025: Das müssen Besucher zum Stadtfest wissen - SHZ +2025-08-28 10:30:00,142 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/rendsburg/artikel/rendsburger-herbst-2025-das-muessen-besucher-zum-stadtfest-wissen-49189798&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3Q0vDLWiKVxjzAHNaBAL9Q (Versuch 1) +2025-08-28 10:30:00,258 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:30:00,260 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:30:00,260 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:30:00,260 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/rendsburg/artikel/rendsburger-herbst-2025-das-muessen-besucher-zum-stadtfest-wissen-49189798&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3Q0vDLWiKVxjzAHNaBAL9Q +2025-08-28 10:30:00,264 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/rendsburg/artikel/rendsburger-herbst-2025-das-muessen-besucher-zum-stadtfest-wissen-49189798&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3Q0vDLWiKVxjzAHNaBAL9Q +2025-08-28 10:30:00,586 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:30:00,586 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.shz.de/lokales/rendsburg/artikel/rendsburger-herbst-2025-das-muessen-besucher-zum-stadtfest-wissen-49189798&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw3Q0vDLWiKVxjzAHNaBAL9Q +2025-08-28 10:30:00,587 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Rendsburger Herbst 2025: Das müssen Besucher zum Stadtfest wissen - SHZ' extrahiert +2025-08-28 10:30:00,587 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Rendsburger Herbst 2025: Das müssen Besucher zum Stadtfest wissen - SHZ +2025-08-28 10:30:00,589 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Messebesuch planen: Das sind die besten Tage für einen Besuch auf dem Caravan Salon 2025 +2025-08-28 10:30:00,589 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/weitere-ratgeber/messebesuch-planen-caravan-salon-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1GqhXPxrlBChDZ5bo-u9xR (Versuch 1) +2025-08-28 10:30:00,717 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:30:00,718 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:30:00,718 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:30:00,718 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/weitere-ratgeber/messebesuch-planen-caravan-salon-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1GqhXPxrlBChDZ5bo-u9xR +2025-08-28 10:30:00,722 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/weitere-ratgeber/messebesuch-planen-caravan-salon-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1GqhXPxrlBChDZ5bo-u9xR +2025-08-28 10:30:00,842 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:30:00,842 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/weitere-ratgeber/messebesuch-planen-caravan-salon-2025/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw1GqhXPxrlBChDZ5bo-u9xR +2025-08-28 10:30:00,843 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Messebesuch planen: Das sind die besten Tage für einen Besuch auf dem Caravan Salon 2025' extrahiert +2025-08-28 10:30:00,843 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Messebesuch planen: Das sind die besten Tage für einen Besuch auf dem Caravan Salon 2025 +2025-08-28 10:30:00,843 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Caravan Salon: Dieser Fiat 616N Retro-Umbau wird der Hingucker der Messe! - Promobil +2025-08-28 10:30:00,844 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/neuheiten/caravan-salon-dieser-fiat-616n-retro-umbau-wird-der-hingucker-der-messe/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw05o4wpeT1ZYzAngJCJ5rbe (Versuch 1) +2025-08-28 10:30:00,960 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:30:00,961 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:30:00,961 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:30:00,961 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/neuheiten/caravan-salon-dieser-fiat-616n-retro-umbau-wird-der-hingucker-der-messe/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw05o4wpeT1ZYzAngJCJ5rbe +2025-08-28 10:30:00,963 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/neuheiten/caravan-salon-dieser-fiat-616n-retro-umbau-wird-der-hingucker-der-messe/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw05o4wpeT1ZYzAngJCJ5rbe +2025-08-28 10:30:01,076 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:30:01,076 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.promobil.de/neuheiten/caravan-salon-dieser-fiat-616n-retro-umbau-wird-der-hingucker-der-messe/&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw05o4wpeT1ZYzAngJCJ5rbe +2025-08-28 10:30:01,077 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Caravan Salon: Dieser Fiat 616N Retro-Umbau wird der Hingucker der Messe! - Promobil' extrahiert +2025-08-28 10:30:01,077 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Caravan Salon: Dieser Fiat 616N Retro-Umbau wird der Hingucker der Messe! - Promobil +2025-08-28 10:30:01,078 - INFO - fetch_and_process_feed:211 - 🔍 Kurzer Artikel erkannt, versuche Volltext-Extraktion: Welche Aktien von Luxusmarken sollten Anleger im Blick behalten? - Shots Magazin +2025-08-28 10:30:01,078 - INFO - extract_full_article:214 - 📰 Starte Volltextextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.shots.media/accessoires/2025/welche-aktien-von-luxusmarken-sollten-anleger-im-blick-behalten/109756&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0qlDEuhncZhWTz-dL6IaNA (Versuch 1) +2025-08-28 10:30:01,192 - INFO - extract_full_article:253 - 🔄 Fallback auf generische Selektoren +2025-08-28 10:30:01,193 - INFO - extract_full_article:262 - 🔄 Fallback auf Paragraph-Extraktion +2025-08-28 10:30:01,193 - INFO - extract_full_article:271 - 🔄 Letzter Fallback: Body-Text +2025-08-28 10:30:01,193 - WARNING - extract_full_article:286 - ⚠️ Keine verwertbaren Inhalte gefunden bei: https://www.google.com/url?rct=j&sa=t&url=https://www.shots.media/accessoires/2025/welche-aktien-von-luxusmarken-sollten-anleger-im-blick-behalten/109756&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0qlDEuhncZhWTz-dL6IaNA +2025-08-28 10:30:01,197 - INFO - extract_images_with_metadata:149 - 🖼️ Starte Bildextraktion von: https://www.google.com/url?rct=j&sa=t&url=https://www.shots.media/accessoires/2025/welche-aktien-von-luxusmarken-sollten-anleger-im-blick-behalten/109756&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0qlDEuhncZhWTz-dL6IaNA +2025-08-28 10:30:01,317 - INFO - extract_images_with_metadata:167 - 🔍 0 img-Tags gefunden +2025-08-28 10:30:01,317 - INFO - extract_images_with_metadata:193 - 🎉 0 Bilder erfolgreich extrahiert von https://www.google.com/url?rct=j&sa=t&url=https://www.shots.media/accessoires/2025/welche-aktien-von-luxusmarken-sollten-anleger-im-blick-behalten/109756&ct=ga&cd=CAIyHGQ1NmVhN2MxY2QzZWYxMTk6Y29tOmRlOkRFOlI&usg=AOvVaw0qlDEuhncZhWTz-dL6IaNA +2025-08-28 10:30:01,318 - INFO - fetch_and_process_feed:244 - 🖼️ 0 Bilder für 'Welche Aktien von Luxusmarken sollten Anleger im Blick behalten? - Shots Magazin' extrahiert +2025-08-28 10:30:01,318 - INFO - fetch_and_process_feed:249 - ✅ Neuer Artikel hinzugefügt: Welche Aktien von Luxusmarken sollten Anleger im Blick behalten? - Shots Magazin +2025-08-28 10:30:01,318 - INFO - fetch_and_process_feed:257 - ✅ Feed verarbeitet: 4 neue Artikel aus https://www.google.com/alerts/feeds/03077836356662926441/14685692393152596493 +2025-08-28 10:30:02,356 - INFO - save_articles:144 - ✅ 224 Artikel gespeichert +2025-08-28 10:30:02,356 - INFO - process_articles:310 - 🎉 Verarbeitung abgeschlossen: 39 neue Artikel in 29.97s hinzugefügt +2025-08-28 10:30:03,456 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:30:03,456 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:12,296 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:12,298 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:13,576 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:13,576 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:20,386 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:20,387 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:22,120 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:22,120 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:27,345 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:27,346 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:28,958 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:28,959 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:33,721 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:33,722 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:36,114 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:36,115 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:39,562 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:39,563 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:40,876 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:40,877 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:44,570 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:44,570 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:46,515 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:46,517 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:50,319 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:50,320 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:52,966 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:52,967 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:57,467 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:57,467 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:35:59,614 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:35:59,616 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:11,950 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:11,951 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:13,814 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:13,815 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:17,157 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:17,158 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:19,306 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:19,307 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:21,111 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:21,113 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:27,203 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:27,204 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:28,972 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:28,973 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:33,986 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:33,987 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:39,183 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:39,184 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:40,573 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:40,574 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:43,714 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:43,715 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:46,366 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:46,367 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:52,515 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:52,515 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:54,023 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:54,024 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:57,434 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:57,434 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:36:58,589 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:36:58,589 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:01,539 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:01,539 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:03,255 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:03,256 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:08,336 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:08,336 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:09,444 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:09,445 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:12,883 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:12,884 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:14,208 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:14,208 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:17,651 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:17,652 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:26,215 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:26,216 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:28,351 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:28,351 - INFO - load_feeds:93 - ✅ 10 Feeds geladen +2025-08-28 10:37:28,369 - INFO - save_articles:144 - ✅ 224 Artikel gespeichert +2025-08-28 10:37:28,410 - INFO - load_articles:124 - ✅ 224 Artikel geladen +2025-08-28 10:37:28,410 - INFO - load_feeds:93 - ✅ 10 Feeds geladen diff --git a/utils/config.py b/utils/config.py new file mode 100644 index 0000000..fa7f655 --- /dev/null +++ b/utils/config.py @@ -0,0 +1,51 @@ +import os +from typing import Dict, List +from dotenv import load_dotenv + +load_dotenv() + + +def validate_env() -> Dict: + """Validiert sicherheitsrelevante .env-Variablen. + + Returns dict with: ok: bool, errors: List[str], warnings: List[str], summary: Dict[str, bool] + """ + errors: List[str] = [] + warnings: List[str] = [] + + wp_base_url = os.getenv("WP_BASE_URL", "").strip() + wp_user = os.getenv("WP_USERNAME", "").strip() + wp_pass = os.getenv("WP_PASSWORD", "").strip() + wp_b64 = os.getenv("WP_AUTH_BASE64", "").strip() + openai_key = os.getenv("OPENAI_API_KEY", "").strip() + + # WP_BASE_URL Pflicht + if not wp_base_url: + errors.append("WP_BASE_URL fehlt in .env") + elif not (wp_base_url.startswith("http://") or wp_base_url.startswith("https://")): + errors.append("WP_BASE_URL muss mit http:// oder https:// beginnen") + + # Auth-Creds: entweder Base64 ODER Username+Password + if not wp_b64 and not (wp_user and wp_pass): + errors.append("Entweder WP_AUTH_BASE64 oder WP_USERNAME + WP_PASSWORD in .env setzen") + + # Empfehlungen + if not wp_b64 and (wp_user and wp_pass): + warnings.append("WP_AUTH_BASE64 nicht gesetzt – Empfehlung: Base64 nutzen (Application Password)") + + if not openai_key: + warnings.append("OPENAI_API_KEY ist nicht gesetzt – Umschreibungsfunktion ist deaktiviert") + + summary = { + "WP_BASE_URL": bool(wp_base_url), + "WP_USERNAME": bool(wp_user), + "WP_PASSWORD": bool(wp_pass), + "WP_AUTH_BASE64": bool(wp_b64), + "OPENAI_API_KEY": bool(openai_key), + } + + return {"ok": len(errors) == 0, "errors": errors, "warnings": warnings, "summary": summary} + + +__all__ = ["validate_env"] + diff --git a/utils/wordpress_uploader.py b/utils/wordpress_uploader.py index 85b016d..5f7da6a 100644 --- a/utils/wordpress_uploader.py +++ b/utils/wordpress_uploader.py @@ -11,17 +11,16 @@ from dotenv import load_dotenv load_dotenv() -# WordPress API Konfiguration -WP_BASE_URL = os.getenv("WP_BASE_URL", "https://vanityontour.de") -WP_USERNAME = os.getenv("WP_USERNAME", "ogiertz") -WP_PASSWORD = os.getenv("WP_PASSWORD", "whNEx9aZCIUXViV89Z3e7Z03") -WP_AUTH_BASE64 = os.getenv("WP_AUTH_BASE64", "b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM=") -WP_API_ENDPOINT = f"{WP_BASE_URL}/wp-json/wp/v2" +# WordPress API Konfiguration – ausschließlich aus .env +WP_BASE_URL = os.getenv("WP_BASE_URL") +WP_USERNAME = os.getenv("WP_USERNAME") +WP_PASSWORD = os.getenv("WP_PASSWORD") +WP_AUTH_BASE64 = os.getenv("WP_AUTH_BASE64") # Request-Konfiguration REQUEST_TIMEOUT = 30 MAX_RETRIES = 3 -USER_AGENT = 'RSS-Feed-Manager/1.6.1' +USER_AGENT = 'RSS-Feed-Manager/1.7.x' class WordPressUploader: """ @@ -30,41 +29,43 @@ class WordPressUploader: """ def __init__(self): - self.base_url = WP_BASE_URL - self.api_endpoint = WP_API_ENDPOINT + # Basis-URL validieren und Endpunkt bauen + if not WP_BASE_URL: + raise ValueError("WP_BASE_URL nicht gesetzt. Bitte .env konfigurieren.") + self.base_url = WP_BASE_URL.rstrip('/') + self.api_endpoint = f"{self.base_url}/wp-json/wp/v2" + + # Zugangsdaten (aus .env) self.username = WP_USERNAME self.password = WP_PASSWORD self.auth_base64 = WP_AUTH_BASE64 - + + if not self.auth_base64 and not (self.username and self.password): + raise ValueError("WordPress-Authentifizierung nicht konfiguriert. WP_AUTH_BASE64 oder WP_USERNAME + WP_PASSWORD setzen.") + # Session für bessere Performance self.session = requests.Session() - + # Authentifizierung über Authorization Header mit Base64 if self.auth_base64: - # Verwende bereitgestellten Base64-String self.session.headers.update({ 'Authorization': f'Basic {self.auth_base64}', 'User-Agent': USER_AGENT, 'Content-Type': 'application/json', 'Accept': 'application/json' }) - logging.info("✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String") + logging.info("✅ WordPress-Authentifizierung: Base64-String verwendet") else: - # Fallback: Generiere Base64 aus Username/Password - if self.username and self.password: - credentials = f"{self.username}:{self.password}" - encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8') - self.session.headers.update({ - 'Authorization': f'Basic {encoded_credentials}', - 'User-Agent': USER_AGENT, - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }) - logging.info("✅ WordPress-Authentifizierung: Base64 aus Username/Password generiert") - else: - logging.error("❌ WordPress-Authentifizierung: Weder Base64-String noch Username/Password verfügbar") - raise ValueError("WordPress-Authentifizierung nicht konfiguriert") - + credentials = f"{self.username}:{self.password}" + encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8') + self.session.headers.update({ + 'Authorization': f'Basic {encoded_credentials}', + 'User-Agent': USER_AGENT, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }) + logging.info("✅ WordPress-Authentifizierung: Base64 aus Username/Password generiert") + # Standard-Kategorie ID ermitteln self.default_category_id = self._get_default_category_id() @@ -335,11 +336,7 @@ class WordPressUploader: Testet die Verbindung zur WordPress API mit Base64-Authentifizierung """ try: - logging.info("🔧 Teste WordPress-API-Verbindung mit Base64-Auth...") - - # Debug: Auth-Header prüfen - auth_header = self.session.headers.get('Authorization', 'Nicht gesetzt') - logging.info(f"🔑 Authorization Header: {auth_header[:20]}..." if len(auth_header) > 20 else f"🔑 Authorization Header: {auth_header}") + logging.info("🔧 Teste WordPress-API-Verbindung...") # Einfache Abfrage der Kategorien als Test response = self.session.get( @@ -349,7 +346,6 @@ class WordPressUploader: ) logging.info(f"📡 API-Response Status: {response.status_code}") - logging.info(f"📡 API-Response Headers: {dict(response.headers)}") if response.status_code == 200: logging.info("✅ WordPress-API-Verbindung erfolgreich") @@ -465,4 +461,4 @@ def upload_single_article_to_wordpress(article: Dict) -> Tuple[bool, str, Option return False, connection_msg, None # Artikel hochladen - return uploader.upload_article(article) \ No newline at end of file + return uploader.upload_article(article) From 2c331d683b6e5a241c6b4d6d6e54f68846fd6caf Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 09:46:44 +0100 Subject: [PATCH 34/87] feat: rebuild rss-news backend, admin ui, and legal extraction pipeline --- .github/workflows/deploy.yml | 6 + .github/workflows/test.yml | 39 +++ CHANGELOG.md | 38 ++- README.md | 114 +++---- backend/.env.example | 10 + backend/README.md | 82 +++++ backend/__init__.py | 1 + backend/app/__init__.py | 1 + backend/app/admin_ui.py | 265 +++++++++++++++ backend/app/auth.py | 31 ++ backend/app/config.py | 29 ++ backend/app/db.py | 138 ++++++++ backend/app/ingestion.py | 253 ++++++++++++++ backend/app/main.py | 404 +++++++++++++++++++++++ backend/app/policy.py | 35 ++ backend/app/repositories.py | 416 ++++++++++++++++++++++++ backend/app/source_extraction.py | 257 +++++++++++++++ backend/data/rss_news.db | Bin 0 -> 94208 bytes backend/requirements-test.txt | 3 + backend/requirements.txt | 8 + backend/static/admin.css | 189 +++++++++++ backend/templates/admin_dashboard.html | 235 +++++++++++++ backend/templates/admin_login.html | 27 ++ backend/tests/__init__.py | 1 + backend/tests/test_admin_ui.py | 65 ++++ backend/tests/test_api_auth.py | 77 +++++ backend/tests/test_article_workflow.py | 95 ++++++ backend/tests/test_db_repositories.py | 119 +++++++ backend/tests/test_ingestion.py | 122 +++++++ backend/tests/test_source_extraction.py | 69 ++++ docs/PROJECT_PLAN.md | 67 ++++ docs/SOURCE_POLICY.md | 81 +++++ docs/TODO.md | 33 ++ docs/wiki/Architektur.md | 29 ++ docs/wiki/Deployment.md | 20 ++ docs/wiki/Home.md | 19 ++ docs/wiki/Operations-Runbook.md | 23 ++ docs/wiki/Project-Board.md | 28 ++ docs/wiki/Recht-Quellen.md | 35 ++ docs/wiki/Roadmap.md | 19 ++ docs/wiki/Security-Auth.md | 16 + pytest.ini | 4 + scripts/smoke_backend.sh | 33 ++ 43 files changed, 3463 insertions(+), 73 deletions(-) create mode 100644 .github/workflows/test.yml create mode 100644 backend/.env.example create mode 100644 backend/README.md create mode 100644 backend/__init__.py create mode 100644 backend/app/__init__.py create mode 100644 backend/app/admin_ui.py create mode 100644 backend/app/auth.py create mode 100644 backend/app/config.py create mode 100644 backend/app/db.py create mode 100644 backend/app/ingestion.py create mode 100644 backend/app/main.py create mode 100644 backend/app/policy.py create mode 100644 backend/app/repositories.py create mode 100644 backend/app/source_extraction.py create mode 100644 backend/data/rss_news.db create mode 100644 backend/requirements-test.txt create mode 100644 backend/requirements.txt create mode 100644 backend/static/admin.css create mode 100644 backend/templates/admin_dashboard.html create mode 100644 backend/templates/admin_login.html create mode 100644 backend/tests/__init__.py create mode 100644 backend/tests/test_admin_ui.py create mode 100644 backend/tests/test_api_auth.py create mode 100644 backend/tests/test_article_workflow.py create mode 100644 backend/tests/test_db_repositories.py create mode 100644 backend/tests/test_ingestion.py create mode 100644 backend/tests/test_source_extraction.py create mode 100644 docs/PROJECT_PLAN.md create mode 100644 docs/SOURCE_POLICY.md create mode 100644 docs/TODO.md create mode 100644 docs/wiki/Architektur.md create mode 100644 docs/wiki/Deployment.md create mode 100644 docs/wiki/Home.md create mode 100644 docs/wiki/Operations-Runbook.md create mode 100644 docs/wiki/Project-Board.md create mode 100644 docs/wiki/Recht-Quellen.md create mode 100644 docs/wiki/Roadmap.md create mode 100644 docs/wiki/Security-Auth.md create mode 100644 pytest.ini create mode 100755 scripts/smoke_backend.sh diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5d55808..4ac1c42 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -19,9 +19,15 @@ jobs: username: oliver key: ${{ secrets.HETZNER_SSH_KEY }} port: 22 + envs: APP_ADMIN_USERNAME,APP_ADMIN_PASSWORD script: | cd rss-news git pull origin main source .venv/bin/activate pip install -r requirements.txt + pip install -r backend/requirements.txt || true sudo systemctl restart rss-app + BASE_URL="https://news.vanityontour.de" APP_ADMIN_USERNAME="${APP_ADMIN_USERNAME}" APP_ADMIN_PASSWORD="${APP_ADMIN_PASSWORD}" bash scripts/smoke_backend.sh + env: + APP_ADMIN_USERNAME: ${{ secrets.NEWS_APP_ADMIN_USERNAME }} + APP_ADMIN_PASSWORD: ${{ secrets.NEWS_APP_ADMIN_PASSWORD }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..1d627db --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,39 @@ +name: Backend Tests + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + backend-tests: + runs-on: ubuntu-latest + timeout-minutes: 15 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r backend/requirements.txt + pip install -r backend/requirements-test.txt + + - name: Run tests with coverage + env: + APP_DB_PATH: /tmp/rss_news_test.db + run: | + pytest backend/tests --cov=backend/app --cov-report=term-missing --cov-report=xml + + - name: Upload coverage artifact + uses: actions/upload-artifact@v4 + with: + name: coverage-xml + path: coverage.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index fa80967..66b7237 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,42 @@ -## [1.7.1] - 2025-08-28 +## [1.7.1] - 2025-08-24 -- Beschreibung... +### ✨ Security angepasst + - alle Credentials in die .env Datei verschoben + - beim Start der App werden die Credentials geprüft und beim fehlen entsprechende Meldungen ausgegeben + +--- ## [1.7.0] - 2025-08-24 -- Beschreibung... +### Multi-Select & Massenoperationen: + - ✅ Checkboxes für Artikel-Auswahl im "Artikel verwalten" Bereich + - ✅ "Alle auswählen" / "Auswahl aufheben" Buttons + - ✅ Massenoperationen für ausgewählte Artikel: + - Bulk Status-Änderung für mehrere Artikel gleichzeitig + - Bulk Artikel-Umschreibung mit automatischer Status-Verwaltung + - Bulk WordPress-Upload nur für "Process"-Artikel + - Bulk Papierkorb-Funktion + +### Schnellaktionen Integration: + - ✅ Feed-Aktualisierung direkt im Artikel-Tab verfügbar + - ✅ Alle Dashboard-Schnellaktionen in Artikel-Verwaltung integriert + - ✅ Intelligente Anzeige nur relevanter Operationen (z.B. WordPress-Upload nur bei Process-Artikeln) + +### 🔧 Verbesserungen + + - UI/UX: Verbesserte Artikel-Card-Layouts mit Checkbox-Integration + - Workflow: Streamlined Artikel-Management ohne Tab-Wechsel nötig + - Feedback: Detaillierte Statusmeldungen bei Massenoperationen + - Performance: Optimierte Session-State-Verwaltung für Artikel-Auswahl + +### 🏗️ Technische Änderungen + + - Session State Erweiterung um selected_articles Set + - Neue Bulk-Operation-Funktionen in app.py:326-467 + - Überarbeitetes Artikel-Card-Layout mit 3-Spalten-Design + - Integration bestehender WordPress-Upload und Rewrite-Funktionen + +--- ## [1.6.3] - 2025-08-18 diff --git a/README.md b/README.md index 6846a41..b3c2b4a 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,63 @@ -# 📰 RSS News Bot +# rss-news (Rebuild) -Ein intelligentes Tool zum Einlesen, Umschreiben und Veröffentlichen von Artikeln aus RSS-Feeds – mit automatischer Tag-Erkennung, KI-unterstütztem Rewrite via GPT-4, Bildextraktion aus Originalartikeln und optionaler DALL·E-Bildgenerierung. +`rss-news` wird als bestehendes Repository weitergefuehrt und schrittweise zu einer robusten, rechtssicheren News-Pipeline neu aufgebaut. -![Version](https://img.shields.io/badge/version-1.5.2-blue) -![License](https://img.shields.io/badge/license-MIT-green) -![Python](https://img.shields.io/badge/python-3.10+-yellow) -![Streamlit](https://img.shields.io/badge/built%20with-Streamlit-ff4b4b) +Aktueller Stand: +- Alte Streamlit-App wird nicht produktiv genutzt. +- `news.vanityontour.de` wird bis zum Go-Live der neuen App auf `https://vanityontour.de` umgeleitet. +- Planung, Doku und Wiki werden als Grundlage fuer den Neuaufbau gepflegt. ---- +## Ziele +- RSS-gestuetzte Artikelverarbeitung mit klaren Quellregeln +- Rechtssichere Nutzung (Quellen, Attribution, Lizenzinformationen) +- Zuverlaessige Automatisierung auf Hetzner +- Publikation nach WordPress (IONOS aktuell, spaeter offen) +- Zugriff nur nach Login (zunaechst User/Password) -## 🚀 Features +## Architektur-Richtung (MVP) +- Backend: `Python + FastAPI` +- Jobs: Queue-Worker (z. B. Redis + RQ/Celery) +- Daten: SQLite fuer MVP, spaeter optional PostgreSQL +- Auth: Session-Login mit einem Admin-User +- Publishing: WordPress REST API (Status zunaechst `pending`) -- 📡 **RSS-Feeds verwalten** (hinzufügen, aktualisieren) -- ✍️ **Artikel automatisch umschreiben** mit GPT-4 -- 🏷️ **Tags automatisch generieren** -- 🖼️ **Bilder aus Originalartikeln extrahieren** -- 🪄 **Optionales DALL·E-Bild generieren** -- 🔧 **Bearbeiten von Bildmetadaten** -- 🗂️ **Statusverwaltung der Artikel (New, Rewrite, Process, etc.)** -- 📜 **Log-Viewer-Seite integriert** -- 📥 **Export zur Veröffentlichung auf WordPress vorbereitet** -- 📋 Artikeltabelle mit Status-Filter -- 🔍 Artikel-Expander mit Rewrite, Tags & Bildern -- 🪄 Button für KI-Bildgenerierung +Details: `docs/PROJECT_PLAN.md` +## Projektsteuerung +- GitHub Project: `https://github.com/users/OliverGiertz/projects/3/views/1` +- Dieses Board ist die zentrale Steuerung fuer ToDos, Bugs, Verbesserungen. +- Wiki-Struktur liegt unter `docs/wiki/`. ---- +## Dokumentation +- Projektplan: `docs/PROJECT_PLAN.md` +- ToDo-Liste: `docs/TODO.md` +- Quell- und Lizenzpolicy: `docs/SOURCE_POLICY.md` +- Wiki Home: `docs/wiki/Home.md` -## 🧱 Projektstruktur - -ss-news/ -├── app.py # Haupt-UI mit Streamlit -├── main.py # Logik für Feed-Import und Verarbeitung -├── utils/ -│ └── image_extractor.py # Bilder aus Originalartikeln extrahieren -│ └── dalle_generator.py # DALL·E-Integration (KI-Bild) -├── pages/ -│ └── log_viewer.py # UI zur Anzeige der Logs -├── data/ -│ └── articles.json # Gespeicherte Artikel -│ └── feeds.json # Gespeicherte Feed-URLs -├── logs/ -│ └── rss_tool.log # Logging der Verarbeitung -├── versioning.py # CLI-Tool zur Versionierung & Release -├── TEST-CHECKLIST.md # Manuelle Prüfliste für Releases -├── version.py # Aktuelle Version -└── CHANGELOG.md # Änderungsprotokoll - - ---- - -## ⚙️ Installation +## Lokale Entwicklung (Legacy-Code) +Der vorhandene Legacy-Stand kann weiterhin lokal gestartet werden: ```bash -git clone https://github.com/OliverGiertz/rss-news.git -cd rss-news python -m venv .venv source .venv/bin/activate pip install -r requirements.txt -``` - ---- - -## Update -Ein Update Script findest du hier: https://gist.github.com/OliverGiertz/ad33ae3de9aa1c1163dad5fe8affb6ca - -```bash -bash update.sh -``` - - -## ▶️ Starten der App - streamlit run app.py +``` ---- +Hinweis: Diese App ist funktional historisch und wird durch die neue Architektur ersetzt. -## 🔐 Konfiguration (.env) +## Deployment-Zielbild +- Betrieb auf Hetzner +- Reverse Proxy via CloudPanel/Nginx +- Produktive Domain: `news.vanityontour.de` +- Bis zur Fertigstellung: Redirect auf `https://vanityontour.de` -Lege eine `.env` im Projekt an (siehe `.env.example`). Erforderliche Variablen: +## Sicherheit +- Keine Secrets im Repository +- `.env` lokal/auf Server, nie committen +- Auth-Pflicht fuer die neue WebApp +- spaeter optional: Passkeys/WebAuthn -- `WP_BASE_URL`: Basis-URL deiner WordPress-Seite (z. B. https://example.com) -- Authentifizierung (eine Option wählen): - - `WP_AUTH_BASE64`: Bevorzugt. Base64 von `username:application_password` - - oder `WP_USERNAME` und `WP_PASSWORD`: Benutzer + Anwendungspasswort -- Optional: `OPENAI_API_KEY` für das Umschreiben von Artikeln +## Rechtlicher Hinweis +Dieses Projekt verarbeitet nur Quellen mit dokumentierter Nutzungsgrundlage. Vor produktiver Nutzung ist eine finale rechtliche Pruefung der ausgewaehlten Feeds notwendig. -Hinweis: Der Code liest ausschließlich aus `.env`. Es gibt keine hartkodierten Standard-Credentials. diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..74e9c4b --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,10 @@ +APP_ENV=development +APP_NAME=rss-news-backend +APP_SECRET_KEY=replace-with-a-long-random-secret +APP_DB_PATH=backend/data/rss_news.db + +APP_ADMIN_USERNAME=admin +APP_ADMIN_PASSWORD=change-me + +SESSION_COOKIE_NAME=rss_news_session +SESSION_MAX_AGE_SECONDS=28800 diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..7d64a65 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,82 @@ +# Backend Skeleton (FastAPI) + +Dieses Verzeichnis enthaelt das technische Grundgeruest fuer den Rebuild von `rss-news`. + +## Start (lokal) + +```bash +python -m venv .venv +source .venv/bin/activate +pip install -r backend/requirements.txt +uvicorn backend.app.main:app --reload --port 8501 +``` + +## Admin UI +- Login: `http://127.0.0.1:8501/admin/login` +- Dashboard: `http://127.0.0.1:8501/admin/dashboard` + +## Environment +- Datei: `backend/.env` +- Vorlage: `backend/.env.example` + +## Endpoints +- `GET /health` - Healthcheck +- `POST /auth/login` - Login mit Admin-User +- `POST /auth/logout` - Logout +- `GET /auth/me` - Aktiver User +- `GET /api/protected` - Geschuetzter Test-Endpoint +- `GET /api/pipeline/status` - Basisstatus inkl. Datensatzzaehler +- `GET /api/sources` - Quellenliste +- `POST /api/sources` - Quelle anlegen +- `GET /api/sources/{source_id}/policy-check` - Policy-Pruefung fuer Quelle +- `GET /api/feeds` - Feedliste +- `POST /api/feeds` - Feed anlegen +- `GET /api/feeds/{feed_id}/policy-check` - Policy-Pruefung fuer Feed +- `GET /api/runs` - Import-/Job-Runs anzeigen +- `GET /api/runs/{run_id}` - Detailansicht eines Runs +- `POST /api/runs` - Run starten +- `POST /api/runs/{run_id}/finish` - Run abschliessen +- `GET /api/articles` - Artikel anzeigen +- `GET /api/articles/{article_id}` - Artikeldetail +- `POST /api/articles/upsert` - Artikel idempotent anlegen/aktualisieren +- `POST /api/articles/{article_id}/transition` - Statuswechsel nach Workflow-Regeln +- `POST /api/articles/{article_id}/review` - Review-Entscheidung (approve/reject) +- `POST /api/ingestion/run` - Feed-Ingestion starten (optional pro Feed) + +## Datenbank +- SQLite-Datei unter `backend/data/rss_news.db` +- Tabellen werden beim App-Start initialisiert. +- Tabellen: `sources`, `feeds`, `runs`, `articles` +- Dedupe-Strategie Artikel: `source_url` -> `(feed_id, source_article_id)` -> `source_hash` + +## Policy-Enforcement +- Ingestion blockiert Feeds automatisch, wenn die zugeordnete Quelle nicht policy-konform ist. +- Mindestanforderungen: `risk_level=green`, `terms_url`, `license_name`, `last_reviewed_at`, `is_enabled=1`. +- Pro importiertem Artikel wird ein `attribution`-Block in `meta_json` gespeichert. + +## Review-Workflow +- Statuskette: `new -> review -> approved -> published` +- Ablehnung im Review setzt auf `rewrite` +- Ungueltige Statuswechsel werden per API blockiert + +## Verifikation +```bash +python -m unittest backend.tests.test_db_repositories +python -m unittest backend.tests.test_ingestion +python -m unittest backend.tests.test_api_auth +``` + +## CI / Online-Auswertung +- GitHub Actions Workflow: `.github/workflows/test.yml` +- Fuehrt Tests inkl. Coverage auf Push/PR gegen `main` aus. + +## Hetzner Smoketest +```bash +BASE_URL="https://news.vanityontour.de" \ +APP_ADMIN_USERNAME="admin" \ +APP_ADMIN_PASSWORD="..." \ +bash scripts/smoke_backend.sh +``` + +## Hinweis +Passwort-Hashing und CSRF/Rate-Limit sind als naechste Ausbaustufe vorgesehen. diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000..3623851 --- /dev/null +++ b/backend/__init__.py @@ -0,0 +1 @@ +"""Backend package for rss-news rebuild.""" diff --git a/backend/app/__init__.py b/backend/app/__init__.py new file mode 100644 index 0000000..18b665e --- /dev/null +++ b/backend/app/__init__.py @@ -0,0 +1 @@ +"""Application package.""" diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py new file mode 100644 index 0000000..9587664 --- /dev/null +++ b/backend/app/admin_ui.py @@ -0,0 +1,265 @@ +from __future__ import annotations + +import json +from pathlib import Path +from urllib.parse import urlencode + +from fastapi import APIRouter, Form, Request +from fastapi.responses import HTMLResponse, RedirectResponse +from fastapi.templating import Jinja2Templates + +from .auth import create_session_token, verify_credentials, verify_session_token +from .config import get_settings +from .ingestion import run_ingestion +from .policy import evaluate_source_policy +from .repositories import ( + FeedCreate, + SourceCreate, + create_feed, + create_source, + get_article_by_id, + list_articles, + list_feeds, + list_runs, + list_sources, + update_article_status, +) + +settings = get_settings() +router = APIRouter(tags=["admin-ui"]) +templates = Jinja2Templates(directory=str(Path(__file__).resolve().parent.parent / "templates")) +ALLOWED_TRANSITIONS: dict[str, tuple[str, ...]] = { + "new": ("review", "rewrite", "error"), + "rewrite": ("review", "error"), + "review": ("approved", "rewrite", "error"), + "approved": ("published", "error"), + "published": ("error",), + "error": ("review", "rewrite"), +} + + +def _admin_user(request: Request) -> str | None: + token = request.cookies.get(settings.session_cookie_name) + if not token: + return None + return verify_session_token(token) + + +def _to_optional_int(raw: str | None) -> int | None: + if raw is None: + return None + value = raw.strip() + if value == "": + return None + return int(value) + + +def _dashboard_redirect( + *, + msg: str | None = None, + msg_type: str = "success", + status_filter: str | None = None, +) -> RedirectResponse: + query: dict[str, str] = {} + if msg: + query["msg"] = msg + query["type"] = msg_type + if status_filter: + query["status_filter"] = status_filter + suffix = f"?{urlencode(query)}" if query else "" + return RedirectResponse(url=f"/admin/dashboard{suffix}", status_code=303) + + +def _parse_meta_json(raw: str | None) -> dict: + if not raw: + return {} + try: + parsed = json.loads(raw) + return parsed if isinstance(parsed, dict) else {} + except Exception: + return {} + + +@router.get("/admin", response_class=HTMLResponse) +def admin_index(request: Request): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + return RedirectResponse(url="/admin/dashboard", status_code=303) + + +@router.get("/admin/login", response_class=HTMLResponse) +def admin_login_page(request: Request): + return templates.TemplateResponse( + request, + "admin_login.html", + {"request": request, "title": "Admin Login", "error": request.query_params.get("error")}, + ) + + +@router.post("/admin/login") +def admin_login(request: Request, username: str = Form(...), password: str = Form(...)): + if not verify_credentials(username, password): + return RedirectResponse(url="/admin/login?error=1", status_code=303) + + token = create_session_token(username) + response = RedirectResponse(url="/admin/dashboard", status_code=303) + response.set_cookie( + key=settings.session_cookie_name, + value=token, + max_age=settings.session_max_age_seconds, + httponly=True, + secure=False, + samesite="lax", + ) + return response + + +@router.post("/admin/logout") +def admin_logout(): + response = RedirectResponse(url="/admin/login", status_code=303) + response.delete_cookie(settings.session_cookie_name) + return response + + +@router.get("/admin/dashboard", response_class=HTMLResponse) +def admin_dashboard(request: Request): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + sources = list_sources() + source_policy = {s["id"]: evaluate_source_policy(s) for s in sources} + feeds = list_feeds() + runs = list_runs(limit=30) + status_filter = request.query_params.get("status_filter") + if status_filter in {"new", "rewrite", "review", "approved", "published", "error"}: + articles = list_articles(limit=100, status_filter=status_filter) + else: + status_filter = "" + articles = list_articles(limit=100) + for article in articles: + meta = _parse_meta_json(article.get("meta_json")) + extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} + article["meta"] = meta + article["extracted_images"] = extraction.get("images") if isinstance(extraction.get("images"), list) else [] + article["press_contact"] = extraction.get("press_contact") if isinstance(extraction.get("press_contact"), str) else None + article["extraction_error"] = extraction.get("extraction_error") if isinstance(extraction.get("extraction_error"), str) else None + + return templates.TemplateResponse( + request, + "admin_dashboard.html", + { + "request": request, + "title": "Admin Dashboard", + "user": user, + "sources": sources, + "source_policy": source_policy, + "feeds": feeds, + "runs": runs, + "articles": articles, + "status_options": ["new", "rewrite", "review", "approved", "published", "error"], + "allowed_transitions": ALLOWED_TRANSITIONS, + "status_filter": status_filter, + "flash_msg": request.query_params.get("msg", ""), + "flash_type": request.query_params.get("type", "success"), + }, + ) + + +@router.post("/admin/sources/create") +def admin_create_source( + request: Request, + name: str = Form(...), + base_url: str = Form(""), + terms_url: str = Form(""), + license_name: str = Form(""), + risk_level: str = Form("yellow"), + last_reviewed_at: str = Form(""), +): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + try: + create_source( + SourceCreate( + name=name, + base_url=base_url or None, + terms_url=terms_url or None, + license_name=license_name or None, + risk_level=risk_level, + is_enabled=True, + notes=None, + last_reviewed_at=last_reviewed_at or None, + ) + ) + except Exception as exc: + return _dashboard_redirect(msg=f"Quelle konnte nicht gespeichert werden: {exc}", msg_type="error") + return _dashboard_redirect(msg="Quelle gespeichert") + + +@router.post("/admin/feeds/create") +def admin_create_feed( + request: Request, + name: str = Form(...), + url: str = Form(...), + source_id: str = Form(""), +): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + try: + create_feed( + FeedCreate( + name=name, + url=url, + source_id=_to_optional_int(source_id), + is_enabled=True, + ) + ) + except Exception as exc: + return _dashboard_redirect(msg=f"Feed konnte nicht gespeichert werden: {exc}", msg_type="error") + return _dashboard_redirect(msg="Feed gespeichert") + + +@router.post("/admin/ingestion/run") +def admin_run_ingestion(request: Request, feed_id: str = Form("")): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + try: + stats = run_ingestion(feed_id=_to_optional_int(feed_id)) + except Exception as exc: + return _dashboard_redirect(msg=f"Ingestion fehlgeschlagen: {exc}", msg_type="error") + return _dashboard_redirect(msg=f"Ingestion: {stats.status}, upserts={stats.articles_upserted}") + + +@router.post("/admin/articles/{article_id}/review") +def admin_review_article(request: Request, article_id: int, decision: str = Form(...), note: str = Form("")): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + article = get_article_by_id(article_id) + if article and article.get("status") == "review" and decision in {"approve", "reject"}: + target = "approved" if decision == "approve" else "rewrite" + update_article_status(article_id, target, actor=user, note=note or None, decision=decision) + return _dashboard_redirect(msg=f"Artikel #{article_id}: {decision}") + return _dashboard_redirect(msg=f"Review-Aktion ungueltig fuer Artikel #{article_id}", msg_type="error") + + +@router.post("/admin/articles/{article_id}/transition") +def admin_transition_article(request: Request, article_id: int, target_status: str = Form(...), note: str = Form("")): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + article = get_article_by_id(article_id) + if article: + current = article.get("status") + if target_status in ALLOWED_TRANSITIONS.get(current, ()): + update_article_status(article_id, target_status, actor=user, note=note or None) + return _dashboard_redirect(msg=f"Artikel #{article_id}: {current} -> {target_status}") + return _dashboard_redirect(msg=f"Ungueltiger Statuswechsel fuer Artikel #{article_id}", msg_type="error") diff --git a/backend/app/auth.py b/backend/app/auth.py new file mode 100644 index 0000000..188397f --- /dev/null +++ b/backend/app/auth.py @@ -0,0 +1,31 @@ +import hmac +from typing import Optional + +from itsdangerous import URLSafeTimedSerializer, BadSignature, SignatureExpired + +from .config import get_settings + + +def _serializer() -> URLSafeTimedSerializer: + settings = get_settings() + return URLSafeTimedSerializer(settings.app_secret_key, salt="rss-news-session") + + +def verify_credentials(username: str, password: str) -> bool: + settings = get_settings() + user_ok = hmac.compare_digest(username, settings.app_admin_username) + pw_ok = hmac.compare_digest(password, settings.app_admin_password) + return user_ok and pw_ok + + +def create_session_token(username: str) -> str: + return _serializer().dumps({"username": username}) + + +def verify_session_token(token: str) -> Optional[str]: + settings = get_settings() + try: + payload = _serializer().loads(token, max_age=settings.session_max_age_seconds) + except (BadSignature, SignatureExpired): + return None + return payload.get("username") diff --git a/backend/app/config.py b/backend/app/config.py new file mode 100644 index 0000000..f32b8c4 --- /dev/null +++ b/backend/app/config.py @@ -0,0 +1,29 @@ +from functools import lru_cache + +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class Settings(BaseSettings): + # Prefer backend-specific env file to avoid collisions with legacy root .env + model_config = SettingsConfigDict( + env_file=("backend/.env", ".env"), + env_file_encoding="utf-8", + extra="ignore", + ) + + app_env: str = "development" + app_name: str = "rss-news-backend" + app_secret_key: str = "replace-with-a-long-random-secret" + + app_admin_username: str = "admin" + app_admin_password: str = "change-me" + + session_cookie_name: str = "rss_news_session" + session_max_age_seconds: int = 28800 + + app_db_path: str = "backend/data/rss_news.db" + + +@lru_cache(maxsize=1) +def get_settings() -> Settings: + return Settings() diff --git a/backend/app/db.py b/backend/app/db.py new file mode 100644 index 0000000..c914044 --- /dev/null +++ b/backend/app/db.py @@ -0,0 +1,138 @@ +import sqlite3 +from contextlib import contextmanager +from pathlib import Path +from typing import Any, Iterator + +from .config import get_settings + + +def _db_path() -> Path: + settings = get_settings() + path = Path(settings.app_db_path) + path.parent.mkdir(parents=True, exist_ok=True) + return path + + +@contextmanager +def get_conn() -> Iterator[sqlite3.Connection]: + conn = sqlite3.connect(_db_path()) + conn.row_factory = sqlite3.Row + conn.execute("PRAGMA foreign_keys=ON;") + try: + yield conn + conn.commit() + finally: + conn.close() + + +def init_db() -> None: + with get_conn() as conn: + conn.executescript( + """ + PRAGMA journal_mode=WAL; + + CREATE TABLE IF NOT EXISTS sources ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + base_url TEXT, + terms_url TEXT, + license_name TEXT, + risk_level TEXT NOT NULL DEFAULT 'yellow' CHECK (risk_level IN ('green', 'yellow', 'red')), + is_enabled INTEGER NOT NULL DEFAULT 0, + notes TEXT, + last_reviewed_at TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + updated_at TEXT NOT NULL DEFAULT (datetime('now')) + ); + + CREATE TABLE IF NOT EXISTS feeds ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + source_id INTEGER, + name TEXT NOT NULL, + url TEXT NOT NULL UNIQUE, + is_enabled INTEGER NOT NULL DEFAULT 1, + etag TEXT, + last_modified TEXT, + last_checked_at TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + updated_at TEXT NOT NULL DEFAULT (datetime('now')), + FOREIGN KEY(source_id) REFERENCES sources(id) ON DELETE SET NULL + ); + + CREATE TABLE IF NOT EXISTS runs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + run_type TEXT NOT NULL, + status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'success', 'failed')), + started_at TEXT NOT NULL DEFAULT (datetime('now')), + finished_at TEXT, + details TEXT + ); + + CREATE TABLE IF NOT EXISTS articles ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + feed_id INTEGER, + source_article_id TEXT, + source_hash TEXT, + title TEXT NOT NULL, + source_url TEXT NOT NULL, + canonical_url TEXT, + published_at TEXT, + author TEXT, + summary TEXT, + content_raw TEXT, + content_rewritten TEXT, + word_count INTEGER DEFAULT 0, + status TEXT NOT NULL DEFAULT 'new' CHECK (status IN ('new', 'rewrite', 'review', 'approved', 'published', 'error')), + meta_json TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + updated_at TEXT NOT NULL DEFAULT (datetime('now')), + FOREIGN KEY(feed_id) REFERENCES feeds(id) ON DELETE SET NULL, + UNIQUE(source_url) + ); + + CREATE INDEX IF NOT EXISTS idx_articles_source_article_id ON articles(source_article_id); + CREATE INDEX IF NOT EXISTS idx_articles_source_hash ON articles(source_hash); + CREATE UNIQUE INDEX IF NOT EXISTS uq_articles_feed_source_article_id + ON articles(feed_id, source_article_id) + WHERE source_article_id IS NOT NULL; + CREATE UNIQUE INDEX IF NOT EXISTS uq_articles_source_hash + ON articles(source_hash) + WHERE source_hash IS NOT NULL; + CREATE INDEX IF NOT EXISTS idx_articles_status ON articles(status); + CREATE INDEX IF NOT EXISTS idx_feeds_source_id ON feeds(source_id); + CREATE INDEX IF NOT EXISTS idx_runs_started_at ON runs(started_at); + CREATE INDEX IF NOT EXISTS idx_articles_published_at ON articles(published_at); + + CREATE TRIGGER IF NOT EXISTS trg_sources_updated_at + AFTER UPDATE ON sources + FOR EACH ROW + BEGIN + UPDATE sources SET updated_at = datetime('now') WHERE id = OLD.id; + END; + + CREATE TRIGGER IF NOT EXISTS trg_feeds_updated_at + AFTER UPDATE ON feeds + FOR EACH ROW + BEGIN + UPDATE feeds SET updated_at = datetime('now') WHERE id = OLD.id; + END; + + CREATE TRIGGER IF NOT EXISTS trg_articles_updated_at + AFTER UPDATE ON articles + FOR EACH ROW + BEGIN + UPDATE articles SET updated_at = datetime('now') WHERE id = OLD.id; + END; + """ + ) + + # Lightweight migration for existing DBs created before source_hash was introduced. + existing_columns = { + row["name"] for row in conn.execute("PRAGMA table_info(articles)").fetchall() + } + if "source_hash" not in existing_columns: + conn.execute("ALTER TABLE articles ADD COLUMN source_hash TEXT") + + +def rows_to_dicts(rows: list[sqlite3.Row]) -> list[dict[str, Any]]: + return [dict(r) for r in rows] diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py new file mode 100644 index 0000000..87e44c2 --- /dev/null +++ b/backend/app/ingestion.py @@ -0,0 +1,253 @@ +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime, timezone +import hashlib +import json +import time +from typing import Any + +import feedparser + +from .policy import evaluate_source_policy +from .repositories import ( + ArticleUpsert, + RunCreate, + create_run, + finish_run, + get_feed_by_id, + list_enabled_feeds, + update_feed_fetch_state, + upsert_article, +) +from .source_extraction import extract_article, extracted_article_to_meta + + +@dataclass(frozen=True) +class IngestionStats: + run_id: int + feeds_processed: int + entries_seen: int + articles_upserted: int + status: str + message: str + + +MAX_FEED_FETCH_RETRIES = 3 + + +def _entry_published_iso(entry: dict) -> str | None: + published = entry.get("published_parsed") or entry.get("updated_parsed") + if not published: + return None + return datetime(*published[:6], tzinfo=timezone.utc).isoformat() + + +def _entry_text(entry: dict) -> tuple[str, str]: + summary = entry.get("summary", "") or "" + content = "" + if entry.get("content") and isinstance(entry.get("content"), list): + first = entry["content"][0] + content = first.get("value", "") if isinstance(first, dict) else "" + if not content: + content = summary + return summary, content + + +def _entry_hash(entry: dict, feed_id: int, link: str, title: str, summary: str) -> str: + source_id = entry.get("id") or entry.get("guid") or "" + published = _entry_published_iso(entry) or "" + fingerprint = f"{feed_id}|{source_id}|{link}|{title.strip()}|{summary.strip()}|{published}" + return hashlib.sha256(fingerprint.encode("utf-8")).hexdigest() + + +def _parsed_get(parsed: object, key: str, default: object = None) -> object: + if isinstance(parsed, dict): + return parsed.get(key, default) + return getattr(parsed, key, default) + + +def run_ingestion(feed_id: int | None = None) -> IngestionStats: + run_id = create_run(RunCreate(run_type="ingestion", status="running", details="started")) + feeds_processed = 0 + entries_seen = 0 + articles_upserted = 0 + feed_results: list[dict[str, object]] = [] + + try: + if feed_id is not None: + feed = get_feed_by_id(feed_id) + feeds = [feed] if feed and int(feed.get("is_enabled", 0)) == 1 else [] + else: + feeds = list_enabled_feeds() + + for feed in feeds: + if not feed: + continue + feeds_processed += 1 + + source_snapshot = { + "id": feed.get("source_id"), + "name": feed.get("source_name"), + "base_url": feed.get("source_base_url"), + "terms_url": feed.get("source_terms_url"), + "license_name": feed.get("source_license_name"), + "risk_level": feed.get("source_risk_level"), + "last_reviewed_at": feed.get("source_last_reviewed_at"), + "is_enabled": feed.get("source_is_enabled"), + } + policy_issues = evaluate_source_policy(source_snapshot) + if policy_issues: + feed_results.append( + { + "feed_id": int(feed["id"]), + "feed_url": feed["url"], + "status": "blocked", + "policy_issues": policy_issues, + "entries_seen": 0, + "upserts": 0, + } + ) + continue + + parsed = None + feed_error = None + for attempt in range(1, MAX_FEED_FETCH_RETRIES + 1): + try: + parsed = feedparser.parse( + feed["url"], + etag=feed.get("etag"), + modified=feed.get("last_modified"), + ) + break + except Exception as exc: + feed_error = str(exc) + if attempt < MAX_FEED_FETCH_RETRIES: + time.sleep(0.5 * attempt) + + if parsed is None: + feed_results.append( + { + "feed_id": int(feed["id"]), + "feed_url": feed["url"], + "status": "failed", + "error": feed_error or "unknown", + "entries_seen": 0, + "upserts": 0, + } + ) + continue + + # Persist ETag/Last-Modified for conditional requests. + parsed_etag = _parsed_get(parsed, "etag") + parsed_modified = _parsed_get(parsed, "modified") + if parsed_modified and not isinstance(parsed_modified, str): + parsed_modified = str(parsed_modified) + update_feed_fetch_state( + feed_id=int(feed["id"]), + etag=parsed_etag if isinstance(parsed_etag, str) else None, + last_modified=parsed_modified if isinstance(parsed_modified, str) else None, + ) + + feed_entries_seen = 0 + feed_upserts = 0 + for entry in _parsed_get(parsed, "entries", []): + entries_seen += 1 + feed_entries_seen += 1 + link = entry.get("link") + if not link: + continue + + summary, content_raw = _entry_text(entry) + title = entry.get("title") or "Ohne Titel" + extracted = extract_article(link) + + final_title = extracted.title or title + final_author = extracted.author or entry.get("author") + final_summary = extracted.summary or (summary[:1000] if summary else None) + final_content_raw = extracted.content_text or content_raw + final_canonical = extracted.canonical_url or entry.get("link") + + source_hash = _entry_hash( + entry, + int(feed["id"]), + link, + final_title, + final_summary or "", + ) + attribution = { + "source_name": feed.get("source_name"), + "source_base_url": feed.get("source_base_url"), + "source_terms_url": feed.get("source_terms_url"), + "source_license_name": feed.get("source_license_name"), + "source_risk_level": feed.get("source_risk_level"), + "original_link": link, + "feed_name": feed.get("name"), + "feed_id": int(feed["id"]), + "imported_at": datetime.now(timezone.utc).isoformat(), + } + extraction_meta: dict[str, Any] = extracted_article_to_meta(extracted) + extraction_meta["fetched_from"] = link + article_id = upsert_article( + ArticleUpsert( + feed_id=int(feed["id"]), + source_article_id=entry.get("id") or entry.get("guid"), + source_hash=source_hash, + title=final_title, + source_url=link, + canonical_url=final_canonical, + published_at=_entry_published_iso(entry), + author=final_author, + summary=final_summary, + content_raw=final_content_raw, + content_rewritten=None, + word_count=len((final_content_raw or "").split()), + status="new", + meta_json=json.dumps({"attribution": attribution, "extraction": extraction_meta}, ensure_ascii=False), + ) + ) + if article_id: + articles_upserted += 1 + feed_upserts += 1 + + feed_results.append( + { + "feed_id": int(feed["id"]), + "feed_url": feed["url"], + "status": "success", + "entries_seen": feed_entries_seen, + "upserts": feed_upserts, + } + ) + + finish_run( + run_id=run_id, + status="success", + details=json.dumps( + { + "feeds_processed": feeds_processed, + "entries_seen": entries_seen, + "upserts": articles_upserted, + "feeds": feed_results, + }, + ensure_ascii=False, + ), + ) + return IngestionStats( + run_id=run_id, + feeds_processed=feeds_processed, + entries_seen=entries_seen, + articles_upserted=articles_upserted, + status="success", + message="Ingestion abgeschlossen", + ) + except Exception as exc: + finish_run(run_id=run_id, status="failed", details=str(exc)) + return IngestionStats( + run_id=run_id, + feeds_processed=feeds_processed, + entries_seen=entries_seen, + articles_upserted=articles_upserted, + status="failed", + message=str(exc), + ) diff --git a/backend/app/main.py b/backend/app/main.py new file mode 100644 index 0000000..616dd77 --- /dev/null +++ b/backend/app/main.py @@ -0,0 +1,404 @@ +from contextlib import asynccontextmanager +from pathlib import Path + +from fastapi import Depends, FastAPI, HTTPException, Request, Response, status +from pydantic import BaseModel, Field +from fastapi.staticfiles import StaticFiles + +from .admin_ui import router as admin_router +from .auth import create_session_token, verify_credentials, verify_session_token +from .config import get_settings +from .db import init_db +from .ingestion import run_ingestion +from .policy import evaluate_source_policy, is_source_allowed +from .repositories import ( + ArticleUpsert, + FeedCreate, + RunCreate, + SourceCreate, + create_feed as repo_create_feed, + create_run, + create_source as repo_create_source, + finish_run, + get_article_by_id, + get_feed_by_id, + get_run_by_id, + get_source_by_id, + list_articles as repo_list_articles, + list_feeds as repo_list_feeds, + list_runs, + list_sources as repo_list_sources, + update_article_status, + upsert_article as repo_upsert_article, +) + +settings = get_settings() + + +@asynccontextmanager +async def app_lifespan(_: FastAPI): + init_db() + yield + + +app = FastAPI(title=settings.app_name, lifespan=app_lifespan) +app.include_router(admin_router) +app.mount( + "/admin/static", + StaticFiles(directory=str(Path(__file__).resolve().parent.parent / "static")), + name="admin-static", +) + + +class LoginRequest(BaseModel): + username: str + password: str + + +class SourceCreateRequest(BaseModel): + name: str = Field(min_length=1, max_length=200) + base_url: str | None = None + terms_url: str | None = None + license_name: str | None = None + risk_level: str = Field(default="yellow", pattern="^(green|yellow|red)$") + is_enabled: bool = False + notes: str | None = None + last_reviewed_at: str | None = None + + +class FeedCreateRequest(BaseModel): + name: str = Field(min_length=1, max_length=200) + url: str = Field(min_length=5, max_length=1000) + source_id: int | None = None + is_enabled: bool = True + + +class RunCreateRequest(BaseModel): + run_type: str = Field(min_length=2, max_length=100) + status: str = Field(default="queued", pattern="^(queued|running|success|failed)$") + details: str | None = None + + +class RunFinishRequest(BaseModel): + status: str = Field(pattern="^(success|failed)$") + details: str | None = None + + +class ArticleUpsertRequest(BaseModel): + feed_id: int | None = None + source_article_id: str | None = None + source_hash: str | None = None + title: str = Field(min_length=1, max_length=500) + source_url: str = Field(min_length=5, max_length=2000) + canonical_url: str | None = None + published_at: str | None = None + author: str | None = None + summary: str | None = None + content_raw: str | None = None + content_rewritten: str | None = None + word_count: int = 0 + status: str = Field(default="new", pattern="^(new|rewrite|review|approved|published|error)$") + meta_json: str | None = None + + +class IngestionRunRequest(BaseModel): + feed_id: int | None = None + + +class ArticleTransitionRequest(BaseModel): + target_status: str = Field(pattern="^(new|rewrite|review|approved|published|error)$") + note: str | None = None + + +class ArticleReviewRequest(BaseModel): + decision: str = Field(pattern="^(approve|reject)$") + note: str | None = None + + +ALLOWED_ARTICLE_TRANSITIONS: dict[str, set[str]] = { + "new": {"review", "rewrite", "error"}, + "rewrite": {"review", "error"}, + "review": {"approved", "rewrite", "error"}, + "approved": {"published", "error"}, + "published": {"error"}, + "error": {"review", "rewrite"}, +} + + +def require_auth(request: Request) -> str: + token = request.cookies.get(settings.session_cookie_name) + if not token: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Nicht angemeldet") + + username = verify_session_token(token) + if not username: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Session ungueltig oder abgelaufen") + + return username + + +@app.get("/health") +def health() -> dict: + return {"status": "ok", "service": settings.app_name, "db_path": settings.app_db_path} + + +@app.post("/auth/login") +def login(payload: LoginRequest, response: Response) -> dict: + if not verify_credentials(payload.username, payload.password): + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Ungueltige Zugangsdaten") + + token = create_session_token(payload.username) + response.set_cookie( + key=settings.session_cookie_name, + value=token, + max_age=settings.session_max_age_seconds, + httponly=True, + secure=False, + samesite="lax", + ) + return {"ok": True, "username": payload.username} + + +@app.post("/auth/logout") +def logout(response: Response) -> dict: + response.delete_cookie(settings.session_cookie_name) + return {"ok": True} + + +@app.get("/auth/me") +def me(username: str = Depends(require_auth)) -> dict: + return {"authenticated": True, "username": username} + + +@app.get("/api/protected") +def protected(username: str = Depends(require_auth)) -> dict: + return {"ok": True, "message": "Protected endpoint", "username": username} + + +@app.get("/api/pipeline/status") +def pipeline_status(username: str = Depends(require_auth)) -> dict: + feeds_total = len(repo_list_feeds()) + sources_total = len(repo_list_sources()) + articles_total = len(repo_list_articles(limit=500)) + return { + "ok": True, + "stage": "skeleton+db", + "requested_by": username, + "counts": { + "sources": sources_total, + "feeds": feeds_total, + "articles": articles_total, + }, + } + + +@app.get("/api/sources") +def list_sources(username: str = Depends(require_auth)) -> dict: + return {"ok": True, "items": repo_list_sources(), "requested_by": username} + + +@app.get("/api/sources/{source_id}/policy-check") +def source_policy_check(source_id: int, username: str = Depends(require_auth)) -> dict: + source = get_source_by_id(source_id) + if not source: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Quelle nicht gefunden") + issues = evaluate_source_policy(source) + return { + "ok": True, + "source_id": source_id, + "allowed": is_source_allowed(source), + "issues": issues, + "requested_by": username, + } + + +@app.post("/api/sources") +def create_source(payload: SourceCreateRequest, username: str = Depends(require_auth)) -> dict: + source_id = repo_create_source( + SourceCreate( + name=payload.name, + base_url=payload.base_url, + terms_url=payload.terms_url, + license_name=payload.license_name, + risk_level=payload.risk_level, + is_enabled=payload.is_enabled, + notes=payload.notes, + last_reviewed_at=payload.last_reviewed_at, + ) + ) + return {"ok": True, "id": source_id, "requested_by": username} + + +@app.get("/api/feeds") +def list_feeds(username: str = Depends(require_auth)) -> dict: + return {"ok": True, "items": repo_list_feeds(), "requested_by": username} + + +@app.get("/api/feeds/{feed_id}/policy-check") +def feed_policy_check(feed_id: int, username: str = Depends(require_auth)) -> dict: + feed = get_feed_by_id(feed_id) + if not feed: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Feed nicht gefunden") + + source_snapshot = { + "id": feed.get("source_id"), + "name": feed.get("source_name"), + "base_url": feed.get("source_base_url"), + "terms_url": feed.get("source_terms_url"), + "license_name": feed.get("source_license_name"), + "risk_level": feed.get("source_risk_level"), + "last_reviewed_at": feed.get("source_last_reviewed_at"), + "is_enabled": feed.get("source_is_enabled"), + } + issues = evaluate_source_policy(source_snapshot) + return { + "ok": True, + "feed_id": feed_id, + "allowed": len(issues) == 0, + "issues": issues, + "requested_by": username, + } + + +@app.post("/api/feeds") +def create_feed(payload: FeedCreateRequest, username: str = Depends(require_auth)) -> dict: + try: + feed_id = repo_create_feed( + FeedCreate( + name=payload.name, + url=payload.url, + source_id=payload.source_id, + is_enabled=payload.is_enabled, + ) + ) + except Exception as exc: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=f"Feed konnte nicht angelegt werden: {exc}") from exc + + return {"ok": True, "id": feed_id, "requested_by": username} + + +@app.get("/api/runs") +def api_list_runs(limit: int = 50, username: str = Depends(require_auth)) -> dict: + return {"ok": True, "items": list_runs(limit=limit), "requested_by": username} + + +@app.get("/api/runs/{run_id}") +def api_get_run(run_id: int, username: str = Depends(require_auth)) -> dict: + run = get_run_by_id(run_id) + if not run: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Run nicht gefunden") + return {"ok": True, "item": run, "requested_by": username} + + +@app.post("/api/runs") +def api_create_run(payload: RunCreateRequest, username: str = Depends(require_auth)) -> dict: + run_id = create_run(RunCreate(run_type=payload.run_type, status=payload.status, details=payload.details)) + return {"ok": True, "id": run_id, "requested_by": username} + + +@app.post("/api/runs/{run_id}/finish") +def api_finish_run(run_id: int, payload: RunFinishRequest, username: str = Depends(require_auth)) -> dict: + finish_run(run_id=run_id, status=payload.status, details=payload.details) + return {"ok": True, "id": run_id, "requested_by": username} + + +@app.get("/api/articles") +def api_list_articles(limit: int = 100, status_filter: str | None = None, username: str = Depends(require_auth)) -> dict: + return {"ok": True, "items": repo_list_articles(limit=limit, status_filter=status_filter), "requested_by": username} + + +@app.get("/api/articles/{article_id}") +def api_get_article(article_id: int, username: str = Depends(require_auth)) -> dict: + article = get_article_by_id(article_id) + if not article: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + return {"ok": True, "item": article, "requested_by": username} + + +@app.post("/api/articles/upsert") +def api_upsert_article(payload: ArticleUpsertRequest, username: str = Depends(require_auth)) -> dict: + article_id = repo_upsert_article( + ArticleUpsert( + feed_id=payload.feed_id, + source_article_id=payload.source_article_id, + source_hash=payload.source_hash, + title=payload.title, + source_url=payload.source_url, + canonical_url=payload.canonical_url, + published_at=payload.published_at, + author=payload.author, + summary=payload.summary, + content_raw=payload.content_raw, + content_rewritten=payload.content_rewritten, + word_count=payload.word_count, + status=payload.status, + meta_json=payload.meta_json, + ) + ) + return {"ok": True, "id": article_id, "requested_by": username} + + +@app.post("/api/articles/{article_id}/transition") +def api_article_transition(article_id: int, payload: ArticleTransitionRequest, username: str = Depends(require_auth)) -> dict: + article = get_article_by_id(article_id) + if not article: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + + current_status = article.get("status") + allowed_targets = ALLOWED_ARTICLE_TRANSITIONS.get(current_status, set()) + if payload.target_status not in allowed_targets: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"Ungueltiger Statuswechsel: {current_status} -> {payload.target_status}", + ) + + updated = update_article_status(article_id, payload.target_status, actor=username, note=payload.note) + if not updated: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + return {"ok": True, "id": article_id, "from_status": current_status, "to_status": payload.target_status} + + +@app.post("/api/articles/{article_id}/review") +def api_article_review(article_id: int, payload: ArticleReviewRequest, username: str = Depends(require_auth)) -> dict: + article = get_article_by_id(article_id) + if not article: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + if article.get("status") != "review": + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"Review nur fuer Status 'review' erlaubt (aktuell: {article.get('status')})", + ) + + target_status = "approved" if payload.decision == "approve" else "rewrite" + updated = update_article_status( + article_id, + target_status, + actor=username, + note=payload.note, + decision=payload.decision, + ) + if not updated: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + return { + "ok": True, + "id": article_id, + "decision": payload.decision, + "to_status": target_status, + } + + +@app.post("/api/ingestion/run") +def api_run_ingestion(payload: IngestionRunRequest, username: str = Depends(require_auth)) -> dict: + stats = run_ingestion(feed_id=payload.feed_id) + return { + "ok": stats.status == "success", + "run_id": stats.run_id, + "status": stats.status, + "message": stats.message, + "stats": { + "feeds_processed": stats.feeds_processed, + "entries_seen": stats.entries_seen, + "articles_upserted": stats.articles_upserted, + }, + "requested_by": username, + } diff --git a/backend/app/policy.py b/backend/app/policy.py new file mode 100644 index 0000000..af6e65c --- /dev/null +++ b/backend/app/policy.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +from typing import Any + + +def evaluate_source_policy(source: dict[str, Any] | None) -> list[str]: + issues: list[str] = [] + if not source: + issues.append("Keine Quelle zugeordnet") + return issues + + risk_level = (source.get("risk_level") or "").strip().lower() + if risk_level != "green": + issues.append(f"Quelle nicht freigegeben (risk_level={risk_level or 'unset'})") + + terms_url = (source.get("terms_url") or "").strip() + if not terms_url: + issues.append("terms_url fehlt") + + license_name = (source.get("license_name") or "").strip() + if not license_name: + issues.append("license_name fehlt") + + last_reviewed_at = (source.get("last_reviewed_at") or "").strip() + if not last_reviewed_at: + issues.append("last_reviewed_at fehlt") + + if int(source.get("is_enabled", 0) or 0) != 1: + issues.append("Quelle ist deaktiviert") + + return issues + + +def is_source_allowed(source: dict[str, Any] | None) -> bool: + return len(evaluate_source_policy(source)) == 0 diff --git a/backend/app/repositories.py b/backend/app/repositories.py new file mode 100644 index 0000000..e170a20 --- /dev/null +++ b/backend/app/repositories.py @@ -0,0 +1,416 @@ +from __future__ import annotations + +from dataclasses import dataclass +import json +from datetime import datetime, timezone +from typing import Any + +from .db import get_conn, rows_to_dicts + + +@dataclass(frozen=True) +class SourceCreate: + name: str + base_url: str | None + terms_url: str | None + license_name: str | None + risk_level: str + is_enabled: bool + notes: str | None + last_reviewed_at: str | None + + +@dataclass(frozen=True) +class FeedCreate: + name: str + url: str + source_id: int | None + is_enabled: bool + + +@dataclass(frozen=True) +class RunCreate: + run_type: str + status: str + details: str | None = None + + +@dataclass(frozen=True) +class ArticleUpsert: + feed_id: int | None + source_article_id: str | None + source_hash: str | None + title: str + source_url: str + canonical_url: str | None + published_at: str | None + author: str | None + summary: str | None + content_raw: str | None + content_rewritten: str | None + word_count: int + status: str + meta_json: str | None + + +def create_source(payload: SourceCreate) -> int: + with get_conn() as conn: + cur = conn.execute( + """ + INSERT INTO sources (name, base_url, terms_url, license_name, risk_level, is_enabled, notes, last_reviewed_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + payload.name.strip(), + payload.base_url, + payload.terms_url, + payload.license_name, + payload.risk_level, + 1 if payload.is_enabled else 0, + payload.notes, + payload.last_reviewed_at, + ), + ) + return int(cur.lastrowid) + + +def list_sources() -> list[dict[str, Any]]: + with get_conn() as conn: + rows = conn.execute( + """ + SELECT id, name, base_url, terms_url, license_name, risk_level, is_enabled, notes, last_reviewed_at, created_at, updated_at + FROM sources + ORDER BY id DESC + """ + ).fetchall() + return rows_to_dicts(rows) + + +def get_source_by_id(source_id: int) -> dict[str, Any] | None: + with get_conn() as conn: + row = conn.execute( + """ + SELECT id, name, base_url, terms_url, license_name, risk_level, is_enabled, notes, last_reviewed_at, created_at, updated_at + FROM sources + WHERE id = ? + """, + (source_id,), + ).fetchone() + return dict(row) if row else None + + +def create_feed(payload: FeedCreate) -> int: + with get_conn() as conn: + cur = conn.execute( + "INSERT INTO feeds (name, url, source_id, is_enabled) VALUES (?, ?, ?, ?)", + (payload.name.strip(), payload.url.strip(), payload.source_id, 1 if payload.is_enabled else 0), + ) + return int(cur.lastrowid) + + +def list_feeds() -> list[dict[str, Any]]: + with get_conn() as conn: + rows = conn.execute( + """ + SELECT f.id, f.name, f.url, f.source_id, f.is_enabled, f.etag, f.last_modified, f.last_checked_at, + f.created_at, f.updated_at, s.name AS source_name, s.license_name AS source_license_name, + s.terms_url AS source_terms_url, s.risk_level AS source_risk_level, s.base_url AS source_base_url, + s.last_reviewed_at AS source_last_reviewed_at, s.is_enabled AS source_is_enabled + FROM feeds f + LEFT JOIN sources s ON s.id = f.source_id + ORDER BY f.id DESC + """ + ).fetchall() + return rows_to_dicts(rows) + + +def list_enabled_feeds() -> list[dict[str, Any]]: + with get_conn() as conn: + rows = conn.execute( + """ + SELECT f.id, f.name, f.url, f.source_id, f.is_enabled, f.etag, f.last_modified, f.last_checked_at, + s.name AS source_name, s.license_name AS source_license_name, s.terms_url AS source_terms_url, + s.risk_level AS source_risk_level, s.base_url AS source_base_url, + s.last_reviewed_at AS source_last_reviewed_at, s.is_enabled AS source_is_enabled + FROM feeds f + LEFT JOIN sources s ON s.id = f.source_id + WHERE f.is_enabled = 1 + ORDER BY f.id ASC + """ + ).fetchall() + return rows_to_dicts(rows) + + +def get_feed_by_id(feed_id: int) -> dict[str, Any] | None: + with get_conn() as conn: + row = conn.execute( + """ + SELECT f.id, f.name, f.url, f.source_id, f.is_enabled, f.etag, f.last_modified, f.last_checked_at, + s.name AS source_name, s.license_name AS source_license_name, s.terms_url AS source_terms_url, + s.risk_level AS source_risk_level, s.base_url AS source_base_url, + s.last_reviewed_at AS source_last_reviewed_at, s.is_enabled AS source_is_enabled + FROM feeds f + LEFT JOIN sources s ON s.id = f.source_id + WHERE f.id = ? + """, + (feed_id,), + ).fetchone() + return dict(row) if row else None + + +def update_feed_fetch_state(feed_id: int, etag: str | None, last_modified: str | None) -> None: + with get_conn() as conn: + conn.execute( + """ + UPDATE feeds + SET etag = ?, last_modified = ?, last_checked_at = datetime('now') + WHERE id = ? + """, + (etag, last_modified, feed_id), + ) + + +def create_run(payload: RunCreate) -> int: + with get_conn() as conn: + cur = conn.execute( + "INSERT INTO runs (run_type, status, details) VALUES (?, ?, ?)", + (payload.run_type, payload.status, payload.details), + ) + return int(cur.lastrowid) + + +def finish_run(run_id: int, status: str, details: str | None = None) -> None: + with get_conn() as conn: + conn.execute( + """ + UPDATE runs + SET status = ?, details = ?, finished_at = datetime('now') + WHERE id = ? + """, + (status, details, run_id), + ) + + +def list_runs(limit: int = 50) -> list[dict[str, Any]]: + safe_limit = max(1, min(limit, 500)) + with get_conn() as conn: + rows = conn.execute( + """ + SELECT id, run_type, status, started_at, finished_at, details + FROM runs + ORDER BY id DESC + LIMIT ? + """, + (safe_limit,), + ).fetchall() + return rows_to_dicts(rows) + + +def get_run_by_id(run_id: int) -> dict[str, Any] | None: + with get_conn() as conn: + row = conn.execute( + """ + SELECT id, run_type, status, started_at, finished_at, details + FROM runs + WHERE id = ? + """, + (run_id,), + ).fetchone() + return dict(row) if row else None + + +def get_article_by_id(article_id: int) -> dict[str, Any] | None: + with get_conn() as conn: + row = conn.execute( + """ + SELECT a.id, a.feed_id, a.source_article_id, a.source_hash, a.title, a.source_url, a.canonical_url, a.published_at, a.author, + a.summary, a.content_raw, a.content_rewritten, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at + FROM articles a + WHERE a.id = ? + """, + (article_id,), + ).fetchone() + return dict(row) if row else None + + +def _merge_review_event(meta_json: str | None, event: dict[str, Any]) -> str: + meta: dict[str, Any] = {} + if meta_json: + try: + meta = json.loads(meta_json) + if not isinstance(meta, dict): + meta = {} + except Exception: + meta = {} + + events = meta.get("review_events") + if not isinstance(events, list): + events = [] + events.append(event) + meta["review_events"] = events + return json.dumps(meta, ensure_ascii=False) + + +def update_article_status( + article_id: int, + new_status: str, + *, + actor: str | None = None, + note: str | None = None, + decision: str | None = None, +) -> bool: + article = get_article_by_id(article_id) + if not article: + return False + + event = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "from_status": article.get("status"), + "to_status": new_status, + "actor": actor or "system", + "note": note, + "decision": decision, + } + merged_meta = _merge_review_event(article.get("meta_json"), event) + + with get_conn() as conn: + conn.execute( + "UPDATE articles SET status = ?, meta_json = ? WHERE id = ?", + (new_status, merged_meta, article_id), + ) + return True + + +def _resolve_existing_article_id(payload: ArticleUpsert) -> int | None: + with get_conn() as conn: + # 1) strongest key: source_url + row = conn.execute( + "SELECT id FROM articles WHERE source_url = ?", + (payload.source_url.strip(),), + ).fetchone() + if row: + return int(row["id"]) + + # 2) stable feed+guid combo + if payload.feed_id is not None and payload.source_article_id: + row = conn.execute( + "SELECT id FROM articles WHERE feed_id = ? AND source_article_id = ?", + (payload.feed_id, payload.source_article_id), + ).fetchone() + if row: + return int(row["id"]) + + # 3) content hash fallback + if payload.source_hash: + row = conn.execute( + "SELECT id FROM articles WHERE source_hash = ?", + (payload.source_hash,), + ).fetchone() + if row: + return int(row["id"]) + + return None + + +def upsert_article(payload: ArticleUpsert) -> int: + existing_id = _resolve_existing_article_id(payload) + with get_conn() as conn: + if existing_id is None: + conn.execute( + """ + INSERT INTO articles ( + feed_id, source_article_id, source_hash, title, source_url, canonical_url, published_at, author, + summary, content_raw, content_rewritten, word_count, status, meta_json + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + payload.feed_id, + payload.source_article_id, + payload.source_hash, + payload.title.strip(), + payload.source_url.strip(), + payload.canonical_url, + payload.published_at, + payload.author, + payload.summary, + payload.content_raw, + payload.content_rewritten, + payload.word_count, + payload.status, + payload.meta_json, + ), + ) + else: + conn.execute( + """ + UPDATE articles + SET + feed_id = ?, + source_article_id = ?, + source_hash = ?, + title = ?, + source_url = ?, + canonical_url = ?, + published_at = ?, + author = ?, + summary = ?, + content_raw = ?, + content_rewritten = ?, + word_count = ?, + status = ?, + meta_json = ? + WHERE id = ? + """, + ( + payload.feed_id, + payload.source_article_id, + payload.source_hash, + payload.title.strip(), + payload.source_url.strip(), + payload.canonical_url, + payload.published_at, + payload.author, + payload.summary, + payload.content_raw, + payload.content_rewritten, + payload.word_count, + payload.status, + payload.meta_json, + existing_id, + ), + ) + row = conn.execute("SELECT id FROM articles WHERE source_url = ?", (payload.source_url.strip(),)).fetchone() + if row: + return int(row["id"]) + return int(existing_id) if existing_id else 0 + + +def list_articles(limit: int = 100, status_filter: str | None = None) -> list[dict[str, Any]]: + safe_limit = max(1, min(limit, 500)) + with get_conn() as conn: + if status_filter: + rows = conn.execute( + """ + SELECT a.id, a.feed_id, a.source_article_id, a.source_hash, a.title, a.source_url, a.canonical_url, a.published_at, a.author, + a.summary, a.content_raw, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at, f.name AS feed_name + FROM articles a + LEFT JOIN feeds f ON f.id = a.feed_id + WHERE a.status = ? + ORDER BY a.id DESC + LIMIT ? + """, + (status_filter, safe_limit), + ).fetchall() + else: + rows = conn.execute( + """ + SELECT a.id, a.feed_id, a.source_article_id, a.source_hash, a.title, a.source_url, a.canonical_url, a.published_at, a.author, + a.summary, a.content_raw, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at, f.name AS feed_name + FROM articles a + LEFT JOIN feeds f ON f.id = a.feed_id + ORDER BY a.id DESC + LIMIT ? + """, + (safe_limit,), + ).fetchall() + return rows_to_dicts(rows) diff --git a/backend/app/source_extraction.py b/backend/app/source_extraction.py new file mode 100644 index 0000000..7fd65ce --- /dev/null +++ b/backend/app/source_extraction.py @@ -0,0 +1,257 @@ +from __future__ import annotations + +from dataclasses import dataclass +from html import unescape +import re +from typing import Any +from urllib.parse import urljoin +from urllib.request import Request, urlopen + +DEFAULT_TIMEOUT_SECONDS = 10 +DEFAULT_USER_AGENT = "rss-news-bot/1.0 (+https://news.vanityontour.de)" + + +@dataclass(frozen=True) +class ExtractedArticle: + title: str | None + author: str | None + canonical_url: str | None + summary: str | None + content_text: str | None + images: list[str] + press_contact: str | None + extraction_error: str | None = None + + +def _clean_text(raw: str | None) -> str | None: + if not raw: + return None + text = unescape(raw) + text = re.sub(r"<[^>]+>", " ", text) + text = re.sub(r"\s+", " ", text).strip() + return text or None + + +def _strip_noise(html: str) -> str: + html = re.sub(r"", " ", html, flags=re.IGNORECASE) + html = re.sub(r"", " ", html, flags=re.IGNORECASE) + html = re.sub(r"", " ", html, flags=re.IGNORECASE) + return html + + +def _meta_content(html: str, attr: str, value: str) -> str | None: + pattern = re.compile( + rf"]+{attr}\s*=\s*[\"']{re.escape(value)}[\"'][^>]*content\s*=\s*[\"']([^\"']+)[\"'][^>]*>", + re.IGNORECASE, + ) + match = pattern.search(html) + if match: + return _clean_text(match.group(1)) + + # handle reversed attribute order + pattern_rev = re.compile( + rf"]+content\s*=\s*[\"']([^\"']+)[\"'][^>]*{attr}\s*=\s*[\"']{re.escape(value)}[\"'][^>]*>", + re.IGNORECASE, + ) + match = pattern_rev.search(html) + if match: + return _clean_text(match.group(1)) + return None + + +def _extract_title(html: str) -> str | None: + title = _meta_content(html, "property", "og:title") + if title: + return title + + match = re.search(r"]*>([\s\S]*?)", html, re.IGNORECASE) + if match: + cleaned = _clean_text(match.group(1)) + if cleaned: + return cleaned + + match = re.search(r"]*>([\s\S]*?)", html, re.IGNORECASE) + if match: + return _clean_text(match.group(1)) + return None + + +def _extract_canonical(html: str) -> str | None: + match = re.search( + r"]+rel\s*=\s*[\"']canonical[\"'][^>]*href\s*=\s*[\"']([^\"']+)[\"'][^>]*>", + html, + re.IGNORECASE, + ) + if match: + return _clean_text(match.group(1)) + + match = re.search( + r"]+href\s*=\s*[\"']([^\"']+)[\"'][^>]*rel\s*=\s*[\"']canonical[\"'][^>]*>", + html, + re.IGNORECASE, + ) + if match: + return _clean_text(match.group(1)) + return None + + +def _extract_author(html: str) -> str | None: + for attr, value in (("name", "author"), ("property", "article:author"), ("property", "og:article:author")): + author = _meta_content(html, attr, value) + if author: + return author + + for pattern in ( + r"(?:Von|Autor(?:in)?)\s*[:\-]\s*([^<\n\r]{3,120})", + r"class=[\"'][^\"']*(?:author|byline)[^\"']*[\"'][^>]*>([\s\S]{1,180})<", + ): + match = re.search(pattern, html, re.IGNORECASE) + if match: + author = _clean_text(match.group(1)) + if author: + return author + return None + + +def _extract_images(html: str, page_url: str) -> list[str]: + images: list[str] = [] + seen: set[str] = set() + + for prop in ("og:image", "twitter:image"): + pattern = re.compile( + rf"]+property\s*=\s*[\"']{re.escape(prop)}[\"'][^>]*content\s*=\s*[\"']([^\"']+)[\"'][^>]*>", + re.IGNORECASE, + ) + for match in pattern.finditer(html): + src = match.group(1).strip() + abs_src = urljoin(page_url, src) + if abs_src not in seen: + seen.add(abs_src) + images.append(abs_src) + + for match in re.finditer(r"]+src\s*=\s*[\"']([^\"']+)[\"'][^>]*>", html, re.IGNORECASE): + src = match.group(1).strip() + abs_src = urljoin(page_url, src) + if abs_src not in seen: + seen.add(abs_src) + images.append(abs_src) + + return images + + +def _extract_content_text(html: str) -> str | None: + section = None + for pattern in ( + r"]*>([\s\S]*?)", + r"]*>([\s\S]*?)", + r"]*>([\s\S]*?)", + ): + match = re.search(pattern, html, re.IGNORECASE) + if match: + section = match.group(1) + break + + if not section: + section = html + + paragraphs = [] + for match in re.finditer(r"]*>([\s\S]*?)", section, re.IGNORECASE): + text = _clean_text(match.group(1)) + if text and re.search(r"\b(pressekontakt|press contact|kontakt)\b", text, re.IGNORECASE): + paragraphs.append(text) + + for match in re.finditer(r"]*>([\s\S]*?)

", section, re.IGNORECASE): + text = _clean_text(match.group(1)) + if text and len(text) > 2: + paragraphs.append(text) + + if paragraphs: + return "\n".join(paragraphs) + + stripped = _clean_text(section) + return stripped + + +def _extract_press_contact(content_text: str | None) -> str | None: + if not content_text: + return None + + lines = [line.strip() for line in content_text.split("\n") if line.strip()] + marker_re = re.compile(r"\b(pressekontakt|press contact|presse\-kontakt)\b", re.IGNORECASE) + for idx, line in enumerate(lines): + if marker_re.search(line): + chunk = [line] + for nxt in lines[idx + 1 : idx + 6]: + if re.search(r"\b(original\-content von|ots:|newsroom:)\b", nxt, re.IGNORECASE): + break + chunk.append(nxt) + return _clean_text("\n".join(chunk)) + + match = re.search( + r"(Pressekontakt[\s\S]{0,1200}?)(?:Original-Content von|OTS:|newsroom:|$)", + content_text, + re.IGNORECASE, + ) + if match: + return _clean_text(match.group(1)) + return None + + +def extract_article(url: str, timeout_seconds: int = DEFAULT_TIMEOUT_SECONDS) -> ExtractedArticle: + try: + req = Request( + url=url, + headers={ + "User-Agent": DEFAULT_USER_AGENT, + "Accept-Language": "de-DE,de;q=0.9,en;q=0.8", + }, + ) + with urlopen(req, timeout=timeout_seconds) as resp: + raw = resp.read() + charset = resp.headers.get_content_charset() or "utf-8" + html = raw.decode(charset, errors="replace") + except Exception as exc: + return ExtractedArticle( + title=None, + author=None, + canonical_url=None, + summary=None, + content_text=None, + images=[], + press_contact=None, + extraction_error=str(exc), + ) + + html = _strip_noise(html) + title = _extract_title(html) + author = _extract_author(html) + canonical_url = _extract_canonical(html) + summary = _meta_content(html, "name", "description") + content_text = _extract_content_text(html) + if not summary and content_text: + summary = _clean_text(content_text[:320]) + images = _extract_images(html, url) + press_contact = _extract_press_contact(content_text) + + return ExtractedArticle( + title=title, + author=author, + canonical_url=canonical_url, + summary=summary, + content_text=content_text, + images=images, + press_contact=press_contact, + extraction_error=None, + ) + + +def extracted_article_to_meta(article: ExtractedArticle) -> dict[str, Any]: + return { + "title": article.title, + "author": article.author, + "canonical_url": article.canonical_url, + "summary": article.summary, + "images": article.images, + "press_contact": article.press_contact, + "extraction_error": article.extraction_error, + } diff --git a/backend/data/rss_news.db b/backend/data/rss_news.db new file mode 100644 index 0000000000000000000000000000000000000000..1b1c3900225265e8b460abed889fc85eda838c00 GIT binary patch literal 94208 zcmeHwTWlOxnjV{^NKrD`p7DB!fuiggVrL|d+3dP^RqNuRsg}$UMadFn*=u-+x}55+ zVRsc>RV`X_yjgiXJL}2X39`rl$wT%b1I$|2!1$OsofaD>_ zVu4_SO}6r^BF3p^p{G-X2 zCLWCc>3A^yY~gWX{h%T~KjD6Hdj9#dg-5fV@6b0r=gloMj6J(aqph8`)%2nUb+*hn z4}5y{c5P*|M%Fg2)LtP6CMP#HNS@_Y zh!xL*&hO=0d}S5|&vzBFy9-GM&soZwx>x6+J=#mw-LLJL>G?~T1nC&`P<0m)d1p=?GR`Tr zu_5an?7i^Cw@*&buc5MUbf!RF@WJ@a99d;o$GTz4n!gvj_@nPmP0yb_TlkldPZ-wUWQ7Pzd=*38UK)T%^bhhlE?Z^2*kSn#T zD|gp7i7?o!bfrp)>LA%kf6k}7=g8`dwbko{Eyq|7Q6@Q`gfEeEVbTyJ%Mbm=aed}oN zur!R_ee^P}-n?B~ySBmR!ugEY7s>6~RjjHTtF=2BbMc%-wmw{`t=GUz@6^)eb+Fgz zI-m0*5MJ-%wpgB?nqNIz7)zFt=#3`CqAgHZkUZ~k5;33MC*OH^VtW4BXA3{Pm&|^~ zMA`qTo>|XAj%~)Hu&wyP&e1b5r5!fg_o!?ix_YBc+bQLsWZ(1ajBcW~ZPO@XKV8#n zB7Q#_0(oXq#z!At*Yk6kC@Exc%p6dv*Nl?bp7n3>-MbUh^YinC_hu6C8F@s>pUEEh zlb~b6KU*mGmg~V5`)2FN;mH@hy|GDYbFefo+M+&VEqe?immfN-hB%lFsMQZZv}s21 zRx5Bk*F&NE^MfRf-JtgN-UJ@3U+bOxwrok&BY^ZTz9y>zuWIW>Q2{-9MLA*U@d z`C_}8lWcQxYkX?{x#tS6CWM$R91+Fb@-dInbtHeB=poL&$n%VLmXLJu-9}-0{>+)e zd*{+J6Nx9vx-s5cMjCf)Bt8uNT4qEK;oLC|ThSr$P0yx2O6XKINL!&7ZErQ{ecC5V zbcp`k1KMnY_2k^LD?`FD>mj8+Tf(w*_!Sl#=e<0WGrt;TJ2#~9u{{MiiW&7eKjgop}!F< z=+WuI?3nuKG>q#rV|}e4t7dBldf3Bi45O%w|I*g|I9hJRZ$AIVB|FXat)}VMJ?D~` zfYaL=(WuJ8K0&j^zZ{z^{_%M6&x*e+{!Q_ZKk^{+j2r=u07rl$z!BgGa0EC490861 zM}Q;15#R`X!U#MyIdQg-JEomFU6?pi$h<`+Q1i(dxOdHrPs|q*$CdGu6BExCm}A-m zjhOv^eC}_?ia)|1{^1C41ULd50geDifFr;W;0SO8I0762j=&cPfk#in4WRJrkBW)? zU7olXH2hXzdCd{c?z?%uj^Vx6z%FT3Q5^^pq=6t&-7P#dHuLpIr_rL0OTdV&>30I? zt3{{^@;*VQP~mv7Jyv{-Km5ZH;0SO8I0762jsQo1Bft^h2yg^A0vrL3!0{n)b@EZM zFyi)pP}wlPIthirh{g1436k^wr_YSd{qx!1z!(2;1ULd50geDifFr;W;0SO8zN`qm zJ2i1~?AOo8@{i8qNG^?HFYvR=5&H~j``YVYT3QCK|79^q$0FF>YIt1un4u>0n-H0E_==<9WFr-iqdNOxBm zOdq4GgPWz^&St~N0{faZFc@#Y{`NcD<0&D$TR(yjl&ais-DN@h5ds^`zPkG$$skBZ zpc|VnG#N0o3qztU44(35K^*O&C*A9Bvs)}Di~obI@$<>!Sbp>-YOF zjn9u2>W^k0U9Z=lfA!t@AHOwLc;<(mERP??Aa+`1QB_4jE^Cq~D1s;(rebPR#j#~W z)|85F>5eK<(RLKs)kRA&WW}H=mDGyvD7LDZvg&AtVab{+Shjx447VdN3WDoDpL|#c ze`v&HH4LJtw92l>4j+_Q66#k;&GX51+`t_W_sQdsT%qkavKzR)0(a0q`3Wl|q{vR% zzC-TV4P2s0{gL`IQsSJM3(BS_R#gethdd|1T}JSHH~3E9-6Z6EU%+Cg-`85!i&a88 z&z}qq>*b>j;Jm%M{3SBbjwCL}5R$^KthxI9$#ewfVzr1x5NV&Oh_ z8eUou7DyD@drh}ZfS%q|)54w95CoQe8kgfnyJh(ZC`WM+KG=#{X0utAB%QjlrIl<` zG)szMxFyRm^^&9-RH-PUD^shS1GfDAo%#aV^_;kIX+acGF}jPMUo4}~mpdc+3C*j| zCOwg%#%>?dS*MIH?|76nJP`UW#Wn6BBTxn?C<$+4F)_LrBnGpJ8~5K@Fk{H$R-4K9 zkapi%$ZnBl_Y*V8IK8hZ5g^l7PvrL>v&h3%nyxHpM0zLk2zk0CY?dv%`KYVZy<3l2 zd~)j#iw#1|Y#(n|0F`bZRpB6pncSJ&&&+an+#^}piBO*GMwp21wb<=R$sNZmWxkS% z`X;-DiEWFP4ONyZ*@C+8_S<_&l8c%S*g1VrFMy{}#?vSTPm|w&hViue(L7BNRXt&8 zx@2gQEsC;Y8Ja0Mj;4Z3RZOiSS0q8#OzLQkZa5W7v=zrysBJ5<>f)bL(Ii8svMOC` zK6z|!M|FzzvVj+1JZ!hf%UCh}*z>V-s#nRaAd2n4p=3S4J0h^FBUo-@>NR8X5VS{b zc+Dor3M5%;hXK}PvO(KX98$bq;NfAkgJJ3E$|z|&7*{q0qpAR7WfX>%v12;exhlEx z_G@iHg5V#`AwbfKKZcWGr@p>h5ROC@r;Kc%eqG` zxIzEgF71PEJ>G zG|e@sQ4%y)DJin1mMlZnN)<~M@E!@NVhDEmM&O$yr7z9U+h`AlN zaY6sZa$4}k^3LTKIIHbn(>we$moz>urxjI2N>}=QIW6|KUt@2qc$U4{@7LI?{GJ(S z{{N@uzB*QH7OQh#E&l7dD|0`ayI=fo#hJNZAc}uD0vrL307rl$z!BgGa0EC490861 zN8k&KfH+Y<)Hj_ejB&eu1zJ|BYjg9n|Ktcl;n5rcjsQo1Bft^h2yg^A z0vrL307u}Z+xkN=k7ZL#s%ZY&$l7872-TX%Q(D7Dz!LGQPqso?S zIg;tPQl`bXBtq(Qp+MDe9siSh`_2ieRdiig3fQao7n*o($Ql zsG6jjrXZN|$+Rt+4ePsQ3yLAhTE)_J6ogt8#Y7VvO*S3Fb)<@I$f7NY4mBK0HZAl{ zumr;vr;}17oWBxWTQ^+Mv24jwsbHYvf>}}2iX*C)u2d}3l?`B_;XlBlGDQ`lW>hqR zP9>$-x@j7YNOcjNHcSIJtD2@;hU8L3s#vN_bw`&hOGe?UWGbqNl3=eFsqL7SbRxyY zz;M_KRaHSmTXY4by3~*>IH6fF6dU=_VOLVb3VLM7rY!*y#lg`abl(&w(;kVM>53IY zq?W2Wf@vU&gTrNxg@e?#2C!YVBAdWgG$b2`rl~6GDA{og#Z(=2A}QtLp0^&q0;-$& zxJTR)`~U3UjTPOZH2ZhOe>Eq~{mVJG_+RG!-`s!x@=avkV~zkvfFr;W;0SO8I0762 zjsQo1Bk)BEw&zcg8(N7mEp@jqfUiO;_{S+I|+rpN1lsD}0W z{SVi$UeEs_^Yr-s50|Ic`yT+%nWM(D=eCG+|Ih9JU(^}S`^6F92yg^A0vrL307rl$ zz!BgG95VumJ(t`6x&8lhYX2|(+p*&R!Oj1_EdFKj7sa0!|D^aIihqbe{^1C41ULd5 z0geDifFr;W;0SO8I0762jsQpC?*V~R6JIZ+Z`V9EJ@HHduT+@HzE5V~)7ke__I)Dz zp3J@{vhVS!iDzbzpV|M%i+?*-{J;3aKO6y$07rl$z!BgGa0EC490861M}Q;15#R`X zfe<(`Q7BA|PfX0ru>Jo;@ejvf`~Nw<_=h9F5#R`L1ULd50geDifFr;W;0SO8I077j z&k_Rj6LLWkB&{S!B~d4WUX`?}s7~w?u2f}d{A&~POkaATD(cDk|G7UOoBQ**|6Tk_ zv0S`S+%CRX{8{lo761CP)Lq^djsQo1Bft^h2yg^A0vrL307rl$z!BgG3?OiJ;(4|= zR!gE-5|vG%QWb=%q&$bef^e!QR^PD;tXHNd$LL7SaIt}Bnz7+-S(5BH=d&eTH>D7P5M~wz63xo441lU8~(D`=>ocx;`scH<9q}tt%|w%?*+j)RX4w&D*55vic&q zee+&V#0#}+Ya2ZwtmLe)tR!-$wn_FHN-h!B=Gbe|^XL3v_uL}6_hRjKjd%{CZmwTh z_M8hnMb?R=CXkfsd@R?Lc3F4*!H8XC`Rg}BKBAusH86uE1m_N-^;i7$}9?=?<&}( z)IrI~cy4)4@;En8a$hP|auRgDlX3C2r%>|Qu9EYfv1Z5ZD1V$CC_InJ684~y=3RXB z?bFlq7tR*mnMn|7zp;mZ)`Er^HS&U<%Br}#vG&s48c9dtfIK}TO?vB2L185?_9aUx zrmJeQc86@-+$0-!*ViB2JvBZ55*oWU&{zgq4tCaBfS$Me^il2JKYL%>x``^u;5kd# ztjbYCorm^luW8-=+Mb!7zl2GUjzJGqcOj8?=F}nMya()ofWLimdVUR+eWNo4@`4Y> zZ|2Aw*u@`xcWQe6?AgKx_1LtUG_O1Vp3Z98TzO%=)|tcPeBV$Iwy3Oa zY}VLXc$~Hf(v;!2|;hCY!Za_9>`qTnPHs)J-F{W+Y+J4aSu ztgT)rY&phyh%yNn5W<(pxiD!8O@H3^(m-=(Ck*aWhlO@9V-GY8gYewq;$S0MG&Z-s z9|Z?>$qs48uMcSG`99vbPaR#Xlo8!vXNM>Q4868?ZG+8)^BJ)(lH0Yb;KLiMwL2Me z!79bphby)98e{{;#@X^Z*z0ti&v_9DuXk}Y4Q{>NE4Q`+eTejmDeqfOf> z<)CEW^XrUmqP7j8En+`i(`zDrKNUsSrxDllbD8LX$>o4jy=Iie_N;%4@7|r5 zo}ZsDyf>48&&VT6{!I43p9CEn{@Fsgw_FcWnQyj^9G-m9+nW?AZ4Q>^MO)NotYwcu z0k!%8h&IhA-f9Jo=Xxk~e}0gpu^ZIhPQ=IqQhgRziOvA^tP^QybbkMp zqL;1~C#U8w%^$Q1B;>RuCSND813JleLAS=I=AV16@M=Pc*}@S~%q<`DC|yVL$B7=| z?2A0lXlDsY7vF6ZrsvO`DZFImW!)I>EhCLPHWD9(el0Vihj8wghAnLRGBIF~ zI-8zNeU#9tYA{LYMcZ3VdY|@*5*?yH_kcE=*p}tovMWQvG3z0vK3l@Fbodn>u#yck z$M)gmeh|}iVH#|HGJ(=_`k%cS)JyNPAmFD?{@GaZzZP%J{q@}G+3(F3p8DBS8>j!` z)GucK0ulVf5#R`L1ULd50geDi;B$b$JJVmCK6Byh$seqA86)y-dzUpL56T7VE^|a4 z)s?zOZtAy3uux$O78E!|= z{Sm1Do_tt`mah?$)i8*n(ke5Lg%3(B3H7U_=K170EN}sFpF9r9721v?yU{d#*r1>M zgcTA}WG8LkA$RP?E_JBih~u58S}yPI?k?|yFi_B)AdJoCvO~)|t#WT)MoOHYiW%^n z@q9Pl8gZpOe-N%sJq2YaKT}|KeC>x>#cE_uG01#TtbX=B55*w2hSiM}c5z?@VLSXr9 z(ME^?Yq>z2Sk!Bg+tiB?;lRPCL6(=7FIty7{bo2^EL)e!YZpy|Qrt@mBaO$x_FNiXS`ZdU6xw@Dw@rYaQeF!-DHzL^eHxeJM!RMC2q;H!5I)$7 zT4u9ZmL#3JvZa-5Q#4D8VYnsBG4+z98dRw$qAOFYoCCJ}{hj&(+4Y>bacMymQ8BuU zo?k4Z&zCzR`U%ae&n7*Qp~h}t-Y;BUr;IM|c$73e5c)2K88>7E$^Zo=fyJ8`T?`U~ zS%qc&tpzj2?#OD#Uf?fO$y*DVyvXbmcwV@btTqcvB#+4LA1v}P%I?a7Mx-{85%P4~ zNm#b4rWf9gXjiFwRu2}R*gRNl02e&Zhj#_2bo;0Z2QfqmOh``bGc5PLpy9Uy%WJZ- zlNirIxP&LK#TMbj#=%nNE2)@xRVL>Vmkm{xDw!+d!rO1}CFvYl+$ZRRdI3C*GM+{$ zc$)nFGmNLzkLGDTFE^HKQIr+S&`im3G!L%JtvIeiZCjC5 z7yp!sCK)=FRq0yu$zyvvs#C0&4LHC&Y`4hESTX(B^I-t5SIMm)itWImWIce7NC>jS zavM{x8Iy;gJ#xcqHbGV($yz%MuqKlY+K%Fo!oA?(VYGu`>FLTSX*+=SJ9`et&@y&R z2Rm0KSDriu=WRMc=$5;BLe2+qv`9)|F$#c8$J^Z2w2E(G8WHx z2(qku)S^qo2@sW}eP}kCi3|W^I?(iKqea7Sr`(8T7{uKQu|UTZt0Y6&@vsiG$alfT z$bI+-VZP&$V%Vy1?2Jg=^dFLX7(Dp{O43nYCXz09k4~q)l)W8{%4och?#7=m5C5%}=^#rR_YzbOg%;NfRJZ4T#w zUs9?YnhEyN)Mz~L;?CuZiPUoWX2v%luP5Gdm^l!v4kmmE>yIrkHs&6O1uqo_!BHb( zZpUpH=r5Mjf-jbLF2BH8ZU36y;itKz@o_n=s47x=Bw%Pxo9_R=H+J$L7rys7-28sV zoBY8)ocvm{H-9zRnlJv|?yy^PQN#I_vL@myTUH7b* z?1Wf`JSY|*LwGwo(Gr2LuGx0e9c+q;ZMJr>m4jqQ67j(&9zZIwm5;1NK@)q3Hlmp# zVw2hp-`mC}IbzB0FzF?1V1JRs-h%dmrR*&>+fYO9pr{odw~$>Zxf+BmKp$nh=xCXB z2krFPW`(Rn4T1;Lh0pO4*>0N1vEFvmYEoI`U_eHbMS6$yQx`_k>W@^5GK5mygVb7C!ok=y;`% zgGqfP>7&M_54O?oS;CK9{LoZ&49= z*lcz zmzS&L1sXzo)M2b8a)&wmXItwG9G59PutT^THcjwkCQuvz1!E2KMZG1Hf|E-e`L}E$C&IQQT^X zvv{RD@G%a;C1yWB>+A;fRx-8jXxT;_)imX&*TJDjAwywN<_1e~o6Ik?4 z9N623bK5T)@j(c^&>_GP7;i6G9WUcOdXeA^cyvvB&zgVi3|Iv({3!eX@&7(HGl@U^ z!x8ubA@F8Q>P`+ro1S=5iM}lkXhATQyzE~<1 z49&3xv!bXKM^r6csaU2f8#WT+zd{8nQ^nLp&4B8L_VB?fxz>)EMFM(Lw%hMWRNH0~ zVhyub(C8skDwN5}m6g?0bCD}9pfZ5<9j4-3oddaO)eO!1CJvdJ{&vu6#YYH|-8~y2 zX{y12#MytV$#4=U>q@m_Y3@jstC{u%)*y&!KBWW-mpU+MknNlmdTSa+QBU3XJ9g;6os1v z^_Q7<3IxzZluhJ#65$9i>Up@ED3g3#lTe4tMYKcFl4dh=ra+O%7@6_IWQ=Zjemkm% zCaW=1+5m&m!i>hoHreT_JlGAj{kX))r z6-$+=?&y+b$>1LDAZ{?M2;2sg_T}-@>B4! zCey*gJK_j#(gW2fX>;Sjz?E6Uv7UR(XYE_$1+VEabw|^zV_9zR;1Y!rxke*^!*uu& zKy?yD15_U-V1>HC-&21ukl08> zh+toq_T>bBXl~XA;PJAvQK!mCtZ#+0KCr&t@jGtbS26NS4o9>9kNwHm$=|`B&-3S> zR!^o({LwcPCSLl04#~t7p&~O=yCzC1Y=Jga9Z8~=u4MWYL#CT0Glqz)PG+FKwMKpLYyE!LH7%l9eNA zyS(`_xktT*pBbTD3Kn#f0imbeM{v}hwE1QZZkoN*9wv{)4kmQB%`s#p3&KtEq;>j?@8^)Y97#Vh@=9`031|g7zK2-wa}FREvn!AwLJ@FsVeq&|*9494mv<6h`f_@&S2>9*v3XsBfDF-` zh9wvk{axB9d9CDUgr80Hm&k0_n#n8b-RpPT}y z?wzJs=TZpsLhR;v$8CiGBOTca@xktN<_7Tf#0{YK{`Fzq05naJl!SZ3_t@2JaB<5P z6ho3V_`d02;Mi;{P{&GwqsgXYxQ$U{L7H>l<*aXLE#x1su zhJ70<#dediJ6O2kvX4U!H=7UOGlsJv4o>|vnb$gu=FDr1u?^-1cIcT9=7rJIMt$4A%mb&usraAOb0$?Y+%bTw++;?VUtt%7U)|Sf9XEJmKrh@IJPxx!5b%t~ z*Lw%=Q)ldH^~cHCE7Yh6vLuvL3m1_qx+0cLoDwZrl?u*iQdd)Cx%_=LVM=j2VYYU= zCljOJ!^?u?Sk*go!^*_X17-{=|jWgbXrT^GD zuYiLfAI1JZw#D}UTc5!8|DXNFsf@9=62@MBACF)EUHNDetjLt=G8nt6i*m)O2#O*> zqb}=?;0lhcSryk+;TDgRdxE7X8r3a9pthldnH%s26k(&qNhH}db=A^tV`u0y@3yND zWZ9CB-|TYV7I+ib1`a480S<_TZqURzN>~HIgV;`;nP|(Mv(HSs3PuUXvO2^|c+8=w z)CU~uVu#>(AXDt#ZG=a0^`6d+l(-`T^uO0)I1%7h80^66*};SD-&5~5a{U^Zf5=Wc zcI=5*jhS+s8Dtp;XUELdgr9fvn=swR;IvH3o}-AcB%XNK4q&s*^xXbF$RiNgzd&*N zmRi8uhy9uvU~gd8o*dv~NBQzY>^@n4@*&jQuxzk1>_~ypyqkzJ>~LUbx1QQ{nPr$M z?4gp!z~GA=0=$VfZsYX4%j_deVW08+{V~a%vVhBoT)$^Vj+e*pPxs6b5i~y% zcfX!qcFT{__j0XcXYe@YmAw&Y;cXZXQq;F_PqH6JIDr4!TMO)sHQ-yVoqf;aE9x?i zh~dynCM7TfL>RQPcdD=~5Yt$zNv>mP6$uJ^$Hp(i#F2i@qHsv2wx;N^uGxYPMSx&e zm{vfxWXq9oF31#B!BBPGPPW3yp7c}M|Fb3^#r!+U0+zVL{QF;9H5~IFLa68a|3lRy zBT522gZJr60!j79DG8_&CXTCHB?Ah!l7d@8;P_v0N|GknuIuPBd|mkd|6}Q)hL;Wc li0gP|gCUlRkt77Z|4(iy>m4(2%;UUiN0W42A94Tx{{iTtj_Uvb literal 0 HcmV?d00001 diff --git a/backend/requirements-test.txt b/backend/requirements-test.txt new file mode 100644 index 0000000..cf39f84 --- /dev/null +++ b/backend/requirements-test.txt @@ -0,0 +1,3 @@ +pytest==8.3.5 +pytest-cov==6.0.0 +httpx==0.28.1 diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..f4ffe61 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,8 @@ +fastapi==0.116.1 +uvicorn[standard]==0.35.0 +itsdangerous==2.2.0 +pydantic-settings==2.10.1 +python-dotenv==1.1.1 +feedparser==6.0.11 +jinja2==3.1.4 +python-multipart==0.0.20 diff --git a/backend/static/admin.css b/backend/static/admin.css new file mode 100644 index 0000000..348264f --- /dev/null +++ b/backend/static/admin.css @@ -0,0 +1,189 @@ +body { + margin: 0; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + background: #f4f6f8; + color: #1f2937; +} + +.topbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px 28px; + background: #0f172a; + color: #f8fafc; +} + +.container { + padding: 20px 28px 28px 28px; +} + +.login { + max-width: 520px; + margin: 60px auto; +} + +.card { + background: #ffffff; + border-radius: 10px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12); + padding: 16px; + margin-bottom: 16px; +} + +.stats { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; + margin-bottom: 16px; +} + +.stat { + background: #ffffff; + border-radius: 10px; + padding: 12px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12); +} + +.stat .label { + font-size: 12px; + color: #64748b; +} + +.stat .value { + font-size: 24px; + font-weight: 700; +} + +.grid.two { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; +} + +.stack { + display: grid; + gap: 10px; +} + +.row { + display: flex; + gap: 8px; + align-items: center; +} + +.filter-row { + margin-bottom: 10px; +} + +.inline { + display: flex; + gap: 6px; + align-items: center; +} + +table { + width: 100%; + border-collapse: collapse; +} + +th, td { + text-align: left; + padding: 8px; + border-bottom: 1px solid #e5e7eb; + vertical-align: top; +} + +input, select, button { + padding: 8px; + border-radius: 6px; + border: 1px solid #cbd5e1; + font: inherit; +} + +button { + background: #0ea5e9; + border-color: #0ea5e9; + color: white; + cursor: pointer; +} + +button.secondary { + background: #64748b; + border-color: #64748b; +} + +.badge { + display: inline-block; + padding: 2px 8px; + border-radius: 999px; + background: #e2e8f0; + font-size: 12px; +} + +.badge.ok { + background: #dcfce7; + color: #166534; +} + +.badge.bad { + background: #fee2e2; + color: #991b1b; +} + +.alert { + margin-bottom: 12px; + padding: 10px; + border-radius: 8px; + background: #fee2e2; + color: #991b1b; +} + +.flash { + font-weight: 600; +} + +.flash-success { + border-left: 4px solid #10b981; +} + +.flash-error { + border-left: 4px solid #ef4444; +} + +.subtle { + color: #64748b; + font-size: 12px; + margin-top: 4px; +} + +.pre { + white-space: pre-wrap; + line-height: 1.35; + max-height: 220px; + overflow: auto; + background: #f8fafc; + border: 1px solid #e2e8f0; + border-radius: 8px; + padding: 8px; + margin-top: 6px; +} + +.linkbtn { + display: inline-block; + padding: 8px 10px; + border-radius: 6px; + text-decoration: none; + border: 1px solid #cbd5e1; + color: #334155; + background: #f8fafc; +} + +@media (max-width: 920px) { + .stats { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .grid.two { + grid-template-columns: 1fr; + } +} diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html new file mode 100644 index 0000000..36b30a7 --- /dev/null +++ b/backend/templates/admin_dashboard.html @@ -0,0 +1,235 @@ + + + + + + {{ title }} + + + +
+
+

rss-news Admin Dashboard

+

Angemeldet als {{ user }}

+
+
+ +
+
+ +
+ {% if flash_msg %} +
+ {{ flash_msg }} +
+ {% endif %} + +
+
+
Quellen
+
{{ sources|length }}
+
+
+
Feeds
+
{{ feeds|length }}
+
+
+
Artikel
+
{{ articles|length }}
+
+
+
Runs
+
{{ runs|length }}
+
+
+ +
+
+

Quelle anlegen

+
+ + + + + + + +
+
+ +
+

Feed anlegen

+
+ + + + + +
+
+
+ +
+

Ingestion starten

+
+ + +
+
+ +
+

Quellen + Policy

+ + + + + + {% for s in sources %} + + + + + + + + + {% endfor %} + +
IDNameRiskLizenzTermsPolicy
{{ s.id }}{{ s.name }}{{ s.risk_level }}{{ s.license_name or "-" }}{{ s.terms_url or "-" }} + {% if source_policy[s.id] %} + BLOCKED ({{ source_policy[s.id]|length }}) +
{{ source_policy[s.id]|join(", ") }}
+ {% else %} + OK + {% endif %} +
+
+ +
+

Artikel (Review)

+
+ + + + Reset +
+ + + + + + {% for a in articles %} + + + + + + + + + {% endfor %} + +
IDArtikelStatusDetailsReviewTransition
{{ a.id }} + {{ a.title }}
+ Autor: {{ a.author or "-" }}
+ Original öffnen + {% if a.canonical_url and a.canonical_url != a.source_url %} +
Canonical öffnen + {% endif %} +
{{ a.status }} + {% if a.summary %} +
Summary: {{ a.summary }}
+ {% endif %} + {% if a.content_raw %} +
+ Volltext anzeigen +
{{ a.content_raw }}
+
+ {% endif %} +
Bilder: {{ a.extracted_images|length }}
+ {% if a.extracted_images %} +
+ Bild-URLs +
    + {% for img in a.extracted_images %} +
  • {{ img }}
  • + {% endfor %} +
+
+ {% endif %} + {% if a.press_contact %} +
+ Pressekontakt +
{{ a.press_contact }}
+
+ {% endif %} + {% if a.extraction_error %} +
Extraktionsfehler: {{ a.extraction_error }}
+ {% endif %} +
+ {% if a.status == "review" %} +
+ + + +
+ {% else %} + - + {% endif %} +
+
+ + {% if allowed_transitions.get(a.status, []) %} + + {% else %} + keine Aktion + {% endif %} +
+
+
+ +
+

Runs

+ + + + + + {% for r in runs %} + + + + + + + + {% endfor %} + +
IDTypStatusStartEnde
{{ r.id }}{{ r.run_type }}{{ r.status }}{{ r.started_at }}{{ r.finished_at or "-" }}
+
+
+ + diff --git a/backend/templates/admin_login.html b/backend/templates/admin_login.html new file mode 100644 index 0000000..10e55e7 --- /dev/null +++ b/backend/templates/admin_login.html @@ -0,0 +1,27 @@ + + + + + + {{ title }} + + + +
+

rss-news Admin

+

Bitte anmelden, um das Tool zu verwalten.

+ {% if error %} +
Login fehlgeschlagen. Bitte pruefen.
+ {% endif %} +
+ + + +
+
+ + diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py new file mode 100644 index 0000000..46816dd --- /dev/null +++ b/backend/tests/__init__.py @@ -0,0 +1 @@ +"""Tests package.""" diff --git a/backend/tests/test_admin_ui.py b/backend/tests/test_admin_ui.py new file mode 100644 index 0000000..c6b2188 --- /dev/null +++ b/backend/tests/test_admin_ui.py @@ -0,0 +1,65 @@ +import os +import tempfile +import unittest +from pathlib import Path + +from fastapi.testclient import TestClient + +from backend.app import config as config_module +from backend.app.db import init_db +from backend.app.main import app + + +class TestAdminUi(unittest.TestCase): + def setUp(self) -> None: + self.tmp_dir = tempfile.TemporaryDirectory() + os.environ["APP_DB_PATH"] = str(Path(self.tmp_dir.name) / "admin_ui.db") + os.environ["APP_ADMIN_USERNAME"] = "admin" + os.environ["APP_ADMIN_PASSWORD"] = "secret" + config_module.get_settings.cache_clear() + init_db() + self.client = TestClient(app) + + def tearDown(self) -> None: + config_module.get_settings.cache_clear() + os.environ.pop("APP_DB_PATH", None) + os.environ.pop("APP_ADMIN_USERNAME", None) + os.environ.pop("APP_ADMIN_PASSWORD", None) + self.tmp_dir.cleanup() + + def test_admin_login_and_dashboard(self) -> None: + login_page = self.client.get("/admin/login") + self.assertEqual(login_page.status_code, 200) + self.assertIn("rss-news Admin", login_page.text) + + login = self.client.post( + "/admin/login", + data={"username": "admin", "password": "secret"}, + follow_redirects=True, + ) + self.assertEqual(login.status_code, 200) + self.assertIn("Admin Dashboard", login.text) + + def test_dashboard_redirects_if_not_logged_in(self) -> None: + res = self.client.get("/admin/dashboard", follow_redirects=False) + self.assertEqual(res.status_code, 303) + self.assertEqual(res.headers.get("location"), "/admin/login") + + def test_create_feed_with_empty_source_id_does_not_error(self) -> None: + self.client.post( + "/admin/login", + data={"username": "admin", "password": "secret"}, + follow_redirects=True, + ) + # empty source_id used to cause validation issues in form parsing + res = self.client.post( + "/admin/feeds/create", + data={"name": "Feed X", "url": "https://example.org/feed.xml", "source_id": ""}, + follow_redirects=False, + ) + self.assertEqual(res.status_code, 303) + self.assertTrue(res.headers.get("location", "").startswith("/admin/dashboard")) + + +if __name__ == "__main__": + unittest.main() diff --git a/backend/tests/test_api_auth.py b/backend/tests/test_api_auth.py new file mode 100644 index 0000000..aa86821 --- /dev/null +++ b/backend/tests/test_api_auth.py @@ -0,0 +1,77 @@ +import os +import tempfile +import unittest +from pathlib import Path + +from fastapi.testclient import TestClient + +from backend.app import config as config_module +from backend.app.db import init_db +from backend.app.main import app + + +class TestApiAuth(unittest.TestCase): + def setUp(self) -> None: + self.tmp_dir = tempfile.TemporaryDirectory() + os.environ["APP_DB_PATH"] = str(Path(self.tmp_dir.name) / "api.db") + os.environ["APP_ADMIN_USERNAME"] = "admin" + os.environ["APP_ADMIN_PASSWORD"] = "secret" + config_module.get_settings.cache_clear() + init_db() + self.client = TestClient(app) + + def tearDown(self) -> None: + config_module.get_settings.cache_clear() + os.environ.pop("APP_DB_PATH", None) + os.environ.pop("APP_ADMIN_USERNAME", None) + os.environ.pop("APP_ADMIN_PASSWORD", None) + self.tmp_dir.cleanup() + + def test_login_and_protected_endpoint(self) -> None: + r = self.client.post("/auth/login", json={"username": "admin", "password": "secret"}) + self.assertEqual(r.status_code, 200) + + p = self.client.get("/api/protected") + self.assertEqual(p.status_code, 200) + self.assertTrue(p.json().get("ok")) + + def test_protected_requires_auth(self) -> None: + r = self.client.get("/api/protected") + self.assertEqual(r.status_code, 401) + + def test_run_detail_endpoint(self) -> None: + login = self.client.post("/auth/login", json={"username": "admin", "password": "secret"}) + self.assertEqual(login.status_code, 200) + + created = self.client.post("/api/runs", json={"run_type": "ingestion", "status": "running"}) + self.assertEqual(created.status_code, 200) + run_id = created.json()["id"] + + detail = self.client.get(f"/api/runs/{run_id}") + self.assertEqual(detail.status_code, 200) + self.assertEqual(detail.json()["item"]["id"], run_id) + + def test_source_policy_check_endpoint(self) -> None: + login = self.client.post("/auth/login", json={"username": "admin", "password": "secret"}) + self.assertEqual(login.status_code, 200) + + created = self.client.post( + "/api/sources", + json={ + "name": "Policy Source", + "risk_level": "yellow", + "is_enabled": True, + }, + ) + self.assertEqual(created.status_code, 200) + source_id = created.json()["id"] + + check = self.client.get(f"/api/sources/{source_id}/policy-check") + self.assertEqual(check.status_code, 200) + body = check.json() + self.assertFalse(body["allowed"]) + self.assertGreaterEqual(len(body["issues"]), 1) + + +if __name__ == "__main__": + unittest.main() diff --git a/backend/tests/test_article_workflow.py b/backend/tests/test_article_workflow.py new file mode 100644 index 0000000..28bb1eb --- /dev/null +++ b/backend/tests/test_article_workflow.py @@ -0,0 +1,95 @@ +import os +import tempfile +import unittest +from pathlib import Path + +from fastapi.testclient import TestClient + +from backend.app import config as config_module +from backend.app.db import init_db +from backend.app.main import app + + +class TestArticleWorkflow(unittest.TestCase): + def setUp(self) -> None: + self.tmp_dir = tempfile.TemporaryDirectory() + os.environ["APP_DB_PATH"] = str(Path(self.tmp_dir.name) / "workflow.db") + os.environ["APP_ADMIN_USERNAME"] = "admin" + os.environ["APP_ADMIN_PASSWORD"] = "secret" + config_module.get_settings.cache_clear() + init_db() + self.client = TestClient(app) + self.client.post("/auth/login", json={"username": "admin", "password": "secret"}) + + def tearDown(self) -> None: + config_module.get_settings.cache_clear() + os.environ.pop("APP_DB_PATH", None) + os.environ.pop("APP_ADMIN_USERNAME", None) + os.environ.pop("APP_ADMIN_PASSWORD", None) + self.tmp_dir.cleanup() + + def _create_article(self) -> int: + source = self.client.post( + "/api/sources", + json={ + "name": "Workflow Source", + "base_url": "https://example.org", + "terms_url": "https://example.org/terms", + "license_name": "cc-by", + "risk_level": "green", + "is_enabled": True, + "last_reviewed_at": "2026-02-18T00:00:00Z", + }, + ) + source_id = source.json()["id"] + + feed = self.client.post( + "/api/feeds", + json={"name": "Workflow Feed", "url": "https://example.org/feed.xml", "source_id": source_id, "is_enabled": True}, + ) + feed_id = feed.json()["id"] + + article = self.client.post( + "/api/articles/upsert", + json={ + "feed_id": feed_id, + "source_article_id": "wf-1", + "source_url": "https://example.org/a1", + "title": "Workflow Artikel", + "summary": "s", + "content_raw": "c", + "status": "new", + }, + ) + return article.json()["id"] + + def test_valid_transition_chain(self) -> None: + article_id = self._create_article() + + t1 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "review"}) + self.assertEqual(t1.status_code, 200) + + r1 = self.client.post(f"/api/articles/{article_id}/review", json={"decision": "approve", "note": "ok"}) + self.assertEqual(r1.status_code, 200) + self.assertEqual(r1.json()["to_status"], "approved") + + t2 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "published"}) + self.assertEqual(t2.status_code, 200) + + final = self.client.get(f"/api/articles/{article_id}") + self.assertEqual(final.status_code, 200) + self.assertEqual(final.json()["item"]["status"], "published") + + def test_invalid_transition_rejected(self) -> None: + article_id = self._create_article() + bad = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "published"}) + self.assertEqual(bad.status_code, 400) + + def test_review_only_allowed_in_review_status(self) -> None: + article_id = self._create_article() + bad = self.client.post(f"/api/articles/{article_id}/review", json={"decision": "approve"}) + self.assertEqual(bad.status_code, 400) + + +if __name__ == "__main__": + unittest.main() diff --git a/backend/tests/test_db_repositories.py b/backend/tests/test_db_repositories.py new file mode 100644 index 0000000..825ae8d --- /dev/null +++ b/backend/tests/test_db_repositories.py @@ -0,0 +1,119 @@ +import os +import tempfile +import unittest +from pathlib import Path + +from backend.app import config as config_module +from backend.app.db import init_db +from backend.app.repositories import ( + ArticleUpsert, + FeedCreate, + RunCreate, + SourceCreate, + create_feed, + create_run, + create_source, + finish_run, + list_articles, + list_feeds, + list_runs, + list_sources, + upsert_article, +) + + +class TestSQLiteRepositories(unittest.TestCase): + def setUp(self) -> None: + self.tmp_dir = tempfile.TemporaryDirectory() + self.db_path = str(Path(self.tmp_dir.name) / "test.db") + os.environ["APP_DB_PATH"] = self.db_path + config_module.get_settings.cache_clear() + init_db() + + def tearDown(self) -> None: + config_module.get_settings.cache_clear() + os.environ.pop("APP_DB_PATH", None) + self.tmp_dir.cleanup() + + def test_end_to_end_basic_crud(self) -> None: + source_id = create_source( + SourceCreate( + name="GovData", + base_url="https://data.gov.de", + terms_url="https://www.govdata.de/dl-de/by-2-0", + license_name="dl-de/by-2-0", + risk_level="green", + is_enabled=True, + notes="test source", + last_reviewed_at="2026-02-18T00:00:00Z", + ) + ) + self.assertGreater(source_id, 0) + + feed_id = create_feed( + FeedCreate( + name="GovData RSS", + url="https://example.org/feed.xml", + source_id=source_id, + is_enabled=True, + ) + ) + self.assertGreater(feed_id, 0) + + run_id = create_run(RunCreate(run_type="ingest", status="running", details="start")) + self.assertGreater(run_id, 0) + finish_run(run_id=run_id, status="success", details="ok") + + article_id = upsert_article( + ArticleUpsert( + feed_id=feed_id, + source_article_id="abc-1", + source_hash="hash-abc-1", + title="Beispielartikel", + source_url="https://example.org/articles/1", + canonical_url="https://example.org/articles/1", + published_at="2026-02-18T00:00:00Z", + author="Max Mustermann", + summary="Kurzfassung", + content_raw="Originaltext", + content_rewritten="Umschreibung", + word_count=120, + status="review", + meta_json='{"lang":"de"}', + ) + ) + self.assertGreater(article_id, 0) + + # Upsert with same source_url updates same row + article_id_2 = upsert_article( + ArticleUpsert( + feed_id=feed_id, + source_article_id="abc-1", + source_hash="hash-abc-1", + title="Beispielartikel aktualisiert", + source_url="https://example.org/articles/1", + canonical_url="https://example.org/articles/1", + published_at="2026-02-18T00:00:00Z", + author="Max Mustermann", + summary="Kurzfassung 2", + content_raw="Originaltext 2", + content_rewritten="Umschreibung 2", + word_count=140, + status="approved", + meta_json='{"lang":"de","v":2}', + ) + ) + self.assertEqual(article_id, article_id_2) + + self.assertEqual(len(list_sources()), 1) + self.assertEqual(len(list_feeds()), 1) + self.assertEqual(len(list_runs()), 1) + + articles = list_articles() + self.assertEqual(len(articles), 1) + self.assertEqual(articles[0]["title"], "Beispielartikel aktualisiert") + self.assertEqual(articles[0]["status"], "approved") + + +if __name__ == "__main__": + unittest.main() diff --git a/backend/tests/test_ingestion.py b/backend/tests/test_ingestion.py new file mode 100644 index 0000000..05b2c2b --- /dev/null +++ b/backend/tests/test_ingestion.py @@ -0,0 +1,122 @@ +import os +import tempfile +import unittest +from pathlib import Path +from unittest.mock import patch + +from backend.app import config as config_module +from backend.app.db import init_db +from backend.app.ingestion import run_ingestion +from backend.app.repositories import FeedCreate, SourceCreate, create_feed, create_source, list_articles +from backend.app.source_extraction import ExtractedArticle + + +class TestIngestion(unittest.TestCase): + def setUp(self) -> None: + self.tmp_dir = tempfile.TemporaryDirectory() + os.environ["APP_DB_PATH"] = str(Path(self.tmp_dir.name) / "ingestion.db") + config_module.get_settings.cache_clear() + init_db() + + source_id = create_source( + SourceCreate( + name="Test Source", + base_url="https://example.org", + terms_url="https://example.org/terms", + license_name="cc-by", + risk_level="green", + is_enabled=True, + notes=None, + last_reviewed_at="2026-02-18T00:00:00Z", + ) + ) + self.feed_id = create_feed( + FeedCreate( + name="Test Feed", + url="https://example.org/feed.xml", + source_id=source_id, + is_enabled=True, + ) + ) + + def tearDown(self) -> None: + config_module.get_settings.cache_clear() + os.environ.pop("APP_DB_PATH", None) + self.tmp_dir.cleanup() + + @patch("backend.app.ingestion.extract_article") + @patch("backend.app.ingestion.feedparser.parse") + def test_ingestion_deduplicates_by_feed_and_guid(self, mock_parse, mock_extract_article) -> None: + mock_extract_article.return_value = ExtractedArticle( + title="Artikel 1 original", + author="Autorin A", + canonical_url="https://example.org/article/1", + summary="Original Summary", + content_text="Original Volltext", + images=["https://example.org/a.jpg"], + press_contact="Pressekontakt: Team A", + extraction_error=None, + ) + mock_parse.return_value = { + "etag": "etag-1", + "modified": "Tue, 18 Feb 2026 10:00:00 GMT", + "entries": [ + { + "id": "item-1", + "title": "Artikel 1", + "link": "https://example.org/article/1", + "summary": "A", + }, + { + "id": "item-1", + "title": "Artikel 1 aktualisiert", + "link": "https://example.org/article/1-neu", + "summary": "B", + }, + ], + } + + stats = run_ingestion(feed_id=self.feed_id) + self.assertEqual(stats.status, "success") + self.assertEqual(stats.entries_seen, 2) + self.assertEqual(len(list_articles()), 1) + article = list_articles()[0] + self.assertEqual(article["title"], "Artikel 1 original") + self.assertEqual(article["author"], "Autorin A") + self.assertIn("Original Volltext", article["content_raw"] or "") + self.assertIn("Pressekontakt", article["meta_json"] or "") + + @patch("backend.app.ingestion.extract_article") + @patch("backend.app.ingestion.feedparser.parse") + def test_ingestion_blocks_non_green_source(self, mock_parse, mock_extract_article) -> None: + # Re-create source/feed with yellow risk to verify enforcement + source_id = create_source( + SourceCreate( + name="Blocked Source", + base_url="https://example.net", + terms_url="https://example.net/terms", + license_name="custom", + risk_level="yellow", + is_enabled=True, + notes=None, + last_reviewed_at="2026-02-18T00:00:00Z", + ) + ) + blocked_feed_id = create_feed( + FeedCreate( + name="Blocked Feed", + url="https://example.net/feed.xml", + source_id=source_id, + is_enabled=True, + ) + ) + + stats = run_ingestion(feed_id=blocked_feed_id) + self.assertEqual(stats.status, "success") + self.assertEqual(stats.articles_upserted, 0) + mock_parse.assert_not_called() + mock_extract_article.assert_not_called() + + +if __name__ == "__main__": + unittest.main() diff --git a/backend/tests/test_source_extraction.py b/backend/tests/test_source_extraction.py new file mode 100644 index 0000000..f6787ff --- /dev/null +++ b/backend/tests/test_source_extraction.py @@ -0,0 +1,69 @@ +import unittest +from unittest.mock import patch + +from backend.app.source_extraction import extract_article + + +SAMPLE_HTML = """ + + + + + + + + + + + +
+

Dies ist der vollstaendige Inhalt des Artikels.

+

Weitere relevante Informationen fuer die Meldung.

+

Pressekontakt

+

Musterfirma GmbH, Kontakt: presse@example.org

+
+ + +""" + + +class _FakeHeaders: + @staticmethod + def get_content_charset(): + return "utf-8" + + +class _FakeResponse: + headers = _FakeHeaders() + + def __init__(self, body: str): + self._body = body.encode("utf-8") + + def read(self): + return self._body + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + return False + + +class TestSourceExtraction(unittest.TestCase): + @patch("backend.app.source_extraction.urlopen") + def test_extract_article_parses_author_images_and_press_contact(self, mock_urlopen) -> None: + mock_urlopen.return_value = _FakeResponse(SAMPLE_HTML) + + extracted = extract_article("https://www.presseportal.de/pm/118273/6158137") + self.assertEqual(extracted.title, "Demo Meldung von Presseportal") + self.assertEqual(extracted.author, "Max Mustermann") + self.assertEqual(extracted.canonical_url, "https://www.presseportal.de/pm/118273/6158137") + self.assertIn("vollstaendige Inhalt", extracted.content_text or "") + self.assertIn("Kurzbeschreibung", extracted.summary or "") + self.assertIn("https://www.presseportal.de/images/demo.jpg", extracted.images) + self.assertIn("Pressekontakt", extracted.press_contact or "") + self.assertIsNone(extracted.extraction_error) + + +if __name__ == "__main__": + unittest.main() diff --git a/docs/PROJECT_PLAN.md b/docs/PROJECT_PLAN.md new file mode 100644 index 0000000..c758f5e --- /dev/null +++ b/docs/PROJECT_PLAN.md @@ -0,0 +1,67 @@ +# Projektplan (Neustart) + +## Leitentscheidungen +- Bestehendes Repository wird weiterverwendet. +- Kein harter Endtermin: lauffaehig werden, dann iterativ verbessern. +- Hetzner bleibt Laufzeitplattform. +- WordPress (IONOS) bleibt vorerst Ziel fuer Publikation. +- Auth initial nur mit einem User/Password. + +## Zielbild +Eine modulare News-Pipeline mit klaren Stufen: +1. Feed-Ingestion +2. Inhaltsanalyse und Normalisierung +3. Rewrite/Anreicherung +4. Legal- und Qualitaetschecks +5. WordPress-Publikation (`pending`) +6. Monitoring/Logging + +## Grobe Zeitplanung (ohne Fixtermine) +- Phase 0: ca. 1 Woche +- Phase 1: ca. 2-4 Wochen +- Phase 2: ca. 2-3 Wochen +- Phase 3: fortlaufend + +## Phasen + +### Phase 0 - Grundlagen (jetzt) +- Doku und Wiki strukturieren +- Source-Policy definieren +- Redirect fuer `news.vanityontour.de` setzen +- GitHub Project als zentrale Planung scharfstellen + +### Phase 1 - MVP Core +- Neues FastAPI-Projektgeruest +- SQLite-Datenmodell (feeds, articles, runs, source_policy) +- Feed-Import mit Duplikaterkennung +- Admin-Login (ein User) +- Manuelle Review vor Publish + +### Phase 2 - Automation +- Job-Queue (asynchron) +- Regelbasierte Scheduler +- Retry/Dead-Letter-Handling +- Robustes Error-Reporting + +### Phase 3 - Compliance und Skalierung +- Source-Whitelisting mit Pflichtfeldern +- Pflicht-Attribution pro Artikel +- Qualitaetsmetriken und Audit-Logs +- Optional: Passkey/WebAuthn + +## Architekturprinzipien +- Idempotente Jobs +- Trennung von UI, API, Worker +- Strikte Validierung bei Quell-/Lizenzdaten +- Expliziter Publish-Schritt, kein blindes Autoposting + +## Risiken +- Lizenz-/Nutzungsbedingungen je Quelle variieren stark +- Feeds aendern Struktur/Verfuegbarkeit +- WordPress-API und Auth koennen regressionsanfaellig sein + +## Erfolgsmetriken +- Zeit von Feed-Eingang bis Review-Ready +- Quote sauber attribuierter Artikel +- Fehlerrate pro Pipeline-Stufe +- Anzahl manueller Eingriffe pro Woche diff --git a/docs/SOURCE_POLICY.md b/docs/SOURCE_POLICY.md new file mode 100644 index 0000000..d1d2e0c --- /dev/null +++ b/docs/SOURCE_POLICY.md @@ -0,0 +1,81 @@ +# Source Policy und Feed-Vorschlaege + +## Grundsatz +Es werden nur Quellen genutzt, deren Nutzungsbedingungen die geplante Nutzung erlauben oder fuer die eine explizite Genehmigung vorliegt. + +## Pflichtdaten pro Quelle +- Quellname +- Feed-URL +- Originalartikel-URL +- Autor/Herausgeber (wenn vorhanden) +- Lizenz/Nutzungsgrundlage +- Einschraenkungen (kommerziell, Bearbeitung, Bildrechte, Archivierung) +- Datum der letzten Pruefung +- Link auf Nutzungsbedingungen + +## Einstufung (Ampel) +- Gruen: Nutzung fuer geplantes Modell klar erlaubt +- Gelb: teilklar/mit Einschraenkungen, manuelle Pruefung erforderlich +- Rot: fuer das Modell nicht geeignet ohne Zusatzvertrag + +## Verbindliche Regeln +- Keine neue Quelle ohne Eintrag im Source-Register +- Kein automatischer Publish bei Gelb/Rot +- Bilder separat pruefen (Textrecht != Bildrecht) +- Quartalsweiser Re-Check der Terms + +## Ersteinschaetzung (Stand: 16.02.2026) + +### Rot +1. Reuters / Thomson Reuters +- Grund: Inhalte sind urheberrechtlich geschuetzt; Reproduktion/Verteilung laut Terms nur mit vorheriger Zustimmung. +- Folge: Nur mit explizitem Vertrag/Lizenz. +- Referenz: + - https://www.thomsonreuters.com/en/terms-of-use + +2. tagesschau.de RSS +- Grund: Inhalte nur privat/nicht-kommerziell; Veroeffentlichung grundsaetzlich nicht erlaubt (ausser explizit CC-lizenziert). +- Folge: Nicht fuer das geplante Modell geeignet. +- Referenz: + - https://www.tagesschau.de/infoservices/rssfeeds + +### Gelb +1. Presseportal / ots +- Grund: Redaktionelle Nutzung grundsaetzlich moeglich, aber Verantwortung liegt beim Verwender; darueber hinausgehende Geschaeftsnutzung nur mit Genehmigung. +- Folge: Nur mit strikter Einzelpruefung pro Meldung (insb. Bild-/Drittrechte). +- Referenz: + - https://www.presseportal.de/nutzungsbedingungen + - https://www.presseportal.de/feeds/ + +2. Bundesbehoerden-RSS ohne explizite freie Weiterverwendungs-Lizenz +- Grund: RSS wird bereitgestellt, aber nicht immer als offene Lizenz zur kommerziellen Nachnutzung formuliert. +- Folge: Je Behoerde einzeln pruefen und dokumentieren. +- Beispiele: + - https://www.bundesfinanzministerium.de/Content/DE/Standardartikel/Service/rss_base.html + - https://bmas.bund.de/EN/Services/RSS/rss.html + +### Gruen (mit korrekter Attribution) +1. GovData / Open-Data-Portale mit `dl-de/by-2-0`, `dl-de/zero-2-0`, `CC BY 4.0` oder `CC0` +- Grund: Diese Lizenzen erlauben grundsaetzlich auch kommerzielle Weiterverwendung (je nach Lizenzbedingungen). +- Folge: Sehr gut fuer stabile Automatisierung geeignet. +- Referenz: + - https://www.govdata.de/dl-de/by-2-0 + - https://data.gov.de/informationen/lizenzen + - https://www.dcat-ap.de/def/licenses/dl-zero-de/2.0 + +2. EU-Quellen mit expliziter `CC BY 4.0` Wiederverwendungsregel +- Grund: EU-Inhalte sind haeufig unter CC BY 4.0 wiederverwendbar, sofern nicht anders gekennzeichnet. +- Folge: Geeignet, wenn Drittinhalte ausgenommen werden. +- Referenz: + - https://commission.europa.eu/legal-notice_en + - https://eur-lex.europa.eu/content/help/content/legal-notice/legal-notice.html + +## Quelle im Register freischalten (Definition of Done) +- Terms-Link hinterlegt +- Lizenzklasse (Gruen/Gelb/Rot) gesetzt +- Pflicht-Attribution dokumentiert +- Bildrechtsregel dokumentiert +- Letzte Pruefung und Verantwortlicher gepflegt + +## Hinweis +Keine Rechtsberatung. Bei unklaren oder wirtschaftlich kritischen Quellen ist eine juristische Prüfung sinnvoll. diff --git a/docs/TODO.md b/docs/TODO.md new file mode 100644 index 0000000..ad9b549 --- /dev/null +++ b/docs/TODO.md @@ -0,0 +1,33 @@ +# ToDo (Ein-Entwickler Setup) + +## Jetzt +- [ ] GitHub Project #3 Felder/Views fuer Neustart vereinheitlichen +- [ ] Alte/obsolet gewordene Issues kennzeichnen (z. B. User-Verwaltung) +- [ ] Redirect `news.vanityontour.de -> vanityontour.de` aktiv halten +- [ ] Wiki-Basis fertigstellen und verlinken + +## MVP +- [x] Neues Backend-Skelett (`backend/`) aufsetzen (FastAPI) +- [x] Datenmodell in SQLite anlegen +- [x] Feed-Ingestion Service bauen (ETag/Last-Modified) +- [x] Duplikaterkennung ueber `source_url`, `guid`, Hash +- [x] Login mit 1 Admin-Account implementieren +- [ ] Artikel-Review-Maske mit Statusworkflow +- [ ] WordPress-Publisher als separaten Service implementieren + +## Recht/Qualitaet +- [ ] Source-Policy in DB + Admin-UI abbilden +- [ ] Pflichtfelder je Quelle erzwingen (Autor, URL, Lizenz, Hinweise) +- [ ] Auto-Block bei fehlender Lizenzinfo +- [ ] Pro Artikel Attribution-Block generieren + +## Betrieb +- [ ] Systemd-Service(s) fuer API/Worker erstellen +- [ ] Nginx-Routing fuer neue App einrichten +- [ ] Healthcheck-Endpunkte + Monitoring einrichten +- [ ] Backup/Restore fuer DB dokumentieren + +## Spaeter +- [ ] Passkey/WebAuthn evaluieren und optional einfuehren +- [ ] Migration auf PostgreSQL bewerten +- [ ] Teilautomatische Freigabe-Regeln definieren diff --git a/docs/wiki/Architektur.md b/docs/wiki/Architektur.md new file mode 100644 index 0000000..275b578 --- /dev/null +++ b/docs/wiki/Architektur.md @@ -0,0 +1,29 @@ +# Architektur + +## Zielarchitektur +- API: FastAPI +- Worker: Queue-basierte Hintergrundjobs +- DB: SQLite (MVP), spaeter optional PostgreSQL +- Publisher: WordPress REST API +- Frontend/Admin: schlanke Web-UI mit Login + +## Pipeline +1. Feed Fetch +2. Parse + Normalize +3. Deduplicate +4. Enrichment (Rewrite/Tags) +5. Legal/Policy Check +6. Publish (pending) + +## Datenobjekte (MVP) +- `sources` +- `feeds` +- `articles` +- `article_versions` +- `runs` +- `policy_checks` + +## Nichtziele (MVP) +- Multi-User und Rollen +- Vollautomatische Freigabe ohne Review +- Komplexe externe SSO-Integration diff --git a/docs/wiki/Deployment.md b/docs/wiki/Deployment.md new file mode 100644 index 0000000..91388c7 --- /dev/null +++ b/docs/wiki/Deployment.md @@ -0,0 +1,20 @@ +# Deployment (Hetzner + CloudPanel) + +## Umgebung +- Host: Hetzner +- Reverse Proxy: Nginx via CloudPanel +- Ziel-Domain: `news.vanityontour.de` + +## Aktueller Zustand +- Domain ist bis zum Go-Live auf `https://vanityontour.de` umgeleitet. + +## Zielzustand +- `news.vanityontour.de` zeigt auf neue App (interner Port, z. B. `127.0.0.1:8501`) +- API/Worker laufen als systemd-Services +- TLS bleibt ueber CloudPanel/Nginx + +## Mindest-Checks nach Deployment +- `curl -I https://news.vanityontour.de` +- Login erreichbar +- Feed-Import laeuft +- WordPress-Testpublikation (pending) erfolgreich diff --git a/docs/wiki/Home.md b/docs/wiki/Home.md new file mode 100644 index 0000000..300599a --- /dev/null +++ b/docs/wiki/Home.md @@ -0,0 +1,19 @@ +# Wiki Home + +## Zweck +Dieses Wiki dokumentiert Architektur, Betrieb, Sicherheit, Recht und Roadmap des Neuaufbaus von `rss-news`. + +## Inhalte +- `Architektur.md` +- `Deployment.md` +- `Security-Auth.md` +- `Recht-Quellen.md` +- `Operations-Runbook.md` +- `Roadmap.md` +- `Project-Board.md` + +## Projektsteuerung +- GitHub Project #3: https://github.com/users/OliverGiertz/projects/3/views/1 + +## Prinzip +Dokumentation wird bei jeder relevanten Aenderung im selben Pull Request aktualisiert. diff --git a/docs/wiki/Operations-Runbook.md b/docs/wiki/Operations-Runbook.md new file mode 100644 index 0000000..32bf5c4 --- /dev/null +++ b/docs/wiki/Operations-Runbook.md @@ -0,0 +1,23 @@ +# Operations Runbook + +## Daily Checks +- App erreichbar +- Queue/Worker aktiv +- Letzte Feed-Laeufe erfolgreich +- Keine auffaelligen Fehler im Log + +## Incident: Feed-Import faellt aus +1. RSS-Quelle erreichbar? +2. Parser-Fehler im Log? +3. Rate Limits oder Blockaden? +4. Retry-Queue pruefen + +## Incident: WordPress Publish faellt aus +1. WP API erreichbar? +2. Credentials gueltig? +3. Payload-Validation/Tag-Fehler? +4. Artikel in `pending` statt `failed` markieren, wenn unklar + +## Backups +- SQLite-Dump taeglich +- Konfiguration und `.env` sicher sichern diff --git a/docs/wiki/Project-Board.md b/docs/wiki/Project-Board.md new file mode 100644 index 0000000..887ac19 --- /dev/null +++ b/docs/wiki/Project-Board.md @@ -0,0 +1,28 @@ +# Project Board Workflow + +## Zentrale Steuerung +- Board: https://github.com/users/OliverGiertz/projects/3/views/1 +- Board ist die einzige Quelle fuer Planungsstatus. + +## Arbeitsmodus (1 Entwickler) +- Neue Arbeit immer als Issue anlegen +- Issue direkt ins Project aufnehmen +- Status nur im Project pflegen +- PR/Commit auf Issue referenzieren + +## Empfohlene Status-Disziplin +- `Todo`: noch nicht begonnen +- `In Progress`: aktiv in Arbeit +- `Done`: umgesetzt und dokumentiert + +## Konventionen fuer Issues +- Prefix fuer Klarheit: + - `[MVP]` + - `[Infra]` + - `[Legal]` + - `[Bug]` +- Definition of Done in jedem Issue notieren + +## Aktueller Backlog-Hinweis +- Thema Userverwaltung ist fuer MVP obsolet (ein Admin-User). +- Entsprechende Issues als `deferred` oder `closed` kennzeichnen. diff --git a/docs/wiki/Recht-Quellen.md b/docs/wiki/Recht-Quellen.md new file mode 100644 index 0000000..212f0d5 --- /dev/null +++ b/docs/wiki/Recht-Quellen.md @@ -0,0 +1,35 @@ +# Recht und Quellen + +## Grundregeln +- Nur freigegebene Quellen aus Source-Register +- Pflicht-Attribution pro Artikel +- Rechte fuer Bilder separat pruefen +- Kein Autopublish bei unklarer Lizenz + +## Bewertungsmodell +- Gruen: Freie Nachnutzung klar erlaubt +- Gelb: Nutzung mit Einschraenkungen/Einzelfallpruefung +- Rot: Ohne Zusatzlizenz nicht geeignet + +## Aktuelle Referenzen +- Reuters/Thomson Reuters Terms: https://www.thomsonreuters.com/en/terms-of-use +- Presseportal Nutzungsbedingungen: https://www.presseportal.de/nutzungsbedingungen +- tagesschau RSS-Hinweise: https://www.tagesschau.de/infoservices/rssfeeds +- Datenlizenz Deutschland BY 2.0: https://www.govdata.de/dl-de/by-2-0 +- GovData Lizenzen: https://data.gov.de/informationen/lizenzen +- EU Legal Notice (CC BY 4.0): https://commission.europa.eu/legal-notice_en + +## Review-Checkliste je Quelle +1. Sind Bearbeitung und Veroeffentlichung erlaubt? +2. Ist kommerzielle Nutzung erlaubt? +3. Gibt es gesonderte Bildrechte? +4. Ist die Quellenangabe vorgeschrieben? +5. Gibt es Archivierungs- oder Weitergabebeschraenkungen? + +## Operativer Schutz +- Source-Register als Pflicht vor Feed-Aktivierung +- Auto-Block bei fehlenden Lizenzdaten +- Quartalsweiser Terms-Recheck + +## Hinweis +Keine Rechtsberatung. Finale Freigabe kritischer Quellen bei Bedarf juristisch validieren. diff --git a/docs/wiki/Roadmap.md b/docs/wiki/Roadmap.md new file mode 100644 index 0000000..fece89e --- /dev/null +++ b/docs/wiki/Roadmap.md @@ -0,0 +1,19 @@ +# Roadmap + +## Jetzt +- Doku und Projektstruktur bereinigen +- Redirect aktiv +- Backlog auf Neustart ausrichten + +## Naechster Schritt +- FastAPI-MVP implementieren +- Login + Feed-Ingestion + Review + WordPress pending + +## Danach +- Worker/Queue +- Source-Policy Enforcement +- Monitoring/Reporting +- Optional Passkey + +## Steuerung +Alle Arbeitsitems liegen im GitHub Project #3. diff --git a/docs/wiki/Security-Auth.md b/docs/wiki/Security-Auth.md new file mode 100644 index 0000000..a9f830a --- /dev/null +++ b/docs/wiki/Security-Auth.md @@ -0,0 +1,16 @@ +# Security und Auth + +## Mindestanforderungen +- Zugriff auf die WebApp nur mit Login +- Ein aktiver Admin-User (kein Rollenmodell im MVP) +- Passwort nicht im Repo, nur als Secret auf Server + +## Empfohlene Umsetzung +- Session-basierte Auth (HTTP-only Cookies) +- Passwort gehasht (Argon2 oder bcrypt) +- Rate Limiting auf Login-Endpunkt +- CSRF-Schutz fuer Form-Aktionen + +## Spaeter (optional) +- Passkey/WebAuthn als zusaetzlicher Login-Faktor +- IP-Allowlist fuer Admin-Zugang diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..c15b448 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +testpaths = backend/tests +python_files = test_*.py +addopts = -q --maxfail=1 diff --git a/scripts/smoke_backend.sh b/scripts/smoke_backend.sh new file mode 100755 index 0000000..f0000ad --- /dev/null +++ b/scripts/smoke_backend.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ -z "${BASE_URL:-}" ]]; then + echo "BASE_URL fehlt (z. B. https://news.vanityontour.de)" + exit 1 +fi + +if [[ -z "${APP_ADMIN_USERNAME:-}" || -z "${APP_ADMIN_PASSWORD:-}" ]]; then + echo "APP_ADMIN_USERNAME/APP_ADMIN_PASSWORD fehlen" + exit 1 +fi + +cookie_file="$(mktemp)" +trap 'rm -f "$cookie_file"' EXIT + +echo "[1/4] Healthcheck" +curl -fsS "${BASE_URL}/health" | grep -q '"status":"ok"' + +echo "[2/4] Login" +curl -fsS -c "$cookie_file" \ + -H "Content-Type: application/json" \ + -X POST "${BASE_URL}/auth/login" \ + -d "{\"username\":\"${APP_ADMIN_USERNAME}\",\"password\":\"${APP_ADMIN_PASSWORD}\"}" \ + | grep -q '"ok":true' + +echo "[3/4] Protected Endpoint" +curl -fsS -b "$cookie_file" "${BASE_URL}/api/protected" | grep -q '"ok":true' + +echo "[4/4] Pipeline Status" +curl -fsS -b "$cookie_file" "${BASE_URL}/api/pipeline/status" | grep -q '"stage":"skeleton+db"' + +echo "Smoke test erfolgreich." From c52363f1a77db579c14697fbaf18ea7456341599 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 09:50:32 +0100 Subject: [PATCH 35/87] feat(admin): add article detail page with legal checklist --- backend/app/admin_ui.py | 84 ++++++++++++++++ backend/templates/admin_article_detail.html | 100 ++++++++++++++++++++ backend/templates/admin_dashboard.html | 1 + backend/tests/test_admin_ui.py | 51 ++++++++++ 4 files changed, 236 insertions(+) create mode 100644 backend/templates/admin_article_detail.html diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index 9587664..bc6d9d9 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -18,6 +18,7 @@ from .repositories import ( create_feed, create_source, get_article_by_id, + get_feed_by_id, list_articles, list_feeds, list_runs, @@ -80,6 +81,57 @@ def _parse_meta_json(raw: str | None) -> dict: return {} +def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]: + meta = article.get("meta", {}) + extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} + attribution = meta.get("attribution") if isinstance(meta.get("attribution"), dict) else {} + + checks: list[dict[str, str]] = [] + checks.append( + { + "label": "Original-Link vorhanden", + "status": "ok" if article.get("source_url") else "missing", + "value": article.get("source_url") or "-", + } + ) + checks.append( + { + "label": "Autor vorhanden", + "status": "ok" if article.get("author") else "missing", + "value": article.get("author") or "-", + } + ) + checks.append( + { + "label": "Bilder extrahiert", + "status": "ok" if extraction.get("images") else "missing", + "value": str(len(extraction.get("images", []))) if isinstance(extraction.get("images"), list) else "0", + } + ) + checks.append( + { + "label": "Pressekontakt", + "status": "ok" if extraction.get("press_contact") else "missing", + "value": extraction.get("press_contact") or "-", + } + ) + checks.append( + { + "label": "Lizenz/Terms", + "status": "ok" if attribution.get("source_license_name") and attribution.get("source_terms_url") else "missing", + "value": f"{attribution.get('source_license_name') or '-'} | {attribution.get('source_terms_url') or '-'}", + } + ) + checks.append( + { + "label": "Risiko-Status Quelle", + "status": "ok" if (feed and feed.get("source_risk_level") == "green") else "missing", + "value": feed.get("source_risk_level") if feed else "-", + } + ) + return checks + + @router.get("/admin", response_class=HTMLResponse) def admin_index(request: Request): user = _admin_user(request) @@ -167,6 +219,38 @@ def admin_dashboard(request: Request): ) +@router.get("/admin/articles/{article_id}", response_class=HTMLResponse) +def admin_article_detail(request: Request, article_id: int): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + article = get_article_by_id(article_id) + if not article: + return _dashboard_redirect(msg=f"Artikel #{article_id} nicht gefunden", msg_type="error") + + meta = _parse_meta_json(article.get("meta_json")) + article["meta"] = meta + extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} + article["extraction"] = extraction + feed = get_feed_by_id(int(article["feed_id"])) if article.get("feed_id") else None + checklist = _legal_checklist(article, feed) + + return templates.TemplateResponse( + request, + "admin_article_detail.html", + { + "request": request, + "title": f"Artikel #{article_id}", + "user": user, + "article": article, + "feed": feed, + "checklist": checklist, + "allowed_transitions": ALLOWED_TRANSITIONS.get(article.get("status"), ()), + }, + ) + + @router.post("/admin/sources/create") def admin_create_source( request: Request, diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html new file mode 100644 index 0000000..098c273 --- /dev/null +++ b/backend/templates/admin_article_detail.html @@ -0,0 +1,100 @@ + + + + + + {{ title }} + + + +
+
+

Artikel-Detail #{{ article.id }}

+

Angemeldet als {{ user }}

+
+
+ Zurück +
+ +
+
+
+ +
+
+

{{ article.title }}

+

Status: {{ article.status }}

+

Autor: {{ article.author or "-" }}

+

Feed: {{ feed.name if feed else "-" }}

+

Quelle: {{ article.source_url }}

+ {% if article.canonical_url %} +

Canonical: {{ article.canonical_url }}

+ {% endif %} + {% if article.summary %} +

Summary: {{ article.summary }}

+ {% endif %} +
+ +
+

Rechts-Checkliste

+ + + + + + {% for c in checklist %} + + + + + + {% endfor %} + +
KriteriumStatusWert
{{ c.label }} + {% if c.status == "ok" %} + OK + {% else %} + Fehlt + {% endif %} + {{ c.value }}
+
+ +
+

Extrahierte Daten

+

Bilder: {{ article.extraction.images|length if article.extraction.images else 0 }}

+ {% if article.extraction.images %} +
    + {% for img in article.extraction.images %} +
  • {{ img }}
  • + {% endfor %} +
+ {% endif %} + {% if article.extraction.press_contact %} +

Pressekontakt

+
{{ article.extraction.press_contact }}
+ {% endif %} + {% if article.extraction.extraction_error %} +

Extraktionsfehler: {{ article.extraction.extraction_error }}

+ {% endif %} +
+ +
+

Volltext

+
{{ article.content_raw or "-" }}
+
+ +
+

Status ändern

+
+ + + +
+
+
+ + diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index 36b30a7..d416d76 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -144,6 +144,7 @@ {{ a.title }}
Autor: {{ a.author or "-" }}
Original öffnen +
Details anzeigen {% if a.canonical_url and a.canonical_url != a.source_url %}
Canonical öffnen {% endif %} diff --git a/backend/tests/test_admin_ui.py b/backend/tests/test_admin_ui.py index c6b2188..a65cbfc 100644 --- a/backend/tests/test_admin_ui.py +++ b/backend/tests/test_admin_ui.py @@ -8,6 +8,7 @@ from fastapi.testclient import TestClient from backend.app import config as config_module from backend.app.db import init_db from backend.app.main import app +from backend.app.repositories import ArticleUpsert, FeedCreate, SourceCreate, create_feed, create_source, upsert_article class TestAdminUi(unittest.TestCase): @@ -60,6 +61,56 @@ class TestAdminUi(unittest.TestCase): self.assertEqual(res.status_code, 303) self.assertTrue(res.headers.get("location", "").startswith("/admin/dashboard")) + def test_article_detail_page_renders(self) -> None: + source_id = create_source( + SourceCreate( + name="Test Source", + base_url="https://example.org", + terms_url="https://example.org/terms", + license_name="cc-by", + risk_level="green", + is_enabled=True, + notes=None, + last_reviewed_at="2026-02-18T00:00:00Z", + ) + ) + feed_id = create_feed( + FeedCreate( + name="Test Feed", + url="https://example.org/feed.xml", + source_id=source_id, + is_enabled=True, + ) + ) + article_id = upsert_article( + ArticleUpsert( + feed_id=feed_id, + source_article_id="id-1", + source_hash="hash-1", + title="Titel A", + source_url="https://example.org/a", + canonical_url="https://example.org/a", + published_at=None, + author="Autor A", + summary="Summary A", + content_raw="Volltext A", + content_rewritten=None, + word_count=2, + status="new", + meta_json='{"extraction":{"images":["https://example.org/img.jpg"],"press_contact":"Kontakt"}}', + ) + ) + + self.client.post( + "/admin/login", + data={"username": "admin", "password": "secret"}, + follow_redirects=True, + ) + res = self.client.get(f"/admin/articles/{article_id}", follow_redirects=True) + self.assertEqual(res.status_code, 200) + self.assertIn("Artikel-Detail", res.text) + self.assertIn("Rechts-Checkliste", res.text) + if __name__ == "__main__": unittest.main() From 5159a6e3b4b757d645550fc1b491dda22fab715e Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 10:02:19 +0100 Subject: [PATCH 36/87] feat(legal): add structured attribution fields and publish legal gate --- backend/app/admin_ui.py | 57 +++++++++++++-- backend/app/db.py | 24 ++++++- backend/app/ingestion.py | 8 +++ backend/app/main.py | 43 ++++++++++++ backend/app/repositories.py | 77 +++++++++++++++++++-- backend/templates/admin_article_detail.html | 31 ++++++++- backend/templates/admin_dashboard.html | 1 + backend/tests/test_admin_ui.py | 8 +++ backend/tests/test_article_workflow.py | 10 +++ backend/tests/test_db_repositories.py | 16 +++++ 10 files changed, 259 insertions(+), 16 deletions(-) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index bc6d9d9..c401ad1 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -23,6 +23,7 @@ from .repositories import ( list_feeds, list_runs, list_sources, + set_article_legal_review, update_article_status, ) @@ -104,22 +105,22 @@ def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]: checks.append( { "label": "Bilder extrahiert", - "status": "ok" if extraction.get("images") else "missing", + "status": "ok" if article.get("image_urls_json") else "missing", "value": str(len(extraction.get("images", []))) if isinstance(extraction.get("images"), list) else "0", } ) checks.append( { "label": "Pressekontakt", - "status": "ok" if extraction.get("press_contact") else "missing", - "value": extraction.get("press_contact") or "-", + "status": "ok" if article.get("press_contact") else "missing", + "value": article.get("press_contact") or extraction.get("press_contact") or "-", } ) checks.append( { "label": "Lizenz/Terms", - "status": "ok" if attribution.get("source_license_name") and attribution.get("source_terms_url") else "missing", - "value": f"{attribution.get('source_license_name') or '-'} | {attribution.get('source_terms_url') or '-'}", + "status": "ok" if article.get("source_license_name_snapshot") and article.get("source_terms_url_snapshot") else "missing", + "value": f"{article.get('source_license_name_snapshot') or attribution.get('source_license_name') or '-'} | {article.get('source_terms_url_snapshot') or attribution.get('source_terms_url') or '-'}", } ) checks.append( @@ -129,6 +130,13 @@ def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]: "value": feed.get("source_risk_level") if feed else "-", } ) + checks.append( + { + "label": "Manuelle Rechtsfreigabe", + "status": "ok" if int(article.get("legal_checked", 0)) == 1 else "missing", + "value": article.get("legal_checked_at") or "-", + } + ) return checks @@ -193,9 +201,20 @@ def admin_dashboard(request: Request): for article in articles: meta = _parse_meta_json(article.get("meta_json")) extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} + images = [] + if article.get("image_urls_json"): + try: + parsed_images = json.loads(article["image_urls_json"]) + if isinstance(parsed_images, list): + images = [str(item) for item in parsed_images if item] + except Exception: + images = [] + if not images and isinstance(extraction.get("images"), list): + images = extraction.get("images") article["meta"] = meta - article["extracted_images"] = extraction.get("images") if isinstance(extraction.get("images"), list) else [] - article["press_contact"] = extraction.get("press_contact") if isinstance(extraction.get("press_contact"), str) else None + article["extracted_images"] = images + if not article.get("press_contact") and isinstance(extraction.get("press_contact"), str): + article["press_contact"] = extraction.get("press_contact") article["extraction_error"] = extraction.get("extraction_error") if isinstance(extraction.get("extraction_error"), str) else None return templates.TemplateResponse( @@ -232,6 +251,15 @@ def admin_article_detail(request: Request, article_id: int): meta = _parse_meta_json(article.get("meta_json")) article["meta"] = meta extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} + if article.get("image_urls_json"): + try: + parsed_images = json.loads(article["image_urls_json"]) + if isinstance(parsed_images, list): + extraction["images"] = [str(item) for item in parsed_images if item] + except Exception: + pass + if not article.get("press_contact") and isinstance(extraction.get("press_contact"), str): + article["press_contact"] = extraction.get("press_contact") article["extraction"] = extraction feed = get_feed_by_id(int(article["feed_id"])) if article.get("feed_id") else None checklist = _legal_checklist(article, feed) @@ -251,6 +279,19 @@ def admin_article_detail(request: Request, article_id: int): ) +@router.post("/admin/articles/{article_id}/legal-review") +def admin_article_legal_review(request: Request, article_id: int, approved: str = Form("0"), note: str = Form("")): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + is_approved = approved == "1" + ok = set_article_legal_review(article_id, approved=is_approved, note=note or None, actor=user) + if not ok: + return _dashboard_redirect(msg=f"Artikel #{article_id} nicht gefunden", msg_type="error") + return RedirectResponse(url=f"/admin/articles/{article_id}", status_code=303) + + @router.post("/admin/sources/create") def admin_create_source( request: Request, @@ -344,6 +385,8 @@ def admin_transition_article(request: Request, article_id: int, target_status: s if article: current = article.get("status") if target_status in ALLOWED_TRANSITIONS.get(current, ()): + if target_status == "published" and int(article.get("legal_checked", 0)) != 1: + return _dashboard_redirect(msg=f"Publish blockiert fuer Artikel #{article_id}: Rechtsfreigabe fehlt", msg_type="error") update_article_status(article_id, target_status, actor=user, note=note or None) return _dashboard_redirect(msg=f"Artikel #{article_id}: {current} -> {target_status}") return _dashboard_redirect(msg=f"Ungueltiger Statuswechsel fuer Artikel #{article_id}", msg_type="error") diff --git a/backend/app/db.py b/backend/app/db.py index c914044..27bbc10 100644 --- a/backend/app/db.py +++ b/backend/app/db.py @@ -81,6 +81,14 @@ def init_db() -> None: summary TEXT, content_raw TEXT, content_rewritten TEXT, + image_urls_json TEXT, + press_contact TEXT, + source_name_snapshot TEXT, + source_terms_url_snapshot TEXT, + source_license_name_snapshot TEXT, + legal_checked INTEGER NOT NULL DEFAULT 0, + legal_checked_at TEXT, + legal_note TEXT, word_count INTEGER DEFAULT 0, status TEXT NOT NULL DEFAULT 'new' CHECK (status IN ('new', 'rewrite', 'review', 'approved', 'published', 'error')), meta_json TEXT, @@ -130,8 +138,20 @@ def init_db() -> None: existing_columns = { row["name"] for row in conn.execute("PRAGMA table_info(articles)").fetchall() } - if "source_hash" not in existing_columns: - conn.execute("ALTER TABLE articles ADD COLUMN source_hash TEXT") + migration_columns = { + "source_hash": "ALTER TABLE articles ADD COLUMN source_hash TEXT", + "image_urls_json": "ALTER TABLE articles ADD COLUMN image_urls_json TEXT", + "press_contact": "ALTER TABLE articles ADD COLUMN press_contact TEXT", + "source_name_snapshot": "ALTER TABLE articles ADD COLUMN source_name_snapshot TEXT", + "source_terms_url_snapshot": "ALTER TABLE articles ADD COLUMN source_terms_url_snapshot TEXT", + "source_license_name_snapshot": "ALTER TABLE articles ADD COLUMN source_license_name_snapshot TEXT", + "legal_checked": "ALTER TABLE articles ADD COLUMN legal_checked INTEGER NOT NULL DEFAULT 0", + "legal_checked_at": "ALTER TABLE articles ADD COLUMN legal_checked_at TEXT", + "legal_note": "ALTER TABLE articles ADD COLUMN legal_note TEXT", + } + for column, ddl in migration_columns.items(): + if column not in existing_columns: + conn.execute(ddl) def rows_to_dicts(rows: list[sqlite3.Row]) -> list[dict[str, Any]]: diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py index 87e44c2..37703de 100644 --- a/backend/app/ingestion.py +++ b/backend/app/ingestion.py @@ -201,6 +201,14 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: summary=final_summary, content_raw=final_content_raw, content_rewritten=None, + image_urls_json=json.dumps(extracted.images, ensure_ascii=False) if extracted.images else None, + press_contact=extracted.press_contact, + source_name_snapshot=feed.get("source_name"), + source_terms_url_snapshot=feed.get("source_terms_url"), + source_license_name_snapshot=feed.get("source_license_name"), + legal_checked=False, + legal_checked_at=None, + legal_note=None, word_count=len((final_content_raw or "").split()), status="new", meta_json=json.dumps({"attribution": attribution, "extraction": extraction_meta}, ensure_ascii=False), diff --git a/backend/app/main.py b/backend/app/main.py index 616dd77..4fe6458 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -28,6 +28,7 @@ from .repositories import ( list_feeds as repo_list_feeds, list_runs, list_sources as repo_list_sources, + set_article_legal_review, update_article_status, upsert_article as repo_upsert_article, ) @@ -96,6 +97,14 @@ class ArticleUpsertRequest(BaseModel): summary: str | None = None content_raw: str | None = None content_rewritten: str | None = None + image_urls_json: str | None = None + press_contact: str | None = None + source_name_snapshot: str | None = None + source_terms_url_snapshot: str | None = None + source_license_name_snapshot: str | None = None + legal_checked: bool = False + legal_checked_at: str | None = None + legal_note: str | None = None word_count: int = 0 status: str = Field(default="new", pattern="^(new|rewrite|review|approved|published|error)$") meta_json: str | None = None @@ -115,6 +124,11 @@ class ArticleReviewRequest(BaseModel): note: str | None = None +class ArticleLegalReviewRequest(BaseModel): + approved: bool + note: str | None = None + + ALLOWED_ARTICLE_TRANSITIONS: dict[str, set[str]] = { "new": {"review", "rewrite", "error"}, "rewrite": {"review", "error"}, @@ -330,6 +344,14 @@ def api_upsert_article(payload: ArticleUpsertRequest, username: str = Depends(re summary=payload.summary, content_raw=payload.content_raw, content_rewritten=payload.content_rewritten, + image_urls_json=payload.image_urls_json, + press_contact=payload.press_contact, + source_name_snapshot=payload.source_name_snapshot, + source_terms_url_snapshot=payload.source_terms_url_snapshot, + source_license_name_snapshot=payload.source_license_name_snapshot, + legal_checked=payload.legal_checked, + legal_checked_at=payload.legal_checked_at, + legal_note=payload.legal_note, word_count=payload.word_count, status=payload.status, meta_json=payload.meta_json, @@ -351,6 +373,11 @@ def api_article_transition(article_id: int, payload: ArticleTransitionRequest, u status_code=status.HTTP_400_BAD_REQUEST, detail=f"Ungueltiger Statuswechsel: {current_status} -> {payload.target_status}", ) + if payload.target_status == "published" and int(article.get("legal_checked", 0)) != 1: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Publish gesperrt: Rechtscheck wurde noch nicht freigegeben", + ) updated = update_article_status(article_id, payload.target_status, actor=username, note=payload.note) if not updated: @@ -358,6 +385,22 @@ def api_article_transition(article_id: int, payload: ArticleTransitionRequest, u return {"ok": True, "id": article_id, "from_status": current_status, "to_status": payload.target_status} +@app.post("/api/articles/{article_id}/legal-review") +def api_article_legal_review(article_id: int, payload: ArticleLegalReviewRequest, username: str = Depends(require_auth)) -> dict: + article = get_article_by_id(article_id) + if not article: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + + updated = set_article_legal_review(article_id, approved=payload.approved, note=payload.note, actor=username) + if not updated: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + return { + "ok": True, + "id": article_id, + "legal_checked": payload.approved, + } + + @app.post("/api/articles/{article_id}/review") def api_article_review(article_id: int, payload: ArticleReviewRequest, username: str = Depends(require_auth)) -> dict: article = get_article_by_id(article_id) diff --git a/backend/app/repositories.py b/backend/app/repositories.py index e170a20..9d9883c 100644 --- a/backend/app/repositories.py +++ b/backend/app/repositories.py @@ -48,6 +48,14 @@ class ArticleUpsert: summary: str | None content_raw: str | None content_rewritten: str | None + image_urls_json: str | None + press_contact: str | None + source_name_snapshot: str | None + source_terms_url_snapshot: str | None + source_license_name_snapshot: str | None + legal_checked: bool + legal_checked_at: str | None + legal_note: str | None word_count: int status: str meta_json: str | None @@ -224,7 +232,10 @@ def get_article_by_id(article_id: int) -> dict[str, Any] | None: row = conn.execute( """ SELECT a.id, a.feed_id, a.source_article_id, a.source_hash, a.title, a.source_url, a.canonical_url, a.published_at, a.author, - a.summary, a.content_raw, a.content_rewritten, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at + a.summary, a.content_raw, a.content_rewritten, a.image_urls_json, a.press_contact, + a.source_name_snapshot, a.source_terms_url_snapshot, a.source_license_name_snapshot, + a.legal_checked, a.legal_checked_at, a.legal_note, + a.word_count, a.status, a.meta_json, a.created_at, a.updated_at FROM articles a WHERE a.id = ? """, @@ -281,6 +292,31 @@ def update_article_status( return True +def set_article_legal_review(article_id: int, approved: bool, note: str | None, actor: str | None = None) -> bool: + article = get_article_by_id(article_id) + if not article: + return False + + event = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event": "legal_review", + "approved": approved, + "actor": actor or "system", + "note": note, + } + merged_meta = _merge_review_event(article.get("meta_json"), event) + with get_conn() as conn: + conn.execute( + """ + UPDATE articles + SET legal_checked = ?, legal_checked_at = datetime('now'), legal_note = ?, meta_json = ? + WHERE id = ? + """, + (1 if approved else 0, note, merged_meta, article_id), + ) + return True + + def _resolve_existing_article_id(payload: ArticleUpsert) -> int | None: with get_conn() as conn: # 1) strongest key: source_url @@ -320,8 +356,11 @@ def upsert_article(payload: ArticleUpsert) -> int: """ INSERT INTO articles ( feed_id, source_article_id, source_hash, title, source_url, canonical_url, published_at, author, - summary, content_raw, content_rewritten, word_count, status, meta_json - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + summary, content_raw, content_rewritten, image_urls_json, press_contact, + source_name_snapshot, source_terms_url_snapshot, source_license_name_snapshot, + legal_checked, legal_checked_at, legal_note, + word_count, status, meta_json + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( payload.feed_id, @@ -335,6 +374,14 @@ def upsert_article(payload: ArticleUpsert) -> int: payload.summary, payload.content_raw, payload.content_rewritten, + payload.image_urls_json, + payload.press_contact, + payload.source_name_snapshot, + payload.source_terms_url_snapshot, + payload.source_license_name_snapshot, + 1 if payload.legal_checked else 0, + payload.legal_checked_at, + payload.legal_note, payload.word_count, payload.status, payload.meta_json, @@ -356,6 +403,14 @@ def upsert_article(payload: ArticleUpsert) -> int: summary = ?, content_raw = ?, content_rewritten = ?, + image_urls_json = ?, + press_contact = ?, + source_name_snapshot = ?, + source_terms_url_snapshot = ?, + source_license_name_snapshot = ?, + legal_checked = ?, + legal_checked_at = ?, + legal_note = ?, word_count = ?, status = ?, meta_json = ? @@ -373,6 +428,14 @@ def upsert_article(payload: ArticleUpsert) -> int: payload.summary, payload.content_raw, payload.content_rewritten, + payload.image_urls_json, + payload.press_contact, + payload.source_name_snapshot, + payload.source_terms_url_snapshot, + payload.source_license_name_snapshot, + 1 if payload.legal_checked else 0, + payload.legal_checked_at, + payload.legal_note, payload.word_count, payload.status, payload.meta_json, @@ -392,7 +455,9 @@ def list_articles(limit: int = 100, status_filter: str | None = None) -> list[di rows = conn.execute( """ SELECT a.id, a.feed_id, a.source_article_id, a.source_hash, a.title, a.source_url, a.canonical_url, a.published_at, a.author, - a.summary, a.content_raw, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at, f.name AS feed_name + a.summary, a.content_raw, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at, f.name AS feed_name, + a.image_urls_json, a.press_contact, a.source_name_snapshot, a.source_terms_url_snapshot, + a.source_license_name_snapshot, a.legal_checked, a.legal_checked_at, a.legal_note FROM articles a LEFT JOIN feeds f ON f.id = a.feed_id WHERE a.status = ? @@ -405,7 +470,9 @@ def list_articles(limit: int = 100, status_filter: str | None = None) -> list[di rows = conn.execute( """ SELECT a.id, a.feed_id, a.source_article_id, a.source_hash, a.title, a.source_url, a.canonical_url, a.published_at, a.author, - a.summary, a.content_raw, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at, f.name AS feed_name + a.summary, a.content_raw, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at, f.name AS feed_name, + a.image_urls_json, a.press_contact, a.source_name_snapshot, a.source_terms_url_snapshot, + a.source_license_name_snapshot, a.legal_checked, a.legal_checked_at, a.legal_note FROM articles a LEFT JOIN feeds f ON f.id = a.feed_id ORDER BY a.id DESC diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index 098c273..62c7e70 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -26,6 +26,9 @@

Status: {{ article.status }}

Autor: {{ article.author or "-" }}

Feed: {{ feed.name if feed else "-" }}

+

Quelle Snapshot: {{ article.source_name_snapshot or "-" }}

+

Lizenz Snapshot: {{ article.source_license_name_snapshot or "-" }}

+

Terms Snapshot: {{ article.source_terms_url_snapshot or "-" }}

Quelle: {{ article.source_url }}

{% if article.canonical_url %}

Canonical: {{ article.canonical_url }}

@@ -69,9 +72,9 @@ {% endfor %} {% endif %} - {% if article.extraction.press_contact %} + {% if article.press_contact or article.extraction.press_contact %}

Pressekontakt

-
{{ article.extraction.press_contact }}
+
{{ article.press_contact or article.extraction.press_contact }}
{% endif %} {% if article.extraction.extraction_error %}

Extraktionsfehler: {{ article.extraction.extraction_error }}

@@ -83,8 +86,32 @@
{{ article.content_raw or "-" }}
+
+

Rechtsfreigabe

+

Freigabe: + {% if article.legal_checked %} + Freigegeben + {% else %} + Nicht freigegeben + {% endif %} +

+

Zeitpunkt: {{ article.legal_checked_at or "-" }}

+

Notiz: {{ article.legal_note or "-" }}

+
+ + + +
+
+

Status ändern

+ {% if not article.legal_checked %} +

Hinweis: `published` ist erst nach manueller Rechtsfreigabe erlaubt.

+ {% endif %}
Reset + Export JSON + Export CSV
@@ -143,6 +145,7 @@
{{ a.title }}
Autor: {{ a.author or "-" }}
+ Datum: {{ a.published_at or "-" }} | Alter: {{ a.days_old if a.days_old is not none else "-" }} Tage | Relevanz: {{ a.relevance }}
Original öffnen
Details anzeigen {% if a.canonical_url and a.canonical_url != a.source_url %} diff --git a/backend/tests/test_api_auth.py b/backend/tests/test_api_auth.py index aa86821..96fbe85 100644 --- a/backend/tests/test_api_auth.py +++ b/backend/tests/test_api_auth.py @@ -72,6 +72,73 @@ class TestApiAuth(unittest.TestCase): self.assertFalse(body["allowed"]) self.assertGreaterEqual(len(body["issues"]), 1) + def test_articles_export_json_and_csv_contains_relevance(self) -> None: + login = self.client.post("/auth/login", json={"username": "admin", "password": "secret"}) + self.assertEqual(login.status_code, 200) + + source = self.client.post( + "/api/sources", + json={ + "name": "Export Source", + "base_url": "https://example.org", + "terms_url": "https://example.org/terms", + "license_name": "cc-by", + "risk_level": "green", + "is_enabled": True, + "last_reviewed_at": "2026-02-18T00:00:00Z", + }, + ) + self.assertEqual(source.status_code, 200) + source_id = source.json()["id"] + + feed = self.client.post( + "/api/feeds", + json={"name": "Export Feed", "url": "https://example.org/feed.xml", "source_id": source_id, "is_enabled": True}, + ) + self.assertEqual(feed.status_code, 200) + feed_id = feed.json()["id"] + + article = self.client.post( + "/api/articles/upsert", + json={ + "feed_id": feed_id, + "source_article_id": "exp-1", + "source_hash": "exp-hash-1", + "title": "Export Artikel", + "source_url": "https://example.org/article/1", + "canonical_url": "https://example.org/article/1", + "published_at": "2026-02-18T00:00:00Z", + "author": "Autor", + "summary": "Kurz", + "content_raw": "Langtext", + "image_urls_json": "[\"https://example.org/img.jpg\"]", + "press_contact": "Kontakt", + "source_name_snapshot": "Export Source", + "source_terms_url_snapshot": "https://example.org/terms", + "source_license_name_snapshot": "cc-by", + "status": "review", + }, + ) + self.assertEqual(article.status_code, 200) + + export_json = self.client.get("/api/articles/export?format=json") + self.assertEqual(export_json.status_code, 200) + body = export_json.json() + self.assertTrue(body.get("ok")) + self.assertGreaterEqual(body.get("count", 0), 1) + first = body["items"][0] + self.assertIn("published_at", first) + self.assertIn("days_old", first) + self.assertIn("relevance", first) + + export_csv = self.client.get("/api/articles/export?format=csv") + self.assertEqual(export_csv.status_code, 200) + self.assertIn("text/csv", export_csv.headers.get("content-type", "")) + csv_text = export_csv.text + self.assertIn("published_at", csv_text) + self.assertIn("days_old", csv_text) + self.assertIn("relevance", csv_text) + if __name__ == "__main__": unittest.main() diff --git a/backend/tests/test_relevance.py b/backend/tests/test_relevance.py new file mode 100644 index 0000000..573e312 --- /dev/null +++ b/backend/tests/test_relevance.py @@ -0,0 +1,21 @@ +from datetime import datetime, timezone +import unittest + +from backend.app.relevance import article_age_days, article_relevance + + +class TestRelevance(unittest.TestCase): + def test_article_age_and_relevance(self) -> None: + now = datetime(2026, 2, 18, 12, 0, 0, tzinfo=timezone.utc) + self.assertEqual(article_age_days("2026-02-18T10:00:00Z", now=now), 0) + self.assertEqual(article_relevance("2026-02-18T10:00:00Z", now=now), "hoch") + + self.assertEqual(article_age_days("2026-02-14T12:00:00Z", now=now), 4) + self.assertEqual(article_relevance("2026-02-14T12:00:00Z", now=now), "mittel") + + self.assertEqual(article_relevance("2025-12-01T00:00:00Z", now=now), "alt") + self.assertEqual(article_relevance(None, now=now), "unbekannt") + + +if __name__ == "__main__": + unittest.main() From efaf132936defbcda5004a5c44c650fe5fef2e58 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 10:11:22 +0100 Subject: [PATCH 38/87] feat(images): add thumbnail gallery with select/exclude workflow --- backend/app/admin_ui.py | 110 +++++++++++++++++--- backend/app/main.py | 13 +++ backend/app/repositories.py | 58 +++++++++++ backend/static/admin.css | 54 ++++++++++ backend/templates/admin_article_detail.html | 45 ++++++-- backend/templates/admin_dashboard.html | 4 + backend/tests/test_admin_ui.py | 22 +++- 7 files changed, 282 insertions(+), 24 deletions(-) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index 44cb7c5..b8a1777 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -2,6 +2,7 @@ from __future__ import annotations import json from pathlib import Path +import re from urllib.parse import urlencode from fastapi import APIRouter, Form, Request @@ -24,6 +25,7 @@ from .repositories import ( list_feeds, list_runs, list_sources, + set_article_image_decision, set_article_legal_review, update_article_status, ) @@ -83,6 +85,63 @@ def _parse_meta_json(raw: str | None) -> dict: return {} +def _read_article_images(article: dict, extraction: dict) -> list[str]: + images: list[str] = [] + if article.get("image_urls_json"): + try: + parsed_images = json.loads(article["image_urls_json"]) + if isinstance(parsed_images, list): + images = [str(item) for item in parsed_images if item] + except Exception: + images = [] + if not images and isinstance(extraction.get("images"), list): + images = [str(item) for item in extraction.get("images") if item] + # deduplicate preserving order + seen: set[str] = set() + deduped: list[str] = [] + for image in images: + if image not in seen: + seen.add(image) + deduped.append(image) + return deduped + + +def _is_probably_irrelevant_image(url: str) -> bool: + lowered = url.lower() + patterns = ( + r"logo", + r"icon", + r"sprite", + r"avatar", + r"favicon", + r"/ads/", + r"tracking", + r"pixel", + r"banner", + ) + return any(re.search(pattern, lowered) for pattern in patterns) + + +def _build_image_entries(article: dict, extraction: dict, meta: dict) -> list[dict[str, object]]: + all_images = _read_article_images(article, extraction) + image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} + selected_url = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None + excluded_urls = image_review.get("excluded_urls") if isinstance(image_review.get("excluded_urls"), list) else [] + excluded_set = {str(item) for item in excluded_urls if item} + + entries: list[dict[str, object]] = [] + for url in all_images: + entries.append( + { + "url": url, + "is_selected": selected_url == url, + "is_excluded": url in excluded_set, + "is_irrelevant_hint": _is_probably_irrelevant_image(url), + } + ) + return entries + + def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]: meta = article.get("meta", {}) extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} @@ -138,6 +197,15 @@ def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]: "value": article.get("legal_checked_at") or "-", } ) + image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} + selected_image = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None + checks.append( + { + "label": "Hauptbild ausgewählt", + "status": "ok" if selected_image else "missing", + "value": selected_image or "-", + } + ) return checks @@ -202,18 +270,12 @@ def admin_dashboard(request: Request): for article in articles: meta = _parse_meta_json(article.get("meta_json")) extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} - images = [] - if article.get("image_urls_json"): - try: - parsed_images = json.loads(article["image_urls_json"]) - if isinstance(parsed_images, list): - images = [str(item) for item in parsed_images if item] - except Exception: - images = [] - if not images and isinstance(extraction.get("images"), list): - images = extraction.get("images") + images = _read_article_images(article, extraction) article["meta"] = meta article["extracted_images"] = images + article["image_entries"] = _build_image_entries(article, extraction, meta) + image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} + article["selected_image_url"] = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None if not article.get("press_contact") and isinstance(extraction.get("press_contact"), str): article["press_contact"] = extraction.get("press_contact") article["extraction_error"] = extraction.get("extraction_error") if isinstance(extraction.get("extraction_error"), str) else None @@ -254,16 +316,13 @@ def admin_article_detail(request: Request, article_id: int): meta = _parse_meta_json(article.get("meta_json")) article["meta"] = meta extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} - if article.get("image_urls_json"): - try: - parsed_images = json.loads(article["image_urls_json"]) - if isinstance(parsed_images, list): - extraction["images"] = [str(item) for item in parsed_images if item] - except Exception: - pass + extraction["images"] = _read_article_images(article, extraction) if not article.get("press_contact") and isinstance(extraction.get("press_contact"), str): article["press_contact"] = extraction.get("press_contact") article["extraction"] = extraction + article["image_entries"] = _build_image_entries(article, extraction, meta) + image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} + article["selected_image_url"] = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None article["days_old"] = article_age_days(article.get("published_at")) article["relevance"] = article_relevance(article.get("published_at")) feed = get_feed_by_id(int(article["feed_id"])) if article.get("feed_id") else None @@ -284,6 +343,23 @@ def admin_article_detail(request: Request, article_id: int): ) +@router.post("/admin/articles/{article_id}/images/decision") +def admin_article_image_decision( + request: Request, + article_id: int, + image_url: str = Form(...), + action: str = Form(...), +): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + ok = set_article_image_decision(article_id=article_id, image_url=image_url, action=action, actor=user) + if not ok: + return _dashboard_redirect(msg=f"Bildaktion fehlgeschlagen fuer Artikel #{article_id}", msg_type="error") + return RedirectResponse(url=f"/admin/articles/{article_id}", status_code=303) + + @router.post("/admin/articles/{article_id}/legal-review") def admin_article_legal_review(request: Request, article_id: int, approved: str = Form("0"), note: str = Form("")): user = _admin_user(request) diff --git a/backend/app/main.py b/backend/app/main.py index 277630b..177c312 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -336,6 +336,17 @@ def api_export_articles( articles = repo_list_articles(limit=500, status_filter=status_filter) rows = [] for article in articles: + meta: dict = {} + if article.get("meta_json"): + try: + parsed = json.loads(article["meta_json"]) + if isinstance(parsed, dict): + meta = parsed + except Exception: + meta = {} + image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} + selected_image_url = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None + days_old = article_age_days(article.get("published_at")) rows.append( { @@ -353,6 +364,7 @@ def api_export_articles( "source_terms_url_snapshot": article.get("source_terms_url_snapshot"), "press_contact": article.get("press_contact"), "image_urls_json": article.get("image_urls_json"), + "selected_image_url": selected_image_url, "legal_checked": bool(int(article.get("legal_checked", 0))), "legal_checked_at": article.get("legal_checked_at"), "legal_note": article.get("legal_note"), @@ -377,6 +389,7 @@ def api_export_articles( "source_terms_url_snapshot", "press_contact", "image_urls_json", + "selected_image_url", "legal_checked", "legal_checked_at", "legal_note", diff --git a/backend/app/repositories.py b/backend/app/repositories.py index 9d9883c..164fc79 100644 --- a/backend/app/repositories.py +++ b/backend/app/repositories.py @@ -262,6 +262,16 @@ def _merge_review_event(meta_json: str | None, event: dict[str, Any]) -> str: return json.dumps(meta, ensure_ascii=False) +def _load_meta(meta_json: str | None) -> dict[str, Any]: + if not meta_json: + return {} + try: + parsed = json.loads(meta_json) + return parsed if isinstance(parsed, dict) else {} + except Exception: + return {} + + def update_article_status( article_id: int, new_status: str, @@ -317,6 +327,54 @@ def set_article_legal_review(article_id: int, approved: bool, note: str | None, return True +def set_article_image_decision(article_id: int, image_url: str, action: str, actor: str | None = None) -> bool: + article = get_article_by_id(article_id) + if not article: + return False + url = (image_url or "").strip() + if not url: + return False + if action not in {"select", "exclude", "restore"}: + return False + + meta = _load_meta(article.get("meta_json")) + image_review = meta.get("image_review") + if not isinstance(image_review, dict): + image_review = {} + + excluded = image_review.get("excluded_urls") + if not isinstance(excluded, list): + excluded = [] + excluded_set = {str(item) for item in excluded if item} + + selected_url = image_review.get("selected_url") + if not isinstance(selected_url, str): + selected_url = None + + if action == "select": + selected_url = url + excluded_set.discard(url) + elif action == "exclude": + excluded_set.add(url) + if selected_url == url: + selected_url = None + elif action == "restore": + excluded_set.discard(url) + + image_review["selected_url"] = selected_url + image_review["excluded_urls"] = sorted(excluded_set) + image_review["updated_at"] = datetime.now(timezone.utc).isoformat() + image_review["updated_by"] = actor or "system" + meta["image_review"] = image_review + + with get_conn() as conn: + conn.execute( + "UPDATE articles SET meta_json = ? WHERE id = ?", + (json.dumps(meta, ensure_ascii=False), article_id), + ) + return True + + def _resolve_existing_article_id(payload: ArticleUpsert) -> int | None: with get_conn() as conn: # 1) strongest key: source_url diff --git a/backend/static/admin.css b/backend/static/admin.css index 348264f..402c067 100644 --- a/backend/static/admin.css +++ b/backend/static/admin.css @@ -179,6 +179,60 @@ button.secondary { background: #f8fafc; } +.thumb { + width: 72px; + height: 72px; + object-fit: cover; + border-radius: 8px; + border: 1px solid #cbd5e1; + margin-top: 6px; +} + +.image-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + gap: 10px; +} + +.image-card { + border: 1px solid #e2e8f0; + border-radius: 8px; + padding: 8px; + background: #fff; +} + +.image-card img { + width: 100%; + height: 120px; + object-fit: cover; + border-radius: 6px; + border: 1px solid #e2e8f0; + background: #f8fafc; +} + +.image-meta { + margin-top: 6px; + display: flex; + gap: 6px; + flex-wrap: wrap; +} + +.image-actions { + margin-top: 8px; + display: flex; + gap: 6px; + flex-wrap: wrap; +} + +.image-selected { + border-color: #10b981; + box-shadow: 0 0 0 1px rgba(16, 185, 129, 0.25); +} + +.image-excluded { + opacity: 0.65; +} + @media (max-width: 920px) { .stats { grid-template-columns: repeat(2, minmax(0, 1fr)); diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index d2b1b67..7acb5c1 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -67,13 +67,46 @@

Extrahierte Daten

-

Bilder: {{ article.extraction.images|length if article.extraction.images else 0 }}

- {% if article.extraction.images %} -
    - {% for img in article.extraction.images %} -
  • {{ img }}
  • +

    Bilder: {{ article.image_entries|length if article.image_entries else 0 }}

    + {% if article.selected_image_url %} +

    Ausgewähltes Hauptbild: {{ article.selected_image_url }}

    + {% endif %} + {% if article.image_entries %} +
    + {% for image in article.image_entries %} +
    + + Artikelbild + +
    + {% if image.is_selected %}Ausgewählt{% endif %} + {% if image.is_excluded %}Ausgeblendet{% endif %} + {% if image.is_irrelevant_hint %}evtl. irrelevant{% endif %} +
    +
    +
    + + + +
    + {% if not image.is_excluded %} +
    + + + +
    + {% else %} +
    + + + +
    + {% endif %} +
    + +
    {% endfor %} -
+ {% endif %} {% if article.press_contact or article.extraction.press_contact %}

Pressekontakt

diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index 27bcaf5..34a0f84 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -155,6 +155,10 @@
{{ a.status }}
Legal: {{ "OK" if a.legal_checked else "offen" }}
+ {% if a.selected_image_url %} +
Hauptbild gesetzt
+ Hauptbild + {% endif %} {% if a.summary %}
Summary: {{ a.summary }}
{% endif %} diff --git a/backend/tests/test_admin_ui.py b/backend/tests/test_admin_ui.py index f52d917..ac8a615 100644 --- a/backend/tests/test_admin_ui.py +++ b/backend/tests/test_admin_ui.py @@ -8,7 +8,15 @@ from fastapi.testclient import TestClient from backend.app import config as config_module from backend.app.db import init_db from backend.app.main import app -from backend.app.repositories import ArticleUpsert, FeedCreate, SourceCreate, create_feed, create_source, upsert_article +from backend.app.repositories import ( + ArticleUpsert, + FeedCreate, + SourceCreate, + create_feed, + create_source, + get_article_by_id, + upsert_article, +) class TestAdminUi(unittest.TestCase): @@ -119,6 +127,18 @@ class TestAdminUi(unittest.TestCase): self.assertIn("Artikel-Detail", res.text) self.assertIn("Rechts-Checkliste", res.text) + decision = self.client.post( + f"/admin/articles/{article_id}/images/decision", + data={"image_url": "https://example.org/img.jpg", "action": "select"}, + follow_redirects=True, + ) + self.assertEqual(decision.status_code, 200) + self.assertIn("Ausgewähltes Hauptbild", decision.text) + + article = get_article_by_id(article_id) + self.assertIsNotNone(article) + self.assertIn("selected_url", article.get("meta_json", "")) + if __name__ == "__main__": unittest.main() From 910ca72c818ebd85b039dce7ef1367204cbc957c Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 10:16:30 +0100 Subject: [PATCH 39/87] fix(ui): render article images via authenticated proxy thumbnails --- backend/app/admin_ui.py | 33 ++++++++++++++++++++- backend/templates/admin_article_detail.html | 5 +++- backend/templates/admin_dashboard.html | 2 +- backend/tests/test_admin_ui.py | 32 ++++++++++++++++++++ 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index b8a1777..04c6db4 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -4,9 +4,10 @@ import json from pathlib import Path import re from urllib.parse import urlencode +from urllib.request import Request as UrlRequest, urlopen from fastapi import APIRouter, Form, Request -from fastapi.responses import HTMLResponse, RedirectResponse +from fastapi.responses import HTMLResponse, RedirectResponse, Response from fastapi.templating import Jinja2Templates from .auth import create_session_token, verify_credentials, verify_session_token @@ -41,6 +42,7 @@ ALLOWED_TRANSITIONS: dict[str, tuple[str, ...]] = { "published": ("error",), "error": ("review", "rewrite"), } +IMAGE_PROXY_USER_AGENT = "rss-news-admin/1.0" def _admin_user(request: Request) -> str | None: @@ -134,6 +136,7 @@ def _build_image_entries(article: dict, extraction: dict, meta: dict) -> list[di entries.append( { "url": url, + "proxy_url": f"/admin/images/proxy?{urlencode({'url': url})}", "is_selected": selected_url == url, "is_excluded": url in excluded_set, "is_irrelevant_hint": _is_probably_irrelevant_image(url), @@ -276,6 +279,9 @@ def admin_dashboard(request: Request): article["image_entries"] = _build_image_entries(article, extraction, meta) image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} article["selected_image_url"] = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None + article["selected_image_proxy_url"] = ( + f"/admin/images/proxy?{urlencode({'url': article['selected_image_url']})}" if article.get("selected_image_url") else None + ) if not article.get("press_contact") and isinstance(extraction.get("press_contact"), str): article["press_contact"] = extraction.get("press_contact") article["extraction_error"] = extraction.get("extraction_error") if isinstance(extraction.get("extraction_error"), str) else None @@ -323,6 +329,9 @@ def admin_article_detail(request: Request, article_id: int): article["image_entries"] = _build_image_entries(article, extraction, meta) image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} article["selected_image_url"] = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None + article["selected_image_proxy_url"] = ( + f"/admin/images/proxy?{urlencode({'url': article['selected_image_url']})}" if article.get("selected_image_url") else None + ) article["days_old"] = article_age_days(article.get("published_at")) article["relevance"] = article_relevance(article.get("published_at")) feed = get_feed_by_id(int(article["feed_id"])) if article.get("feed_id") else None @@ -360,6 +369,28 @@ def admin_article_image_decision( return RedirectResponse(url=f"/admin/articles/{article_id}", status_code=303) +@router.get("/admin/images/proxy") +def admin_image_proxy(request: Request, url: str): + user = _admin_user(request) + if not user: + return Response(status_code=401) + + if not (url.startswith("http://") or url.startswith("https://")): + return Response(status_code=400) + + try: + req = UrlRequest(url=url, headers={"User-Agent": IMAGE_PROXY_USER_AGENT, "Referer": url}) + with urlopen(req, timeout=10) as resp: + body = resp.read() + content_type = resp.headers.get("Content-Type", "application/octet-stream") + except Exception: + return Response(status_code=404) + + if not content_type.lower().startswith("image/"): + return Response(status_code=415) + return Response(content=body, media_type=content_type) + + @router.post("/admin/articles/{article_id}/legal-review") def admin_article_legal_review(request: Request, article_id: int, approved: str = Form("0"), note: str = Form("")): user = _admin_user(request) diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index 7acb5c1..bdfc0af 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -70,13 +70,16 @@

Bilder: {{ article.image_entries|length if article.image_entries else 0 }}

{% if article.selected_image_url %}

Ausgewähltes Hauptbild: {{ article.selected_image_url }}

+ {% if article.selected_image_proxy_url %} + Ausgewähltes Hauptbild + {% endif %} {% endif %} {% if article.image_entries %}
{% for image in article.image_entries %}
- Artikelbild + Artikelbild
{% if image.is_selected %}Ausgewählt{% endif %} diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index 34a0f84..6709f65 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -157,7 +157,7 @@
Legal: {{ "OK" if a.legal_checked else "offen" }}
{% if a.selected_image_url %}
Hauptbild gesetzt
- Hauptbild + Hauptbild {% endif %} {% if a.summary %}
Summary: {{ a.summary }}
diff --git a/backend/tests/test_admin_ui.py b/backend/tests/test_admin_ui.py index ac8a615..666f0ea 100644 --- a/backend/tests/test_admin_ui.py +++ b/backend/tests/test_admin_ui.py @@ -2,6 +2,7 @@ import os import tempfile import unittest from pathlib import Path +from unittest.mock import patch from fastapi.testclient import TestClient @@ -139,6 +140,37 @@ class TestAdminUi(unittest.TestCase): self.assertIsNotNone(article) self.assertIn("selected_url", article.get("meta_json", "")) + @patch("backend.app.admin_ui.urlopen") + def test_image_proxy_returns_image_data(self, mock_urlopen) -> None: + class _FakeHeaders: + def get(self, key: str, default=None): + if key.lower() == "content-type": + return "image/jpeg" + return default + + class _FakeResponse: + headers = _FakeHeaders() + + def read(self): + return b"\xff\xd8\xff\xd9" + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + return False + + mock_urlopen.return_value = _FakeResponse() + + self.client.post( + "/admin/login", + data={"username": "admin", "password": "secret"}, + follow_redirects=True, + ) + res = self.client.get("/admin/images/proxy?url=https%3A%2F%2Fexample.org%2Fimg.jpg") + self.assertEqual(res.status_code, 200) + self.assertIn("image/jpeg", res.headers.get("content-type", "")) + if __name__ == "__main__": unittest.main() From fb3465fb10d860344393fa770307c9b1c36ee321 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 10:20:47 +0100 Subject: [PATCH 40/87] fix(images): add proxy fallback to direct source url rendering --- backend/app/admin_ui.py | 25 ++++++++++++++++----- backend/static/admin.css | 5 +++++ backend/templates/admin_article_detail.html | 2 +- backend/templates/admin_dashboard.html | 2 +- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index 04c6db4..e108d3d 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -3,6 +3,7 @@ from __future__ import annotations import json from pathlib import Path import re +from urllib.parse import urlparse from urllib.parse import urlencode from urllib.request import Request as UrlRequest, urlopen @@ -124,6 +125,14 @@ def _is_probably_irrelevant_image(url: str) -> bool: return any(re.search(pattern, lowered) for pattern in patterns) +def _is_http_image_url(url: str) -> bool: + try: + parsed = urlparse(url) + except Exception: + return False + return parsed.scheme in {"http", "https"} and bool(parsed.netloc) + + def _build_image_entries(article: dict, extraction: dict, meta: dict) -> list[dict[str, object]]: all_images = _read_article_images(article, extraction) image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} @@ -371,15 +380,19 @@ def admin_article_image_decision( @router.get("/admin/images/proxy") def admin_image_proxy(request: Request, url: str): - user = _admin_user(request) - if not user: - return Response(status_code=401) - - if not (url.startswith("http://") or url.startswith("https://")): + if not _is_http_image_url(url): return Response(status_code=400) try: - req = UrlRequest(url=url, headers={"User-Agent": IMAGE_PROXY_USER_AGENT, "Referer": url}) + referer = request.headers.get("referer", "") + req = UrlRequest( + url=url, + headers={ + "User-Agent": IMAGE_PROXY_USER_AGENT, + "Accept": "image/avif,image/webp,image/apng,image/*,*/*;q=0.8", + "Referer": referer or url, + }, + ) with urlopen(req, timeout=10) as resp: body = resp.read() content_type = resp.headers.get("Content-Type", "application/octet-stream") diff --git a/backend/static/admin.css b/backend/static/admin.css index 402c067..705aeda 100644 --- a/backend/static/admin.css +++ b/backend/static/admin.css @@ -210,6 +210,11 @@ button.secondary { background: #f8fafc; } +.img-failed { + opacity: 0.3; + filter: grayscale(1); +} + .image-meta { margin-top: 6px; display: flex; diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index bdfc0af..a38937b 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -79,7 +79,7 @@ {% for image in article.image_entries %}
- Artikelbild + Artikelbild
{% if image.is_selected %}Ausgewählt{% endif %} diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index 6709f65..5dad3f5 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -157,7 +157,7 @@
Legal: {{ "OK" if a.legal_checked else "offen" }}
{% if a.selected_image_url %}
Hauptbild gesetzt
- Hauptbild + Hauptbild {% endif %} {% if a.summary %}
Summary: {{ a.summary }}
From 26e3d26b93b440b5b3460f6023b39ba8b99dddaf Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 10:40:39 +0100 Subject: [PATCH 41/87] feat(images): auto-select relevant article images and tidy detail header --- backend/app/ingestion.py | 82 ++++++++++++++++++++- backend/static/admin.css | 21 ++++++ backend/templates/admin_article_detail.html | 24 +++--- backend/tests/test_ingestion.py | 1 + 4 files changed, 115 insertions(+), 13 deletions(-) diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py index 37703de..8a7696a 100644 --- a/backend/app/ingestion.py +++ b/backend/app/ingestion.py @@ -4,8 +4,10 @@ from dataclasses import dataclass from datetime import datetime, timezone import hashlib import json +import re import time from typing import Any +from urllib.parse import unquote, urlparse import feedparser @@ -67,6 +69,72 @@ def _parsed_get(parsed: object, key: str, default: object = None) -> object: return getattr(parsed, key, default) +def _normalize_tokens(text: str) -> set[str]: + normalized = re.sub(r"[^a-z0-9]+", " ", text.lower()) + return {token for token in normalized.split() if len(token) >= 4} + + +def _rank_image_candidates(source_url: str, title: str, images: list[str]) -> list[dict[str, Any]]: + source_host = (urlparse(source_url).hostname or "").lower() + is_presseportal = "presseportal.de" in source_host + title_tokens = _normalize_tokens(title) + blocked_patterns = ("logo", "badge", "app-store", "google-play", "na-logo", "sprite", "icon", "favicon", "tracking", "pixel") + + ranked: list[dict[str, Any]] = [] + for url in images: + parsed = urlparse(url) + path = unquote(parsed.path.lower()) + full = f"{parsed.netloc.lower()}{path}" + score = 0 + reasons: list[str] = [] + + if any(token in full for token in blocked_patterns): + score -= 150 + reasons.append("blocked-pattern") + + if is_presseportal and "/thumbnail/story_big/" in path: + score += 120 + reasons.append("presseportal-story-big") + elif is_presseportal and "/thumbnail/highlight/" in path: + score += 45 + reasons.append("presseportal-highlight") + elif is_presseportal and "/thumbnail/liste/" in path: + score -= 40 + reasons.append("presseportal-list") + + if "crop=" in (parsed.query or "").lower(): + score -= 10 + reasons.append("cropped-preview") + + path_tokens = _normalize_tokens(path.replace("-", " ")) + overlap = len(title_tokens.intersection(path_tokens)) + if overlap > 0: + score += min(30, overlap * 6) + reasons.append(f"title-match:{overlap}") + + ranked.append({"url": url, "score": score, "reasons": reasons}) + + ranked.sort(key=lambda item: item["score"], reverse=True) + return ranked + + +def _select_relevant_images(source_url: str, title: str, images: list[str], max_keep: int = 3) -> tuple[list[str], str | None, list[dict[str, Any]]]: + # dedupe incoming order first + deduped: list[str] = [] + seen: set[str] = set() + for image in images: + if image and image not in seen: + seen.add(image) + deduped.append(image) + + ranked = _rank_image_candidates(source_url, title, deduped) + kept = [item["url"] for item in ranked if item["score"] > 0][:max_keep] + if not kept and ranked: + kept = [ranked[0]["url"]] + primary = kept[0] if kept else None + return kept, primary, ranked + + def run_ingestion(feed_id: int | None = None) -> IngestionStats: run_id = create_run(RunCreate(run_type="ingestion", status="running", details="started")) feeds_processed = 0 @@ -167,6 +235,12 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: final_summary = extracted.summary or (summary[:1000] if summary else None) final_content_raw = extracted.content_text or content_raw final_canonical = extracted.canonical_url or entry.get("link") + selected_images, primary_image, ranked_images = _select_relevant_images( + link, + final_title, + extracted.images, + max_keep=3, + ) source_hash = _entry_hash( entry, @@ -188,6 +262,12 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: } extraction_meta: dict[str, Any] = extracted_article_to_meta(extracted) extraction_meta["fetched_from"] = link + extraction_meta["image_selection"] = { + "primary": primary_image, + "selected_count": len(selected_images), + "total_candidates": len(extracted.images), + "ranked": ranked_images, + } article_id = upsert_article( ArticleUpsert( feed_id=int(feed["id"]), @@ -201,7 +281,7 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: summary=final_summary, content_raw=final_content_raw, content_rewritten=None, - image_urls_json=json.dumps(extracted.images, ensure_ascii=False) if extracted.images else None, + image_urls_json=json.dumps(selected_images, ensure_ascii=False) if selected_images else None, press_contact=extracted.press_contact, source_name_snapshot=feed.get("source_name"), source_terms_url_snapshot=feed.get("source_terms_url"), diff --git a/backend/static/admin.css b/backend/static/admin.css index 705aeda..16d55be 100644 --- a/backend/static/admin.css +++ b/backend/static/admin.css @@ -179,6 +179,27 @@ button.secondary { background: #f8fafc; } +.detail-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 8px 12px; + margin-bottom: 10px; +} + +.detail-item { + background: #f8fafc; + border: 1px solid #e2e8f0; + border-radius: 8px; + padding: 8px; + display: grid; + gap: 4px; +} + +.detail-item .k { + font-size: 12px; + color: #64748b; +} + .thumb { width: 72px; height: 72px; diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index a38937b..29c054b 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -23,19 +23,19 @@

{{ article.title }}

-

Status: {{ article.status }}

-

Artikel-Datum: {{ article.published_at or "-" }}

-

Alter: {{ article.days_old if article.days_old is not none else "-" }} Tage

-

Relevanz: {{ article.relevance }}

-

Autor: {{ article.author or "-" }}

-

Feed: {{ feed.name if feed else "-" }}

-

Quelle Snapshot: {{ article.source_name_snapshot or "-" }}

-

Lizenz Snapshot: {{ article.source_license_name_snapshot or "-" }}

-

Terms Snapshot: {{ article.source_terms_url_snapshot or "-" }}

+
+
Status{{ article.status }}
+
Artikel-Datum{{ article.published_at or "-" }}
+
Alter{{ article.days_old if article.days_old is not none else "-" }} Tage
+
Relevanz{{ article.relevance }}
+
Autor{{ article.author or "-" }}
+
Feed{{ feed.name if feed else "-" }}
+
Quelle Snapshot{{ article.source_name_snapshot or "-" }}
+
Lizenz Snapshot{{ article.source_license_name_snapshot or "-" }}
+
Terms Snapshot{{ article.source_terms_url_snapshot or "-" }}
+

Quelle: {{ article.source_url }}

- {% if article.canonical_url %} -

Canonical: {{ article.canonical_url }}

- {% endif %} + {% if article.canonical_url %}

Canonical: {{ article.canonical_url }}

{% endif %} {% if article.summary %}

Summary: {{ article.summary }}

{% endif %} diff --git a/backend/tests/test_ingestion.py b/backend/tests/test_ingestion.py index 05b2c2b..342c216 100644 --- a/backend/tests/test_ingestion.py +++ b/backend/tests/test_ingestion.py @@ -85,6 +85,7 @@ class TestIngestion(unittest.TestCase): self.assertEqual(article["author"], "Autorin A") self.assertIn("Original Volltext", article["content_raw"] or "") self.assertIn("Pressekontakt", article["meta_json"] or "") + self.assertIsNotNone(article["image_urls_json"]) @patch("backend.app.ingestion.extract_article") @patch("backend.app.ingestion.feedparser.parse") From dcdf4d954a78b6a32c6f89a29d128f0eabc783ae Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 10:43:17 +0100 Subject: [PATCH 42/87] feat(ui): show auto image ranking reasons in article detail --- backend/app/admin_ui.py | 1 + backend/templates/admin_article_detail.html | 23 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index e108d3d..f276b8c 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -335,6 +335,7 @@ def admin_article_detail(request: Request, article_id: int): if not article.get("press_contact") and isinstance(extraction.get("press_contact"), str): article["press_contact"] = extraction.get("press_contact") article["extraction"] = extraction + article["image_selection"] = extraction.get("image_selection") if isinstance(extraction.get("image_selection"), dict) else {} article["image_entries"] = _build_image_entries(article, extraction, meta) image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} article["selected_image_url"] = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index 29c054b..86fb7af 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -75,6 +75,29 @@ {% endif %} {% endif %} {% if article.image_entries %} + {% if article.image_selection %} +
+ Automatische Bildauswahl (Score + Gründe) +
Primärbild (Auto): {{ article.image_selection.primary or "-" }}
+
Ausgewählt: {{ article.image_selection.selected_count or 0 }} / Kandidaten: {{ article.image_selection.total_candidates or 0 }}
+ {% if article.image_selection.ranked %} + + + + + + {% for r in article.image_selection.ranked %} + + + + + + {% endfor %} + +
BildScoreGründe
{{ r.url }}{{ r.score }}{{ r.reasons|join(", ") if r.reasons else "-" }}
+ {% endif %} +
+ {% endif %}
{% for image in article.image_entries %}
From 1cee56205e3febeb40f3142c0539a977d6a6c9bf Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 10:49:43 +0100 Subject: [PATCH 43/87] feat(publisher): add wordpress draft queue with retry and admin controls --- backend/app/admin_ui.py | 32 ++++ backend/app/config.py | 5 + backend/app/db.py | 50 ++++++ backend/app/ingestion.py | 5 + backend/app/main.py | 50 ++++++ backend/app/publisher.py | 103 ++++++++++++ backend/app/repositories.py | 177 +++++++++++++++++++- backend/app/wordpress.py | 111 ++++++++++++ backend/templates/admin_article_detail.html | 25 +++ backend/templates/admin_dashboard.html | 37 ++++ backend/tests/test_admin_ui.py | 5 + backend/tests/test_db_repositories.py | 10 ++ backend/tests/test_publisher.py | 112 +++++++++++++ 13 files changed, 719 insertions(+), 3 deletions(-) create mode 100644 backend/app/publisher.py create mode 100644 backend/app/wordpress.py create mode 100644 backend/tests/test_publisher.py diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index f276b8c..8d8e879 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -15,6 +15,7 @@ from .auth import create_session_token, verify_credentials, verify_session_token from .config import get_settings from .ingestion import run_ingestion from .policy import evaluate_source_policy +from .publisher import enqueue_publish, run_publisher from .relevance import article_age_days, article_relevance from .repositories import ( FeedCreate, @@ -25,6 +26,7 @@ from .repositories import ( get_feed_by_id, list_articles, list_feeds, + list_publish_jobs, list_runs, list_sources, set_article_image_decision, @@ -273,6 +275,7 @@ def admin_dashboard(request: Request): source_policy = {s["id"]: evaluate_source_policy(s) for s in sources} feeds = list_feeds() runs = list_runs(limit=30) + publish_jobs = list_publish_jobs(limit=30) status_filter = request.query_params.get("status_filter") if status_filter in {"new", "rewrite", "review", "approved", "published", "error"}: articles = list_articles(limit=100, status_filter=status_filter) @@ -308,6 +311,7 @@ def admin_dashboard(request: Request): "source_policy": source_policy, "feeds": feeds, "runs": runs, + "publish_jobs": publish_jobs, "articles": articles, "status_options": ["new", "rewrite", "review", "approved", "published", "error"], "allowed_transitions": ALLOWED_TRANSITIONS, @@ -358,6 +362,8 @@ def admin_article_detail(request: Request, article_id: int): "feed": feed, "checklist": checklist, "allowed_transitions": ALLOWED_TRANSITIONS.get(article.get("status"), ()), + "flash_msg": request.query_params.get("msg", ""), + "flash_type": request.query_params.get("type", "success"), }, ) @@ -379,6 +385,32 @@ def admin_article_image_decision( return RedirectResponse(url=f"/admin/articles/{article_id}", status_code=303) +@router.post("/admin/articles/{article_id}/publish-enqueue") +def admin_enqueue_publish(request: Request, article_id: int, max_attempts: str = Form("3")): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + try: + job_id = enqueue_publish(article_id=article_id, max_attempts=max(1, int(max_attempts))) + except Exception as exc: + return _dashboard_redirect(msg=f"Publish Queue Fehler fuer Artikel #{article_id}: {exc}", msg_type="error") + return RedirectResponse(url=f"/admin/articles/{article_id}?msg=Publish-Job%20#{job_id}%20erstellt&type=success", status_code=303) + + +@router.post("/admin/publisher/run") +def admin_run_publisher(request: Request, max_jobs: str = Form("10")): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + try: + stats = run_publisher(max_jobs=max(1, int(max_jobs))) + except Exception as exc: + return _dashboard_redirect(msg=f"Publisher Fehler: {exc}", msg_type="error") + return _dashboard_redirect( + msg=f"Publisher: processed={stats.processed}, success={stats.success}, failed={stats.failed}, requeued={stats.requeued}" + ) + + @router.get("/admin/images/proxy") def admin_image_proxy(request: Request, url: str): if not _is_http_image_url(url): diff --git a/backend/app/config.py b/backend/app/config.py index f32b8c4..40deedb 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -23,6 +23,11 @@ class Settings(BaseSettings): app_db_path: str = "backend/data/rss_news.db" + wordpress_base_url: str | None = None + wordpress_username: str | None = None + wordpress_app_password: str | None = None + wordpress_default_status: str = "draft" + @lru_cache(maxsize=1) def get_settings() -> Settings: diff --git a/backend/app/db.py b/backend/app/db.py index 27bbc10..d2ebfd5 100644 --- a/backend/app/db.py +++ b/backend/app/db.py @@ -68,6 +68,21 @@ def init_db() -> None: details TEXT ); + CREATE TABLE IF NOT EXISTS publish_jobs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + article_id INTEGER NOT NULL, + status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'success', 'failed')), + attempts INTEGER NOT NULL DEFAULT 0, + max_attempts INTEGER NOT NULL DEFAULT 3, + error_message TEXT, + wp_post_id INTEGER, + wp_post_url TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + started_at TEXT, + finished_at TEXT, + FOREIGN KEY(article_id) REFERENCES articles(id) ON DELETE CASCADE + ); + CREATE TABLE IF NOT EXISTS articles ( id INTEGER PRIMARY KEY AUTOINCREMENT, feed_id INTEGER, @@ -89,6 +104,11 @@ def init_db() -> None: legal_checked INTEGER NOT NULL DEFAULT 0, legal_checked_at TEXT, legal_note TEXT, + wp_post_id INTEGER, + wp_post_url TEXT, + publish_attempts INTEGER NOT NULL DEFAULT 0, + publish_last_error TEXT, + published_to_wp_at TEXT, word_count INTEGER DEFAULT 0, status TEXT NOT NULL DEFAULT 'new' CHECK (status IN ('new', 'rewrite', 'review', 'approved', 'published', 'error')), meta_json TEXT, @@ -110,6 +130,7 @@ def init_db() -> None: CREATE INDEX IF NOT EXISTS idx_feeds_source_id ON feeds(source_id); CREATE INDEX IF NOT EXISTS idx_runs_started_at ON runs(started_at); CREATE INDEX IF NOT EXISTS idx_articles_published_at ON articles(published_at); + CREATE INDEX IF NOT EXISTS idx_publish_jobs_status_created_at ON publish_jobs(status, created_at); CREATE TRIGGER IF NOT EXISTS trg_sources_updated_at AFTER UPDATE ON sources @@ -148,11 +169,40 @@ def init_db() -> None: "legal_checked": "ALTER TABLE articles ADD COLUMN legal_checked INTEGER NOT NULL DEFAULT 0", "legal_checked_at": "ALTER TABLE articles ADD COLUMN legal_checked_at TEXT", "legal_note": "ALTER TABLE articles ADD COLUMN legal_note TEXT", + "wp_post_id": "ALTER TABLE articles ADD COLUMN wp_post_id INTEGER", + "wp_post_url": "ALTER TABLE articles ADD COLUMN wp_post_url TEXT", + "publish_attempts": "ALTER TABLE articles ADD COLUMN publish_attempts INTEGER NOT NULL DEFAULT 0", + "publish_last_error": "ALTER TABLE articles ADD COLUMN publish_last_error TEXT", + "published_to_wp_at": "ALTER TABLE articles ADD COLUMN published_to_wp_at TEXT", } for column, ddl in migration_columns.items(): if column not in existing_columns: conn.execute(ddl) + table_rows = conn.execute( + "SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'publish_jobs'" + ).fetchall() + if not table_rows: + conn.executescript( + """ + CREATE TABLE IF NOT EXISTS publish_jobs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + article_id INTEGER NOT NULL, + status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'success', 'failed')), + attempts INTEGER NOT NULL DEFAULT 0, + max_attempts INTEGER NOT NULL DEFAULT 3, + error_message TEXT, + wp_post_id INTEGER, + wp_post_url TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + started_at TEXT, + finished_at TEXT, + FOREIGN KEY(article_id) REFERENCES articles(id) ON DELETE CASCADE + ); + CREATE INDEX IF NOT EXISTS idx_publish_jobs_status_created_at ON publish_jobs(status, created_at); + """ + ) + def rows_to_dicts(rows: list[sqlite3.Row]) -> list[dict[str, Any]]: return [dict(r) for r in rows] diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py index 8a7696a..872a1b0 100644 --- a/backend/app/ingestion.py +++ b/backend/app/ingestion.py @@ -289,6 +289,11 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: legal_checked=False, legal_checked_at=None, legal_note=None, + wp_post_id=None, + wp_post_url=None, + publish_attempts=0, + publish_last_error=None, + published_to_wp_at=None, word_count=len((final_content_raw or "").split()), status="new", meta_json=json.dumps({"attribution": attribution, "extraction": extraction_meta}, ensure_ascii=False), diff --git a/backend/app/main.py b/backend/app/main.py index 177c312..c0a0143 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -16,6 +16,7 @@ from .config import get_settings from .db import init_db from .ingestion import run_ingestion from .policy import evaluate_source_policy, is_source_allowed +from .publisher import enqueue_publish, run_publisher from .relevance import article_age_days, article_relevance from .repositories import ( ArticleUpsert, @@ -30,6 +31,7 @@ from .repositories import ( get_feed_by_id, get_run_by_id, get_source_by_id, + list_publish_jobs, list_articles as repo_list_articles, list_feeds as repo_list_feeds, list_runs, @@ -111,6 +113,11 @@ class ArticleUpsertRequest(BaseModel): legal_checked: bool = False legal_checked_at: str | None = None legal_note: str | None = None + wp_post_id: int | None = None + wp_post_url: str | None = None + publish_attempts: int = 0 + publish_last_error: str | None = None + published_to_wp_at: str | None = None word_count: int = 0 status: str = Field(default="new", pattern="^(new|rewrite|review|approved|published|error)$") meta_json: str | None = None @@ -135,6 +142,15 @@ class ArticleLegalReviewRequest(BaseModel): note: str | None = None +class PublisherEnqueueRequest(BaseModel): + article_id: int + max_attempts: int = 3 + + +class PublisherRunRequest(BaseModel): + max_jobs: int = 10 + + ALLOWED_ARTICLE_TRANSITIONS: dict[str, set[str]] = { "new": {"review", "rewrite", "error"}, "rewrite": {"review", "error"}, @@ -446,6 +462,11 @@ def api_upsert_article(payload: ArticleUpsertRequest, username: str = Depends(re legal_checked=payload.legal_checked, legal_checked_at=payload.legal_checked_at, legal_note=payload.legal_note, + wp_post_id=payload.wp_post_id, + wp_post_url=payload.wp_post_url, + publish_attempts=payload.publish_attempts, + publish_last_error=payload.publish_last_error, + published_to_wp_at=payload.published_to_wp_at, word_count=payload.word_count, status=payload.status, meta_json=payload.meta_json, @@ -495,6 +516,35 @@ def api_article_legal_review(article_id: int, payload: ArticleLegalReviewRequest } +@app.get("/api/publisher/jobs") +def api_publisher_jobs(limit: int = 100, username: str = Depends(require_auth)) -> dict: + return {"ok": True, "items": list_publish_jobs(limit=limit), "requested_by": username} + + +@app.post("/api/publisher/enqueue") +def api_publisher_enqueue(payload: PublisherEnqueueRequest, username: str = Depends(require_auth)) -> dict: + article = get_article_by_id(payload.article_id) + if not article: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + job_id = enqueue_publish(article_id=payload.article_id, max_attempts=payload.max_attempts) + return {"ok": True, "job_id": job_id, "article_id": payload.article_id, "requested_by": username} + + +@app.post("/api/publisher/run") +def api_publisher_run(payload: PublisherRunRequest, username: str = Depends(require_auth)) -> dict: + stats = run_publisher(max_jobs=payload.max_jobs) + return { + "ok": True, + "requested_by": username, + "stats": { + "processed": stats.processed, + "success": stats.success, + "failed": stats.failed, + "requeued": stats.requeued, + }, + } + + @app.post("/api/articles/{article_id}/review") def api_article_review(article_id: int, payload: ArticleReviewRequest, username: str = Depends(require_auth)) -> dict: article = get_article_by_id(article_id) diff --git a/backend/app/publisher.py b/backend/app/publisher.py new file mode 100644 index 0000000..06cc8f2 --- /dev/null +++ b/backend/app/publisher.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from .repositories import ( + claim_next_publish_job, + complete_publish_job, + create_publish_job, + fail_publish_job, + get_article_by_id, + mark_article_publish_result, + PublishJobCreate, +) +from .wordpress import publish_article_draft, selected_image_exists + + +@dataclass(frozen=True) +class PublisherStats: + processed: int + success: int + failed: int + requeued: int + + +def enqueue_publish(article_id: int, max_attempts: int = 3) -> int: + return create_publish_job(PublishJobCreate(article_id=article_id, max_attempts=max_attempts)) + + +def _can_publish(article: dict) -> tuple[bool, str | None]: + if article.get("status") not in {"approved", "published"}: + return False, "Artikelstatus muss 'approved' sein" + if int(article.get("legal_checked", 0)) != 1: + return False, "Rechtsfreigabe fehlt" + if not selected_image_exists(article): + return False, "Hauptbild nicht gesetzt" + return True, None + + +def run_publisher(max_jobs: int = 10) -> PublisherStats: + processed = 0 + success = 0 + failed = 0 + requeued = 0 + + for _ in range(max(1, max_jobs)): + job = claim_next_publish_job() + if not job: + break + processed += 1 + job_id = int(job["id"]) + article_id = int(job["article_id"]) + + article = get_article_by_id(article_id) + if not article: + fail_publish_job(job_id, "Artikel nicht gefunden", requeue=False) + failed += 1 + continue + + allowed, reason = _can_publish(article) + if not allowed: + fail_publish_job(job_id, reason or "Publish-Bedingungen nicht erfüllt", requeue=False) + mark_article_publish_result( + article_id, + wp_post_id=article.get("wp_post_id"), + wp_post_url=article.get("wp_post_url"), + error=reason or "blocked", + increment_attempts=True, + set_published_status=False, + ) + failed += 1 + continue + + try: + wp_post_id, wp_post_url = publish_article_draft(article) + complete_publish_job(job_id, wp_post_id=wp_post_id, wp_post_url=wp_post_url) + mark_article_publish_result( + article_id, + wp_post_id=wp_post_id, + wp_post_url=wp_post_url, + error=None, + increment_attempts=True, + set_published_status=True, + ) + success += 1 + except Exception as exc: + attempts = int(job.get("attempts", 1)) + max_attempts = int(job.get("max_attempts", 3)) + should_requeue = attempts < max_attempts + fail_publish_job(job_id, str(exc), requeue=should_requeue) + mark_article_publish_result( + article_id, + wp_post_id=article.get("wp_post_id"), + wp_post_url=article.get("wp_post_url"), + error=str(exc), + increment_attempts=True, + set_published_status=False, + ) + if should_requeue: + requeued += 1 + else: + failed += 1 + + return PublisherStats(processed=processed, success=success, failed=failed, requeued=requeued) diff --git a/backend/app/repositories.py b/backend/app/repositories.py index 164fc79..ca25821 100644 --- a/backend/app/repositories.py +++ b/backend/app/repositories.py @@ -56,11 +56,22 @@ class ArticleUpsert: legal_checked: bool legal_checked_at: str | None legal_note: str | None + wp_post_id: int | None + wp_post_url: str | None + publish_attempts: int + publish_last_error: str | None + published_to_wp_at: str | None word_count: int status: str meta_json: str | None +@dataclass(frozen=True) +class PublishJobCreate: + article_id: int + max_attempts: int = 3 + + def create_source(payload: SourceCreate) -> int: with get_conn() as conn: cur = conn.execute( @@ -235,6 +246,7 @@ def get_article_by_id(article_id: int) -> dict[str, Any] | None: a.summary, a.content_raw, a.content_rewritten, a.image_urls_json, a.press_contact, a.source_name_snapshot, a.source_terms_url_snapshot, a.source_license_name_snapshot, a.legal_checked, a.legal_checked_at, a.legal_note, + a.wp_post_id, a.wp_post_url, a.publish_attempts, a.publish_last_error, a.published_to_wp_at, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at FROM articles a WHERE a.id = ? @@ -375,6 +387,147 @@ def set_article_image_decision(article_id: int, image_url: str, action: str, act return True +def create_publish_job(payload: PublishJobCreate) -> int: + with get_conn() as conn: + existing = conn.execute( + """ + SELECT id FROM publish_jobs + WHERE article_id = ? AND status IN ('queued', 'running') + ORDER BY id DESC + LIMIT 1 + """, + (payload.article_id,), + ).fetchone() + if existing: + return int(existing["id"]) + + cur = conn.execute( + """ + INSERT INTO publish_jobs (article_id, status, attempts, max_attempts) + VALUES (?, 'queued', 0, ?) + """, + (payload.article_id, max(1, payload.max_attempts)), + ) + return int(cur.lastrowid) + + +def list_publish_jobs(limit: int = 100) -> list[dict[str, Any]]: + safe_limit = max(1, min(limit, 500)) + with get_conn() as conn: + rows = conn.execute( + """ + SELECT j.id, j.article_id, j.status, j.attempts, j.max_attempts, j.error_message, j.wp_post_id, j.wp_post_url, + j.created_at, j.started_at, j.finished_at, a.title AS article_title + FROM publish_jobs j + LEFT JOIN articles a ON a.id = j.article_id + ORDER BY j.id DESC + LIMIT ? + """, + (safe_limit,), + ).fetchall() + return rows_to_dicts(rows) + + +def claim_next_publish_job() -> dict[str, Any] | None: + with get_conn() as conn: + row = conn.execute( + """ + SELECT id, article_id, status, attempts, max_attempts, error_message, wp_post_id, wp_post_url + FROM publish_jobs + WHERE status = 'queued' AND attempts < max_attempts + ORDER BY id ASC + LIMIT 1 + """ + ).fetchone() + if not row: + return None + job_id = int(row["id"]) + conn.execute( + """ + UPDATE publish_jobs + SET status = 'running', + attempts = attempts + 1, + started_at = datetime('now'), + finished_at = NULL + WHERE id = ? + """, + (job_id,), + ) + claimed = conn.execute( + """ + SELECT id, article_id, status, attempts, max_attempts, error_message, wp_post_id, wp_post_url + FROM publish_jobs + WHERE id = ? + """, + (job_id,), + ).fetchone() + return dict(claimed) if claimed else None + + +def complete_publish_job(job_id: int, wp_post_id: int | None, wp_post_url: str | None) -> None: + with get_conn() as conn: + conn.execute( + """ + UPDATE publish_jobs + SET status = 'success', + wp_post_id = ?, + wp_post_url = ?, + error_message = NULL, + finished_at = datetime('now') + WHERE id = ? + """, + (wp_post_id, wp_post_url, job_id), + ) + + +def fail_publish_job(job_id: int, error_message: str, requeue: bool) -> None: + next_status = "queued" if requeue else "failed" + with get_conn() as conn: + conn.execute( + """ + UPDATE publish_jobs + SET status = ?, + error_message = ?, + finished_at = datetime('now') + WHERE id = ? + """, + (next_status, error_message[:2000], job_id), + ) + + +def mark_article_publish_result( + article_id: int, + *, + wp_post_id: int | None, + wp_post_url: str | None, + error: str | None, + increment_attempts: bool, + set_published_status: bool, +) -> None: + with get_conn() as conn: + conn.execute( + """ + UPDATE articles + SET wp_post_id = ?, + wp_post_url = ?, + publish_attempts = CASE WHEN ? THEN publish_attempts + 1 ELSE publish_attempts END, + publish_last_error = ?, + published_to_wp_at = CASE WHEN ? IS NOT NULL THEN datetime('now') ELSE published_to_wp_at END, + status = CASE WHEN ? THEN 'published' ELSE status END + WHERE id = ? + """, + ( + wp_post_id, + wp_post_url, + 1 if increment_attempts else 0, + error[:2000] if error else None, + wp_post_id, + 1 if set_published_status else 0, + article_id, + ), + ) + + def _resolve_existing_article_id(payload: ArticleUpsert) -> int | None: with get_conn() as conn: # 1) strongest key: source_url @@ -417,8 +570,9 @@ def upsert_article(payload: ArticleUpsert) -> int: summary, content_raw, content_rewritten, image_urls_json, press_contact, source_name_snapshot, source_terms_url_snapshot, source_license_name_snapshot, legal_checked, legal_checked_at, legal_note, + wp_post_id, wp_post_url, publish_attempts, publish_last_error, published_to_wp_at, word_count, status, meta_json - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( payload.feed_id, @@ -440,6 +594,11 @@ def upsert_article(payload: ArticleUpsert) -> int: 1 if payload.legal_checked else 0, payload.legal_checked_at, payload.legal_note, + payload.wp_post_id, + payload.wp_post_url, + payload.publish_attempts, + payload.publish_last_error, + payload.published_to_wp_at, payload.word_count, payload.status, payload.meta_json, @@ -469,6 +628,11 @@ def upsert_article(payload: ArticleUpsert) -> int: legal_checked = ?, legal_checked_at = ?, legal_note = ?, + wp_post_id = ?, + wp_post_url = ?, + publish_attempts = ?, + publish_last_error = ?, + published_to_wp_at = ?, word_count = ?, status = ?, meta_json = ? @@ -494,6 +658,11 @@ def upsert_article(payload: ArticleUpsert) -> int: 1 if payload.legal_checked else 0, payload.legal_checked_at, payload.legal_note, + payload.wp_post_id, + payload.wp_post_url, + payload.publish_attempts, + payload.publish_last_error, + payload.published_to_wp_at, payload.word_count, payload.status, payload.meta_json, @@ -515,7 +684,8 @@ def list_articles(limit: int = 100, status_filter: str | None = None) -> list[di SELECT a.id, a.feed_id, a.source_article_id, a.source_hash, a.title, a.source_url, a.canonical_url, a.published_at, a.author, a.summary, a.content_raw, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at, f.name AS feed_name, a.image_urls_json, a.press_contact, a.source_name_snapshot, a.source_terms_url_snapshot, - a.source_license_name_snapshot, a.legal_checked, a.legal_checked_at, a.legal_note + a.source_license_name_snapshot, a.legal_checked, a.legal_checked_at, a.legal_note, + a.wp_post_id, a.wp_post_url, a.publish_attempts, a.publish_last_error, a.published_to_wp_at FROM articles a LEFT JOIN feeds f ON f.id = a.feed_id WHERE a.status = ? @@ -530,7 +700,8 @@ def list_articles(limit: int = 100, status_filter: str | None = None) -> list[di SELECT a.id, a.feed_id, a.source_article_id, a.source_hash, a.title, a.source_url, a.canonical_url, a.published_at, a.author, a.summary, a.content_raw, a.word_count, a.status, a.meta_json, a.created_at, a.updated_at, f.name AS feed_name, a.image_urls_json, a.press_contact, a.source_name_snapshot, a.source_terms_url_snapshot, - a.source_license_name_snapshot, a.legal_checked, a.legal_checked_at, a.legal_note + a.source_license_name_snapshot, a.legal_checked, a.legal_checked_at, a.legal_note, + a.wp_post_id, a.wp_post_url, a.publish_attempts, a.publish_last_error, a.published_to_wp_at FROM articles a LEFT JOIN feeds f ON f.id = a.feed_id ORDER BY a.id DESC diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py new file mode 100644 index 0000000..adb4d9c --- /dev/null +++ b/backend/app/wordpress.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +import base64 +import json +from typing import Any +from urllib.request import Request, urlopen + +from .config import get_settings + + +def _auth_header(username: str, app_password: str) -> str: + token = base64.b64encode(f"{username}:{app_password}".encode("utf-8")).decode("ascii") + return f"Basic {token}" + + +def _wp_request( + *, + base_url: str, + auth_header: str, + method: str, + endpoint: str, + payload: dict[str, Any] | None = None, +) -> dict[str, Any]: + url = f"{base_url.rstrip('/')}/wp-json/wp/v2/{endpoint.lstrip('/')}" + data = json.dumps(payload).encode("utf-8") if payload is not None else None + req = Request( + url=url, + data=data, + method=method, + headers={ + "Authorization": auth_header, + "Content-Type": "application/json; charset=utf-8", + "Accept": "application/json", + "User-Agent": "rss-news-publisher/1.0", + }, + ) + with urlopen(req, timeout=20) as resp: + raw = resp.read().decode("utf-8", errors="replace") + parsed = json.loads(raw) if raw else {} + return parsed if isinstance(parsed, dict) else {} + + +def _selected_image_url_from_meta(meta_json: str | None) -> str | None: + if not meta_json: + return None + try: + meta = json.loads(meta_json) + except Exception: + return None + if not isinstance(meta, dict): + return None + image_review = meta.get("image_review") + if not isinstance(image_review, dict): + return None + selected = image_review.get("selected_url") + return selected if isinstance(selected, str) and selected.strip() else None + + +def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: + settings = get_settings() + if not settings.wordpress_base_url or not settings.wordpress_username or not settings.wordpress_app_password: + raise RuntimeError("WordPress Konfiguration fehlt (base_url, username, app_password)") + + auth = _auth_header(settings.wordpress_username, settings.wordpress_app_password) + + source_url = article.get("source_url") or "" + canonical_url = article.get("canonical_url") or source_url + title = (article.get("title") or "Ohne Titel").strip() + body = (article.get("content_rewritten") or article.get("content_raw") or "").strip() + if not body: + body = article.get("summary") or "" + + footer = "\n\n
\n

Quelle: " + footer += f"{source_url}

" + if canonical_url and canonical_url != source_url: + footer += f"\n

Canonical: {canonical_url}

" + content = f"{body}{footer}" + + payload = { + "title": title, + "content": content, + "status": settings.wordpress_default_status, + } + + wp_post_id = article.get("wp_post_id") + if wp_post_id: + result = _wp_request( + base_url=settings.wordpress_base_url, + auth_header=auth, + method="POST", + endpoint=f"posts/{int(wp_post_id)}", + payload=payload, + ) + else: + result = _wp_request( + base_url=settings.wordpress_base_url, + auth_header=auth, + method="POST", + endpoint="posts", + payload=payload, + ) + + post_id = int(result.get("id", 0)) + if post_id <= 0: + raise RuntimeError(f"WordPress Antwort ohne Post-ID: {result}") + post_url = result.get("link") + return post_id, post_url if isinstance(post_url, str) else None + + +def selected_image_exists(article: dict[str, Any]) -> bool: + return _selected_image_url_from_meta(article.get("meta_json")) is not None diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index 86fb7af..a5943ef 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -21,6 +21,12 @@
+ {% if flash_msg %} +
+ {{ flash_msg }} +
+ {% endif %} +

{{ article.title }}

@@ -39,6 +45,16 @@ {% if article.summary %}

Summary: {{ article.summary }}

{% endif %} +

WordPress Post: + {% if article.wp_post_url %} + #{{ article.wp_post_id }} + {% elif article.wp_post_id %} + #{{ article.wp_post_id }} + {% else %} + - + {% endif %} +

+

Publish Attempts: {{ article.publish_attempts or 0 }} | Letzter Fehler: {{ article.publish_last_error or "-" }}

@@ -184,6 +200,15 @@
+ +
+

WordPress Publish Queue

+

Voraussetzungen: Status `approved`, Rechtsfreigabe aktiv, Hauptbild gesetzt.

+
+ + +
+
diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index 5dad3f5..d47628f 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -91,6 +91,14 @@
+
+

Publisher ausführen

+
+ + +
+
+

Quellen + Policy

@@ -239,6 +247,35 @@
+ +
+

Publish Jobs

+ + + + + + {% for j in publish_jobs %} + + + + + + + + + {% endfor %} + +
IDArtikelStatusAttemptsWP PostFehler
{{ j.id }}#{{ j.article_id }} {{ j.article_title or "-" }}{{ j.status }}{{ j.attempts }}/{{ j.max_attempts }} + {% if j.wp_post_url %} + #{{ j.wp_post_id }} + {% elif j.wp_post_id %} + #{{ j.wp_post_id }} + {% else %} + - + {% endif %} + {{ j.error_message or "-" }}
+
diff --git a/backend/tests/test_admin_ui.py b/backend/tests/test_admin_ui.py index 666f0ea..af47046 100644 --- a/backend/tests/test_admin_ui.py +++ b/backend/tests/test_admin_ui.py @@ -112,6 +112,11 @@ class TestAdminUi(unittest.TestCase): legal_checked=False, legal_checked_at=None, legal_note=None, + wp_post_id=None, + wp_post_url=None, + publish_attempts=0, + publish_last_error=None, + published_to_wp_at=None, word_count=2, status="new", meta_json='{"extraction":{"images":["https://example.org/img.jpg"],"press_contact":"Kontakt"}}', diff --git a/backend/tests/test_db_repositories.py b/backend/tests/test_db_repositories.py index 5b60358..91436c6 100644 --- a/backend/tests/test_db_repositories.py +++ b/backend/tests/test_db_repositories.py @@ -85,6 +85,11 @@ class TestSQLiteRepositories(unittest.TestCase): legal_checked=False, legal_checked_at=None, legal_note=None, + wp_post_id=None, + wp_post_url=None, + publish_attempts=0, + publish_last_error=None, + published_to_wp_at=None, word_count=120, status="review", meta_json='{"lang":"de"}', @@ -114,6 +119,11 @@ class TestSQLiteRepositories(unittest.TestCase): legal_checked=True, legal_checked_at="2026-02-18T00:10:00Z", legal_note="ok", + wp_post_id=123, + wp_post_url="https://example.org/wp/123", + publish_attempts=1, + publish_last_error=None, + published_to_wp_at="2026-02-18T00:12:00Z", word_count=140, status="approved", meta_json='{"lang":"de","v":2}', diff --git a/backend/tests/test_publisher.py b/backend/tests/test_publisher.py new file mode 100644 index 0000000..a32150e --- /dev/null +++ b/backend/tests/test_publisher.py @@ -0,0 +1,112 @@ +import os +import tempfile +import unittest +from pathlib import Path +from unittest.mock import patch + +from fastapi.testclient import TestClient + +from backend.app import config as config_module +from backend.app.db import init_db +from backend.app.main import app + + +class TestPublisher(unittest.TestCase): + def setUp(self) -> None: + self.tmp_dir = tempfile.TemporaryDirectory() + os.environ["APP_DB_PATH"] = str(Path(self.tmp_dir.name) / "publisher.db") + os.environ["APP_ADMIN_USERNAME"] = "admin" + os.environ["APP_ADMIN_PASSWORD"] = "secret" + os.environ["WORDPRESS_BASE_URL"] = "https://example.org" + os.environ["WORDPRESS_USERNAME"] = "wp-user" + os.environ["WORDPRESS_APP_PASSWORD"] = "wp-pass" + config_module.get_settings.cache_clear() + init_db() + self.client = TestClient(app) + self.client.post("/auth/login", json={"username": "admin", "password": "secret"}) + + def tearDown(self) -> None: + config_module.get_settings.cache_clear() + for key in ( + "APP_DB_PATH", + "APP_ADMIN_USERNAME", + "APP_ADMIN_PASSWORD", + "WORDPRESS_BASE_URL", + "WORDPRESS_USERNAME", + "WORDPRESS_APP_PASSWORD", + ): + os.environ.pop(key, None) + self.tmp_dir.cleanup() + + def _create_publishable_article(self) -> int: + source = self.client.post( + "/api/sources", + json={ + "name": "WP Source", + "base_url": "https://example.org", + "terms_url": "https://example.org/terms", + "license_name": "cc-by", + "risk_level": "green", + "is_enabled": True, + "last_reviewed_at": "2026-02-18T00:00:00Z", + }, + ) + source_id = source.json()["id"] + feed = self.client.post( + "/api/feeds", + json={"name": "WP Feed", "url": "https://example.org/feed.xml", "source_id": source_id, "is_enabled": True}, + ) + feed_id = feed.json()["id"] + + article = self.client.post( + "/api/articles/upsert", + json={ + "feed_id": feed_id, + "source_article_id": "pub-1", + "source_hash": "pub-hash-1", + "title": "Publish Artikel", + "source_url": "https://example.org/article/1", + "canonical_url": "https://example.org/article/1", + "published_at": "2026-02-18T00:00:00Z", + "author": "Autor", + "summary": "Kurz", + "content_raw": "Langtext", + "image_urls_json": "[\"https://example.org/img.jpg\"]", + "press_contact": "Kontakt", + "source_name_snapshot": "WP Source", + "source_terms_url_snapshot": "https://example.org/terms", + "source_license_name_snapshot": "cc-by", + "legal_checked": True, + "status": "approved", + "meta_json": "{\"image_review\":{\"selected_url\":\"https://example.org/img.jpg\"}}", + }, + ) + return article.json()["id"] + + @patch("backend.app.publisher.publish_article_draft") + def test_enqueue_and_run_publisher(self, mock_publish) -> None: + mock_publish.return_value = (777, "https://example.org/?p=777") + article_id = self._create_publishable_article() + + enqueue = self.client.post("/api/publisher/enqueue", json={"article_id": article_id, "max_attempts": 3}) + self.assertEqual(enqueue.status_code, 200) + + run = self.client.post("/api/publisher/run", json={"max_jobs": 5}) + self.assertEqual(run.status_code, 200) + stats = run.json()["stats"] + self.assertEqual(stats["success"], 1) + + article = self.client.get(f"/api/articles/{article_id}") + self.assertEqual(article.status_code, 200) + item = article.json()["item"] + self.assertEqual(item["status"], "published") + self.assertEqual(item["wp_post_id"], 777) + self.assertIn("?p=777", item["wp_post_url"] or "") + + jobs = self.client.get("/api/publisher/jobs") + self.assertEqual(jobs.status_code, 200) + self.assertGreaterEqual(len(jobs.json()["items"]), 1) + + +if __name__ == "__main__": + unittest.main() From 592d6991664f716c866c9fcaee9fbe69583c7534 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 11:00:57 +0100 Subject: [PATCH 44/87] chore(config): load shared rss-news .env for wordpress and keys --- backend/app/config.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/backend/app/config.py b/backend/app/config.py index 40deedb..e194bcc 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -1,5 +1,7 @@ from functools import lru_cache +from pathlib import Path +from dotenv import load_dotenv from pydantic_settings import BaseSettings, SettingsConfigDict @@ -31,4 +33,13 @@ class Settings(BaseSettings): @lru_cache(maxsize=1) def get_settings() -> Settings: + # Prefer shared legacy env from the original rss-news workspace if present. + env_candidates = ( + Path("/Users/oliver/Documents/rss-news/.env"), + Path("backend/.env"), + Path(".env"), + ) + for env_path in env_candidates: + if env_path.exists(): + load_dotenv(env_path, override=False) return Settings() From fee5e76842b92d2b42c086b683ad913400a8717e Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 11:03:53 +0100 Subject: [PATCH 45/87] feat(ui): add publish readiness indicators and WP env key aliases --- backend/app/admin_ui.py | 19 +++++++++++++++++++ backend/app/config.py | 7 ++++--- backend/templates/admin_article_detail.html | 15 +++++++++++++-- backend/templates/admin_dashboard.html | 4 ++++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index 8d8e879..fba1b91 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -156,6 +156,19 @@ def _build_image_entries(article: dict, extraction: dict, meta: dict) -> list[di return entries +def _publish_readiness(article: dict, meta: dict) -> tuple[bool, list[str]]: + reasons: list[str] = [] + if article.get("status") not in {"approved", "published"}: + reasons.append("Status ist nicht 'approved'") + if int(article.get("legal_checked", 0)) != 1: + reasons.append("Rechtsfreigabe fehlt") + image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} + selected_image = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None + if not selected_image: + reasons.append("Hauptbild nicht ausgewählt") + return len(reasons) == 0, reasons + + def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]: meta = article.get("meta", {}) extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} @@ -287,6 +300,9 @@ def admin_dashboard(request: Request): extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} images = _read_article_images(article, extraction) article["meta"] = meta + ready, reasons = _publish_readiness(article, meta) + article["publish_ready"] = ready + article["publish_blockers"] = reasons article["extracted_images"] = images article["image_entries"] = _build_image_entries(article, extraction, meta) image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} @@ -339,6 +355,9 @@ def admin_article_detail(request: Request, article_id: int): if not article.get("press_contact") and isinstance(extraction.get("press_contact"), str): article["press_contact"] = extraction.get("press_contact") article["extraction"] = extraction + publish_ready, publish_blockers = _publish_readiness(article, meta) + article["publish_ready"] = publish_ready + article["publish_blockers"] = publish_blockers article["image_selection"] = extraction.get("image_selection") if isinstance(extraction.get("image_selection"), dict) else {} article["image_entries"] = _build_image_entries(article, extraction, meta) image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} diff --git a/backend/app/config.py b/backend/app/config.py index e194bcc..fc52ec3 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -2,6 +2,7 @@ from functools import lru_cache from pathlib import Path from dotenv import load_dotenv +from pydantic import AliasChoices, Field from pydantic_settings import BaseSettings, SettingsConfigDict @@ -25,9 +26,9 @@ class Settings(BaseSettings): app_db_path: str = "backend/data/rss_news.db" - wordpress_base_url: str | None = None - wordpress_username: str | None = None - wordpress_app_password: str | None = None + wordpress_base_url: str | None = Field(default=None, validation_alias=AliasChoices("WORDPRESS_BASE_URL", "WP_BASE_URL")) + wordpress_username: str | None = Field(default=None, validation_alias=AliasChoices("WORDPRESS_USERNAME", "WP_USERNAME")) + wordpress_app_password: str | None = Field(default=None, validation_alias=AliasChoices("WORDPRESS_APP_PASSWORD", "WP_PASSWORD")) wordpress_default_status: str = "draft" diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index a5943ef..6f06d36 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -203,10 +203,21 @@

WordPress Publish Queue

-

Voraussetzungen: Status `approved`, Rechtsfreigabe aktiv, Hauptbild gesetzt.

+ {% if article.publish_ready %} +

Publish bereit

+ {% else %} +

Publish blockiert

+ {% if article.publish_blockers %} +
    + {% for reason in article.publish_blockers %} +
  • {{ reason }}
  • + {% endfor %} +
+ {% endif %} + {% endif %}
- +
diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index d47628f..fe811a5 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -163,6 +163,10 @@
{{ a.status }}
Legal: {{ "OK" if a.legal_checked else "offen" }}
+
Publish: {{ "bereit" if a.publish_ready else "blockiert" }}
+ {% if not a.publish_ready and a.publish_blockers %} +
{{ a.publish_blockers|join(", ") }}
+ {% endif %} {% if a.selected_image_url %}
Hauptbild gesetzt
Hauptbild From ba83b245101d88624bdcec9769fe743fe1513a86 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Wed, 18 Feb 2026 11:11:49 +0100 Subject: [PATCH 46/87] chore: finalize current state and prepare next wordpress-focused roadmap --- backend/data/rss_news.db | Bin 94208 -> 204800 bytes docs/PROJECT_PLAN.md | 26 +++++++++++++++++++++++++- docs/TODO.md | 25 +++++++++++++++---------- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/backend/data/rss_news.db b/backend/data/rss_news.db index 1b1c3900225265e8b460abed889fc85eda838c00..792930712d0b6bc67bf4176b67dc08588b62428c 100644 GIT binary patch literal 204800 zcmeFadyE}dn%LLPH(NvY?9OVLi7anTuV=-c>AHREzHjR_O|nUG_#AdqoQIW0)vc=A zSA8Enb?;@1RD>OBG~Uc6UL)RQU~kqtjy=i#u}I*+wvxcg0x@F)LA*&8@djA~c3|xv z!2+?7AdZ1x11G=lJ5~45x0~IRsF6lfnjzU;k5lJ-=R4o~vHG>Ejb31dov7vZto+nx zrw$#O`if;uO-;@7Cl~)Y#J_)4}kd zJS8LRrL%(<=fCwCMt*i=KK6yd5l9B!8-6GE z{p85PM!^(Me|UHPSH61e_?c&)o&L3Y&-I!?^6li`p{m!X+x?;%d%Dth`=3OEJ965GShfpZeY+p@4dyU%yV0%--gNu5TF~vvkD=RWa(_1*0zG3X_XU?3N{{Be?zMw}}|2i@Te!cX>;2#spA-SHM zaocU}yFCff8}5z4&B@Uk-Swa?tYyd`68T|3HJr)UfLeVIh&J7BZ@ty=8)1V%cjpKC zOl>2mZ4M9c5R`(J2n~hq~W`x0~CUGljbT`+V!QEhoC^10#=k5i~ zCafpnmLo4H$E-&|&=wLFKgUne9+d1LXKWWv-tP1QLzpI~uLmd!ghhYyPS60~LEWD@ zc8b3bpZ2F_qtpM4f71U_2&525A&^2Kg+K~{6apy(QV66FNFk6yAcepOhQNbkhd(p* z`IVJt&YYb3LOy>p!n_!4^m<#}rNzbV?d{B#UfJqIJ-30Po>fS{R4aszNe6g^U z-8l)l^x&!KQ&YtUPfbk$jvceG&bzHG?68meV$|&}@+Y@`x7W>V^xk;++b`D4TffwF z+x3S3qNBhWpN&&p%4c`EbZYjWP92^7+lOZV;p`vJ{)^eaKl`^o@HVF}rVvOWkU}7Z zKnj5r0x1Mi2&525A&^2Kg+K~{6ar5Y0<%XCfAM4-?6>}U$LoIP$l+(Flfbl@r=|}- zGaW~Z9OkaA^3dTk(;B#P=)~c}Pftr=+R>mZ{{KU#|Hahoukcs;UkZT~0x1Mi z2&525A&^2Kg+K~{6apy(QV66F_!L3l!Dk5rnEr(av+94(AHLJsXtz3EqxqO__wD4p zf#ZGD!CqY|I7?1$^b(N?rKRlHrTD4s>Ca4^{QQHbn9(34;4x>jGYDYEhqFuB{4SSf z_~4=0{?zPy{FVNfLLh}e3V{>?DFjjoq!36UkU}7ZKnj5r0x1Mi2s}9mTs-n%cKR{Z z`$=QNq4P&D7(C`MJFNub|37;C$8e^mpbX|UJ5t?C zE^c)w$aHVL(e3sFnbEiAh6S9$V58ZShsJ6)4X;WuvC%q5=FV%puw&KZi_X5aV2v(S z!1N)OIw=~BFE-vrxwvCm6PxkYYj3@C?8w0oA)j3;?C|Btr4$jU`S|HTgu@3x1a;~; z#Ze*=UrH&$rvnk*-aKRw;hp-USOdFWSjvx4g!s~Kh#=&B2Q}J3Bx9neGTO8@-V4xO2ru0J^S;7Yyz@;BZ&^Q&)8O@HotjeP#lqeRB7)}m7^I@$bUDd%Jh zStnn03vMY__G|fSzEmhzyoz7U1y0Q`N6{`6{H7EwTV!7fMYQ>V9FZ!iw)ytQ{ ztXHetbfe8KqN7Fm&xh~Ukr+36*7>N@?b_$1Ja%-?mPdm2lC{!kTUV&S-Lb-l??u*y zpx^7(HmF`f4f=;akU^q=*R6irw^nN#6wwUYkF}P^dN|?S*}|IREERK<5BYMIaG7kQ z9d^F5qc(|kcE^SJ!MZQCyjPYiYw-I=0|)Ec!}r=0=WQ=og^YDE@S?sOS+WM}{qOwx z;Oh%kquuV@b$gAwY{_a6-KFZP+x8lPY>|T9Z`2zUT%n4o*_Q=N@Aj-^s$PfgMifL# z3_|7eRcEUT`f&3157q z?lOUhb1z*Fw!2ZM(|Tdied)CqyvSO7=>@-W*Xs7}HG>!D!e+^*N$p7jwBv5azv-U2`4RE>x?b?fGuS&K0XcpbrD;8p z)IXM+kD@dquP_Ny6ZtXT8P&PvwYc)p$f(1r$8uk*{>a@<#K~^cT>&iJ-0y>vFpT9+ ztMFMVIip13i)El{|e<&u38E5#oVRl!}n^N-Fg7M+@Jx*{eH`O z6^hyJHQLxx>PyzmPPbR<_pr+=U28O(pcN>&(vLdOWb1m+ z@AjgA_5$}Gg*$A^*is(n*#SVyYgvp_z_{=@3@v8I!Q|qWtP2m{!?e}(J5jhevJ&fT zr`MggY*=|T1|di`mA(wWsR!E+-`!}7U|_*Qz9}qTcnGgtZ3JGhVEG+xDQ~*(ZZuT} zpqM_;YzG^yAo`NwM)JZW+`R|_O(!dE0%aeIThOw;3Kz5P(j$cP&aVO6wq*Hk*Q&ei z`&K>bJp5r`nO)9Uxk`R?cLv`x>}_wTJRYwb+tnXCtJAMPNlsVxOQp~as&=*%7VJX4 zRJ6Tnv1FIMe3m{ExpFmITfEk3yFHH4HXHcGTsGM}eoT(dqj}&@Db^jB3GTqD$K!!7 zY`ye?N-Zzli1`Ncx^~Cmjra)b?|CpbX^#WJGr}MowQISXy*>r{UsyB)zp%LV z(z%q??xg7hews)cAC}WP#X`fe_fRRpO;pC zpPQEW|C!T2J2l&!T{``az_s`C6=3$ zMN~@Va_Pu{-pG{-4ldbjp_t1ZKFAwmPTWI_hl59^1njgyr27A-_8_MVOCgX#Aca5* zffNEM1X2j35J(}ALLh~}J`gyF&Y9}}pDO+T)XLQ9GpGLTQ@?-uwb{ROYGt;6`j1cl z_1VRJ5GB2xLLh}e3V{>?DFjjoq!36UkU}7ZKnj7MJ_xKFd2njFS_=Fy7Z$TMFXxvX zznCxPE3R9qR7<6z?|5#pQ1N^xtX5p76c)*i2=m!OA?M|aq#$|u8671b)WWb-saDHw zv63y7%3&>A!JnNihT+RoiC^@9)){5DxTP~1O=$3ph>v*M;I!e*?b1uKt zf>PjlIj>g8=G=nM%qqN7_Om7a336mYRlQtLs%8sb(ecTJ3dq-Risch#E>5K!R4Tc! zKvI+&1hssv8s|$d34xB2uSr^RIa{sxK_x6ykLoBqn)h|pztynEooU+ee1;wzE^~u^S=gLRSTtYAFvS(zK zG4pazB+)FFEeF6L$mUt9=lCUNUkxio^3H&CCCIvYH(x6`uIpD0o4N2vtrECFA*|#b zr(7-i%&rWUxM5KB0b)5@V&}?EP|lIemUq1}Ls7)PSaGYl>Y)o@-AOKI^ZC%JF-Yj= z!4#+Fc)mx7MwX2zd!>A(>Xn0>8~PO{=#r6BW7wJ(6dcdVs{jAgznYp2XLG0i)$DJa z&Yk|tr^DI*{`CKM`uBeN4syEU6apy(QV66FNFk6yAca5*ffNEM1X2imS|N}>GF_kE zw@lc$xBp=8jK}-uj!XyperG)5|1m$KG5^ky>Ds=Z8H@Tq(8R{${tq^>@yP!JzB3m4 zf3SDPqyGUwaB{!>9IF;#^#9cV|7ktp>AF$~q!36UkU}7ZKnj5r0x1Mi2&52r!Vpk@ zZtDL}{r^9q{{PwEnVS87sQUlMv;TDV4`+XW_P?F|uV?>DE~fvb5J(}ALLh}e3V{>? zDFjjoq!36UkU}7ZKnj5r0zYmDoI3mq(_4M7+30Qr{><^ipPQzo!pZpG6Y;;t?DFjjoq!36UkU}7ZKnj763Ib;i=cg%PShBM@+o@RD>Qcd3qRrss^?Y`zkUO&T zdSxkBT5^hqce!3z%I6OK{Nen`(eZgcyW~_f|NrzKOr8FN)Bo4(&&)2)UYp&V{r>E4 z&;GsHKl-SanvR=7Aca5*ffNEM1X2j35J(}ALLh}e3V{>?DFmJf1fD(ovgp!9+i`5C zu$C<^WwT4U!k76wo1GcETUpCi-UbLF*cX{lJ`0dx28@NUk| z7S5S?wZr!g{ewfDLr+h?H+^;L(mwn0_My)nf2R7(iSIt&iyHNM5cQ(^dbiV$YC(6s zzva8Vz+ZQJ@s;zpR+iURthHO0FI`%>W$pg#j5YG#^2IeCynXY6ym#Ze6%RD_%*7kG ztd-^SuUNNk+!?!ZZspSD>tk1B>~rnT_H*;romW%GViqkH=-X$t!0^$CFnUe`EPxOk)ItIIa!%ZyVvg~zn+>H zJh>A;I0hB-?)-x@w^uB)3wyjX zw$s-5w+&Ea4Y z`^|gz*LTcq6sh!uhQGk6`qlYk$Im?b?DW6)#h&XmgXEjZzsKWmuPvXux-!5@>+Fuf zEjcEaudl7h>ArdE^0nn#->|N%e8XD4y>{dBbq2Y%a(!)K;;nch$*YqO#IPI!#adhW z`Yr>F!hH89dW~K)(6z?OxFCtw-+meoqA3QKQGhdpx(@iTw3ir{C@+8)02oxww4$>YA0ET$MR{ zI@AD?gXfM)ubC3JYMlEP}gI$Mc26a%g zwh`1egW<_cNYP-svJ2MOlQ64zdggMw(=%sg!P?$h-|BRG(4_=PhSvs1z>2qzae6^( zt0$Xph{A54P9AQ$jH`Pce|&%h>%Go8A5La9K|hcHRxV$q ztj64^;m->Nzp!$31z|$?zR=@Iq%w>lVO}h1oW9S$egEk3GfzJ~{k=O%D}{;5pJQV* zQm#BP`p97Gy?a~x(=Bt-#?f?_Q~2$E&^PCdk=u=ST~1lIUqfi?%8#MjXmWqI6USkW zrHl`LqQXX7b6NM^P@i+%Xm<4zW4k^7&h5j;&zw0k{r!^)eA(@;{&i#w{Ceq$!9Qjz zBRD@cDUmAW0FOgt60wr=F(e@d)h3^8bk~EnFyg@}8@`j!WM}dcomh5B*?+#*V$Y+C97b!5HN#`|W0< z7p%jTJNo;&qSHEk?7+68s6;13ExLK=*qJYXdHNfQi191kfV0)+9GMZ4Uk{HV=Z>3a z1$P#BbpD-<>Emafd1m_i&zUie9u+U+(D)eU-V;OdgW#{{!e$aAp2WTZquL9-Mi|u| zk3@~`=6W-@8|)Cg2At}-dqJ~_T9(KbBQL0YQICS4EhH>{j-R4EDA_^I*e-I9@IphF zCLy2)C<;WNQAKQzRen4tXdK^9fxxGazBx7fKg`}d{YR&tI`wayn*Pjhf9CpA|77M5 zPyUk=|M1vnxS9T!LLh}e3V{>?PZ9zTPX8Phpf658$g6N62EarGdcEVRArF0deaIz7 z?|vzk0*1!J(YvvcY~)?hct)RywebaOIQ;zgRz7$9%oo2n{j1kh>==D~^ym380c7;f z6O%$l3_LqE#z}6ws|Di8YC8wfU&r{Wr~)k)i|)RPZ+>z?s{5|DP{Obt>>)esqJK|J zAbDnQQEj;S`k6`PV$!BD@s%B#;N)`lSMx?i_~F)%$?);zokINi<<;}c7gok5HUIYU zpFRG}^Ut36?(&E;A{k)B8UEqavGmj^hk*dIq~CRZ63G5TCrC)-r<;Zs!@9AY1=$`{LG8EWsO&G%+DIX zH|iFgnGmcJf}FVI4nOGr(Y2{V zpZojE`TW1N^7f_AuRMbR?XlVwmhx^kpAVf{SjmTeK3^(2HOKQk$Ejp%90l&khndc7|_U2>QJ)rrODAFIW%X^Kco7 zr;oY&oTCj3w_De8H+y}oXM4YD+17=J?{&LD)9*y#;>h~sP7sYj%4 zKYVwijVEdY*O!&aWZwVH->|L)8xek`ZqRnhnQSg2i?QDS&aYd<#}rC4d(UHLuUVY! z^t$uBc;K0QGhj+=na?X%8-W)rSbm2|>a6d(8_h@`u-4e;cCgV3qAxYtvd8kmBu03V zTid`D#!dF$Z?LwO^;MT;-o<Wk#w!P+rDqrqt3%02A09UjFqe8NAYIx zy)a@!`EFN0=nlqS!=8Vi=!jN}d%Ca8tZiNEw27$!>P%K<@(R!gUvY!(f~pzo;=}ja zp>>_Pdv3D8AZiAle9?D3u$x))v(DHH@TanVeveO0tHbAeOV%ofLQVvCbe_K3-n1GU zcs0R*`<;3qVEQ~q^ ztXwve&1TJcR^Uc1kM%M$*VzS}mRoMO+p~a2ml+7fknND!C@QhvvTh|2fpw7$^n)eq z5`LRL4-s$D^iTyAUt(xsHV)jDj*viUNNt9jKC%I;ZcC^W01A1nZQTj#c$xs#$g&qK zW(F=M8_W{i5TeyL2%~EX+8{oU=tOowsEdIY_1(xGLoC5bz6k{hdqKuJH-ZpU93$%IoLknb8C=j*5xO(Vg;FzPzFZE6n zVDp((MH&zR{CW7Up>MKJ+Bj_oojPn??ueQbBa0slcAV$WTyVHoQO(rOF7Qb`Q z_LUYZHHazDTJ-QoeSDNb#Qs33+DkDFV>bA7H+zk)#h_4Yos|v)2=8<@+O3Y)Xj+?m zD`?LVE#%fYrGid+Xtp2zsM%}CrAtbX;GOM}V}0J`ch@ZSm7pEn`;xWUX-mwCkdAo2 zWbl?1a^7TK=Yj@Dcmu*DC~+#fk%{ALaTTOHG4p)XyTPGqfY1YyLPztC`HorX$} zZQkpBFKD*EVBOU9$;USy{)qjzE+QoK+pZPk;*Nt2oRsdzJG*4|*??t3*o82PQ6a|A zQFczxnp4SGufXi?2aTQ*5ka>2Ov~;f;&dDJj3vm^MQY^;wxJ!(4peObmIaGlh=i0v z4FTt7QxScQ=7kmH3MCj=k{n8br|j`h=lV6G27ApjtO^btKACcFc(24~C^ z_;RtD;DJ&?gR#Yolg*jc38EmXL2g|`ZFOGdOsSYR4`i%mD9G?MghJwEx0paZzzdpC zk+JjQBOQ&Os&f!fD02(4!v;f$SUVeVN!bhN@Cas~nVB2l6GvaAwv08nv=KBRRv?|S za;wb_2*KI`7oYF*m|+O!Xn^p$3nP3%WP!#2&&HL72797n3WyLOw-~uwcTI&$7vWN5 z8Y5nU0Pzkd^4Jhl5}1J@%-Af%Oe(o!zz;(4|7%D!5Oc2|)$Lb1(Uy=5kSZau99}v8 z7HSgcb-#hiqvX8~PXzgIMxED#O(=<=Y&~Ej+UEJ)`yr$%8^e z_e7B9%i{`>s8%Xz^*FCW6*ATe=c{c6EqE~ktB8#cf0GHRMAC29yGE`A&r}o@QZE>U zbb}bu*o1Mrup^PJ(bZ%f?MESmWh9&rBlyL#qoBVWN4LE#%F8IFsz?1T!mxB(x8>N& zabJ!=iyqUAz+&O7iO4jw$L5GA>Bpg%*W9M?rG)U=M&zEkz}6p7DcK(h^pq!H33H->BDL{>D4=|IYT*^nZ2ukfqliT#<_p z-uh2mY$Ct=az6h~W9ncg5eEj8%`cX6PPUMBY9+T;s|0RPz$oH4Ig1ITPz;K!>U6vId5Hp! z?%DE)NMxL3>k4tJ9iutNs(aII6FmO#2Qmo9lY=Wq2cenhm!Q3monw40kM(e36`4qR zX|%)6S9aK6tg|~V%n#OmspY+bWn=LBlZC^C6(n02w}Rxz)|nZ6TqZLkaK6ylL{4w_ zhPU>em%jJ7`!jP579irof>ppqU^GB$V5CVVwg8uDckaRkkn60~Ai7H!m)rIlXugp_ z2ftBoVC+IPmzQKfz1y>v37`uxj|9<@;d?DH30>*5LIhu<^4u~ihhdjuS=(|muoetg zj1D+ZRyGg^MDOle&4)h{naPOmU>v+#sI&QM*FuUA^{(BA>F_4vbPyS?kSxYp-r5qb zDW)0~R2jaGQG{Qvnz7qzp*j$P>ys#d?Y>BAnVEAE)QSwy$7;ZU6N{IYrPy*KBGwHgP7azVpu7g)kv$OV6%MWkzgI9D$wDFD ze)ujNOO$cpv?9U@U|?Kz77r(j#d*eNGRBr=L;*92ME-!)t7SxNd8jWQ+DyCNV2fPD zhy|;|r-c~o1_0O{v}OSnFKY4`6?<3R=6#W0KnPsM%q=tX{&#-sRaAYERYaLV8xt6# zNE!{-kAF`T)=}(P5Xo2wkV<1LwWSj=pF)uzYP9cv=QoWqYkd{*q$}bldOl+Lg2+XF zf3w#@qZ7-4hp%m`s7Mbvq~o2qDQXflSOri~)QZBw>I~ zasX6G6(gEVNo*EDhGoxOcQ<+{dVzJB`PacX1T>X7+L(NH@PLc`HpT%_X*gbfBSK!3 zZwr7EnCP)$!SQKQ)aEzxNl*){O+hA+{O!wPYi~C7bD4M#W6F@2F9a4c?0q%0^Br?k zlP}qWW7-WwXBS|rG$s$!15c<0m%TtVKshg%FGSzxIMz&R3&zC_EZn+jEwy%oZ(>>8 zmADLGuEuVoDajNKJ`ztIB&SFYt98E9+G;`=bzaGwt(7;F1zBh13RBTJ#q*hGV=!kM z*g@wqL!b@@+Z4e#2DuP0JvGK82s#HIs-k>RCZM<};9eD-x&8ik{)(9W8$_hC5wTp3 zSPB&e9|jXN@2c~H8OlmBelVlL`rx41z(zj)*#`4Cw z8Ok1zt|84ZiakehY-2^dmm|GOMpSPLYlE12A;1CT3&fB2`<#nf*)$|}lOqZU#H_)R z6T}z+vycnSZsIHvYyyoL8=VNFjO8!&|byw6ZBL(!t~RM&$_TF zjsR8?v@i%`qHAHujA-8lJJQw28y=cqBpw`0wQO6rBS$o`bHuPjQxAIEu6}$B3a%G{ z#IU*ebFfQSb&!EO0c05ga%Q-9#yXzMI$6;=_&$`f!9T3=s;s^aH9#yN|3cS#|KX1| zfQzv<0X{iMs;vVQD6-H#nVAh%!gfYjl8iON?6AU!iiB|C7&5X03lf$#$`2K9NA@Y1 zdM>9^W2}Oztru^czr89dV{k8qBe#mGHLiYBNlv5Jhpb}oLFeYABr_IDi}_guSIn_G zXl!A&hBhJ{OO_q4hM!ohy$nqUSI|s{*M++2rxXX01M#)Ki-!<B zpQ$?8BF3Z$L5Cq{)`Din`f{Oaoz2c$4o0*>HeV_i$jQIxzA?B_b@Gl?adPtinHBpQ z89+;H8K29%&gZ_eVKXb+6VfDX3krfyNEC6%-kgiQ z{*vmz?{haL9WTJ3o!m(B8|3Dr6q1own1)HtdyIFW1cQVv6DV58mY&Bah)(Szfn035bu7YMSs(rp(t%l`lp_X$CPRTgsE9;4Hy#w zcn6*vLQCLz1|~JPwME{ehy>za6p{*%Y-K2y5wMY$guM#YT@zm0*hHsQ31U_Fc(ftx zOzz%<#L1K6!^Zlr3cfHM<4+fNk9dE(mQi}~RNT;Yb1z*dJS6ILS}!cRFTM7H7g>uhz2GgM{&33#($@MEvHppfdFX3~&cUdyCyC7w?;AFE-KA(Agt3HQ@>-(USkKL78&`1bq(jecY2uZD@w%Y~&1K~KID z5a3iShN16587h80TOjf&TL~*csaC8ODo)vl3T=tx!MYs;$1T-J0fc0;VA5jxcQkU>9 z71u7g$bzWb97N=%q1RgupZvBB+U#r6bVe7jFQpuP7)rT&jh{rkR2|V14gVs}*)E>j zIx@6Gyc{^-YwsZ-e6c~s=Eqe@@fIkEqMP6g-eL~@Z6rFVut>1uAeu0C<_P(6h9O^+ zVk#B~AzypXM8r$Zx*_Z{B2uhYv>QyiiiPONSIXc24k@@<#Y+^5G24^*bQ~8vlm{ycxm3s%m|~joF(g(pn)yZ zBBn#^D8>(V5eu&HM%nfAIPW%4_S; zhUJ?YD@2gg@Wf)rg^*zNFvc-43M?HIs0i>9dNZ=`mQ0PgjP1%@QDQkVQ4h-^c3MG( z*q(b^10R5{7)2t?h-wys^oc5ruGB+GW#{6juS&pNyo6+%CAdOC*6VC-i8+uXxGM$# zBLY0!ZrH>eo|zMqK81IXKnWi-VjBBrY*;N_kr+NP8jmhTj<$RuHaf~w_)Q0O*)xfM zftPE@iUb^tx}7=CU5NR8V|CeMib4_uIE*UqUo+OcBx=K0%sbeU+c-ERPDcH`OQYMF zune)@$lMZ)N&*Wc?!XIxta{AN1QAEYn9J7S&fbXb2mQL>`bAKgNie4jR#`PtU{}Xr zi#K1f{}P@7L8{nRG(4e%6>@MmlE$>cG{ib7yF@x)KR(+zLKEFCxM7&0e9=Ukd4Y-Y z(6HLEM*z)Eaak?>;_AjEHi(`TxBMo;7<0qxU>l>=avy5|L{^9!<$v(Q+=_INxAwPU(sb-+GDx2{MWIJgr@e3^&=8g_;pD0-4&4K;-Zv*#1{w_`h**c-d@X@VSu zPHlnV@voO6*SF3G&2EEBzzX3)RRGEnUTHKt7}{H{QT+7{Sy3yW3Hw3EFe4Lc3fH+P zp?Z-0w%;X~IDqYltq|@;1fUoiub?Gta3sMgwjC>PQ-(M0m$n2t$HXdz52sNM4(jeR zs{bGPYg0%5+VTJUiL1Xq^#lI2$o-E>dKkAG>}d+vTc_Puu-*GrsF2azOy0tWG!0A& zx7CcJ`3yz%0h7;wDRb}H%#3J}N@hRgd_J71VrE<}e&VJI!pM-B4dY!VPz>Q6J|eOi zRBI^FNoYJ5gnDBRxvw(SrinL{jEbQ9Ki}9*cb0gWKNozObm#O8#W_Lg85)@Tp41tV z*l&^TGsM}8pG$s6QNrsaF~y?B7-A3y5Tg-KdqgRfk-oKm4=I}#Eg2!KCa+|LSOUQB|B1V=AR*pGP41%Fhc z1_5^H7b^N2(cCE#L5?6U(Lxf!?&&=Vfxxr{VzM+*Jb4&fJnQb_mo{&3nXME9h{WiK zCicyt8ku-Xxywq3ok_MY&VvE()o%d48|;^%_~jzrJa$emE_+51L89N}P>MQZpw)Bx z8h|OQ6I{jaKl%ZqIbwlF6IFZ?K(vXwF!PoyG*%*DW6MmGwF1&8TAXrKe~j@VBZ(M8 z-S|SHkn!a$oEc#EC6lwrk&KaB!oAh@!80a%hA4q|AN~;FA!l)#2_BUET7H$|lvr(8 zpzcyjv%?m^@<EDA}n)E zFEcX=Og$wMF%Q^QWa|>c)A)>0hi-s=Qf+T9l65~(`pwSN-bwNT2IiudA$Vf_^ z#)LE!!I)G4I@#epP|eINrmz6Xz(s(Iw%mI7qlZ6)_(QRp0aV6pf*AGc0h%Sw6~3)x z7<9#eAmpnpX$z7WU@Ut>km^2|V=L5I4m-~cEGQ_>)R~mf5!ovt)`~f!^Dx14VuUgn zL>_W?{$jGnxNL=DVMNqpP_!Ix?wBHqn#GWo_(gI7>6C!>QaR0r4~ zlnD|~Oi5yy8%emtR&00%bh2sAq0F*-513OpQVmaPJLBvTGr5VmNm$a*Dgs0$SSOyb zwTXKEr%#>wgQ@Ame{<^a-{gm%|YC}ra$++`u@K5LbjY2 zS9^&}Qhb56py=mvfmbP(ysA?T3tqnF;5y8Dm1-3qlw0(QT(44BAXhCG%GJDA#wk^F z-7J156HLNs>cMC^_~L#rHo;Y~k7BqH>wQ;Qk$N%O;^ED#y^07$u2}4Z)vtX^laPim~<<2Xn`-^zV{QyB4`po>O9hmMFvVfforkXjxxxxm|nZE+k1T zRV$h|X8i0D*ciiwlGxh{w~Nht)-OSon_EkqR}l&l7%Hn3-m~oMU_#YaLMysP^8i)J@NFL7* zKejvjy5axUnPVi7)NrzH)@m=`d9eK-y@`+YKgWmNdhq#!xme4ULRB!nLS}v`U#b-F zqgF%e+B#r#DWA{f3uKnK1<&FScdJ;tH1F7MO= zR7^t3msn+^(W^GHXf0n@J|BzcabSkJazq3i;U(k^yLVlLGdL$sq24}-KDx5Ucr-Z@ z6J1+mlKUH=WF@whBvSCBC>0V{0xE)aqQ?kFQ)zz<#_unIeVQmJA-Kky3eq9?kb0vI zk)h2tHik?ZpDGzgJ*%0rt!DCJrVL+oe z5&YnWlx`4(ROAvB7?RV^K1jwdzb2X_Ix5~YbNXc|DxPTdi4g@(LUoq=p~n}qG>-{Zc@q3kcr7=fuv#G!dM5ho0NH{P{@e9Yv9P>rZ%Mkf@l1qXsE$VR-D z`H?XwPQ}E11mR645@&cYlu-$hhw2#mMfg|Xzilvi{HBDi->EgdJ5^4FEMG7kVW7d>bL{BeMDhaJx`nz$;}ZxlZhMm6q?sE z5Qyh#@_~);Y?Mz*gftR4%E&m0|D z{p^Hcf)A`uq;dT4_PIV{nN8fS3@LJ^I0J#C(Z|HUYUU`eOdb%#Q`8*#y?{m?nGdnQ zh3t)lPlTEtf>BXTy~!xrwxA1`b#`v0(Or3CZeBhaJ9Alr_{YR;xB|ZxLjhw8%NoeJ zq#!W?xdiaGB?Vr#s;hd8ffBAE#rd`pDjpQvH(EoykBn(>b+|a=YO1RNDOMu*wzQ0p z^jyPY@AvCkk|MD_#QK$l9*a?HFt{!q2e4ExNHkB)Fbk-zVMKqUm(-1?kjKpQRAXlL z;^$HX48pJhh2TV6d*GsiXNZiV5{L<6=&c{1AcYbH@a8xQZi)#DED%r{KYtx}pC;`{ znI8ku_;F%XIxT^`Sii)S;8fKFrQ0C<0aidB0R%&7L@b&=`~d3t51NyH=@`w{Blq5HjmSS{p9uU_Gl?A}aq9#({gn z$5#k2cdhH>M_Q{_tztf_Grb}?Sk~&p_b}Qq#S(%1w=Y~oB4EOdj2Mk{2|R0>R|RB6 zdDgl<>c-VtQW}#XgUt1dE!zxXc6R%GBjq!}3Fs3nJWa zH18oc5ti>0*r{k5pF!C(u{G}-&^k8dedNFK^(7LZC`Dsk{VraW+L$fi=G`irCQ$eia{xK7Kv`?NQOZI`~An(@LjJ_U(AL1 zqUQ%$JIrQtHZktL4N}zz<1J=ug+jhi&IgMFQh?=(ST)-SmO`YUj5b`+mLLv0v?CjS zi@I(10=v<+w-aNe4gJ^OG?MeNrn=FnOMKZzZ?T-K74u=XWQReGIOA#|w5tT#+5y!D z{ep)fAy-=z!3H|a6lBsIc{^;{am1z_*mw2vNNB2!)gP>H+l^MdEL)b?wL^}zjXY%! zVh-(oi<%sDyY+Gn0p-Q)LUy5)&n}P!@BtSD`fe4rm_%s{pgVk+O1BcnCN@mMPlL?+paC=Y26Pp-MjU<*Em<2L7MaqliVL;aEh}V zm#iC2H$;koCJbdWaNJ)=PAYSkWfx61fO#d$CC(a2?IO=f{{Phqa=^z&*KuY(l0u5y8NqU&k1 z;lc~Ky>q$FhhFX{n=O43A@<2;6Q4wgeX=Em1Y-H(2R@a%(wu!5wdeZyMi=Xy4(1UX z_c`=TE+MsLw%SVAl9}0))X-}}XoN0^c`j=2P6iG(1M^iE!C0v3ll=bvob~aQgpU{| zJH#h2;;}yX+FNhEg;q#D7X8{Q7JcG#^i400UZRycX7|FkKIQ7pN61DGtS1gQ=_gtF zdhL@UjhlHSz}<~@#MK5w|Bve+4Ezxym}rH7hKQayervR(j=lCW6d81Q1lF?V2;?(W z5^b~2m$MQBJ%`vfq73lLn?|scmv1KJE>KcFf^u^*dF=nR(dJ{Z_A%C-Tjua6!0cKu zA@03BHh*z_qfLE8>zVNP$--0%G9q-cgnjAq@ZjWfl_125W7k|qtQOVK_Q)8vbH!>v zRm2o>2_eIh(o6KJ z;zF*PU2v*dLGc4`rkOj2=yEk%aO?oV6gyAo+SN*-U{~|Gaw(|g!feIeG55hr@Zey+ z0RjqZTcjrJ^}|v?$^4uTF+V0y27q~+RD58YcguFASnzEC?olXJ7jDq zkDsUfSXRFe!#aRKIhf|B+s5)(0_;Z&lO19N=l-!icwie#{)5?AK6cJ{U~%?|va;9? zk$il&lNIa#n*V?FpHChA=O_M#*aAM0|NV`rqm-4RkKlKol0Jfq4}SSSEfdc2ADpDD z)Sb6$2McE@=1S#?RMg9rom}YUve}>Y7DRLQd1*vM2n{8W`oxM74b~3qb5z}sv=LI!sigEM#K8VB2CBz-RWf0y1zf&{x9uBI^SA>_ zc#X>zP@f3LxUHa+{pwoR`rXDRF~!nGP7)A^za(soltm5xpD@EX<2nCWg~?Zb+}X^G z%*8Y_Tw$XQG9M{sve_peAr4C6q0)71ileMq>*GKI}qds9!XFqmA;0UtMS=*IRr&b7UKvmYq(q3Af#2A18OY+ zgTLpo6x0YfyiL%eOC%xy*AQ7#+E)5cp)Ywv;gP>Z{+ML^o2*s|a8=}2JeRoGfzuNVXbSfrNBvXrqYZQ8z39j#1RtgM|cKla74xO{Wz<4VdA_>ZeM(4 z2@0nsj0EZKc6=7Boo7r##J4&GxMH)Rw4i$*jN0vVQe%r4IE*C&$j0pj`FN`ly*zV` zz)6Xn));&Cks9t|Tfs-o+$HE+dg^EZE0xsw2=OSOwH_K-vMH3`ia`f#fl$)@V9oto z$B$BnaDtHj&S7##QaYN_(ftW?N=Nm4rgZeDnvRmVWbz>5gbo@d&{ZQYT_i%4E{`=z(t$Tjk5T**bbBPrOD zsU;arvb&~rBbg>dZ-yf5M$FPMXC4q%L^n`*Tr>Y+uf(`7D7PL84FuZ9OdO`{F^Puy zC|Ei%q2$BuBAdP(7lMeJat!!nQjgDc*wb#NnxSb@6NtSe6+jXrm~32G#H?1!p#gy% z(vFBRz*QnHfUIs=u+c#3mNW#B#K=BSc|=*ONhrH2MF<2Ka-Z7((@6T%8W|Ka5uHGw z#K2~~lK7xP)(|Y)(ocb>Y-wLA0sly502Gl`(Z7%6~fBm^)FMlW~yolY|3_;k0V zInL6|Efv->(p!aE(WZfsZihZS_$*nnMCWb_vd-Nhz^%b%Ngj)|tG?2Y?i-m;r%#5H zWV(om1sp(Jn!UuxI>+W|{mGl%dmt47s>FvfBxOiz*lDs4emNq1hkB$_M1jGU*dOPzs&0bX4M{3pMVNgrk7x8M3go}QQQNBj} zb=ah5l94hM=y5T|i+H&1lh&hoVIn_nNm@(L79Z}I0}6M0%YF2xyX9Bhym=x7f}eT&+Xoemue!GAp}Zr7*K z>n15gQWr*!Op;}nko zu0Yw<4x1vGh1`E7&NehDkK~@dYifKlKsVM-5R1V?-y|4mX+_PhH+4|yN=qJ=W_l-? zl_)~8Hc6(CFOdF~d_8FugjIW@@T#epn_q&=C51i&^yf^4NkM@mC&`qoVBv9@kmWd2 zFexEKlGR}%Jp4B+d$)I>9$>&Sb`+OH>qw5(KvDBlP08pp^ z)o7&fsq!QqSJFipN;zIOsA0%V7p%ahA(Tr1r)bOh(Hg$i>L#sc&<)N0@x_~93Z*M9 zaXMs6;_W7-K2AH7mZqcoNFffR+vy>ngSN$)yQVr6Wrii!wjCz{CaiJ@b1ArD3@ieD zWt4o@4@kXET2*UxS+L_OJ(|I$wR>BdgGV*~rmziFZ^!lug3K(*4r`Kb%-J7)O?L&) zF?;zVD)DgdRnD4Jw3V+f6MRplQ&P|7s2e0Y_eP^h{eC$(BsJ5YNUBc9hygr>$WopZ z`Y4QJ1anq(e69&$N$>`S?kVsku@#FCbP~uUp0YuTXHB& zRTfReiJ+KN}056#6 zZMI22IFge)sIJRGfD_BsL%qqTwB`fzO0swQ^5rCI zVYXFCv(rprsSCw6D66LlyeYP;h_ovx*aIf46^o1kmbIYWpWKoO(Npk^2)SKs@L1_}IsF}mzbGGC-tw`pK zt<~3IJW0*2CADqI#3kDcP_)!6q-;3mQOTo15(lO|B|}55aWj;K>G7c)anPV(7iDQc z1*SG};FOumoFPyX^~#~CSf)*l1<7uX(|4H*tU&}xQwUvcSM*=eB6;u#spkUS8c=bw zYU>=dgmWtgD{iVnPObF*WDnQ?mc3=^Uk`!FvCKQQ>r6Ek$ z{$^jkCsfhC5&7Dae=3 zBJA)r1VU}U0PRH+kW4mSyG}yzwV;PkE3a#85dw?IB&Lu64KJmVfbI{=2B+eh0{kSj zSc@VkMIeRTq<%9|plQU|lpqAi9rY8noG}EqiC8GI_PSrZQjBp5S=cPCRhuPQq z^oGw~MY?0WxO*N1N7yygDPbXFlvSu8WkJw|K*l6nZsudlmYcZ|_wb^{vH)Fcsgu0F zPoCWYx_lh^LE7_7TN{nGRgriU)AQ^J#5xx;lnE;r@&|}@epL>nNGc{<`H3{2k+mSq zm;h(mKEz4Jdt_!F0Apmp$BvMmNYEUKkluez5XW;^XE@SNtkI0D;zNce*7JrPkjPwNfu%fNe_2p>3_UD6(f41;~qw+KB)^EMRo8Bi*Rv+Hw!2 zhl1ZK0LM%LgOShgrqWu3uxv`b48CMaz#y#hz17JR1&{5y{gQws9<&n=_L-oKBY zAfY$+#l#|(Nl}S%Rr{-=%1LcGk<^j9>uoxm)8G~pvZz4~0&mdfkaN}MD^Wf&_|1SI zkUDxMe~JDog6KuD;Zj`|y&aFpEnX7+xQnVEi9rZ^tddLv5TdOx8zH|PSm0MbOhYiJkKG1ws3TIk?-baW~W9X9ZTU>?*DAbJ|S~e4J6os_8 zPyb&}&||ldYfp z)@4j5YP&Ws>GQ;aXq_sQK*kb#!jeETfj7hp^93YeoRXozC!44F8 z6kOCbHA41yPf<$HZ53mT)Oe)^v8rh(b!uc0wMy=ZZb<(hDU28x3y%2I5+v1cSp{an z<7&;4uTTulqMx`}pGK8s4l1|?=9*PdIiShOKvT2}2ZG(0mo0hh{V$xs`{)M@zspG#nEY17it+$W*rj@E7gKh;CVT(R>;x<*ROfGN~KmT``Hrz1i5@USM_p1iToh1==gq_ zVpY|wQ!E=T5cvEg7U{*X2DIgP*}c0qq$jBwOfe!%;O*z6e<~v7i_ayp;=XAVk}H01 zU28Cv%6^T6C7a&Dc>?__q3u$^%g*}FM2%ZycR9C0s|4j;EESYgJYa2O{8@XK{hbWD z+fmG_C_#4<6Ozj7l)l{5I6kE*A8c+jkD42mi=d`^mn616{+h(gxY=7Uv|e-%i;@`M zaAgoiCYuHMzbHlTgrr}Uc64IPiaooTLFL#5%c*3foL$fo9w#!Gb~w7Dd~<++Qnnh9 zE3emr%S59=bXMho1#30wiJ4%BdyI0^b1Nic|a3dk?YGc>Rc4TlOFTIYlp9PK$gSFg*1As+vBJpdQxB+q5 z$6OJEs@o#y1iv5O6vpf^I{4F9EA9yUQkJPr$fe~EB83W*Iv@Iy%bb$F5}Y*{XKjP- zeF_Ktg0$toSR1!6)*UI3eVi$?0N*fMzi)I=9{-(1lKv(j*ZlT z7G*?}!_oPeOk~TmTTv(EK~AZZ{*$sl;%Y?OroPz=(tIq=BR3 zxPB?jRqVX)Q#-+tOna}A1$!K7fR=0dO7KWH%B=b=iTw*~!)|SO3H9DUuBH%d8@56y z34)|)gd|N=Y@Avxq!<9tA5pTsL0QF*DD{13Sw$g$HwojA_Sn~4JYDxBE)mfx4*0^@ zVdS7YkmzpcB2jHxMXQ*tR!eaUN{TTCVF!NkG$cy<=cIwHc;ZIQdCtqCg37__focfQvX5y1xK$0MzudtPS=1!|3wp%I0{D)4E z|8WzRBn`B1z)EbpmR;MIoec@+fi~H$-WYJW{c@(P36h9zR{v@!H0TdoxyHue7n06LB*cF>Uytp`+)u%hb{lki50vwMAVT;N2--tZ{NrXd2i8W0Q#=rm9*0}(to-*e3yelMO#rhS;ThKddsYG# zv8sqQ0%H&q=phj1xJ^rIBjfv#+D#VE*rmlOlPHR7*x<55XUeH7PLu`IS+FS_$BEgDkiJU z%q4XvB|S$8KE+TuvmB>Bm?lYa|E@TyI~;UIHqn=?=)O3l29e!3eS@tn!82^5(oG%{ zthSuhsC)&B@okNER+0w3;D~%*Fwr!r5&*MR=LqK2>I)NeV zJq#h|!!*(2w$Krc2~My~3S;mU>AFW^6OSg1y2M(KrY>!0lg6~t)@KL--Rt1nB>$PH zU2*kF95vR|mW5rXeZQ}HOU99k4-30HhE??skF+H+QLLI4xz)#?tB&x5#Hvw-zy!%E zG5*s~XF!lRXGKAxn9K@Da2Y-*SzeK%DOYVWw3Jp1g489+OXnfhe8@7h66>~5pf&765|D3jm|X)cfps0@o1uv~ zJj~khHiAEwvWY)+M+k?j?iEik?E9dVN9klEK<;4GxIThpNE2wLcL0%_#S%#uc7F%D_U)<_P6o?4;z91E`lyBMQv zGpiyLsa&Nk`G%(t<0l3QaX|tR%!dF$J=qe`!(osIA!EQwGR>qzbTW>5@P?Fn=n{;R ztl*Sxe_PIWWJpw>PU*=&ZIicTjx173yqo$tabK-qF>c^DGY4+S#-JsV04U_%B=3rR z^9m>u8)*mBT0{iRr;F1l#Ke1F5()<3i!+5dA4&3_=FZ6AE84%B?wQ~fsUMWW9SqM& zV+1);_#oSw11n9@C~$<|UvR14*2s>gq#R}p*90nq1*TH z9Z-^u>q;|ILl|x~BxjmAN!AnT7v$^llI%)M{>5>Obi~C2a-kV$zb2+A4k#l=FzJyn zLn$Y|21#g-bjpN&ldLNOs<3B>W>-=YbpRC@AiPKio5%>t@r6+X1wnZgkK$4?>YC4J zL4p8}=^aH23EI%5jHJ@hxNplV2|Y zAz@=(%epm)Lxt`Z;+iTCsv0Yikd;RM9D0zNPq$c zDa1*Z2tEo!Q&l1k0$qhf#-s&zX~qwBrhMtQuFy%m-zFGHMzYq_C0D6hWg4WFtRil? zq7_g3D{ef@?g?8m+P=qe`f7R{IgX>P*`MfPEM*8#E0hk>d}4@Js01Hi znCDkxcXmQ{G;&AU-2S**)5{um$;H~u4A~|24!?fr_OXubh%VXf`JagJ8qX;^^dBhN zwNfo>7wDcz{02c2WiOYfyF@7ro$&EHOc=LW!6{b#uuLb*sz<{Ezv|g8ZFc#~%Z9mH zjzH+@q7W^+yV(%wYYP>Lwv@=VqJ>JpFvMAIN{Iz7m|o=Cwo>Z}HR^=?@;X|KsjSnZ z4JkGSRAU{8eiRskw;M@hl(TCH#sOWNl@je6iu8QV`^3ByJdZ{R)gpkaRNP`MTgjI4 zguBRe;6c<>w55;>Jzk~bgeYtDMU~w1ruIzLA`*jXgH^^#Ob1x1aYQz$_MM=qs~`r2 z)|_gJof58u{Y| zo5|kfcU#Op$7+XnYq!P_6VWk3WFDWV3YmCfQ7t=Z-~nS=b_2$4G-)CNMcO{@($zu3 zJNE9{dEn2*@gh51@VmN|4|vo**~mF?**-czW-oucY(}F;?>&S=I)~;yRAj;@oWu@5 z^$F<1@Cm2iKNe8!cBUUsOc_k`(;e3FSYpvf43iyP4*Ky}A3Sj1g3>UCV>djRU^NqQ z1RspGK92u?DlQ+5fes1E6xkL>uhtB7Jwy<-c$(w`<4sWa3xTjr6mYElSc2_4YRbd7 zft?ToDW!{sB?p;JT>d^Oc#4b2muAS~5*L+SeN1AyyGf~gV*wDu;-x`pcr{0en^l^k zsULb(9q*LR7mvOa@FaAgqvnKNisENxmXY_`_#KStb{TOJu~153O0w5Vx8`mI_N@*- zn^HtLc$!;yt=_|Oj6V>^mc}of!)h!syyq}(FK^<9XfP!)TBsPxOIT@0hDY(o0yD9R3oOK~Di&QF-aE>k?^^ZT$t`LUnWQK&1!EF2W@^%T&?^Ln zgOS7?m^eO-z9NQw)D|MH)e%3$i!Ko<+rz{gWBQSkh5=a{BiI;_wJ`#=px79UwHUvA zE$}*>P3p0mvofd&bcGmf0_4dvzfLYL!;@btb-ixhvahM9MoeJM%n}V@tBd7A!OG|D zycDkDcB8q36<^}Qzp~x;20`50B(AfW;_*g3!RRh?84b<>EolG@PSiTBMgDBL?R$&z zmi(?Mk*rKN*s<{9-oDhP0<8XssiFN~q@nmEV#Zy49*vz!XE*+d?@g zV|oc`?d?_z^b5^b!b-^y+!1mcx2Pe1YO+BM_B5gMWW{!xae?VNv(?rV(g9RHplM)V`e=G$KNju%uyfi?5gsv^{J2!} zk@Sk)W;AgscdF)}WYT(I{r}YI&rVHG{a|Y92mG+he}5;Kq4i$^nko4v(^?LlW;}`SAe8qJum1?O} z^c^y>3;$^Igy~cD;EU4mFR2*xkA69y|K7>8VvyTJfs|5tV^xtv!M2I)cPeX6L7MO7 zVvqQ++DKY4sNqU<@m-?DF15T@G|n=u7&KNmC#@KiRt!oj2Bj5)B(Y^@#h^iOpqNlK zP?u2(bjn}p3>qdE+iF~2yKwqgj%f0J6cj{7_2_1U!|3lF5`jNkk$*a zNnC0jVf-da&vWS=E9PlxDGdvAQAf#Ce$`vU#MG&^u20KeBDK*PSg|&EHGAtZ-OH%EOqHhwlWI*}w z-KJzn@UCT2{xq3xBp99t#WTb+R~o*7hagy7%uJT8X>6886-n_no>VZz+hj6eBUd+` zr+L@(2$Q9fc|mzw3c;EPd%)|Nns$^`4P0~&-;*ENMrJP2S-7U=jAKXA z#>jDqlQvgyNf^(Uc=k5QG9U-1DMcj31;mGBLCh}1l0|Mnv&Su7k%>t<5KGl^f{Iac zkofAtu+dmt_st-H)Y;~M3ODzuR$-DC#6T8F`2?9<^ zUFu<$l?xh4zcb^OBruA@Aw38mS)NWXN-G(P^9^W7wg7LLHa}dDfmeyiQfR*-VI`b9 zJT`Pl3^_yfxU`~aVJyfuJc;bDzODPB(7MKfP?Tzu)Pf63{D3A!_zK=6P}%qa4c2LO zV5!UuQOuR_uO-C=iLma|>4MX)Kqhl0KGQ-UO_*NdP}MYRN%d?iT78ow5b+@jHfdya zTQXQ6*j>|0Mtdsb7zAfg|NhL>)b#(cvqbqB6u!Uu3;FzCxcuFx52)}BN_b~WlsXD( zVOXkEt7W%HL|>^K64{q86|xw(T7~+8#D-LcS1RmC_?DtvzWKCirXF;;raYD`sXM(9q z`>`kl;AEe|v%1g*g?)_V5@{(ZK0?`(Zq;%cM)Lji@oSVE6DK!``d}(a+gcc#NCDnc z_QF7#CdBtIbhZf0207_}qu5GX!ZqN=9N;AQwDGUYnNMDUKnll+cVCjXspBX|c-VYN zNLqsXgc?kikiO2`g!YrgMFnOhSH`nV0cgMg(I>J1&$;Al2=%;8mI5^!3A2<&ZsIv7 zIf9I4j+vA&kf_wy8!u0DTiGPDAjpB!PI8iFX5o}i;G)10aVjZ$iI~u7)8-xWK=p9| z9P=htrX?oz&;md5dZA2l7F8@u#Lvr4KnH<30BUI--H4d;|F?H;J#t-Fey21s5D_uv zVK4~>29kp|#Mxt5r<%i7XSwIBQ^_^H6Sp%GEVtI>AzD zD?PR?)v4J$j4?Fal+Z_TnG!!Hw@n>wmI^`uU3Qis!kRX9lXYkC6efIL^=(qs4D&j) zcDTmzC|jt)LF-~Catr4IdsNDD9=;v;&$b}~c-VGEAsCNhclha65aV8}u&nYZy42+v zhz7)FODHd)2k0Cy`aMxs(V)m&R zC~eQ{P!c4oubAG)b&`oYh87O#Q&lg^YnQL6UZ1rLq<|!Q-QE8v9I&qynW=PU86Xi z<55G{E=L)OJ0_h5Bj(7u2C4E$by&8{Y-Miw;LkI8YHdd{m`O!4n}iFEmIFxzylC>M zmrvQkK0_y+XM$wYj{u5Tad-M#k==FLG>#R{FIx)leVXjT6U<-p>d_DxlUlUvwU7&Y z9}0-36u#ep$)ZzyyWDFowEXmS>~L3iJg5S3mm}OxH=1>hi|1>Au|LTav@{4P)X7u-eMv-8rhMw z>la@8>q!s_n4DCB*?@eJH$XJb4cV!W>6JEUK96^W0DwpUsqjinjv^EkxSQ|&nC^$% zKa_vxbOO^8RtX}K38GaDBD%JtGut30m{~!f_^H+X`lj0K1mcCF(81)#ayt;TxG6RuQLyy6EwMCIZGU?G#x@QUg6Ufsx5>3x@jUO;E2J=Ez*GWfzZ(fR zgR!6(LEZGYfr-70kLMY~nHk~=d!5U(bkgBcE8SMWy=Wm;$5Lgwu-r`WwyB5a($Miu zC!{xB5s&+-u^7uUJ?R=lNQ{kfIq$?(P6z22xC6vBPA(o0W{qE7Fv0?Iq&5>nY@YRf zc#-TO+Mi-2kjw^muo5xLjTo>U6vy=kd9!MUgS!-f$7VY;cLmK>=S-x>5CeCc&JbQc{cNCH0iR`zCyUG2-?@w)^hf=W zuE&&6JsPxs?f6lz=bbw;$T-u?Ysrr+hT}nvHKk2uyf~?KC&CN#iS>ik%^e+W2oQZc zKSJH!L=Q|T@aB0Xfc?rW_A{C1XXZlTnmQTj%HY)B{P$)}H)uN}NaDzNY~2bRGohkb z7>|hyuuA|yF!O-zZVORmtY+R_XF2I8>Y97fZ=X&#=%}xXAmW^^5VUYjfE#aK4L!*o zGZ-A5N{bBW4fKYNQ_M#%-Qx8?nZx+Cv_0lZqv1SXb-KxISh{3?nCjO~&xqYM4RIT! zhLXyxVmiFp4KPnrr%H{d{R#U3H;B7eN`f8nG_u!3GE@c0lA1!SUH&l77N$2PgyQMC zxYZe8Sgo2PR*ApQ=@|x6PBgtbc@Y{PW5v#)DXpm&w}m&-e1W)#7LZsgmO9Py&^h_{ zPr8oo=%j=H^@U9TIqCrIL(aTsLA&P}Q|kPC7-K*NYab!t!JYP?Gh9Qnr`HuzTkfVT zQfq}NQMvzLn@PhWS?M>fmP%<$OSoQswb=Lat2L#1O>#h&@M$dci)h5NrhU%(cr?OP z-scjNI>FJh)ar%dC1|u@uCa~ga6-=K!mOQXB+E*x+^W`rV6WxFVv;n&YN65$^W_{~ zw`R3a%eOY4k2~!+M2AoxaQIA?w6_b}JvpzY0g&^#^>QJ%UX1dZ+i89Oe*DNeP`IdpNTt zVZZaTd(cLPU6ZsBEf#WRBoU1IUTo^=y;!(%S14X@Cbe9x6w!}BMd&$Lq>4tR61`TV z9ae*lFKnuRfmK#a{FBs4;~r4OL0xC5zjlQfF){U(lwgB3Iqo#$kUJ(y&q3BvM@}I# zXT{{AW^+gBWGSx~sS}qIITw{1VXIKB(RU!PI&o5ktJQinUrQSNx3R=xCO4~Lx*$wZ zO2Ac$lr43##xz^^#HpX;8=jJhV`*&5)KPP}+{H4+^1)F$2p`4V^gnP=B@Oc*54nE| zEDShP4vB%Vq4u`@9*JNubF!RBTYdWyQdcy8&dm5C_S)~28&b~CwwOC=(UfZ%En~mh)I1IdY`_jtN zueL%@sYTPk)5x`C0e^H(-f&0XRXQ!+3SAZ)MN9M*&!&0KJoDvd@cMq_7k&R?6^Z@b z*=(J~9K7h97SQCFfq>MU>4i&|pjRd(=!>b8bppMLhHa*6smxr$?4B{Pm%jBJPxJpy z8f8o8|8xES%f||q2vb^JJLRJwLmCex*1yY$GS`MBvyggZZasyf(oldoPvy|HU;s@Z z`Eur#$k3k65sio9_H&oL#N|Pu0`I<7deBD#^;JaU=y$s>5AfC82%?g_i5BYkg!<=k zeQ2rdF0v*lZc^8-%YXZnR&htK_Ih+f)Rm;S?;cTp4>Of747ZJW*5%T~^+OXhc}Dq3 zIZ*0j`Z=ZlG#FJ@RTQzlH1ozFt*0i^IX+F0aODh)ksON-1&@_377#d97X#<#A~tKj z%g5xgk;bF2_+z=F2-IQAr+IUJjR5Z+w4Djg6Kuye4k^W9H?Gf2IdlMuf`8tcbYH!G ztG}_XUa4Azx{<0BKn)gdq)&xABOGMPP}G_&GmJ@O*;U+|0dc&(qhWFklh>a$4Z=L5 zf**}GwBYp#&=!8oC7@w#S3M+{H@Y5G&pV_8uJbw0DU3e_GB$ z)I*PiLg38I^X$XTb&?-p8LhJ}fu|t{e>K_5(|h!28MPX zW6c31hE!*Op$Rz z&&3<9v>t4A<3m<;yG?l2em*!rr`g{C{^+-x(p?VY_-?(<-$j}oM0liMYzbkNRT9LH zyA(0Iq~wq8goN1eA_%%fAt!Z1uuLw(Yh9nOhJtk2DMLCPx=tZHDp&Iq#>Ql4N1s~` zj-B(yrahZDM^v{^e#`*^X%xfLB6e(V^`;N;jk*rk zn%|wHZ-_G~r@7+@hm3NVwuhS^@gEMOUCE<}%rEYXRp|*K_;UWjIitqOq%goO2#UB_ za(9!T1puPl&HuEsefM#2=aVPFPonk8`+6Kt8%GnTmN3-`HwolcvBK63bJ)zTdE?#x zv4Z9}Uiqf0_oYE|R5tR}BDIK1Kyx@Ni)~gyAp1-3R4mTFJC^!naXVU6NH5K9W2WN~ zd6&tnHB2HTlc(Qq$(}he;vT^Jjkxn{iQ4s(wqh!%vOWHMw&IQu%K2$zSWUm^;v3(d z?G7)i?G40M^5sgiQOV^)idG9aHmY>ZZPshRdq(wYwN=lza>Y%5E~`|Az_YM_TK(Vd zjh^AD1th5{`)V)~V2Sd7R1ub>Tqq}{RwK;SbAoU!mckm4u3^3y*TJGK7i+Z(MOc>F zgaae|L=wTL1y-1UISR-@^nysQVZs;Lp>?uoNd(fc*TVa<_cvW8pPb|UjcS|&i7^W6 z<*8mSx-+JV*5E{FUnLy14Q!SdhVw)oG4FP}VR zBFWi0h&x7%s>NcVh=ywBn!LYQV)aehyi-I`Da4J4AYf@TkxmZDCZY;DRQ!LpTi*jk zSgLDEg3zfT*@Wes`kd3XZ3L1UH#`22jf{;)FT?LnN}=kb4{KUyX=iSTxTvX z@;3uzps8Md;P2ZwNtTTOMiw=BJ#NrKR-42(zm;WPFcw%kXS`?P5ngK57qrz<|NOVq z5Bv)0k(3f){?vZzO<(+19<8M2@SSw6N5v zH+R#0OTMDFXsh}hhSZI9lBC^^+k;Pr3D^H0D<cEm{teSKUNvz6aw6ddxt{G zaA+&OfG|y0wsH{{E+X8a?xrdf!wpVcgCMw7dYN0?P*HBiKx+`z{($Q%NyYQ;x<|y= zxAT)P-JZ8%NrE!mWpSA+{^CEeY816TcF~^4doM?O6ewBX<^Gsnyu6D7D0>>$3z2wW zY^ZLsis2F8%W@TVR4IcipFXY@;-bhBw+F*|fBw-oI7m9g@s(9zK{Y^f+^TuP-W3$x z<5nT1w@_0HoQta27-$Rl6PE`-6pF~3%1LZqR^Q{|3&!t+KIWU|*Qya-hTS&682b%htP!i!kp zMWCHlcoFKTf|^|6Md+~eMXjVs2wTqMTCDIQR(KI)=B)4{RHI4$Q)+Rq@FJXrt1E!a z-W6ViO7gAdA62@-i*WbS6G40Lpy|}_23?f8$!dC8%PPZyo-$6Lql)LAoe~bYr8Q%kf&*)X{6@Ff#lag9yoRX}pI>xWo=+P>^fNQWgRU=rqhk-+rzn z;}o<+?i*zeJM1&Txmv0_6)nImX3GJrQmHM_Q>mY*ndhwpJ{&D+>=o6q)0l3;n8X=WJ8E89f z$slIS$Pi;gnWVm`-)!-VBo3Y)y~5>5O1@~MH6N33Ee+@Lu~$JKV<)ooN!P-Y+8+Vg z2{FECh-T-BtuqCHQETf9E)Zz^9ZfU1XZmJt~K=~Cxro>}nb)Nge1Zj=kISiOf< zpY0CR=!(xgoFno1{BUX=H3Qt&9wjOTd%UTqGy$F3^1f50zrx2yQc=`EG?C2@_{p z$i9l38m~A;wph>OTJueyQ}KX<(~g%M4MH|EYhJs4m+2zTyhHD?SxF*K0CTgq8a$GJ zEn;NuV?r(iT-FTYF+fEefc3-~9z~Z0khMnmz;KiyBYby_dn=zB&mAa1bJWte(sh(EF?obRO~T!`Sr|Ku_=W zx_$aD>VOb4YJ4NDTxjB)o&_mb)E;3aezH1Ms)JZN$c+x|N{e$a%E@3}CCs36ijyWY zcgK?Ig9>F@AcN`_gOX%AYum#v+o^$`?8L1@qq-}Xy%}SmXnw(cU~f5mr2E`_wWg2~ zfDq^u#bBiTK{-ur)B(aI&8ubGK$z z3dA6N@JgvD9zx*{%~}>*YtO?w){0ssF%P`TL|j*z4cXb+gvXK zW#3(5bsH5Sw7gBL+m!#`4XMP$vZY`q?)Jg_f^B!He@7B~$tcZ$2jwSUBN4uqyWB+b zHCK(1_Fu>D)ZNRQ^a6E$jP%lqei%^n)p^;Y!uXZNp6S9)6Lzp(@z@z&fE&$3OSwGos+l&28v62c*potyLY7t$EVmN1 zCKMKgH6hzsd*gDh94B#ZGhJZV>ZsfVII(z0ZDGF~Ta^HN3$H%eLV14Bj?C;g%_5vuvALvbj85Mr~u+qtsa#NVFappSZoyH zuog9{VYyZ;HS%%37PnfbQ6Xcb5q>1D10jv*Mlbhw<3kiE32md0y9$dx&ncP;*&78- zJ1P5b3a4_FXPf2OHfc&+tW(8WtdyzKqj0iX%jH6#k~^E!xGI zAA^J|%L~JG&JOHjmHpq<6FB*GqXQ;MQ%D7-YE`K?K4=26(tH*RaB~f9T@ESXrzARTH{vF!ENfrzxue`O%txSZrOAbi%^@&~y9dX{7MfA{ zMy|9`s#Wt*!JF5NVPDq6Ao>HT;5UO`&~$Fl|2%2(yU}2b-*t_8?EXNHx*70E50EH* za9iHHC%icLct3urxhB?K)<$p`9{QyQZ6xEs`8D(RCoCAs&u63-wWrTnIxNU(4aiWY_77scN`}0 ztzKK*%TkJ-bin)c{yDzRm1cFx_qqSS^QZse8vkGYZ$*I>1y&STQD8-Z6$MrlSW#d_ zffWT-6j)JUMS&Fs-VO!&@BE`{@BHAscdosApXkoqMW~yUx1a`P2V%jsLIyx1zv`0xJrvD6pcy ziUKPNtSGRez={GZ3aluwqQHs*-&G3y(|_=T!h7D2Fn9ltN?KOxTR16?U@B4Y81$o3 ztt_#X=EiiZYFM_FOH5eh@*82)hnvcU4T>l>M|Cf zzx@7}-QC@vefi#(|LVVeaqZnd`!CN5g};6O-+b>cwtw&suU&gL<>ZsR4Z=Q{DWb2H zlV&SVSze=_Z&spasZc6Zo}eV$>DKQCKcc(BMsWYmLd1p!07vw!x#+l9ive_(v}Ug7XtatRv{svGQ*l~B_Vd|d*E$v^9frkR-Yy^;u z;70 z>V2pO7T1(c1G}^<)ThNK0g7=86tZ~NVSM?y88j8E6R&@&n2aSsFEdsEc63ZTnnQ}O zyMcknsResf$#lAy5FAADWw^CJqDt8C1?hVOeuS_#z*%)K64DP1h1uM-ba%5=WUw_n zK6PAcllVkfnU2{(HseKn1R^VZ0u6bZ{{v@eK#w4N9wrB_bq*aF#EziJfdmFtMUNQ? zaBtgzRZJjnaDxtsj%@zl;(I@I$IV~JtoidVhhP4?e}Y}}%`Xdu-|hd~KVQp9FcpbytSdtP3Ym4cjUP%Li)NO2R{QV#PBiw}KcZ3uZRWr{1`+xnn0Z0N^ zD@)8nC&$z*eqyJ|5;M7;&ScL-2zD02<^V{<(d<5(8UT7O?v9Kdgm?@Xs(lQKA}ilb zURcL_simPHY<*WQ4L3YUQ2A1qxBL4ZH+E|T{v?gLI6P)BnEAP7;wIeVCY~j}mA>f& zEXzQ_M#-RW^A$9Iyw&A(huEc0gySmBA>2M$&LGo#c=Yw2L4ty&BJA1SUS9~zz_scy z;-r$a0+5PIN0%^oUV}eM_KC0syZVn{I|Y$>JLXF?z>)?Sg7_)?Tts;UhQcAb4p2$X zQ_d$-8ol7wm>mM?)Tu}V8x=s|HuM(!VttfsTn9{ZoVI2FH!(w{bqdbfyD(R+WS$Zy z(!lz5-HLk#dYu83GRF4J?Z-Qhj(+#S-R;MLhp=|QmJY0xqXO((UR38;7J4z;cmv9S zxY>ExJ!r>JVb`6v`tVNj0@EQtjs1wL*FT=On*Z#-|6p}H+aQsC?&`Tn-_6`pGky16 zx}E887-UW@GI&0&bLyB$^(lSfl0pB4vmqU; zfuA)P9~>keML1e7f*0E9aQ=(A#{;DQUKjM)wni)3OJwOu#yztpgTK=Ik>0LHktLWA z+@!~yA5${Z0+N`!Xph-S^#v!rM`n&87z>&c_;=}HQ)=0~Q^DIq?FSpz|LPWhc+`2` z{|La&2Bt#rQD4y2jArVJXFlngzL2I8fVtLIPY(N-Nqp@V29<0RQ(6wGnMNl1O!@(c zk|DVGvH@i|4+UJ#w49-m%4j1Mu7D0Km9y*0FCFH@kv-uow3lAR$^SM8OzxB-o3Y_Ge?52%;KN zyIVep>EnTJC{1=-Z83F~7|~*2rw_jCD_~!R@Ot8UbpxZtr(9fwn0 z4bb7vry@Yb3aCW6bV~MKYdrwRq-zqp*V{}fA)QW7(t3Q z-3%nL(54NF^g` z(M8nm25Tvotp(fwgd^>4&wNh}*i87-x4{RaL(xcIRr7?s9*!$_%`$Cxle;swFWpq_ z(A9Ggi??yXtjGND5V__r5H)TAnY=A~Bwfe2+ah(!Z5X=@C4?8ghfO6WQ)2~hj5!T8 zGZb$;^c*Sc&1pk%A{TID-{1}>|1cPhffxS}JHWIGR+05I?Z&@0m}g-3+a@5v(SHu2 z{CX*8`Zv3O`)(O_1N2Hi74(T-&2Qv#IsNOti!KsjN0`${tTZEt-=e>aIUr-b3e2dW zhgpqj_h@z~t;fayZeB_Tzs6)RG)c^2Qw8Mcn(bJ20Bl^(-jwQS8GZ0G2N|j`1_?Hm zZHJux8eQbxr2Fgu^RY|R6xl{9X2xQQ^RGi)@hqE>$}&sX(-RyY!JQ7!?EAy(xA=njKIm~Gb!gAoFefZtaOAf+_*vSp*T?QL zSH%dFZ*|*!NTV8r?t!+dLlc}GG>YVa>_=G8ZQf!AGCXl>F`$FgiSm?zz&KL(Q z&|=LPP;~yld+=a95Sab_7%*V&oOp0X9F$K0_@t?Dzt6YsW4b-U*EjB>#2#SAXpBcO zzDv4=+-F-~+Try`$obHw)rw!TIfm(+riEUA*lzUkg6ec0?e#lNw4;z!?Ta|ty5nAZ z-vpQe)FV3lNGH)Cq_Z?fRKCjTmyhznE!UBmfI|z&w@%XPfUMdy_RsQ7D6^uFesUndF;tzRlO0}|*3NH=C zys$wWFe;`Hj>2l3pm+mED0IY8$Dk9v;Ct|Y>6dQsR1QD*isK!_Vova7a=T;BU5jS! zFS^b@#44g^6WziOwJe~u_Z)EJ1$f4iF5@1O)&M5*7(VA~9CUL89*z<4fuUHwekvT^ zQHURO_fvTc3foPA7E|MW=GzEq`se zx!dn!afJt+_$9Ev&E4rlwzG}&`h>W2oP}g^iEX7MUo0lITG(hN0KgM2538+u92P1` zwcN;8bJc2;fz&P@oBRK@xy1CPwqdsua-bqtA^t*xd;WY%tim}>D=>MJs!&n|XtMVT zgff&ulsqw=X{lN~cR%k*#!IVMtTqY|qf)3f0lY4h!&*IVh1F_3SE|?Hr)F)l>DtP% ztH;lRP`%CehG299jz5-xvD+DAw*ZcBM!0uvgw6%xo;YbSDLQy@8c+Qk%W33G)oP_! z2$Mzu{O)p|t**8TVY!-A3i({EP>GV$mNUOVwm=uLa6oUUL6f!*>R*EOup1ueybil| zUb~fXeZVylme{GwT2Lj<)eCu+5f>xGyHU)Aaa?PKNnEbgYlTv+Qmdb~py@qqM@yPET{$ z%OwQoQW`##E=;eb*ycheRJ!V`)EVSzAC*^;Vpsbterpsv=~z44Js_QGc+P^BJ$;(hzjSb8(2yMuWnDeU%koO(^A`T z{)6y%&A`>N@ts5UG~3-b2;lnv*J`r+$qRZN<0>ZSW}UzSp7EovTcaVN48mTDTquZ+ zcQLrmmsqB&}3|2t~ng|4wD0&ZLxPiKL;$ zk`kJiwmQkL+qmS-X?!^5W=l>YUFvp;`r%qus9r%%ABSiDghhyi;LXMX=)&!UN|M3n z?S=x}${$pG@Ni6{FP!e0lp-28lO`EAtzH}Nahgv^HYmS#lz>(i!dKkFg~@$8P-Up5 zDUN}bUa8nRh5j{tze za!??~!Or7TX_;<%X-1er9=KD-#CBbB@Ka?)Sl>X)9wi$=)N?(Ep5m(PIvKre)=V0-l0z)4a~rncLYt-z z4~SSR^Oi^gBiOg5mW3x*O%jjdF)~pM)`C%?&0Kmb zIpnNsDu#YH9v_S>34q1BT8l}b(sF-Vi57BV#yM?sa^Z8I!>7oOBJQkIa#V*Y*tm>a z2yPOlqIq+ZEIl?ss)UBixYLimMm|5A5@zMd*ckUbae0&=tzvm@M|rKa?&Ve61GU*! zuEinqAV{56rudlRlm0=t)ic5qI%JXFN3LM2i(0}g-$;k-#zeZd2Tl8Phqm)we)P@k zNZ27fWs~wBagdQMqD&fTo~g|wcNEnsc_LV=SS){jDhi4elicHMXdhS<&7SBr{Z5~5 zgkBdA7=Znh&7%Rm9!!F1Q6phf5!izmtwg%u-hhxf`@jGM0MX&f=_JoedU3BWrg%hu zDN-!Rcva;4anc;SRBi3Z2OsBckqivhbkuQG4N%B5nOw>S?6JqR9 zaF5owF2w7OT8n5WHpz_bI2za}QI`3!D$BMy9t-tfCq9XoDvdk)`Wt9>`4#tT15U=5H)|BAiu8$?x7Ka;xQ`|_NDO*h5M7LUbApI}u@i18?+BNkRwy8Tj z<9EShBos5qdT@^m8AhI&g)+W)7X~HC)}$zR(^5rW45RaF$5Qv&J~>fkfVvdkafJum znU#x5U0jcVFQabR-PZ2!(;1VW@--6tc)-$7^L2gmlf|G;m~1!1HSxm668t}J61rUhe?6+3jx*XY`|^g2rl zI|vkF63gS@DGnv*UyCT43xg3*F47WqYv)P-ZLxz`*_N5H)wB?k%>q<_uKH74q{Qf5a(3)BobVeY zLvx4K$I4NLiEThF#J)<|w)5qQ^_+}J)mW_oemoSO#B3n_!$#e;1@ADJ2DDj8B75^Y zU~lbeyZvj8i(n8ud{!y6(;kh@vnJxS(TO~YCwbhW!k<(zuGC_&{f851~P>W4M~ z`MM{}Zk%8x`6wlbN=kUIDPptsF`LAOKY&m8rD^3I(e;Lvlsd*2HJ-G4FN3@NF+OLH ztnl%0#QEU}%>$Wld1FpreHg=f8f5YeelfXaG`^9xixg--dVySlENTxw89(6?#2ae9 z5-Sh*R8|IybHxD3V4fkLpq?bf#u(zH$;{ocq=M-}S?)#j8O8FZv)C1@N3v4`J=uv{ zhemb47?}7?rNC=`!F`-WU|kq{*?hI8aCn@lN8~Ly=&`1469p~-a#JWqMZ%}h zJmvi~_8}oN4d_m+HI0Wl!`FakPoM_#OT0C+D)*RCQM31UhqNgU=q^VL0h{O2t(r3* z+y!ex`T{q#KLU~Ou3T@P$Tsj zBYT8CwC{Qg%XKPJy3Ucr3Lo|33DSv)BE$A`;wzr`2nDJM0nr?AS{~psWL&*Q{`>ow zUc+#^vA>6v6?{ng=y7Kr?*S_*0`0HW~0FGKvEY*T?S+$b4<6qmS z)p98xY}P74ITtV##?^56^H#ePb||shAWjn~-ah@oYy5;u03Iy#7Je_cs*RAJFoVm8 z$a0sb=+gXz<&8?YTqqa*8rY3oZtYY*p)s9qR>ZZCeF=-zVid;JCS?(o3f5cFDi;fd z&F4aX2?>(x8vjhy%Gq`*ZZ|21$gSs(RYNHMe{?XsvAMY*=f?bYSF$3ag?}ZkRim(! zkCi50tdL(G=ffxgA+V5d77LZ?87d;?t09)zf`KF{oFP4l=TqAf_8mS)*JG!Uwmu9w z=YU2YsKCUc4QF&LmGYHVxmB%)wPGzF7L%kIRtuG8m@nsm7iv}uwR~$+dVRJGaS*!M zVhQN5@jqQ;?rA=KZ9QMhtw*(-82^lmsW+2au2zb|R?^6Y#T?73CapNE#TI6rVsOzp zEuhIU>k6qk(+ig_Sty^cWMP?8=yHzSrEdk3Y=ETOxS(|PABngb5{pRZ~Lj<-CLYvIyjfvcKe@wRFP{y&_}Fth*w delta 4052 zcmeHKU2GKB8QnX(UUt{s9RmhTO_Z?%#3XokW_Etp#@HC+Rv1D;t14{`zB6;jyJ9_S zX4b4i(l}Os^3yhwWSZ0+Ld;6XTCe%-0$4;oip>)8+A|py5>OB!f+rESVsP{KlGzgyc#CQXk;7tYVkE*e#4jXf=u~2WK1Givz8mjNEQ^1Q+`J|})*Bj+14Cv7frn5} zD+X(_Mq1Kj(-c`*GzG+Jf*>J9V_BrDiVj(o=Q&O?bWIi0CR9XCiuqYgLzQG+OY4SC zMk>?=k_QQC0qK&Uq!meL6@_P6T{a~{OlxV);1@wdft<*yqN3vCe&TArKRkD5-%7Q2xoTw>+tU)ual9D9yCpABc(uh2RlT=w^QP@wTD-fy%hZK%1 zUWF>bOOzx=!>iUtc+UNa3=(+!Pd1zl22!4%~*R7oW&uL~+dBBwxsGYnOLq9F$TEN)Ee3R4@& zMn>JYvt1KMBK7~@@c*F=UlAjX9;1&3=)V$Cn4z!GZ_yX%Y5GliiauU$W)9J@Sa3P8 z(ViSCl~11QC+b2^1<1?`^c2yhAJFcz*XqmD*OdCj(O4i{vn~*SA>I=^8LyAF*Q|TF z0bCE3>Cp91DBd36%8BUj!}vN4qAThm7X$P;dRyXZqBg!G4(h&Nx3%_i?5*hK$VH+q zKaNaZYy|9r2n9|DB8S0ga_yBlxoUR5o?TEECu^s`jzDA#>>%++z~qi@5DDQM8$cN_ z?trldf7kszsn}XS2ls4;a~A!HGbn5Xh~$4 z4am;tET*+kbk^Xp<3Po0`#^Mz$-*Mzpqzy)Mng`)GLTJ%kD%OMri~f348|#?vWwz_tdrz%L{`s++>E;FTZ+-~+=CMs=gq}$paq{d0HNW(Zc;aS6u$N@DBu$YIe1)b=-$}flVP@;dCel5Jxj)GSHWkn zXo44Fl|A+*d0U+H*Kl7;=T=m5>_TC1mOh@|j9YxVD~qQ>C$SHLR2 zNfob2Yk(icrFU5^pb+_(2Id&MZ zpwg$iKLG3^(x)(oY|;_dEIbeW1w4pfa>2>^3Ot`J*hOZwM-%+|A@D#2seAqm5-UFr zs5_^dgUY+vJ!hr}!5IA0KZ1vSsJg3Ak?5!AkxN#2;T9>Yk}EJBhj7P z_$}prd)LE3R!-ybjbID@P6xFL|6wE5>OPH{um(W}AInhp;BRT5Ddd+krGe)Fg9mgV zyXVd1Scj3@!{~YFIO|&UBHZZ|3-)6zogHxAMTP_fBCAZ+M&`PfY_T}vWKyY8sgxvQ zMpSKA9@@#`p45nq90#QgRD`*F%8#`<*+Qw!AuAjjXj=r zWsAf4md-6GYcroB+UGEPM;U_#@3DxQN= zAda_Xs1Tl3sGd1wB~H4nZ6k|H3#ulu+&78deVaX#XvGIsQ&BuJ0YY8oUA~TDFaf42 z6nv4U?pxwpg(tnv5cF!SI0jb+DSYG|Otlm9ZD7NF~8&vax%9z35I7PiW%giP%R^V=H=Zdojc6vnJdGO%&#se#3ReXnid{g_#>GEgN6%E`rLnXTI_B#Z> z^AdH{!}orIG_}IBV*AW%*?bk)bxpwy7`;rrSOxa*1huqw)&!W%eZJY@krR~fb~PNQ z@Uj~vX7|gc;H=qwY`!@Z+1IIA17UEcG1%z=ShLxC_nJKD%b_;|@0g+b8a{ewA)d-h zl}5*nk5epN`4kkyBqtNgRq>U_sclQG(R_X_(_$b!=i~}jONQ~T;P;=Pn%(``@Df4X zUy9z5!SSwt=ksj-*BQQ-AvAp60{wU}L0am8SE)^R$>oGQwreEJ&C&SH=KlbV=LGg< Q27eCBQvhC3lv}m+A4wL;uK)l5 diff --git a/docs/PROJECT_PLAN.md b/docs/PROJECT_PLAN.md index c758f5e..3c61216 100644 --- a/docs/PROJECT_PLAN.md +++ b/docs/PROJECT_PLAN.md @@ -13,7 +13,7 @@ Eine modulare News-Pipeline mit klaren Stufen: 2. Inhaltsanalyse und Normalisierung 3. Rewrite/Anreicherung 4. Legal- und Qualitaetschecks -5. WordPress-Publikation (`pending`) +5. WordPress-Publikation (Draft-first, Queue + Retry) 6. Monitoring/Logging ## Grobe Zeitplanung (ohne Fixtermine) @@ -36,12 +36,14 @@ Eine modulare News-Pipeline mit klaren Stufen: - Feed-Import mit Duplikaterkennung - Admin-Login (ein User) - Manuelle Review vor Publish +- Admin-UI fuer Rechtscheck, Bildauswahl, Relevanzbewertung ### Phase 2 - Automation - Job-Queue (asynchron) - Regelbasierte Scheduler - Retry/Dead-Letter-Handling - Robustes Error-Reporting +- WordPress-Publisher (Draft) mit Mapping `article_id -> wp_post_id` ### Phase 3 - Compliance und Skalierung - Source-Whitelisting mit Pflichtfeldern @@ -49,6 +51,28 @@ Eine modulare News-Pipeline mit klaren Stufen: - Qualitaetsmetriken und Audit-Logs - Optional: Passkey/WebAuthn +## Aktueller Stand (Snapshot) +- Backend/API + Admin-UI lauffaehig +- Feed-Ingestion inkl. Originalartikel-Extraktion (Autor, Pressekontakt, Bilder) +- Bildkuration: + - automatische Scoring-Reduktion (u. a. Presseportal `story_big` priorisiert) + - manuelle Auswahl/Ausblendung im UI +- Rechts-/Publish-Gates aktiv: + - `legal_checked` Pflicht + - Hauptbild-Auswahl Pflicht + - Status-Workflow bis `published` +- WordPress-Publishing: + - Queue + Retry + Job-Historie + - Draft-Erstellung/Update erfolgreich getestet +- Exporte: + - JSON/CSV inkl. Datum/Alter/Relevanz + Attribution/Legal-Felder + +## Naechste Iteration (konkret) +1. WordPress `featured_media` Upload aus ausgewaehltem Hauptbild +2. Publish-HTML je Artikel verfeinern (strukturierter Body + konsistenter Quellenblock) +3. Publisher als periodischen Worker (Timer/Cron/Systemd) auf Hetzner betreiben +4. Monitoring/Alerting fuer Queue-Fehler + WP-API Fehlercodes + ## Architekturprinzipien - Idempotente Jobs - Trennung von UI, API, Worker diff --git a/docs/TODO.md b/docs/TODO.md index ad9b549..fee4a67 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -1,10 +1,10 @@ # ToDo (Ein-Entwickler Setup) ## Jetzt -- [ ] GitHub Project #3 Felder/Views fuer Neustart vereinheitlichen -- [ ] Alte/obsolet gewordene Issues kennzeichnen (z. B. User-Verwaltung) -- [ ] Redirect `news.vanityontour.de -> vanityontour.de` aktiv halten -- [ ] Wiki-Basis fertigstellen und verlinken +- [ ] WordPress Beitragsbild-Upload implementieren (`featured_media` aus ausgewaehltem Hauptbild) +- [ ] WordPress-HTML-Ausgabe pro Artikel weiter verbessern (sauberes Layout, Quellenblock, Shortcodes falls noetig) +- [ ] Publisher Fehlertexte fuer WP-Auth/Media/API in UI klarer darstellen +- [ ] End-to-end Publish Smoke-Test dokumentieren (lokal + Hetzner) ## MVP - [x] Neues Backend-Skelett (`backend/`) aufsetzen (FastAPI) @@ -12,14 +12,18 @@ - [x] Feed-Ingestion Service bauen (ETag/Last-Modified) - [x] Duplikaterkennung ueber `source_url`, `guid`, Hash - [x] Login mit 1 Admin-Account implementieren -- [ ] Artikel-Review-Maske mit Statusworkflow -- [ ] WordPress-Publisher als separaten Service implementieren +- [x] Artikel-Review-Maske mit Statusworkflow +- [x] WordPress-Publisher als separaten Service implementieren (Queue + Retry + Mapping) +- [x] Bildvorschau + manuelle Bildauswahl im Admin-UI +- [x] Automatische Bildreduktion/Scoring fuer Presseportal-Quellen +- [x] Artikel-Datum + Relevanzscore im UI/Export ## Recht/Qualitaet -- [ ] Source-Policy in DB + Admin-UI abbilden -- [ ] Pflichtfelder je Quelle erzwingen (Autor, URL, Lizenz, Hinweise) -- [ ] Auto-Block bei fehlender Lizenzinfo -- [ ] Pro Artikel Attribution-Block generieren +- [x] Source-Policy in DB + Admin-UI abbilden +- [x] Pflichtfelder je Quelle erzwingen (Autor, URL, Lizenz, Hinweise) +- [x] Auto-Block bei fehlender Lizenzinfo +- [x] Pro Artikel Attribution-Block generieren +- [x] Manuelle Rechtsfreigabe als Publish-Gate ## Betrieb - [ ] Systemd-Service(s) fuer API/Worker erstellen @@ -31,3 +35,4 @@ - [ ] Passkey/WebAuthn evaluieren und optional einfuehren - [ ] Migration auf PostgreSQL bewerten - [ ] Teilautomatische Freigabe-Regeln definieren +- [ ] KI-Rewrite mit Prompt-Versionierung + Qualitaetsmetriken wieder aktivieren From e68b6a41fdaf7f33835e80632cb4522b4b7e0ee2 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 13:07:08 +0100 Subject: [PATCH 47/87] feat(wordpress): upload selected image and set featured_media on draft publish --- backend/app/wordpress.py | 87 +++++++++++++++++++++++++++++++++ backend/tests/test_wordpress.py | 63 ++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 backend/tests/test_wordpress.py diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index adb4d9c..756a346 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -2,7 +2,10 @@ from __future__ import annotations import base64 import json +import mimetypes +from pathlib import Path from typing import Any +from urllib.parse import urlparse from urllib.request import Request, urlopen from .config import get_settings @@ -56,6 +59,77 @@ def _selected_image_url_from_meta(meta_json: str | None) -> str | None: return selected if isinstance(selected, str) and selected.strip() else None +def _download_image_bytes(url: str) -> tuple[bytes, str]: + req = Request( + url=url, + headers={ + "User-Agent": "rss-news-publisher/1.0", + "Accept": "image/avif,image/webp,image/apng,image/*,*/*;q=0.8", + }, + ) + with urlopen(req, timeout=20) as resp: + raw = resp.read() + content_type = resp.headers.get("Content-Type", "application/octet-stream") + if not content_type.lower().startswith("image/"): + raise RuntimeError(f"Ausgewählte Bild-URL liefert kein Bild ({content_type})") + return raw, content_type + + +def _guess_filename(image_url: str, content_type: str) -> str: + parsed = urlparse(image_url) + stem = Path(parsed.path).name or "article-image" + if "." not in stem: + ext = mimetypes.guess_extension(content_type.split(";")[0].strip()) or ".jpg" + stem = f"{stem}{ext}" + return stem + + +def _upload_featured_media( + *, + base_url: str, + auth_header: str, + image_url: str, + article_title: str, + source_url: str, +) -> int: + image_bytes, content_type = _download_image_bytes(image_url) + filename = _guess_filename(image_url, content_type) + + media_url = f"{base_url.rstrip('/')}/wp-json/wp/v2/media" + media_req = Request( + url=media_url, + data=image_bytes, + method="POST", + headers={ + "Authorization": auth_header, + "Content-Type": content_type, + "Content-Disposition": f'attachment; filename="{filename}"', + "Accept": "application/json", + "User-Agent": "rss-news-publisher/1.0", + }, + ) + with urlopen(media_req, timeout=30) as resp: + media_raw = resp.read().decode("utf-8", errors="replace") + media_payload = json.loads(media_raw) if media_raw else {} + media_id = int(media_payload.get("id", 0)) if isinstance(media_payload, dict) else 0 + if media_id <= 0: + raise RuntimeError(f"WordPress Media-Upload fehlgeschlagen: {media_payload}") + + # Optional metadata update for traceability. + _wp_request( + base_url=base_url, + auth_header=auth_header, + method="POST", + endpoint=f"media/{media_id}", + payload={ + "title": f"{article_title[:120]} - Bild", + "caption": f"Quelle: {source_url}", + "alt_text": article_title[:200], + }, + ) + return media_id + + def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: settings = get_settings() if not settings.wordpress_base_url or not settings.wordpress_username or not settings.wordpress_app_password: @@ -76,11 +150,24 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: footer += f"\n

Canonical: {canonical_url}

" content = f"{body}{footer}" + featured_media_id = None + selected_image_url = _selected_image_url_from_meta(article.get("meta_json")) + if selected_image_url: + featured_media_id = _upload_featured_media( + base_url=settings.wordpress_base_url, + auth_header=auth, + image_url=selected_image_url, + article_title=title, + source_url=source_url, + ) + payload = { "title": title, "content": content, "status": settings.wordpress_default_status, } + if featured_media_id: + payload["featured_media"] = featured_media_id wp_post_id = article.get("wp_post_id") if wp_post_id: diff --git a/backend/tests/test_wordpress.py b/backend/tests/test_wordpress.py new file mode 100644 index 0000000..f12c6e1 --- /dev/null +++ b/backend/tests/test_wordpress.py @@ -0,0 +1,63 @@ +import os +import unittest +from unittest.mock import patch + +from backend.app import config as config_module +from backend.app.wordpress import publish_article_draft + + +class TestWordpressPublish(unittest.TestCase): + def setUp(self) -> None: + os.environ["WORDPRESS_BASE_URL"] = "https://example.org" + os.environ["WORDPRESS_USERNAME"] = "wp-user" + os.environ["WORDPRESS_APP_PASSWORD"] = "wp-pass" + config_module.get_settings.cache_clear() + + def tearDown(self) -> None: + for key in ("WORDPRESS_BASE_URL", "WORDPRESS_USERNAME", "WORDPRESS_APP_PASSWORD"): + os.environ.pop(key, None) + config_module.get_settings.cache_clear() + + @patch("backend.app.wordpress._upload_featured_media") + @patch("backend.app.wordpress._wp_request") + def test_publish_sets_featured_media_when_selected_image_exists(self, mock_wp_request, mock_upload_media) -> None: + mock_upload_media.return_value = 456 + mock_wp_request.return_value = {"id": 321, "link": "https://example.org/?p=321"} + + article = { + "title": "Testartikel", + "content_raw": "Inhalt", + "source_url": "https://example.com/source", + "canonical_url": "https://example.com/source", + "meta_json": '{"image_review":{"selected_url":"https://example.com/image.jpg"}}', + } + post_id, post_url = publish_article_draft(article) + + self.assertEqual(post_id, 321) + self.assertIn("?p=321", post_url or "") + self.assertTrue(mock_upload_media.called) + payload = mock_wp_request.call_args.kwargs["payload"] + self.assertEqual(payload.get("featured_media"), 456) + + @patch("backend.app.wordpress._upload_featured_media") + @patch("backend.app.wordpress._wp_request") + def test_publish_without_selected_image_has_no_featured_media(self, mock_wp_request, mock_upload_media) -> None: + mock_wp_request.return_value = {"id": 654, "link": "https://example.org/?p=654"} + + article = { + "title": "Testartikel", + "content_raw": "Inhalt", + "source_url": "https://example.com/source", + "canonical_url": "https://example.com/source", + "meta_json": "{}", + } + post_id, _ = publish_article_draft(article) + + self.assertEqual(post_id, 654) + self.assertFalse(mock_upload_media.called) + payload = mock_wp_request.call_args.kwargs["payload"] + self.assertNotIn("featured_media", payload) + + +if __name__ == "__main__": + unittest.main() From 24d8e5ad0fdbd76608cdb1920e2c3149288655df Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 13:09:00 +0100 Subject: [PATCH 48/87] feat(wordpress): improve post html structure and excerpt generation --- backend/app/wordpress.py | 86 ++++++++++++++++++++++++++++----- backend/tests/test_wordpress.py | 4 ++ 2 files changed, 79 insertions(+), 11 deletions(-) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index 756a346..fbf4443 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -1,9 +1,11 @@ from __future__ import annotations import base64 +from html import escape import json import mimetypes from pathlib import Path +import re from typing import Any from urllib.parse import urlparse from urllib.request import Request, urlopen @@ -130,6 +132,75 @@ def _upload_featured_media( return media_id +def _as_paragraph_html(text: str) -> str: + chunks = [chunk.strip() for chunk in re.split(r"\n{2,}", text.strip()) if chunk.strip()] + if not chunks: + return "" + lines = [] + for chunk in chunks: + compact = re.sub(r"\s*\n\s*", " ", chunk) + lines.append(f"

{escape(compact)}

") + return "\n".join(lines) + + +def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: + source_url = article.get("source_url") or "" + canonical_url = article.get("canonical_url") or source_url + summary = (article.get("summary") or "").strip() + body_text = (article.get("content_rewritten") or article.get("content_raw") or "").strip() + if not body_text: + body_text = summary + + # Keep existing HTML if already present, otherwise wrap plain text into paragraphs. + has_html = bool(re.search(r"<[a-zA-Z][^>]*>", body_text)) + body_html = body_text if has_html else _as_paragraph_html(body_text) + if not body_html: + body_html = "

Kein Inhalt verfügbar.

" + + author = (article.get("author") or "").strip() + published_at = (article.get("published_at") or "").strip() + source_name = (article.get("source_name_snapshot") or "").strip() + license_name = (article.get("source_license_name_snapshot") or "").strip() + terms_url = (article.get("source_terms_url_snapshot") or "").strip() + press_contact = (article.get("press_contact") or "").strip() + + lead_html = f"

{escape(summary)}

\n" if summary else "" + + facts: list[str] = [] + if author: + facts.append(f"
  • Autor: {escape(author)}
  • ") + if published_at: + facts.append(f"
  • Veröffentlicht (Quelle): {escape(published_at)}
  • ") + if source_name: + facts.append(f"
  • Quelle: {escape(source_name)}
  • ") + if license_name: + facts.append(f"
  • Lizenz: {escape(license_name)}
  • ") + if terms_url: + facts.append(f"
  • Lizenzhinweise: {escape(terms_url)}
  • ") + + facts_html = ( + "

    Artikeldetails

    \n
      \n" + "\n".join(facts) + "\n
    \n" + if facts + else "" + ) + press_contact_html = ( + f"

    Pressekontakt

    \n

    {escape(press_contact)}

    \n" if press_contact else "" + ) + attribution_html = ( + "
    \n
    \n" + "

    Quelle

    \n" + f"

    Originalartikel: {escape(source_url)}

    \n" + ) + if canonical_url and canonical_url != source_url: + attribution_html += f"

    Canonical: {escape(canonical_url)}

    \n" + attribution_html += "
    " + + content = f"{lead_html}{body_html}\n\n{facts_html}{press_contact_html}{attribution_html}".strip() + excerpt_source = summary or re.sub(r"\s+", " ", body_text).strip() + excerpt = excerpt_source[:220] if excerpt_source else None + return content, excerpt + + def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: settings = get_settings() if not settings.wordpress_base_url or not settings.wordpress_username or not settings.wordpress_app_password: @@ -137,18 +208,9 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: auth = _auth_header(settings.wordpress_username, settings.wordpress_app_password) - source_url = article.get("source_url") or "" - canonical_url = article.get("canonical_url") or source_url title = (article.get("title") or "Ohne Titel").strip() - body = (article.get("content_rewritten") or article.get("content_raw") or "").strip() - if not body: - body = article.get("summary") or "" - - footer = "\n\n
    \n

    Quelle: " - footer += f"{source_url}

    " - if canonical_url and canonical_url != source_url: - footer += f"\n

    Canonical: {canonical_url}

    " - content = f"{body}{footer}" + content, excerpt = _build_post_content(article) + source_url = article.get("source_url") or "" featured_media_id = None selected_image_url = _selected_image_url_from_meta(article.get("meta_json")) @@ -166,6 +228,8 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: "content": content, "status": settings.wordpress_default_status, } + if excerpt: + payload["excerpt"] = excerpt if featured_media_id: payload["featured_media"] = featured_media_id diff --git a/backend/tests/test_wordpress.py b/backend/tests/test_wordpress.py index f12c6e1..2c9094e 100644 --- a/backend/tests/test_wordpress.py +++ b/backend/tests/test_wordpress.py @@ -38,6 +38,9 @@ class TestWordpressPublish(unittest.TestCase): self.assertTrue(mock_upload_media.called) payload = mock_wp_request.call_args.kwargs["payload"] self.assertEqual(payload.get("featured_media"), 456) + self.assertIn("

    Quelle

    ", payload.get("content", "")) + self.assertIn("Originalartikel", payload.get("content", "")) + self.assertEqual(payload.get("excerpt"), "Inhalt") @patch("backend.app.wordpress._upload_featured_media") @patch("backend.app.wordpress._wp_request") @@ -57,6 +60,7 @@ class TestWordpressPublish(unittest.TestCase): self.assertFalse(mock_upload_media.called) payload = mock_wp_request.call_args.kwargs["payload"] self.assertNotIn("featured_media", payload) + self.assertIn("

    Inhalt

    ", payload.get("content", "")) if __name__ == "__main__": From 8d7375c99fe8c20b2e08a2e5379570f507bea3fe Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 13:11:43 +0100 Subject: [PATCH 49/87] feat(ui): classify publisher errors with actionable hints --- backend/app/admin_ui.py | 21 ++++++++++++++++ backend/static/admin.css | 34 ++++++++++++++++++++++++++ backend/templates/admin_dashboard.html | 12 +++++++-- 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index fba1b91..bde281d 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -169,6 +169,23 @@ def _publish_readiness(article: dict, meta: dict) -> tuple[bool, list[str]]: return len(reasons) == 0, reasons +def _classify_publish_error(error_message: str | None) -> tuple[str, str]: + text = (error_message or "").lower() + if not text.strip(): + return "ok", "-" + if "rechtsfreigabe fehlt" in text or "hauptbild nicht gesetzt" in text or "status ist nicht" in text: + return "policy", "Artikelvoraussetzungen im UI prüfen (Status/Rechtsfreigabe/Hauptbild)." + if "401" in text or "403" in text or "authorization" in text or "forbidden" in text or "unauthorized" in text: + return "auth", "WordPress Nutzer/App-Passwort prüfen." + if "404" in text and ("media" in text or "posts" in text or "wp-json" in text): + return "api", "WordPress REST-Endpunkt prüfen (`/wp-json/wp/v2`)." + if "timed out" in text or "timeout" in text or "nodename nor servname provided" in text or "name or service not known" in text: + return "dns", "DNS/Netzwerk zur WordPress-Domain prüfen." + if "media-upload fehlgeschlagen" in text or "liefert kein bild" in text or "featured_media" in text: + return "media", "Bild-URL/Format prüfen oder anderes Hauptbild auswählen." + return "unknown", "Fehlerdetails prüfen und bei Bedarf Job erneut starten." + + def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]: meta = article.get("meta", {}) extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} @@ -289,6 +306,10 @@ def admin_dashboard(request: Request): feeds = list_feeds() runs = list_runs(limit=30) publish_jobs = list_publish_jobs(limit=30) + for job in publish_jobs: + category, hint = _classify_publish_error(job.get("error_message")) + job["error_category"] = category + job["error_hint"] = hint status_filter = request.query_params.get("status_filter") if status_filter in {"new", "rewrite", "review", "approved", "published", "error"}: articles = list_articles(limit=100, status_filter=status_filter) diff --git a/backend/static/admin.css b/backend/static/admin.css index 16d55be..053263a 100644 --- a/backend/static/admin.css +++ b/backend/static/admin.css @@ -131,6 +131,40 @@ button.secondary { color: #991b1b; } +.badge.errcat { + margin-bottom: 4px; +} + +.badge.errcat-policy { + background: #fee2e2; + color: #991b1b; +} + +.badge.errcat-auth { + background: #ffedd5; + color: #9a3412; +} + +.badge.errcat-dns { + background: #dbeafe; + color: #1e40af; +} + +.badge.errcat-media { + background: #fef9c3; + color: #854d0e; +} + +.badge.errcat-api { + background: #ede9fe; + color: #5b21b6; +} + +.badge.errcat-unknown { + background: #e2e8f0; + color: #334155; +} + .alert { margin-bottom: 12px; padding: 10px; diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index fe811a5..f318355 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -256,7 +256,7 @@

    Publish Jobs

    - + {% for j in publish_jobs %} @@ -274,7 +274,15 @@ - {% endif %} - + + {% endfor %} From 35ccceb26058cfbf3268568e9fdc3fdc6f0fb5ee Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 13:43:22 +0100 Subject: [PATCH 50/87] feat(workflow): simplify article flow and add automated rewrite step --- backend/app/admin_ui.py | 98 ++++++++++++----- backend/app/config.py | 2 + backend/app/main.py | 113 ++++++++++++-------- backend/app/publisher.py | 4 +- backend/app/rewrite.py | 83 ++++++++++++++ backend/app/wordpress.py | 19 +++- backend/app/workflow.py | 39 +++++++ backend/templates/admin_article_detail.html | 9 +- backend/templates/admin_dashboard.html | 16 ++- backend/tests/test_article_workflow.py | 38 +++---- backend/tests/test_wordpress.py | 18 ++++ 11 files changed, 332 insertions(+), 107 deletions(-) create mode 100644 backend/app/rewrite.py create mode 100644 backend/app/workflow.py diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index bde281d..e9bfae4 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -17,6 +17,7 @@ from .ingestion import run_ingestion from .policy import evaluate_source_policy from .publisher import enqueue_publish, run_publisher from .relevance import article_age_days, article_relevance +from .rewrite import rewrite_article_text from .repositories import ( FeedCreate, SourceCreate, @@ -31,19 +32,21 @@ from .repositories import ( list_sources, set_article_image_decision, set_article_legal_review, + upsert_article, update_article_status, + ArticleUpsert, ) +from .workflow import ALLOWED_UI_TRANSITIONS, UI_STATUSES, internal_to_ui_status, ui_to_internal_status settings = get_settings() router = APIRouter(tags=["admin-ui"]) templates = Jinja2Templates(directory=str(Path(__file__).resolve().parent.parent / "templates")) ALLOWED_TRANSITIONS: dict[str, tuple[str, ...]] = { - "new": ("review", "rewrite", "error"), - "rewrite": ("review", "error"), - "review": ("approved", "rewrite", "error"), - "approved": ("published", "error"), - "published": ("error",), - "error": ("review", "rewrite"), + "new": ("rewrite", "close"), + "rewrite": ("publish", "close"), + "publish": ("published", "close"), + "published": ("close",), + "close": ("rewrite",), } IMAGE_PROXY_USER_AGENT = "rss-news-admin/1.0" @@ -158,10 +161,8 @@ def _build_image_entries(article: dict, extraction: dict, meta: dict) -> list[di def _publish_readiness(article: dict, meta: dict) -> tuple[bool, list[str]]: reasons: list[str] = [] - if article.get("status") not in {"approved", "published"}: - reasons.append("Status ist nicht 'approved'") - if int(article.get("legal_checked", 0)) != 1: - reasons.append("Rechtsfreigabe fehlt") + if internal_to_ui_status(article.get("status")) not in {"publish", "published"}: + reasons.append("Status ist nicht 'publish'") image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} selected_image = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None if not selected_image: @@ -311,8 +312,9 @@ def admin_dashboard(request: Request): job["error_category"] = category job["error_hint"] = hint status_filter = request.query_params.get("status_filter") - if status_filter in {"new", "rewrite", "review", "approved", "published", "error"}: - articles = list_articles(limit=100, status_filter=status_filter) + internal_filter = ui_to_internal_status(status_filter) if status_filter else None + if status_filter in set(UI_STATUSES): + articles = list_articles(limit=100, status_filter=internal_filter) else: status_filter = "" articles = list_articles(limit=100) @@ -336,6 +338,7 @@ def admin_dashboard(request: Request): article["extraction_error"] = extraction.get("extraction_error") if isinstance(extraction.get("extraction_error"), str) else None article["days_old"] = article_age_days(article.get("published_at")) article["relevance"] = article_relevance(article.get("published_at")) + article["status_ui"] = internal_to_ui_status(article.get("status")) return templates.TemplateResponse( request, @@ -350,7 +353,7 @@ def admin_dashboard(request: Request): "runs": runs, "publish_jobs": publish_jobs, "articles": articles, - "status_options": ["new", "rewrite", "review", "approved", "published", "error"], + "status_options": list(UI_STATUSES), "allowed_transitions": ALLOWED_TRANSITIONS, "status_filter": status_filter, "flash_msg": request.query_params.get("msg", ""), @@ -388,6 +391,7 @@ def admin_article_detail(request: Request, article_id: int): ) article["days_old"] = article_age_days(article.get("published_at")) article["relevance"] = article_relevance(article.get("published_at")) + article["status_ui"] = internal_to_ui_status(article.get("status")) feed = get_feed_by_id(int(article["feed_id"])) if article.get("feed_id") else None checklist = _legal_checklist(article, feed) @@ -401,7 +405,7 @@ def admin_article_detail(request: Request, article_id: int): "article": article, "feed": feed, "checklist": checklist, - "allowed_transitions": ALLOWED_TRANSITIONS.get(article.get("status"), ()), + "allowed_transitions": ALLOWED_TRANSITIONS.get(article.get("status_ui"), ()), "flash_msg": request.query_params.get("msg", ""), "flash_type": request.query_params.get("type", "success"), }, @@ -565,12 +569,56 @@ def admin_review_article(request: Request, article_id: int, decision: str = Form if not user: return RedirectResponse(url="/admin/login", status_code=303) + return _dashboard_redirect(msg="Review-Aktion wurde durch Rewrite ersetzt", msg_type="error") + + +@router.post("/admin/articles/{article_id}/rewrite-run") +def admin_rewrite_run(request: Request, article_id: int): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) article = get_article_by_id(article_id) - if article and article.get("status") == "review" and decision in {"approve", "reject"}: - target = "approved" if decision == "approve" else "rewrite" - update_article_status(article_id, target, actor=user, note=note or None, decision=decision) - return _dashboard_redirect(msg=f"Artikel #{article_id}: {decision}") - return _dashboard_redirect(msg=f"Review-Aktion ungueltig fuer Artikel #{article_id}", msg_type="error") + if not article: + return _dashboard_redirect(msg=f"Artikel #{article_id} nicht gefunden", msg_type="error") + if internal_to_ui_status(article.get("status")) not in {"new", "rewrite"}: + return _dashboard_redirect(msg=f"Rewrite nur aus new/rewrite fuer Artikel #{article_id}", msg_type="error") + try: + rewritten = rewrite_article_text(article) + except Exception as exc: + return _dashboard_redirect(msg=f"Rewrite fehlgeschlagen fuer Artikel #{article_id}: {exc}", msg_type="error") + + upsert_article( + ArticleUpsert( + feed_id=article.get("feed_id"), + source_article_id=article.get("source_article_id"), + source_hash=article.get("source_hash"), + title=article.get("title"), + source_url=article.get("source_url"), + canonical_url=article.get("canonical_url"), + published_at=article.get("published_at"), + author=article.get("author"), + summary=article.get("summary"), + content_raw=article.get("content_raw"), + content_rewritten=rewritten, + image_urls_json=article.get("image_urls_json"), + press_contact=article.get("press_contact"), + source_name_snapshot=article.get("source_name_snapshot"), + source_terms_url_snapshot=article.get("source_terms_url_snapshot"), + source_license_name_snapshot=article.get("source_license_name_snapshot"), + legal_checked=bool(int(article.get("legal_checked", 0))), + legal_checked_at=article.get("legal_checked_at"), + legal_note=article.get("legal_note"), + wp_post_id=article.get("wp_post_id"), + wp_post_url=article.get("wp_post_url"), + publish_attempts=int(article.get("publish_attempts", 0)), + publish_last_error=article.get("publish_last_error"), + published_to_wp_at=article.get("published_to_wp_at"), + word_count=len(rewritten.split()), + status="approved", + meta_json=article.get("meta_json"), + ) + ) + return _dashboard_redirect(msg=f"Rewrite fertig fuer Artikel #{article_id} -> publish") @router.post("/admin/articles/{article_id}/transition") @@ -581,10 +629,10 @@ def admin_transition_article(request: Request, article_id: int, target_status: s article = get_article_by_id(article_id) if article: - current = article.get("status") - if target_status in ALLOWED_TRANSITIONS.get(current, ()): - if target_status == "published" and int(article.get("legal_checked", 0)) != 1: - return _dashboard_redirect(msg=f"Publish blockiert fuer Artikel #{article_id}: Rechtsfreigabe fehlt", msg_type="error") - update_article_status(article_id, target_status, actor=user, note=note or None) - return _dashboard_redirect(msg=f"Artikel #{article_id}: {current} -> {target_status}") + current_ui = internal_to_ui_status(article.get("status")) + target_internal = ui_to_internal_status(target_status) + target_ui = internal_to_ui_status(target_internal) + if target_ui in ALLOWED_TRANSITIONS.get(current_ui, ()): + update_article_status(article_id, target_internal, actor=user, note=note or None) + return _dashboard_redirect(msg=f"Artikel #{article_id}: {current_ui} -> {target_ui}") return _dashboard_redirect(msg=f"Ungueltiger Statuswechsel fuer Artikel #{article_id}", msg_type="error") diff --git a/backend/app/config.py b/backend/app/config.py index fc52ec3..43629ba 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -30,6 +30,8 @@ class Settings(BaseSettings): wordpress_username: str | None = Field(default=None, validation_alias=AliasChoices("WORDPRESS_USERNAME", "WP_USERNAME")) wordpress_app_password: str | None = Field(default=None, validation_alias=AliasChoices("WORDPRESS_APP_PASSWORD", "WP_PASSWORD")) wordpress_default_status: str = "draft" + openai_api_key: str | None = Field(default=None, validation_alias=AliasChoices("OPENAI_API_KEY")) + openai_model: str = "gpt-4o-mini" @lru_cache(maxsize=1) diff --git a/backend/app/main.py b/backend/app/main.py index c0a0143..4dcee28 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -18,6 +18,7 @@ from .ingestion import run_ingestion from .policy import evaluate_source_policy, is_source_allowed from .publisher import enqueue_publish, run_publisher from .relevance import article_age_days, article_relevance +from .rewrite import rewrite_article_text from .repositories import ( ArticleUpsert, FeedCreate, @@ -40,6 +41,7 @@ from .repositories import ( update_article_status, upsert_article as repo_upsert_article, ) +from .workflow import ALLOWED_UI_TRANSITIONS, UI_STATUSES, internal_to_ui_status, ui_to_internal_status settings = get_settings() @@ -119,7 +121,7 @@ class ArticleUpsertRequest(BaseModel): publish_last_error: str | None = None published_to_wp_at: str | None = None word_count: int = 0 - status: str = Field(default="new", pattern="^(new|rewrite|review|approved|published|error)$") + status: str = Field(default="new", pattern="^(new|rewrite|publish|published|close|review|approved|error)$") meta_json: str | None = None @@ -128,7 +130,7 @@ class IngestionRunRequest(BaseModel): class ArticleTransitionRequest(BaseModel): - target_status: str = Field(pattern="^(new|rewrite|review|approved|published|error)$") + target_status: str = Field(pattern="^(new|rewrite|publish|published|close|review|approved|error)$") note: str | None = None @@ -152,12 +154,11 @@ class PublisherRunRequest(BaseModel): ALLOWED_ARTICLE_TRANSITIONS: dict[str, set[str]] = { - "new": {"review", "rewrite", "error"}, - "rewrite": {"review", "error"}, - "review": {"approved", "rewrite", "error"}, + "new": {"rewrite", "error"}, + "rewrite": {"approved", "error"}, "approved": {"published", "error"}, "published": {"error"}, - "error": {"review", "rewrite"}, + "error": {"rewrite"}, } @@ -340,7 +341,11 @@ def api_finish_run(run_id: int, payload: RunFinishRequest, username: str = Depen @app.get("/api/articles") def api_list_articles(limit: int = 100, status_filter: str | None = None, username: str = Depends(require_auth)) -> dict: - return {"ok": True, "items": repo_list_articles(limit=limit, status_filter=status_filter), "requested_by": username} + internal_filter = ui_to_internal_status(status_filter) if status_filter else None + items = repo_list_articles(limit=limit, status_filter=internal_filter) + for item in items: + item["status_ui"] = internal_to_ui_status(item.get("status")) + return {"ok": True, "items": items, "requested_by": username} @app.get("/api/articles/export") @@ -349,7 +354,8 @@ def api_export_articles( status_filter: str | None = None, username: str = Depends(require_auth), ): - articles = repo_list_articles(limit=500, status_filter=status_filter) + internal_filter = ui_to_internal_status(status_filter) if status_filter else None + articles = repo_list_articles(limit=500, status_filter=internal_filter) rows = [] for article in articles: meta: dict = {} @@ -436,6 +442,7 @@ def api_get_article(article_id: int, username: str = Depends(require_auth)) -> d article = get_article_by_id(article_id) if not article: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + article["status_ui"] = internal_to_ui_status(article.get("status")) return {"ok": True, "item": article, "requested_by": username} @@ -468,7 +475,7 @@ def api_upsert_article(payload: ArticleUpsertRequest, username: str = Depends(re publish_last_error=payload.publish_last_error, published_to_wp_at=payload.published_to_wp_at, word_count=payload.word_count, - status=payload.status, + status=ui_to_internal_status(payload.status), meta_json=payload.meta_json, ) ) @@ -482,22 +489,64 @@ def api_article_transition(article_id: int, payload: ArticleTransitionRequest, u raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") current_status = article.get("status") - allowed_targets = ALLOWED_ARTICLE_TRANSITIONS.get(current_status, set()) - if payload.target_status not in allowed_targets: + current_ui = internal_to_ui_status(current_status) + target_internal = ui_to_internal_status(payload.target_status) + target_ui = internal_to_ui_status(target_internal) + allowed_targets = ALLOWED_UI_TRANSITIONS.get(current_ui, set()) + if target_ui not in allowed_targets: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Ungueltiger Statuswechsel: {current_status} -> {payload.target_status}", - ) - if payload.target_status == "published" and int(article.get("legal_checked", 0)) != 1: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Publish gesperrt: Rechtscheck wurde noch nicht freigegeben", + detail=f"Ungueltiger Statuswechsel: {current_ui} -> {target_ui}", ) - updated = update_article_status(article_id, payload.target_status, actor=username, note=payload.note) + updated = update_article_status(article_id, target_internal, actor=username, note=payload.note) if not updated: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") - return {"ok": True, "id": article_id, "from_status": current_status, "to_status": payload.target_status} + return {"ok": True, "id": article_id, "from_status": current_ui, "to_status": target_ui} + + +@app.post("/api/articles/{article_id}/rewrite-run") +def api_article_rewrite_run(article_id: int, username: str = Depends(require_auth)) -> dict: + article = get_article_by_id(article_id) + if not article: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") + if internal_to_ui_status(article.get("status")) not in {"rewrite", "new"}: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Rewrite nur aus Status 'new' oder 'rewrite'") + + rewritten = rewrite_article_text(article) + # upsert via status update + existing fields by lightweight path: + repo_upsert_article( + ArticleUpsert( + feed_id=article.get("feed_id"), + source_article_id=article.get("source_article_id"), + source_hash=article.get("source_hash"), + title=article.get("title"), + source_url=article.get("source_url"), + canonical_url=article.get("canonical_url"), + published_at=article.get("published_at"), + author=article.get("author"), + summary=article.get("summary"), + content_raw=article.get("content_raw"), + content_rewritten=rewritten, + image_urls_json=article.get("image_urls_json"), + press_contact=article.get("press_contact"), + source_name_snapshot=article.get("source_name_snapshot"), + source_terms_url_snapshot=article.get("source_terms_url_snapshot"), + source_license_name_snapshot=article.get("source_license_name_snapshot"), + legal_checked=bool(int(article.get("legal_checked", 0))), + legal_checked_at=article.get("legal_checked_at"), + legal_note=article.get("legal_note"), + wp_post_id=article.get("wp_post_id"), + wp_post_url=article.get("wp_post_url"), + publish_attempts=int(article.get("publish_attempts", 0)), + publish_last_error=article.get("publish_last_error"), + published_to_wp_at=article.get("published_to_wp_at"), + word_count=len(rewritten.split()), + status="approved", + meta_json=article.get("meta_json"), + ) + ) + return {"ok": True, "id": article_id, "status": "publish"} @app.post("/api/articles/{article_id}/legal-review") @@ -547,31 +596,7 @@ def api_publisher_run(payload: PublisherRunRequest, username: str = Depends(requ @app.post("/api/articles/{article_id}/review") def api_article_review(article_id: int, payload: ArticleReviewRequest, username: str = Depends(require_auth)) -> dict: - article = get_article_by_id(article_id) - if not article: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") - if article.get("status") != "review": - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Review nur fuer Status 'review' erlaubt (aktuell: {article.get('status')})", - ) - - target_status = "approved" if payload.decision == "approve" else "rewrite" - updated = update_article_status( - article_id, - target_status, - actor=username, - note=payload.note, - decision=payload.decision, - ) - if not updated: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Artikel nicht gefunden") - return { - "ok": True, - "id": article_id, - "decision": payload.decision, - "to_status": target_status, - } + raise HTTPException(status_code=status.HTTP_410_GONE, detail="Review-Endpoint ersetzt durch Rewrite-Workflow") @app.post("/api/ingestion/run") diff --git a/backend/app/publisher.py b/backend/app/publisher.py index 06cc8f2..e27bd1b 100644 --- a/backend/app/publisher.py +++ b/backend/app/publisher.py @@ -28,9 +28,7 @@ def enqueue_publish(article_id: int, max_attempts: int = 3) -> int: def _can_publish(article: dict) -> tuple[bool, str | None]: if article.get("status") not in {"approved", "published"}: - return False, "Artikelstatus muss 'approved' sein" - if int(article.get("legal_checked", 0)) != 1: - return False, "Rechtsfreigabe fehlt" + return False, "Artikelstatus muss 'publish' sein" if not selected_image_exists(article): return False, "Hauptbild nicht gesetzt" return True, None diff --git a/backend/app/rewrite.py b/backend/app/rewrite.py new file mode 100644 index 0000000..8c313ad --- /dev/null +++ b/backend/app/rewrite.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +import json +import re +from typing import Any +from urllib.request import Request, urlopen + +from .config import get_settings + + +def _sanitize_source_text(text: str) -> str: + raw = (text or "").strip() + if not raw: + return "" + + lines = [ln.strip() for ln in raw.splitlines() if ln.strip()] + if len(lines) > 3: + lines = lines[3:] + + joined = "\n".join(lines) + # Remove press contact block at end from "Pressekontakt" onward. + joined = re.sub( + r"\n?\s*Pressekontakt[\s\S]*$", + "", + joined, + flags=re.IGNORECASE, + ).strip() + return joined + + +def rewrite_article_text(article: dict[str, Any]) -> str: + settings = get_settings() + api_key = settings.openai_api_key + if not api_key: + raise RuntimeError("OPENAI_API_KEY fehlt") + + source_text = _sanitize_source_text(article.get("content_raw") or "") + if not source_text: + source_text = (article.get("summary") or "").strip() + if not source_text: + raise RuntimeError("Kein Quelltext für Rewrite verfügbar") + + title = (article.get("title") or "").strip() + prompt = ( + "Schreibe den folgenden News-Text neu auf Deutsch in persönlicher Du-Form. " + "Stil: ausführlich, gut lesbar, ohne Einleitung mit Datum/Uhrzeit/Firma/Ort, " + "ohne Pressekontakt, ohne Quellenblock. " + "Nutze klare Absätze und Zwischenüberschriften in HTML (

    ,

    ,

    • falls passend). " + "Inhaltlich korrekt bleiben, nichts erfinden.\n\n" + f"Titel: {title}\n\n" + f"Originaltext:\n{source_text}" + ) + + payload = { + "model": settings.openai_model, + "temperature": 0.4, + "messages": [ + {"role": "system", "content": "Du bist ein deutscher News-Redakteur."}, + {"role": "user", "content": prompt}, + ], + } + req = Request( + url="https://api.openai.com/v1/chat/completions", + method="POST", + data=json.dumps(payload).encode("utf-8"), + headers={ + "Authorization": f"Bearer {api_key}", + "Content-Type": "application/json", + "Accept": "application/json", + }, + ) + with urlopen(req, timeout=60) as resp: + raw = resp.read().decode("utf-8", errors="replace") + data = json.loads(raw) + choices = data.get("choices") + if not isinstance(choices, list) or not choices: + raise RuntimeError(f"Ungültige OpenAI-Antwort: {data}") + message = choices[0].get("message", {}) + content = message.get("content") + if not isinstance(content, str) or not content.strip(): + raise RuntimeError("OpenAI lieferte keinen Rewrite-Text") + return content.strip() + diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index fbf4443..f450efe 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -143,11 +143,24 @@ def _as_paragraph_html(text: str) -> str: return "\n".join(lines) +def _sanitize_publish_text(text: str) -> str: + raw = (text or "").strip() + if not raw: + return "" + lines = [ln.strip() for ln in raw.splitlines() if ln.strip()] + if len(lines) > 3: + lines = lines[3:] + merged = "\n".join(lines) + merged = re.sub(r"\n?\s*Pressekontakt[\s\S]*$", "", merged, flags=re.IGNORECASE).strip() + return merged + + def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: source_url = article.get("source_url") or "" canonical_url = article.get("canonical_url") or source_url summary = (article.get("summary") or "").strip() body_text = (article.get("content_rewritten") or article.get("content_raw") or "").strip() + body_text = _sanitize_publish_text(body_text) if not body_text: body_text = summary @@ -162,7 +175,6 @@ def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: source_name = (article.get("source_name_snapshot") or "").strip() license_name = (article.get("source_license_name_snapshot") or "").strip() terms_url = (article.get("source_terms_url_snapshot") or "").strip() - press_contact = (article.get("press_contact") or "").strip() lead_html = f"

      {escape(summary)}

      \n" if summary else "" @@ -183,9 +195,6 @@ def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: if facts else "" ) - press_contact_html = ( - f"

      Pressekontakt

      \n

      {escape(press_contact)}

      \n" if press_contact else "" - ) attribution_html = ( "
      \n
      \n" "

      Quelle

      \n" @@ -195,7 +204,7 @@ def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: attribution_html += f"

      Canonical: {escape(canonical_url)}

      \n" attribution_html += "
      " - content = f"{lead_html}{body_html}\n\n{facts_html}{press_contact_html}{attribution_html}".strip() + content = f"{lead_html}{body_html}\n\n{facts_html}{attribution_html}".strip() excerpt_source = summary or re.sub(r"\s+", " ", body_text).strip() excerpt = excerpt_source[:220] if excerpt_source else None return content, excerpt diff --git a/backend/app/workflow.py b/backend/app/workflow.py new file mode 100644 index 0000000..6ef989d --- /dev/null +++ b/backend/app/workflow.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +UI_STATUSES = ("new", "rewrite", "publish", "published", "close") + + +def internal_to_ui_status(status: str | None) -> str: + value = (status or "").strip() + if value == "approved": + return "publish" + if value == "error": + return "close" + if value == "review": + return "rewrite" + if value in {"new", "rewrite", "published"}: + return value + return value or "new" + + +def ui_to_internal_status(status: str | None) -> str: + value = (status or "").strip() + if value == "publish": + return "approved" + if value == "close": + return "error" + if value in {"new", "rewrite", "published"}: + return value + if value in {"approved", "error", "review"}: + return value + return value + + +ALLOWED_UI_TRANSITIONS: dict[str, set[str]] = { + "new": {"rewrite", "close"}, + "rewrite": {"publish", "close"}, + "publish": {"published", "close"}, + "published": {"close"}, + "close": {"rewrite"}, +} + diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index 6f06d36..bf88d2e 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -30,7 +30,7 @@

      {{ article.title }}

      -
      Status{{ article.status }}
      +
      Status{{ article.status_ui }}
      Artikel-Datum{{ article.published_at or "-" }}
      Alter{{ article.days_old if article.days_old is not none else "-" }} Tage
      Relevanz{{ article.relevance }}
      @@ -187,8 +187,10 @@

      Status ändern

      - {% if not article.legal_checked %} -

      Hinweis: `published` ist erst nach manueller Rechtsfreigabe erlaubt.

      + {% if article.status_ui in ["new", "rewrite"] %} +
      + + {% endif %}
      diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index f318355..1ed5c6e 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -144,7 +144,7 @@

    IDArtikelStatusAttemptsWP PostFehler
    IDArtikelStatusAttemptsWP PostFehlerHinweis
    {{ j.error_message or "-" }} + {% if j.error_message %} + {{ j.error_category }} +
    {{ j.error_message }}
    + {% else %} + - + {% endif %} +
    {{ j.error_hint or "-" }}
    - + {% for a in articles %} @@ -160,7 +160,7 @@
    Canonical öffnen {% endif %} - +
    IDArtikelStatusDetailsReviewTransition
    IDArtikelStatusDetailsRewriteTransition
    {{ a.status }}{{ a.status_ui }}
    Legal: {{ "OK" if a.legal_checked else "offen" }}
    Publish: {{ "bereit" if a.publish_ready else "blockiert" }}
    @@ -202,11 +202,9 @@ {% endif %}
    - {% if a.status == "review" %} -
    - - - + {% if a.status_ui in ["new", "rewrite"] %} + +
    {% else %} - @@ -215,11 +213,11 @@
    - {% if allowed_transitions.get(a.status, []) %} + {% if allowed_transitions.get(a.status_ui, []) %} {% else %} keine Aktion diff --git a/backend/tests/test_article_workflow.py b/backend/tests/test_article_workflow.py index ce11214..29dd212 100644 --- a/backend/tests/test_article_workflow.py +++ b/backend/tests/test_article_workflow.py @@ -4,6 +4,7 @@ import unittest from pathlib import Path from fastapi.testclient import TestClient +from unittest.mock import patch from backend.app import config as config_module from backend.app.db import init_db @@ -66,39 +67,40 @@ class TestArticleWorkflow(unittest.TestCase): def test_valid_transition_chain(self) -> None: article_id = self._create_article() - t1 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "review"}) + t1 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "rewrite"}) self.assertEqual(t1.status_code, 200) - r1 = self.client.post(f"/api/articles/{article_id}/review", json={"decision": "approve", "note": "ok"}) - self.assertEqual(r1.status_code, 200) - self.assertEqual(r1.json()["to_status"], "approved") - - blocked_publish = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "published"}) - self.assertEqual(blocked_publish.status_code, 400) - - legal = self.client.post( - f"/api/articles/{article_id}/legal-review", - json={"approved": True, "note": "Rechte geprueft"}, - ) - self.assertEqual(legal.status_code, 200) - - t2 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "published"}) + t2 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "publish"}) self.assertEqual(t2.status_code, 200) + t3 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "published"}) + self.assertEqual(t3.status_code, 200) + final = self.client.get(f"/api/articles/{article_id}") self.assertEqual(final.status_code, 200) self.assertEqual(final.json()["item"]["status"], "published") - self.assertEqual(final.json()["item"]["legal_checked"], 1) + self.assertEqual(final.json()["item"]["status_ui"], "published") def test_invalid_transition_rejected(self) -> None: article_id = self._create_article() bad = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "published"}) self.assertEqual(bad.status_code, 400) - def test_review_only_allowed_in_review_status(self) -> None: + def test_legacy_review_endpoint_is_gone(self) -> None: article_id = self._create_article() bad = self.client.post(f"/api/articles/{article_id}/review", json={"decision": "approve"}) - self.assertEqual(bad.status_code, 400) + self.assertEqual(bad.status_code, 410) + + @patch("backend.app.main.rewrite_article_text") + def test_rewrite_run_sets_publish_status(self, mock_rewrite) -> None: + mock_rewrite.return_value = "

    Neu

    Umschreibung

    " + article_id = self._create_article() + self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "rewrite"}) + r = self.client.post(f"/api/articles/{article_id}/rewrite-run") + self.assertEqual(r.status_code, 200) + self.assertEqual(r.json()["status"], "publish") + final = self.client.get(f"/api/articles/{article_id}") + self.assertEqual(final.json()["item"]["status_ui"], "publish") if __name__ == "__main__": diff --git a/backend/tests/test_wordpress.py b/backend/tests/test_wordpress.py index 2c9094e..833b159 100644 --- a/backend/tests/test_wordpress.py +++ b/backend/tests/test_wordpress.py @@ -62,6 +62,24 @@ class TestWordpressPublish(unittest.TestCase): self.assertNotIn("featured_media", payload) self.assertIn("

    Inhalt

    ", payload.get("content", "")) + @patch("backend.app.wordpress._upload_featured_media") + @patch("backend.app.wordpress._wp_request") + def test_publish_strips_feed_header_and_press_contact(self, mock_wp_request, mock_upload_media) -> None: + mock_wp_request.return_value = {"id": 100, "link": "https://example.org/?p=100"} + article = { + "title": "Header Test", + "content_raw": "21.02.2026 10:00\nFirma GmbH\n(ots)\nDas ist der eigentliche Text.\nPressekontakt: Test Person", + "source_url": "https://example.com/source", + "canonical_url": "https://example.com/source", + "meta_json": "{}", + } + publish_article_draft(article) + payload = mock_wp_request.call_args.kwargs["payload"] + content = payload.get("content", "") + self.assertNotIn("Firma GmbH", content) + self.assertNotIn("Pressekontakt", content) + self.assertIn("eigentliche Text", content) + if __name__ == "__main__": unittest.main() From 50f737f434d23f3352fa040ae3a619c2ae025f6b Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 13:58:40 +0100 Subject: [PATCH 51/87] feat(admin): add connectivity diagnostics page for domains and endpoints --- backend/app/admin_ui.py | 133 ++++++++++++++++++++++ backend/templates/admin_connectivity.html | 84 ++++++++++++++ backend/templates/admin_dashboard.html | 9 +- backend/tests/test_admin_ui.py | 47 ++++++++ 4 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 backend/templates/admin_connectivity.html diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index e9bfae4..a725ba8 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -3,6 +3,9 @@ from __future__ import annotations import json from pathlib import Path import re +import socket +import ssl +import time from urllib.parse import urlparse from urllib.parse import urlencode from urllib.request import Request as UrlRequest, urlopen @@ -254,6 +257,113 @@ def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]: return checks +def _build_connectivity_targets() -> list[dict[str, str]]: + targets: list[dict[str, str]] = [] + seen: set[tuple[str, str]] = set() + + def add_target(label: str, kind: str, value: str) -> None: + normalized = (value or "").strip() + if not normalized: + return + key = (kind, normalized.lower()) + if key in seen: + return + seen.add(key) + targets.append({"label": label, "kind": kind, "value": normalized}) + + add_target("OpenAI API", "host", "api.openai.com") + if settings.wordpress_base_url: + parsed = urlparse(settings.wordpress_base_url) + if parsed.hostname: + add_target("WordPress Host", "host", parsed.hostname) + wp_api_url = f"{settings.wordpress_base_url.rstrip('/')}/wp-json/wp/v2" + add_target("WordPress REST", "url", wp_api_url) + + for feed in list_feeds(): + name = (feed.get("name") or "").strip() or f"Feed #{feed.get('id')}" + feed_url = str(feed.get("url") or "").strip() + if not feed_url: + continue + parsed = urlparse(feed_url) + if parsed.hostname: + add_target(f"{name} (Feed)", "host", parsed.hostname) + add_target(f"{name} (Feed URL)", "url", feed_url) + + return targets + + +def _run_connectivity_check(target: dict[str, str]) -> dict[str, object]: + kind = target.get("kind", "") + value = str(target.get("value") or "") + row: dict[str, object] = { + "label": target.get("label") or "-", + "kind": kind, + "target": value, + "dns_ok": False, + "dns_info": "-", + "tcp_ok": False, + "tcp_info": "-", + "http_ok": False, + "http_info": "-", + "duration_ms": 0, + "ok": False, + } + started = time.perf_counter() + try: + hostname = value if kind == "host" else (urlparse(value).hostname or "") + port = 443 + if kind == "url": + parsed = urlparse(value) + if parsed.scheme not in {"http", "https"}: + row["http_info"] = f"unsupported scheme: {parsed.scheme or '-'}" + return row + port = 443 if parsed.scheme == "https" else 80 + if not hostname: + row["dns_info"] = "host fehlt" + return row + + try: + addr_info = socket.getaddrinfo(hostname, None, proto=socket.IPPROTO_TCP) + ips = sorted({entry[4][0] for entry in addr_info if entry and len(entry) > 4 and entry[4]}) + row["dns_ok"] = True + row["dns_info"] = ", ".join(ips[:3]) if ips else "resolved" + except Exception as exc: + row["dns_info"] = str(exc) + return row + + try: + socket.create_connection((hostname, port), timeout=4).close() + row["tcp_ok"] = True + row["tcp_info"] = f"port {port} erreichbar" + except Exception as exc: + row["tcp_info"] = str(exc) + return row + + if kind == "host": + row["http_ok"] = True + row["http_info"] = "n/a (host-only)" + row["ok"] = True + return row + + try: + req = UrlRequest( + url=value, + headers={"User-Agent": IMAGE_PROXY_USER_AGENT, "Accept": "*/*"}, + ) + with urlopen(req, timeout=6, context=ssl.create_default_context()) as resp: + code = getattr(resp, "status", None) or resp.getcode() + row["http_ok"] = True + row["http_info"] = f"HTTP {code}" + except Exception as exc: + row["http_info"] = str(exc) + return row + + row["ok"] = bool(row["dns_ok"] and row["tcp_ok"] and row["http_ok"]) + return row + finally: + row["duration_ms"] = int((time.perf_counter() - started) * 1000) + + @router.get("/admin", response_class=HTMLResponse) def admin_index(request: Request): user = _admin_user(request) @@ -362,6 +472,29 @@ def admin_dashboard(request: Request): ) +@router.get("/admin/connectivity", response_class=HTMLResponse) +def admin_connectivity(request: Request): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + checks = [_run_connectivity_check(target) for target in _build_connectivity_targets()] + ok_count = len([c for c in checks if c.get("ok")]) + error_count = len(checks) - ok_count + return templates.TemplateResponse( + request, + "admin_connectivity.html", + { + "request": request, + "title": "Connectivity Check", + "user": user, + "checks": checks, + "ok_count": ok_count, + "error_count": error_count, + }, + ) + + @router.get("/admin/articles/{article_id}", response_class=HTMLResponse) def admin_article_detail(request: Request, article_id: int): user = _admin_user(request) diff --git a/backend/templates/admin_connectivity.html b/backend/templates/admin_connectivity.html new file mode 100644 index 0000000..5fc0392 --- /dev/null +++ b/backend/templates/admin_connectivity.html @@ -0,0 +1,84 @@ + + + + + + {{ title }} + + + +
    +
    +

    Connectivity Check

    +

    Angemeldet als {{ user }}

    +
    +
    + Zurück + + + +
    +
    + +
    +
    +
    +
    Checks
    +
    {{ checks|length }}
    +
    +
    +
    OK
    +
    {{ ok_count }}
    +
    +
    +
    Fehler
    +
    {{ error_count }}
    +
    +
    +
    Zeitpunkt
    +
    Live
    +
    +
    + +
    +

    Ziele

    +

    Geprüft werden DNS-Auflösung, TCP-Erreichbarkeit und bei URLs ein HTTP-Request.

    +
    + +
    +
    + +
    +

    Ergebnis

    + + + + + + {% for c in checks %} + + + + + + + + + + + {% endfor %} + +
    StatusNameTypZielDNSTCPHTTPDauer
    {% if c.ok %}OK{% else %}Fehler{% endif %}{{ c.label }}{{ c.kind }}{{ c.target }} + {% if c.dns_ok %}OK{% else %}FAIL{% endif %} +
    {{ c.dns_info }}
    +
    + {% if c.tcp_ok %}OK{% else %}FAIL{% endif %} +
    {{ c.tcp_info }}
    +
    + {% if c.http_ok %}OK{% else %}FAIL{% endif %} +
    {{ c.http_info }}
    +
    {{ c.duration_ms }} ms
    +
    +
    + + diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index 1ed5c6e..e43a9ae 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -12,9 +12,12 @@

    rss-news Admin Dashboard

    Angemeldet als {{ user }}

    -
    - -
    +
    + Connectivity Check +
    + +
    +
    diff --git a/backend/tests/test_admin_ui.py b/backend/tests/test_admin_ui.py index af47046..557121a 100644 --- a/backend/tests/test_admin_ui.py +++ b/backend/tests/test_admin_ui.py @@ -176,6 +176,53 @@ class TestAdminUi(unittest.TestCase): self.assertEqual(res.status_code, 200) self.assertIn("image/jpeg", res.headers.get("content-type", "")) + @patch("backend.app.admin_ui._run_connectivity_check") + @patch("backend.app.admin_ui._build_connectivity_targets") + def test_connectivity_page_renders(self, mock_targets, mock_check) -> None: + mock_targets.return_value = [ + {"label": "OpenAI API", "kind": "host", "value": "api.openai.com"}, + {"label": "WordPress REST", "kind": "url", "value": "https://example.org/wp-json/wp/v2"}, + ] + mock_check.side_effect = [ + { + "label": "OpenAI API", + "kind": "host", + "target": "api.openai.com", + "dns_ok": True, + "dns_info": "1.2.3.4", + "tcp_ok": True, + "tcp_info": "port 443 erreichbar", + "http_ok": True, + "http_info": "n/a (host-only)", + "duration_ms": 12, + "ok": True, + }, + { + "label": "WordPress REST", + "kind": "url", + "target": "https://example.org/wp-json/wp/v2", + "dns_ok": False, + "dns_info": "Name or service not known", + "tcp_ok": False, + "tcp_info": "-", + "http_ok": False, + "http_info": "-", + "duration_ms": 10, + "ok": False, + }, + ] + + self.client.post( + "/admin/login", + data={"username": "admin", "password": "secret"}, + follow_redirects=True, + ) + res = self.client.get("/admin/connectivity", follow_redirects=True) + self.assertEqual(res.status_code, 200) + self.assertIn("Connectivity Check", res.text) + self.assertIn("OpenAI API", res.text) + self.assertIn("WordPress REST", res.text) + if __name__ == "__main__": unittest.main() From 88b2ee1d010cd117afdacf65a26eb788f9deab77 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 14:03:49 +0100 Subject: [PATCH 52/87] feat(admin): add feed/source management, rewrite editor, reopen flow, and WP block output --- backend/app/admin_ui.py | 218 +++++++++++++++++--- backend/app/repositories.py | 74 +++++++ backend/app/wordpress.py | 88 +++++--- backend/app/workflow.py | 3 +- backend/static/admin.css | 2 +- backend/templates/admin_article_detail.html | 14 ++ backend/templates/admin_dashboard.html | 93 +++++++++ backend/tests/test_admin_ui.py | 126 +++++++++++ backend/tests/test_article_workflow.py | 7 +- 9 files changed, 555 insertions(+), 70 deletions(-) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index a725ba8..89819cf 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -23,7 +23,11 @@ from .relevance import article_age_days, article_relevance from .rewrite import rewrite_article_text from .repositories import ( FeedCreate, + FeedUpdate, SourceCreate, + SourceUpdate, + delete_feed, + delete_source, create_feed, create_source, get_article_by_id, @@ -36,6 +40,8 @@ from .repositories import ( set_article_image_decision, set_article_legal_review, upsert_article, + update_feed, + update_source, update_article_status, ArticleUpsert, ) @@ -48,10 +54,11 @@ ALLOWED_TRANSITIONS: dict[str, tuple[str, ...]] = { "new": ("rewrite", "close"), "rewrite": ("publish", "close"), "publish": ("published", "close"), - "published": ("close",), + "published": ("rewrite", "close"), "close": ("rewrite",), } IMAGE_PROXY_USER_AGENT = "rss-news-admin/1.0" +_UNSET = object() def _admin_user(request: Request) -> str | None: @@ -364,6 +371,51 @@ def _run_connectivity_check(target: dict[str, str]) -> dict[str, object]: row["duration_ms"] = int((time.perf_counter() - started) * 1000) +def _upsert_article_from_existing( + article: dict, + *, + content_rewritten: str | None = None, + status: str | None = None, + wp_post_id: int | None | object = _UNSET, + wp_post_url: str | None | object = _UNSET, + publish_attempts: int | object = _UNSET, + publish_last_error: str | None | object = _UNSET, + published_to_wp_at: str | None | object = _UNSET, +) -> None: + rewritten = article.get("content_rewritten") if content_rewritten is None else content_rewritten + upsert_article( + ArticleUpsert( + feed_id=article.get("feed_id"), + source_article_id=article.get("source_article_id"), + source_hash=article.get("source_hash"), + title=article.get("title"), + source_url=article.get("source_url"), + canonical_url=article.get("canonical_url"), + published_at=article.get("published_at"), + author=article.get("author"), + summary=article.get("summary"), + content_raw=article.get("content_raw"), + content_rewritten=rewritten, + image_urls_json=article.get("image_urls_json"), + press_contact=article.get("press_contact"), + source_name_snapshot=article.get("source_name_snapshot"), + source_terms_url_snapshot=article.get("source_terms_url_snapshot"), + source_license_name_snapshot=article.get("source_license_name_snapshot"), + legal_checked=bool(int(article.get("legal_checked", 0))), + legal_checked_at=article.get("legal_checked_at"), + legal_note=article.get("legal_note"), + wp_post_id=article.get("wp_post_id") if wp_post_id is _UNSET else wp_post_id, + wp_post_url=article.get("wp_post_url") if wp_post_url is _UNSET else wp_post_url, + publish_attempts=int(article.get("publish_attempts", 0)) if publish_attempts is _UNSET else publish_attempts, + publish_last_error=article.get("publish_last_error") if publish_last_error is _UNSET else publish_last_error, + published_to_wp_at=article.get("published_to_wp_at") if published_to_wp_at is _UNSET else published_to_wp_at, + word_count=len(str(rewritten or "").split()), + status=article.get("status") if status is None else status, + meta_json=article.get("meta_json"), + ) + ) + + @router.get("/admin", response_class=HTMLResponse) def admin_index(request: Request): user = _admin_user(request) @@ -427,7 +479,7 @@ def admin_dashboard(request: Request): articles = list_articles(limit=100, status_filter=internal_filter) else: status_filter = "" - articles = list_articles(limit=100) + articles = [a for a in list_articles(limit=250) if internal_to_ui_status(a.get("status")) != "close"][:100] for article in articles: meta = _parse_meta_json(article.get("meta_json")) extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {} @@ -659,6 +711,54 @@ def admin_create_source( return _dashboard_redirect(msg="Quelle gespeichert") +@router.post("/admin/sources/{source_id}/update") +def admin_update_source( + request: Request, + source_id: int, + name: str = Form(...), + base_url: str = Form(""), + terms_url: str = Form(""), + license_name: str = Form(""), + risk_level: str = Form("yellow"), + is_enabled: str = Form("1"), + notes: str = Form(""), + last_reviewed_at: str = Form(""), +): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + try: + ok = update_source( + source_id, + SourceUpdate( + name=name, + base_url=base_url or None, + terms_url=terms_url or None, + license_name=license_name or None, + risk_level=risk_level, + is_enabled=is_enabled == "1", + notes=notes or None, + last_reviewed_at=last_reviewed_at or None, + ), + ) + except Exception as exc: + return _dashboard_redirect(msg=f"Quelle #{source_id} Update fehlgeschlagen: {exc}", msg_type="error") + if not ok: + return _dashboard_redirect(msg=f"Quelle #{source_id} nicht gefunden", msg_type="error") + return _dashboard_redirect(msg=f"Quelle #{source_id} aktualisiert") + + +@router.post("/admin/sources/{source_id}/delete") +def admin_delete_source(request: Request, source_id: int): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + ok = delete_source(source_id) + if not ok: + return _dashboard_redirect(msg=f"Quelle #{source_id} nicht gefunden", msg_type="error") + return _dashboard_redirect(msg=f"Quelle #{source_id} gelöscht") + + @router.post("/admin/feeds/create") def admin_create_feed( request: Request, @@ -684,6 +784,46 @@ def admin_create_feed( return _dashboard_redirect(msg="Feed gespeichert") +@router.post("/admin/feeds/{feed_id}/update") +def admin_update_feed( + request: Request, + feed_id: int, + name: str = Form(...), + url: str = Form(...), + source_id: str = Form(""), + is_enabled: str = Form("1"), +): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + try: + ok = update_feed( + feed_id, + FeedUpdate( + name=name, + url=url, + source_id=_to_optional_int(source_id), + is_enabled=is_enabled == "1", + ), + ) + except Exception as exc: + return _dashboard_redirect(msg=f"Feed #{feed_id} Update fehlgeschlagen: {exc}", msg_type="error") + if not ok: + return _dashboard_redirect(msg=f"Feed #{feed_id} nicht gefunden", msg_type="error") + return _dashboard_redirect(msg=f"Feed #{feed_id} aktualisiert") + + +@router.post("/admin/feeds/{feed_id}/delete") +def admin_delete_feed(request: Request, feed_id: int): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + ok = delete_feed(feed_id) + if not ok: + return _dashboard_redirect(msg=f"Feed #{feed_id} nicht gefunden", msg_type="error") + return _dashboard_redirect(msg=f"Feed #{feed_id} gelöscht") + + @router.post("/admin/ingestion/run") def admin_run_ingestion(request: Request, feed_id: str = Form("")): user = _admin_user(request) @@ -719,41 +859,51 @@ def admin_rewrite_run(request: Request, article_id: int): rewritten = rewrite_article_text(article) except Exception as exc: return _dashboard_redirect(msg=f"Rewrite fehlgeschlagen fuer Artikel #{article_id}: {exc}", msg_type="error") - - upsert_article( - ArticleUpsert( - feed_id=article.get("feed_id"), - source_article_id=article.get("source_article_id"), - source_hash=article.get("source_hash"), - title=article.get("title"), - source_url=article.get("source_url"), - canonical_url=article.get("canonical_url"), - published_at=article.get("published_at"), - author=article.get("author"), - summary=article.get("summary"), - content_raw=article.get("content_raw"), - content_rewritten=rewritten, - image_urls_json=article.get("image_urls_json"), - press_contact=article.get("press_contact"), - source_name_snapshot=article.get("source_name_snapshot"), - source_terms_url_snapshot=article.get("source_terms_url_snapshot"), - source_license_name_snapshot=article.get("source_license_name_snapshot"), - legal_checked=bool(int(article.get("legal_checked", 0))), - legal_checked_at=article.get("legal_checked_at"), - legal_note=article.get("legal_note"), - wp_post_id=article.get("wp_post_id"), - wp_post_url=article.get("wp_post_url"), - publish_attempts=int(article.get("publish_attempts", 0)), - publish_last_error=article.get("publish_last_error"), - published_to_wp_at=article.get("published_to_wp_at"), - word_count=len(rewritten.split()), - status="approved", - meta_json=article.get("meta_json"), - ) - ) + _upsert_article_from_existing(article, content_rewritten=rewritten, status="approved") return _dashboard_redirect(msg=f"Rewrite fertig fuer Artikel #{article_id} -> publish") +@router.post("/admin/articles/{article_id}/rewrite-save") +def admin_rewrite_save(request: Request, article_id: int, content_rewritten: str = Form(...)): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + article = get_article_by_id(article_id) + if not article: + return _dashboard_redirect(msg=f"Artikel #{article_id} nicht gefunden", msg_type="error") + text = (content_rewritten or "").strip() + if not text: + return RedirectResponse( + url=f"/admin/articles/{article_id}?msg=Rewrite-Text%20darf%20nicht%20leer%20sein&type=error", + status_code=303, + ) + _upsert_article_from_existing(article, content_rewritten=text) + return RedirectResponse(url=f"/admin/articles/{article_id}?msg=Rewrite-Text%20gespeichert&type=success", status_code=303) + + +@router.post("/admin/articles/{article_id}/reopen") +def admin_reopen_article(request: Request, article_id: int): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + article = get_article_by_id(article_id) + if not article: + return _dashboard_redirect(msg=f"Artikel #{article_id} nicht gefunden", msg_type="error") + _upsert_article_from_existing( + article, + status="rewrite", + wp_post_id=None, + wp_post_url=None, + publish_attempts=0, + publish_last_error=None, + published_to_wp_at=None, + ) + return RedirectResponse( + url=f"/admin/articles/{article_id}?msg=Artikel%20zurueck%20in%20Rewrite-Workflow%20gesetzt&type=success", + status_code=303, + ) + + @router.post("/admin/articles/{article_id}/transition") def admin_transition_article(request: Request, article_id: int, target_status: str = Form(...), note: str = Form("")): user = _admin_user(request) diff --git a/backend/app/repositories.py b/backend/app/repositories.py index ca25821..bff6e87 100644 --- a/backend/app/repositories.py +++ b/backend/app/repositories.py @@ -28,6 +28,26 @@ class FeedCreate: is_enabled: bool +@dataclass(frozen=True) +class SourceUpdate: + name: str + base_url: str | None + terms_url: str | None + license_name: str | None + risk_level: str + is_enabled: bool + notes: str | None + last_reviewed_at: str | None + + +@dataclass(frozen=True) +class FeedUpdate: + name: str + url: str + source_id: int | None + is_enabled: bool + + @dataclass(frozen=True) class RunCreate: run_type: str @@ -118,6 +138,35 @@ def get_source_by_id(source_id: int) -> dict[str, Any] | None: return dict(row) if row else None +def update_source(source_id: int, payload: SourceUpdate) -> bool: + with get_conn() as conn: + cur = conn.execute( + """ + UPDATE sources + SET name = ?, base_url = ?, terms_url = ?, license_name = ?, risk_level = ?, is_enabled = ?, notes = ?, last_reviewed_at = ? + WHERE id = ? + """, + ( + payload.name.strip(), + payload.base_url, + payload.terms_url, + payload.license_name, + payload.risk_level, + 1 if payload.is_enabled else 0, + payload.notes, + payload.last_reviewed_at, + source_id, + ), + ) + return cur.rowcount > 0 + + +def delete_source(source_id: int) -> bool: + with get_conn() as conn: + cur = conn.execute("DELETE FROM sources WHERE id = ?", (source_id,)) + return cur.rowcount > 0 + + def create_feed(payload: FeedCreate) -> int: with get_conn() as conn: cur = conn.execute( @@ -177,6 +226,31 @@ def get_feed_by_id(feed_id: int) -> dict[str, Any] | None: return dict(row) if row else None +def update_feed(feed_id: int, payload: FeedUpdate) -> bool: + with get_conn() as conn: + cur = conn.execute( + """ + UPDATE feeds + SET name = ?, url = ?, source_id = ?, is_enabled = ? + WHERE id = ? + """, + ( + payload.name.strip(), + payload.url.strip(), + payload.source_id, + 1 if payload.is_enabled else 0, + feed_id, + ), + ) + return cur.rowcount > 0 + + +def delete_feed(feed_id: int) -> bool: + with get_conn() as conn: + cur = conn.execute("DELETE FROM feeds WHERE id = ?", (feed_id,)) + return cur.rowcount > 0 + + def update_feed_fetch_state(feed_id: int, etag: str | None, last_modified: str | None) -> None: with get_conn() as conn: conn.execute( diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index f450efe..c257747 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -61,17 +61,18 @@ def _selected_image_url_from_meta(meta_json: str | None) -> str | None: return selected if isinstance(selected, str) and selected.strip() else None -def _download_image_bytes(url: str) -> tuple[bytes, str]: - req = Request( - url=url, - headers={ - "User-Agent": "rss-news-publisher/1.0", - "Accept": "image/avif,image/webp,image/apng,image/*,*/*;q=0.8", - }, - ) +def _download_image_bytes(url: str, referer: str | None = None) -> tuple[bytes, str]: + headers = { + "User-Agent": "rss-news-publisher/1.0", + "Accept": "image/avif,image/webp,image/apng,image/*,*/*;q=0.8", + } + if referer: + headers["Referer"] = referer + req = Request(url=url, headers=headers) with urlopen(req, timeout=20) as resp: raw = resp.read() content_type = resp.headers.get("Content-Type", "application/octet-stream") + content_type = content_type.split(";")[0].strip() if content_type else "application/octet-stream" if not content_type.lower().startswith("image/"): raise RuntimeError(f"Ausgewählte Bild-URL liefert kein Bild ({content_type})") return raw, content_type @@ -94,7 +95,7 @@ def _upload_featured_media( article_title: str, source_url: str, ) -> int: - image_bytes, content_type = _download_image_bytes(image_url) + image_bytes, content_type = _download_image_bytes(image_url, referer=source_url or None) filename = _guess_filename(image_url, content_type) media_url = f"{base_url.rstrip('/')}/wp-json/wp/v2/media" @@ -143,6 +144,29 @@ def _as_paragraph_html(text: str) -> str: return "\n".join(lines) +def _as_block_paragraphs(text: str) -> str: + chunks = [chunk.strip() for chunk in re.split(r"\n{2,}", text.strip()) if chunk.strip()] + if not chunks: + return "" + lines = [] + for chunk in chunks: + compact = re.sub(r"\s*\n\s*", " ", chunk) + lines.append(f"

    {escape(compact)}

    ") + return "\n".join(lines) + + +def _as_block_heading(level: int, text: str) -> str: + safe_level = min(6, max(1, int(level))) + return f'{escape(text)}' + + +def _as_block_list(items: list[str]) -> str: + if not items: + return "" + content = "".join(f"
  • {item}
  • " for item in items) + return f"
      {content}
    " + + def _sanitize_publish_text(text: str) -> str: raw = (text or "").strip() if not raw: @@ -164,11 +188,13 @@ def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: if not body_text: body_text = summary - # Keep existing HTML if already present, otherwise wrap plain text into paragraphs. + # Keep existing HTML if already present, otherwise wrap plain text into block paragraphs. has_html = bool(re.search(r"<[a-zA-Z][^>]*>", body_text)) - body_html = body_text if has_html else _as_paragraph_html(body_text) + body_html = body_text if has_html else _as_block_paragraphs(body_text) if not body_html: - body_html = "

    Kein Inhalt verfügbar.

    " + body_html = "

    Kein Inhalt verfügbar.

    " + elif has_html: + body_html = f"\n{body_html}\n" author = (article.get("author") or "").strip() published_at = (article.get("published_at") or "").strip() @@ -176,35 +202,35 @@ def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: license_name = (article.get("source_license_name_snapshot") or "").strip() terms_url = (article.get("source_terms_url_snapshot") or "").strip() - lead_html = f"

    {escape(summary)}

    \n" if summary else "" + lead_html = f"

    {escape(summary)}

    \n" if summary else "" facts: list[str] = [] if author: - facts.append(f"
  • Autor: {escape(author)}
  • ") + facts.append(f"Autor: {escape(author)}") if published_at: - facts.append(f"
  • Veröffentlicht (Quelle): {escape(published_at)}
  • ") + facts.append(f"Veröffentlicht (Quelle): {escape(published_at)}") if source_name: - facts.append(f"
  • Quelle: {escape(source_name)}
  • ") + facts.append(f"Quelle: {escape(source_name)}") if license_name: - facts.append(f"
  • Lizenz: {escape(license_name)}
  • ") + facts.append(f"Lizenz: {escape(license_name)}") if terms_url: - facts.append(f"
  • Lizenzhinweise: {escape(terms_url)}
  • ") + facts.append(f"Lizenzhinweise: {escape(terms_url)}") - facts_html = ( - "

    Artikeldetails

    \n
      \n" + "\n".join(facts) + "\n
    \n" - if facts - else "" - ) - attribution_html = ( - "
    \n
    \n" - "

    Quelle

    \n" - f"

    Originalartikel: {escape(source_url)}

    \n" - ) + facts_html = "" + if facts: + facts_html = _as_block_heading(3, "Artikeldetails") + "\n" + _as_block_list(facts) + + attribution_parts = [ + _as_block_heading(3, "Quelle"), + f'

    Originalartikel: {escape(source_url)}

    ', + ] if canonical_url and canonical_url != source_url: - attribution_html += f"

    Canonical: {escape(canonical_url)}

    \n" - attribution_html += "
    " + attribution_parts.append( + f'

    Canonical: {escape(canonical_url)}

    ' + ) + attribution_html = "\n".join(attribution_parts) - content = f"{lead_html}{body_html}\n\n{facts_html}{attribution_html}".strip() + content = f"{lead_html}{body_html}\n\n{facts_html}\n{attribution_html}".strip() excerpt_source = summary or re.sub(r"\s+", " ", body_text).strip() excerpt = excerpt_source[:220] if excerpt_source else None return content, excerpt diff --git a/backend/app/workflow.py b/backend/app/workflow.py index 6ef989d..b6cd4bb 100644 --- a/backend/app/workflow.py +++ b/backend/app/workflow.py @@ -33,7 +33,6 @@ ALLOWED_UI_TRANSITIONS: dict[str, set[str]] = { "new": {"rewrite", "close"}, "rewrite": {"publish", "close"}, "publish": {"published", "close"}, - "published": {"close"}, + "published": {"rewrite", "close"}, "close": {"rewrite"}, } - diff --git a/backend/static/admin.css b/backend/static/admin.css index 053263a..0b31bb5 100644 --- a/backend/static/admin.css +++ b/backend/static/admin.css @@ -94,7 +94,7 @@ th, td { vertical-align: top; } -input, select, button { +input, select, button, textarea { padding: 8px; border-radius: 6px; border: 1px solid #cbd5e1; diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index bf88d2e..70d5c57 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -164,6 +164,15 @@
    {{ article.content_raw or "-" }}
    +
    +

    Rewrite-Text (editierbar)

    +
    + + +
    +

    Dieser Text wird für den WordPress-Entwurf verwendet, falls vorhanden.

    +
    +

    Rechtsfreigabe

    Freigabe: @@ -192,6 +201,11 @@ {% endif %} + {% if article.status_ui == "published" %} +

    + +
    + {% endif %}
    +
    +

    Quellen verwalten

    + + + + + + {% for s in sources %} + {% set source_form_id = 'source-update-' ~ s.id %} + + + + + + + + {% endfor %} + +
    IDNameURLsMetaAktionen
    #{{ s.id }} + + + + + + + + + + + +
    + + + +
    + +
    +
    +
    +
    + +
    +

    Feeds verwalten

    + + + + + + {% for f in feeds %} + {% set feed_form_id = 'feed-update-' ~ f.id %} + + + + + + + + + {% endfor %} + +
    IDNameURLQuelleStatusAktionen
    #{{ f.id }} + + + + + + +
    +
    + +
    +
    + +
    +
    +
    +
    +

    Artikel (Review)

    diff --git a/backend/tests/test_admin_ui.py b/backend/tests/test_admin_ui.py index 557121a..eab63fd 100644 --- a/backend/tests/test_admin_ui.py +++ b/backend/tests/test_admin_ui.py @@ -145,6 +145,132 @@ class TestAdminUi(unittest.TestCase): self.assertIsNotNone(article) self.assertIn("selected_url", article.get("meta_json", "")) + def test_manage_source_and_feed(self) -> None: + source_id = create_source( + SourceCreate( + name="Edit Source", + base_url="https://example.org", + terms_url="https://example.org/terms", + license_name="cc-by", + risk_level="yellow", + is_enabled=True, + notes=None, + last_reviewed_at=None, + ) + ) + feed_id = create_feed( + FeedCreate( + name="Edit Feed", + url="https://example.org/feed.xml", + source_id=source_id, + is_enabled=True, + ) + ) + self.client.post("/admin/login", data={"username": "admin", "password": "secret"}, follow_redirects=True) + + update_source_res = self.client.post( + f"/admin/sources/{source_id}/update", + data={ + "name": "Edit Source 2", + "base_url": "https://example.org/new", + "terms_url": "https://example.org/new-terms", + "license_name": "cc0", + "risk_level": "green", + "is_enabled": "1", + "notes": "ok", + "last_reviewed_at": "2026-02-21T12:00:00Z", + }, + follow_redirects=False, + ) + self.assertEqual(update_source_res.status_code, 303) + + update_feed_res = self.client.post( + f"/admin/feeds/{feed_id}/update", + data={ + "name": "Edit Feed 2", + "url": "https://example.org/feed2.xml", + "source_id": str(source_id), + "is_enabled": "0", + }, + follow_redirects=False, + ) + self.assertEqual(update_feed_res.status_code, 303) + + delete_feed_res = self.client.post(f"/admin/feeds/{feed_id}/delete", follow_redirects=False) + self.assertEqual(delete_feed_res.status_code, 303) + delete_source_res = self.client.post(f"/admin/sources/{source_id}/delete", follow_redirects=False) + self.assertEqual(delete_source_res.status_code, 303) + + def test_rewrite_save_and_reopen(self) -> None: + source_id = create_source( + SourceCreate( + name="Test Source", + base_url="https://example.org", + terms_url="https://example.org/terms", + license_name="cc-by", + risk_level="green", + is_enabled=True, + notes=None, + last_reviewed_at="2026-02-18T00:00:00Z", + ) + ) + feed_id = create_feed( + FeedCreate( + name="Test Feed", + url="https://example.org/feed.xml", + source_id=source_id, + is_enabled=True, + ) + ) + article_id = upsert_article( + ArticleUpsert( + feed_id=feed_id, + source_article_id="id-published", + source_hash="hash-published", + title="Titel Published", + source_url="https://example.org/published", + canonical_url="https://example.org/published", + published_at=None, + author="Autor A", + summary="Summary", + content_raw="Raw", + content_rewritten="

    Alt

    ", + image_urls_json=None, + press_contact=None, + source_name_snapshot="Test Source", + source_terms_url_snapshot="https://example.org/terms", + source_license_name_snapshot="cc-by", + legal_checked=True, + legal_checked_at="2026-02-21T10:00:00Z", + legal_note=None, + wp_post_id=123, + wp_post_url="https://example.org/?p=123", + publish_attempts=2, + publish_last_error=None, + published_to_wp_at="2026-02-21T10:10:00Z", + word_count=1, + status="published", + meta_json="{}", + ) + ) + self.client.post("/admin/login", data={"username": "admin", "password": "secret"}, follow_redirects=True) + + save_res = self.client.post( + f"/admin/articles/{article_id}/rewrite-save", + data={"content_rewritten": "

    Neu

    Text

    "}, + follow_redirects=False, + ) + self.assertEqual(save_res.status_code, 303) + + reopen_res = self.client.post(f"/admin/articles/{article_id}/reopen", follow_redirects=False) + self.assertEqual(reopen_res.status_code, 303) + + article = get_article_by_id(article_id) + self.assertIsNotNone(article) + self.assertEqual(article.get("status"), "rewrite") + self.assertIn("Neu", article.get("content_rewritten") or "") + self.assertIsNone(article.get("wp_post_id")) + @patch("backend.app.admin_ui.urlopen") def test_image_proxy_returns_image_data(self, mock_urlopen) -> None: class _FakeHeaders: diff --git a/backend/tests/test_article_workflow.py b/backend/tests/test_article_workflow.py index 29dd212..094b595 100644 --- a/backend/tests/test_article_workflow.py +++ b/backend/tests/test_article_workflow.py @@ -76,10 +76,13 @@ class TestArticleWorkflow(unittest.TestCase): t3 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "published"}) self.assertEqual(t3.status_code, 200) + t4 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "rewrite"}) + self.assertEqual(t4.status_code, 200) + final = self.client.get(f"/api/articles/{article_id}") self.assertEqual(final.status_code, 200) - self.assertEqual(final.json()["item"]["status"], "published") - self.assertEqual(final.json()["item"]["status_ui"], "published") + self.assertEqual(final.json()["item"]["status"], "rewrite") + self.assertEqual(final.json()["item"]["status_ui"], "rewrite") def test_invalid_transition_rejected(self) -> None: article_id = self._create_article() From da269d08f166e488a4abfdefe91bf5f1072d015d Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 14:11:03 +0100 Subject: [PATCH 53/87] chore(admin): remove legal approval step from UI workflow --- backend/app/admin_ui.py | 23 +-------------------- backend/templates/admin_article_detail.html | 23 +-------------------- backend/templates/admin_dashboard.html | 1 - backend/tests/test_admin_ui.py | 2 +- 4 files changed, 3 insertions(+), 46 deletions(-) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index 89819cf..d3ca53e 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -38,7 +38,6 @@ from .repositories import ( list_runs, list_sources, set_article_image_decision, - set_article_legal_review, upsert_article, update_feed, update_source, @@ -185,7 +184,7 @@ def _classify_publish_error(error_message: str | None) -> tuple[str, str]: if not text.strip(): return "ok", "-" if "rechtsfreigabe fehlt" in text or "hauptbild nicht gesetzt" in text or "status ist nicht" in text: - return "policy", "Artikelvoraussetzungen im UI prüfen (Status/Rechtsfreigabe/Hauptbild)." + return "policy", "Artikelvoraussetzungen im UI prüfen (Status/Hauptbild)." if "401" in text or "403" in text or "authorization" in text or "forbidden" in text or "unauthorized" in text: return "auth", "WordPress Nutzer/App-Passwort prüfen." if "404" in text and ("media" in text or "posts" in text or "wp-json" in text): @@ -245,13 +244,6 @@ def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]: "value": feed.get("source_risk_level") if feed else "-", } ) - checks.append( - { - "label": "Manuelle Rechtsfreigabe", - "status": "ok" if int(article.get("legal_checked", 0)) == 1 else "missing", - "value": article.get("legal_checked_at") or "-", - } - ) image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} selected_image = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None checks.append( @@ -666,19 +658,6 @@ def admin_image_proxy(request: Request, url: str): return Response(content=body, media_type=content_type) -@router.post("/admin/articles/{article_id}/legal-review") -def admin_article_legal_review(request: Request, article_id: int, approved: str = Form("0"), note: str = Form("")): - user = _admin_user(request) - if not user: - return RedirectResponse(url="/admin/login", status_code=303) - - is_approved = approved == "1" - ok = set_article_legal_review(article_id, approved=is_approved, note=note or None, actor=user) - if not ok: - return _dashboard_redirect(msg=f"Artikel #{article_id} nicht gefunden", msg_type="error") - return RedirectResponse(url=f"/admin/articles/{article_id}", status_code=303) - - @router.post("/admin/sources/create") def admin_create_source( request: Request, diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index 70d5c57..992fe20 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -58,7 +58,7 @@
    -

    Rechts-Checkliste

    +

    Checkliste

    @@ -173,27 +173,6 @@

    Dieser Text wird für den WordPress-Entwurf verwendet, falls vorhanden.

    -
    -

    Rechtsfreigabe

    -

    Freigabe: - {% if article.legal_checked %} - Freigegeben - {% else %} - Nicht freigegeben - {% endif %} -

    -

    Zeitpunkt: {{ article.legal_checked_at or "-" }}

    -

    Notiz: {{ article.legal_note or "-" }}

    - - - - - -
    -

    Status ändern

    {% if article.status_ui in ["new", "rewrite"] %} diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index c82f8e3..f24b76e 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -258,7 +258,6 @@
    KriteriumStatusWert
    {{ a.status_ui }} -
    Legal: {{ "OK" if a.legal_checked else "offen" }}
    Publish: {{ "bereit" if a.publish_ready else "blockiert" }}
    {% if not a.publish_ready and a.publish_blockers %}
    {{ a.publish_blockers|join(", ") }}
    diff --git a/backend/tests/test_admin_ui.py b/backend/tests/test_admin_ui.py index eab63fd..6b7d1c7 100644 --- a/backend/tests/test_admin_ui.py +++ b/backend/tests/test_admin_ui.py @@ -131,7 +131,7 @@ class TestAdminUi(unittest.TestCase): res = self.client.get(f"/admin/articles/{article_id}", follow_redirects=True) self.assertEqual(res.status_code, 200) self.assertIn("Artikel-Detail", res.text) - self.assertIn("Rechts-Checkliste", res.text) + self.assertIn("Checkliste", res.text) decision = self.client.post( f"/admin/articles/{article_id}/images/decision", From b0f995d5c9148b3f63c374e126b86bfaa0823e32 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 14:39:47 +0100 Subject: [PATCH 54/87] feat(rewrite): add batch rewrite run, AI tags for WP, and agentur contact detection --- backend/app/admin_ui.py | 37 +++++- backend/app/main.py | 12 +- backend/app/rewrite.py | 120 ++++++++++++++++---- backend/app/source_extraction.py | 8 +- backend/app/wordpress.py | 92 ++++++++++++++- backend/templates/admin_article_detail.html | 3 + backend/templates/admin_dashboard.html | 12 ++ backend/tests/test_admin_ui.py | 65 +++++++++++ backend/tests/test_source_extraction.py | 27 +++++ backend/tests/test_wordpress.py | 34 ++++++ 10 files changed, 374 insertions(+), 36 deletions(-) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index d3ca53e..689efce 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -20,7 +20,7 @@ from .ingestion import run_ingestion from .policy import evaluate_source_policy from .publisher import enqueue_publish, run_publisher from .relevance import article_age_days, article_relevance -from .rewrite import rewrite_article_text +from .rewrite import generate_article_tags, merge_generated_tags, rewrite_article_text from .repositories import ( FeedCreate, FeedUpdate, @@ -373,6 +373,7 @@ def _upsert_article_from_existing( publish_attempts: int | object = _UNSET, publish_last_error: str | None | object = _UNSET, published_to_wp_at: str | None | object = _UNSET, + meta_json: str | None | object = _UNSET, ) -> None: rewritten = article.get("content_rewritten") if content_rewritten is None else content_rewritten upsert_article( @@ -403,7 +404,7 @@ def _upsert_article_from_existing( published_to_wp_at=article.get("published_to_wp_at") if published_to_wp_at is _UNSET else published_to_wp_at, word_count=len(str(rewritten or "").split()), status=article.get("status") if status is None else status, - meta_json=article.get("meta_json"), + meta_json=article.get("meta_json") if meta_json is _UNSET else meta_json, ) ) @@ -493,6 +494,8 @@ def admin_dashboard(request: Request): article["days_old"] = article_age_days(article.get("published_at")) article["relevance"] = article_relevance(article.get("published_at")) article["status_ui"] = internal_to_ui_status(article.get("status")) + tags = meta.get("generated_tags") if isinstance(meta.get("generated_tags"), list) else [] + article["generated_tags"] = [str(t) for t in tags if t] return templates.TemplateResponse( request, @@ -836,12 +839,40 @@ def admin_rewrite_run(request: Request, article_id: int): return _dashboard_redirect(msg=f"Rewrite nur aus new/rewrite fuer Artikel #{article_id}", msg_type="error") try: rewritten = rewrite_article_text(article) + tags = generate_article_tags(article, rewritten_text=rewritten) except Exception as exc: return _dashboard_redirect(msg=f"Rewrite fehlgeschlagen fuer Artikel #{article_id}: {exc}", msg_type="error") - _upsert_article_from_existing(article, content_rewritten=rewritten, status="approved") + merged_meta = merge_generated_tags(article.get("meta_json"), tags) + _upsert_article_from_existing(article, content_rewritten=rewritten, status="approved", meta_json=merged_meta) return _dashboard_redirect(msg=f"Rewrite fertig fuer Artikel #{article_id} -> publish") +@router.post("/admin/rewrite/run") +def admin_rewrite_run_batch(request: Request, max_jobs: str = Form("10")): + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + try: + limit = max(1, min(int(max_jobs), 100)) + except Exception: + limit = 10 + planned = list_articles(limit=limit, status_filter="rewrite") + processed = 0 + success = 0 + failed = 0 + for article in planned: + processed += 1 + try: + rewritten = rewrite_article_text(article) + tags = generate_article_tags(article, rewritten_text=rewritten) + merged_meta = merge_generated_tags(article.get("meta_json"), tags) + _upsert_article_from_existing(article, content_rewritten=rewritten, status="approved", meta_json=merged_meta) + success += 1 + except Exception: + failed += 1 + return _dashboard_redirect(msg=f"Rewrite-Run: processed={processed}, success={success}, failed={failed}") + + @router.post("/admin/articles/{article_id}/rewrite-save") def admin_rewrite_save(request: Request, article_id: int, content_rewritten: str = Form(...)): user = _admin_user(request) diff --git a/backend/app/main.py b/backend/app/main.py index 4dcee28..b0bcf2a 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -18,7 +18,7 @@ from .ingestion import run_ingestion from .policy import evaluate_source_policy, is_source_allowed from .publisher import enqueue_publish, run_publisher from .relevance import article_age_days, article_relevance -from .rewrite import rewrite_article_text +from .rewrite import generate_article_tags, merge_generated_tags, rewrite_article_text from .repositories import ( ArticleUpsert, FeedCreate, @@ -514,6 +514,12 @@ def api_article_rewrite_run(article_id: int, username: str = Depends(require_aut raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Rewrite nur aus Status 'new' oder 'rewrite'") rewritten = rewrite_article_text(article) + tags: list[str] = [] + try: + tags = generate_article_tags(article, rewritten_text=rewritten) + except Exception: + tags = [] + merged_meta = merge_generated_tags(article.get("meta_json"), tags) # upsert via status update + existing fields by lightweight path: repo_upsert_article( ArticleUpsert( @@ -543,10 +549,10 @@ def api_article_rewrite_run(article_id: int, username: str = Depends(require_aut published_to_wp_at=article.get("published_to_wp_at"), word_count=len(rewritten.split()), status="approved", - meta_json=article.get("meta_json"), + meta_json=merged_meta, ) ) - return {"ok": True, "id": article_id, "status": "publish"} + return {"ok": True, "id": article_id, "status": "publish", "tags": tags} @app.post("/api/articles/{article_id}/legal-review") diff --git a/backend/app/rewrite.py b/backend/app/rewrite.py index 8c313ad..759fac9 100644 --- a/backend/app/rewrite.py +++ b/backend/app/rewrite.py @@ -28,35 +28,39 @@ def _sanitize_source_text(text: str) -> str: return joined -def rewrite_article_text(article: dict[str, Any]) -> str: +def _normalize_tags(tags: list[str], max_tags: int = 8) -> list[str]: + out: list[str] = [] + seen: set[str] = set() + for raw in tags: + value = re.sub(r"\s+", " ", str(raw or "").strip()) + value = re.sub(r"^[#\-•\s]+", "", value) + value = re.sub(r"[;,.:\s]+$", "", value) + if not value: + continue + if len(value) < 2 or len(value) > 40: + continue + key = value.casefold() + if key in seen: + continue + seen.add(key) + out.append(value) + if len(out) >= max_tags: + break + return out + + +def _openai_chat(system: str, user: str, temperature: float = 0.4) -> str: settings = get_settings() api_key = settings.openai_api_key if not api_key: raise RuntimeError("OPENAI_API_KEY fehlt") - source_text = _sanitize_source_text(article.get("content_raw") or "") - if not source_text: - source_text = (article.get("summary") or "").strip() - if not source_text: - raise RuntimeError("Kein Quelltext für Rewrite verfügbar") - - title = (article.get("title") or "").strip() - prompt = ( - "Schreibe den folgenden News-Text neu auf Deutsch in persönlicher Du-Form. " - "Stil: ausführlich, gut lesbar, ohne Einleitung mit Datum/Uhrzeit/Firma/Ort, " - "ohne Pressekontakt, ohne Quellenblock. " - "Nutze klare Absätze und Zwischenüberschriften in HTML (

    ,

    ,

    • falls passend). " - "Inhaltlich korrekt bleiben, nichts erfinden.\n\n" - f"Titel: {title}\n\n" - f"Originaltext:\n{source_text}" - ) - payload = { "model": settings.openai_model, - "temperature": 0.4, + "temperature": temperature, "messages": [ - {"role": "system", "content": "Du bist ein deutscher News-Redakteur."}, - {"role": "user", "content": prompt}, + {"role": "system", "content": system}, + {"role": "user", "content": user}, ], } req = Request( @@ -78,6 +82,78 @@ def rewrite_article_text(article: dict[str, Any]) -> str: message = choices[0].get("message", {}) content = message.get("content") if not isinstance(content, str) or not content.strip(): - raise RuntimeError("OpenAI lieferte keinen Rewrite-Text") + raise RuntimeError("OpenAI lieferte keinen Inhalt") return content.strip() + +def rewrite_article_text(article: dict[str, Any]) -> str: + source_text = _sanitize_source_text(article.get("content_raw") or "") + if not source_text: + source_text = (article.get("summary") or "").strip() + if not source_text: + raise RuntimeError("Kein Quelltext für Rewrite verfügbar") + + title = (article.get("title") or "").strip() + prompt = ( + "Schreibe den folgenden News-Text neu auf Deutsch in persönlicher Du-Form. " + "Stil: ausführlich, gut lesbar, ohne Einleitung mit Datum/Uhrzeit/Firma/Ort, " + "ohne Pressekontakt, ohne Quellenblock. " + "Nutze klare Absätze und Zwischenüberschriften in HTML (

      ,

      ,

      • falls passend). " + "Inhaltlich korrekt bleiben, nichts erfinden.\n\n" + f"Titel: {title}\n\n" + f"Originaltext:\n{source_text}" + ) + return _openai_chat( + "Du bist ein deutscher News-Redakteur.", + prompt, + temperature=0.4, + ) + + +def generate_article_tags(article: dict[str, Any], rewritten_text: str | None = None, max_tags: int = 8) -> list[str]: + source_text = rewritten_text or _sanitize_source_text(article.get("content_raw") or "") or (article.get("summary") or "") + source_text = str(source_text).strip() + if not source_text: + return [] + title = (article.get("title") or "").strip() + prompt = ( + "Erzeuge präzise Schlagwörter für einen deutschen News-Artikel. " + f"Maximal {max_tags} Tags. Nur relevante Begriffe, keine allgemeinen Wörter wie News/Artikel. " + "Gib ausschließlich ein JSON-Array mit Strings zurück, ohne Erklärung.\n\n" + f"Titel: {title}\n\n" + f"Text:\n{source_text[:3500]}" + ) + raw = _openai_chat( + "Du extrahierst präzise, kurze News-Tags auf Deutsch.", + prompt, + temperature=0.2, + ) + try: + parsed = json.loads(raw) + if isinstance(parsed, list): + return _normalize_tags([str(x) for x in parsed], max_tags=max_tags) + except Exception: + pass + # fallback: extract first JSON-like array if model wrapped output + match = re.search(r"\[[\s\S]*\]", raw) + if match: + try: + parsed = json.loads(match.group(0)) + if isinstance(parsed, list): + return _normalize_tags([str(x) for x in parsed], max_tags=max_tags) + except Exception: + return [] + return [] + + +def merge_generated_tags(meta_json: str | None, tags: list[str]) -> str: + meta: dict[str, Any] = {} + if meta_json: + try: + parsed = json.loads(meta_json) + if isinstance(parsed, dict): + meta = parsed + except Exception: + meta = {} + meta["generated_tags"] = _normalize_tags(tags) + return json.dumps(meta, ensure_ascii=False) diff --git a/backend/app/source_extraction.py b/backend/app/source_extraction.py index 7fd65ce..925fcf6 100644 --- a/backend/app/source_extraction.py +++ b/backend/app/source_extraction.py @@ -157,7 +157,7 @@ def _extract_content_text(html: str) -> str | None: paragraphs = [] for match in re.finditer(r"]*>([\s\S]*?)", section, re.IGNORECASE): text = _clean_text(match.group(1)) - if text and re.search(r"\b(pressekontakt|press contact|kontakt)\b", text, re.IGNORECASE): + if text and re.search(r"\b(pressekontakt|press contact|kontakt|agentur)\b", text, re.IGNORECASE): paragraphs.append(text) for match in re.finditer(r"]*>([\s\S]*?)

        ", section, re.IGNORECASE): @@ -177,18 +177,18 @@ def _extract_press_contact(content_text: str | None) -> str | None: return None lines = [line.strip() for line in content_text.split("\n") if line.strip()] - marker_re = re.compile(r"\b(pressekontakt|press contact|presse\-kontakt)\b", re.IGNORECASE) + marker_re = re.compile(r"\b(pressekontakt|press contact|presse\-kontakt|agentur)\b", re.IGNORECASE) for idx, line in enumerate(lines): if marker_re.search(line): chunk = [line] for nxt in lines[idx + 1 : idx + 6]: - if re.search(r"\b(original\-content von|ots:|newsroom:)\b", nxt, re.IGNORECASE): + if re.search(r"\b(original\-content von|ots:|newsroom:|alle meldungen|zum newsroom)\b", nxt, re.IGNORECASE): break chunk.append(nxt) return _clean_text("\n".join(chunk)) match = re.search( - r"(Pressekontakt[\s\S]{0,1200}?)(?:Original-Content von|OTS:|newsroom:|$)", + r"((?:Pressekontakt|Agentur)[\s\S]{0,1200}?)(?:Original-Content von|OTS:|newsroom:|Alle Meldungen|Zum Newsroom|$)", content_text, re.IGNORECASE, ) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index c257747..8da5fc5 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -7,7 +7,7 @@ import mimetypes from pathlib import Path import re from typing import Any -from urllib.parse import urlparse +from urllib.parse import quote_plus, urlparse from urllib.request import Request, urlopen from .config import get_settings @@ -25,7 +25,7 @@ def _wp_request( method: str, endpoint: str, payload: dict[str, Any] | None = None, -) -> dict[str, Any]: +) -> Any: url = f"{base_url.rstrip('/')}/wp-json/wp/v2/{endpoint.lstrip('/')}" data = json.dumps(payload).encode("utf-8") if payload is not None else None req = Request( @@ -41,8 +41,7 @@ def _wp_request( ) with urlopen(req, timeout=20) as resp: raw = resp.read().decode("utf-8", errors="replace") - parsed = json.loads(raw) if raw else {} - return parsed if isinstance(parsed, dict) else {} + return json.loads(raw) if raw else {} def _selected_image_url_from_meta(meta_json: str | None) -> str | None: @@ -61,6 +60,81 @@ def _selected_image_url_from_meta(meta_json: str | None) -> str | None: return selected if isinstance(selected, str) and selected.strip() else None +def _selected_tags_from_meta(meta_json: str | None) -> list[str]: + if not meta_json: + return [] + try: + meta = json.loads(meta_json) + except Exception: + return [] + if not isinstance(meta, dict): + return [] + raw_tags = meta.get("generated_tags") + if not isinstance(raw_tags, list): + return [] + tags: list[str] = [] + seen: set[str] = set() + for item in raw_tags: + value = str(item or "").strip() + if not value: + continue + key = value.casefold() + if key in seen: + continue + seen.add(key) + tags.append(value) + if len(tags) >= 12: + break + return tags + + +def _resolve_wp_tag_ids(*, base_url: str, auth_header: str, tags: list[str]) -> list[int]: + ids: list[int] = [] + seen: set[int] = set() + for tag in tags: + name = tag.strip() + if not name: + continue + try: + endpoint = f"tags?search={quote_plus(name)}&per_page=20" + result = _wp_request(base_url=base_url, auth_header=auth_header, method="GET", endpoint=endpoint) + tag_id: int | None = None + if isinstance(result, list): + for row in result: + if not isinstance(row, dict): + continue + row_name = str(row.get("name") or "") + rid = int(row.get("id", 0) or 0) + if rid <= 0: + continue + if row_name.casefold() == name.casefold(): + tag_id = rid + break + if tag_id is None: + for row in result: + if isinstance(row, dict) and int(row.get("id", 0) or 0) > 0: + tag_id = int(row.get("id", 0)) + break + if tag_id is None: + created = _wp_request( + base_url=base_url, + auth_header=auth_header, + method="POST", + endpoint="tags", + payload={"name": name}, + ) + if isinstance(created, dict): + rid = int(created.get("id", 0) or 0) + if rid > 0: + tag_id = rid + if tag_id is not None and tag_id > 0 and tag_id not in seen: + seen.add(tag_id) + ids.append(tag_id) + except Exception: + continue + return ids + + def _download_image_bytes(url: str, referer: str | None = None) -> tuple[bytes, str]: headers = { "User-Agent": "rss-news-publisher/1.0", @@ -269,6 +343,14 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: payload["featured_media"] = featured_media_id wp_post_id = article.get("wp_post_id") + tag_ids = _resolve_wp_tag_ids( + base_url=settings.wordpress_base_url, + auth_header=auth, + tags=_selected_tags_from_meta(article.get("meta_json")), + ) + if tag_ids: + payload["tags"] = tag_ids + if wp_post_id: result = _wp_request( base_url=settings.wordpress_base_url, @@ -286,6 +368,8 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: payload=payload, ) + if not isinstance(result, dict): + raise RuntimeError(f"WordPress Antwort im unerwarteten Format: {result}") post_id = int(result.get("id", 0)) if post_id <= 0: raise RuntimeError(f"WordPress Antwort ohne Post-ID: {result}") diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html index 992fe20..1c16658 100644 --- a/backend/templates/admin_article_detail.html +++ b/backend/templates/admin_article_detail.html @@ -170,6 +170,9 @@ + {% if article.meta.generated_tags %} +

        Generierte Tags: {{ article.meta.generated_tags|join("; ") }}

        + {% endif %}

        Dieser Text wird für den WordPress-Entwurf verwendet, falls vorhanden.

        diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index f24b76e..15f3daf 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -102,6 +102,15 @@ +
        +

        Rewrite Run (geplante Artikel)

        +

        Verarbeitet alle Artikel im Status rewrite und setzt sie auf publish.

        +
        + + +
        +
        +

        Quellen + Policy

        @@ -269,6 +278,9 @@ {% if a.summary %}
        Summary: {{ a.summary }}
        {% endif %} + {% if a.generated_tags %} +
        Tags: {{ a.generated_tags|join("; ") }}
        + {% endif %} {% if a.content_raw %}
        Volltext anzeigen diff --git a/backend/tests/test_admin_ui.py b/backend/tests/test_admin_ui.py index 6b7d1c7..c7b6ebf 100644 --- a/backend/tests/test_admin_ui.py +++ b/backend/tests/test_admin_ui.py @@ -271,6 +271,71 @@ class TestAdminUi(unittest.TestCase): self.assertIn("Neu", article.get("content_rewritten") or "") self.assertIsNone(article.get("wp_post_id")) + @patch("backend.app.admin_ui.generate_article_tags") + @patch("backend.app.admin_ui.rewrite_article_text") + def test_batch_rewrite_run_processes_planned_articles(self, mock_rewrite_text, mock_tags) -> None: + mock_rewrite_text.return_value = "

        Neu

        Text

        " + mock_tags.return_value = ["Rheingas", "Monheim"] + + source_id = create_source( + SourceCreate( + name="Batch Source", + base_url="https://example.org", + terms_url="https://example.org/terms", + license_name="cc-by", + risk_level="green", + is_enabled=True, + notes=None, + last_reviewed_at=None, + ) + ) + feed_id = create_feed( + FeedCreate( + name="Batch Feed", + url="https://example.org/feed.xml", + source_id=source_id, + is_enabled=True, + ) + ) + article_id = upsert_article( + ArticleUpsert( + feed_id=feed_id, + source_article_id="batch-1", + source_hash="batch-hash-1", + title="Batch Titel", + source_url="https://example.org/batch", + canonical_url="https://example.org/batch", + published_at=None, + author="Autor", + summary="Summary", + content_raw="Raw", + content_rewritten=None, + image_urls_json=None, + press_contact=None, + source_name_snapshot="Batch Source", + source_terms_url_snapshot="https://example.org/terms", + source_license_name_snapshot="cc-by", + legal_checked=False, + legal_checked_at=None, + legal_note=None, + wp_post_id=None, + wp_post_url=None, + publish_attempts=0, + publish_last_error=None, + published_to_wp_at=None, + word_count=1, + status="rewrite", + meta_json="{}", + ) + ) + self.client.post("/admin/login", data={"username": "admin", "password": "secret"}, follow_redirects=True) + res = self.client.post("/admin/rewrite/run", data={"max_jobs": "10"}, follow_redirects=False) + self.assertEqual(res.status_code, 303) + article = get_article_by_id(article_id) + self.assertIsNotNone(article) + self.assertEqual(article.get("status"), "approved") + self.assertIn("generated_tags", article.get("meta_json", "")) + @patch("backend.app.admin_ui.urlopen") def test_image_proxy_returns_image_data(self, mock_urlopen) -> None: class _FakeHeaders: diff --git a/backend/tests/test_source_extraction.py b/backend/tests/test_source_extraction.py index f6787ff..5cafde7 100644 --- a/backend/tests/test_source_extraction.py +++ b/backend/tests/test_source_extraction.py @@ -26,6 +26,25 @@ SAMPLE_HTML = """ """ +SAMPLE_HTML_AGENTUR = """ + + + + + + + +
        +

        Inhalt der Meldung.

        +

        Agentur

        +

        Agenturname GmbH

        +

        presse@agentur.example

        +

        Original-Content von Beispiel

        +
        + + +""" + class _FakeHeaders: @staticmethod @@ -64,6 +83,14 @@ class TestSourceExtraction(unittest.TestCase): self.assertIn("Pressekontakt", extracted.press_contact or "") self.assertIsNone(extracted.extraction_error) + @patch("backend.app.source_extraction.urlopen") + def test_extract_article_detects_agentur_block_as_press_contact(self, mock_urlopen) -> None: + mock_urlopen.return_value = _FakeResponse(SAMPLE_HTML_AGENTUR) + extracted = extract_article("https://www.presseportal.de/pm/155103/6210401") + self.assertIn("Agentur", extracted.press_contact or "") + self.assertIn("Agenturname", extracted.press_contact or "") + self.assertIn("presse@agentur.example", extracted.press_contact or "") + if __name__ == "__main__": unittest.main() diff --git a/backend/tests/test_wordpress.py b/backend/tests/test_wordpress.py index 833b159..4cafc55 100644 --- a/backend/tests/test_wordpress.py +++ b/backend/tests/test_wordpress.py @@ -80,6 +80,40 @@ class TestWordpressPublish(unittest.TestCase): self.assertNotIn("Pressekontakt", content) self.assertIn("eigentliche Text", content) + @patch("backend.app.wordpress._upload_featured_media") + @patch("backend.app.wordpress._wp_request") + def test_publish_resolves_and_sets_tags(self, mock_wp_request, mock_upload_media) -> None: + def _fake_wp_request(**kwargs): + endpoint = kwargs.get("endpoint", "") + method = kwargs.get("method", "") + if method == "GET" and endpoint.startswith("tags?search="): + if "Rheingas" in endpoint: + return [{"id": 11, "name": "Rheingas"}] + return [] + if method == "POST" and endpoint == "tags": + name = (kwargs.get("payload") or {}).get("name") + if name == "Gasflasche": + return {"id": 12, "name": "Gasflasche"} + return {"id": 13, "name": str(name)} + if method == "POST" and endpoint == "posts": + return {"id": 900, "link": "https://example.org/?p=900"} + return {} + + mock_wp_request.side_effect = _fake_wp_request + article = { + "title": "Tag Test", + "content_raw": "Inhalt", + "source_url": "https://example.com/source", + "canonical_url": "https://example.com/source", + "meta_json": '{"generated_tags":["Rheingas","Gasflasche"]}', + } + post_id, _ = publish_article_draft(article) + self.assertEqual(post_id, 900) + post_calls = [call for call in mock_wp_request.call_args_list if call.kwargs.get("endpoint") == "posts"] + self.assertEqual(len(post_calls), 1) + payload = post_calls[0].kwargs.get("payload", {}) + self.assertEqual(payload.get("tags"), [11, 12]) + if __name__ == "__main__": unittest.main() From 93f52f72b948aa997491cce0ae7a33e89197a88c Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 14:51:36 +0100 Subject: [PATCH 55/87] fix(ingestion): preserve article workflow data and skip closed items on re-import --- backend/app/ingestion.py | 111 +++++++++++++++++++++-------- backend/app/repositories.py | 7 ++ backend/tests/test_ingestion.py | 119 +++++++++++++++++++++++++++++++- 3 files changed, 206 insertions(+), 31 deletions(-) diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py index 872a1b0..1ba6b6c 100644 --- a/backend/app/ingestion.py +++ b/backend/app/ingestion.py @@ -16,6 +16,7 @@ from .repositories import ( ArticleUpsert, RunCreate, create_run, + find_existing_article_for_upsert, finish_run, get_feed_by_id, list_enabled_feeds, @@ -135,6 +136,20 @@ def _select_relevant_images(source_url: str, title: str, images: list[str], max_ return kept, primary, ranked +def _merge_ingestion_meta(existing_meta_json: str | None, attribution: dict[str, Any], extraction_meta: dict[str, Any]) -> str: + meta: dict[str, Any] = {} + if existing_meta_json: + try: + parsed = json.loads(existing_meta_json) + if isinstance(parsed, dict): + meta = parsed + except Exception: + meta = {} + meta["attribution"] = attribution + meta["extraction"] = extraction_meta + return json.dumps(meta, ensure_ascii=False) + + def run_ingestion(feed_id: int | None = None) -> IngestionStats: run_id = create_run(RunCreate(run_type="ingestion", status="running", details="started")) feeds_processed = 0 @@ -268,37 +283,73 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: "total_candidates": len(extracted.images), "ranked": ranked_images, } - article_id = upsert_article( - ArticleUpsert( - feed_id=int(feed["id"]), - source_article_id=entry.get("id") or entry.get("guid"), - source_hash=source_hash, - title=final_title, - source_url=link, - canonical_url=final_canonical, - published_at=_entry_published_iso(entry), - author=final_author, - summary=final_summary, - content_raw=final_content_raw, - content_rewritten=None, - image_urls_json=json.dumps(selected_images, ensure_ascii=False) if selected_images else None, - press_contact=extracted.press_contact, - source_name_snapshot=feed.get("source_name"), - source_terms_url_snapshot=feed.get("source_terms_url"), - source_license_name_snapshot=feed.get("source_license_name"), - legal_checked=False, - legal_checked_at=None, - legal_note=None, - wp_post_id=None, - wp_post_url=None, - publish_attempts=0, - publish_last_error=None, - published_to_wp_at=None, - word_count=len((final_content_raw or "").split()), - status="new", - meta_json=json.dumps({"attribution": attribution, "extraction": extraction_meta}, ensure_ascii=False), - ) + base_payload = ArticleUpsert( + feed_id=int(feed["id"]), + source_article_id=entry.get("id") or entry.get("guid"), + source_hash=source_hash, + title=final_title, + source_url=link, + canonical_url=final_canonical, + published_at=_entry_published_iso(entry), + author=final_author, + summary=final_summary, + content_raw=final_content_raw, + content_rewritten=None, + image_urls_json=json.dumps(selected_images, ensure_ascii=False) if selected_images else None, + press_contact=extracted.press_contact, + source_name_snapshot=feed.get("source_name"), + source_terms_url_snapshot=feed.get("source_terms_url"), + source_license_name_snapshot=feed.get("source_license_name"), + legal_checked=False, + legal_checked_at=None, + legal_note=None, + wp_post_id=None, + wp_post_url=None, + publish_attempts=0, + publish_last_error=None, + published_to_wp_at=None, + word_count=len((final_content_raw or "").split()), + status="new", + meta_json=json.dumps({"attribution": attribution, "extraction": extraction_meta}, ensure_ascii=False), ) + existing = find_existing_article_for_upsert(base_payload) + if existing and existing.get("status") == "error": + # Explicitly closed article: ignore on subsequent ingestion runs. + continue + + payload = base_payload + if existing: + payload = ArticleUpsert( + feed_id=base_payload.feed_id, + source_article_id=base_payload.source_article_id, + source_hash=base_payload.source_hash, + title=base_payload.title, + source_url=base_payload.source_url, + canonical_url=base_payload.canonical_url, + published_at=base_payload.published_at, + author=base_payload.author, + summary=base_payload.summary, + content_raw=base_payload.content_raw, + content_rewritten=existing.get("content_rewritten"), + image_urls_json=base_payload.image_urls_json, + press_contact=base_payload.press_contact or existing.get("press_contact"), + source_name_snapshot=base_payload.source_name_snapshot, + source_terms_url_snapshot=base_payload.source_terms_url_snapshot, + source_license_name_snapshot=base_payload.source_license_name_snapshot, + legal_checked=bool(int(existing.get("legal_checked", 0))), + legal_checked_at=existing.get("legal_checked_at"), + legal_note=existing.get("legal_note"), + wp_post_id=existing.get("wp_post_id"), + wp_post_url=existing.get("wp_post_url"), + publish_attempts=int(existing.get("publish_attempts", 0)), + publish_last_error=existing.get("publish_last_error"), + published_to_wp_at=existing.get("published_to_wp_at"), + word_count=base_payload.word_count, + status=existing.get("status") or "new", + meta_json=_merge_ingestion_meta(existing.get("meta_json"), attribution, extraction_meta), + ) + + article_id = upsert_article(payload) if article_id: articles_upserted += 1 feed_upserts += 1 diff --git a/backend/app/repositories.py b/backend/app/repositories.py index bff6e87..0ee5380 100644 --- a/backend/app/repositories.py +++ b/backend/app/repositories.py @@ -633,6 +633,13 @@ def _resolve_existing_article_id(payload: ArticleUpsert) -> int | None: return None +def find_existing_article_for_upsert(payload: ArticleUpsert) -> dict[str, Any] | None: + article_id = _resolve_existing_article_id(payload) + if article_id is None: + return None + return get_article_by_id(article_id) + + def upsert_article(payload: ArticleUpsert) -> int: existing_id = _resolve_existing_article_id(payload) with get_conn() as conn: diff --git a/backend/tests/test_ingestion.py b/backend/tests/test_ingestion.py index 342c216..a36b62e 100644 --- a/backend/tests/test_ingestion.py +++ b/backend/tests/test_ingestion.py @@ -7,7 +7,16 @@ from unittest.mock import patch from backend.app import config as config_module from backend.app.db import init_db from backend.app.ingestion import run_ingestion -from backend.app.repositories import FeedCreate, SourceCreate, create_feed, create_source, list_articles +from backend.app.repositories import ( + ArticleUpsert, + FeedCreate, + SourceCreate, + create_feed, + create_source, + get_article_by_id, + list_articles, + upsert_article, +) from backend.app.source_extraction import ExtractedArticle @@ -118,6 +127,114 @@ class TestIngestion(unittest.TestCase): mock_parse.assert_not_called() mock_extract_article.assert_not_called() + @patch("backend.app.ingestion.extract_article") + @patch("backend.app.ingestion.feedparser.parse") + def test_ingestion_preserves_existing_work_and_skips_closed(self, mock_parse, mock_extract_article) -> None: + existing_closed_id = upsert_article( + ArticleUpsert( + feed_id=self.feed_id, + source_article_id="closed-1", + source_hash="closed-hash-1", + title="Alt Closed", + source_url="https://example.org/closed-article", + canonical_url="https://example.org/closed-article", + published_at=None, + author="Autor", + summary="Alt", + content_raw="Alt Raw", + content_rewritten="

        Alt Rewrite Closed

        ", + image_urls_json=None, + press_contact="Kontakt Alt", + source_name_snapshot="Test Source", + source_terms_url_snapshot="https://example.org/terms", + source_license_name_snapshot="cc-by", + legal_checked=False, + legal_checked_at=None, + legal_note=None, + wp_post_id=42, + wp_post_url="https://wp.local/?p=42", + publish_attempts=2, + publish_last_error=None, + published_to_wp_at="2026-02-21T12:00:00Z", + word_count=3, + status="error", # UI: close + meta_json='{"generated_tags":["AltTag"]}', + ) + ) + existing_published_id = upsert_article( + ArticleUpsert( + feed_id=self.feed_id, + source_article_id="published-1", + source_hash="published-hash-1", + title="Alt Published", + source_url="https://example.org/published-article", + canonical_url="https://example.org/published-article", + published_at=None, + author="Autor", + summary="Alt", + content_raw="Alt Raw", + content_rewritten="

        Alt Rewrite Published

        ", + image_urls_json=None, + press_contact="Kontakt Alt", + source_name_snapshot="Test Source", + source_terms_url_snapshot="https://example.org/terms", + source_license_name_snapshot="cc-by", + legal_checked=False, + legal_checked_at=None, + legal_note=None, + wp_post_id=77, + wp_post_url="https://wp.local/?p=77", + publish_attempts=3, + publish_last_error=None, + published_to_wp_at="2026-02-21T12:10:00Z", + word_count=3, + status="published", + meta_json='{"generated_tags":["Rheingas"],"image_review":{"selected_url":"https://img.local/1.jpg"}}', + ) + ) + + mock_extract_article.return_value = ExtractedArticle( + title="Neu Titel", + author="Neu Autor", + canonical_url=None, + summary="Neu Summary", + content_text="Neu Volltext", + images=["https://example.org/a.jpg"], + press_contact=None, + extraction_error=None, + ) + mock_parse.return_value = { + "etag": "etag-2", + "modified": "Tue, 18 Feb 2026 11:00:00 GMT", + "entries": [ + { + "id": "closed-1", + "title": "Closed Entry", + "link": "https://example.org/closed-article", + "summary": "X", + }, + { + "id": "published-1", + "title": "Published Entry", + "link": "https://example.org/published-article", + "summary": "Y", + }, + ], + } + + stats = run_ingestion(feed_id=self.feed_id) + self.assertEqual(stats.status, "success") + closed_row = get_article_by_id(existing_closed_id) or {} + self.assertEqual(closed_row["status"], "error") + self.assertIn("Alt Rewrite Closed", closed_row.get("content_rewritten") or "") + self.assertEqual(closed_row.get("wp_post_id"), 42) + + published_row = get_article_by_id(existing_published_id) or {} + self.assertEqual(published_row["status"], "published") + self.assertIn("Alt Rewrite Published", published_row.get("content_rewritten") or "") + self.assertEqual(published_row.get("wp_post_id"), 77) + self.assertIn("generated_tags", published_row.get("meta_json") or "") + if __name__ == "__main__": unittest.main() From 6332a9a3991216106fc716e8ae8d0545cbe9bfe5 Mon Sep 17 00:00:00 2001 From: Oliver G Date: Sat, 21 Feb 2026 14:55:20 +0100 Subject: [PATCH 56/87] feat(wordpress): publish true Gutenberg blocks and remove auto summary/details sections --- backend/app/wordpress.py | 84 +++++++++++++++------------------ backend/tests/test_wordpress.py | 26 ++++++++-- 2 files changed, 62 insertions(+), 48 deletions(-) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index 8da5fc5..150bcd1 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -229,6 +229,42 @@ def _as_block_paragraphs(text: str) -> str: return "\n".join(lines) +def _strip_html_tags(raw: str) -> str: + text = re.sub(r"<[^>]+>", " ", raw or "") + return re.sub(r"\s+", " ", text).strip() + + +def _html_to_wp_blocks(html: str) -> str: + src = (html or "").strip() + if not src: + return "" + pattern = re.compile( + r"]*>[\s\S]*?|]*>[\s\S]*?

        |]*>[\s\S]*?|]*>[\s\S]*?", + re.IGNORECASE, + ) + blocks: list[str] = [] + for match in pattern.finditer(src): + block_html = match.group(0).strip() + if not block_html: + continue + tag_match = re.match(r"<([a-z0-9]+)", block_html, re.IGNORECASE) + tag = (tag_match.group(1).lower() if tag_match else "") + if tag == "p": + blocks.append(f"{block_html}") + elif tag in {"ul", "ol"}: + ordered = tag == "ol" + if ordered: + blocks.append(f'{block_html}') + else: + blocks.append(f"{block_html}") + elif tag.startswith("h") and len(tag) == 2 and tag[1].isdigit(): + level = int(tag[1]) + blocks.append(f'{block_html}') + if blocks: + return "\n".join(blocks) + return _as_block_paragraphs(_strip_html_tags(src)) + + def _as_block_heading(level: int, text: str) -> str: safe_level = min(6, max(1, int(level))) return f'{escape(text)}' @@ -254,60 +290,18 @@ def _sanitize_publish_text(text: str) -> str: def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: - source_url = article.get("source_url") or "" - canonical_url = article.get("canonical_url") or source_url summary = (article.get("summary") or "").strip() body_text = (article.get("content_rewritten") or article.get("content_raw") or "").strip() body_text = _sanitize_publish_text(body_text) if not body_text: body_text = summary - # Keep existing HTML if already present, otherwise wrap plain text into block paragraphs. has_html = bool(re.search(r"<[a-zA-Z][^>]*>", body_text)) - body_html = body_text if has_html else _as_block_paragraphs(body_text) + body_html = _html_to_wp_blocks(body_text) if has_html else _as_block_paragraphs(body_text) if not body_html: body_html = "

        Kein Inhalt verfügbar.

        " - elif has_html: - body_html = f"\n{body_html}\n" - - author = (article.get("author") or "").strip() - published_at = (article.get("published_at") or "").strip() - source_name = (article.get("source_name_snapshot") or "").strip() - license_name = (article.get("source_license_name_snapshot") or "").strip() - terms_url = (article.get("source_terms_url_snapshot") or "").strip() - - lead_html = f"

        {escape(summary)}

        \n" if summary else "" - - facts: list[str] = [] - if author: - facts.append(f"Autor: {escape(author)}") - if published_at: - facts.append(f"Veröffentlicht (Quelle): {escape(published_at)}") - if source_name: - facts.append(f"Quelle: {escape(source_name)}") - if license_name: - facts.append(f"Lizenz: {escape(license_name)}") - if terms_url: - facts.append(f"Lizenzhinweise: {escape(terms_url)}") - - facts_html = "" - if facts: - facts_html = _as_block_heading(3, "Artikeldetails") + "\n" + _as_block_list(facts) - - attribution_parts = [ - _as_block_heading(3, "Quelle"), - f'

        Originalartikel: {escape(source_url)}

        ', - ] - if canonical_url and canonical_url != source_url: - attribution_parts.append( - f'

        Canonical: {escape(canonical_url)}

        ' - ) - attribution_html = "\n".join(attribution_parts) - - content = f"{lead_html}{body_html}\n\n{facts_html}\n{attribution_html}".strip() - excerpt_source = summary or re.sub(r"\s+", " ", body_text).strip() - excerpt = excerpt_source[:220] if excerpt_source else None - return content, excerpt + content = body_html.strip() + return content, None def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: diff --git a/backend/tests/test_wordpress.py b/backend/tests/test_wordpress.py index 4cafc55..20b0618 100644 --- a/backend/tests/test_wordpress.py +++ b/backend/tests/test_wordpress.py @@ -38,9 +38,9 @@ class TestWordpressPublish(unittest.TestCase): self.assertTrue(mock_upload_media.called) payload = mock_wp_request.call_args.kwargs["payload"] self.assertEqual(payload.get("featured_media"), 456) - self.assertIn("

        Quelle

        ", payload.get("content", "")) - self.assertIn("Originalartikel", payload.get("content", "")) - self.assertEqual(payload.get("excerpt"), "Inhalt") + self.assertIn("", payload.get("content", "")) + self.assertIn("

        Inhalt

        ", payload.get("content", "")) + self.assertNotIn("excerpt", payload) @patch("backend.app.wordpress._upload_featured_media") @patch("backend.app.wordpress._wp_request") @@ -79,6 +79,7 @@ class TestWordpressPublish(unittest.TestCase): self.assertNotIn("Firma GmbH", content) self.assertNotIn("Pressekontakt", content) self.assertIn("eigentliche Text", content) + self.assertNotIn("Artikeldetails", content) @patch("backend.app.wordpress._upload_featured_media") @patch("backend.app.wordpress._wp_request") @@ -114,6 +115,25 @@ class TestWordpressPublish(unittest.TestCase): payload = post_calls[0].kwargs.get("payload", {}) self.assertEqual(payload.get("tags"), [11, 12]) + @patch("backend.app.wordpress._upload_featured_media") + @patch("backend.app.wordpress._wp_request") + def test_publish_converts_html_to_wp_blocks_without_html_block(self, mock_wp_request, mock_upload_media) -> None: + mock_wp_request.return_value = {"id": 111, "link": "https://example.org/?p=111"} + article = { + "title": "Block Test", + "content_rewritten": "

        Überschrift

        Absatz 1

        • A
        • B
        ", + "source_url": "https://example.com/source", + "canonical_url": "https://example.com/source", + "meta_json": "{}", + } + publish_article_draft(article) + payload = mock_wp_request.call_args.kwargs["payload"] + content = payload.get("content", "") + self.assertIn("", content) + self.assertIn("", content) + self.assertNotIn("", content) + if __name__ == "__main__": unittest.main() From 6192f8e527da20874b81a095b1f59e76b9a919dc Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Sat, 21 Mar 2026 09:40:15 +0000 Subject: [PATCH 57/87] feat(automation): autonomous pipeline with Telegram bot and N8N integration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add full auto pipeline: RSS ingest → GPT relevance score → AI rewrite → WP draft - Add Telegram bot with inline buttons (rewrite/discard/override) and commands (/run, /rejected, /status) - Add smart publish scheduler: max 2 drafts/day, spread over week (09:00 & 14:00 CET) - Add N8N API endpoints (/api/n8n/pipeline, /api/n8n/ingest) with X-API-Key auth - Add GPT-based relevance scoring (0-100) for VanLife/Camping/Outdoor topics - Remove Ampel risk-level policy check from ingestion (all enabled feeds are used) - Add Telegram webhook endpoint and setup endpoint - Add delete_wp_post() for Telegram discard action - Add DB migrations for relevance_score and scheduled_publish_at columns - Update .env.example with all new configuration variables - Add docs/AUTOMATION.md with full setup and usage documentation Co-Authored-By: Claude Sonnet 4.6 --- backend/.env.example | 35 +++ backend/app/config.py | 14 ++ backend/app/db.py | 2 + backend/app/ingestion.py | 25 -- backend/app/main.py | 80 +++++++ backend/app/pipeline.py | 407 +++++++++++++++++++++++++++++++++ backend/app/rewrite.py | 41 ++++ backend/app/scheduler.py | 139 ++++++++++++ backend/app/telegram_bot.py | 438 ++++++++++++++++++++++++++++++++++++ backend/app/wordpress.py | 15 ++ docs/AUTOMATION.md | 190 ++++++++++++++++ 11 files changed, 1361 insertions(+), 25 deletions(-) create mode 100644 backend/app/pipeline.py create mode 100644 backend/app/scheduler.py create mode 100644 backend/app/telegram_bot.py create mode 100644 docs/AUTOMATION.md diff --git a/backend/.env.example b/backend/.env.example index 74e9c4b..c2dd235 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,3 +1,4 @@ +# ─── App ──────────────────────────────────────────────────────────────────── APP_ENV=development APP_NAME=rss-news-backend APP_SECRET_KEY=replace-with-a-long-random-secret @@ -8,3 +9,37 @@ APP_ADMIN_PASSWORD=change-me SESSION_COOKIE_NAME=rss_news_session SESSION_MAX_AGE_SECONDS=28800 + +# ─── WordPress ────────────────────────────────────────────────────────────── +WP_BASE_URL=https://your-site.tld +WP_USERNAME=your-wp-username +WP_PASSWORD=your-wp-app-password +# Status für neue Beiträge: draft | future | publish +WORDPRESS_DEFAULT_STATUS=draft + +# ─── OpenAI ───────────────────────────────────────────────────────────────── +OPENAI_API_KEY=sk-... +# gpt-4o-mini empfohlen (Kosten/Qualität) +OPENAI_MODEL=gpt-4o-mini + +# ─── Telegram Bot ──────────────────────────────────────────────────────────── +# Bot-Token von @BotFather +TELEGRAM_BOT_TOKEN=123456789:ABC... +# Chat-ID deines persönlichen Chats oder einer Gruppe +TELEGRAM_CHAT_ID=123456789 +# Zufälliger Secret-Token zur Webhook-Absicherung (mindestens 20 Zeichen) +TELEGRAM_WEBHOOK_SECRET=replace-with-random-secret-min-20-chars + +# ─── N8N API-Key ───────────────────────────────────────────────────────────── +# Wird von N8N im Header X-API-Key mitgeschickt +N8N_API_KEY=replace-with-strong-random-key + +# ─── Pipeline-Einstellungen ────────────────────────────────────────────────── +# Relevanz-Score >= dieser Wert: automatisch verarbeiten (0-100) +PIPELINE_RELEVANCE_AUTO=80 +# Relevanz-Score >= dieser Wert, aber < AUTO: Telegram-Warnung senden +PIPELINE_RELEVANCE_WARN=60 +# Maximale Drafts/Veröffentlichungen pro Tag +PIPELINE_MAX_DRAFTS_PER_DAY=2 +# Bevorzugte Veröffentlichungszeiten (Stunden, kommagetrennt, CET) +PIPELINE_PUBLISH_HOURS=9,14 diff --git a/backend/app/config.py b/backend/app/config.py index 43629ba..d56ce11 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -33,6 +33,20 @@ class Settings(BaseSettings): openai_api_key: str | None = Field(default=None, validation_alias=AliasChoices("OPENAI_API_KEY")) openai_model: str = "gpt-4o-mini" + # Telegram Bot + telegram_bot_token: str | None = Field(default=None, validation_alias=AliasChoices("TELEGRAM_BOT_TOKEN")) + telegram_chat_id: str | None = Field(default=None, validation_alias=AliasChoices("TELEGRAM_CHAT_ID")) + telegram_webhook_secret: str | None = Field(default=None, validation_alias=AliasChoices("TELEGRAM_WEBHOOK_SECRET")) + + # N8N API authentication + n8n_api_key: str | None = Field(default=None, validation_alias=AliasChoices("N8N_API_KEY")) + + # Pipeline behaviour + pipeline_relevance_auto: int = 80 # >= this: auto-process + pipeline_relevance_warn: int = 60 # >= this: Telegram warning, else reject + pipeline_max_drafts_per_day: int = 2 + pipeline_publish_hours: str = "9,14" # comma-separated preferred publish hours (CET) + @lru_cache(maxsize=1) def get_settings() -> Settings: diff --git a/backend/app/db.py b/backend/app/db.py index d2ebfd5..1b394c3 100644 --- a/backend/app/db.py +++ b/backend/app/db.py @@ -160,6 +160,8 @@ def init_db() -> None: row["name"] for row in conn.execute("PRAGMA table_info(articles)").fetchall() } migration_columns = { + "relevance_score": "ALTER TABLE articles ADD COLUMN relevance_score INTEGER", + "scheduled_publish_at": "ALTER TABLE articles ADD COLUMN scheduled_publish_at TEXT", "source_hash": "ALTER TABLE articles ADD COLUMN source_hash TEXT", "image_urls_json": "ALTER TABLE articles ADD COLUMN image_urls_json TEXT", "press_contact": "ALTER TABLE articles ADD COLUMN press_contact TEXT", diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py index 1ba6b6c..510fd10 100644 --- a/backend/app/ingestion.py +++ b/backend/app/ingestion.py @@ -11,7 +11,6 @@ from urllib.parse import unquote, urlparse import feedparser -from .policy import evaluate_source_policy from .repositories import ( ArticleUpsert, RunCreate, @@ -169,30 +168,6 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: continue feeds_processed += 1 - source_snapshot = { - "id": feed.get("source_id"), - "name": feed.get("source_name"), - "base_url": feed.get("source_base_url"), - "terms_url": feed.get("source_terms_url"), - "license_name": feed.get("source_license_name"), - "risk_level": feed.get("source_risk_level"), - "last_reviewed_at": feed.get("source_last_reviewed_at"), - "is_enabled": feed.get("source_is_enabled"), - } - policy_issues = evaluate_source_policy(source_snapshot) - if policy_issues: - feed_results.append( - { - "feed_id": int(feed["id"]), - "feed_url": feed["url"], - "status": "blocked", - "policy_issues": policy_issues, - "entries_seen": 0, - "upserts": 0, - } - ) - continue - parsed = None feed_error = None for attempt in range(1, MAX_FEED_FETCH_RETRIES + 1): diff --git a/backend/app/main.py b/backend/app/main.py index b0bcf2a..51aab6b 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -15,10 +15,12 @@ from .auth import create_session_token, verify_credentials, verify_session_token from .config import get_settings from .db import init_db from .ingestion import run_ingestion +from .pipeline import run_auto_pipeline from .policy import evaluate_source_policy, is_source_allowed from .publisher import enqueue_publish, run_publisher from .relevance import article_age_days, article_relevance from .rewrite import generate_article_tags, merge_generated_tags, rewrite_article_text +from .telegram_bot import handle_update, setup_webhook from .repositories import ( ArticleUpsert, FeedCreate, @@ -620,3 +622,81 @@ def api_run_ingestion(payload: IngestionRunRequest, username: str = Depends(requ }, "requested_by": username, } + + +# --------------------------------------------------------------------------- +# N8N Automation endpoint (API-Key auth, no session cookie required) +# --------------------------------------------------------------------------- + +def _require_api_key(request: Request) -> None: + api_key = request.headers.get("X-API-Key") or request.query_params.get("api_key") + expected = settings.n8n_api_key + if not expected: + raise HTTPException(status_code=status.HTTP_501_NOT_IMPLEMENTED, detail="N8N_API_KEY nicht konfiguriert") + if api_key != expected: + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Ungültiger API-Key") + + +@app.post("/api/n8n/pipeline") +def api_n8n_pipeline(request: Request) -> dict: + """Trigger the full auto pipeline. Called by N8N (2x/day or on demand).""" + _require_api_key(request) + try: + result = run_auto_pipeline(trigger="n8n") + return {"ok": True, "stats": result} + except Exception as exc: + raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(exc)) from exc + + +@app.post("/api/n8n/ingest") +def api_n8n_ingest(request: Request) -> dict: + """Run only the ingestion step (no rewrite/publish). For N8N.""" + _require_api_key(request) + stats = run_ingestion() + return { + "ok": stats.status == "success", + "stats": { + "feeds_processed": stats.feeds_processed, + "entries_seen": stats.entries_seen, + "articles_upserted": stats.articles_upserted, + }, + } + + +# --------------------------------------------------------------------------- +# Telegram Webhook +# --------------------------------------------------------------------------- + +@app.post("/telegram/webhook") +async def telegram_webhook(request: Request) -> dict: + """Receive updates from Telegram Bot API.""" + # Verify secret token + secret = settings.telegram_webhook_secret + if secret: + incoming = request.headers.get("X-Telegram-Bot-Api-Secret-Token", "") + if incoming != secret: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Invalid secret") + + body = await request.body() + try: + update = json.loads(body.decode("utf-8")) + except Exception: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid JSON") + + try: + handle_update(update) + except Exception as exc: + import logging + logging.getLogger(__name__).error("Telegram update handler error: %s", exc) + + return {"ok": True} + + +@app.post("/api/telegram/setup-webhook") +def api_setup_telegram_webhook(request: Request) -> dict: + """Register the Telegram webhook URL. Call once after deployment.""" + username = require_auth(request) + base_url = str(request.base_url).rstrip("/") + webhook_url = f"{base_url}/telegram/webhook" + result = setup_webhook(webhook_url) + return {"ok": True, "webhook_url": webhook_url, "telegram_response": result, "requested_by": username} diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py new file mode 100644 index 0000000..f86ef35 --- /dev/null +++ b/backend/app/pipeline.py @@ -0,0 +1,407 @@ +"""Autonomous RSS-News pipeline. + +Full automated flow: +1. Run RSS ingestion +2. For each new article: + - Auto-select primary image + - Score relevance via GPT + - < warn threshold: reject (error status) → Telegram rejected summary + - warn..auto threshold: Telegram warning with override button + - >= auto threshold: rewrite → create WP draft → Telegram notification +3. Send pipeline summary to Telegram +""" +from __future__ import annotations + +import json +import logging +import time +from dataclasses import dataclass, field +from datetime import datetime, timezone +from typing import Any + +from .config import get_settings +from .ingestion import run_ingestion +from .publisher import enqueue_publish, run_publisher +from .repositories import ( + ArticleUpsert, + get_article_by_id, + list_articles, + set_article_image_decision, + update_article_status, + upsert_article as repo_upsert_article, +) +from .rewrite import generate_article_tags, merge_generated_tags, rewrite_article_text, score_article_relevance +from .scheduler import reserve_publish_slot +from .wordpress import publish_article_draft, selected_image_exists + +logger = logging.getLogger(__name__) + + +@dataclass +class PipelineStats: + ingested: int = 0 + processed: int = 0 + drafts_created: int = 0 + rejected: int = 0 + warnings: int = 0 + errors: int = 0 + rejected_articles: list[dict[str, Any]] = field(default_factory=list) + + +# --------------------------------------------------------------------------- +# Internal helpers +# --------------------------------------------------------------------------- + +def _auto_select_image(article: dict[str, Any]) -> bool: + """Auto-select the primary image from ingestion metadata if not already selected.""" + meta_json = article.get("meta_json") or "{}" + try: + meta = json.loads(meta_json) + except Exception: + return False + + # Already selected? + image_review = meta.get("image_review") or {} + if isinstance(image_review, dict) and image_review.get("selected_url"): + return True + + # Try to get primary from ingestion extraction + extraction = meta.get("extraction") or {} + image_selection = extraction.get("image_selection") or {} + primary = image_selection.get("primary") + + if not primary: + # Fallback: use first URL from image_urls_json + image_urls_json = article.get("image_urls_json") or "[]" + try: + urls = json.loads(image_urls_json) + if urls: + primary = urls[0] + except Exception: + pass + + if primary: + set_article_image_decision(int(article["id"]), primary, "select", actor="pipeline") + return True + return False + + +def _store_relevance(article_id: int, relevance: dict[str, Any]) -> None: + """Persist relevance score and reason in article meta_json and relevance_score column.""" + article = get_article_by_id(article_id) + if not article: + return + try: + meta = json.loads(article.get("meta_json") or "{}") + except Exception: + meta = {} + meta["relevance"] = relevance + new_meta = json.dumps(meta, ensure_ascii=False) + from .db import get_conn + with get_conn() as conn: + conn.execute( + "UPDATE articles SET meta_json = ?, relevance_score = ? WHERE id = ?", + (new_meta, relevance.get("score", 0), article_id), + ) + + +def _do_rewrite_and_draft(article: dict[str, Any]) -> tuple[int, str | None]: + """Rewrite article and create WP draft. Returns (wp_post_id, wp_post_url).""" + article_id = int(article["id"]) + + # Rewrite + rewritten = rewrite_article_text(article) + tags: list[str] = [] + try: + tags = generate_article_tags(article, rewritten_text=rewritten) + except Exception: + pass + merged_meta = merge_generated_tags(article.get("meta_json"), tags) + + # Save rewritten content + approved status + repo_upsert_article( + ArticleUpsert( + feed_id=article.get("feed_id"), + source_article_id=article.get("source_article_id"), + source_hash=article.get("source_hash"), + title=article.get("title", ""), + source_url=article.get("source_url", ""), + canonical_url=article.get("canonical_url"), + published_at=article.get("published_at"), + author=article.get("author"), + summary=article.get("summary"), + content_raw=article.get("content_raw"), + content_rewritten=rewritten, + image_urls_json=article.get("image_urls_json"), + press_contact=article.get("press_contact"), + source_name_snapshot=article.get("source_name_snapshot"), + source_terms_url_snapshot=article.get("source_terms_url_snapshot"), + source_license_name_snapshot=article.get("source_license_name_snapshot"), + legal_checked=bool(int(article.get("legal_checked", 0))), + legal_checked_at=article.get("legal_checked_at"), + legal_note=article.get("legal_note"), + wp_post_id=article.get("wp_post_id"), + wp_post_url=article.get("wp_post_url"), + publish_attempts=int(article.get("publish_attempts", 0)), + publish_last_error=article.get("publish_last_error"), + published_to_wp_at=article.get("published_to_wp_at"), + word_count=len(rewritten.split()), + status="approved", + meta_json=merged_meta, + ) + ) + + # Reload after save to get updated meta_json + fresh = get_article_by_id(article_id) + if not fresh: + raise RuntimeError(f"Artikel #{article_id} nach Rewrite nicht gefunden") + + # Create WP draft + wp_post_id, wp_post_url = publish_article_draft(fresh) + + # Update WP info in DB + from .repositories import mark_article_publish_result + mark_article_publish_result( + article_id, + wp_post_id=wp_post_id, + wp_post_url=wp_post_url, + error=None, + increment_attempts=True, + set_published_status=False, + ) + + return wp_post_id, wp_post_url + + +# --------------------------------------------------------------------------- +# Public pipeline functions +# --------------------------------------------------------------------------- + +def run_auto_pipeline(trigger: str = "auto") -> dict[str, Any]: + """Run the full automated pipeline and return stats dict.""" + from . import telegram_bot as tg + + settings = get_settings() + stats = PipelineStats() + + tg.notify_pipeline_started(trigger) + + # Step 1: Ingestion + try: + ingest_result = run_ingestion() + stats.ingested = ingest_result.articles_upserted + except Exception as exc: + tg.notify_error(f"Ingestion fehlgeschlagen: {exc}") + logger.error("Ingestion error: %s", exc) + stats.errors += 1 + + # Step 2: Process new articles + new_articles = list_articles(limit=100, status_filter="new") + + for article in new_articles: + article_id = int(article["id"]) + try: + _process_article(article, stats, settings) + except Exception as exc: + logger.error("Fehler bei Artikel #%d: %s", article_id, exc) + tg.notify_error(f"Fehler bei Artikel #{article_id} ({article.get('title','?')[:50]}): {exc}") + stats.errors += 1 + # Rate limiting between OpenAI calls + time.sleep(1) + + # Step 3: Send rejected summary if any + if stats.rejected_articles: + try: + tg.notify_rejected_summary(stats.rejected_articles) + except Exception as exc: + logger.warning("Telegram rejected summary fehlgeschlagen: %s", exc) + + # Step 4: Summary + result = { + "ingested": stats.ingested, + "processed": stats.processed, + "drafts_created": stats.drafts_created, + "rejected": stats.rejected, + "warnings": stats.warnings, + "errors": stats.errors, + } + tg.notify_pipeline_done(result) + return result + + +def _process_article(article: dict[str, Any], stats: PipelineStats, settings: Any) -> None: + """Process a single new article through the pipeline.""" + from . import telegram_bot as tg + + article_id = int(article["id"]) + + # Auto-select image + _auto_select_image(article) + + # Score relevance + try: + relevance = score_article_relevance(article) + except Exception as exc: + logger.warning("Relevanz-Scoring für #%d fehlgeschlagen: %s", article_id, exc) + relevance = {"score": 0, "reason": f"Scoring-Fehler: {exc}", "topics": []} + + score = relevance.get("score", 0) + reason = relevance.get("reason", "") + _store_relevance(article_id, relevance) + + stats.processed += 1 + + if score < settings.pipeline_relevance_warn: + # Reject + update_article_status( + article_id, + "error", + actor="pipeline", + note=f"Abgelehnt: Score {score}/100 — {reason}", + ) + stats.rejected += 1 + # Reload for summary (now has relevance in meta) + updated = get_article_by_id(article_id) + if updated: + stats.rejected_articles.append(updated) + + elif score < settings.pipeline_relevance_auto: + # Warning zone: inform user, don't auto-process + stats.warnings += 1 + try: + tg.notify_relevance_warning(article, score, reason) + except Exception as exc: + logger.warning("Telegram warning für #%d fehlgeschlagen: %s", article_id, exc) + + else: + # Auto-process: rewrite + WP draft + try: + # Reload article to get updated image_review + fresh = get_article_by_id(article_id) + if not fresh: + return + wp_post_id, wp_post_url = _do_rewrite_and_draft(fresh) + stats.drafts_created += 1 + + # Reserve publish slot + slot = reserve_publish_slot(article_id) + + # Reload for notification + final = get_article_by_id(article_id) + if final: + try: + tg.notify_new_draft(final, score=score, suggested_publish_at=slot) + except Exception as exc: + logger.warning("Telegram draft-Benachrichtigung für #%d fehlgeschlagen: %s", article_id, exc) + + except Exception as exc: + logger.error("Draft-Erstellung für #%d fehlgeschlagen: %s", article_id, exc) + update_article_status(article_id, "error", actor="pipeline", note=f"Draft-Fehler: {exc}") + raise + + +# --------------------------------------------------------------------------- +# Callback actions (called from telegram_bot._handle_callback) +# --------------------------------------------------------------------------- + +def rewrite_and_update_draft(article_id: int) -> None: + """Rewrite article and update the existing WP draft.""" + article = get_article_by_id(article_id) + if not article: + raise RuntimeError(f"Artikel #{article_id} nicht gefunden") + _auto_select_image(article) + fresh = get_article_by_id(article_id) + _do_rewrite_and_draft(fresh) + + +def discard_article(article_id: int) -> None: + """Discard a draft: delete WP post if exists, set article to error.""" + article = get_article_by_id(article_id) + if not article: + return + + wp_post_id = article.get("wp_post_id") + if wp_post_id: + try: + from .wordpress import delete_wp_post + delete_wp_post(int(wp_post_id)) + except Exception as exc: + logger.warning("WP Post #%d konnte nicht gelöscht werden: %s", wp_post_id, exc) + + update_article_status(article_id, "error", actor="telegram", note="Via Telegram verworfen") + + +def override_rejected_article(article_id: int) -> None: + """Force-process a previously rejected article.""" + from . import telegram_bot as tg + + article = get_article_by_id(article_id) + if not article: + raise RuntimeError(f"Artikel #{article_id} nicht gefunden") + + # Reset to new so processing is allowed + update_article_status(article_id, "new", actor="telegram", note="Manuell übernommen via Telegram") + + # Reload + fresh = get_article_by_id(article_id) + if not fresh: + return + + _auto_select_image(fresh) + fresh = get_article_by_id(article_id) + + # Get existing score or re-score + try: + meta = json.loads(fresh.get("meta_json") or "{}") + score = int((meta.get("relevance") or {}).get("score", 0)) + except Exception: + score = 0 + + wp_post_id, wp_post_url = _do_rewrite_and_draft(fresh) + slot = reserve_publish_slot(article_id) + + final = get_article_by_id(article_id) + if final: + tg.notify_new_draft(final, score=score, suggested_publish_at=slot) + + +# --------------------------------------------------------------------------- +# Status helpers (used by /status command) +# --------------------------------------------------------------------------- + +def get_recently_rejected(days: int = 3) -> list[dict[str, Any]]: + """Return articles rejected in the last N days.""" + from .db import get_conn + from .db import rows_to_dicts + cutoff = datetime.now(timezone.utc).isoformat()[:10] + with get_conn() as conn: + rows = conn.execute( + """ + SELECT id, title, meta_json, source_url, created_at + FROM articles + WHERE status = 'error' + AND json_extract(meta_json, '$.relevance.score') IS NOT NULL + AND date(updated_at) >= date('now', ?) + ORDER BY updated_at DESC + LIMIT 20 + """, + (f"-{days} days",), + ).fetchall() + return rows_to_dicts(rows) + + +def get_pipeline_status_text() -> str: + """Return a text summary of current pipeline state.""" + from .repositories import list_articles as _list + new_count = len(_list(limit=500, status_filter="new")) + approved_count = len(_list(limit=500, status_filter="approved")) + published_count = len(_list(limit=500, status_filter="published")) + error_count = len(_list(limit=500, status_filter="error")) + + return ( + f"📊 Pipeline-Status\n" + f"🆕 Neu / wartend: {new_count}\n" + f"✅ Draft / freigegeben: {approved_count}\n" + f"📢 Veröffentlicht: {published_count}\n" + f"🚫 Fehler / abgelehnt: {error_count}" + ) diff --git a/backend/app/rewrite.py b/backend/app/rewrite.py index 759fac9..6c1d37b 100644 --- a/backend/app/rewrite.py +++ b/backend/app/rewrite.py @@ -146,6 +146,47 @@ def generate_article_tags(article: dict[str, Any], rewritten_text: str | None = return [] +def score_article_relevance(article: dict[Any, Any]) -> dict[str, Any]: + """Score article relevance for VanLife/Camping/Outdoor blog (0-100). + + Returns {"score": int, "reason": str, "topics": list[str]}. + Raises RuntimeError on OpenAI failure. + """ + title = (article.get("title") or "").strip() + text = _sanitize_source_text(article.get("content_raw") or "") + if not text: + text = (article.get("summary") or "").strip() + + prompt = ( + "Bewerte die Relevanz des folgenden Artikels für einen deutschen VanLife-, Camping- und Outdoor-Blog. " + "Relevante Themen: Campingplätze, Stellplätze, Wohnmobil, Camper, Van, Roadtrip, " + "Outdoor-Ausrüstung, Wandern, Naturreisen, Reise-Tipps für Campende. " + "Nicht relevant: allgemeine Nachrichten, Politik, Wirtschaft, Sport (außer Outdoor), Unterhaltung.\n\n" + "Antworte NUR mit einem JSON-Objekt:\n" + '{"score": <0-100>, "reason": "", "topics": ["", ""]}\n\n' + f"Titel: {title}\n\n" + f"Text (Auszug):\n{text[:2000]}" + ) + raw = _openai_chat( + "Du bist ein Redakteur für einen VanLife- und Camping-Blog und bewertest Artikelrelevanz.", + prompt, + temperature=0.1, + ) + try: + match = re.search(r"\{[\s\S]*\}", raw) + if match: + parsed = json.loads(match.group(0)) + score = max(0, min(100, int(parsed.get("score", 0)))) + return { + "score": score, + "reason": str(parsed.get("reason", "")), + "topics": [str(t) for t in (parsed.get("topics") or [])], + } + except Exception: + pass + return {"score": 0, "reason": "Parsing-Fehler bei Relevanz-Score", "topics": []} + + def merge_generated_tags(meta_json: str | None, tags: list[str]) -> str: meta: dict[str, Any] = {} if meta_json: diff --git a/backend/app/scheduler.py b/backend/app/scheduler.py new file mode 100644 index 0000000..d4c6aaf --- /dev/null +++ b/backend/app/scheduler.py @@ -0,0 +1,139 @@ +"""Smart publishing scheduler. + +Calculates suggested publish slots for new WordPress drafts. +Rules: +- Maximum N drafts per day (configurable, default 2) +- Prefer slots spread across the week for steady traffic +- Preferred hours: configurable (default 09:00 and 14:00 CET) +""" +from __future__ import annotations + +from datetime import date, datetime, timedelta, timezone +from typing import Any + +from .config import get_settings +from .db import get_conn + + +# CET offset (UTC+1 winter / UTC+2 summer – we use a fixed +1 for simplicity) +_CET_OFFSET = timedelta(hours=1) + + +def _today_cet() -> date: + return (datetime.now(timezone.utc) + _CET_OFFSET).date() + + +def _preferred_hours() -> list[int]: + settings = get_settings() + try: + return [int(h.strip()) for h in settings.pipeline_publish_hours.split(",") if h.strip()] + except Exception: + return [9, 14] + + +def _count_scheduled_on_day(target_date: date) -> int: + """Count articles already scheduled for publication on a given date.""" + date_str = target_date.isoformat() + with get_conn() as conn: + row = conn.execute( + """ + SELECT COUNT(*) AS cnt + FROM articles + WHERE scheduled_publish_at >= ? AND scheduled_publish_at < ? + AND status NOT IN ('error') + """, + (date_str + "T00:00:00", date_str + "T23:59:59"), + ).fetchone() + return int(row["cnt"]) if row else 0 + + +def _next_free_hour(target_date: date) -> int | None: + """Return first preferred hour that is not yet used on target_date, or None if day is full.""" + settings = get_settings() + max_per_day = settings.pipeline_max_drafts_per_day + hours = _preferred_hours() + + date_str = target_date.isoformat() + with get_conn() as conn: + rows = conn.execute( + """ + SELECT scheduled_publish_at FROM articles + WHERE scheduled_publish_at >= ? AND scheduled_publish_at < ? + AND status NOT IN ('error') + """, + (date_str + "T00:00:00", date_str + "T23:59:59"), + ).fetchall() + + used_hours: set[int] = set() + for row in rows: + ts = row["scheduled_publish_at"] or "" + try: + used_hours.add(datetime.fromisoformat(ts).hour) + except Exception: + pass + + for h in hours: + if h not in used_hours: + return h + return None # day is full + + +def suggest_publish_slot(lookahead_days: int = 14) -> str: + """Return a suggested publish datetime string (ISO, CET) for the next free slot. + + Format: 'Mo, 24.03.2026 um 09:00 Uhr' + Also updates DB so consecutive calls return different slots. + """ + today = _today_cet() + weekday_names = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"] + + for offset in range(1, lookahead_days + 1): + candidate = today + timedelta(days=offset) + hour = _next_free_hour(candidate) + if hour is not None: + wd = weekday_names[candidate.weekday()] + return f"{wd}, {candidate.strftime('%d.%m.%Y')} um {hour:02d}:00 Uhr" + + # Fallback: just tomorrow morning + tomorrow = today + timedelta(days=1) + hours = _preferred_hours() + h = hours[0] if hours else 9 + wd = weekday_names[tomorrow.weekday()] + return f"{wd}, {tomorrow.strftime('%d.%m.%Y')} um {h:02d}:00 Uhr" + + +def reserve_publish_slot(article_id: int) -> str: + """Reserve a publish slot for an article and persist it in the DB. + + Returns the suggested publish datetime string. + """ + today = _today_cet() + lookahead_days = 14 + weekday_names = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"] + + for offset in range(1, lookahead_days + 1): + candidate = today + timedelta(days=offset) + hour = _next_free_hour(candidate) + if hour is not None: + # Reserve this slot by writing to the article + iso_ts = f"{candidate.isoformat()}T{hour:02d}:00:00" + with get_conn() as conn: + conn.execute( + "UPDATE articles SET scheduled_publish_at = ? WHERE id = ?", + (iso_ts, article_id), + ) + wd = weekday_names[candidate.weekday()] + return f"{wd}, {candidate.strftime('%d.%m.%Y')} um {hour:02d}:00 Uhr" + + # Fallback + tomorrow = today + timedelta(days=1) + hours = _preferred_hours() + h = hours[0] if hours else 9 + iso_ts = f"{tomorrow.isoformat()}T{h:02d}:00:00" + with get_conn() as conn: + conn.execute( + "UPDATE articles SET scheduled_publish_at = ? WHERE id = ?", + (iso_ts, article_id), + ) + wd = weekday_names[tomorrow.weekday()] + return f"{wd}, {tomorrow.strftime('%d.%m.%Y')} um {h:02d}:00 Uhr" diff --git a/backend/app/telegram_bot.py b/backend/app/telegram_bot.py new file mode 100644 index 0000000..6d88105 --- /dev/null +++ b/backend/app/telegram_bot.py @@ -0,0 +1,438 @@ +"""Telegram Bot integration for RSS-News pipeline notifications and controls.""" +from __future__ import annotations + +import json +import logging +from typing import Any +from urllib.error import URLError +from urllib.parse import urlencode +from urllib.request import Request, urlopen + +from .config import get_settings + +logger = logging.getLogger(__name__) + +_BASE = "https://api.telegram.org/bot{token}/{method}" + + +# --------------------------------------------------------------------------- +# Low-level API helpers +# --------------------------------------------------------------------------- + +def _call(method: str, payload: dict[str, Any]) -> dict[str, Any]: + settings = get_settings() + token = settings.telegram_bot_token + if not token: + raise RuntimeError("TELEGRAM_BOT_TOKEN nicht konfiguriert") + url = _BASE.format(token=token, method=method) + data = json.dumps(payload).encode("utf-8") + req = Request( + url=url, + data=data, + method="POST", + headers={"Content-Type": "application/json", "Accept": "application/json"}, + ) + try: + with urlopen(req, timeout=15) as resp: + raw = resp.read().decode("utf-8", errors="replace") + return json.loads(raw) + except URLError as exc: + logger.error("Telegram API Fehler (%s): %s", method, exc) + raise RuntimeError(f"Telegram API Fehler: {exc}") from exc + + +def _chat_id() -> str: + settings = get_settings() + cid = settings.telegram_chat_id + if not cid: + raise RuntimeError("TELEGRAM_CHAT_ID nicht konfiguriert") + return cid + + +def _inline_keyboard(buttons: list[list[dict[str, str]]]) -> dict: + return {"inline_keyboard": buttons} + + +# --------------------------------------------------------------------------- +# Public send functions +# --------------------------------------------------------------------------- + +def send_message(text: str, reply_markup: dict | None = None, parse_mode: str = "HTML") -> dict: + payload: dict[str, Any] = { + "chat_id": _chat_id(), + "text": text, + "parse_mode": parse_mode, + "disable_web_page_preview": False, + } + if reply_markup: + payload["reply_markup"] = reply_markup + return _call("sendMessage", payload) + + +def send_photo_message( + photo_url: str, + caption: str, + reply_markup: dict | None = None, + parse_mode: str = "HTML", +) -> dict: + payload: dict[str, Any] = { + "chat_id": _chat_id(), + "photo": photo_url, + "caption": caption, + "parse_mode": parse_mode, + } + if reply_markup: + payload["reply_markup"] = reply_markup + try: + return _call("sendPhoto", payload) + except Exception: + # Fall back to text message if photo fails (e.g. image URL no longer valid) + return send_message(caption, reply_markup=reply_markup, parse_mode=parse_mode) + + +def answer_callback_query(callback_query_id: str, text: str = "") -> None: + try: + _call("answerCallbackQuery", {"callback_query_id": callback_query_id, "text": text}) + except Exception as exc: + logger.warning("answerCallbackQuery fehlgeschlagen: %s", exc) + + +def edit_message_reply_markup(chat_id: str, message_id: int, reply_markup: dict | None = None) -> None: + payload: dict[str, Any] = {"chat_id": chat_id, "message_id": message_id} + if reply_markup: + payload["reply_markup"] = reply_markup + else: + payload["reply_markup"] = {"inline_keyboard": []} + try: + _call("editMessageReplyMarkup", payload) + except Exception as exc: + logger.warning("editMessageReplyMarkup fehlgeschlagen: %s", exc) + + +def setup_webhook(webhook_url: str) -> dict: + settings = get_settings() + payload: dict[str, Any] = {"url": webhook_url, "allowed_updates": ["message", "callback_query"]} + if settings.telegram_webhook_secret: + payload["secret_token"] = settings.telegram_webhook_secret + return _call("setWebhook", payload) + + +def delete_webhook() -> dict: + return _call("deleteWebhook", {}) + + +# --------------------------------------------------------------------------- +# Notification helpers +# --------------------------------------------------------------------------- + +def _format_tags(meta_json: str | None) -> str: + if not meta_json: + return "" + try: + meta = json.loads(meta_json) + tags = meta.get("generated_tags") or [] + if tags: + return " ".join(f"#{t.replace(' ', '_')}" for t in tags[:6]) + except Exception: + pass + return "" + + +def _score_emoji(score: int) -> str: + if score >= 85: + return "🟢" + if score >= 70: + return "🟡" + return "🔴" + + +def notify_new_draft( + article: dict[str, Any], + score: int, + suggested_publish_at: str | None = None, +) -> None: + """Send Telegram notification for a newly created WP draft.""" + title = (article.get("title") or "Ohne Titel").strip() + wp_url = article.get("wp_post_url") or "" + tags_str = _format_tags(article.get("meta_json")) + art_id = article.get("id") + + score_line = f"{_score_emoji(score)} Relevanz-Score: {score}/100" + publish_line = f"📅 Vorgeschlagene Veröffentlichung: {suggested_publish_at}" if suggested_publish_at else "" + link_line = f'🔗 Draft in WordPress öffnen' if wp_url else "" + tags_line = f"🏷 {tags_str}" if tags_str else "" + + text_parts = [ + f"✅ Neuer Draft erstellt", + f"📰 {title}", + score_line, + ] + if publish_line: + text_parts.append(publish_line) + if tags_line: + text_parts.append(tags_line) + if link_line: + text_parts.append(link_line) + + text = "\n".join(text_parts) + + keyboard = _inline_keyboard([ + [ + {"text": "✏️ Neu schreiben", "callback_data": f"rewrite:{art_id}"}, + {"text": "❌ Verwerfen", "callback_data": f"discard:{art_id}"}, + ] + ]) + + # Try with image first + meta = {} + try: + meta = json.loads(article.get("meta_json") or "{}") + except Exception: + pass + image_url = None + image_review = meta.get("image_review") or {} + if isinstance(image_review, dict): + image_url = image_review.get("selected_url") + if not image_url: + image_sel = (meta.get("extraction") or {}).get("image_selection") or {} + image_url = image_sel.get("primary") + + if image_url: + send_photo_message(image_url, caption=text, reply_markup=keyboard) + else: + send_message(text, reply_markup=keyboard) + + +def notify_relevance_warning(article: dict[str, Any], score: int, reason: str) -> None: + """Send Telegram warning for borderline articles (score between warn and auto thresholds).""" + title = (article.get("title") or "Ohne Titel").strip() + art_id = article.get("id") + source_url = article.get("source_url") or "" + + text = ( + f"⚠️ Artikel mit niedrigem Relevanz-Score\n" + f"📰 {title}\n" + f"{_score_emoji(score)} Score: {score}/100\n" + f"💬 {reason}\n" + f'🔗 Originalartikel' + ) + keyboard = _inline_keyboard([ + [ + {"text": "➕ Trotzdem verarbeiten", "callback_data": f"override:{art_id}"}, + {"text": "❌ Ablehnen", "callback_data": f"reject:{art_id}"}, + ] + ]) + send_message(text, reply_markup=keyboard) + + +def notify_rejected_summary(articles: list[dict[str, Any]]) -> None: + """Send summary of rejected articles for this pipeline run.""" + if not articles: + return + lines = [f"🚫 {len(articles)} Artikel abgelehnt (Score < {get_settings().pipeline_relevance_warn})\n"] + for art in articles[:10]: + title = (art.get("title") or "Ohne Titel")[:60] + score = _get_relevance_score(art) + reason = _get_rejection_reason(art) + art_id = art.get("id") + lines.append(f"• {title} (Score: {score}) — {reason}") + if len(articles) > 10: + lines.append(f"... und {len(articles) - 10} weitere") + + text = "\n".join(lines) + # Build override buttons for first 5 + rows = [] + for art in articles[:5]: + art_id = art.get("id") + title = (art.get("title") or "")[:25] + rows.append([{"text": f"➕ {title}…", "callback_data": f"override:{art_id}"}]) + + keyboard = _inline_keyboard(rows) if rows else None + send_message(text, reply_markup=keyboard) + + +def notify_error(message: str) -> None: + """Send error alert to Telegram.""" + try: + send_message(f"🔴 Fehler im RSS-Pipeline\n{message}") + except Exception as exc: + logger.error("Telegram Fehler-Benachrichtigung fehlgeschlagen: %s", exc) + + +def notify_pipeline_started(trigger: str = "auto") -> None: + icon = "🤖" if trigger == "auto" else "👤" + try: + send_message(f"{icon} Pipeline gestartet (Auslöser: {trigger})") + except Exception: + pass + + +def notify_pipeline_done(stats: dict[str, Any]) -> None: + ingested = stats.get("ingested", 0) + processed = stats.get("processed", 0) + drafts = stats.get("drafts_created", 0) + rejected = stats.get("rejected", 0) + warnings = stats.get("warnings", 0) + errors = stats.get("errors", 0) + + lines = [ + "📊 Pipeline abgeschlossen", + f"📥 Neue Artikel importiert: {ingested}", + f"⚙️ Verarbeitet: {processed}", + f"📝 Drafts erstellt: {drafts}", + ] + if rejected: + lines.append(f"🚫 Abgelehnt: {rejected}") + if warnings: + lines.append(f"⚠️ Warnungen: {warnings}") + if errors: + lines.append(f"🔴 Fehler: {errors}") + + try: + send_message("\n".join(lines)) + except Exception: + pass + + +# --------------------------------------------------------------------------- +# Helper to read relevance info from meta_json +# --------------------------------------------------------------------------- + +def _get_relevance_score(article: dict[str, Any]) -> int: + try: + meta = json.loads(article.get("meta_json") or "{}") + return int(meta.get("relevance", {}).get("score", 0)) + except Exception: + return 0 + + +def _get_rejection_reason(article: dict[str, Any]) -> str: + try: + meta = json.loads(article.get("meta_json") or "{}") + return str(meta.get("relevance", {}).get("reason", ""))[:80] + except Exception: + return "" + + +# --------------------------------------------------------------------------- +# Incoming update handler (called by webhook endpoint) +# --------------------------------------------------------------------------- + +def handle_update(update: dict[str, Any]) -> None: + """Process an incoming Telegram update.""" + # Import here to avoid circular imports + from . import pipeline as _pipeline + + if "callback_query" in update: + _handle_callback(update["callback_query"]) + elif "message" in update: + _handle_message(update["message"]) + + +def _handle_message(message: dict[str, Any]) -> None: + from . import pipeline as _pipeline + + text = (message.get("text") or "").strip() + if not text.startswith("/"): + return + + cmd = text.split()[0].lower().lstrip("/") + if "@" in cmd: + cmd = cmd.split("@")[0] + + if cmd == "run": + send_message("🤖 Pipeline wird manuell gestartet …") + try: + stats = _pipeline.run_auto_pipeline(trigger="manual") + notify_pipeline_done(stats) + except Exception as exc: + notify_error(f"/run fehlgeschlagen: {exc}") + + elif cmd == "rejected": + try: + articles = _pipeline.get_recently_rejected(days=3) + if not articles: + send_message("✅ Keine abgelehnten Artikel in den letzten 3 Tagen.") + else: + notify_rejected_summary(articles) + except Exception as exc: + notify_error(f"/rejected fehlgeschlagen: {exc}") + + elif cmd == "status": + try: + status_text = _pipeline.get_pipeline_status_text() + send_message(status_text) + except Exception as exc: + notify_error(f"/status fehlgeschlagen: {exc}") + + elif cmd == "help": + send_message( + "📋 Verfügbare Befehle\n" + "/run — Pipeline manuell starten\n" + "/rejected — Abgelehnte Artikel der letzten 3 Tage\n" + "/status — Pipeline-Status\n" + "/help — Diese Hilfe" + ) + + +def _handle_callback(callback_query: dict[str, Any]) -> None: + from . import pipeline as _pipeline + from .repositories import get_article_by_id, update_article_status + + query_id = callback_query.get("id", "") + data = (callback_query.get("data") or "").strip() + chat_id = str(callback_query.get("message", {}).get("chat", {}).get("id", "")) + message_id = int(callback_query.get("message", {}).get("message_id", 0)) + + if ":" not in data: + answer_callback_query(query_id, "Ungültige Aktion") + return + + action, _, raw_id = data.partition(":") + try: + article_id = int(raw_id) + except ValueError: + answer_callback_query(query_id, "Ungültige Artikel-ID") + return + + article = get_article_by_id(article_id) + if not article: + answer_callback_query(query_id, "Artikel nicht gefunden") + return + + if action == "rewrite": + answer_callback_query(query_id, "✏️ Artikel wird neu geschrieben …") + edit_message_reply_markup(chat_id, message_id) + try: + _pipeline.rewrite_and_update_draft(article_id) + updated = get_article_by_id(article_id) + if updated: + from .scheduler import suggest_publish_slot + slot = suggest_publish_slot() + notify_new_draft(updated, score=_get_relevance_score(updated), suggested_publish_at=slot) + except Exception as exc: + notify_error(f"Rewrite #{article_id} fehlgeschlagen: {exc}") + + elif action == "discard": + answer_callback_query(query_id, "❌ Artikel verworfen") + edit_message_reply_markup(chat_id, message_id) + try: + _pipeline.discard_article(article_id) + except Exception as exc: + notify_error(f"Verwerfen #{article_id} fehlgeschlagen: {exc}") + + elif action == "override": + answer_callback_query(query_id, "➕ Artikel wird verarbeitet …") + edit_message_reply_markup(chat_id, message_id) + try: + _pipeline.override_rejected_article(article_id) + except Exception as exc: + notify_error(f"Override #{article_id} fehlgeschlagen: {exc}") + + elif action == "reject": + answer_callback_query(query_id, "🚫 Abgelehnt") + edit_message_reply_markup(chat_id, message_id) + update_article_status(article_id, "error", actor="telegram", note="Manuell abgelehnt via Telegram") + + else: + answer_callback_query(query_id, "Unbekannte Aktion") diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index 150bcd1..704d428 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -373,3 +373,18 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: def selected_image_exists(article: dict[str, Any]) -> bool: return _selected_image_url_from_meta(article.get("meta_json")) is not None + + +def delete_wp_post(wp_post_id: int) -> None: + """Permanently delete a WordPress post (moves to trash, then deletes).""" + settings = get_settings() + if not settings.wordpress_base_url or not settings.wordpress_username or not settings.wordpress_app_password: + raise RuntimeError("WordPress Konfiguration fehlt") + auth = _auth_header(settings.wordpress_username, settings.wordpress_app_password) + # force=true skips trash + _wp_request( + base_url=settings.wordpress_base_url, + auth_header=auth, + method="DELETE", + endpoint=f"posts/{wp_post_id}?force=true", + ) diff --git a/docs/AUTOMATION.md b/docs/AUTOMATION.md new file mode 100644 index 0000000..8008857 --- /dev/null +++ b/docs/AUTOMATION.md @@ -0,0 +1,190 @@ +# Automatischer Pipeline-Betrieb + +## Überblick + +Das System läuft vollautomatisch und benötigt nur noch gelegentliche Telegram-Interaktion. + +``` +N8N (2× täglich, 08:00 + 16:00 Uhr) + └─► POST /api/n8n/pipeline (X-API-Key Header) + ├── RSS Ingestion (alle aktivierten Feeds) + ├── Relevanz-Score per GPT (0–100) + │ ├── Score ≥ 80 → Rewrite + WP-Draft + Telegram + │ ├── Score 60–79 → Telegram-Warnung + manueller Override möglich + │ └── Score < 60 → Abgelehnt + tägliche Telegram-Liste + └── Pipeline-Zusammenfassung via Telegram +``` + +--- + +## Einrichtung + +### 1. Umgebungsvariablen setzen + +Kopiere `backend/.env.example` nach `backend/.env` und fülle alle Felder aus: + +```bash +cp backend/.env.example backend/.env +nano backend/.env +``` + +Wichtige Variablen: + +| Variable | Beschreibung | +|----------|-------------| +| `TELEGRAM_BOT_TOKEN` | Bot-Token von @BotFather | +| `TELEGRAM_CHAT_ID` | Deine persönliche Chat-ID | +| `TELEGRAM_WEBHOOK_SECRET` | Zufälliger String (≥ 20 Zeichen) | +| `N8N_API_KEY` | Starker zufälliger API-Key | +| `OPENAI_API_KEY` | OpenAI API-Key | +| `WP_BASE_URL` | WordPress-URL | +| `WP_USERNAME` | WordPress-Benutzername | +| `WP_PASSWORD` | WordPress App-Passwort | + +### 2. Telegram-Webhook registrieren + +Nach dem Deployment einmalig aufrufen: + +```bash +curl -X POST https://news.vanityontour.de/api/telegram/setup-webhook \ + -H "Cookie: rss_news_session=" +``` + +Oder über die Admin-UI: Settings → Telegram Webhook einrichten. + +### 3. N8N Workflow einrichten + +In N8N einen neuen Workflow erstellen: + +**Trigger:** Cron +- Zeitplan 1: `0 8 * * *` (täglich 08:00) +- Zeitplan 2: `0 16 * * *` (täglich 16:00) + +**Aktion:** HTTP Request +- Method: `POST` +- URL: `https://news.vanityontour.de/api/n8n/pipeline` +- Header: `X-API-Key: ` + +**Fehlerbehandlung:** Bei HTTP-Fehler → E-Mail/Telegram-Alert + +--- + +## Telegram-Befehle + +| Befehl | Funktion | +|--------|----------| +| `/run` | Pipeline manuell starten | +| `/rejected` | Abgelehnte Artikel der letzten 3 Tage anzeigen | +| `/status` | Aktuellen Pipeline-Status | +| `/help` | Alle Befehle anzeigen | + +--- + +## Telegram-Benachrichtigungen + +### Neuer Draft erstellt +Wenn ein Artikel erfolgreich verarbeitet wurde: + +``` +✅ Neuer Draft erstellt +📰 [Artikel-Titel] +🟢 Relevanz-Score: 87/100 +📅 Vorgeschlagene Veröffentlichung: Mo, 24.03.2026 um 09:00 Uhr +🏷 #VanLife #Camping #Wohnmobil +🔗 Draft in WordPress öffnen + + [✏️ Neu schreiben] [❌ Verwerfen] +``` + +### Relevanz-Warnung (Score 60–79) +``` +⚠️ Artikel mit niedrigem Relevanz-Score +📰 [Artikel-Titel] +🟡 Score: 72/100 +💬 Artikel behandelt hauptsächlich... +🔗 Originalartikel + + [➕ Trotzdem verarbeiten] [❌ Ablehnen] +``` + +### Abgelehnte Artikel (Ende jedes Runs) +Liste aller abgelehnten Artikel mit Override-Buttons für jeden einzelnen. + +--- + +## Relevanz-Score + +Der GPT-basierte Score bewertet die Themenrelevanz für den VanLife/Camping-Blog: + +| Score | Aktion | +|-------|--------| +| 80–100 | Automatisch verarbeiten | +| 60–79 | Telegram-Warnung, manueller Override | +| 0–59 | Automatisch abgelehnt | + +Themen die hoch scored werden: Campingplätze, Stellplätze, Wohnmobile, Van-Ausbau, +Outdoor-Equipment, Wandern, Naturreisen, Roadtrips, Camping-Tipps. + +Schwellwerte sind in `.env` konfigurierbar: +``` +PIPELINE_RELEVANCE_AUTO=80 +PIPELINE_RELEVANCE_WARN=60 +``` + +--- + +## Veröffentlichungsplan + +- Maximal **2 Beiträge pro Tag** +- Bevorzugte Zeiten: **09:00 und 14:00 Uhr** (CET) +- Gleichmäßig über die Woche verteilt +- Der Vorschlag erscheint in der Telegram-Nachricht +- Manuell in WordPress setzen oder über WP Scheduling-Plugin automatisieren + +Einstellbar via: +``` +PIPELINE_MAX_DRAFTS_PER_DAY=2 +PIPELINE_PUBLISH_HOURS=9,14 +``` + +--- + +## API-Endpunkte (N8N / extern) + +Alle externen Endpunkte benötigen den Header `X-API-Key: `. + +| Methode | Endpunkt | Funktion | +|---------|----------|----------| +| `POST` | `/api/n8n/pipeline` | Komplette Pipeline starten | +| `POST` | `/api/n8n/ingest` | Nur RSS-Import (ohne Rewrite) | + +--- + +## Deployment (Hetzner via GitHub) + +Das Deployment läuft automatisch über GitHub Actions beim Push auf `main`: + +1. GitHub Action führt Tests aus +2. Bei Erfolg: SSH-Deploy auf Hetzner +3. `pip install -r requirements.txt` +4. Systemd-Dienst `rss-app` neu starten + +Workflow-Dateien: `.github/workflows/test.yml` und `.github/workflows/deploy.yml` + +--- + +## Troubleshooting + +**Pipeline läuft, aber keine Telegram-Nachrichten:** +- `TELEGRAM_BOT_TOKEN` und `TELEGRAM_CHAT_ID` prüfen +- Webhook-Status prüfen: `GET https://api.telegram.org/bot/getWebhookInfo` + +**N8N bekommt 401:** +- `N8N_API_KEY` in `.env` und N8N-Workflow-Header müssen übereinstimmen + +**Alle Artikel werden abgelehnt:** +- `PIPELINE_RELEVANCE_WARN` temporär auf 40 senken zum Testen +- Über `/rejected` + Override-Button manuell testen + +**Artikel werden doppelt importiert:** +- Deduplication läuft über `source_url` (eindeutig). Bereits verarbeitete Artikel werden nie erneut als Draft angelegt. From 0a9c0b10d6a18244cfbf8e129aecd739fb33d12f Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Sat, 21 Mar 2026 09:41:34 +0000 Subject: [PATCH 58/87] test(ingestion): update test for removed Ampel risk-level check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ampel system removed – all enabled feeds are now processed regardless of risk_level. Updated test to verify feeds with any risk_level are processed instead of blocked. Co-Authored-By: Claude Sonnet 4.6 --- backend/tests/test_ingestion.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/backend/tests/test_ingestion.py b/backend/tests/test_ingestion.py index a36b62e..82bd2ca 100644 --- a/backend/tests/test_ingestion.py +++ b/backend/tests/test_ingestion.py @@ -98,11 +98,11 @@ class TestIngestion(unittest.TestCase): @patch("backend.app.ingestion.extract_article") @patch("backend.app.ingestion.feedparser.parse") - def test_ingestion_blocks_non_green_source(self, mock_parse, mock_extract_article) -> None: - # Re-create source/feed with yellow risk to verify enforcement + def test_ingestion_processes_any_enabled_source(self, mock_parse, mock_extract_article) -> None: + # Ampel/risk-level system removed – all enabled feeds are processed regardless of risk_level source_id = create_source( SourceCreate( - name="Blocked Source", + name="Any Risk Source", base_url="https://example.net", terms_url="https://example.net/terms", license_name="custom", @@ -112,20 +112,25 @@ class TestIngestion(unittest.TestCase): last_reviewed_at="2026-02-18T00:00:00Z", ) ) - blocked_feed_id = create_feed( + feed_id = create_feed( FeedCreate( - name="Blocked Feed", + name="Any Risk Feed", url="https://example.net/feed.xml", source_id=source_id, is_enabled=True, ) ) - stats = run_ingestion(feed_id=blocked_feed_id) + mock_parse.return_value = type("FP", (), {"entries": [], "etag": None, "modified": None})() + mock_extract_article.return_value = type("E", (), { + "title": None, "author": None, "summary": None, "content_text": None, + "canonical_url": None, "images": [], "press_contact": None, + })() + + stats = run_ingestion(feed_id=feed_id) self.assertEqual(stats.status, "success") - self.assertEqual(stats.articles_upserted, 0) - mock_parse.assert_not_called() - mock_extract_article.assert_not_called() + # Feed was processed (feedparser was called), even with yellow risk_level + mock_parse.assert_called_once() @patch("backend.app.ingestion.extract_article") @patch("backend.app.ingestion.feedparser.parse") From d9ab5994660dd750187ceae1355ca0f56490537e Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Sat, 21 Mar 2026 09:43:55 +0000 Subject: [PATCH 59/87] fix(deploy): correct service name and app path for Hetzner Service is rss-news-api (not rss-app), app lives at /opt/rss-news. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/deploy.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4ac1c42..af3394f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,12 +21,13 @@ jobs: port: 22 envs: APP_ADMIN_USERNAME,APP_ADMIN_PASSWORD script: | - cd rss-news + cd /opt/rss-news git pull origin main source .venv/bin/activate pip install -r requirements.txt pip install -r backend/requirements.txt || true - sudo systemctl restart rss-app + sudo systemctl restart rss-news-api + sleep 3 BASE_URL="https://news.vanityontour.de" APP_ADMIN_USERNAME="${APP_ADMIN_USERNAME}" APP_ADMIN_PASSWORD="${APP_ADMIN_PASSWORD}" bash scripts/smoke_backend.sh env: APP_ADMIN_USERNAME: ${{ secrets.NEWS_APP_ADMIN_USERNAME }} From 1020526e76d38171e6607da9446093d58d6c0a84 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Sat, 21 Mar 2026 10:03:13 +0000 Subject: [PATCH 60/87] fix(pipeline): run N8N pipeline endpoint async to avoid HTTP timeout Pipeline runs in background via asyncio. Endpoint returns immediately, results arrive via Telegram notifications. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/main.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index 51aab6b..276ffa9 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -638,14 +638,22 @@ def _require_api_key(request: Request) -> None: @app.post("/api/n8n/pipeline") -def api_n8n_pipeline(request: Request) -> dict: - """Trigger the full auto pipeline. Called by N8N (2x/day or on demand).""" +async def api_n8n_pipeline(request: Request) -> dict: + """Trigger the full auto pipeline in background. Returns immediately. + Called by N8N (2x/day or on demand). Results arrive via Telegram.""" _require_api_key(request) - try: - result = run_auto_pipeline(trigger="n8n") - return {"ok": True, "stats": result} - except Exception as exc: - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(exc)) from exc + import asyncio + import logging + + async def _run(): + loop = asyncio.get_event_loop() + try: + await loop.run_in_executor(None, lambda: run_auto_pipeline(trigger="n8n")) + except Exception as exc: + logging.getLogger(__name__).error("Background pipeline error: %s", exc) + + asyncio.create_task(_run()) + return {"ok": True, "message": "Pipeline gestartet – Ergebnisse kommen per Telegram"} @app.post("/api/n8n/ingest") From e9c472b722655b6772428c8cda5a0c8be71b44d3 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Sat, 21 Mar 2026 11:08:32 +0000 Subject: [PATCH 61/87] fix(telegram): async webhook handler + deduplicate callback responses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Webhook returns 200 immediately, processing runs in background task → Telegram no longer retries, eliminates duplicate callbacks and 400 errors - Consolidate answer_callback_query call to top of handler (before heavy work) - Add logger.info/error for callback actions to aid debugging Co-Authored-By: Claude Sonnet 4.6 --- backend/app/main.py | 21 +++++++++++++++------ backend/app/telegram_bot.py | 25 ++++++++++++++++--------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index 276ffa9..e954de6 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -677,7 +677,14 @@ def api_n8n_ingest(request: Request) -> dict: @app.post("/telegram/webhook") async def telegram_webhook(request: Request) -> dict: - """Receive updates from Telegram Bot API.""" + """Receive updates from Telegram Bot API. + + Returns 200 immediately so Telegram never retries the same update. + Actual processing runs in a background task. + """ + import asyncio + import logging + # Verify secret token secret = settings.telegram_webhook_secret if secret: @@ -691,12 +698,14 @@ async def telegram_webhook(request: Request) -> dict: except Exception: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid JSON") - try: - handle_update(update) - except Exception as exc: - import logging - logging.getLogger(__name__).error("Telegram update handler error: %s", exc) + async def _process(): + loop = asyncio.get_event_loop() + try: + await loop.run_in_executor(None, lambda: handle_update(update)) + except Exception as exc: + logging.getLogger(__name__).error("Telegram update handler error: %s", exc) + asyncio.create_task(_process()) return {"ok": True} diff --git a/backend/app/telegram_bot.py b/backend/app/telegram_bot.py index 6d88105..28e0693 100644 --- a/backend/app/telegram_bot.py +++ b/backend/app/telegram_bot.py @@ -400,9 +400,19 @@ def _handle_callback(callback_query: dict[str, Any]) -> None: answer_callback_query(query_id, "Artikel nicht gefunden") return + # Answer Telegram immediately so the spinning indicator stops + action_labels = { + "rewrite": "✏️ Artikel wird neu geschrieben …", + "discard": "❌ Artikel verworfen", + "override": "➕ Artikel wird verarbeitet …", + "reject": "🚫 Abgelehnt", + } + answer_callback_query(query_id, action_labels.get(action, "")) + edit_message_reply_markup(chat_id, message_id) + + logger.info("Callback: action=%s article_id=%s", action, article_id) + if action == "rewrite": - answer_callback_query(query_id, "✏️ Artikel wird neu geschrieben …") - edit_message_reply_markup(chat_id, message_id) try: _pipeline.rewrite_and_update_draft(article_id) updated = get_article_by_id(article_id) @@ -411,28 +421,25 @@ def _handle_callback(callback_query: dict[str, Any]) -> None: slot = suggest_publish_slot() notify_new_draft(updated, score=_get_relevance_score(updated), suggested_publish_at=slot) except Exception as exc: + logger.error("Rewrite #%d fehlgeschlagen: %s", article_id, exc) notify_error(f"Rewrite #{article_id} fehlgeschlagen: {exc}") elif action == "discard": - answer_callback_query(query_id, "❌ Artikel verworfen") - edit_message_reply_markup(chat_id, message_id) try: _pipeline.discard_article(article_id) except Exception as exc: + logger.error("Discard #%d fehlgeschlagen: %s", article_id, exc) notify_error(f"Verwerfen #{article_id} fehlgeschlagen: {exc}") elif action == "override": - answer_callback_query(query_id, "➕ Artikel wird verarbeitet …") - edit_message_reply_markup(chat_id, message_id) try: _pipeline.override_rejected_article(article_id) except Exception as exc: + logger.error("Override #%d fehlgeschlagen: %s", article_id, exc) notify_error(f"Override #{article_id} fehlgeschlagen: {exc}") elif action == "reject": - answer_callback_query(query_id, "🚫 Abgelehnt") - edit_message_reply_markup(chat_id, message_id) update_article_status(article_id, "error", actor="telegram", note="Manuell abgelehnt via Telegram") else: - answer_callback_query(query_id, "Unbekannte Aktion") + logger.warning("Unbekannte Callback-Aktion: %s", action) From 970f509ad48aed05ac849350c17286de861b9e3e Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Sat, 21 Mar 2026 11:15:39 +0000 Subject: [PATCH 62/87] feat(wordpress): store suggested publish date directly in WP draft Reserve the publish slot before creating the WP draft so the scheduled_publish_at timestamp is available when building the post payload. WordPress receives the `date` field (e.g. 2026-03-24T09:00:00) which sets the scheduled publish time on the draft. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/pipeline.py | 13 ++++++++----- backend/app/wordpress.py | 3 +++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index f86ef35..e85f944 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -276,16 +276,16 @@ def _process_article(article: dict[str, Any], stats: PipelineStats, settings: An else: # Auto-process: rewrite + WP draft try: - # Reload article to get updated image_review + # Reserve publish slot FIRST so it's available when WP draft is created + slot = reserve_publish_slot(article_id) + + # Reload article to get updated image_review + scheduled_publish_at fresh = get_article_by_id(article_id) if not fresh: return wp_post_id, wp_post_url = _do_rewrite_and_draft(fresh) stats.drafts_created += 1 - # Reserve publish slot - slot = reserve_publish_slot(article_id) - # Reload for notification final = get_article_by_id(article_id) if final: @@ -357,8 +357,11 @@ def override_rejected_article(article_id: int) -> None: except Exception: score = 0 - wp_post_id, wp_post_url = _do_rewrite_and_draft(fresh) + # Reserve publish slot FIRST so it's in the DB when WP draft is created slot = reserve_publish_slot(article_id) + fresh = get_article_by_id(article_id) + + wp_post_id, wp_post_url = _do_rewrite_and_draft(fresh) final = get_article_by_id(article_id) if final: diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index 704d428..b031e9d 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -335,6 +335,9 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: payload["excerpt"] = excerpt if featured_media_id: payload["featured_media"] = featured_media_id + scheduled_at = article.get("scheduled_publish_at") + if scheduled_at: + payload["date"] = scheduled_at # e.g. "2026-03-24T09:00:00" wp_post_id = article.get("wp_post_id") tag_ids = _resolve_wp_tag_ids( From a64bf31ff63df35232f04ba637ade8e9db3a45ee Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Thu, 26 Mar 2026 06:34:49 +0000 Subject: [PATCH 63/87] fix(telegram): restore webhook to RSS-News backend and forward app-release commands The N8N App Release Telegram Trigger had overwritten the webhook registration, pointing it to N8N instead of the RSS-News backend. This caused all callback_query events (inline buttons) to be lost, breaking the override/rewrite/discard buttons. Changes: - Re-register webhook to https://news.vanityontour.de/telegram/webhook with both message and callback_query in allowed_updates - Add _forward_to_n8n_app_release() to proxy unknown bot commands (e.g. /release) to the N8N App Release webhook, keeping that workflow functional without needing its own Telegram Trigger Co-Authored-By: Claude Sonnet 4.6 --- backend/app/telegram_bot.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/backend/app/telegram_bot.py b/backend/app/telegram_bot.py index 28e0693..bebda41 100644 --- a/backend/app/telegram_bot.py +++ b/backend/app/telegram_bot.py @@ -13,6 +13,7 @@ from .config import get_settings logger = logging.getLogger(__name__) _BASE = "https://api.telegram.org/bot{token}/{method}" +_N8N_APP_RELEASE_WEBHOOK = "https://n8n.vanityontour.de/webhook/tg-app-release-bot-v1/webhook" # --------------------------------------------------------------------------- @@ -121,6 +122,22 @@ def delete_webhook() -> dict: return _call("deleteWebhook", {}) +def _forward_to_n8n_app_release(update: dict[str, Any]) -> None: + """Forward a Telegram update to the N8N App Release webhook.""" + try: + data = json.dumps(update).encode("utf-8") + req = Request( + url=_N8N_APP_RELEASE_WEBHOOK, + data=data, + method="POST", + headers={"Content-Type": "application/json"}, + ) + with urlopen(req, timeout=5) as _: + pass + except Exception as exc: + logger.debug("N8N App-Release-Forward fehlgeschlagen: %s", exc) + + # --------------------------------------------------------------------------- # Notification helpers # --------------------------------------------------------------------------- @@ -374,6 +391,10 @@ def _handle_message(message: dict[str, Any]) -> None: "/help — Diese Hilfe" ) + else: + # Unbekannter Befehl → an N8N App-Release-Workflow weiterleiten + _forward_to_n8n_app_release({"message": message}) + def _handle_callback(callback_query: dict[str, Any]) -> None: from . import pipeline as _pipeline From 013af2ab62b9a6297fa98f7c43d7d0c2263cc3e9 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Thu, 26 Mar 2026 07:22:47 +0000 Subject: [PATCH 64/87] fix(pipeline): set warning-zone articles to review status to prevent re-warnings Articles scoring between warn and auto threshold stayed in "new" status, causing repeated warning notifications on every /run call. Now they are set to "review" status after the first warning is sent. The override callback already resets status to "new" before processing, so the existing flow works correctly. Also include "review" articles in /rejected command output so they can be acted on. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/pipeline.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index e85f944..6753491 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -266,7 +266,13 @@ def _process_article(article: dict[str, Any], stats: PipelineStats, settings: An stats.rejected_articles.append(updated) elif score < settings.pipeline_relevance_auto: - # Warning zone: inform user, don't auto-process + # Warning zone: set status to "review" so repeated /run calls don't re-warn + update_article_status( + article_id, + "review", + actor="pipeline", + note=f"Niedrige Relevanz: Score {score}/100 — {reason}", + ) stats.warnings += 1 try: tg.notify_relevance_warning(article, score, reason) @@ -382,7 +388,7 @@ def get_recently_rejected(days: int = 3) -> list[dict[str, Any]]: """ SELECT id, title, meta_json, source_url, created_at FROM articles - WHERE status = 'error' + WHERE status IN ('error', 'review') AND json_extract(meta_json, '$.relevance.score') IS NOT NULL AND date(updated_at) >= date('now', ?) ORDER BY updated_at DESC From 12932bca9078aa9244d3e75ed3adece7537c56e0 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Thu, 26 Mar 2026 07:36:09 +0000 Subject: [PATCH 65/87] fix(rewrite): attribute claims to source instead of using first-person 'wir' Rewrites must not use 'wir haben erforscht/berechnet' since the content comes from a third-party source. The prompt now passes the source name and instructs GPT to attribute all claims to the original publisher (e.g. 'laut PiNCAMP', 'die Auswertung zeigt'). Co-Authored-By: Claude Sonnet 4.6 --- backend/app/rewrite.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/app/rewrite.py b/backend/app/rewrite.py index 6c1d37b..05937e5 100644 --- a/backend/app/rewrite.py +++ b/backend/app/rewrite.py @@ -94,12 +94,16 @@ def rewrite_article_text(article: dict[str, Any]) -> str: raise RuntimeError("Kein Quelltext für Rewrite verfügbar") title = (article.get("title") or "").strip() + source_name = (article.get("source_name_snapshot") or article.get("author") or "die Quelle").strip() prompt = ( "Schreibe den folgenden News-Text neu auf Deutsch in persönlicher Du-Form. " "Stil: ausführlich, gut lesbar, ohne Einleitung mit Datum/Uhrzeit/Firma/Ort, " "ohne Pressekontakt, ohne Quellenblock. " "Nutze klare Absätze und Zwischenüberschriften in HTML (

        ,

        ,

        • falls passend). " - "Inhaltlich korrekt bleiben, nichts erfinden.\n\n" + "Inhaltlich korrekt bleiben, nichts erfinden. " + f"Wichtig: Der Artikel wurde von '{source_name}' veröffentlicht. " + "Verwende NIEMALS 'wir' oder 'ich' aus Sicht der Quelle – beziehe Aussagen stets auf die Quelle, " + f"z.B. 'laut {source_name}', '{source_name} hat ermittelt', 'die Auswertung zeigt'.\n\n" f"Titel: {title}\n\n" f"Originaltext:\n{source_text}" ) From 1963e32ab48cf9ea2d9535869b3b433fd32e965f Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Thu, 26 Mar 2026 07:45:55 +0000 Subject: [PATCH 66/87] fix(rewrite): make image upload non-fatal and add rewrite tracing logs - wordpress.py: catch image download/upload failures and skip image instead of aborting the entire WP draft update - pipeline.py: add INFO logs at each step of _do_rewrite_and_draft to trace OpenAI call, tag generation, and WP API call - telegram_bot.py: add INFO logs around rewrite execution + exc_info on error for full traceback in logs - repositories.py: include scheduled_publish_at in get_article_by_id Co-Authored-By: Claude Sonnet 4.6 --- backend/app/pipeline.py | 4 ++++ backend/app/repositories.py | 3 ++- backend/app/telegram_bot.py | 4 +++- backend/app/wordpress.py | 20 +++++++++++++------- docs/wiki/Operations-Runbook.md | 20 ++++++++++++++++++++ 5 files changed, 42 insertions(+), 9 deletions(-) diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index 6753491..ef0597d 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -110,7 +110,9 @@ def _do_rewrite_and_draft(article: dict[str, Any]) -> tuple[int, str | None]: article_id = int(article["id"]) # Rewrite + logger.info("_do_rewrite_and_draft #%d: starte OpenAI-Rewrite", article_id) rewritten = rewrite_article_text(article) + logger.info("_do_rewrite_and_draft #%d: Rewrite fertig (%d Wörter), generiere Tags", article_id, len(rewritten.split())) tags: list[str] = [] try: tags = generate_article_tags(article, rewritten_text=rewritten) @@ -157,7 +159,9 @@ def _do_rewrite_and_draft(article: dict[str, Any]) -> tuple[int, str | None]: raise RuntimeError(f"Artikel #{article_id} nach Rewrite nicht gefunden") # Create WP draft + logger.info("_do_rewrite_and_draft #%d: erstelle/aktualisiere WP Draft (wp_post_id=%s)", article_id, fresh.get("wp_post_id")) wp_post_id, wp_post_url = publish_article_draft(fresh) + logger.info("_do_rewrite_and_draft #%d: WP Draft fertig (post_id=%s)", article_id, wp_post_id) # Update WP info in DB from .repositories import mark_article_publish_result diff --git a/backend/app/repositories.py b/backend/app/repositories.py index 0ee5380..9556ed3 100644 --- a/backend/app/repositories.py +++ b/backend/app/repositories.py @@ -321,7 +321,8 @@ def get_article_by_id(article_id: int) -> dict[str, Any] | None: a.source_name_snapshot, a.source_terms_url_snapshot, a.source_license_name_snapshot, a.legal_checked, a.legal_checked_at, a.legal_note, a.wp_post_id, a.wp_post_url, a.publish_attempts, a.publish_last_error, a.published_to_wp_at, - a.word_count, a.status, a.meta_json, a.created_at, a.updated_at + a.word_count, a.status, a.meta_json, a.created_at, a.updated_at, + a.scheduled_publish_at FROM articles a WHERE a.id = ? """, diff --git a/backend/app/telegram_bot.py b/backend/app/telegram_bot.py index bebda41..46ddd28 100644 --- a/backend/app/telegram_bot.py +++ b/backend/app/telegram_bot.py @@ -435,14 +435,16 @@ def _handle_callback(callback_query: dict[str, Any]) -> None: if action == "rewrite": try: + logger.info("Rewrite #%d: starte rewrite_and_update_draft", article_id) _pipeline.rewrite_and_update_draft(article_id) + logger.info("Rewrite #%d: abgeschlossen, sende Benachrichtigung", article_id) updated = get_article_by_id(article_id) if updated: from .scheduler import suggest_publish_slot slot = suggest_publish_slot() notify_new_draft(updated, score=_get_relevance_score(updated), suggested_publish_at=slot) except Exception as exc: - logger.error("Rewrite #%d fehlgeschlagen: %s", article_id, exc) + logger.error("Rewrite #%d fehlgeschlagen: %s", article_id, exc, exc_info=True) notify_error(f"Rewrite #{article_id} fehlgeschlagen: {exc}") elif action == "discard": diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index b031e9d..a4f7f3a 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -318,13 +318,19 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: featured_media_id = None selected_image_url = _selected_image_url_from_meta(article.get("meta_json")) if selected_image_url: - featured_media_id = _upload_featured_media( - base_url=settings.wordpress_base_url, - auth_header=auth, - image_url=selected_image_url, - article_title=title, - source_url=source_url, - ) + try: + featured_media_id = _upload_featured_media( + base_url=settings.wordpress_base_url, + auth_header=auth, + image_url=selected_image_url, + article_title=title, + source_url=source_url, + ) + except Exception as img_exc: + import logging + logging.getLogger(__name__).warning( + "Bild-Upload fehlgeschlagen (wird übersprungen): %s — %s", selected_image_url, img_exc + ) payload = { "title": title, diff --git a/docs/wiki/Operations-Runbook.md b/docs/wiki/Operations-Runbook.md index 32bf5c4..e6c0f88 100644 --- a/docs/wiki/Operations-Runbook.md +++ b/docs/wiki/Operations-Runbook.md @@ -18,6 +18,26 @@ 3. Payload-Validation/Tag-Fehler? 4. Artikel in `pending` statt `failed` markieren, wenn unklar +## Incident: Telegram-Buttons reagieren nicht / Befehle ignoriert + +**Ursache:** N8N "App Release - Telegram Bot"-Workflow hat den Webhook überschrieben. + +**Prüfen:** +```bash +curl -s "https://api.telegram.org/bot8403822424:AAGp8gZoNIGZv3IIan45q7P9HfM868qzXi4/getWebhookInfo" | python3 -m json.tool +``` +→ `url` muss auf `https://news.vanityontour.de/telegram/webhook` zeigen +→ `allowed_updates` muss `["message", "callback_query"]` enthalten + +**Webhook zurücksetzen:** +```bash +curl -s -X POST "https://api.telegram.org/bot8403822424:AAGp8gZoNIGZv3IIan45q7P9HfM868qzXi4/setWebhook" \ + -H "Content-Type: application/json" \ + -d '{"url":"https://news.vanityontour.de/telegram/webhook","allowed_updates":["message","callback_query"],"secret_token":"RWWAaBwfCUX9Y573JVkB9zAeloHsZZoruXOBBgUtsvU"}' +``` + +Vollständige Dokumentation: `projects/webhook/telegram-webhook-reset.md` + ## Backups - SQLite-Dump taeglich - Konfiguration und `.env` sicher sichern From aaac5def27a65dd1e56854b8d058f20608569f01 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 27 Mar 2026 07:08:48 +0000 Subject: [PATCH 67/87] feat(pipeline): image caption/credit extraction, no-image exclusion, WP attribution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit source_extraction.py: - New _extract_image_metadata(): extracts figcaption text + copyright/credit per image URL using 3 strategies (figure+figcaption, data-* attributes, adjacent credit spans) - ExtractedArticle gets new image_metadata field - extracted_article_to_meta() includes image_metadata in stored JSON pipeline.py: - After auto image selection, check if selected_url is set - Articles without usable image → status "no_image" (excluded with Telegram notice) - PipelineStats and summary report include no_image counter db.py: - Add "no_image" to articles status CHECK constraint - Migration: recreates articles table with updated constraint on existing DBs workflow.py / main.py: - Map no_image as own UI status with rewrite/close transitions wordpress.py: - _upload_featured_media() accepts image_caption param, sends to WP media - _get_image_meta_for_url() / _build_image_caption() helpers - _build_attribution_block(): separator + attribution paragraph at article end (original link, author, Bildnachweis/credit) - _build_post_content() appends attribution block telegram_bot.py: - notify_pipeline_done() shows 🖼️ no-image count Co-Authored-By: Claude Sonnet 4.6 --- backend/app/db.py | 85 +++++++++++++- backend/app/main.py | 4 +- backend/app/pipeline.py | 29 +++++ backend/app/source_extraction.py | 187 ++++++++++++++++++++++++++++++- backend/app/telegram_bot.py | 3 + backend/app/wordpress.py | 76 ++++++++++++- backend/app/workflow.py | 7 +- 7 files changed, 381 insertions(+), 10 deletions(-) diff --git a/backend/app/db.py b/backend/app/db.py index 1b394c3..b6ef898 100644 --- a/backend/app/db.py +++ b/backend/app/db.py @@ -110,7 +110,7 @@ def init_db() -> None: publish_last_error TEXT, published_to_wp_at TEXT, word_count INTEGER DEFAULT 0, - status TEXT NOT NULL DEFAULT 'new' CHECK (status IN ('new', 'rewrite', 'review', 'approved', 'published', 'error')), + status TEXT NOT NULL DEFAULT 'new' CHECK (status IN ('new', 'rewrite', 'review', 'approved', 'published', 'error', 'no_image')), meta_json TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')), @@ -181,6 +181,89 @@ def init_db() -> None: if column not in existing_columns: conn.execute(ddl) + # Migration: add 'no_image' to the status CHECK constraint if not present. + # SQLite cannot modify CHECK constraints in-place, so we recreate the table. + table_sql_row = conn.execute( + "SELECT sql FROM sqlite_master WHERE type='table' AND name='articles'" + ).fetchone() + if table_sql_row and "'no_image'" not in (table_sql_row["sql"] or ""): + conn.executescript( + """ + PRAGMA foreign_keys=OFF; + + CREATE TABLE articles_v2 ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + feed_id INTEGER, + source_article_id TEXT, + source_hash TEXT, + title TEXT NOT NULL, + source_url TEXT NOT NULL, + canonical_url TEXT, + published_at TEXT, + author TEXT, + summary TEXT, + content_raw TEXT, + content_rewritten TEXT, + image_urls_json TEXT, + press_contact TEXT, + source_name_snapshot TEXT, + source_terms_url_snapshot TEXT, + source_license_name_snapshot TEXT, + legal_checked INTEGER NOT NULL DEFAULT 0, + legal_checked_at TEXT, + legal_note TEXT, + wp_post_id INTEGER, + wp_post_url TEXT, + publish_attempts INTEGER NOT NULL DEFAULT 0, + publish_last_error TEXT, + published_to_wp_at TEXT, + word_count INTEGER DEFAULT 0, + status TEXT NOT NULL DEFAULT 'new' CHECK (status IN ('new', 'rewrite', 'review', 'approved', 'published', 'error', 'no_image')), + meta_json TEXT, + relevance_score INTEGER, + scheduled_publish_at TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + updated_at TEXT NOT NULL DEFAULT (datetime('now')), + FOREIGN KEY(feed_id) REFERENCES feeds(id) ON DELETE SET NULL, + UNIQUE(source_url) + ); + + INSERT INTO articles_v2 SELECT + id, feed_id, source_article_id, source_hash, title, source_url, + canonical_url, published_at, author, summary, content_raw, + content_rewritten, image_urls_json, press_contact, + source_name_snapshot, source_terms_url_snapshot, source_license_name_snapshot, + legal_checked, legal_checked_at, legal_note, + wp_post_id, wp_post_url, publish_attempts, publish_last_error, + published_to_wp_at, word_count, status, meta_json, + relevance_score, scheduled_publish_at, created_at, updated_at + FROM articles; + + DROP TABLE articles; + ALTER TABLE articles_v2 RENAME TO articles; + + CREATE INDEX IF NOT EXISTS idx_articles_source_article_id ON articles(source_article_id); + CREATE INDEX IF NOT EXISTS idx_articles_source_hash ON articles(source_hash); + CREATE UNIQUE INDEX IF NOT EXISTS uq_articles_feed_source_article_id + ON articles(feed_id, source_article_id) + WHERE source_article_id IS NOT NULL; + CREATE UNIQUE INDEX IF NOT EXISTS uq_articles_source_hash + ON articles(source_hash) + WHERE source_hash IS NOT NULL; + CREATE INDEX IF NOT EXISTS idx_articles_status ON articles(status); + CREATE INDEX IF NOT EXISTS idx_articles_published_at ON articles(published_at); + + CREATE TRIGGER IF NOT EXISTS trg_articles_updated_at + AFTER UPDATE ON articles + FOR EACH ROW + BEGIN + UPDATE articles SET updated_at = datetime('now') WHERE id = OLD.id; + END; + + PRAGMA foreign_keys=ON; + """ + ) + table_rows = conn.execute( "SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'publish_jobs'" ).fetchall() diff --git a/backend/app/main.py b/backend/app/main.py index e954de6..264a2be 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -123,7 +123,7 @@ class ArticleUpsertRequest(BaseModel): publish_last_error: str | None = None published_to_wp_at: str | None = None word_count: int = 0 - status: str = Field(default="new", pattern="^(new|rewrite|publish|published|close|review|approved|error)$") + status: str = Field(default="new", pattern="^(new|rewrite|publish|published|close|review|approved|error|no_image)$") meta_json: str | None = None @@ -132,7 +132,7 @@ class IngestionRunRequest(BaseModel): class ArticleTransitionRequest(BaseModel): - target_status: str = Field(pattern="^(new|rewrite|publish|published|close|review|approved|error)$") + target_status: str = Field(pattern="^(new|rewrite|publish|published|close|review|approved|error|no_image)$") note: str | None = None diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index ef0597d..100c70c 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -45,6 +45,7 @@ class PipelineStats: rejected: int = 0 warnings: int = 0 errors: int = 0 + no_image: int = 0 rejected_articles: list[dict[str, Any]] = field(default_factory=list) @@ -226,6 +227,7 @@ def run_auto_pipeline(trigger: str = "auto") -> dict[str, Any]: "processed": stats.processed, "drafts_created": stats.drafts_created, "rejected": stats.rejected, + "no_image": stats.no_image, "warnings": stats.warnings, "errors": stats.errors, } @@ -242,6 +244,33 @@ def _process_article(article: dict[str, Any], stats: PipelineStats, settings: An # Auto-select image _auto_select_image(article) + # Reload to get updated image_review + article = get_article_by_id(article_id) or article + + # Exclude articles without a usable image + try: + meta = json.loads(article.get("meta_json") or "{}") + except Exception: + meta = {} + has_image = bool((meta.get("image_review") or {}).get("selected_url")) + if not has_image: + update_article_status( + article_id, + "no_image", + actor="pipeline", + note="Kein Bild vorhanden – Artikel ausgeschlossen", + ) + stats.no_image += 1 + logger.info("Artikel #%d ausgeschlossen: kein Bild gefunden", article_id) + try: + tg.send_message( + f"🖼️ Kein Bild – Artikel #{article_id} ausgeschlossen\n" + f"📰 {(article.get('title') or '')[:80]}" + ) + except Exception: + pass + return + # Score relevance try: relevance = score_article_relevance(article) diff --git a/backend/app/source_extraction.py b/backend/app/source_extraction.py index 925fcf6..d3cbed8 100644 --- a/backend/app/source_extraction.py +++ b/backend/app/source_extraction.py @@ -1,6 +1,6 @@ from __future__ import annotations -from dataclasses import dataclass +from dataclasses import dataclass, field from html import unescape import re from typing import Any @@ -21,6 +21,7 @@ class ExtractedArticle: images: list[str] press_contact: str | None extraction_error: str | None = None + image_metadata: dict[str, dict] = field(default_factory=dict) def _clean_text(raw: str | None) -> str | None: @@ -197,6 +198,187 @@ def _extract_press_contact(content_text: str | None) -> str | None: return None +# CSS class keywords that indicate a copyright/credit element inside a figcaption +_CREDIT_CLASS_RE = re.compile( + r"class\s*=\s*[\"'][^\"']*(?:copyright|credit|photographer|photo-credit|image-credit|bildrechte|fotocredit)[^\"']*[\"']", + re.IGNORECASE, +) + +# Inline text patterns that signal a credit/copyright notice +_CREDIT_TEXT_RE = re.compile( + r"(©[^<\n\r]{1,100}|(?:Foto|Bild|Credit|Fotograf|Fotografie)\s*:[^<\n\r]{1,100})", + re.IGNORECASE, +) + +# data-* attribute names that carry credit/caption information directly on +_IMG_DATA_CREDIT_ATTRS = ("data-credit", "data-photographer", "data-copyright") +_IMG_DATA_CAPTION_ATTRS = ("data-caption", "data-description") + +# Class keywords for adjacent sibling credit spans/divs after an +_ADJ_CREDIT_CLASS_RE = re.compile( + r"class\s*=\s*[\"'][^\"']*(?:copyright|credit|photographer|photo-credit|image-credit|bildrechte|fotocredit)[^\"']*[\"']", + re.IGNORECASE, +) + + +def _extract_image_metadata(html: str, page_url: str) -> dict[str, dict]: + """Return a mapping of absolute image URL → {"caption": ..., "credit": ...}. + + Uses three progressive strategies: + 1.
          with +
          + 2. data-* attributes on tags not already covered + 3. tags whose immediately following HTML contains a credit element + """ + result: dict[str, dict] = {} + + try: + # ------------------------------------------------------------------ + # Strategy 1:
          blocks containing and
          + # ------------------------------------------------------------------ + for fig_match in re.finditer(r"]*>([\s\S]*?)
          ", html, re.IGNORECASE): + fig_html = fig_match.group(1) + + # Locate image src (src or lazy-loaded data-src) + img_match = re.search( + r"]+(?:src|data-src)\s*=\s*[\"']([^\"']+)[\"'][^>]*>", + fig_html, + re.IGNORECASE, + ) + if not img_match: + continue + img_src = urljoin(page_url, img_match.group(1).strip()) + + # Locate figcaption + figcap_match = re.search( + r"]*>([\s\S]*?)
          ", + fig_html, + re.IGNORECASE, + ) + if not figcap_match: + continue + figcap_html = figcap_match.group(1) + + # --- Extract credit --- + credit: str | None = None + + # Try credit via class attribute on an inner element + credit_elem_match = re.search( + r"<(?:span|p|div)[^>]*" + + _CREDIT_CLASS_RE.pattern + + r"[^>]*>([\s\S]*?)", + figcap_html, + re.IGNORECASE, + ) + if credit_elem_match: + credit = _clean_text(credit_elem_match.group(1)) + + # Fallback: scan plain text of figcaption for credit patterns + if not credit: + figcap_text = unescape(re.sub(r"<[^>]+>", " ", figcap_html)) + cred_text_match = _CREDIT_TEXT_RE.search(figcap_text) + if cred_text_match: + credit = _clean_text(cred_text_match.group(1)) + + # --- Extract caption (full figcaption text) --- + caption = _clean_text(figcap_html) + + # Only store entries that carry at least one piece of metadata + if caption or credit: + entry: dict[str, str] = {} + if caption: + entry["caption"] = caption + if credit: + entry["credit"] = credit + result[img_src] = entry + + # ------------------------------------------------------------------ + # Strategy 2: data-* attributes on tags + # ------------------------------------------------------------------ + for img_match in re.finditer(r"]+)>", html, re.IGNORECASE): + img_attrs = img_match.group(1) + + # Resolve image URL (prefer src over data-src) + src_match = re.search(r'(?:^|\s)src\s*=\s*["\']([^"\']+)["\']', img_attrs, re.IGNORECASE) + if not src_match: + src_match = re.search(r'data-src\s*=\s*["\']([^"\']+)["\']', img_attrs, re.IGNORECASE) + if not src_match: + continue + img_src = urljoin(page_url, src_match.group(1).strip()) + + # Skip images already handled by Strategy 1 + if img_src in result: + continue + + credit: str | None = None + caption: str | None = None + + for attr in _IMG_DATA_CREDIT_ATTRS: + attr_match = re.search( + rf'{re.escape(attr)}\s*=\s*["\']([^"\']+)["\']', + img_attrs, + re.IGNORECASE, + ) + if attr_match: + credit = _clean_text(attr_match.group(1)) + break + + for attr in _IMG_DATA_CAPTION_ATTRS: + attr_match = re.search( + rf'{re.escape(attr)}\s*=\s*["\']([^"\']+)["\']', + img_attrs, + re.IGNORECASE, + ) + if attr_match: + caption = _clean_text(attr_match.group(1)) + break + + if caption or credit: + entry = {} + if caption: + entry["caption"] = caption + if credit: + entry["credit"] = credit + result[img_src] = entry + + # ------------------------------------------------------------------ + # Strategy 3: followed within 200 chars by a credit element + # ------------------------------------------------------------------ + for img_match in re.finditer(r"]+)>", html, re.IGNORECASE): + img_attrs = img_match.group(1) + + src_match = re.search(r'(?:^|\s)src\s*=\s*["\']([^"\']+)["\']', img_attrs, re.IGNORECASE) + if not src_match: + src_match = re.search(r'data-src\s*=\s*["\']([^"\']+)["\']', img_attrs, re.IGNORECASE) + if not src_match: + continue + img_src = urljoin(page_url, src_match.group(1).strip()) + + # Skip images already handled by earlier strategies + if img_src in result: + continue + + # Look at the 200 characters of HTML immediately after the img tag + after_start = img_match.end() + after_html = html[after_start : after_start + 200] + + adj_match = re.search( + r"<(?:span|p|div)[^>]*" + + _ADJ_CREDIT_CLASS_RE.pattern + + r"[^>]*>([\s\S]*?)", + after_html, + re.IGNORECASE, + ) + if adj_match: + credit = _clean_text(adj_match.group(1)) + if credit: + result[img_src] = {"credit": credit} + + except Exception: + return {} + + return result + + def extract_article(url: str, timeout_seconds: int = DEFAULT_TIMEOUT_SECONDS) -> ExtractedArticle: try: req = Request( @@ -232,6 +414,7 @@ def extract_article(url: str, timeout_seconds: int = DEFAULT_TIMEOUT_SECONDS) -> summary = _clean_text(content_text[:320]) images = _extract_images(html, url) press_contact = _extract_press_contact(content_text) + image_metadata = _extract_image_metadata(html, url) return ExtractedArticle( title=title, @@ -242,6 +425,7 @@ def extract_article(url: str, timeout_seconds: int = DEFAULT_TIMEOUT_SECONDS) -> images=images, press_contact=press_contact, extraction_error=None, + image_metadata=image_metadata, ) @@ -254,4 +438,5 @@ def extracted_article_to_meta(article: ExtractedArticle) -> dict[str, Any]: "images": article.images, "press_contact": article.press_contact, "extraction_error": article.extraction_error, + "image_metadata": article.image_metadata, } diff --git a/backend/app/telegram_bot.py b/backend/app/telegram_bot.py index 46ddd28..c92b009 100644 --- a/backend/app/telegram_bot.py +++ b/backend/app/telegram_bot.py @@ -289,6 +289,7 @@ def notify_pipeline_done(stats: dict[str, Any]) -> None: processed = stats.get("processed", 0) drafts = stats.get("drafts_created", 0) rejected = stats.get("rejected", 0) + no_image = stats.get("no_image", 0) warnings = stats.get("warnings", 0) errors = stats.get("errors", 0) @@ -300,6 +301,8 @@ def notify_pipeline_done(stats: dict[str, Any]) -> None: ] if rejected: lines.append(f"🚫 Abgelehnt: {rejected}") + if no_image: + lines.append(f"🖼️ Kein Bild: {no_image}") if warnings: lines.append(f"⚠️ Warnungen: {warnings}") if errors: diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index a4f7f3a..a1ef8f5 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -161,6 +161,32 @@ def _guess_filename(image_url: str, content_type: str) -> str: return stem +def _get_image_meta_for_url(meta_json: str | None, image_url: str) -> dict: + """Return the caption/credit dict for a specific image URL from extraction metadata.""" + if not meta_json or not image_url: + return {} + try: + meta = json.loads(meta_json) + image_metadata = (meta.get("extraction") or {}).get("image_metadata") or {} + return image_metadata.get(image_url) or {} + except Exception: + return {} + + +def _build_image_caption(image_meta: dict, source_url: str) -> str: + """Build a WP caption string from image metadata and source URL.""" + caption = (image_meta.get("caption") or "").strip() + credit = (image_meta.get("credit") or "").strip() + parts = [] + if caption: + parts.append(caption) + if credit: + parts.append(credit) + if not parts: + parts.append(f"Quelle: {source_url}") + return " | ".join(parts) + + def _upload_featured_media( *, base_url: str, @@ -168,6 +194,7 @@ def _upload_featured_media( image_url: str, article_title: str, source_url: str, + image_caption: str = "", ) -> int: image_bytes, content_type = _download_image_bytes(image_url, referer=source_url or None) filename = _guess_filename(image_url, content_type) @@ -192,7 +219,6 @@ def _upload_featured_media( if media_id <= 0: raise RuntimeError(f"WordPress Media-Upload fehlgeschlagen: {media_payload}") - # Optional metadata update for traceability. _wp_request( base_url=base_url, auth_header=auth_header, @@ -200,7 +226,7 @@ def _upload_featured_media( endpoint=f"media/{media_id}", payload={ "title": f"{article_title[:120]} - Bild", - "caption": f"Quelle: {source_url}", + "caption": image_caption or f"Quelle: {source_url}", "alt_text": article_title[:200], }, ) @@ -289,6 +315,45 @@ def _sanitize_publish_text(text: str) -> str: return merged +def _build_attribution_block(article: dict[str, Any]) -> str: + """Build a WP Gutenberg attribution block for the bottom of the article.""" + source_url = (article.get("canonical_url") or article.get("source_url") or "").strip() + source_name = (article.get("source_name_snapshot") or "").strip() + author = (article.get("author") or "").strip() + + # Get image credit from extraction metadata + credit = "" + try: + meta = json.loads(article.get("meta_json") or "{}") + selected_url = (meta.get("image_review") or {}).get("selected_url") or "" + if selected_url: + img_meta = (meta.get("extraction") or {}).get("image_metadata") or {} + credit = (img_meta.get(selected_url) or {}).get("credit") or "" + except Exception: + pass + + parts: list[str] = [] + if source_url: + label = source_name or source_url + parts.append(f'Originalartikel: {escape(label)}') + if author: + parts.append(f"Autor: {escape(author)}") + if credit: + parts.append(f"Bildnachweis: {escape(credit)}") + + if not parts: + return "" + + inner = "  |  ".join(parts) + return ( + "\n" + "
          \n" + f'' + f'

          {inner}

          ' + "" + ) + + def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: summary = (article.get("summary") or "").strip() body_text = (article.get("content_rewritten") or article.get("content_raw") or "").strip() @@ -300,7 +365,9 @@ def _build_post_content(article: dict[str, Any]) -> tuple[str, str | None]: body_html = _html_to_wp_blocks(body_text) if has_html else _as_block_paragraphs(body_text) if not body_html: body_html = "

          Kein Inhalt verfügbar.

          " - content = body_html.strip() + + attribution = _build_attribution_block(article) + content = (body_html + attribution).strip() return content, None @@ -318,6 +385,8 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: featured_media_id = None selected_image_url = _selected_image_url_from_meta(article.get("meta_json")) if selected_image_url: + image_meta = _get_image_meta_for_url(article.get("meta_json"), selected_image_url) + image_caption = _build_image_caption(image_meta, source_url) try: featured_media_id = _upload_featured_media( base_url=settings.wordpress_base_url, @@ -325,6 +394,7 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: image_url=selected_image_url, article_title=title, source_url=source_url, + image_caption=image_caption, ) except Exception as img_exc: import logging diff --git a/backend/app/workflow.py b/backend/app/workflow.py index b6cd4bb..83e9b63 100644 --- a/backend/app/workflow.py +++ b/backend/app/workflow.py @@ -1,6 +1,6 @@ from __future__ import annotations -UI_STATUSES = ("new", "rewrite", "publish", "published", "close") +UI_STATUSES = ("new", "rewrite", "publish", "published", "close", "no_image") def internal_to_ui_status(status: str | None) -> str: @@ -11,7 +11,7 @@ def internal_to_ui_status(status: str | None) -> str: return "close" if value == "review": return "rewrite" - if value in {"new", "rewrite", "published"}: + if value in {"new", "rewrite", "published", "no_image"}: return value return value or "new" @@ -22,7 +22,7 @@ def ui_to_internal_status(status: str | None) -> str: return "approved" if value == "close": return "error" - if value in {"new", "rewrite", "published"}: + if value in {"new", "rewrite", "published", "no_image"}: return value if value in {"approved", "error", "review"}: return value @@ -35,4 +35,5 @@ ALLOWED_UI_TRANSITIONS: dict[str, set[str]] = { "publish": {"published", "close"}, "published": {"rewrite", "close"}, "close": {"rewrite"}, + "no_image": {"rewrite", "close"}, } From 0d07a9804dd42d963347a304d8e3ff5d83651284 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 27 Mar 2026 07:10:30 +0000 Subject: [PATCH 68/87] fix(ingestion): resolve Google Alerts redirect URLs before article fetch Google Alerts feed entries use google.com/url?...&url=&... tracking links. The extractor was fetching the Google redirect page instead of the actual article, resulting in empty content and no images. _resolve_google_redirect() extracts the real URL from the 'url' query parameter before passing it to extract_article(). Non-Google URLs are returned unchanged. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/ingestion.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py index 510fd10..3710276 100644 --- a/backend/app/ingestion.py +++ b/backend/app/ingestion.py @@ -7,7 +7,7 @@ import json import re import time from typing import Any -from urllib.parse import unquote, urlparse +from urllib.parse import unquote, urlencode, urlparse, parse_qs import feedparser @@ -38,6 +38,31 @@ class IngestionStats: MAX_FEED_FETCH_RETRIES = 3 +def _resolve_google_redirect(url: str) -> str: + """Extract the real article URL from Google redirect URLs. + + Google Alerts feed entries use tracking links like: + https://www.google.com/url?rct=j&sa=t&url=&ct=ga&... + + This function returns the decoded real URL if detected, otherwise the + original URL unchanged. + """ + try: + parsed = urlparse(url) + host = (parsed.hostname or "").lower() + if host not in ("www.google.com", "google.com"): + return url + if parsed.path not in ("/url", "/url/"): + return url + params = parse_qs(parsed.query, keep_blank_values=False) + real_urls = params.get("url") + if real_urls: + return unquote(real_urls[0]) + except Exception: + pass + return url + + def _entry_published_iso(entry: dict) -> str | None: published = entry.get("published_parsed") or entry.get("updated_parsed") if not published: @@ -215,6 +240,8 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: link = entry.get("link") if not link: continue + # Resolve Google redirect URLs (google.com/url?...&url=&...) + link = _resolve_google_redirect(link) summary, content_raw = _entry_text(entry) title = entry.get("title") or "Ohne Titel" From 8e65485f0c7d89dc8e225ed3add5e7b91da4ee55 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 27 Mar 2026 08:08:07 +0000 Subject: [PATCH 69/87] fix(ingestion): strip HTML tags from feed entry titles Google Alerts wraps matched keywords in ... tags. Strip all HTML tags from the title before storing. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/ingestion.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py index 3710276..d76f4c4 100644 --- a/backend/app/ingestion.py +++ b/backend/app/ingestion.py @@ -244,7 +244,9 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: link = _resolve_google_redirect(link) summary, content_raw = _entry_text(entry) - title = entry.get("title") or "Ohne Titel" + # Strip HTML tags from title (Google Alerts wraps matched keywords in ) + raw_title = entry.get("title") or "Ohne Titel" + title = re.sub(r"<[^>]+>", "", raw_title).strip() or "Ohne Titel" extracted = extract_article(link) final_title = extracted.title or title From 82f2df610db4106e12bcca2089f7537002125064 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 27 Mar 2026 08:24:40 +0000 Subject: [PATCH 70/87] fix(wordpress): fuzzy URL match for image metadata and simplify caption builder Image metadata keys may have query params (e.g. ?w=1200) that differ from the selected_url stored in image_review. Fall back to comparing URLs without query string so the figcaption text is correctly found. Also simplified _build_image_caption: figcaption text already contains the credit info, so just use caption directly instead of appending the redundant credit prefix marker. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/wordpress.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index a1ef8f5..6ae686e 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -166,25 +166,30 @@ def _get_image_meta_for_url(meta_json: str | None, image_url: str) -> dict: if not meta_json or not image_url: return {} try: + from urllib.parse import urlparse meta = json.loads(meta_json) image_metadata = (meta.get("extraction") or {}).get("image_metadata") or {} - return image_metadata.get(image_url) or {} + # Exact match first + if image_url in image_metadata: + return image_metadata[image_url] + # Fuzzy match: compare without query string (handles ?w=1200 variants) + base_url = urlparse(image_url)._replace(query="").geturl() + for key, val in image_metadata.items(): + key_base = urlparse(key)._replace(query="").geturl() + if key_base == base_url: + return val + return {} except Exception: return {} def _build_image_caption(image_meta: dict, source_url: str) -> str: """Build a WP caption string from image metadata and source URL.""" + # caption from figcaption typically already contains the credit text caption = (image_meta.get("caption") or "").strip() - credit = (image_meta.get("credit") or "").strip() - parts = [] if caption: - parts.append(caption) - if credit: - parts.append(credit) - if not parts: - parts.append(f"Quelle: {source_url}") - return " | ".join(parts) + return caption + return f"Quelle: {source_url}" def _upload_featured_media( From d1cb809852e16a4642af1ae2964cdbce1e37ef95 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 27 Mar 2026 08:28:44 +0000 Subject: [PATCH 71/87] fix(wordpress): fix attribution block source name and image credit lookup - Derive real source hostname from canonical URL when feed name is generic (e.g. "Google Alerts"), so the link shows "moin.de" instead of "Google Alerts" - Use _get_image_meta_for_url() (fuzzy URL matching) for image credit lookup - Use caption field for Bildnachweis since it already contains embedded credits Co-Authored-By: Claude Sonnet 4.6 --- backend/app/wordpress.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index 6ae686e..313719d 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -322,18 +322,30 @@ def _sanitize_publish_text(text: str) -> str: def _build_attribution_block(article: dict[str, Any]) -> str: """Build a WP Gutenberg attribution block for the bottom of the article.""" + from urllib.parse import urlparse source_url = (article.get("canonical_url") or article.get("source_url") or "").strip() source_name = (article.get("source_name_snapshot") or "").strip() author = (article.get("author") or "").strip() - # Get image credit from extraction metadata + # If the feed name is "Google Alerts" (or similar generic names), derive the + # real source name from the hostname of the canonical URL. + if not source_name or source_name.lower() in ("google alerts", "google"): + try: + hostname = urlparse(source_url).hostname or "" + source_name = hostname.removeprefix("www.") + except Exception: + pass + + # Get image credit from extraction metadata (uses fuzzy URL match) + meta_json = article.get("meta_json") credit = "" try: - meta = json.loads(article.get("meta_json") or "{}") + meta = json.loads(meta_json or "{}") selected_url = (meta.get("image_review") or {}).get("selected_url") or "" if selected_url: - img_meta = (meta.get("extraction") or {}).get("image_metadata") or {} - credit = (img_meta.get(selected_url) or {}).get("credit") or "" + img_meta = _get_image_meta_for_url(meta_json, selected_url) + # caption already contains embedded credit text (e.g. "Foto: IMAGO/Zoonar") + credit = img_meta.get("caption") or img_meta.get("credit") or "" except Exception: pass From 45c533c674c3d683a3dbdf28e7e0660f289cd291 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 27 Mar 2026 08:41:28 +0000 Subject: [PATCH 72/87] fix(wordpress): extract credit portion from caption for attribution block When the credit field only captured a marker prefix (e.g. "Foto:") due to CSS-class-based extraction picking up only the label element, fall back to regex-extracting the credit line from the full figcaption caption text. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/wordpress.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index 313719d..fcd1add 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -344,8 +344,22 @@ def _build_attribution_block(article: dict[str, Any]) -> str: selected_url = (meta.get("image_review") or {}).get("selected_url") or "" if selected_url: img_meta = _get_image_meta_for_url(meta_json, selected_url) - # caption already contains embedded credit text (e.g. "Foto: IMAGO/Zoonar") - credit = img_meta.get("caption") or img_meta.get("credit") or "" + raw_credit = (img_meta.get("credit") or "").strip() + caption_text = (img_meta.get("caption") or "").strip() + # If credit is just a prefix marker (e.g. "Foto:"), extract the credit + # portion from the full caption text instead. + if raw_credit and not raw_credit.rstrip(":").strip(): + raw_credit = "" + if raw_credit: + credit = raw_credit + elif caption_text: + # Extract credit markers like "Foto: IMAGO/…", "© Agentur", "Bild: …" + import re as _re + m = _re.search( + r"(©[^\n]{1,120}|(?:Foto|Bild|Credit|Fotograf|Photo)\s*:[^\n]{1,120})", + caption_text, + ) + credit = m.group(1).strip() if m else "" except Exception: pass From 1a8d0775c77463797577468b23994f02c0a2e78a Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 27 Mar 2026 08:47:09 +0000 Subject: [PATCH 73/87] fix(wordpress): correctly detect bare credit marker prefix before caption fallback Co-Authored-By: Claude Sonnet 4.6 --- backend/app/wordpress.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index fcd1add..912e85c 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -346,9 +346,10 @@ def _build_attribution_block(article: dict[str, Any]) -> str: img_meta = _get_image_meta_for_url(meta_json, selected_url) raw_credit = (img_meta.get("credit") or "").strip() caption_text = (img_meta.get("caption") or "").strip() - # If credit is just a prefix marker (e.g. "Foto:"), extract the credit - # portion from the full caption text instead. - if raw_credit and not raw_credit.rstrip(":").strip(): + # If credit is just a bare marker prefix (e.g. "Foto:", "Bild:"), + # clear it and extract the full credit from the caption text instead. + _BARE_MARKERS = {"foto", "bild", "credit", "fotograf", "fotografie", "photo", "bildnachweis"} + if raw_credit.endswith(":") and raw_credit[:-1].strip().lower() in _BARE_MARKERS: raw_credit = "" if raw_credit: credit = raw_credit From 8c6022fead4d45f4ced2e7b8695f5c69b4818524 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Sun, 29 Mar 2026 14:14:03 +0000 Subject: [PATCH 74/87] fix(pipeline): always reserve publish slot before WP draft creation If scheduled_publish_at is not set when _do_rewrite_and_draft runs (e.g. rewrite_and_update_draft called on a review article), reserve a slot now so the WP draft always receives a future date. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/pipeline.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index 100c70c..059ccf5 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -159,8 +159,17 @@ def _do_rewrite_and_draft(article: dict[str, Any]) -> tuple[int, str | None]: if not fresh: raise RuntimeError(f"Artikel #{article_id} nach Rewrite nicht gefunden") + # Ensure a publish slot is reserved — reserve one now if not yet set + if not fresh.get("scheduled_publish_at"): + from .scheduler import reserve_publish_slot + logger.info("_do_rewrite_and_draft #%d: kein Slot gesetzt, reserviere jetzt", article_id) + reserve_publish_slot(article_id) + fresh = get_article_by_id(article_id) + if not fresh: + raise RuntimeError(f"Artikel #{article_id} nach Slot-Reservierung nicht gefunden") + # Create WP draft - logger.info("_do_rewrite_and_draft #%d: erstelle/aktualisiere WP Draft (wp_post_id=%s)", article_id, fresh.get("wp_post_id")) + logger.info("_do_rewrite_and_draft #%d: erstelle/aktualisiere WP Draft (wp_post_id=%s, sched=%s)", article_id, fresh.get("wp_post_id"), fresh.get("scheduled_publish_at")) wp_post_id, wp_post_url = publish_article_draft(fresh) logger.info("_do_rewrite_and_draft #%d: WP Draft fertig (post_id=%s)", article_id, wp_post_id) From 426a799371cf8aa0f748a821a06b26b9834820c5 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Sun, 29 Mar 2026 14:29:25 +0000 Subject: [PATCH 75/87] fix(wordpress): use status=future for posts with a future scheduled_publish_at MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WordPress ignores the date field for draft posts and shows "Sofort veröffentlichen" instead. Setting status=future causes WP to display and honour the scheduled date, auto-publishing the post at the given time as intended. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/wordpress.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index 912e85c..8b6d5a0 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -446,6 +446,14 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: scheduled_at = article.get("scheduled_publish_at") if scheduled_at: payload["date"] = scheduled_at # e.g. "2026-03-24T09:00:00" + # Use status "future" so WP schedules auto-publishing at the given date. + # WP ignores date for drafts and shows "Sofort veröffentlichen" instead. + try: + from datetime import datetime as _dt + if _dt.fromisoformat(scheduled_at) > _dt.now(): + payload["status"] = "future" + except Exception: + pass wp_post_id = article.get("wp_post_id") tag_ids = _resolve_wp_tag_ids( From 764e7bff6ab4907cedaf91680334d78b48039f32 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Tue, 7 Apr 2026 09:09:44 +0000 Subject: [PATCH 76/87] fix(ingestion): skip data: URIs and known placeholder images - ingestion.py: filter out data:image/... inline URIs before ranking - ingestion.py: penalise (-300) known placeholder paths (some-default.jpg etc.) - wordpress.py: _is_usable_image_url rejects data: URIs and placeholder paths Co-Authored-By: Claude Sonnet 4.6 --- backend/app/ingestion.py | 35 ++++++++++++++++++++- backend/app/wordpress.py | 68 +++++++++++++++++++++++++++++++++++----- 2 files changed, 94 insertions(+), 9 deletions(-) diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py index d76f4c4..30140ca 100644 --- a/backend/app/ingestion.py +++ b/backend/app/ingestion.py @@ -38,6 +38,26 @@ class IngestionStats: MAX_FEED_FETCH_RETRIES = 3 +def _normalize_article_url(url: str) -> str: + """Strip AMP and tracking query parameters from article URLs. + + Removes ?outputType=valid_amp and other AMP/tracking params so that + AMP and non-AMP versions of the same article are deduplicated. + """ + _AMP_PARAMS = {"outputtype", "amp", "outputformat"} + try: + from urllib.parse import parse_qs, urlencode + parsed = urlparse(url) + if not parsed.query: + return url + params = parse_qs(parsed.query, keep_blank_values=True) + filtered = {k: v for k, v in params.items() if k.lower() not in _AMP_PARAMS} + new_query = urlencode(filtered, doseq=True) + return parsed._replace(query=new_query).geturl() + except Exception: + return url + + def _resolve_google_redirect(url: str) -> str: """Extract the real article URL from Google redirect URLs. @@ -103,16 +123,27 @@ def _rank_image_candidates(source_url: str, title: str, images: list[str]) -> li source_host = (urlparse(source_url).hostname or "").lower() is_presseportal = "presseportal.de" in source_host title_tokens = _normalize_tokens(title) - blocked_patterns = ("logo", "badge", "app-store", "google-play", "na-logo", "sprite", "icon", "favicon", "tracking", "pixel") + blocked_patterns = ("logo", "badge", "app-store", "google-play", "na-logo", "sprite", "icon", "favicon", "tracking", "pixel", ".svg", ".ico", ".gif") + # Known placeholder/default images that should never be used as featured image + placeholder_patterns = ("some-default.jpg", "default-image", "placeholder", "no-image", "noimage") + ranked: list[dict[str, Any]] = [] for url in images: + # Skip inline data: URIs (e.g. base64-encoded SVG placeholders) + if url.startswith("data:"): + continue + parsed = urlparse(url) path = unquote(parsed.path.lower()) full = f"{parsed.netloc.lower()}{path}" score = 0 reasons: list[str] = [] + if any(token in full for token in placeholder_patterns): + score -= 300 + reasons.append("placeholder-image") + if any(token in full for token in blocked_patterns): score -= 150 reasons.append("blocked-pattern") @@ -242,6 +273,8 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: continue # Resolve Google redirect URLs (google.com/url?...&url=&...) link = _resolve_google_redirect(link) + # Normalize AMP/tracking params (e.g. ?outputType=valid_amp) + link = _normalize_article_url(link) summary, content_raw = _entry_text(entry) # Strip HTML tags from title (Google Alerts wraps matched keywords in ) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index 8b6d5a0..cced743 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -2,11 +2,13 @@ from __future__ import annotations import base64 from html import escape +import logging import json import mimetypes from pathlib import Path import re from typing import Any +from html import unescape as _html_unescape from urllib.parse import quote_plus, urlparse from urllib.request import Request, urlopen @@ -135,9 +137,37 @@ def _resolve_wp_tag_ids(*, base_url: str, auth_header: str, tags: list[str]) -> return ids +_BLOCKED_IMAGE_EXTS = {".svg", ".gif", ".ico", ".webp"} +_logger = logging.getLogger(__name__) + + +def _sanitize_image_url(url: str) -> str: + """Decode HTML entities (e.g. & → &) in image URLs from RSS feeds.""" + return _html_unescape(url) + + +_PLACEHOLDER_PATTERNS = ("some-default.jpg", "default-image", "placeholder", "no-image", "noimage") + +def _is_usable_image_url(url: str) -> bool: + """Return False for URLs that are unlikely to work as WP featured images.""" + if not url or url.startswith("data:"): + return False + try: + path = urlparse(url).path.lower() + _, ext = path.rsplit(".", 1) if "." in path else ("", "") + if f".{ext}" in _BLOCKED_IMAGE_EXTS: + return False + if any(p in path for p in _PLACEHOLDER_PATTERNS): + return False + except Exception: + pass + return True + + def _download_image_bytes(url: str, referer: str | None = None) -> tuple[bytes, str]: + url = _sanitize_image_url(url) headers = { - "User-Agent": "rss-news-publisher/1.0", + "User-Agent": "Mozilla/5.0 (compatible; rss-news-publisher/1.0)", "Accept": "image/avif,image/webp,image/apng,image/*,*/*;q=0.8", } if referer: @@ -153,11 +183,14 @@ def _download_image_bytes(url: str, referer: str | None = None) -> tuple[bytes, def _guess_filename(image_url: str, content_type: str) -> str: - parsed = urlparse(image_url) + parsed = urlparse(_sanitize_image_url(image_url)) stem = Path(parsed.path).name or "article-image" if "." not in stem: ext = mimetypes.guess_extension(content_type.split(";")[0].strip()) or ".jpg" stem = f"{stem}{ext}" + # Sanitize to ASCII-safe characters for the HTTP Content-Disposition header + stem = stem.encode("ascii", errors="ignore").decode("ascii") + stem = re.sub(r"[^\w.\-]", "_", stem) or "article-image.jpg" return stem @@ -416,24 +449,43 @@ def publish_article_draft(article: dict[str, Any]) -> tuple[int, str | None]: featured_media_id = None selected_image_url = _selected_image_url_from_meta(article.get("meta_json")) - if selected_image_url: - image_meta = _get_image_meta_for_url(article.get("meta_json"), selected_image_url) + + # Build candidate list: primary selected URL + fallbacks from image_urls_json + image_candidates: list[str] = [] + if selected_image_url and _is_usable_image_url(selected_image_url): + image_candidates.append(selected_image_url) + try: + extra_urls = json.loads(article.get("image_urls_json") or "[]") + for u in extra_urls: + if u and u not in image_candidates and _is_usable_image_url(u): + image_candidates.append(u) + except Exception: + pass + + for candidate_url in image_candidates: + image_meta = _get_image_meta_for_url(article.get("meta_json"), candidate_url) image_caption = _build_image_caption(image_meta, source_url) try: featured_media_id = _upload_featured_media( base_url=settings.wordpress_base_url, auth_header=auth, - image_url=selected_image_url, + image_url=candidate_url, article_title=title, source_url=source_url, image_caption=image_caption, ) + break # success — stop trying further candidates except Exception as img_exc: - import logging - logging.getLogger(__name__).warning( - "Bild-Upload fehlgeschlagen (wird übersprungen): %s — %s", selected_image_url, img_exc + _logger.warning( + "Bild-Upload fehlgeschlagen, versuche nächste URL: %s — %s", candidate_url, img_exc ) + if not featured_media_id and image_candidates: + _logger.warning( + "Alle %d Bild-Kandidaten fehlgeschlagen für Artikel #%s (%s)", + len(image_candidates), article.get("id"), title[:60], + ) + payload = { "title": title, "content": content, From 8fa46312e84e56e6334ae536ae9c7ee42c19dd85 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Wed, 8 Apr 2026 09:29:24 +0000 Subject: [PATCH 77/87] fix(scheduler): query WordPress future posts to avoid double-booking slots The scheduler previously only checked the local SQLite DB for occupied slots. Posts created outside the pipeline (e.g. recovery scripts) were invisible, causing newly scheduled articles to land on already-taken WP dates. _fetch_wp_occupied_slots() now queries WP /wp/v2/posts?status=future before each slot assignment. All scheduling functions accept a wp_occupied set. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/scheduler.py | 194 +++++++++++++++++++++++++++------------ 1 file changed, 134 insertions(+), 60 deletions(-) diff --git a/backend/app/scheduler.py b/backend/app/scheduler.py index d4c6aaf..a92ba08 100644 --- a/backend/app/scheduler.py +++ b/backend/app/scheduler.py @@ -3,11 +3,15 @@ Calculates suggested publish slots for new WordPress drafts. Rules: - Maximum N drafts per day (configurable, default 2) -- Prefer slots spread across the week for steady traffic -- Preferred hours: configurable (default 09:00 and 14:00 CET) +- Preferred slots: configurable hours (default 09:00 and 14:00 CET) +- New articles queue up after the last already-scheduled article +- Checks both local DB AND WordPress future posts to avoid double-booking """ from __future__ import annotations +import base64 +import json +import urllib.request from datetime import date, datetime, timedelta, timezone from typing import Any @@ -15,7 +19,7 @@ from .config import get_settings from .db import get_conn -# CET offset (UTC+1 winter / UTC+2 summer – we use a fixed +1 for simplicity) +# CET offset (UTC+1 winter / UTC+2 summer – fixed +1 for simplicity) _CET_OFFSET = timedelta(hours=1) @@ -31,35 +35,87 @@ def _preferred_hours() -> list[int]: return [9, 14] -def _count_scheduled_on_day(target_date: date) -> int: - """Count articles already scheduled for publication on a given date.""" - date_str = target_date.isoformat() +def _fetch_wp_occupied_slots() -> set[tuple[str, int]]: + """Fetch all future-scheduled WordPress posts and return occupied (date_iso, hour) pairs. + + This prevents the scheduler from assigning a slot that is already taken + by a WP post that was not created via this pipeline (e.g. manually or via recovery scripts). + Returns an empty set on any error so the scheduler degrades gracefully. + """ + settings = get_settings() + try: + auth = base64.b64encode( + f"{settings.wordpress_username}:{settings.wordpress_password}".encode() + ).decode() + url = ( + f"{settings.wordpress_base_url}/wp-json/wp/v2/posts" + f"?status=future&per_page=100&orderby=date&order=asc&_fields=id,date" + ) + req = urllib.request.Request(url, headers={"Authorization": f"Basic {auth}"}) + with urllib.request.urlopen(req, timeout=10) as resp: + posts = json.loads(resp.read()) + occupied: set[tuple[str, int]] = set() + for p in posts: + try: + dt = datetime.fromisoformat(p["date"]) + occupied.add((dt.date().isoformat(), dt.hour)) + except Exception: + pass + return occupied + except Exception: + return set() + + +def _get_last_future_scheduled_date(wp_occupied: set[tuple[str, int]]) -> date | None: + """Return the date of the latest already-scheduled slot (DB + WP).""" + today = _today_cet() + + # Latest from local DB with get_conn() as conn: row = conn.execute( """ - SELECT COUNT(*) AS cnt + SELECT MAX(scheduled_publish_at) AS last_slot FROM articles - WHERE scheduled_publish_at >= ? AND scheduled_publish_at < ? - AND status NOT IN ('error') + WHERE scheduled_publish_at IS NOT NULL + AND scheduled_publish_at >= ? + AND status NOT IN ('error', 'no_image') """, - (date_str + "T00:00:00", date_str + "T23:59:59"), + (today.isoformat() + "T00:00:00",), ).fetchone() - return int(row["cnt"]) if row else 0 + db_last: date | None = None + if row and row["last_slot"]: + try: + db_last = datetime.fromisoformat(row["last_slot"]).date() + except Exception: + pass + + # Latest from WP + wp_last: date | None = None + for d_str, _ in wp_occupied: + try: + d = date.fromisoformat(d_str) + if d >= today and (wp_last is None or d > wp_last): + wp_last = d + except Exception: + pass + + if db_last and wp_last: + return max(db_last, wp_last) + return db_last or wp_last -def _next_free_hour(target_date: date) -> int | None: - """Return first preferred hour that is not yet used on target_date, or None if day is full.""" - settings = get_settings() - max_per_day = settings.pipeline_max_drafts_per_day +def _next_free_hour(target_date: date, wp_occupied: set[tuple[str, int]]) -> int | None: + """Return first preferred hour not yet used on target_date (DB + WP), or None if day is full.""" hours = _preferred_hours() - date_str = target_date.isoformat() + + # Hours used in local DB with get_conn() as conn: rows = conn.execute( """ SELECT scheduled_publish_at FROM articles WHERE scheduled_publish_at >= ? AND scheduled_publish_at < ? - AND status NOT IN ('error') + AND status NOT IN ('error', 'no_image') """, (date_str + "T00:00:00", date_str + "T23:59:59"), ).fetchall() @@ -72,68 +128,86 @@ def _next_free_hour(target_date: date) -> int | None: except Exception: pass + # Hours used in WordPress + for d_str, h in wp_occupied: + if d_str == date_str: + used_hours.add(h) + for h in hours: if h not in used_hours: return h - return None # day is full + return None -def suggest_publish_slot(lookahead_days: int = 14) -> str: - """Return a suggested publish datetime string (ISO, CET) for the next free slot. - - Format: 'Mo, 24.03.2026 um 09:00 Uhr' - Also updates DB so consecutive calls return different slots. - """ - today = _today_cet() +def _format_slot(d: date, hour: int) -> str: weekday_names = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"] + wd = weekday_names[d.weekday()] + return f"{wd}, {d.strftime('%d.%m.%Y')} um {hour:02d}:00 Uhr" - for offset in range(1, lookahead_days + 1): - candidate = today + timedelta(days=offset) - hour = _next_free_hour(candidate) - if hour is not None: - wd = weekday_names[candidate.weekday()] - return f"{wd}, {candidate.strftime('%d.%m.%Y')} um {hour:02d}:00 Uhr" - # Fallback: just tomorrow morning +def _find_next_free_slot( + wp_occupied: set[tuple[str, int]], lookahead_days: int = 30 +) -> tuple[date, int] | None: + """Find the next free (date, hour) slot, anchored after the last scheduled article.""" + today = _today_cet() tomorrow = today + timedelta(days=1) - hours = _preferred_hours() - h = hours[0] if hours else 9 - wd = weekday_names[tomorrow.weekday()] - return f"{wd}, {tomorrow.strftime('%d.%m.%Y')} um {h:02d}:00 Uhr" + + last_date = _get_last_future_scheduled_date(wp_occupied) + start_date = last_date if (last_date and last_date >= tomorrow) else tomorrow + + for offset in range(0, lookahead_days + 1): + candidate = start_date + timedelta(days=offset) + hour = _next_free_hour(candidate, wp_occupied) + if hour is not None: + return candidate, hour + + return tomorrow, _preferred_hours()[0] if _preferred_hours() else 9 + + +def suggest_publish_slot() -> str: + """Return a suggested publish datetime string (CET) for the next free slot.""" + wp_occupied = _fetch_wp_occupied_slots() + result = _find_next_free_slot(wp_occupied) + if result: + d, hour = result + return _format_slot(d, hour) + tomorrow = _today_cet() + timedelta(days=1) + return _format_slot(tomorrow, _preferred_hours()[0] if _preferred_hours() else 9) def reserve_publish_slot(article_id: int) -> str: """Reserve a publish slot for an article and persist it in the DB. - Returns the suggested publish datetime string. + If the article already has a scheduled_publish_at, keep it unchanged. + Returns the formatted publish datetime string. """ - today = _today_cet() - lookahead_days = 14 - weekday_names = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"] + # Check if already has a slot + with get_conn() as conn: + row = conn.execute( + "SELECT scheduled_publish_at FROM articles WHERE id = ?", + (article_id,), + ).fetchone() + existing_slot = row["scheduled_publish_at"] if row else None + if existing_slot: + try: + dt = datetime.fromisoformat(existing_slot) + return _format_slot(dt.date(), dt.hour) + except Exception: + pass # invalid slot, re-assign below - for offset in range(1, lookahead_days + 1): - candidate = today + timedelta(days=offset) - hour = _next_free_hour(candidate) - if hour is not None: - # Reserve this slot by writing to the article - iso_ts = f"{candidate.isoformat()}T{hour:02d}:00:00" - with get_conn() as conn: - conn.execute( - "UPDATE articles SET scheduled_publish_at = ? WHERE id = ?", - (iso_ts, article_id), - ) - wd = weekday_names[candidate.weekday()] - return f"{wd}, {candidate.strftime('%d.%m.%Y')} um {hour:02d}:00 Uhr" + wp_occupied = _fetch_wp_occupied_slots() + result = _find_next_free_slot(wp_occupied, lookahead_days=30) + if result: + candidate, hour = result + else: + candidate = _today_cet() + timedelta(days=1) + hours = _preferred_hours() + hour = hours[0] if hours else 9 - # Fallback - tomorrow = today + timedelta(days=1) - hours = _preferred_hours() - h = hours[0] if hours else 9 - iso_ts = f"{tomorrow.isoformat()}T{h:02d}:00:00" + iso_ts = f"{candidate.isoformat()}T{hour:02d}:00:00" with get_conn() as conn: conn.execute( "UPDATE articles SET scheduled_publish_at = ? WHERE id = ?", (iso_ts, article_id), ) - wd = weekday_names[tomorrow.weekday()] - return f"{wd}, {tomorrow.strftime('%d.%m.%Y')} um {h:02d}:00 Uhr" + return _format_slot(candidate, hour) From 94bd93a18a4206ce38dc0a0adcdff3c2ae350e26 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Wed, 8 Apr 2026 09:34:27 +0000 Subject: [PATCH 78/87] fix(scheduler): fill schedule gaps instead of always appending to end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously the scheduler started searching from the last scheduled post date, skipping all free slots in between (e.g. a free slot on Apr 20 would be ignored if the last post was on May 18). Now starts scanning from tomorrow, finding the first available slot regardless of whether earlier dates have gaps — fills the calendar naturally. Also extended lookahead from 30 to 60 days. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/scheduler.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/app/scheduler.py b/backend/app/scheduler.py index a92ba08..a1028fc 100644 --- a/backend/app/scheduler.py +++ b/backend/app/scheduler.py @@ -146,17 +146,18 @@ def _format_slot(d: date, hour: int) -> str: def _find_next_free_slot( - wp_occupied: set[tuple[str, int]], lookahead_days: int = 30 + wp_occupied: set[tuple[str, int]], lookahead_days: int = 60 ) -> tuple[date, int] | None: - """Find the next free (date, hour) slot, anchored after the last scheduled article.""" + """Find the next free (date, hour) slot. + + Starts from tomorrow and scans forward, filling any gaps in the schedule + rather than always appending after the last existing post. + """ today = _today_cet() tomorrow = today + timedelta(days=1) - last_date = _get_last_future_scheduled_date(wp_occupied) - start_date = last_date if (last_date and last_date >= tomorrow) else tomorrow - for offset in range(0, lookahead_days + 1): - candidate = start_date + timedelta(days=offset) + candidate = tomorrow + timedelta(days=offset) hour = _next_free_hour(candidate, wp_occupied) if hour is not None: return candidate, hour From 09dcf6ce368079df10dbbc5749c901e806f32f69 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Wed, 8 Apr 2026 09:42:02 +0000 Subject: [PATCH 79/87] feat(pipeline): add two-stage article quality gate (min word count) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stage 1 (before OpenAI rewrite): reject if raw content < pipeline_min_words_raw (default 120) Stage 2 (after rewrite): reject if rewritten text < pipeline_min_words_rewritten (default 150) Both stages set status='error' with a descriptive note and skip WP draft creation. The reserved publish slot is released so it stays available for the next article. Quality rejections don't abort the pipeline — processing continues with the next article. New config settings (overridable via .env): PIPELINE_MIN_WORDS_RAW=120 PIPELINE_MIN_WORDS_REWRITTEN=150 Co-Authored-By: Claude Sonnet 4.6 --- backend/app/config.py | 2 ++ backend/app/pipeline.py | 35 ++++++++++++++++++++++++++++++++++- backend/app/scheduler.py | 9 +++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/backend/app/config.py b/backend/app/config.py index d56ce11..713669e 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -46,6 +46,8 @@ class Settings(BaseSettings): pipeline_relevance_warn: int = 60 # >= this: Telegram warning, else reject pipeline_max_drafts_per_day: int = 2 pipeline_publish_hours: str = "9,14" # comma-separated preferred publish hours (CET) + pipeline_min_words_raw: int = 120 # minimum words in raw content before rewrite (else reject) + pipeline_min_words_rewritten: int = 150 # minimum words in rewritten content (else reject) @lru_cache(maxsize=1) diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index 059ccf5..9cd9059 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -109,10 +109,35 @@ def _store_relevance(article_id: int, relevance: dict[str, Any]) -> None: def _do_rewrite_and_draft(article: dict[str, Any]) -> tuple[int, str | None]: """Rewrite article and create WP draft. Returns (wp_post_id, wp_post_url).""" article_id = int(article["id"]) + settings = get_settings() + + # ── Quality gate 1: raw content length ────────────────────────────────── + import re as _re + raw_text = _re.sub(r"<[^>]+>", " ", article.get("content_raw") or "") + raw_words = len(raw_text.split()) + if raw_words < settings.pipeline_min_words_raw: + note = ( + f"Zu wenig Rohinhalt: {raw_words} Wörter " + f"(Minimum: {settings.pipeline_min_words_raw})" + ) + logger.warning("_do_rewrite_and_draft #%d: %s — überspringe", article_id, note) + update_article_status(article_id, "error", actor="pipeline", note=note) + raise ValueError(note) # Rewrite - logger.info("_do_rewrite_and_draft #%d: starte OpenAI-Rewrite", article_id) + logger.info("_do_rewrite_and_draft #%d: starte OpenAI-Rewrite (%d Roh-Wörter)", article_id, raw_words) rewritten = rewrite_article_text(article) + + # ── Quality gate 2: rewritten content length ───────────────────────────── + rewritten_words = len(rewritten.split()) + if rewritten_words < settings.pipeline_min_words_rewritten: + note = ( + f"Rewrite zu kurz: {rewritten_words} Wörter " + f"(Minimum: {settings.pipeline_min_words_rewritten})" + ) + logger.warning("_do_rewrite_and_draft #%d: %s — überspringe", article_id, note) + update_article_status(article_id, "error", actor="pipeline", note=note) + raise ValueError(note) logger.info("_do_rewrite_and_draft #%d: Rewrite fertig (%d Wörter), generiere Tags", article_id, len(rewritten.split())) tags: list[str] = [] try: @@ -342,6 +367,14 @@ def _process_article(article: dict[str, Any], stats: PipelineStats, settings: An except Exception as exc: logger.warning("Telegram draft-Benachrichtigung für #%d fehlgeschlagen: %s", article_id, exc) + except ValueError as exc: + # Quality gate rejection (too short etc.) — status already set in _do_rewrite_and_draft + # Release the reserved slot so it's available for the next article + from .scheduler import release_publish_slot + release_publish_slot(article_id) + stats.rejected_articles.append(get_article_by_id(article_id) or {}) + logger.info("Artikel #%d wegen Qualitätsprüfung abgelehnt: %s", article_id, exc) + except Exception as exc: logger.error("Draft-Erstellung für #%d fehlgeschlagen: %s", article_id, exc) update_article_status(article_id, "error", actor="pipeline", note=f"Draft-Fehler: {exc}") diff --git a/backend/app/scheduler.py b/backend/app/scheduler.py index a1028fc..0ec38d8 100644 --- a/backend/app/scheduler.py +++ b/backend/app/scheduler.py @@ -165,6 +165,15 @@ def _find_next_free_slot( return tomorrow, _preferred_hours()[0] if _preferred_hours() else 9 +def release_publish_slot(article_id: int) -> None: + """Clear a previously reserved slot (e.g. when article is rejected after slot assignment).""" + with get_conn() as conn: + conn.execute( + "UPDATE articles SET scheduled_publish_at = NULL WHERE id = ?", + (article_id,), + ) + + def suggest_publish_slot() -> str: """Return a suggested publish datetime string (CET) for the next free slot.""" wp_occupied = _fetch_wp_occupied_slots() From 2d1dd14e45e83efd7a57d8e8efbaefcaeaa8a76f Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Thu, 9 Apr 2026 07:02:03 +0000 Subject: [PATCH 80/87] fix(pipeline): send individual Telegram notifications for quality gate rejections MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add individual Telegram message when an article is rejected by quality gate (too short raw content or rewritten text), so users see each rejection in real time instead of only in the bulk summary - Add quality_gate_rejected counter to PipelineStats and result dict - Show quality gate rejections separately in pipeline-done summary (✂️ Qualitätsprüfung: N) distinct from score-based rejections Co-Authored-By: Claude Sonnet 4.6 --- backend/app/pipeline.py | 15 ++++++++++++++- backend/app/telegram_bot.py | 5 ++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index 9cd9059..1ae1ff6 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -43,6 +43,7 @@ class PipelineStats: processed: int = 0 drafts_created: int = 0 rejected: int = 0 + quality_gate_rejected: int = 0 warnings: int = 0 errors: int = 0 no_image: int = 0 @@ -261,6 +262,7 @@ def run_auto_pipeline(trigger: str = "auto") -> dict[str, Any]: "processed": stats.processed, "drafts_created": stats.drafts_created, "rejected": stats.rejected, + "quality_gate_rejected": stats.quality_gate_rejected, "no_image": stats.no_image, "warnings": stats.warnings, "errors": stats.errors, @@ -372,8 +374,19 @@ def _process_article(article: dict[str, Any], stats: PipelineStats, settings: An # Release the reserved slot so it's available for the next article from .scheduler import release_publish_slot release_publish_slot(article_id) - stats.rejected_articles.append(get_article_by_id(article_id) or {}) + stats.quality_gate_rejected += 1 logger.info("Artikel #%d wegen Qualitätsprüfung abgelehnt: %s", article_id, exc) + # Individual Telegram notification for quality gate rejection + try: + title = (article.get("title") or "Ohne Titel")[:80] + tg.send_message( + f"✂️ Qualitätsprüfung nicht bestanden\n" + f"📰 {title}\n" + f"💯 Score: {score}/100\n" + f"⚠️ {exc}" + ) + except Exception as tg_exc: + logger.warning("Telegram QG-Benachrichtigung für #%d fehlgeschlagen: %s", article_id, tg_exc) except Exception as exc: logger.error("Draft-Erstellung für #%d fehlgeschlagen: %s", article_id, exc) diff --git a/backend/app/telegram_bot.py b/backend/app/telegram_bot.py index c92b009..880a49d 100644 --- a/backend/app/telegram_bot.py +++ b/backend/app/telegram_bot.py @@ -289,6 +289,7 @@ def notify_pipeline_done(stats: dict[str, Any]) -> None: processed = stats.get("processed", 0) drafts = stats.get("drafts_created", 0) rejected = stats.get("rejected", 0) + quality_gate_rejected = stats.get("quality_gate_rejected", 0) no_image = stats.get("no_image", 0) warnings = stats.get("warnings", 0) errors = stats.get("errors", 0) @@ -300,7 +301,9 @@ def notify_pipeline_done(stats: dict[str, Any]) -> None: f"📝 Drafts erstellt: {drafts}", ] if rejected: - lines.append(f"🚫 Abgelehnt: {rejected}") + lines.append(f"🚫 Abgelehnt (Score): {rejected}") + if quality_gate_rejected: + lines.append(f"✂️ Qualitätsprüfung: {quality_gate_rejected}") if no_image: lines.append(f"🖼️ Kein Bild: {no_image}") if warnings: From cf2d826c8a2fc6112453b91e7eae4d68020e9f54 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 10 Apr 2026 08:22:26 +0000 Subject: [PATCH 81/87] fix(scheduler,pipeline): fix WP auth attribute name and release slot on hard errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scheduler: use wordpress_app_password (not wordpress_password) so _fetch_wp_occupied_slots() can actually authenticate against the WP REST API — previously always returned empty set silently - pipeline: release reserved publish slot when draft creation fails with a non-ValueError exception (e.g. WP API error), preventing permanently blocked slots on failed articles Co-Authored-By: Claude Sonnet 4.6 --- backend/app/pipeline.py | 3 +++ backend/app/scheduler.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index 1ae1ff6..d9766ae 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -391,6 +391,9 @@ def _process_article(article: dict[str, Any], stats: PipelineStats, settings: An except Exception as exc: logger.error("Draft-Erstellung für #%d fehlgeschlagen: %s", article_id, exc) update_article_status(article_id, "error", actor="pipeline", note=f"Draft-Fehler: {exc}") + # Release reserved slot so it's not permanently blocked by a failed article + from .scheduler import release_publish_slot + release_publish_slot(article_id) raise diff --git a/backend/app/scheduler.py b/backend/app/scheduler.py index 0ec38d8..ff5cecf 100644 --- a/backend/app/scheduler.py +++ b/backend/app/scheduler.py @@ -45,7 +45,7 @@ def _fetch_wp_occupied_slots() -> set[tuple[str, int]]: settings = get_settings() try: auth = base64.b64encode( - f"{settings.wordpress_username}:{settings.wordpress_password}".encode() + f"{settings.wordpress_username}:{settings.wordpress_app_password}".encode() ).decode() url = ( f"{settings.wordpress_base_url}/wp-json/wp/v2/posts" From 8676ace1026347491e186428db9788ecf2b5a244 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 10 Apr 2026 08:44:28 +0000 Subject: [PATCH 82/87] feat(pipeline): article age filter, image URL validation, schedule UI, retry button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Article age filter (ingestion.py + config.py): - New setting pipeline_max_article_age_days=7 (0 = no limit) - Skip RSS entries older than N days before expensive extract_article() - Prevents old articles from Google Alerts re-entering pipeline 2. Image URL pre-validation (ingestion.py): - HEAD request probe for each primary image candidate during ingestion - Falls back to next-best candidate if primary returns 4xx - Network errors treated as OK to avoid false negatives on flaky servers 3. Stale WP draft cleanup (pipeline.py): - Quality gate rejections now delete any pre-existing WP draft (wp_post_id) - Prevents orphaned drafts when re-running articles that previously had drafts 4. Schedule overview UI (scheduler.py + admin_ui.py + admin_schedule.html): - New /admin/schedule page showing calendar grid of all booked slots - Distinguishes Pipeline-DB slots from WordPress-only slots - Link added to dashboard navigation 5. Retry for failed articles (admin_ui.py + admin_dashboard.html): - New POST /admin/articles/{id}/retry endpoint: resets to 'new', releases slot - '🔄 Wiederholen' button shown in dashboard for all 'close' (error) articles Co-Authored-By: Claude Sonnet 4.6 --- backend/app/admin_ui.py | 72 +++++++++++++ backend/app/config.py | 1 + backend/app/ingestion.py | 62 +++++++++++- backend/app/pipeline.py | 9 ++ backend/app/scheduler.py | 66 ++++++++++++ backend/templates/admin_dashboard.html | 6 ++ backend/templates/admin_schedule.html | 133 +++++++++++++++++++++++++ 7 files changed, 344 insertions(+), 5 deletions(-) create mode 100644 backend/templates/admin_schedule.html diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index 689efce..26085ff 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -929,3 +929,75 @@ def admin_transition_article(request: Request, article_id: int, target_status: s update_article_status(article_id, target_internal, actor=user, note=note or None) return _dashboard_redirect(msg=f"Artikel #{article_id}: {current_ui} -> {target_ui}") return _dashboard_redirect(msg=f"Ungueltiger Statuswechsel fuer Artikel #{article_id}", msg_type="error") + + +@router.post("/admin/articles/{article_id}/retry") +def admin_retry_article(request: Request, article_id: int): + """Reset a failed article to 'new' so the pipeline picks it up on next run.""" + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + article = get_article_by_id(article_id) + if not article: + return _dashboard_redirect(msg=f"Artikel #{article_id} nicht gefunden", msg_type="error") + + from .scheduler import release_publish_slot + release_publish_slot(article_id) + update_article_status(article_id, "new", actor=user, note="Manuell zurückgesetzt für erneuten Pipeline-Versuch") + return _dashboard_redirect( + msg=f"Artikel #{article_id} wurde auf 'neu' zurückgesetzt und wird beim nächsten Pipeline-Lauf verarbeitet", + status_filter="close", + ) + + +@router.get("/admin/schedule", response_class=HTMLResponse) +def admin_schedule(request: Request): + """Schedule overview: all booked slots from DB and WordPress.""" + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + from .scheduler import get_schedule_overview, _preferred_hours, _today_cet + from datetime import timedelta + + slots = get_schedule_overview(lookahead_days=60) + today = _today_cet() + hours = _preferred_hours() + + # Build a calendar grid: for each day in the next 60 days, show each preferred hour slot + booked: dict[tuple[str, int], dict] = {(s["date"], s["hour"]): s for s in slots} + calendar_days = [] + for offset in range(0, 61): + d = today + timedelta(days=offset) + d_str = d.isoformat() + day_slots = [] + for h in hours: + key = (d_str, h) + day_slots.append({ + "hour": h, + "booked": key in booked, + "slot": booked.get(key), + }) + calendar_days.append({ + "date": d_str, + "date_fmt": d.strftime("%d.%m.%Y"), + "weekday": ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"][d.weekday()], + "slots": day_slots, + "any_booked": any(s["booked"] for s in day_slots), + }) + + return templates.TemplateResponse( + request, + "admin_schedule.html", + { + "request": request, + "title": "Veröffentlichungsplan", + "user": user, + "slots": slots, + "calendar_days": calendar_days, + "hours": hours, + "flash_msg": request.query_params.get("msg", ""), + "flash_type": request.query_params.get("type", "success"), + }, + ) diff --git a/backend/app/config.py b/backend/app/config.py index 713669e..24c3902 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -48,6 +48,7 @@ class Settings(BaseSettings): pipeline_publish_hours: str = "9,14" # comma-separated preferred publish hours (CET) pipeline_min_words_raw: int = 120 # minimum words in raw content before rewrite (else reject) pipeline_min_words_rewritten: int = 150 # minimum words in rewritten content (else reject) + pipeline_max_article_age_days: int = 7 # skip articles older than N days during ingestion (0 = no limit) @lru_cache(maxsize=1) diff --git a/backend/app/ingestion.py b/backend/app/ingestion.py index 30140ca..391af92 100644 --- a/backend/app/ingestion.py +++ b/backend/app/ingestion.py @@ -1,13 +1,15 @@ from __future__ import annotations from dataclasses import dataclass -from datetime import datetime, timezone +from datetime import datetime, timedelta, timezone import hashlib import json import re import time from typing import Any from urllib.parse import unquote, urlencode, urlparse, parse_qs +import urllib.error +import urllib.request as _urllib_req import feedparser @@ -119,6 +121,26 @@ def _normalize_tokens(text: str) -> set[str]: return {token for token in normalized.split() if len(token) >= 4} +def _probe_image_url(url: str, timeout: int = 5) -> bool: + """Return True if URL responds without a 4xx/5xx error (HEAD request). + + Returns True on network/connection errors so that a flaky server does not + cause a valid image to be silently dropped. + """ + try: + req = _urllib_req.Request( + url, + method="HEAD", + headers={"User-Agent": "Mozilla/5.0 (compatible; rss-news/1.0)"}, + ) + with _urllib_req.urlopen(req, timeout=timeout) as resp: + return resp.status < 400 + except urllib.error.HTTPError as exc: + return exc.code < 400 # 3xx redirects are OK; 4xx/5xx are not + except Exception: + return True # network error → don't filter, let WP try later + + def _rank_image_candidates(source_url: str, title: str, images: list[str]) -> list[dict[str, Any]]: source_host = (urlparse(source_url).hostname or "").lower() is_presseportal = "presseportal.de" in source_host @@ -184,10 +206,25 @@ def _select_relevant_images(source_url: str, title: str, images: list[str], max_ deduped.append(image) ranked = _rank_image_candidates(source_url, title, deduped) - kept = [item["url"] for item in ranked if item["score"] > 0][:max_keep] - if not kept and ranked: - kept = [ranked[0]["url"]] - primary = kept[0] if kept else None + candidates = [item["url"] for item in ranked if item["score"] > -100] + + # Probe top candidates (max 4) to skip definitively broken URLs (HTTP 4xx). + # Network errors are treated as OK to avoid false negatives on flaky servers. + primary = None + kept: list[str] = [] + for url in candidates[:4]: + if _probe_image_url(url): + if primary is None: + primary = url + kept.append(url) + if len(kept) >= max_keep: + break + + # Fallback: if all probes failed with network errors, use best candidate anyway + if not kept and candidates: + primary = candidates[0] + kept = candidates[:max_keep] + return kept, primary, ranked @@ -265,12 +302,27 @@ def run_ingestion(feed_id: int | None = None) -> IngestionStats: feed_entries_seen = 0 feed_upserts = 0 + from .config import get_settings as _get_settings + _max_age_days = _get_settings().pipeline_max_article_age_days for entry in _parsed_get(parsed, "entries", []): entries_seen += 1 feed_entries_seen += 1 link = entry.get("link") if not link: continue + + # Age filter: skip articles older than max_age_days (0 = no limit) + if _max_age_days > 0: + published_iso = _entry_published_iso(entry) + if published_iso: + try: + published_dt = datetime.fromisoformat(published_iso) + age = datetime.now(timezone.utc) - published_dt + if age > timedelta(days=_max_age_days): + continue + except Exception: + pass # can't parse date → allow through + # Resolve Google redirect URLs (google.com/url?...&url=&...) link = _resolve_google_redirect(link) # Normalize AMP/tracking params (e.g. ?outputType=valid_amp) diff --git a/backend/app/pipeline.py b/backend/app/pipeline.py index d9766ae..93a251b 100644 --- a/backend/app/pipeline.py +++ b/backend/app/pipeline.py @@ -374,6 +374,15 @@ def _process_article(article: dict[str, Any], stats: PipelineStats, settings: An # Release the reserved slot so it's available for the next article from .scheduler import release_publish_slot release_publish_slot(article_id) + # Clean up any stale WP draft from a previous pipeline run + stale = get_article_by_id(article_id) + if stale and stale.get("wp_post_id"): + try: + from .wordpress import delete_wp_post + delete_wp_post(int(stale["wp_post_id"])) + logger.info("Artikel #%d: veralteten WP-Draft #%s gelöscht", article_id, stale["wp_post_id"]) + except Exception as del_exc: + logger.warning("Artikel #%d: WP-Draft konnte nicht gelöscht werden: %s", article_id, del_exc) stats.quality_gate_rejected += 1 logger.info("Artikel #%d wegen Qualitätsprüfung abgelehnt: %s", article_id, exc) # Individual Telegram notification for quality gate rejection diff --git a/backend/app/scheduler.py b/backend/app/scheduler.py index ff5cecf..8f8d498 100644 --- a/backend/app/scheduler.py +++ b/backend/app/scheduler.py @@ -165,6 +165,72 @@ def _find_next_free_slot( return tomorrow, _preferred_hours()[0] if _preferred_hours() else 9 +def get_schedule_overview(lookahead_days: int = 60) -> list[dict]: + """Return all booked scheduling slots (DB + WP) for the next N days, sorted by date.""" + today = _today_cet() + hours = _preferred_hours() + + # Slots booked in local DB + with get_conn() as conn: + rows = conn.execute( + """ + SELECT id, title, status, wp_post_id, wp_post_url, scheduled_publish_at + FROM articles + WHERE scheduled_publish_at IS NOT NULL + AND scheduled_publish_at >= ? + AND status NOT IN ('error', 'no_image') + ORDER BY scheduled_publish_at + """, + (today.isoformat() + "T00:00:00",), + ).fetchall() + + db_slots: dict[tuple[str, int], dict] = {} + for row in rows: + try: + dt = datetime.fromisoformat(row["scheduled_publish_at"]) + key = (dt.date().isoformat(), dt.hour) + db_slots[key] = { + "date": dt.date().isoformat(), + "hour": dt.hour, + "formatted": _format_slot(dt.date(), dt.hour), + "source": "db", + "article_id": row["id"], + "article_title": row["title"], + "article_status": row["status"], + "wp_post_id": row["wp_post_id"], + "wp_post_url": row["wp_post_url"], + } + except Exception: + pass + + # Slots occupied in WordPress but not in local DB + wp_occupied = _fetch_wp_occupied_slots() + wp_only: list[dict] = [] + for d_str, h in sorted(wp_occupied): + if (d_str, h) in db_slots: + continue + try: + d = date.fromisoformat(d_str) + if d >= today: + wp_only.append({ + "date": d_str, + "hour": h, + "formatted": _format_slot(d, h), + "source": "wordpress", + "article_id": None, + "article_title": "(WP-Beitrag außerhalb Pipeline)", + "article_status": None, + "wp_post_id": None, + "wp_post_url": None, + }) + except Exception: + pass + + all_slots = list(db_slots.values()) + wp_only + all_slots.sort(key=lambda s: (s["date"], s["hour"])) + return all_slots + + def release_publish_slot(article_id: int) -> None: """Clear a previously reserved slot (e.g. when article is rejected after slot assignment).""" with get_conn() as conn: diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index 15f3daf..67738c7 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -13,6 +13,7 @@

          Angemeldet als {{ user }}

          + Veröffentlichungsplan Connectivity Check
          @@ -330,6 +331,11 @@ keine Aktion {% endif %} + {% if a.status_ui == 'close' %} +
          + + + {% endif %} {% endfor %} diff --git a/backend/templates/admin_schedule.html b/backend/templates/admin_schedule.html new file mode 100644 index 0000000..f585b00 --- /dev/null +++ b/backend/templates/admin_schedule.html @@ -0,0 +1,133 @@ + + + + + + {{ title }} + + + + +
          +
          +

          rss-news Veröffentlichungsplan

          +

          Angemeldet als {{ user }}

          +
          +
          + Dashboard + Connectivity +
          + + +
          +
          + +
          + {% if flash_msg %} +
          + {{ flash_msg }} +
          + {% endif %} + +
          +

          Slot-Übersicht (nächste 60 Tage)

          +
          + 📅 Belegte Slots gesamt: {{ slots|length }} + 🗄️ Aus Pipeline-DB: {{ slots|selectattr('source', 'eq', 'db')|list|length }} + 🌐 Nur in WordPress: {{ slots|selectattr('source', 'eq', 'wordpress')|list|length }} +
          +

        + + + + {% for h in hours %} + + {% endfor %} + + + + {% for day in calendar_days %} + {% if day.any_booked %} + + + {% for s in day.slots %} + + {% endfor %} + + {% endif %} + {% endfor %} + +
        Tag{{ "%02d:00 Uhr"|format(h) }}
        {{ day.weekday }} {{ day.date_fmt }} + {% if s.booked %} + {% set info = s.slot %} + {% if info.source == 'db' %} + + DB +
        + {% if info.article_id %} + + {{ (info.article_title or "Artikel")[:50] }}{% if (info.article_title or "")|length > 50 %}…{% endif %} + + {% endif %} +
        Status: {{ info.article_status }} + {% if info.wp_post_url %} +
        WP öffnen + {% endif %} +
        + {% else %} + ⚠️ + WP +
        {{ info.article_title }}
        + {% endif %} + {% else %} + frei + {% endif %} +
        + {% if not slots %} +

        Keine geplanten Beiträge in den nächsten 60 Tagen.

        + {% endif %} +
        + +
        +

        Alle belegten Slots (Liste)

        + + + + + + {% for s in slots %} + + + + + + + + {% endfor %} + +
        Datum/ZeitQuelleArtikelStatusWordPress
        {{ s.formatted }} + {% if s.source == 'db' %}Pipeline-DB + {% else %}WordPress{% endif %} + + {% if s.article_id %} + {{ (s.article_title or "")[:60] }} + {% else %} + {{ s.article_title or "-" }} + {% endif %} + {{ s.article_status or "-" }} + {% if s.wp_post_url %} + Draft öffnen + {% else %}-{% endif %} +
        +
        + + + From 2d02b56b65e35a15a5ba1770b869db4cc8cd8de5 Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 10 Apr 2026 08:53:44 +0000 Subject: [PATCH 83/87] =?UTF-8?q?feat(admin):=20WordPress=E2=86=92DB=20syn?= =?UTF-8?q?c=20for=20scheduled=20slots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds sync_db_from_wordpress() that treats WordPress as source of truth: - future posts: update scheduled_publish_at to WP's actual date - draft posts: clear scheduled_publish_at (not yet scheduled) - published posts: mark article as 'published' in DB - trashed/deleted posts: clear wp_post_id + wp_post_url + slot so article can be re-processed Exposed via POST /admin/wp-sync with a sync button on the schedule page. Run after any manual rescheduling in WordPress to bring DB back in sync. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/admin_ui.py | 22 +++++ backend/app/wordpress.py | 128 ++++++++++++++++++++++++++ backend/templates/admin_schedule.html | 10 ++ 3 files changed, 160 insertions(+) diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index 26085ff..51c2377 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -931,6 +931,28 @@ def admin_transition_article(request: Request, article_id: int, target_status: s return _dashboard_redirect(msg=f"Ungueltiger Statuswechsel fuer Artikel #{article_id}", msg_type="error") +@router.post("/admin/wp-sync") +def admin_wp_sync(request: Request): + """Sync scheduled_publish_at and WP references in the DB from WordPress.""" + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + try: + from .wordpress import sync_db_from_wordpress + stats = sync_db_from_wordpress() + msg = ( + f"WP-Sync abgeschlossen: " + f"{stats['slot_updated']} Slots aktualisiert, " + f"{stats['slot_cleared_draft']} Slots geleert (Draft), " + f"{stats['marked_published']} als veröffentlicht markiert, " + f"{stats['wp_reference_cleared']} WP-Referenzen gelöscht (Papierkorb), " + f"{stats['already_in_sync']} bereits synchron." + ) + return RedirectResponse(url=f"/admin/schedule?msg={msg}&type=success", status_code=303) + except Exception as exc: + return RedirectResponse(url=f"/admin/schedule?msg=Sync fehlgeschlagen: {exc}&type=error", status_code=303) + + @router.post("/admin/articles/{article_id}/retry") def admin_retry_article(request: Request, article_id: int): """Reset a failed article to 'new' so the pipeline picks it up on next run.""" diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py index cced743..bb96198 100644 --- a/backend/app/wordpress.py +++ b/backend/app/wordpress.py @@ -559,3 +559,131 @@ def delete_wp_post(wp_post_id: int) -> None: method="DELETE", endpoint=f"posts/{wp_post_id}?force=true", ) + + +def sync_db_from_wordpress() -> dict[str, Any]: + """Sync scheduled_publish_at and wp_post_url in the DB from WordPress. + + WordPress is treated as the source of truth for scheduling. + For each DB article that has a wp_post_id: + - If WP post exists as 'future': update scheduled_publish_at to WP date. + - If WP post exists as 'draft': clear scheduled_publish_at (not yet scheduled). + - If WP post exists as 'publish': mark article as published in DB. + - If WP post is trashed/deleted (404 or trash status): clear wp_post_id, + wp_post_url, and scheduled_publish_at so the article can be re-processed. + Returns a stats dict with counts of each action taken. + """ + from .db import get_conn + + settings = get_settings() + if not settings.wordpress_base_url or not settings.wordpress_username or not settings.wordpress_app_password: + raise RuntimeError("WordPress Konfiguration fehlt") + auth = _auth_header(settings.wordpress_username, settings.wordpress_app_password) + base_url = settings.wordpress_base_url.rstrip("/") + + # Fetch all future + draft + published WP posts in one pass (up to 300 per status) + wp_posts: dict[int, dict] = {} + for status in ("future", "draft", "publish"): + for page in range(1, 4): # max 300 per status + try: + result = _wp_request( + base_url=base_url, + auth_header=auth, + method="GET", + endpoint=f"posts?status={status}&per_page=100&page={page}&_fields=id,date,status,link", + ) + except Exception: + break + if not isinstance(result, list) or not result: + break + for post in result: + try: + wp_posts[int(post["id"])] = post + except Exception: + pass + if len(result) < 100: + break + + # Load all DB articles that have a wp_post_id + with get_conn() as conn: + rows = conn.execute( + """ + SELECT id, wp_post_id, wp_post_url, scheduled_publish_at, status + FROM articles + WHERE wp_post_id IS NOT NULL + AND status NOT IN ('no_image') + ORDER BY id + """ + ).fetchall() + + stats: dict[str, int] = { + "total_db_articles": len(rows), + "wp_posts_found": len(wp_posts), + "slot_updated": 0, + "slot_cleared_draft": 0, + "marked_published": 0, + "wp_reference_cleared": 0, + "already_in_sync": 0, + } + + for row in rows: + article_id = row["id"] + wp_post_id = int(row["wp_post_id"]) + wp_post = wp_posts.get(wp_post_id) + + if wp_post is None: + # Post not found in future/draft/publish — likely trashed or deleted + # Clear wp reference so article can be re-processed if needed + with get_conn() as conn: + conn.execute( + """UPDATE articles + SET wp_post_id = NULL, wp_post_url = NULL, scheduled_publish_at = NULL + WHERE id = ?""", + (article_id,), + ) + stats["wp_reference_cleared"] += 1 + continue + + wp_status = wp_post.get("status", "") + wp_date = wp_post.get("date", "") # local CET datetime, e.g. "2026-05-05T09:00:00" + wp_link = wp_post.get("link") or row["wp_post_url"] + + if wp_status == "publish": + # Already published in WP — mark as published in DB if not already + if row["status"] != "published": + with get_conn() as conn: + conn.execute( + "UPDATE articles SET status = 'published', wp_post_url = ? WHERE id = ?", + (wp_link, article_id), + ) + stats["marked_published"] += 1 + else: + stats["already_in_sync"] += 1 + + elif wp_status == "future": + # Scheduled — sync the date into scheduled_publish_at + current_slot = row["scheduled_publish_at"] or "" + # WP returns e.g. "2026-05-05T09:00:00" — compare ignoring seconds + if current_slot[:16] != wp_date[:16]: + with get_conn() as conn: + conn.execute( + "UPDATE articles SET scheduled_publish_at = ?, wp_post_url = ? WHERE id = ?", + (wp_date, wp_link, article_id), + ) + stats["slot_updated"] += 1 + else: + stats["already_in_sync"] += 1 + + elif wp_status == "draft": + # Draft without a schedule — clear scheduled_publish_at if set + if row["scheduled_publish_at"]: + with get_conn() as conn: + conn.execute( + "UPDATE articles SET scheduled_publish_at = NULL WHERE id = ?", + (article_id,), + ) + stats["slot_cleared_draft"] += 1 + else: + stats["already_in_sync"] += 1 + + return stats diff --git a/backend/templates/admin_schedule.html b/backend/templates/admin_schedule.html index f585b00..4f2513a 100644 --- a/backend/templates/admin_schedule.html +++ b/backend/templates/admin_schedule.html @@ -37,6 +37,16 @@ {% endif %} +
        +
        +

        WordPress → DB Synchronisieren

        +

        Liest alle geplanten WP-Beiträge und aktualisiert die Slots in der lokalen DB.
        Nutze dies nach manuellen Änderungen in WordPress.

        +
        +
        + +
        +
        +

        Slot-Übersicht (nächste 60 Tage)

        From cdcf441daf9dfba08187df602e2e854621588cea Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 10 Apr 2026 09:00:25 +0000 Subject: [PATCH 84/87] feat(admin): bulk-editable article list with WP ID inline editing - New /admin/article-list: paginated (50/page) table with thumbnail, title, excerpt (120 chars), status, scheduled date, and WP ID input - Sticky save bar with live change counter (JS tracks modified inputs, highlights changed cells in amber, disables save when nothing changed) - POST /admin/article-list/update: saves only changed WP IDs in one request; clears stale wp_post_url so WP-Sync repopulates it cleanly - Filter by status + free-text search (title or article ID) - Pagination with page/filter state preserved through save redirects - repositories: add list_articles_page() (offset + search) and bulk_update_wp_post_ids() - Dashboard nav: add Artikelliste link Co-Authored-By: Claude Sonnet 4.6 --- backend/app/admin_ui.py | 101 ++++++++++ backend/app/repositories.py | 61 ++++++ backend/templates/admin_article_list.html | 221 ++++++++++++++++++++++ backend/templates/admin_dashboard.html | 1 + 4 files changed, 384 insertions(+) create mode 100644 backend/templates/admin_article_list.html diff --git a/backend/app/admin_ui.py b/backend/app/admin_ui.py index 51c2377..a25199c 100644 --- a/backend/app/admin_ui.py +++ b/backend/app/admin_ui.py @@ -33,6 +33,8 @@ from .repositories import ( get_article_by_id, get_feed_by_id, list_articles, + list_articles_page, + bulk_update_wp_post_ids, list_feeds, list_publish_jobs, list_runs, @@ -931,6 +933,105 @@ def admin_transition_article(request: Request, article_id: int, target_status: s return _dashboard_redirect(msg=f"Ungueltiger Statuswechsel fuer Artikel #{article_id}", msg_type="error") +_PAGE_SIZE = 50 + + +@router.get("/admin/article-list", response_class=HTMLResponse) +def admin_article_list(request: Request): + """Paginated article list with inline WP ID editing.""" + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + page = max(1, int(request.query_params.get("page", 1))) + status_filter = request.query_params.get("status_filter", "") or None + search = request.query_params.get("search", "").strip() or None + offset = (page - 1) * _PAGE_SIZE + + articles, total = list_articles_page( + limit=_PAGE_SIZE, offset=offset, + status_filter=status_filter, search=search, + ) + + # Enrich each article with thumbnail URL + for a in articles: + meta = _parse_meta_json(a.get("meta_json")) + image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {} + sel = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None + if not sel: + sel = (meta.get("extraction") or {}).get("image_selection", {}).get("primary") + a["thumb_url"] = sel + a["thumb_proxy"] = f"/admin/images/proxy?{urlencode({'url': sel})}" if sel else None + raw = (a.get("content_raw") or a.get("summary") or "").strip() + a["excerpt"] = raw[:120] + "…" if len(raw) > 120 else raw + + total_pages = max(1, (total + _PAGE_SIZE - 1) // _PAGE_SIZE) + + return templates.TemplateResponse( + request, + "admin_article_list.html", + { + "request": request, + "title": "Artikelliste", + "user": user, + "articles": articles, + "page": page, + "total_pages": total_pages, + "total": total, + "page_size": _PAGE_SIZE, + "status_filter": status_filter or "", + "search": search or "", + "flash_msg": request.query_params.get("msg", ""), + "flash_type": request.query_params.get("type", "success"), + }, + ) + + +@router.post("/admin/article-list/update") +async def admin_article_list_update(request: Request): + """Bulk update WP post IDs from the article list form.""" + user = _admin_user(request) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + form = await request.form() + updates: list[tuple[int, int | None]] = [] + + # Form fields: wp_ = new value, orig_ = original value + for key, new_val in form.items(): + if not key.startswith("wp_"): + continue + try: + article_id = int(key[3:]) + except ValueError: + continue + orig_val = str(form.get(f"orig_{article_id}", "")).strip() + new_val_s = str(new_val).strip() + if new_val_s == orig_val: + continue # unchanged + new_wp_id = int(new_val_s) if new_val_s else None + updates.append((article_id, new_wp_id)) + + if updates: + count = bulk_update_wp_post_ids(updates) + msg = f"{count} WP-ID(s) aktualisiert. Bitte jetzt WP-Sync ausführen um Slots & URLs zu aktualisieren." + msg_type = "success" + else: + msg = "Keine Änderungen erkannt." + msg_type = "success" + + # Preserve pagination/filter params from referer + page = form.get("page", "1") + status_filter = form.get("status_filter", "") + search = form.get("search", "") + qs: dict[str, str] = {"msg": msg, "type": msg_type, "page": page} + if status_filter: + qs["status_filter"] = status_filter + if search: + qs["search"] = search + return RedirectResponse(url=f"/admin/article-list?{urlencode(qs)}", status_code=303) + + @router.post("/admin/wp-sync") def admin_wp_sync(request: Request): """Sync scheduled_publish_at and WP references in the DB from WordPress.""" diff --git a/backend/app/repositories.py b/backend/app/repositories.py index 9556ed3..cf38055 100644 --- a/backend/app/repositories.py +++ b/backend/app/repositories.py @@ -757,6 +757,67 @@ def upsert_article(payload: ArticleUpsert) -> int: return int(existing_id) if existing_id else 0 +def list_articles_page( + limit: int = 50, + offset: int = 0, + status_filter: str | None = None, + search: str | None = None, +) -> tuple[list[dict[str, Any]], int]: + """Return (articles, total_count) with optional status filter and title search.""" + safe_limit = max(1, min(limit, 200)) + safe_offset = max(0, offset) + + conditions: list[str] = [] + params: list[Any] = [] + if status_filter: + conditions.append("a.status = ?") + params.append(status_filter) + if search: + conditions.append("(a.title LIKE ? OR a.id = ?)") + try: + params.extend([f"%{search}%", int(search)]) + except ValueError: + params.extend([f"%{search}%", -1]) + + where = f"WHERE {' AND '.join(conditions)}" if conditions else "" + select = """ + SELECT a.id, a.title, a.status, a.published_at, a.summary, a.content_raw, + a.meta_json, a.wp_post_id, a.wp_post_url, a.scheduled_publish_at, + a.word_count, f.name AS feed_name + FROM articles a + LEFT JOIN feeds f ON f.id = a.feed_id + """ + with get_conn() as conn: + total = conn.execute( + f"SELECT COUNT(*) FROM articles a {where}", params + ).fetchone()[0] + rows = conn.execute( + f"{select} {where} ORDER BY a.id DESC LIMIT ? OFFSET ?", + params + [safe_limit, safe_offset], + ).fetchall() + return rows_to_dicts(rows), total + + +def bulk_update_wp_post_ids(updates: list[tuple[int, int | None]]) -> int: + """Update wp_post_id (and clear stale wp_post_url) for multiple articles. + + Returns the number of rows actually updated. + Call sync_db_from_wordpress() afterwards to repopulate wp_post_url and + scheduled_publish_at from the live WordPress data. + """ + if not updates: + return 0 + updated = 0 + with get_conn() as conn: + for article_id, new_wp_id in updates: + conn.execute( + "UPDATE articles SET wp_post_id = ?, wp_post_url = NULL WHERE id = ?", + (new_wp_id, article_id), + ) + updated += 1 + return updated + + def list_articles(limit: int = 100, status_filter: str | None = None) -> list[dict[str, Any]]: safe_limit = max(1, min(limit, 500)) with get_conn() as conn: diff --git a/backend/templates/admin_article_list.html b/backend/templates/admin_article_list.html new file mode 100644 index 0000000..38bfb22 --- /dev/null +++ b/backend/templates/admin_article_list.html @@ -0,0 +1,221 @@ + + + + + + {{ title }} + + + + +
        +
        +

        Artikelliste

        +

        Angemeldet als {{ user }}

        +
        +
        + Dashboard + Veröffentlichungsplan +
        + +
        +
        +
        + +
        + {% if flash_msg %} +
        + {{ flash_msg }} +
        + {% endif %} + + +
        +
        +
        +
        + + +
        +
        + + +
        +
        + + Reset +
        +
        +
        +

        {{ total }} Artikel gesamt · Seite {{ page }} / {{ total_pages }} · {{ page_size }} pro Seite

        +
        + + +
        + + + + + + + +
        + + + + + + + + + + + + {% for a in articles %} + + + + + + + + {% endfor %} + +
        BildTitel & KurztextStatusDatumWP ID
        + {% if a.thumb_proxy %} + + Vorschau + + + {% else %} +
        🖼
        + {% endif %} +
        + + {% if a.excerpt %} +
        {{ a.excerpt }}
        + {% endif %} + {% if a.feed_name %} +
        📡 {{ a.feed_name }}
        + {% endif %} +
        + {{ a.status }} + + {% if a.scheduled_publish_at %} + 📅 {{ a.scheduled_publish_at[:16] }} + {% elif a.published_at %} + {{ a.published_at[:10] }} + {% else %} + — + {% endif %} + + + + + {% if a.wp_post_url %} + ↗ WP öffnen + {% endif %} +
        +
        +
        + + + +
        + + + + diff --git a/backend/templates/admin_dashboard.html b/backend/templates/admin_dashboard.html index 67738c7..0795b96 100644 --- a/backend/templates/admin_dashboard.html +++ b/backend/templates/admin_dashboard.html @@ -13,6 +13,7 @@

        Angemeldet als {{ user }}

        + Artikelliste Veröffentlichungsplan Connectivity Check
        From 1498fa715656aa55ae480236330233c0a79c007c Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Mon, 20 Apr 2026 06:20:20 +0000 Subject: [PATCH 85/87] chore: gitignore CLAUDE_CONTEXT.md (contains credentials) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fcbde33..3419386 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ internal/copy_files.sh internal/_line.txt internal/push_commit.txt internal/git.sh +CLAUDE_CONTEXT.md From 2456e4aca7cc9bce08ffb323dc969c00e4f9d9cd Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Mon, 20 Apr 2026 06:24:34 +0000 Subject: [PATCH 86/87] chore: gitignore CLAUDE.md instead of CLAUDE_CONTEXT.md --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3419386..aac3a2f 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,4 @@ internal/copy_files.sh internal/_line.txt internal/push_commit.txt internal/git.sh -CLAUDE_CONTEXT.md +CLAUDE.md From f7101418281dda8af138788d1c968413cece21da Mon Sep 17 00:00:00 2001 From: OliverGiertz Date: Fri, 8 May 2026 05:03:13 +0000 Subject: [PATCH 87/87] fix(scheduler): prevent duplicate slot assignment from concurrent pipeline runs Two bugs caused multiple articles to land on the same publish slot: 1. main.py: asyncio.create_task() returned immediately, allowing a second pipeline trigger (N8N + Telegram /run or two N8N calls) to start a second concurrent run. Added asyncio.Lock (_pipeline_lock) so any second trigger while the pipeline is running is rejected immediately. 2. scheduler.py: reserve_publish_slot() read the list of occupied slots and wrote the new slot in two separate DB connections. Concurrent threads could both see the same "free" slot before either committed its write. Fixed by wrapping the entire read-find-write cycle in a threading.Lock (_slot_lock) and a single DB connection, so the slot check and the slot assignment are atomic. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/main.py | 22 ++++++--- backend/app/scheduler.py | 103 ++++++++++++++++++++++++++++----------- 2 files changed, 90 insertions(+), 35 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index 264a2be..b4776af 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,8 +1,10 @@ +import asyncio from contextlib import asynccontextmanager import csv from datetime import datetime, timezone import io import json +import logging from pathlib import Path from fastapi import Depends, FastAPI, HTTPException, Request, Response, status @@ -637,20 +639,26 @@ def _require_api_key(request: Request) -> None: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Ungültiger API-Key") +_pipeline_lock = asyncio.Lock() + + @app.post("/api/n8n/pipeline") async def api_n8n_pipeline(request: Request) -> dict: """Trigger the full auto pipeline in background. Returns immediately. Called by N8N (2x/day or on demand). Results arrive via Telegram.""" _require_api_key(request) - import asyncio - import logging + + if _pipeline_lock.locked(): + logging.getLogger(__name__).warning("Pipeline bereits aktiv – Trigger ignoriert") + return {"ok": False, "message": "Pipeline läuft bereits – Trigger ignoriert"} async def _run(): - loop = asyncio.get_event_loop() - try: - await loop.run_in_executor(None, lambda: run_auto_pipeline(trigger="n8n")) - except Exception as exc: - logging.getLogger(__name__).error("Background pipeline error: %s", exc) + async with _pipeline_lock: + loop = asyncio.get_event_loop() + try: + await loop.run_in_executor(None, lambda: run_auto_pipeline(trigger="n8n")) + except Exception as exc: + logging.getLogger(__name__).error("Background pipeline error: %s", exc) asyncio.create_task(_run()) return {"ok": True, "message": "Pipeline gestartet – Ergebnisse kommen per Telegram"} diff --git a/backend/app/scheduler.py b/backend/app/scheduler.py index 8f8d498..d5ea5bf 100644 --- a/backend/app/scheduler.py +++ b/backend/app/scheduler.py @@ -11,6 +11,7 @@ from __future__ import annotations import base64 import json +import threading import urllib.request from datetime import date, datetime, timedelta, timezone from typing import Any @@ -18,6 +19,9 @@ from typing import Any from .config import get_settings from .db import get_conn +# Ensures that concurrent pipeline runs (two threads) never assign the same slot. +_slot_lock = threading.Lock() + # CET offset (UTC+1 winter / UTC+2 summer – fixed +1 for simplicity) _CET_OFFSET = timedelta(hours=1) @@ -256,34 +260,77 @@ def reserve_publish_slot(article_id: int) -> str: If the article already has a scheduled_publish_at, keep it unchanged. Returns the formatted publish datetime string. + + Uses a module-level lock so that concurrent pipeline runs (two threads) + cannot read the same "free" slot and assign it twice. """ - # Check if already has a slot - with get_conn() as conn: - row = conn.execute( - "SELECT scheduled_publish_at FROM articles WHERE id = ?", - (article_id,), - ).fetchone() - existing_slot = row["scheduled_publish_at"] if row else None - if existing_slot: - try: - dt = datetime.fromisoformat(existing_slot) - return _format_slot(dt.date(), dt.hour) - except Exception: - pass # invalid slot, re-assign below - + # Fetch WP-occupied slots BEFORE acquiring the lock — the API call can be slow + # and must not block other threads unnecessarily. wp_occupied = _fetch_wp_occupied_slots() - result = _find_next_free_slot(wp_occupied, lookahead_days=30) - if result: - candidate, hour = result - else: - candidate = _today_cet() + timedelta(days=1) - hours = _preferred_hours() - hour = hours[0] if hours else 9 - iso_ts = f"{candidate.isoformat()}T{hour:02d}:00:00" - with get_conn() as conn: - conn.execute( - "UPDATE articles SET scheduled_publish_at = ? WHERE id = ?", - (iso_ts, article_id), - ) - return _format_slot(candidate, hour) + with _slot_lock: + # Single DB connection for the entire read-find-write cycle so the + # slot we pick is still free when we write it. + with get_conn() as conn: + row = conn.execute( + "SELECT scheduled_publish_at FROM articles WHERE id = ?", + (article_id,), + ).fetchone() + existing_slot = row["scheduled_publish_at"] if row else None + if existing_slot: + try: + dt = datetime.fromisoformat(existing_slot) + return _format_slot(dt.date(), dt.hour) + except Exception: + pass # invalid — fall through and assign a fresh slot + + # Find the next free (date, hour) slot using THIS connection so we + # see all slots written during this lock window. + hours = _preferred_hours() + today = _today_cet() + tomorrow = today + timedelta(days=1) + candidate: date | None = None + chosen_hour: int | None = None + + for offset in range(0, 61): + d = tomorrow + timedelta(days=offset) + date_str = d.isoformat() + + rows = conn.execute( + """ + SELECT scheduled_publish_at FROM articles + WHERE scheduled_publish_at >= ? AND scheduled_publish_at < ? + AND status NOT IN ('error', 'no_image') + """, + (date_str + "T00:00:00", date_str + "T23:59:59"), + ).fetchall() + + used_hours: set[int] = set() + for r in rows: + ts = r["scheduled_publish_at"] or "" + try: + used_hours.add(datetime.fromisoformat(ts).hour) + except Exception: + pass + for d_str, h in wp_occupied: + if d_str == date_str: + used_hours.add(h) + + for h in hours: + if h not in used_hours: + candidate = d + chosen_hour = h + break + if candidate is not None: + break + + if candidate is None: + candidate = tomorrow + chosen_hour = hours[0] if hours else 9 + + iso_ts = f"{candidate.isoformat()}T{chosen_hour:02d}:00:00" + conn.execute( + "UPDATE articles SET scheduled_publish_at = ? WHERE id = ?", + (iso_ts, article_id), + ) + return _format_slot(candidate, chosen_hour)