- requirements: add recipe-scrapers 15.6.0 - mealie.import_from_url(): POST /api/recipes/create/url returns slug - db helpers: insert_discovered_recipe, update_discovered_meta, set_discovered_status, list_discovered_recipes (FULLTEXT + JSON filters), count_discovered_by_status, get_discovered_recipe; discover-job CRUD + anti-zombie finalize + stuck-job recovery - discover_recipes.py: daemon-thread runner (mirrors enrich pattern) walks a URL list; scrape_me → reshape to mealie shape → INSERT IGNORE → forge.enrich_recipe → flip raw → enriched. SEED_URLS curated starter packs for allrecipes / bbc / smitten / pinch / hbh. - endpoints: GET /discover, GET /api/discover/search (q + cuisine + complexity + protein + meal_type + kid-fit + max_minutes + status), POST /api/discover/import/<id>, /reject/<id>, /scrape-start (seed or urls list), /scrape-status, /scrape-cancel/<id> - discover.html: filter row + card grid + collapsible scrape panel with seed chips and url textarea + live progress poll - nav: 'discover' tab on /, link card on /me - boot recovery: fail_stuck_discover_jobs at startup
79 lines
3.8 KiB
HTML
79 lines
3.8 KiB
HTML
{% extends "_base.html" %}
|
|
{% block title %}{{ user.name or user.email }} · Cauldron{% endblock %}
|
|
{% block content %}
|
|
|
|
<div class="page-head">
|
|
<div class="crumb">// account</div>
|
|
<h1><span class="accent">{{ user.name or user.email.split('@')[0] }}</span></h1>
|
|
<div class="lede">welcome back to the coven.</div>
|
|
</div>
|
|
|
|
<section class="panel">
|
|
<div class="panel-head">
|
|
<h2>identity</h2>
|
|
<span class="ctx">authentik</span>
|
|
</div>
|
|
<dl class="kv">
|
|
<dt>email</dt><dd>{{ user.email }}</dd>
|
|
<dt>subject</dt><dd>{{ user.sub }}</dd>
|
|
</dl>
|
|
</section>
|
|
|
|
<section class="panel green">
|
|
<div class="panel-head">
|
|
<h2>mealie</h2>
|
|
{% if connected %}<span class="pill pill-ok">connected</span>{% else %}<span class="pill pill-warn">not connected</span>{% endif %}
|
|
</div>
|
|
|
|
{% if connected and mealie_user %}
|
|
<dl class="kv">
|
|
<dt>logged in as</dt><dd>{{ mealie_user.username or mealie_user.email }}</dd>
|
|
<dt>full name</dt><dd>{{ mealie_user.fullName or '—' }}</dd>
|
|
<dt>role</dt><dd>{{ 'admin' if mealie_user.admin else 'member' }}</dd>
|
|
{% if mealie_user.household %}
|
|
<dt>household</dt><dd>{{ mealie_user.household.name or mealie_user.household.slug }} · {{ household_size }} {% if household_size == 1 %}member{% else %}members{% endif %}</dd>
|
|
{% endif %}
|
|
</dl>
|
|
<form method="post" action="/disconnect-mealie" class="btn-row">
|
|
<button class="btn btn-purple" type="submit">Disconnect</button>
|
|
<span class="muted">revoking on mealie's side also works.</span>
|
|
</form>
|
|
{% elif connected %}
|
|
<p class="muted">token stored, but mealie didn't return profile data. probably revoked or rotated.</p>
|
|
<form method="post" action="/disconnect-mealie" class="btn-row">
|
|
<button class="btn btn-purple" type="submit">Reset</button>
|
|
</form>
|
|
{% else %}
|
|
<p>connect mealie so cauldron can act on your behalf — your recipes, your meal plan, your shopping list. one-time, ~30 seconds.</p>
|
|
<p><a class="btn btn-primary" href="/connect-mealie">Connect mealie →</a></p>
|
|
{% endif %}
|
|
</section>
|
|
|
|
{% if connected %}
|
|
<section class="panel">
|
|
<div class="panel-head">
|
|
<h2>tools</h2>
|
|
<span class="ctx">household admin</span>
|
|
</div>
|
|
<p class="muted">mealie's parser is per-recipe; this kicks off a bulk pass over your whole library. review proposals, apply the good ones.</p>
|
|
<p><a class="btn" href="/sterilize">🪄 bulk sterilize recipes →</a></p>
|
|
<p class="muted" style="margin-top:14px;">scan your foods table for dupes, ask hecate to pick canonicals, merge in mealie. one-time cleanup; aliases get attached to the survivors so the parser fuzzy-matches variants from now on.</p>
|
|
<p><a class="btn" href="/consolidate">🔮 consolidate foods table →</a></p>
|
|
|
|
<p class="muted" style="margin-top:14px;">find duplicate recipes by name + ingredient similarity. hecate picks the canonical to keep; you confirm per cluster before mealie deletes the others. permanent — review carefully.</p>
|
|
<p><a class="btn" href="/dedupe-recipes">🌀 dedupe recipes →</a></p>
|
|
|
|
<p class="muted" style="margin-top:14px;">have hecate generate per-recipe metadata — cuisine, complexity, macros, primary protein/carb, comfort tier, summary. the plan generator reads this so "high protein week" is a real query, not just a vibe.</p>
|
|
<p><a class="btn" href="/enrich-recipes">✨ enrich recipes →</a></p>
|
|
|
|
<p class="muted" style="margin-top:14px;">browse a cross-household corpus of scraped recipes — search by cuisine / protein / time / kid-friendliness. one click sends a recipe to your mealie library; sterilize+enrich pipelines run on it like any other.</p>
|
|
<p><a class="btn" href="/discover">🌐 discover recipes →</a></p>
|
|
</section>
|
|
{% endif %}
|
|
|
|
<hr>
|
|
<form method="post" action="/logout">
|
|
<button class="btn" type="submit">Sign out</button>
|
|
</form>
|
|
|
|
{% endblock %}
|