Added uti_raw for 10.14, added tests
@ -1161,6 +1161,9 @@ Returns Uniform Type Identifier (UTI) for the current version of the image, for
|
|||||||
#### `uti_original`
|
#### `uti_original`
|
||||||
Returns Uniform Type Identifier (UTI) for the original image, for example: 'public.jpeg' or 'com.apple.quicktime-movie'.
|
Returns Uniform Type Identifier (UTI) for the original image, for example: 'public.jpeg' or 'com.apple.quicktime-movie'.
|
||||||
|
|
||||||
|
#### `uti_edited`
|
||||||
|
Returns Uniform Type Identifier (UTI) for the edited image, for example: 'public.jpeg'. Returns None if the photo does not have adjustments.
|
||||||
|
|
||||||
#### `uti_raw`
|
#### `uti_raw`
|
||||||
Returns Uniform Type Identifier (UTI) for the associated RAW image, if there is one; for example, 'com.canon.cr2-raw-image'.
|
Returns Uniform Type Identifier (UTI) for the associated RAW image, if there is one; for example, 'com.canon.cr2-raw-image'.
|
||||||
|
|
||||||
|
|||||||
@ -197,7 +197,7 @@ class PhotoInfo:
|
|||||||
filename = f"{self._uuid}_1_201_a.jpeg"
|
filename = f"{self._uuid}_1_201_a.jpeg"
|
||||||
else:
|
else:
|
||||||
# could be a heic or a jpeg
|
# could be a heic or a jpeg
|
||||||
if self.uti == 'public.heic':
|
if self.uti == "public.heic":
|
||||||
filename = f"{self._uuid}_1_201_a.heic"
|
filename = f"{self._uuid}_1_201_a.heic"
|
||||||
else:
|
else:
|
||||||
filename = f"{self._uuid}_1_201_a.jpeg"
|
filename = f"{self._uuid}_1_201_a.jpeg"
|
||||||
@ -506,6 +506,11 @@ class PhotoInfo:
|
|||||||
""" Returns Uniform Type Identifier (UTI) for the image
|
""" Returns Uniform Type Identifier (UTI) for the image
|
||||||
for example: public.jpeg or com.apple.quicktime-movie
|
for example: public.jpeg or com.apple.quicktime-movie
|
||||||
"""
|
"""
|
||||||
|
if self._db._db_version <= _PHOTOS_4_VERSION:
|
||||||
|
return (
|
||||||
|
self._info["UTI_edited"] if self.hasadjustments else self._info["UTI"]
|
||||||
|
)
|
||||||
|
else:
|
||||||
return self._info["UTI"]
|
return self._info["UTI"]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -515,6 +520,17 @@ class PhotoInfo:
|
|||||||
"""
|
"""
|
||||||
return self._info["UTI_original"]
|
return self._info["UTI_original"]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def uti_edited(self):
|
||||||
|
""" Returns Uniform Type Identifier (UTI) for the edited image
|
||||||
|
if the photo has been edited, otherwise None;
|
||||||
|
for example: public.jpeg
|
||||||
|
"""
|
||||||
|
if self._db._db_version >= _PHOTOS_5_VERSION:
|
||||||
|
return self.uti if self.hasadjustments else None
|
||||||
|
else:
|
||||||
|
return self._info["UTI_edited"]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def uti_raw(self):
|
def uti_raw(self):
|
||||||
""" Returns Uniform Type Identifier (UTI) for the RAW image if there is one
|
""" Returns Uniform Type Identifier (UTI) for the RAW image if there is one
|
||||||
|
|||||||
@ -989,9 +989,13 @@ class PhotosDB:
|
|||||||
|
|
||||||
self._dbphotos[uuid]["UTI"] = row[22]
|
self._dbphotos[uuid]["UTI"] = row[22]
|
||||||
|
|
||||||
# TODO: need to update this for Photos 4
|
# The UTI in RKMaster will always be UTI of the original
|
||||||
|
# Unlike Photos 5 which changes the UTI to match latest edit
|
||||||
self._dbphotos[uuid]["UTI_original"] = row[22]
|
self._dbphotos[uuid]["UTI_original"] = row[22]
|
||||||
|
|
||||||
|
# UTI edited will be read from RKModelResource
|
||||||
|
self._dbphotos[uuid]["UTI_edited"] = None
|
||||||
|
|
||||||
# handle burst photos
|
# handle burst photos
|
||||||
# if burst photo, determine whether or not it's a selected burst photo
|
# if burst photo, determine whether or not it's a selected burst photo
|
||||||
self._dbphotos[uuid]["burstUUID"] = row[23]
|
self._dbphotos[uuid]["burstUUID"] = row[23]
|
||||||
@ -1129,7 +1133,6 @@ class PhotosDB:
|
|||||||
info["isMissing"] = row[3]
|
info["isMissing"] = row[3]
|
||||||
info["originalFilename"] = row[4]
|
info["originalFilename"] = row[4]
|
||||||
info["UTI"] = row[5]
|
info["UTI"] = row[5]
|
||||||
info["UTI_original"] = None # filled in later
|
|
||||||
info["modelID"] = row[6]
|
info["modelID"] = row[6]
|
||||||
info["fileSize"] = row[7]
|
info["fileSize"] = row[7]
|
||||||
info["isTrulyRAW"] = row[8]
|
info["isTrulyRAW"] = row[8]
|
||||||
@ -1163,7 +1166,6 @@ class PhotosDB:
|
|||||||
if (
|
if (
|
||||||
row[1] != "UNADJUSTEDNONRAW"
|
row[1] != "UNADJUSTEDNONRAW"
|
||||||
and row[1] != "UNADJUSTED"
|
and row[1] != "UNADJUSTED"
|
||||||
# and row[4] == "public.jpeg"
|
|
||||||
and row[6] == 2
|
and row[6] == 2
|
||||||
):
|
):
|
||||||
if "edit_resource_id" in self._dbphotos[uuid]:
|
if "edit_resource_id" in self._dbphotos[uuid]:
|
||||||
@ -1177,6 +1179,7 @@ class PhotosDB:
|
|||||||
# should we return all edits or just most recent one?
|
# should we return all edits or just most recent one?
|
||||||
# For now, return most recent edit
|
# For now, return most recent edit
|
||||||
self._dbphotos[uuid]["edit_resource_id"] = row[2]
|
self._dbphotos[uuid]["edit_resource_id"] = row[2]
|
||||||
|
self._dbphotos[uuid]["UTI_edited"] = row[4]
|
||||||
|
|
||||||
# get details on external edits
|
# get details on external edits
|
||||||
c.execute(
|
c.execute(
|
||||||
@ -1249,7 +1252,7 @@ class PhotosDB:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Order of results
|
# Order of results
|
||||||
# 0 RKMaster.uuid,
|
# 0 RKVersion.uuid,
|
||||||
# 1 RKMaster.cloudLibraryState,
|
# 1 RKMaster.cloudLibraryState,
|
||||||
# 2 RKCloudResource.available,
|
# 2 RKCloudResource.available,
|
||||||
# 3 RKCloudResource.status
|
# 3 RKCloudResource.status
|
||||||
@ -1332,6 +1335,7 @@ class PhotosDB:
|
|||||||
if info["has_raw"]:
|
if info["has_raw"]:
|
||||||
raw_uuid = info["raw_master_uuid"]
|
raw_uuid = info["raw_master_uuid"]
|
||||||
info["raw_info"] = self._dbphotos_master[raw_uuid]
|
info["raw_info"] = self._dbphotos_master[raw_uuid]
|
||||||
|
info["UTI_raw"] = self._dbphotos_master[raw_uuid]["UTI"]
|
||||||
|
|
||||||
# done with the database connection
|
# done with the database connection
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.1 MiB |
BIN
tests/Test-10.14.6.photoslibrary/Masters/2020/10/05/20201005-041506/IMG_1997.JPG
Executable file
|
After Width: | Height: | Size: 2.9 MiB |
BIN
tests/Test-10.14.6.photoslibrary/Masters/2020/10/05/20201005-041506/IMG_1997.cr2
Executable file
BIN
tests/Test-10.14.6.photoslibrary/Masters/2020/10/05/20201005-041514/IMG_1994.JPG
Executable file
|
After Width: | Height: | Size: 2.8 MiB |
BIN
tests/Test-10.14.6.photoslibrary/Masters/2020/10/05/20201005-041514/IMG_1994.cr2
Executable file
BIN
tests/Test-10.14.6.photoslibrary/Masters/2020/10/05/20201005-041542/DSC03584.dng
Executable file
|
After Width: | Height: | Size: 1.9 MiB |
@ -36,7 +36,7 @@
|
|||||||
<key>other</key>
|
<key>other</key>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
<key>photos</key>
|
<key>photos</key>
|
||||||
<integer>6</integer>
|
<integer>11</integer>
|
||||||
<key>videos</key>
|
<key>videos</key>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
</dict>
|
</dict>
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>PhotoAnalysisGraphLastBackgroundGraphRebuildJobDate</key>
|
<key>PhotoAnalysisGraphLastBackgroundGraphRebuildJobDate</key>
|
||||||
<date>2020-07-27T03:16:28Z</date>
|
<date>2020-10-04T23:43:21Z</date>
|
||||||
<key>PhotoAnalysisGraphLastBackgroundMemoryGenerationJobDate</key>
|
<key>PhotoAnalysisGraphLastBackgroundMemoryGenerationJobDate</key>
|
||||||
<date>2020-07-27T12:35:43Z</date>
|
<date>2020-10-05T04:14:45Z</date>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@ -2,11 +2,7 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>ProcessedInQuiescentState</key>
|
|
||||||
<true/>
|
|
||||||
<key>SuggestedMeIdentifier</key>
|
<key>SuggestedMeIdentifier</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
<key>Version</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<key>LithiumMessageTracer</key>
|
<key>LithiumMessageTracer</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>LastReportedDate</key>
|
<key>LastReportedDate</key>
|
||||||
<date>2020-07-27T03:18:40Z</date>
|
<date>2020-10-04T23:49:39Z</date>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 3.7 MiB |
|
After Width: | Height: | Size: 3.0 MiB |
|
After Width: | Height: | Size: 3.4 MiB |
@ -11,6 +11,6 @@
|
|||||||
<key>PLLastRevGeoForcedProviderOutOfDateCheckVersionKey</key>
|
<key>PLLastRevGeoForcedProviderOutOfDateCheckVersionKey</key>
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
<key>PLLastRevGeoVerFileFetchDateKey</key>
|
<key>PLLastRevGeoVerFileFetchDateKey</key>
|
||||||
<date>2020-07-27T03:16:25Z</date>
|
<date>2020-10-04T23:43:17Z</date>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>LastHistoryRowId</key>
|
<key>LastHistoryRowId</key>
|
||||||
<integer>707</integer>
|
<integer>943</integer>
|
||||||
<key>LibraryBuildTag</key>
|
<key>LibraryBuildTag</key>
|
||||||
<string>D8C4AAA1-3AB6-4A65-BEBD-99CC3E5D433E</string>
|
<string>D8C4AAA1-3AB6-4A65-BEBD-99CC3E5D433E</string>
|
||||||
<key>LibrarySchemaVersion</key>
|
<key>LibrarySchemaVersion</key>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 234 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 290 KiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 328 KiB |
|
After Width: | Height: | Size: 158 KiB |
|
After Width: | Height: | Size: 465 KiB |
@ -9,7 +9,7 @@
|
|||||||
<key>HistoricalMarker</key>
|
<key>HistoricalMarker</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>LastHistoryRowId</key>
|
<key>LastHistoryRowId</key>
|
||||||
<integer>707</integer>
|
<integer>943</integer>
|
||||||
<key>LibraryBuildTag</key>
|
<key>LibraryBuildTag</key>
|
||||||
<string>D8C4AAA1-3AB6-4A65-BEBD-99CC3E5D433E</string>
|
<string>D8C4AAA1-3AB6-4A65-BEBD-99CC3E5D433E</string>
|
||||||
<key>LibrarySchemaVersion</key>
|
<key>LibrarySchemaVersion</key>
|
||||||
@ -24,7 +24,7 @@
|
|||||||
<key>SnapshotCompletedDate</key>
|
<key>SnapshotCompletedDate</key>
|
||||||
<date>2019-07-27T13:16:43Z</date>
|
<date>2019-07-27T13:16:43Z</date>
|
||||||
<key>SnapshotLastValidated</key>
|
<key>SnapshotLastValidated</key>
|
||||||
<date>2020-07-27T03:18:40Z</date>
|
<date>2020-10-04T23:49:39Z</date>
|
||||||
<key>SnapshotTables</key>
|
<key>SnapshotTables</key>
|
||||||
<dict/>
|
<dict/>
|
||||||
</dict>
|
</dict>
|
||||||
|
|||||||
BIN
tests/test-images/IMG_1994.JPG
Executable file
|
After Width: | Height: | Size: 2.8 MiB |
BIN
tests/test-images/IMG_1994.cr2
Executable file
BIN
tests/test-images/IMG_1997.JPG
Executable file
|
After Width: | Height: | Size: 2.9 MiB |
BIN
tests/test-images/IMG_1997.cr2
Executable file
@ -41,7 +41,7 @@ UUID_DICT = {
|
|||||||
"favorite": "6bxcNnzRQKGnK4uPrCJ9UQ",
|
"favorite": "6bxcNnzRQKGnK4uPrCJ9UQ",
|
||||||
"not_favorite": "8SOE9s0XQVGsuq4ONohTng",
|
"not_favorite": "8SOE9s0XQVGsuq4ONohTng",
|
||||||
"date_invalid": "YZFCPY24TUySvpu7owiqxA",
|
"date_invalid": "YZFCPY24TUySvpu7owiqxA",
|
||||||
"intrash": "3tljdX43R8+k6peNHVrJNQ",
|
"intrash": "td4yIljYS8aRAgzlsRRDtQ",
|
||||||
"not_intrash": "6bxcNnzRQKGnK4uPrCJ9UQ",
|
"not_intrash": "6bxcNnzRQKGnK4uPrCJ9UQ",
|
||||||
"has_adjustments": "6bxcNnzRQKGnK4uPrCJ9UQ",
|
"has_adjustments": "6bxcNnzRQKGnK4uPrCJ9UQ",
|
||||||
}
|
}
|
||||||
@ -53,8 +53,8 @@ ALBUM_SORT_ORDER = [
|
|||||||
]
|
]
|
||||||
ALBUM_KEY_PHOTO = "15uNd7%8RguTEgNPKHfTWw"
|
ALBUM_KEY_PHOTO = "15uNd7%8RguTEgNPKHfTWw"
|
||||||
|
|
||||||
PHOTOS_DB_LEN = 8
|
PHOTOS_DB_LEN = 13
|
||||||
PHOTOS_NOT_IN_TRASH_LEN = 7
|
PHOTOS_NOT_IN_TRASH_LEN = 12
|
||||||
PHOTOS_IN_TRASH_LEN = 1
|
PHOTOS_IN_TRASH_LEN = 1
|
||||||
|
|
||||||
|
|
||||||
|
|||||||