in opensfm/exif.py [0:0]
def extract_capture_time(self):
if (
"GPS GPSDate" in self.tags
and "GPS GPSTimeStamp" in self.tags # Actually GPSDateStamp
):
try:
hours = int(get_tag_as_float(self.tags, "GPS GPSTimeStamp", 0))
minutes = int(get_tag_as_float(self.tags, "GPS GPSTimeStamp", 1))
seconds = get_tag_as_float(self.tags, "GPS GPSTimeStamp", 2)
gps_timestamp_string = "{0:s} {1:02d}:{2:02d}:{3:02f}".format(
self.tags["GPS GPSDate"].values, hours, minutes, seconds
)
return (
datetime.datetime.strptime(
gps_timestamp_string, "%Y:%m:%d %H:%M:%S.%f"
)
- datetime.datetime(1970, 1, 1)
).total_seconds()
except (TypeError, ValueError):
logger.info(
'The GPS time stamp in image file "{0:s}" is invalid. '
"Falling back to DateTime*".format(self.fileobj_name)
)
time_strings = [
("EXIF DateTimeOriginal", "EXIF SubSecTimeOriginal", "EXIF Tag 0x9011"),
("EXIF DateTimeDigitized", "EXIF SubSecTimeDigitized", "EXIF Tag 0x9012"),
("Image DateTime", "Image SubSecTime", "Image Tag 0x9010"),
]
for datetime_tag, subsec_tag, offset_tag in time_strings:
if datetime_tag in self.tags:
date_time = self.tags[datetime_tag].values
if subsec_tag in self.tags:
subsec_time = self.tags[subsec_tag].values
else:
subsec_time = "0"
try:
s = "{0:s}.{1:s}".format(date_time, subsec_time)
d = datetime.datetime.strptime(s, "%Y:%m:%d %H:%M:%S.%f")
except ValueError:
logger.debug(
'The "{1:s}" time stamp or "{2:s}" tag is invalid in '
'image file "{0:s}"'.format(
self.fileobj_name, datetime_tag, subsec_tag
)
)
continue
# Test for OffsetTimeOriginal | OffsetTimeDigitized | OffsetTime
if offset_tag in self.tags:
offset_time = self.tags[offset_tag].values
try:
d += datetime.timedelta(
hours=-int(offset_time[0:3]), minutes=int(offset_time[4:6])
)
except (TypeError, ValueError):
logger.debug(
'The "{0:s}" time zone offset in image file "{1:s}"'
" is invalid".format(offset_tag, self.fileobj_name)
)
logger.debug(
'Naively assuming UTC on "{0:s}" in image file '
'"{1:s}"'.format(datetime_tag, self.fileobj_name)
)
else:
logger.debug(
"No GPS time stamp and no time zone offset in image "
'file "{0:s}"'.format(self.fileobj_name)
)
logger.debug(
'Naively assuming UTC on "{0:s}" in image file "{1:s}"'.format(
datetime_tag, self.fileobj_name
)
)
return (d - datetime.datetime(1970, 1, 1)).total_seconds()
logger.info(
'Image file "{0:s}" has no valid time stamp'.format(self.fileobj_name)
)
return 0.0