feat: Implement Modify Identified workflow for person management

This commit introduces the Modify Identified workflow, allowing users to edit person information, view associated faces, and unmatch faces from identified people. The API has been updated with new endpoints for unmatching faces and retrieving faces for specific persons. The frontend includes a new Modify page with a user-friendly interface for managing identified persons, including search and edit functionalities. Documentation and tests have been updated to reflect these changes, ensuring reliability and usability.
This commit is contained in:
tanyar09
2025-11-04 12:00:39 -05:00
parent bb42478c8f
commit 91ee2ce8ab
14 changed files with 1972 additions and 48 deletions
+115
View File
@@ -0,0 +1,115 @@
#!/usr/bin/env python3
"""
Test script to debug EXIF date extraction from photos.
Run this to see what EXIF data is available in your photos.
"""
import sys
import os
from pathlib import Path
from PIL import Image
from datetime import datetime
# Add src to path
sys.path.insert(0, str(Path(__file__).parent.parent))
from src.web.services.photo_service import extract_exif_date
def test_exif_extraction(image_path: str):
"""Test EXIF extraction from a single image."""
print(f"\n{'='*60}")
print(f"Testing: {image_path}")
print(f"{'='*60}")
if not os.path.exists(image_path):
print(f"❌ File not found: {image_path}")
return
# Try to open with PIL
try:
with Image.open(image_path) as img:
print(f"✅ Image opened successfully")
print(f" Format: {img.format}")
print(f" Size: {img.size}")
# Try getexif()
exifdata = None
try:
exifdata = img.getexif()
print(f"✅ getexif() worked: {len(exifdata) if exifdata else 0} tags")
except Exception as e:
print(f"❌ getexif() failed: {e}")
# Try _getexif() (deprecated)
old_exif = None
try:
if hasattr(img, '_getexif'):
old_exif = img._getexif()
print(f"✅ _getexif() worked: {len(old_exif) if old_exif else 0} tags")
else:
print(f"⚠️ _getexif() not available")
except Exception as e:
print(f"❌ _getexif() failed: {e}")
# Check for specific date tags
date_tags = {
306: "DateTime",
36867: "DateTimeOriginal",
36868: "DateTimeDigitized",
}
print(f"\n📅 Checking date tags:")
found_any = False
if exifdata:
for tag_id, tag_name in date_tags.items():
try:
if tag_id in exifdata:
value = exifdata[tag_id]
print(f"{tag_name} ({tag_id}): {value}")
found_any = True
else:
print(f"{tag_name} ({tag_id}): Not found")
except Exception as e:
print(f" ⚠️ {tag_name} ({tag_id}): Error - {e}")
# Try EXIF IFD
if exifdata and hasattr(exifdata, 'get_ifd'):
try:
exif_ifd = exifdata.get_ifd(0x8769)
if exif_ifd:
print(f"\n📋 EXIF IFD found: {len(exif_ifd)} tags")
for tag_id, tag_name in date_tags.items():
if tag_id in exif_ifd:
value = exif_ifd[tag_id]
print(f"{tag_name} ({tag_id}) in IFD: {value}")
found_any = True
except Exception as e:
print(f" ⚠️ EXIF IFD access failed: {e}")
if not found_any:
print(f" ⚠️ No date tags found in EXIF data")
# Try our extraction function
print(f"\n🔍 Testing extract_exif_date():")
extracted_date = extract_exif_date(image_path)
if extracted_date:
print(f" ✅ Extracted date: {extracted_date}")
else:
print(f" ❌ No date extracted")
except Exception as e:
print(f"❌ Error opening image: {e}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python test_exif_extraction.py <image_path>")
print("\nExample:")
print(" python test_exif_extraction.py /path/to/photo.jpg")
sys.exit(1)
image_path = sys.argv[1]
test_exif_extraction(image_path)