From 7daae6c0dce4f329bbf918cc6cd2d87909cdc7f8 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Tue, 30 Dec 2025 16:20:15 -0500 Subject: [PATCH] Fix UNIQUE constraint error when pages have identical screenshots --- neopig.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/neopig.py b/neopig.py index 23dcbc4..3ce8ca0 100644 --- a/neopig.py +++ b/neopig.py @@ -1532,20 +1532,26 @@ async def backfill_screenshots( old_media = old_media_result.scalar_one_or_none() if old_media and old_hash != new_hash: - new_media = Media( - md5_hash=new_hash, - media_type='screenshot', - mime_type=new_mime, - file_size=new_size, - keywords=old_media.keywords, - alt_text=old_media.alt_text, - title=old_media.title, - first_seen_at=datetime.now(timezone.utc).isoformat(), - analysis_status=old_media.analysis_status, - analysis_result=old_media.analysis_result, + # Check if new hash already exists (duplicate screenshot from another page) + existing = await local_session.execute( + select(Media).where(Media.md5_hash == new_hash) ) - local_session.add(new_media) - await local_session.flush() + if not existing.scalar_one_or_none(): + new_media = Media( + md5_hash=new_hash, + media_type='screenshot', + mime_type=new_mime, + file_size=new_size, + keywords=old_media.keywords, + alt_text=old_media.alt_text, + title=old_media.title, + first_seen_at=datetime.now(timezone.utc).isoformat(), + analysis_status=old_media.analysis_status, + analysis_result=old_media.analysis_result, + ) + local_session.add(new_media) + await local_session.flush() + # Update sources to point to new hash and delete old media await local_session.execute( update(MediaSource).where(MediaSource.md5_hash == old_hash).values(md5_hash=new_hash) )