summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/indexer/enrich_photo.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/indexer/enrich_photo.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/indexer/enrich_photo.py17
1 files changed, 17 insertions, 0 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/indexer/enrich_photo.py b/packages/meshbay-node/src/meshbay_node/indexer/enrich_photo.py
index 44f9ebb..93a68cc 100644
--- a/packages/meshbay-node/src/meshbay_node/indexer/enrich_photo.py
+++ b/packages/meshbay-node/src/meshbay_node/indexer/enrich_photo.py
@@ -143,6 +143,22 @@ class PhotoEnricher:
on_done: Callable[[str, dict], Awaitable[None]],
) -> None:
async with self._sem:
+ # entry.id is the file's own content hash — the same bytes
+ # produce the same thumbnail, so a hit here means this exact
+ # content was already decoded, resized and EXIF-read at some
+ # point (this run, an earlier one, even a previous daemon
+ # process — media_cache.db is the durable half of this).
+ # Without this check, every restart re-ran Pillow over every
+ # image in every configured photo_root from scratch — the
+ # in-memory GroupIndex enrichment fields don't survive a
+ # restart, but this cache does, and nothing was reading it
+ # before spawning the expensive work.
+ cached_hash = await self._media_cache.get_thumb_hash_by_file_id(entry.id)
+ cached_meta = await self._media_cache.get_photo_meta(entry.id) if cached_hash else None
+ if cached_hash and cached_meta:
+ await on_done(entry.id, {**cached_meta, "thumb_hash": cached_hash})
+ return
+
fields: dict = {}
try:
thumb, width, height, taken_at, camera = await asyncio.wait_for(
@@ -153,6 +169,7 @@ class PhotoEnricher:
fields["camera"] = camera
thumb_hash = blake3.blake3(thumb).hexdigest()
await self._media_cache.put_thumb(thumb_hash, entry.id, thumb)
+ await self._media_cache.put_photo_meta(entry.id, width, height, taken_at, camera)
fields["thumb_hash"] = thumb_hash
except Exception as e:
log.warning("Photo enrichment failed for %s: %s", file_path, e)