feat: Add PrismaCompatibleDate type and enhance date validation in photo extraction

This commit introduces a new `PrismaCompatibleDate` type to ensure compatibility with Prisma's SQLite driver by storing dates in a DateTime format. Additionally, the `extract_exif_date`, `extract_video_date`, and `extract_photo_date` functions are updated to include validation checks that reject future dates and dates prior to 1900, enhancing data integrity during photo and video metadata extraction.
This commit is contained in:
Tanya
2026-01-05 15:05:03 -05:00
parent c69604573d
commit fe01ff51b8
2 changed files with 115 additions and 6 deletions
+31 -5
View File
@@ -100,12 +100,20 @@ def extract_exif_date(image_path: str) -> Optional[date]:
# Parse EXIF date format (YYYY:MM:DD HH:MM:SS)
try:
dt = datetime.strptime(date_str, "%Y:%m:%d %H:%M:%S")
return dt.date()
extracted_date = dt.date()
# Validate date before returning (reject future dates)
if extracted_date > date.today() or extracted_date < date(1900, 1, 1):
continue # Skip invalid dates
return extracted_date
except ValueError:
# Try alternative format
try:
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
return dt.date()
extracted_date = dt.date()
# Validate date before returning (reject future dates)
if extracted_date > date.today() or extracted_date < date(1900, 1, 1):
continue # Skip invalid dates
return extracted_date
except ValueError:
continue
except (KeyError, TypeError):
@@ -123,11 +131,19 @@ def extract_exif_date(image_path: str) -> Optional[date]:
if date_str:
try:
dt = datetime.strptime(date_str, "%Y:%m:%d %H:%M:%S")
return dt.date()
extracted_date = dt.date()
# Validate date before returning (reject future dates)
if extracted_date > date.today() or extracted_date < date(1900, 1, 1):
continue # Skip invalid dates
return extracted_date
except ValueError:
try:
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
return dt.date()
extracted_date = dt.date()
# Validate date before returning (reject future dates)
if extracted_date > date.today() or extracted_date < date(1900, 1, 1):
continue # Skip invalid dates
return extracted_date
except ValueError:
continue
except Exception:
@@ -216,7 +232,11 @@ def extract_video_date(video_path: str) -> Optional[date]:
else:
# Try other common formats
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
return dt.date()
extracted_date = dt.date()
# Validate date before returning (reject future dates)
if extracted_date > date.today() or extracted_date < date(1900, 1, 1):
continue # Skip invalid dates
return extracted_date
except (ValueError, AttributeError):
continue
except (subprocess.TimeoutExpired, FileNotFoundError, json.JSONDecodeError, Exception) as e:
@@ -230,6 +250,9 @@ def extract_video_date(video_path: str) -> Optional[date]:
if os.path.exists(video_path):
mtime = os.path.getmtime(video_path)
mtime_date = datetime.fromtimestamp(mtime).date()
# Validate date before returning (reject future dates)
if mtime_date > date.today() or mtime_date < date(1900, 1, 1):
return None # Skip invalid dates
return mtime_date
except Exception as e:
# Log error for debugging (but don't fail the import)
@@ -260,6 +283,9 @@ def extract_photo_date(image_path: str) -> Optional[date]:
if os.path.exists(image_path):
mtime = os.path.getmtime(image_path)
mtime_date = datetime.fromtimestamp(mtime).date()
# Validate date before returning (reject future dates)
if mtime_date > date.today() or mtime_date < date(1900, 1, 1):
return None # Skip invalid dates
return mtime_date
except Exception as e:
# Log error for debugging (but don't fail the import)