158 lines
8.3 KiB
Markdown
158 lines
8.3 KiB
Markdown
---
|
|
name: mealie-recipe-import
|
|
description: Importiert ein Rezept aus einer URL in Mealie (per MCP) und bereinigt es direkt danach - setzt passende Kategorien und Tags, normalisiert Mengenangaben/Einheiten, bereinigt Zutatennamen und glättet die Zubereitungsschritte sprachlich (auf Deutsch, auch wenn das Original in einer anderen Sprache ist). Nutze diesen Skill immer, wenn der User eine Rezept-URL schickt und sie "in Mealie speichern/importieren/hinzufügen" möchte, wenn er sagt "importier das mal", "füg das Rezept hinzu", "mach das Rezept in Mealie sauber", oder allgemein ein rohes/unsortiertes Mealie-Rezept nachträglich korrigiert haben möchte (auch ohne neue URL, per Slug oder Namen). Trigger auch bei Formulierungen wie "korrigier das Rezept", "setz die Kategorien", "räum die Zutaten auf" im Mealie-Kontext.
|
|
---
|
|
|
|
# Mealie Rezept-Import & Korrektur
|
|
|
|
Importiert Rezepte aus einer URL nach Mealie und bringt sie danach in einen sauberen,
|
|
konsistenten Zustand: richtige Kategorien, richtige Tags, saubere Mengen/Einheiten,
|
|
bereinigte Zutatennamen und flüssig lesbare, deutsche Zubereitungsschritte.
|
|
|
|
Nutzer-Präferenzen (aus der Einrichtung dieses Skills):
|
|
- Sprache: **Deutsch** — fremdsprachige Rezepte werden beim Bereinigen ins Deutsche übersetzt (Zutaten, Schritte, Beschreibung, Name).
|
|
- Kategorien/Tags: Bevorzugt bestehende aus Mealie verwenden, bei Bedarf aber **neue anlegen** (kein Nachfragen nötig — `mealie_recipes_update` legt beim Update automatisch neue Kategorie-/Tag-Namen an, falls sie noch nicht existieren).
|
|
- Umfang der Korrektur: Kategorien, Tags, Mengen/Einheiten normalisieren, Zutatennamen bereinigen, Zubereitungsschritte glätten.
|
|
|
|
## Ablauf
|
|
|
|
### 1. Rezept importieren (nur wenn eine neue URL gegeben wurde)
|
|
|
|
```
|
|
mealie_recipes_create_from_url(url=<URL>, include_tags=false)
|
|
```
|
|
|
|
`include_tags=false`, weil die vom Scraper übernommenen Tags/Kategorien meist unpassend
|
|
oder inkonsistent mit der bestehenden Mealie-Taxonomie sind — wir setzen sie im nächsten
|
|
Schritt bewusst selbst. Das Ergebnis liefert u.a. `slug`, `name`, Rohtext von
|
|
Zutaten/Anleitung.
|
|
|
|
Wenn der User stattdessen ein bereits vorhandenes Rezept nennt (Name oder Slug), das
|
|
Rezept stattdessen über `mealie_recipes_search(query=<Name>)` finden und den `slug`
|
|
daraus verwenden.
|
|
|
|
### 2. Bestehende Taxonomie abrufen
|
|
|
|
Vor dem Setzen von Kategorien/Tags immer erst die bestehenden Listen holen, damit
|
|
bereits vorhandene Begriffe wiederverwendet werden statt Dubletten anzulegen
|
|
(z.B. nicht "Dessert" und "Desserts" parallel):
|
|
|
|
```
|
|
mealie_categories_list()
|
|
mealie_tags_list()
|
|
```
|
|
|
|
Wähle aus dieser Liste passende Kategorien/Tags. Nur wenn wirklich nichts passt, einen
|
|
neuen, prägnanten deutschen Begriff vergeben (Titelcase, Singular bei Kategorien wie
|
|
"Hauptgericht", "Beilage", "Dessert", "Frühstück"; bei Tags eher granular wie
|
|
"vegetarisch", "vegan", "schnell", "Ofengericht", "Meal-Prep", "glutenfrei").
|
|
|
|
Faustregeln für die Zuordnung:
|
|
- **Kategorien** = grobe Einordnung (max. 1-3): Gang (Hauptgericht/Vorspeise/Dessert/
|
|
Frühstück/Beilage), ggf. Küche (Italienisch, Asiatisch) wenn eindeutig.
|
|
- **Tags** = Eigenschaften/Filter (beliebig viele, aber sparsam): Ernährungsform
|
|
(vegetarisch/vegan/glutenfrei/low-carb), Aufwand (schnell, meal-prep), Methode
|
|
(Ofengericht, One-Pot, Grillen), Anlass (Sommer, Party, Kinderfreundlich).
|
|
- **Airfryer-Rezepte immer taggen:** Wird das Gericht in der Zubereitung ausdrücklich in
|
|
einer Heißluftfritteuse/einem Airfryer zubereitet (oder ist eindeutig dafür gedacht),
|
|
immer einen entsprechenden Tag setzen. Vorher in der bestehenden Tag-Liste nachsehen, ob
|
|
bereits "Airfryer" oder "Heißluftfritteuse" existiert, und diesen bestehenden Begriff
|
|
wiederverwenden statt ein Duplikat anzulegen.
|
|
- Keine Kategorie/Tag doppelt in leicht anderer Schreibweise anlegen — bei Unsicherheit
|
|
lieber den bestehenden, ähnlichsten Begriff aus der Liste nehmen.
|
|
|
|
### 3. Zutaten bereinigen und normalisieren
|
|
|
|
Rohe Zutatenzeilen (z.B. `"1 Bund glatte Petersilie, fein gehackt"`,
|
|
`"200g Mehl Type 405"`) glätten:
|
|
- Einheiten auf gängige deutsche Kurzformen normalisieren: g, kg, ml, l, TL, EL, Prise,
|
|
Stück, Bund, Dose, Zehe(n) etc. Keine Mischformen wie "gr" oder "Gramm" ausgeschrieben.
|
|
- Zutatennamen vereinheitlichen (z.B. immer "Zwiebel" statt mal "Zwiebeln" mal "Zwiebel(n)"
|
|
innerhalb desselben Rezepts; Tippfehler korrigieren; Duplikate zusammenführen, wenn eine
|
|
Zutat mehrfach mit leicht anderem Namen auftaucht).
|
|
- Fremdsprachige Zutaten ins Deutsche übersetzen (z.B. "all-purpose flour" → "Weizenmehl
|
|
Type 405", "kosher salt" → "Salz").
|
|
|
|
Für eine wirklich strukturierte Bereinigung (getrennte Felder für Menge/Einheit/Zutat,
|
|
nützlich für Einkaufslisten) optional den Mealie-Parser nutzen:
|
|
|
|
```
|
|
mealie_parser_ingredients_batch(ingredients=[<bereinigte Zeilen als Strings>])
|
|
mealie_recipes_update_structured_ingredients(slug=<slug>, parsed_ingredients=<Ergebnis>)
|
|
```
|
|
|
|
Das lohnt sich vor allem, wenn der User Wert auf saubere Einkaufslisten legt. Für die
|
|
reine Text-Bereinigung reicht es, die geglätteten Zutatenzeilen direkt in
|
|
`mealie_recipes_update(ingredients=[...])` zu schreiben (siehe Schritt 5).
|
|
|
|
### 4. Zubereitungsschritte glätten
|
|
|
|
- In flüssiges, klar formuliertes Deutsch bringen (kurze, aktive Sätze, ein Arbeitsschritt
|
|
pro Listeneintrag).
|
|
- Fremdsprachige Anleitungen vollständig übersetzen, nicht nur einzelne Wörter.
|
|
- Inhalt dabei nicht verändern — keine Zutaten/Mengen/Reihenfolge erfinden oder weglassen,
|
|
nur sprachlich glätten und Redundanzen straffen.
|
|
- Falls Schritte vom Scraper unsauber zusammengefasst wurden (z.B. ein Riesenblock Text
|
|
statt einzelner Schritte), sinnvoll in einzelne, in sich abgeschlossene Schritte
|
|
aufteilen.
|
|
|
|
### 5. Alles zusammen in Mealie speichern
|
|
|
|
Ein einziger Update-Call mit allen bereinigten Feldern (spart Round-Trips):
|
|
|
|
```
|
|
mealie_recipes_update(
|
|
slug=<slug>,
|
|
name=<bereinigter, ggf. übersetzter Name>,
|
|
description=<bereinigte Beschreibung>,
|
|
ingredients=[<bereinigte Zutatenzeilen>],
|
|
instructions=[<geglättete Schritte>],
|
|
categories=[<gewählte Kategorien>],
|
|
tags=[<gewählte Tags>],
|
|
recipe_yield=<Portionen, falls unsauber>,
|
|
prep_time=<falls sinnvoll normalisierbar>,
|
|
cook_time=<falls sinnvoll normalisierbar>,
|
|
)
|
|
```
|
|
|
|
Wichtig: `mealie_recipes_update` **ersetzt** Zutaten/Anleitung/Tags/Kategorien komplett —
|
|
immer die vollständige, bereinigte Liste mitschicken, nicht nur die Änderungen.
|
|
|
|
**Achtung Slug-Falle:** Wird im selben Aufruf auch `name` geändert, ändert Mealie
|
|
automatisch den `slug` des Rezepts (z.B. `gemusewaffeln` → `gemusewaffeln-mit-krauterquark`).
|
|
Folgeaufrufe mit dem alten Slug schlagen dann mit `404 No Entry Found` fehl. Wenn `name`
|
|
mitgeschickt wird: den Aufruf **einzeln** machen (nicht mit weiteren Updates kombinieren,
|
|
die noch den alten Slug referenzieren), und danach den neuen Slug per
|
|
`mealie_recipes_search(query=<neuer Name>)` ermitteln, bevor mit diesem Rezept
|
|
weitergearbeitet wird.
|
|
|
|
### 6. Kurze Zusammenfassung an den User
|
|
|
|
Nach dem Speichern knapp berichten, was gemacht wurde — insbesondere:
|
|
- welche Kategorien/Tags gesetzt wurden (und ob welche neu angelegt wurden),
|
|
- ob/was übersetzt wurde,
|
|
- ob Zutaten zusammengeführt oder korrigiert wurden.
|
|
|
|
Keine komplette Rezept-Abschrift im Chat — Mealie zeigt das Ergebnis, ein Link/Slug-Verweis
|
|
reicht.
|
|
|
|
## Mehrere URLs auf einmal
|
|
|
|
Wenn der User mehrere URLs gleichzeitig schickt, jede einzeln importieren
|
|
(`mealie_recipes_create_from_url` pro URL oder `mealie_recipes_create_from_urls_bulk` für
|
|
den Import-Schritt) und danach **jedes Rezept einzeln** durch Schritt 2-5 laufen lassen —
|
|
nicht pauschal dieselben Kategorien/Tags auf alle anwenden, jedes Rezept bekommt seine
|
|
eigene, passende Einordnung.
|
|
|
|
## Edge Cases
|
|
|
|
- **Scraper konnte URL nicht lesen / Import schlägt fehl**: Seite selbst per web_fetch
|
|
holen, Rezeptdaten manuell extrahieren und mit `mealie_recipes_create(...)` anlegen
|
|
(inkl. bereits bereinigter Felder), statt den fehlgeschlagenen Import zu wiederholen.
|
|
- **Rezept existiert schon (Duplikat)**: Vor dem Import kurz mit
|
|
`mealie_recipes_search(query=<Name>)` prüfen. Bei Treffer nachfragen, ob überschrieben/
|
|
aktualisiert oder als neues Rezept angelegt werden soll — nicht stillschweigend doppelt
|
|
anlegen.
|
|
- **Sehr lange/unklare Zutatenliste**: Lieber in Batches mit
|
|
`mealie_parser_ingredients_batch` arbeiten statt einzeln zu parsen.
|