feat: auto-start file watcher with Redis lock for live import

Re-enable the watchfiles-based folder watcher with a Redis lock to
prevent multiple instances from stacking up across restarts. The
watcher is now automatically dispatched on startup when scanner.watch
is true (default), and only one instance runs at a time.

- Redis lock (SETNX + TTL renewal) ensures single-instance execution
- Graceful exit if another watcher holds the lock
- New POST /maintenance/start-watcher endpoint for manual control
- Fix: use settings.scanner/vision properties instead of mulita_config

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-12 22:24:38 +02:00
parent fc8dd370c2
commit d693569f59
4 changed files with 112 additions and 68 deletions

View File

@@ -125,7 +125,7 @@ async def regroup_duplicates(
Idempotent — safe to call as often as you like. Returns a summary dict.
"""
embedder_model = settings.mulita_config.vision.embedder.name
embedder_model = settings.vision.embedder.name
async with AsyncSessionLocal() as session:
# Pull all visible photos with a phash or embedding.
@@ -210,7 +210,7 @@ async def incremental_regroup(
Much faster than a full regroup for post-scan updates:
O(new × log N) via HNSW instead of O(N²).
"""
embedder_model = settings.mulita_config.vision.embedder.name
embedder_model = settings.vision.embedder.name
async with AsyncSessionLocal() as session:
# If no watermark, fall back to full regroup.