From 74e423cf278ca1801a1eb29746f1d71205a8f322 Mon Sep 17 00:00:00 2001 From: Jos Huisken <2773186+joshuisken@users.noreply.github.com> Date: Fri, 28 Mar 2025 17:58:40 +0100 Subject: [PATCH 1/2] get_datetaken in UTC, added numeric get_latitude+get_longitude --- exiffield/getters.py | 49 +++++++++++++++++++++++++++++++++++--------- pyproject.toml | 2 +- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/exiffield/getters.py b/exiffield/getters.py index 79e4215..ca0c628 100644 --- a/exiffield/getters.py +++ b/exiffield/getters.py @@ -21,13 +21,13 @@ class Mode(ChoicesEnum, Enum): # NOTE inherits from `Enum` to make `mypy` happy SINGLE = 'single' -def exifgetter(field: str) -> Callable[[ExifType], Any]: +def exifgetter(field: str, val='val') -> Callable[[ExifType], Any]: """ Return the unmodified value. """ def inner(exif: ExifType) -> Any: - return exif[field]['val'] + return exif[field][val] inner.__name__ = f'exifgetter("{field}")' return inner @@ -44,19 +44,28 @@ def get_datetaken(exif: ExifType) -> Optional[datetime.datetime]: """ Return when the file was created. """ - for key in ['DateTimeOriginal', 'GPSDateTime']: - try: - datetime_str = exif[key]['val'] - except KeyError: - continue + def to_datetime(dt_str): try: return datetime.datetime.strptime( - datetime_str, - '%Y:%m:%d %H:%M:%S', + dt_str, + '%Y:%m:%d %H:%M:%S%z', ) except ValueError as e: - raise ExifError(f'Could not parse {datetime_str}') from e + raise ExifError(f'Could not parse {dt_str}') from e + + try: + datetime_str = exif['GPSDateTime']['val'] + "+00:00" + return to_datetime(datetime_str) + except KeyError: + pass + + try: + datetime_str = exif['DateTimeOriginal']['val'] + exif['OffsetTime']['val'] + return to_datetime(datetime_str) + except KeyError: + pass + raise ExifError('Could not find date') @@ -109,3 +118,23 @@ def get_sequencenumber(exif) -> int: return exif['SequenceNumber']['num'] except KeyError: return 0 + + +def get_latitude(exif) -> float: + """ + Return numeric latitude. + """ + try: + return exif['GPSLatitude']['num'] + except KeyError: + return 0 + + +def get_longitude(exif) -> float: + """ + Return numeric longitude. + """ + try: + return exif['GPSLongitude']['num'] + except KeyError: + return 0 diff --git a/pyproject.toml b/pyproject.toml index 072a296..082f7fa 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "django-exiffield" -version = "3.0.0" +version = "3.0.1" description = "django-exiffield extracts exif information by utilizing the exiftool." authors = [ "Alexander Frenzel ", From 1c874486abadde45707a3096113ca5389e5e9c02 Mon Sep 17 00:00:00 2001 From: Jos Huisken <2773186+joshuisken@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:52:45 +0200 Subject: [PATCH 2/2] Fix GPSDateTime --- exiffield/getters.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exiffield/getters.py b/exiffield/getters.py index ca0c628..cbbbb83 100644 --- a/exiffield/getters.py +++ b/exiffield/getters.py @@ -55,7 +55,9 @@ def to_datetime(dt_str): raise ExifError(f'Could not parse {dt_str}') from e try: - datetime_str = exif['GPSDateTime']['val'] + "+00:00" + datetime_str = exif['GPSDateTime']['val'] + if datetime_str[-1] == 'Z': + datetime_str = datetime_str[:-1] + '+00:00' return to_datetime(datetime_str) except KeyError: pass