Fix for QuickTime date/time, issue #282

This commit is contained in:
Rhet Turnbull
2020-12-12 22:13:01 -08:00
parent 1dffe894ff
commit d8593a01e2
5 changed files with 34 additions and 23 deletions

View File

@@ -277,7 +277,7 @@ Options:
--jpeg-quality FLOAT RANGE Value in range 0.0 to 1.0 to use with --jpeg-quality FLOAT RANGE Value in range 0.0 to 1.0 to use with
--convert-to-jpeg. A value of 1.0 specifies --convert-to-jpeg. A value of 1.0 specifies
best quality, a value of 0.0 specifies best quality, a value of 0.0 specifies
maximum compression. Defaults to 1.0. maximum compression. Defaults to 1.0
--download-missing Attempt to download missing photos from --download-missing Attempt to download missing photos from
iCloud. The current implementation uses iCloud. The current implementation uses
Applescript to interact with Photos to Applescript to interact with Photos to
@@ -328,9 +328,9 @@ Options:
EXIF:OffsetTimeOriginal; EXIF:ModifyDate EXIF:OffsetTimeOriginal; EXIF:ModifyDate
(see --ignore-date-modified); (see --ignore-date-modified);
IPTC:DateCreated; IPTC:TimeCreated; (video IPTC:DateCreated; IPTC:TimeCreated; (video
files only): QuickTime:CreationDate (UTC); files only): QuickTime:CreationDate;
QuickTime:ModifyDate (UTC) (see also QuickTime:CreateDate; QuickTime:ModifyDate
--ignore-date-modified); (see also --ignore-date-modified);
QuickTime:GPSCoordinates; QuickTime:GPSCoordinates;
UserData:GPSCoordinates. UserData:GPSCoordinates.
--ignore-date-modified If used with --exiftool or --sidecar, will --ignore-date-modified If used with --exiftool or --sidecar, will
@@ -398,7 +398,8 @@ Options:
work with iTerm2 (use with Terminal.app). work with iTerm2 (use with Terminal.app).
This is faster and more reliable than the This is faster and more reliable than the
default AppleScript interface. default AppleScript interface.
--report REPORTNAME.CSV Write a CSV formatted report of all files --report <path to export report>
Write a CSV formatted report of all files
that were exported. that were exported.
--cleanup Cleanup export directory by deleting any --cleanup Cleanup export directory by deleting any
files which were not included in this export files which were not included in this export

View File

@@ -1337,7 +1337,7 @@ def query(
"XMP:PersonInImage; EXIF:GPSLatitudeRef; EXIF:GPSLongitudeRef; EXIF:GPSLatitude; EXIF:GPSLongitude; " "XMP:PersonInImage; EXIF:GPSLatitudeRef; EXIF:GPSLongitudeRef; EXIF:GPSLatitude; EXIF:GPSLongitude; "
"EXIF:GPSPosition; EXIF:DateTimeOriginal; EXIF:OffsetTimeOriginal; " "EXIF:GPSPosition; EXIF:DateTimeOriginal; EXIF:OffsetTimeOriginal; "
"EXIF:ModifyDate (see --ignore-date-modified); IPTC:DateCreated; IPTC:TimeCreated; " "EXIF:ModifyDate (see --ignore-date-modified); IPTC:DateCreated; IPTC:TimeCreated; "
"(video files only): QuickTime:CreationDate (UTC); QuickTime:ModifyDate (UTC) (see also --ignore-date-modified); " "(video files only): QuickTime:CreationDate; QuickTime:CreateDate; QuickTime:ModifyDate (see also --ignore-date-modified); "
"QuickTime:GPSCoordinates; UserData:GPSCoordinates.", "QuickTime:GPSCoordinates; UserData:GPSCoordinates.",
) )
@click.option( @click.option(

View File

@@ -1,5 +1,5 @@
""" version info """ """ version info """
__version__ = "0.38.2" __version__ = "0.38.3"

View File

@@ -1197,7 +1197,8 @@ def _exiftool_dict(
EXIF:ModifyDate EXIF:ModifyDate
IPTC:DateCreated IPTC:DateCreated
IPTC:TimeCreated IPTC:TimeCreated
QuickTime:CreationDate (UTC) QuickTime:CreationDate
QuickTime:CreateDate (UTC)
QuickTime:ModifyDate (UTC) QuickTime:ModifyDate (UTC)
QuickTime:GPSCoordinates QuickTime:GPSCoordinates
UserData:GPSCoordinates UserData:GPSCoordinates
@@ -1300,22 +1301,26 @@ def _exiftool_dict(
# [IPTC] Digital Creation Date : 2020:10:30 # [IPTC] Digital Creation Date : 2020:10:30
# [IPTC] Date Created : 2020:10:30 # [IPTC] Date Created : 2020:10:30
# #
# for videos:
# [QuickTime] CreateDate : 2020:12:11 06:10:10
# [QuickTime] ModifyDate : 2020:12:11 06:10:10
# [Keys] CreationDate : 2020:12:10 22:10:10-08:00
# This code deviates from Photos in one regard: # This code deviates from Photos in one regard:
# if photo has modification date, use it otherwise use creation date # if photo has modification date, use it otherwise use creation date
if self.isphoto: date = self.date
date = self.date offsettime = date.strftime("%z")
# exiftool expects format to "2015:01:18 12:00:00" # find timezone offset in format "-04:00"
datetimeoriginal = date.strftime("%Y:%m:%d %H:%M:%S") offset = re.findall(r"([+-]?)([\d]{2})([\d]{2})", offsettime)
offset = offset[0] # findall returns list of tuples
offsettime = f"{offset[0]}{offset[1]}:{offset[2]}"
# exiftool expects format to "2015:01:18 12:00:00"
datetimeoriginal = date.strftime("%Y:%m:%d %H:%M:%S")
if self.isphoto:
exif["EXIF:DateTimeOriginal"] = datetimeoriginal exif["EXIF:DateTimeOriginal"] = datetimeoriginal
exif["EXIF:CreateDate"] = datetimeoriginal exif["EXIF:CreateDate"] = datetimeoriginal
offsettime = date.strftime("%z")
# find timezone offset in format "-04:00"
offset = re.findall(r"([+-]?)([\d]{2})([\d]{2})", offsettime)
offset = offset[0] # findall returns list of tuples
offsettime = f"{offset[0]}{offset[1]}:{offset[2]}"
exif["EXIF:OffsetTimeOriginal"] = offsettime exif["EXIF:OffsetTimeOriginal"] = offsettime
dateoriginal = date.strftime("%Y:%m:%d") dateoriginal = date.strftime("%Y:%m:%d")
@@ -1330,10 +1335,14 @@ def _exiftool_dict(
exif["EXIF:ModifyDate"] = self.date.strftime("%Y:%m:%d %H:%M:%S") exif["EXIF:ModifyDate"] = self.date.strftime("%Y:%m:%d %H:%M:%S")
elif self.ismovie: elif self.ismovie:
# QuickTime spec specifies times in UTC # QuickTime spec specifies times in UTC
# QuickTime:CreateDate and ModifyDate are in UTC w/ no timezone
# QuickTime:CreationDate must include time offset or Photos shows invalid values
# reference: https://exiftool.org/TagNames/QuickTime.html#Keys # reference: https://exiftool.org/TagNames/QuickTime.html#Keys
date_utc = datetime_tz_to_utc(self.date) # https://exiftool.org/forum/index.php?topic=11927.msg64369#msg64369
exif["QuickTime:CreationDate"] = f"{datetimeoriginal}{offsettime}"
date_utc = datetime_tz_to_utc(date)
creationdate = date_utc.strftime("%Y:%m:%d %H:%M:%S") creationdate = date_utc.strftime("%Y:%m:%d %H:%M:%S")
exif["QuickTime:CreationDate"] = creationdate
exif["QuickTime:CreateDate"] = creationdate exif["QuickTime:CreateDate"] = creationdate
if self.date_modified is not None and not ignore_date_modified: if self.date_modified is not None and not ignore_date_modified:
exif["QuickTime:ModifyDate"] = datetime_tz_to_utc( exif["QuickTime:ModifyDate"] = datetime_tz_to_utc(
@@ -1381,7 +1390,8 @@ def _exiftool_json_sidecar(
EXIF:ModifyDate EXIF:ModifyDate
IPTC:DigitalCreationDate IPTC:DigitalCreationDate
IPTC:DateCreated IPTC:DateCreated
QuickTime:CreationDate (UTC) QuickTime:CreationDate
QuickTime:CreateDate (UTC)
QuickTime:ModifyDate (UTC) QuickTime:ModifyDate (UTC)
QuickTime:GPSCoordinates QuickTime:GPSCoordinates
UserData:GPSCoordinates UserData:GPSCoordinates

View File

@@ -344,7 +344,7 @@ CLI_EXIFTOOL_QUICKTIME = {
"XMP:TagsList": "Travel", "XMP:TagsList": "Travel",
"XMP:Subject": "Travel", "XMP:Subject": "Travel",
"QuickTime:GPSCoordinates": "34.053345 -118.242349", "QuickTime:GPSCoordinates": "34.053345 -118.242349",
"QuickTime:CreationDate": "2020:01:05 22:13:13", "QuickTime:CreationDate": "2020:01:05 14:13:13-08:00",
"QuickTime:CreateDate": "2020:01:05 22:13:13", "QuickTime:CreateDate": "2020:01:05 22:13:13",
"QuickTime:ModifyDate": "2020:01:05 22:13:13", "QuickTime:ModifyDate": "2020:01:05 22:13:13",
}, },
@@ -355,7 +355,7 @@ CLI_EXIFTOOL_QUICKTIME = {
"XMP:TagsList": "Travel", "XMP:TagsList": "Travel",
"XMP:Subject": "Travel", "XMP:Subject": "Travel",
"QuickTime:GPSCoordinates": "34.053345 -118.242349", "QuickTime:GPSCoordinates": "34.053345 -118.242349",
"QuickTime:CreationDate": "2020:12:05 05:21:52", "QuickTime:CreationDate": "2020:12:04 21:21:52-08:00",
"QuickTime:CreateDate": "2020:12:05 05:21:52", "QuickTime:CreateDate": "2020:12:05 05:21:52",
"QuickTime:ModifyDate": "2020:12:05 05:21:52", "QuickTime:ModifyDate": "2020:12:05 05:21:52",
}, },