feat: Discovery-Funktion in Grundquellen-Verwaltung integriert

- POST /api/sources/discover: URL analysieren, RSS-Feeds erkennen, Duplikate prüfen
- POST /api/sources/discover/add: Erkannte Feeds als Grundquellen anlegen (inkl. Web-Source)
- Erkennen-Button und Modal im Dashboard mit Feed-Auswahl per Checkbox
- Duplikat-Erkennung zeigt bereits vorhandene Grundquellen an
- source_rules aus Monitor importiert für Feed-Discovery und Claude-Bewertung
- config.py um Discovery-Konfiguration erweitert

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dieser Commit ist enthalten in:
claude-dev
2026-03-05 20:04:18 +01:00
Ursprung 19fbf152eb
Commit 801944a7ea
4 geänderte Dateien mit 689 neuen und 409 gelöschten Zeilen

Datei anzeigen

@@ -209,6 +209,7 @@
<input type="text" class="search-input" id="globalSourceSearch" placeholder="Grundquelle suchen...">
<span class="text-secondary" id="globalSourceCount"></span>
</div>
<button class="btn btn-secondary" id="discoverSourceBtn">Erkennen</button>
<button class="btn btn-primary" id="newGlobalSourceBtn">+ Neue Grundquelle</button>
</div>
<div class="card">
@@ -421,6 +422,33 @@
</div>
</div>
<!-- Modal: Discover Sources -->
<div class="modal-overlay" id="modalDiscover">
<div class="modal" style="max-width:600px;">
<div class="modal-header">
<h3>Quellen erkennen</h3>
<button class="modal-close" onclick="closeModal('modalDiscover')">&times;</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="discoverUrl">Website-URL</label>
<div style="display:flex;gap:8px;">
<input type="url" id="discoverUrl" placeholder="https://www.example.de" style="flex:1;" required>
<button class="btn btn-primary" id="discoverBtn" onclick="runDiscover()">Erkennen</button>
</div>
</div>
<div id="discoverStatus" style="display:none;padding:12px 0;color:var(--text-secondary);font-size:13px;"></div>
<div id="discoverResults" style="display:none;">
<div id="discoverExisting" style="display:none;margin-bottom:12px;"></div>
<div id="discoverFeeds"></div>
<div style="margin-top:12px;display:flex;justify-content:flex-end;">
<button class="btn btn-primary" id="addDiscoveredBtn" style="display:none;" onclick="addDiscoveredFeeds()">Ausgewählte hinzufügen</button>
</div>
</div>
</div>
</div>
</div>
<!-- Modal: Confirm -->
<div class="modal-overlay" id="modalConfirm">
<div class="modal" style="max-width: 400px;">