Podcast-Feed-Typ im Verwaltungsportal
Passt Verwaltung an die Podcast-Integration im Monitor an (Commit 5127e0a):
Backend (src/routers/sources.py):
- Pydantic-Pattern von GlobalSourceCreate + GlobalSourceUpdate um
podcast_feed erweitert
- Health-Check Feed-Validierung greift jetzt auch fuer podcast_feed
(Podcast-Feeds sind technisch RSS/Atom)
Frontend:
- src/static/js/sources.js: TYPE_LABELS um podcast_feed ("Podcast-Feed")
ergaenzt
- src/static/dashboard.html: Neue <option value=podcast_feed> in Filter-
und Anlage-Dropdown
Ohne diese Anpassung waere das Anlegen von Podcast-Quellen ueber das
Verwaltungsportal nicht moeglich (422 Unprocessable Entity vom
Pydantic-Validator).
Dieser Commit ist enthalten in:
@@ -34,7 +34,7 @@ class GlobalSourceCreate(BaseModel):
|
||||
name: str = Field(min_length=1, max_length=200)
|
||||
url: Optional[str] = None
|
||||
domain: Optional[str] = None
|
||||
source_type: str = Field(default="rss_feed", pattern="^(rss_feed|web_source|excluded|telegram_channel)$")
|
||||
source_type: str = Field(default="rss_feed", pattern="^(rss_feed|web_source|excluded|telegram_channel|podcast_feed)$")
|
||||
category: str = Field(default="sonstige")
|
||||
status: str = Field(default="active", pattern="^(active|inactive)$")
|
||||
notes: Optional[str] = None
|
||||
@@ -44,7 +44,7 @@ class GlobalSourceUpdate(BaseModel):
|
||||
name: Optional[str] = Field(default=None, max_length=200)
|
||||
url: Optional[str] = None
|
||||
domain: Optional[str] = None
|
||||
source_type: Optional[str] = Field(default=None, pattern="^(rss_feed|web_source|excluded|telegram_channel)$")
|
||||
source_type: Optional[str] = Field(default=None, pattern="^(rss_feed|web_source|excluded|telegram_channel|podcast_feed)$")
|
||||
category: Optional[str] = None
|
||||
status: Optional[str] = Field(default=None, pattern="^(active|inactive)$")
|
||||
notes: Optional[str] = None
|
||||
@@ -597,7 +597,7 @@ async def run_health_check_stream(
|
||||
"message": f"HTTP {resp.status_code} - nicht erreichbar"})
|
||||
else:
|
||||
checks.append({"type": "reachability", "status": "ok", "message": "Erreichbar"})
|
||||
if source["source_type"] == "rss_feed":
|
||||
if source["source_type"] in ("rss_feed", "podcast_feed"):
|
||||
text = resp.text[:20000]
|
||||
if "<rss" not in text and "<feed" not in text and "<channel" not in text:
|
||||
checks.append({"type": "feed_validity", "status": "error",
|
||||
|
||||
@@ -299,6 +299,7 @@
|
||||
<option value="rss_feed">RSS-Feed</option>
|
||||
<option value="web_source">Webquelle</option>
|
||||
<option value="telegram_channel">Telegram-Kanal</option>
|
||||
<option value="podcast_feed">Podcast-Feed</option>
|
||||
</select>
|
||||
<select class="filter-select" id="globalFilterCategory" onchange="filterGlobalSources()">
|
||||
<option value="">Alle Kategorien</option>
|
||||
@@ -527,7 +528,8 @@
|
||||
<select id="sourceType">
|
||||
<option value="rss_feed">RSS-Feed</option>
|
||||
<option value="web_source">Webquelle</option>
|
||||
<option value="telegram_channel">Telegram-Kanal</option>
|
||||
<option value="telegram_channel">Telegram-Kanal</option>
|
||||
<option value="podcast_feed">Podcast-Feed</option>
|
||||
<option value="excluded">Ausgeschlossen</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -33,6 +33,7 @@ const TYPE_LABELS = {
|
||||
rss_feed: "RSS-Feed",
|
||||
web_source: "Webquelle",
|
||||
telegram_channel: "Telegram-Kanal",
|
||||
podcast_feed: "Podcast-Feed",
|
||||
excluded: "Ausgeschlossen",
|
||||
};
|
||||
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren