Only the classic watch URL was recognised, so a shorts link fell through
to the website extractor. That path fetches the page, finds no recipe
markup in what is a JavaScript shell, and hands the raw text to the
language model, which returns an empty recipe titled "null" — stored in
the history as an apparently successful extraction rather than an error.
Shorts are among the most common formats for recipe clips, so the
failure mode was both frequent and silent. Live URLs share the pattern.
- Bilder beim Extrahieren lokal cachen (data/images/{id}.ext) und über GET /api/history/{id}/image ausliefern; Löschen bei Verlaufseintrag-Entfernung
- history.db in ./data/ Volume verschoben, damit sie Container-Rebuilds überlebt
- yt-dlp Subprocess-Aufrufe auf Windows gefixt: run_in_executor statt asyncio.create_subprocess_exec (SelectorEventLoop-Kompatibilität)
- ./data:/app/data Docker-Volume für persistente Datenhaltung hinzugefügt