15. März 2026 07:43 · Python
Ich habe mir ein kleines Python-Skript gebaut, um meine in Obsidian gepflegten Rezepte nach KitchenOwl zu importieren.
Die Idee dahinter:
- Rezepte bleiben als Markdown-Dateien in Obsidian pflegbar.
- Der Import läuft gesammelt über einen Ordner mit
.md-Dateien. - Bereits importierte Rezepte werden über ein Frontmatter-Feld markiert und beim nächsten Lauf übersprungen.
Vielleicht ist das auch für andere interessant, die ihre Rezepte zuerst lokal in Markdown pflegen und erst danach nach KitchenOwl übernehmen möchten.
Was das Skript kann
Das Skript durchsucht einen Rezept-Ordner rekursiv nach Markdown-Dateien und liest:
- YAML-Frontmatter
- den Titel des Rezepts
- die Sektion
## Zutaten - die Sektion
## Rezept
Unterstützt werden aktuell unter anderem:
titleportionenzeitvorbereitungszeitkochzeittagskitchenOwl
Wenn kitchenOwl: true gesetzt ist, wird das Rezept übersprungen. Das ist praktisch, um bereits übertragene Dateien nicht doppelt zu importieren.
Erwartetes Format in Obsidian
So sieht meine Vorlage aus:
---
title:
portionen:
zeit:
vorbereitungszeit:
kochzeit:
tags:
kitchenOwl:
---
## Zutaten
-
## Rezept
1.
Wichtig ist vor allem:
- Entweder
titleim Frontmatter pflegen oder eine Markdown-Überschrift# Rezeptnamesetzen. - Zutaten müssen als Liste unter
## Zutatenstehen. - Die Zubereitung muss unter
## Rezeptstehen.
Beispielrezept
---
title: Grüne Nudeln
portionen: 2
zeit: 20
vorbereitungszeit: 5
kochzeit: 15
tags:
- pasta
- schnell
kitchenOwl: false
---
## Zutaten
- Nudeln 1 Packung
- Knoblauch 2x
- Spinat 1 Packung
- Parmesan [optional]
## Rezept
1. Nudeln kochen.
2. Spinat und Knoblauch anbraten.
3. Alles vermengen.
Zutaten-Parsing
Das Skript versucht einfache Mengenangaben automatisch zu erkennen. Zum Beispiel:
Zwiebel 2x2x Zwiebel1 Packung NudelnNudeln 1 PackungParmesan [optional]
Dabei wird:
- der Zutatenname nach KitchenOwl übernommen
- die Mengenangabe als Beschreibung gespeichert
[optional]bzw.[opt]als optional markiert
Leere oder ungültige Zutatenzeilen werden übersprungen, damit der API-Request nicht am Schema scheitert.
Voraussetzungen
- Python 3
requests- ein laufendes KitchenOwl-System
- ein gültiger Token
- die
household-id
Installation der Python-Abhängigkeit:
pip install requests
Aufruf
python3 recipes.py \
--input "/pfad/zu/ObsidianCloud/Rezepte" \
--url "http://DEIN-KITCHENOWL-SERVER" \
--token "DEIN_TOKEN" \
--household-id 1 \
--dry-run
Für den echten Import einfach --dry-run weglassen.
Parameter
--input: Ordner mit den Rezept-Markdown-Dateien--url: Basis-URL von KitchenOwl--token: gültiger Bearer-Token, aber ohne das PräfixBearer--household-id: Ziel-Haushalt--dry-run: zeigt nur an, was importiert würde
Zusätzlich gibt es Default-Werte, falls einzelne Felder im Frontmatter fehlen:
--default-portionen 1
--default-zeit 0
--default-vorbereitungszeit 0
--default-kochzeit 0
Was an KitchenOwl gesendet wird
Das Skript baut daraus einen Request auf mit:
namedescriptionitemstagsyieldstimeprep_timecook_timevisibility
Die Beschreibung (description) entspricht dabei dem Inhalt aus ## Rezept.
Typischer Ablauf
- Rezept in Obsidian anlegen.
- Frontmatter ausfüllen.
- Zutaten und Rezept unter den passenden Überschriften eintragen.
- Erst mit
--dry-runtesten. - Danach ohne
--dry-runimportieren. - Optional anschließend in der Datei
kitchenOwl: truesetzen, damit das Rezept beim nächsten Lauf übersprungen wird.
Bekannte Grenzen
- Es wird bewusst nur ein einfaches Markdown-Format unterstützt.
- Komplexe Mengenangaben wie
1/2,ca. 200 g,1 ELoder mehrteilige Einheiten werden nicht speziell normalisiert. - Das Skript setzt voraus, dass die Überschriften genau
## Zutatenund## Rezeptheißen. - Bilder, Notizen oder weitere Obsidian-spezifische Inhalte werden nicht importiert.
Fazit
Für meinen Workflow reicht das sehr gut aus: Rezepte bleiben in Obsidian editierbar und lassen sich bei Bedarf gesammelt nach KitchenOwl übertragen.