Tandoor recipe list API may return keyword objects without a 'name'
key, causing KeyError('name'). Use .get() with filtering across all
tag/keyword list comprehensions in both Mealie and Tandoor clients.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New /recipes page with backend switching (Mealie/Tandoor), full-text
search, tag filtering, multi-select bulk delete, per-recipe edit/delete
buttons, and a full recipe editor reusing the import preview form.
New API client methods: list_recipes, get_recipe, update_recipe,
delete_recipe for both MealieClient and TandoorClient.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both APIs require numeric quantity/amount fields. When a range like
"2-3" is detected, uses the first number as the quantity and puts
the full range (e.g. "2- 3 ek") in the note field.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Scraper extracts tags from mindmegette.hu (<a class="tag">) and schema.org keywords
- Tag editor UI with removable chips, search/autocomplete for existing tags, custom add
- Mealie: auto-create tags via POST /api/organizers/tags, include in recipe PATCH
- Tandoor: include keywords in recipe POST (auto-created by name)
- New GET /tags endpoint returns existing tags from both services for search
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add original recipe URL to Mealie description (appended after blank line)
- Check for duplicate recipes on scrape (match orgURL or URL in description)
- Show warning with link to existing recipe if duplicate found
- User can still import anyway (warning only, not blocking)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix ingredient groups creating empty entries in Mealie: set title
field on the first ingredient after the group marker instead
- Refactor scraper with @_register decorator for URL-based site dispatch
- Update README with structured ingredients, groups, MEALIE_INTERNAL_URL
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix Mealie image upload 422: send required `extension` field in form data
- Parse ingredient groups from mindmegette (multiple div.ingredients
containers with strong.ingredients-group titles)
- Show group headers in UI with dashed-border accent input
- Pass group markers through to Mealie as title-only ingredient entries
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mealie validates that recipeInstructions have title and
ingredientReferences fields. Also use dashed UUID format.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The scraper looked for span.quantity/span.unit/span.name which don't
exist. The real HTML uses <strong> for qty, plain <span> for unit,
<a class="ingredients-link"> for name, and <small> for extras like
"(darált)". Also add referenceId to Mealie ingredients (required field).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When deployed behind Cloudflare Tunnel, requests from the container to
the external Mealie URL fail with 530 (hairpin). MEALIE_INTERNAL_URL
lets the container use the Docker-internal address (e.g. http://mealie:9000)
for API calls while keeping the external URL for browser links.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Python/Flask web app that scrapes Hungarian recipe sites (mindmegette.hu)
and imports them into Mealie via its REST API. Includes dark-themed web UI
with editable preview, Dockerfile, build script, and docker-compose.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>