YouTube-Fallback aus Podcast-Kaskade entfernt
Der geplante YouTube-Captions-Fallback (Phase 2 via yt-dlp) wird nicht umgesetzt. Begruendung: strategische Entscheidung, keinen YouTube-Scrape als Quelle zu nutzen. Geaendert: - src/feeds/transcript_extractors/__init__.py: - try/except-Import fuer youtube-Modul entfernt (nie existiert) - Modul-Docstring aktualisiert (Stufen 1+2, kein 3) - source-Enum-Kommentar: nur noch rss_native / website_scrape Konsequenz: Episoden, die weder Podcasting-2.0-Tag noch Sender-Manuskript haben (z. B. Paywall-Inhalte bei FAZ/Handelsblatt), werden dauerhaft verworfen. Fuer deutsche Qualitaetsmedien-Podcasts (Dlf, NDR, SZ, Spiegel, ZEIT wo frei) reichen die zwei aktiven Stufen.
Dieser Commit ist enthalten in:
@@ -4,7 +4,9 @@ Reihenfolge der Strategien:
|
|||||||
1. rss_native — Podcasting-2.0-Tag <podcast:transcript> im Feed-Entry
|
1. rss_native — Podcasting-2.0-Tag <podcast:transcript> im Feed-Entry
|
||||||
2. website_* — Redaktionelles Manuskript auf der Episoden-Webseite
|
2. website_* — Redaktionelles Manuskript auf der Episoden-Webseite
|
||||||
(sender-spezifische Adapter)
|
(sender-spezifische Adapter)
|
||||||
3. youtube — YouTube-Auto-Captions via yt-dlp (Phase 2, optional)
|
|
||||||
|
Episoden ohne Treffer in einer der Stufen werden verworfen (kein Fehler).
|
||||||
|
YouTube-Fallback wird nicht genutzt.
|
||||||
|
|
||||||
Jeder Adapter implementiert:
|
Jeder Adapter implementiert:
|
||||||
def can_handle(feed_entry: dict, feed_url: str) -> bool
|
def can_handle(feed_entry: dict, feed_url: str) -> bool
|
||||||
@@ -31,11 +33,11 @@ logger = logging.getLogger("osint.podcast.extractors")
|
|||||||
class TranscriptResult:
|
class TranscriptResult:
|
||||||
"""Einheitliches Ergebnis einer Transkript-Strategie."""
|
"""Einheitliches Ergebnis einer Transkript-Strategie."""
|
||||||
text: str
|
text: str
|
||||||
source: str # "rss_native" / "website_scrape" / "youtube"
|
source: str # "rss_native" / "website_scrape"
|
||||||
segments: Optional[list] = None # Optional: [{"start": sec, "end": sec, "text": "..."}]
|
segments: Optional[list] = None # Optional: [{"start": sec, "end": sec, "text": "..."}]
|
||||||
|
|
||||||
|
|
||||||
# Reihenfolge der Kaskade: zuerst Feed-Tag, dann Senderseiten, zuletzt YouTube
|
# Reihenfolge der Kaskade: zuerst Feed-Tag, dann Senderseiten
|
||||||
from . import rss_native
|
from . import rss_native
|
||||||
from . import website_dlf
|
from . import website_dlf
|
||||||
from . import website_sz
|
from . import website_sz
|
||||||
@@ -50,13 +52,6 @@ _EXTRACTORS = [
|
|||||||
website_ndr,
|
website_ndr,
|
||||||
]
|
]
|
||||||
|
|
||||||
# YouTube-Adapter ist optional — nur importieren falls vorhanden (Phase 2)
|
|
||||||
try:
|
|
||||||
from . import youtube # noqa: F401
|
|
||||||
_EXTRACTORS.append(youtube)
|
|
||||||
except ImportError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
async def fetch_transcript(feed_entry: dict, feed_url: str, episode_url: str) -> Optional[TranscriptResult]:
|
async def fetch_transcript(feed_entry: dict, feed_url: str, episode_url: str) -> Optional[TranscriptResult]:
|
||||||
"""Versucht Kaskade durch bis eine Stufe liefert.
|
"""Versucht Kaskade durch bis eine Stufe liefert.
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren