diff --git a/README.md b/README.md index f6c87faf..4dea4d32 100644 --- a/README.md +++ b/README.md @@ -277,7 +277,7 @@ Options: --jpeg-quality FLOAT RANGE Value in range 0.0 to 1.0 to use with --convert-to-jpeg. A value of 1.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 iCloud. The current implementation uses Applescript to interact with Photos to @@ -328,9 +328,9 @@ Options: EXIF:OffsetTimeOriginal; EXIF:ModifyDate (see --ignore-date-modified); IPTC:DateCreated; IPTC:TimeCreated; (video - files only): QuickTime:CreationDate (UTC); - QuickTime:ModifyDate (UTC) (see also - --ignore-date-modified); + files only): QuickTime:CreationDate; + QuickTime:CreateDate; QuickTime:ModifyDate + (see also --ignore-date-modified); QuickTime:GPSCoordinates; UserData:GPSCoordinates. --ignore-date-modified If used with --exiftool or --sidecar, will @@ -398,7 +398,8 @@ Options: work with iTerm2 (use with Terminal.app). This is faster and more reliable than the default AppleScript interface. - --report REPORTNAME.CSV Write a CSV formatted report of all files + --report + Write a CSV formatted report of all files that were exported. --cleanup Cleanup export directory by deleting any files which were not included in this export diff --git a/osxphotos/__main__.py b/osxphotos/__main__.py index 200f1aa6..a4cbdb99 100644 --- a/osxphotos/__main__.py +++ b/osxphotos/__main__.py @@ -1337,7 +1337,7 @@ def query( "XMP:PersonInImage; EXIF:GPSLatitudeRef; EXIF:GPSLongitudeRef; EXIF:GPSLatitude; EXIF:GPSLongitude; " "EXIF:GPSPosition; EXIF:DateTimeOriginal; EXIF:OffsetTimeOriginal; " "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.", ) @click.option( diff --git a/osxphotos/_version.py b/osxphotos/_version.py index e1574725..7e796e39 100644 --- a/osxphotos/_version.py +++ b/osxphotos/_version.py @@ -1,5 +1,5 @@ """ version info """ -__version__ = "0.38.2" +__version__ = "0.38.3" diff --git a/osxphotos/photoinfo/_photoinfo_export.py b/osxphotos/photoinfo/_photoinfo_export.py index 66164c93..1d4974f5 100644 --- a/osxphotos/photoinfo/_photoinfo_export.py +++ b/osxphotos/photoinfo/_photoinfo_export.py @@ -1197,7 +1197,8 @@ def _exiftool_dict( EXIF:ModifyDate IPTC:DateCreated IPTC:TimeCreated - QuickTime:CreationDate (UTC) + QuickTime:CreationDate + QuickTime:CreateDate (UTC) QuickTime:ModifyDate (UTC) QuickTime:GPSCoordinates UserData:GPSCoordinates @@ -1300,22 +1301,26 @@ def _exiftool_dict( # [IPTC] Digital Creation Date : 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: # if photo has modification date, use it otherwise use creation date - if self.isphoto: - date = self.date - # exiftool expects format to "2015:01:18 12:00:00" - datetimeoriginal = date.strftime("%Y:%m:%d %H:%M:%S") + date = self.date + 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]}" + # 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: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 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") elif self.ismovie: # 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 - 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") - exif["QuickTime:CreationDate"] = creationdate exif["QuickTime:CreateDate"] = creationdate if self.date_modified is not None and not ignore_date_modified: exif["QuickTime:ModifyDate"] = datetime_tz_to_utc( @@ -1381,7 +1390,8 @@ def _exiftool_json_sidecar( EXIF:ModifyDate IPTC:DigitalCreationDate IPTC:DateCreated - QuickTime:CreationDate (UTC) + QuickTime:CreationDate + QuickTime:CreateDate (UTC) QuickTime:ModifyDate (UTC) QuickTime:GPSCoordinates UserData:GPSCoordinates diff --git a/tests/test_cli.py b/tests/test_cli.py index 4c9469e6..5a85c08b 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -344,7 +344,7 @@ CLI_EXIFTOOL_QUICKTIME = { "XMP:TagsList": "Travel", "XMP:Subject": "Travel", "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:ModifyDate": "2020:01:05 22:13:13", }, @@ -355,7 +355,7 @@ CLI_EXIFTOOL_QUICKTIME = { "XMP:TagsList": "Travel", "XMP:Subject": "Travel", "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:ModifyDate": "2020:12:05 05:21:52", },