diff --git a/.dedupe/index.sqlite b/.dedupe/index.sqlite new file mode 100644 index 0000000..d2fa618 Binary files /dev/null and b/.dedupe/index.sqlite differ diff --git a/.dedupe/report.csv b/.dedupe/report.csv new file mode 100644 index 0000000..8056de2 --- /dev/null +++ b/.dedupe/report.csv @@ -0,0 +1 @@ +group_id,canonical_path,dup_path,dup_size_bytes 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/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5d55808..af3394f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -19,9 +19,16 @@ jobs: username: oliver key: ${{ secrets.HETZNER_SSH_KEY }} 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 - sudo systemctl restart rss-app + pip install -r backend/requirements.txt || true + 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 }} + 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/.gitignore b/.gitignore index d714f32..aac3a2f 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ internal/start.sh internal/copy_files.sh internal/_line.txt internal/push_commit.txt +internal/git.sh +CLAUDE.md 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 0e8d5df..66b7237 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,52 @@ +## [1.7.1] - 2025-08-24 + +### ✨ 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 + +### 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 + +### 🔧 Verbesserungen +- **SyleSheet erneut hinzugefügt + - Style wurde bei einem Release leider vergessen + - Style auf DarkMode angepasst + +--- + ## [v1.6.2] - 2025-08-16 ### 🐛 Kritische Fehlerbehebung diff --git a/README.md b/README.md index 0f3d86c..b3c2b4a 100644 --- a/README.md +++ b/README.md @@ -1,76 +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. + +## Deployment-Zielbild +- Betrieb auf Hetzner +- Reverse Proxy via CloudPanel/Nginx +- Produktive Domain: `news.vanityontour.de` +- Bis zur Fertigstellung: Redirect auf `https://vanityontour.de` + +## Sicherheit +- Keine Secrets im Repository +- `.env` lokal/auf Server, nie committen +- Auth-Pflicht fuer die neue WebApp +- spaeter optional: Passkeys/WebAuthn + +## Rechtlicher Hinweis +Dieses Projekt verarbeitet nur Quellen mit dokumentierter Nutzungsgrundlage. Vor produktiver Nutzung ist eine finale rechtliche Pruefung der ausgewaehlten Feeds notwendig. diff --git a/__version__.py b/__version__.py index c8a19b1..6a6d0f8 100644 --- a/__version__.py +++ b/__version__.py @@ -1 +1 @@ -VERSION = "1.6.2" +VERSION = "1.7.1" diff --git a/app.py b/app.py index 0296f0b..f161a65 100644 --- a/app.py +++ b/app.py @@ -13,6 +13,8 @@ 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 @@ -24,103 +26,22 @@ 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() + +# === 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: @@ -340,9 +261,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'))} @@ -417,8 +337,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: @@ -430,40 +490,48 @@ 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 += " ⚠️" - 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: + with col_status: 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) + 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 +710,9 @@ with tab3:
- {feed_name} -
- {feed_url} -
- 📰 {article_count} Artikel +

{feed_name}

+ +
{article_count} Artikel @@ -712,13 +778,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 +803,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 +819,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 +852,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 +869,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 +901,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,28 +930,19 @@ 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): - 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") @@ -863,10 +954,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 +975,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 +1044,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', ''))}
@@ -951,53 +1063,47 @@ 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): 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 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) 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) diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..c2dd235 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,45 @@ +# ─── App ──────────────────────────────────────────────────────────────────── +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 + +# ─── 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/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..a25199c --- /dev/null +++ b/backend/app/admin_ui.py @@ -0,0 +1,1126 @@ +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 + +from fastapi import APIRouter, Form, Request +from fastapi.responses import HTMLResponse, RedirectResponse, Response +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 .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 .repositories import ( + FeedCreate, + FeedUpdate, + SourceCreate, + SourceUpdate, + delete_feed, + delete_source, + create_feed, + create_source, + 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, + list_sources, + set_article_image_decision, + upsert_article, + update_feed, + update_source, + 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": ("rewrite", "close"), + "rewrite": ("publish", "close"), + "publish": ("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: + 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 {} + + +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 _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 {} + 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, + "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), + } + ) + return entries + + +def _publish_readiness(article: dict, meta: dict) -> tuple[bool, list[str]]: + reasons: list[str] = [] + 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: + reasons.append("Hauptbild nicht ausgewählt") + 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/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 {} + 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 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 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 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( + { + "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 "-", + } + ) + 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 + + +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) + + +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, + meta_json: 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") if meta_json is _UNSET else meta_json, + ) + ) + + +@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) + 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") + 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 = [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 {} + 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 {} + 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 + 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, + "admin_dashboard.html", + { + "request": request, + "title": "Admin Dashboard", + "user": user, + "sources": sources, + "source_policy": source_policy, + "feeds": feeds, + "runs": runs, + "publish_jobs": publish_jobs, + "articles": articles, + "status_options": list(UI_STATUSES), + "allowed_transitions": ALLOWED_TRANSITIONS, + "status_filter": status_filter, + "flash_msg": request.query_params.get("msg", ""), + "flash_type": request.query_params.get("type", "success"), + }, + ) + + +@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) + 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 {} + 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 + 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 {} + 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")) + 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) + + 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_ui"), ()), + "flash_msg": request.query_params.get("msg", ""), + "flash_type": request.query_params.get("type", "success"), + }, + ) + + +@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}/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): + return Response(status_code=400) + + try: + 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") + 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/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/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, + 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/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) + 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) + + 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 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) + 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") + 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) + 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) + if not user: + return RedirectResponse(url="/admin/login", status_code=303) + + article = get_article_by_id(article_id) + if article: + 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") + + +_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.""" + 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.""" + 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/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..24c3902 --- /dev/null +++ b/backend/app/config.py @@ -0,0 +1,65 @@ +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 + + +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" + + 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" + 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) + 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) +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() diff --git a/backend/app/db.py b/backend/app/db.py new file mode 100644 index 0000000..b6ef898 --- /dev/null +++ b/backend/app/db.py @@ -0,0 +1,293 @@ +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 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, + 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, + 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 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 + 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() + } + 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", + "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", + "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) + + # 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() + 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 new file mode 100644 index 0000000..391af92 --- /dev/null +++ b/backend/app/ingestion.py @@ -0,0 +1,486 @@ +from __future__ import annotations + +from dataclasses import dataclass +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 + +from .repositories import ( + ArticleUpsert, + RunCreate, + create_run, + find_existing_article_for_upsert, + 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 _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. + + 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: + 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 _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 _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 + title_tokens = _normalize_tokens(title) + 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") + + 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) + 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 + + +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 + 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 + + 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 + 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) + link = _normalize_article_url(link) + + summary, content_raw = _entry_text(entry) + # 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 + 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") + selected_images, primary_image, ranked_images = _select_relevant_images( + link, + final_title, + extracted.images, + max_keep=3, + ) + + 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 + extraction_meta["image_selection"] = { + "primary": primary_image, + "selected_count": len(selected_images), + "total_candidates": len(extracted.images), + "ranked": ranked_images, + } + 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 + + 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..b4776af --- /dev/null +++ b/backend/app/main.py @@ -0,0 +1,727 @@ +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 +from fastapi.responses import JSONResponse +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 .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, + 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_publish_jobs, + list_articles as repo_list_articles, + 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, +) +from .workflow import ALLOWED_UI_TRANSITIONS, UI_STATUSES, internal_to_ui_status, ui_to_internal_status + +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 + 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 + 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|publish|published|close|review|approved|error|no_image)$") + meta_json: str | None = None + + +class IngestionRunRequest(BaseModel): + feed_id: int | None = None + + +class ArticleTransitionRequest(BaseModel): + target_status: str = Field(pattern="^(new|rewrite|publish|published|close|review|approved|error|no_image)$") + note: str | None = None + + +class ArticleReviewRequest(BaseModel): + decision: str = Field(pattern="^(approve|reject)$") + note: str | None = None + + +class ArticleLegalReviewRequest(BaseModel): + approved: bool + 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": {"rewrite", "error"}, + "rewrite": {"approved", "error"}, + "approved": {"published", "error"}, + "published": {"error"}, + "error": {"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: + 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") +def api_export_articles( + format: str = "json", + status_filter: str | None = None, + username: str = Depends(require_auth), +): + 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 = {} + 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( + { + "id": article.get("id"), + "title": article.get("title"), + "status": article.get("status"), + "published_at": article.get("published_at"), + "days_old": days_old, + "relevance": article_relevance(article.get("published_at")), + "author": article.get("author"), + "source_url": article.get("source_url"), + "canonical_url": article.get("canonical_url"), + "source_name_snapshot": article.get("source_name_snapshot"), + "source_license_name_snapshot": article.get("source_license_name_snapshot"), + "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"), + } + ) + + generated_at = datetime.now(timezone.utc).isoformat() + if format == "csv": + out = io.StringIO() + fieldnames = [ + "id", + "title", + "status", + "published_at", + "days_old", + "relevance", + "author", + "source_url", + "canonical_url", + "source_name_snapshot", + "source_license_name_snapshot", + "source_terms_url_snapshot", + "press_contact", + "image_urls_json", + "selected_image_url", + "legal_checked", + "legal_checked_at", + "legal_note", + ] + writer = csv.DictWriter(out, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(rows) + return Response( + content=out.getvalue(), + media_type="text/csv; charset=utf-8", + headers={"Content-Disposition": 'attachment; filename="articles_export.csv"'}, + ) + + return JSONResponse( + { + "ok": True, + "count": len(rows), + "generated_at": generated_at, + "status_filter": status_filter, + "items": rows, + "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") + article["status_ui"] = internal_to_ui_status(article.get("status")) + 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, + 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, + 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=ui_to_internal_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") + 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_ui} -> {target_ui}", + ) + + 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_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) + 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( + 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, + ) + ) + return {"ok": True, "id": article_id, "status": "publish", "tags": tags} + + +@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.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: + raise HTTPException(status_code=status.HTTP_410_GONE, detail="Review-Endpoint ersetzt durch Rewrite-Workflow") + + +@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, + } + + +# --------------------------------------------------------------------------- +# 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") + + +_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) + + 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(): + 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"} + + +@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. + + 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: + 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") + + 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} + + +@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..93a251b --- /dev/null +++ b/backend/app/pipeline.py @@ -0,0 +1,516 @@ +"""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 + quality_gate_rejected: int = 0 + warnings: int = 0 + errors: int = 0 + no_image: 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"]) + 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 (%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: + 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") + + # 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, 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) + + # 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, + "quality_gate_rejected": stats.quality_gate_rejected, + "no_image": stats.no_image, + "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) + + # 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) + 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: 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) + except Exception as exc: + logger.warning("Telegram warning für #%d fehlgeschlagen: %s", article_id, exc) + + else: + # Auto-process: rewrite + WP draft + try: + # 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 + + # 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 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) + # 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 + 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) + 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 + + +# --------------------------------------------------------------------------- +# 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 + + # 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: + 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 IN ('error', 'review') + 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/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/publisher.py b/backend/app/publisher.py new file mode 100644 index 0000000..e27bd1b --- /dev/null +++ b/backend/app/publisher.py @@ -0,0 +1,101 @@ +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 'publish' sein" + 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/relevance.py b/backend/app/relevance.py new file mode 100644 index 0000000..8f69693 --- /dev/null +++ b/backend/app/relevance.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +from datetime import datetime, timezone + + +def _parse_iso_datetime(value: str | None) -> datetime | None: + if not value: + return None + raw = value.strip() + if not raw: + return None + if raw.endswith("Z"): + raw = raw[:-1] + "+00:00" + try: + parsed = datetime.fromisoformat(raw) + except ValueError: + return None + if parsed.tzinfo is None: + parsed = parsed.replace(tzinfo=timezone.utc) + return parsed + + +def article_age_days(published_at: str | None, now: datetime | None = None) -> int | None: + published = _parse_iso_datetime(published_at) + if not published: + return None + ref = now or datetime.now(timezone.utc) + delta = ref - published + if delta.total_seconds() < 0: + return 0 + return delta.days + + +def article_relevance(published_at: str | None, now: datetime | None = None) -> str: + days = article_age_days(published_at, now=now) + if days is None: + return "unbekannt" + if days <= 2: + return "hoch" + if days <= 7: + return "mittel" + if days <= 30: + return "niedrig" + return "alt" diff --git a/backend/app/repositories.py b/backend/app/repositories.py new file mode 100644 index 0000000..cf38055 --- /dev/null +++ b/backend/app/repositories.py @@ -0,0 +1,855 @@ +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 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 + 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 + 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 + 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( + """ + 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 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( + "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(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( + """ + 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.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, + a.scheduled_publish_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 _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, + *, + 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 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 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 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 + 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 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: + 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, 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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + 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.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.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, + ), + ) + 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 = ?, + 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 = ? + 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.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.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, + 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_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: + 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, + 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 + 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, + 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 + 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/rewrite.py b/backend/app/rewrite.py new file mode 100644 index 0000000..05937e5 --- /dev/null +++ b/backend/app/rewrite.py @@ -0,0 +1,204 @@ +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 _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") + + payload = { + "model": settings.openai_model, + "temperature": temperature, + "messages": [ + {"role": "system", "content": system}, + {"role": "user", "content": user}, + ], + } + 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 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() + 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. " + 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}" + ) + 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 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: + 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/scheduler.py b/backend/app/scheduler.py new file mode 100644 index 0000000..d5ea5bf --- /dev/null +++ b/backend/app/scheduler.py @@ -0,0 +1,336 @@ +"""Smart publishing scheduler. + +Calculates suggested publish slots for new WordPress drafts. +Rules: +- Maximum N drafts per day (configurable, default 2) +- 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 threading +import urllib.request +from datetime import date, datetime, timedelta, timezone +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) + + +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 _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_app_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 MAX(scheduled_publish_at) AS last_slot + FROM articles + WHERE scheduled_publish_at IS NOT NULL + AND scheduled_publish_at >= ? + AND status NOT IN ('error', 'no_image') + """, + (today.isoformat() + "T00:00:00",), + ).fetchone() + 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, 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', 'no_image') + """, + (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 + + # 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 + + +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" + + +def _find_next_free_slot( + wp_occupied: set[tuple[str, int]], lookahead_days: int = 60 +) -> tuple[date, int] | None: + """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) + + for offset in range(0, lookahead_days + 1): + candidate = tomorrow + 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 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: + 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() + 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. + + 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. + """ + # 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() + + 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) diff --git a/backend/app/source_extraction.py b/backend/app/source_extraction.py new file mode 100644 index 0000000..d3cbed8 --- /dev/null +++ b/backend/app/source_extraction.py @@ -0,0 +1,442 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +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 + image_metadata: dict[str, dict] = field(default_factory=dict) + + +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|agentur)\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|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:|alle meldungen|zum newsroom)\b", nxt, re.IGNORECASE): + break + chunk.append(nxt) + return _clean_text("\n".join(chunk)) + + match = re.search( + r"((?:Pressekontakt|Agentur)[\s\S]{0,1200}?)(?:Original-Content von|OTS:|newsroom:|Alle Meldungen|Zum Newsroom|$)", + content_text, + re.IGNORECASE, + ) + if match: + return _clean_text(match.group(1)) + 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( + 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) + image_metadata = _extract_image_metadata(html, url) + + 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, + image_metadata=image_metadata, + ) + + +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, + "image_metadata": article.image_metadata, + } diff --git a/backend/app/telegram_bot.py b/backend/app/telegram_bot.py new file mode 100644 index 0000000..880a49d --- /dev/null +++ b/backend/app/telegram_bot.py @@ -0,0 +1,474 @@ +"""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}" +_N8N_APP_RELEASE_WEBHOOK = "https://n8n.vanityontour.de/webhook/tg-app-release-bot-v1/webhook" + + +# --------------------------------------------------------------------------- +# 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", {}) + + +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 +# --------------------------------------------------------------------------- + +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) + 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) + + lines = [ + "📊 Pipeline abgeschlossen", + f"📥 Neue Artikel importiert: {ingested}", + f"⚙️ Verarbeitet: {processed}", + f"📝 Drafts erstellt: {drafts}", + ] + if 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: + 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" + ) + + 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 .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 + + # 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": + 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, exc_info=True) + notify_error(f"Rewrite #{article_id} fehlgeschlagen: {exc}") + + elif action == "discard": + 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": + 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": + update_article_status(article_id, "error", actor="telegram", note="Manuell abgelehnt via Telegram") + + else: + logger.warning("Unbekannte Callback-Aktion: %s", action) diff --git a/backend/app/wordpress.py b/backend/app/wordpress.py new file mode 100644 index 0000000..bb96198 --- /dev/null +++ b/backend/app/wordpress.py @@ -0,0 +1,689 @@ +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 + +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, +) -> 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") + return json.loads(raw) if raw 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 _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 + + +_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": "Mozilla/5.0 (compatible; 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 + + +def _guess_filename(image_url: str, content_type: str) -> str: + 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 + + +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: + from urllib.parse import urlparse + meta = json.loads(meta_json) + image_metadata = (meta.get("extraction") or {}).get("image_metadata") 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() + if caption: + return caption + return f"Quelle: {source_url}" + + +def _upload_featured_media( + *, + base_url: str, + auth_header: str, + 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) + + 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}") + + _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": image_caption or f"Quelle: {source_url}", + "alt_text": article_title[:200], + }, + ) + 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 _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 _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)}' + + +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: + 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_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() + + # 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(meta_json or "{}") + 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) + raw_credit = (img_meta.get("credit") or "").strip() + caption_text = (img_meta.get("caption") or "").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 + 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 + + 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() + body_text = _sanitize_publish_text(body_text) + if not body_text: + body_text = summary + + has_html = bool(re.search(r"<[a-zA-Z][^>]*>", 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.

    " + + attribution = _build_attribution_block(article) + content = (body_html + attribution).strip() + return content, 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) + + title = (article.get("title") or "Ohne Titel").strip() + 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")) + + # 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=candidate_url, + article_title=title, + source_url=source_url, + image_caption=image_caption, + ) + break # success — stop trying further candidates + except Exception as 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, + "status": settings.wordpress_default_status, + } + if excerpt: + 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" + # 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( + 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, + 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, + ) + + 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}") + 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 + + +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", + ) + + +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/app/workflow.py b/backend/app/workflow.py new file mode 100644 index 0000000..83e9b63 --- /dev/null +++ b/backend/app/workflow.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +UI_STATUSES = ("new", "rewrite", "publish", "published", "close", "no_image") + + +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", "no_image"}: + 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", "no_image"}: + 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": {"rewrite", "close"}, + "close": {"rewrite"}, + "no_image": {"rewrite", "close"}, +} diff --git a/backend/data/rss_news.db b/backend/data/rss_news.db new file mode 100644 index 0000000..7929307 Binary files /dev/null and b/backend/data/rss_news.db differ 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..0b31bb5 --- /dev/null +++ b/backend/static/admin.css @@ -0,0 +1,303 @@ +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, textarea { + 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; +} + +.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; + 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; +} + +.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; + 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; +} + +.img-failed { + opacity: 0.3; + filter: grayscale(1); +} + +.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)); + } + .grid.two { + grid-template-columns: 1fr; + } +} diff --git a/backend/templates/admin_article_detail.html b/backend/templates/admin_article_detail.html new file mode 100644 index 0000000..1c16658 --- /dev/null +++ b/backend/templates/admin_article_detail.html @@ -0,0 +1,224 @@ + + + + + + {{ title }} + + + +
    +
    +

    Artikel-Detail #{{ article.id }}

    +

    Angemeldet als {{ user }}

    +
    +
    + Zurück +
    + +
    +
    +
    + +
    + {% if flash_msg %} +
    + {{ flash_msg }} +
    + {% endif %} + +
    +

    {{ article.title }}

    +
    +
    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 }}
    +
    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.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 "-" }}

    +
    + +
    +

    Checkliste

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

    Extrahierte Daten

    +

    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 %} + {% 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 %} +
    + + 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

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

    Extraktionsfehler: {{ article.extraction.extraction_error }}

    + {% endif %} +
    + +
    +

    Volltext

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

    Rewrite-Text (editierbar)

    +
    + + +
    + {% if article.meta.generated_tags %} +

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

    + {% endif %} +

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

    +
    + +
    +

    Status ändern

    + {% if article.status_ui in ["new", "rewrite"] %} +
    + +
    + {% endif %} + {% if article.status_ui == "published" %} +
    + +
    + {% endif %} +
    + + + +
    +
    + +
    +

    WordPress Publish Queue

    + {% if article.publish_ready %} +

    Publish bereit

    + {% else %} +

    Publish blockiert

    + {% if article.publish_blockers %} +
      + {% for reason in article.publish_blockers %} +
    • {{ reason }}
    • + {% endfor %} +
    + {% endif %} + {% endif %} +

    Voraussetzungen: Status `publish` und Hauptbild gesetzt.

    +
    + + +
    +
    +
    + + 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_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 new file mode 100644 index 0000000..0795b96 --- /dev/null +++ b/backend/templates/admin_dashboard.html @@ -0,0 +1,405 @@ + + + + + + {{ 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

    +
    + + +
    +
    + +
    +

    Publisher ausführen

    +
    + + +
    +
    + +
    +

    Rewrite Run (geplante Artikel)

    +

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

    +
    + + +
    +
    + +
    +

    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 %} +
    +
    + +
    +

    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)

    +
    + + + + Reset + Export JSON + Export CSV +
    + + + + + + {% for a in articles %} + + + + + + + + + {% endfor %} + +
    IDArtikelStatusDetailsRewriteTransition
    {{ a.id }} + {{ 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 %} +
    Canonical öffnen + {% endif %} +
    {{ a.status_ui }} +
    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 + {% endif %} + {% if a.summary %} +
    Summary: {{ a.summary }}
    + {% endif %} + {% if a.generated_tags %} +
    Tags: {{ a.generated_tags|join("; ") }}
    + {% 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_ui in ["new", "rewrite"] %} +
    + +
    + {% else %} + - + {% endif %} +
    +
    + + {% if allowed_transitions.get(a.status_ui, []) %} + + {% else %} + keine Aktion + {% endif %} +
    + {% if a.status_ui == 'close' %} +
    + +
    + {% endif %} +
    +
    + +
    +

    Runs

    + + + + + + {% for r in runs %} + + + + + + + + {% endfor %} + +
    IDTypStatusStartEnde
    {{ r.id }}{{ r.run_type }}{{ r.status }}{{ r.started_at }}{{ r.finished_at or "-" }}
    +
    + +
    +

    Publish Jobs

    + + + + + + {% for j in publish_jobs %} + + + + + + + + + + {% endfor %} + +
    IDArtikelStatusAttemptsWP PostFehlerHinweis
    {{ 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 %} + + {% if j.error_message %} + {{ j.error_category }} +
    {{ j.error_message }}
    + {% else %} + - + {% endif %} +
    {{ j.error_hint 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/templates/admin_schedule.html b/backend/templates/admin_schedule.html new file mode 100644 index 0000000..4f2513a --- /dev/null +++ b/backend/templates/admin_schedule.html @@ -0,0 +1,143 @@ + + + + + + {{ title }} + + + + +
    +
    +

    rss-news Veröffentlichungsplan

    +

    Angemeldet als {{ user }}

    +
    +
    + Dashboard + Connectivity +
    + +
    +
    +
    + +
    + {% if flash_msg %} +
    + {{ flash_msg }} +
    + {% 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)

    +
    + 📅 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 %} +
    +
    +
    + + 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..c7b6ebf --- /dev/null +++ b/backend/tests/test_admin_ui.py @@ -0,0 +1,419 @@ +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 +from backend.app.repositories import ( + ArticleUpsert, + FeedCreate, + SourceCreate, + create_feed, + create_source, + get_article_by_id, + upsert_article, +) + + +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")) + + 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, + image_urls_json='["https://example.org/img.jpg"]', + press_contact="Kontakt", + 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=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"}}', + ) + ) + + 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("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", "")) + + 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.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: + 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", "")) + + @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() diff --git a/backend/tests/test_api_auth.py b/backend/tests/test_api_auth.py new file mode 100644 index 0000000..96fbe85 --- /dev/null +++ b/backend/tests/test_api_auth.py @@ -0,0 +1,144 @@ +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) + + 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_article_workflow.py b/backend/tests/test_article_workflow.py new file mode 100644 index 0000000..094b595 --- /dev/null +++ b/backend/tests/test_article_workflow.py @@ -0,0 +1,110 @@ +import os +import tempfile +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 +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": "rewrite"}) + self.assertEqual(t1.status_code, 200) + + 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) + + 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"], "rewrite") + self.assertEqual(final.json()["item"]["status_ui"], "rewrite") + + 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_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, 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__": + unittest.main() diff --git a/backend/tests/test_db_repositories.py b/backend/tests/test_db_repositories.py new file mode 100644 index 0000000..91436c6 --- /dev/null +++ b/backend/tests/test_db_repositories.py @@ -0,0 +1,145 @@ +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", + image_urls_json='["https://example.org/img.jpg"]', + press_contact="Pressekontakt X", + source_name_snapshot="GovData", + source_terms_url_snapshot="https://www.govdata.de/dl-de/by-2-0", + source_license_name_snapshot="dl-de/by-2-0", + 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"}', + ) + ) + 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", + image_urls_json='["https://example.org/img2.jpg"]', + press_contact="Pressekontakt Y", + source_name_snapshot="GovData", + source_terms_url_snapshot="https://www.govdata.de/dl-de/by-2-0", + source_license_name_snapshot="dl-de/by-2-0", + 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}', + ) + ) + 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..82bd2ca --- /dev/null +++ b/backend/tests/test_ingestion.py @@ -0,0 +1,245 @@ +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 ( + ArticleUpsert, + FeedCreate, + SourceCreate, + create_feed, + create_source, + get_article_by_id, + list_articles, + upsert_article, +) +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 "") + self.assertIsNotNone(article["image_urls_json"]) + + @patch("backend.app.ingestion.extract_article") + @patch("backend.app.ingestion.feedparser.parse") + 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="Any Risk 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", + ) + ) + feed_id = create_feed( + FeedCreate( + name="Any Risk Feed", + url="https://example.net/feed.xml", + source_id=source_id, + is_enabled=True, + ) + ) + + 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") + # 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") + 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() 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() 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() diff --git a/backend/tests/test_source_extraction.py b/backend/tests/test_source_extraction.py new file mode 100644 index 0000000..5cafde7 --- /dev/null +++ b/backend/tests/test_source_extraction.py @@ -0,0 +1,96 @@ +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

    +
    + + +""" + +SAMPLE_HTML_AGENTUR = """ + + + + + + + +
    +

    Inhalt der Meldung.

    +

    Agentur

    +

    Agenturname GmbH

    +

    presse@agentur.example

    +

    Original-Content von Beispiel

    +
    + + +""" + + +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) + + @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 new file mode 100644 index 0000000..20b0618 --- /dev/null +++ b/backend/tests/test_wordpress.py @@ -0,0 +1,139 @@ +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) + 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") + 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) + 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) + self.assertNotIn("Artikeldetails", 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]) + + @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() diff --git a/data/articles.json b/data/articles.json index 8437b4d..071aac7 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,2654 @@ "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": "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": 451 + "word_count": 275, + "rewritten_at": "2025-08-18T10:30:43.148097", + "wp_upload_date": "2025-08-19T09:45:44.761954", + "wp_post_id": 3385 + }, + { + "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 + }, + { + "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": "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", + "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": "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", + "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 + }, + { + "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/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/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. diff --git a/docs/PROJECT_PLAN.md b/docs/PROJECT_PLAN.md new file mode 100644 index 0000000..3c61216 --- /dev/null +++ b/docs/PROJECT_PLAN.md @@ -0,0 +1,91 @@ +# 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 (Draft-first, Queue + Retry) +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 +- 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 +- Pflicht-Attribution pro Artikel +- 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 +- 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..fee4a67 --- /dev/null +++ b/docs/TODO.md @@ -0,0 +1,38 @@ +# ToDo (Ein-Entwickler Setup) + +## Jetzt +- [ ] 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) +- [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 +- [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 +- [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 +- [ ] 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 +- [ ] KI-Rewrite mit Prompt-Versionierung + Qualitaetsmetriken wieder aktivieren 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 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..e6c0f88 --- /dev/null +++ b/docs/wiki/Operations-Runbook.md @@ -0,0 +1,43 @@ +# 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 + +## 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 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/logs/rss_tool.log b/logs/rss_tool.log index 68879b4..b724579 100644 --- a/logs/rss_tool.log +++ b/logs/rss_tool.log @@ -800,3 +800,5918 @@ 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 +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 +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/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/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/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 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." 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/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() 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/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 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) diff --git a/versioning.py b/versioning.py index 3a3e6ea..0b56e74 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") @@ -41,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) @@ -49,31 +56,74 @@ 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") +@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 + Optional: --push, --no-sign, --dry-run, --version, --force """ 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 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: - 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)'}") + click.echo(f"➡️ Force-Modus: {'Ja' if force else 'Nein'}") 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 +135,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) @@ -114,22 +164,32 @@ def create( 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": - 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