cauldron/cauldron/templates/me.html
Kayos 3ec120c1d9 discover v0.1: scrape + search + import
- 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
2026-05-01 07:38:27 -07:00

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 %}