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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user