Added test cases and documentation for shared photos and shared albums

This commit is contained in:
Rhet Turnbull 2019-12-26 22:13:25 -08:00
parent 10284d6589
commit 6d20e9e361
125 changed files with 1138 additions and 32 deletions

View File

@ -14,15 +14,17 @@
- [Open the default Photos library](#open-the-default-photos-library) - [Open the default Photos library](#open-the-default-photos-library)
- [Open System Photos library](#open-system-photos-library) - [Open System Photos library](#open-system-photos-library)
- [Open a specific Photos library](#open-a-specific-photos-library) - [Open a specific Photos library](#open-a-specific-photos-library)
- [```keywords```](#keywords) - [`keywords`](#keywords)
- [```albums```](#albums) - [`albums`](#albums)
- [```persons```](#persons) - [`albums_shared`](#albums_shared)
- [```keywords_as_dict```](#keywords_as_dict) - [`persons`](#persons)
- [```persons_as_dict```](#persons_as_dict) - [`keywords_as_dict`](#keywords_as_dict)
- [```albums_as_dict```](#albums_as_dict) - [`persons_as_dict`](#persons_as_dict)
- [```library_path```](#library_path) - [`albums_as_dict`](#albums_as_dict)
- [```db_path```](#db_path) - [`albums_shared_as_dict`](#albums_shared_as_dict)
- [```db_version```](#db_version) - [`library_path`](#library_path)
- [`db_path`](#db_path)
- [`db_version`](#db_version)
- [`photos(keywords=[], uuid=[], persons=[], albums=[])`](#photoskeywords-uuid-persons-albums) - [`photos(keywords=[], uuid=[], persons=[], albums=[])`](#photoskeywords-uuid-persons-albums)
+ [PhotoInfo](#photoinfo) + [PhotoInfo](#photoinfo)
- [`uuid`](#uuid) - [`uuid`](#uuid)
@ -31,9 +33,9 @@
- [`date`](#date) - [`date`](#date)
- [`description`](#description) - [`description`](#description)
- [`title`](#title) - [`title`](#title)
- [`keywords`](#keywords) - [`keywords`](#keywords-1)
- [`albums`](#albums) - [`albums`](#albums-1)
- [`persons`](#persons) - [`persons`](#persons-1)
- [`path`](#path) - [`path`](#path)
- [`path_edited`](#path_edited) - [`path_edited`](#path_edited)
- [`ismissing`](#ismissing) - [`ismissing`](#ismissing)
@ -42,6 +44,7 @@
- [`favorite`](#favorite) - [`favorite`](#favorite)
- [`hidden`](#hidden) - [`hidden`](#hidden)
- [`location`](#location) - [`location`](#location)
- [`shared`](#shared)
- [`json()`](#json) - [`json()`](#json)
- [`export(dest, *filename, edited=False, overwrite=False, increment=True, sidecar=False)`](#exportdest-filename-editedfalse-overwritefalse-incrementtrue-sidecarfalse) - [`export(dest, *filename, edited=False, overwrite=False, increment=True, sidecar=False)`](#exportdest-filename-editedfalse-overwritefalse-incrementtrue-sidecarfalse)
+ [Utility Functions](#utility-functions) + [Utility Functions](#utility-functions)
@ -56,7 +59,6 @@
* [Implementation Notes](#implementation-notes) * [Implementation Notes](#implementation-notes)
* [Dependencies](#dependencies) * [Dependencies](#dependencies)
* [Acknowledgements](#acknowledgements) * [Acknowledgements](#acknowledgements)
## What is osxphotos? ## What is osxphotos?
@ -283,7 +285,7 @@ Pass the fully qualified path to the Photos library or the actual database file
Returns a PhotosDB object. Returns a PhotosDB object.
#### ```keywords``` #### `keywords`
```python ```python
# assumes photosdb is a PhotosDB object (see above) # assumes photosdb is a PhotosDB object (see above)
keywords = photosdb.keywords keywords = photosdb.keywords
@ -291,7 +293,7 @@ keywords = photosdb.keywords
Returns a list of the keywords found in the Photos library Returns a list of the keywords found in the Photos library
#### ```albums``` #### `albums`
```python ```python
# assumes photosdb is a PhotosDB object (see above) # assumes photosdb is a PhotosDB object (see above)
albums = photosdb.albums albums = photosdb.albums
@ -301,7 +303,13 @@ Returns a list of the albums found in the Photos library.
**Note**: In Photos 5.0 (MacOS 10.15/Catalina), It is possible to have more than one album with the same name in Photos. Albums with duplicate names are treated as a single album and the photos in each are combined. For example, if you have two albums named "Wedding" and each has 2 photos, osxphotos will treat this as a single album named "Wedding" with 4 photos in it. **Note**: In Photos 5.0 (MacOS 10.15/Catalina), It is possible to have more than one album with the same name in Photos. Albums with duplicate names are treated as a single album and the photos in each are combined. For example, if you have two albums named "Wedding" and each has 2 photos, osxphotos will treat this as a single album named "Wedding" with 4 photos in it.
#### ```persons``` #### `albums_shared`
Returns list of shared albums found in photos database (e.g. albums shared via iCloud photo sharing)
**Note**: *Only valid for Photos 5 / MacOS 10.15*; on Photos <= 4, prints warning and returns empty list.
#### `persons`
```python ```python
# assumes photosdb is a PhotosDB object (see above) # assumes photosdb is a PhotosDB object (see above)
persons = photosdb.persons persons = photosdb.persons
@ -309,7 +317,7 @@ persons = photosdb.persons
Returns a list of the persons (faces) found in the Photos library Returns a list of the persons (faces) found in the Photos library
#### ```keywords_as_dict``` #### `keywords_as_dict`
```python ```python
# assumes photosdb is a PhotosDB object (see above) # assumes photosdb is a PhotosDB object (see above)
keyword_dict = photosdb.keywords_as_dict keyword_dict = photosdb.keywords_as_dict
@ -317,7 +325,7 @@ keyword_dict = photosdb.keywords_as_dict
Returns a dictionary of keywords found in the Photos library where key is the keyword and value is the count of how many times that keyword appears in the library (ie. how many photos are tagged with the keyword). Resulting dictionary is in reverse sorted order (e.g. keyword with the highest count is first). Returns a dictionary of keywords found in the Photos library where key is the keyword and value is the count of how many times that keyword appears in the library (ie. how many photos are tagged with the keyword). Resulting dictionary is in reverse sorted order (e.g. keyword with the highest count is first).
#### ```persons_as_dict``` #### `persons_as_dict`
```python ```python
# assumes photosdb is a PhotosDB object (see above) # assumes photosdb is a PhotosDB object (see above)
persons_dict = photosdb.persons_as_dict persons_dict = photosdb.persons_as_dict
@ -325,7 +333,7 @@ persons_dict = photosdb.persons_as_dict
Returns a dictionary of persons (faces) found in the Photos library where key is the person name and value is the count of how many times that person appears in the library (ie. how many photos are tagged with the person). Resulting dictionary is in reverse sorted order (e.g. person who appears in the most photos is listed first). Returns a dictionary of persons (faces) found in the Photos library where key is the person name and value is the count of how many times that person appears in the library (ie. how many photos are tagged with the person). Resulting dictionary is in reverse sorted order (e.g. person who appears in the most photos is listed first).
#### ```albums_as_dict``` #### `albums_as_dict`
```python ```python
# assumes photosdb is a PhotosDB object (see above) # assumes photosdb is a PhotosDB object (see above)
albums_dict = photosdb.albums_as_dict albums_dict = photosdb.albums_as_dict
@ -335,7 +343,17 @@ Returns a dictionary of albums found in the Photos library where key is the albu
**Note**: In Photos 5.0 (MacOS 10.15/Catalina), It is possible to have more than one album with the same name in Photos. Albums with duplicate names are treated as a single album and the photos in each are combined. For example, if you have two albums named "Wedding" and each has 2 photos, osxphotos will treat this as a single album named "Wedding" with 4 photos in it. **Note**: In Photos 5.0 (MacOS 10.15/Catalina), It is possible to have more than one album with the same name in Photos. Albums with duplicate names are treated as a single album and the photos in each are combined. For example, if you have two albums named "Wedding" and each has 2 photos, osxphotos will treat this as a single album named "Wedding" with 4 photos in it.
#### ```library_path``` #### `albums_shared_as_dict`
```python
# assumes photosdb is a PhotosDB object (see above)
albums_shared_dict = photosdb.albums_shared_as_dict
```
Returns a dictionary of shared albums (e.g. shared via iCloud photo sharing) found in the Photos library where key is the album name and value is the count of how many photos are in the album. Resulting dictionary is in reverse sorted order (e.g. album with the most photos is listed first).
**Note**: *Photos 5 / MacOS 10.15 only*. On earlier versions of Photos, prints warning and returns empty dictionary.
#### `library_path`
```python ```python
# assumes photosdb is a PhotosDB object (see above) # assumes photosdb is a PhotosDB object (see above)
photosdb.library_path photosdb.library_path
@ -343,7 +361,7 @@ photosdb.library_path
Returns the path to the Photos library as a string Returns the path to the Photos library as a string
#### ```db_path``` #### `db_path`
```python ```python
# assumes photosdb is a PhotosDB object (see above) # assumes photosdb is a PhotosDB object (see above)
photosdb.db_path photosdb.db_path
@ -351,7 +369,7 @@ photosdb.db_path
Returns the path to the Photos database PhotosDB was initialized with Returns the path to the Photos database PhotosDB was initialized with
#### ```db_version``` #### `db_version`
```python ```python
# assumes photosdb is a PhotosDB object (see above) # assumes photosdb is a PhotosDB object (see above)
photosdb.db_version photosdb.db_version
@ -481,6 +499,11 @@ Returns `True` if the picture has been marked as hidden, otherwise `False`
#### `location` #### `location`
Returns latitude and longitude as a tuple of floats (latitude, longitude). If location is not set, latitude and longitude are returned as `None` Returns latitude and longitude as a tuple of floats (latitude, longitude). If location is not set, latitude and longitude are returned as `None`
#### `shared`
Returns True if photo is in a shared album, otherwise False.
**Note**: *Only valid on Photos 5 / MacOS 10.15*; on Photos <= 4, returns None instead of True/False.
#### `json()` #### `json()`
Returns a JSON representation of all photo info Returns a JSON representation of all photo info

View File

@ -1,3 +1,3 @@
""" version info """ """ version info """
__version__ = "0.17.08" __version__ = "0.18.00"

View File

@ -200,7 +200,39 @@ class PhotosDB:
def albums_as_dict(self): def albums_as_dict(self):
""" return albums as dict of albums, count in reverse sorted order (descending) """ """ return albums as dict of albums, count in reverse sorted order (descending) """
albums = {} albums = {}
for k in self._dbalbums_album.keys(): album_keys = [
k
for k in self._dbalbums_album.keys()
if self._dbalbum_details[k]["cloudownerhashedpersonid"] is None
]
for k in album_keys:
title = self._dbalbum_details[k]["title"]
if title in albums:
albums[title] += len(self._dbalbums_album[k])
else:
albums[title] = len(self._dbalbums_album[k])
albums = dict(sorted(albums.items(), key=lambda kv: kv[1], reverse=True))
return albums
@property
def albums_shared_as_dict(self):
""" returns shared albums as dict of albums, count in reverse sorted order (descending)
valid only on Photos 5; on Photos <= 4, prints warning and returns empty dict """
# if _dbalbum_details[key]["cloudownerhashedpersonid"] is not None, then it's a shared album
if self._db_version < _PHOTOS_5_VERSION:
logging.warning(
f"albums_shared not implemented for Photos versions < {_PHOTOS_5_VERSION}"
)
return {}
albums = {}
album_keys = [
k
for k in self._dbalbums_album.keys()
if self._dbalbum_details[k]["cloudownerhashedpersonid"] is not None
]
for k in album_keys:
title = self._dbalbum_details[k]["title"] title = self._dbalbum_details[k]["title"]
if title in albums: if title in albums:
albums[title] += len(self._dbalbums_album[k]) albums[title] += len(self._dbalbums_album[k])
@ -224,10 +256,43 @@ class PhotosDB:
@property @property
def albums(self): def albums(self):
""" return list of albums found in photos database """ """ return list of albums found in photos database """
# Could be more than one album with same name # Could be more than one album with same name
# Right now, they are treated as same album and photos are combined from albums with same name # Right now, they are treated as same album and photos are combined from albums with same name
albums = set() albums = set()
for album in self._dbalbums_album.keys(): album_keys = [
k
for k in self._dbalbums_album.keys()
if self._dbalbum_details[k]["cloudownerhashedpersonid"] is None
]
for album in album_keys:
albums.add(self._dbalbum_details[album]["title"])
return list(albums)
@property
def albums_shared(self):
""" return list of shared albums found in photos database
only valid for Photos 5; on Photos <= 4, prints warning and returns empty list """
# Could be more than one album with same name
# Right now, they are treated as same album and photos are combined from albums with same name
# if _dbalbum_details[key]["cloudownerhashedpersonid"] is not None, then it's a shared album
if self._db_version < _PHOTOS_5_VERSION:
logging.warning(
f"albums_shared not implemented for Photos versions < {_PHOTOS_5_VERSION}"
)
return []
albums = set()
album_keys = [
k
for k in self._dbalbums_album.keys()
if self._dbalbum_details[k]["cloudownerhashedpersonid"] is not None
]
for album in album_keys:
albums.add(self._dbalbum_details[album]["title"]) albums.add(self._dbalbum_details[album]["title"])
return list(albums) return list(albums)
@ -854,7 +919,7 @@ class PhotosDB:
# 13 "ZGENERICASSET.ZLATITUDE, " # 13 "ZGENERICASSET.ZLATITUDE, "
# 14 "ZGENERICASSET.ZLONGITUDE, " # 14 "ZGENERICASSET.ZLONGITUDE, "
# 15 "ZGENERICASSET.ZHASADJUSTMENTS " # 15 "ZGENERICASSET.ZHASADJUSTMENTS "
# 16 "ZCLOUDOWNERHASHEDPERSONID " # 16 "ZCLOUDOWNERHASHEDPERSONID " -- If not null, indicates a shared photo
i = 0 i = 0
for row in c: for row in c:
@ -862,11 +927,6 @@ class PhotosDB:
uuid = row[0] uuid = row[0]
logging.debug(f"i = {i:d}, uuid = '{uuid}") logging.debug(f"i = {i:d}, uuid = '{uuid}")
# TODO: temporary fix for shared cloud photos
# if row[16] is not None:
# logging.debug(f"skipping shared cloud photo {uuid}, ZCLOUDOWNERHASHEDPERSONID: {row[16]}")
# continue
self._dbphotos[uuid] = {} self._dbphotos[uuid] = {}
self._dbphotos[uuid]["_uuid"] = uuid # stored here for easier debugging self._dbphotos[uuid]["_uuid"] = uuid # stored here for easier debugging
self._dbphotos[uuid]["modelID"] = None self._dbphotos[uuid]["modelID"] = None
@ -900,7 +960,7 @@ class PhotosDB:
self._dbphotos[uuid]["longitude"] = row[14] self._dbphotos[uuid]["longitude"] = row[14]
self._dbphotos[uuid]["hasAdjustments"] = row[15] self._dbphotos[uuid]["hasAdjustments"] = row[15]
self._dbphotos[uuid]["cloudOwnerHashedPersonID"] = row[16] self._dbphotos[uuid]["cloudOwnerHashedPersonID"] = row[16]
self._dbphotos[uuid]["shared"] = True if row[16] is not None else False self._dbphotos[uuid]["shared"] = True if row[16] is not None else False

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LibrarySchemaVersion</key>
<integer>5001</integer>
<key>MetaSchemaVersion</key>
<integer>3</integer>
</dict>
</plist>

View File

@ -0,0 +1,186 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BlacklistedMeaningsByMeaning</key>
<dict/>
<key>SceneWhitelist</key>
<array>
<string>Graduation</string>
<string>Aquarium</string>
<string>Food</string>
<string>Ice Skating</string>
<string>Mountain</string>
<string>Cliff</string>
<string>Basketball</string>
<string>Tennis</string>
<string>Jewelry</string>
<string>Cheese</string>
<string>Softball</string>
<string>Football</string>
<string>Circus</string>
<string>Jet Ski</string>
<string>Playground</string>
<string>Carousel</string>
<string>Paint Ball</string>
<string>Windsurfing</string>
<string>Sailboat</string>
<string>Sunbathing</string>
<string>Dam</string>
<string>Fireplace</string>
<string>Flower</string>
<string>Scuba</string>
<string>Hiking</string>
<string>Cetacean</string>
<string>Pier</string>
<string>Bowling</string>
<string>Snowboarding</string>
<string>Zoo</string>
<string>Snowmobile</string>
<string>Theater</string>
<string>Boat</string>
<string>Casino</string>
<string>Car</string>
<string>Diving</string>
<string>Cycling</string>
<string>Musical Instrument</string>
<string>Board Game</string>
<string>Castle</string>
<string>Sunset Sunrise</string>
<string>Martial Arts</string>
<string>Motocross</string>
<string>Submarine</string>
<string>Cat</string>
<string>Snow</string>
<string>Kiteboarding</string>
<string>Squash</string>
<string>Geyser</string>
<string>Music</string>
<string>Archery</string>
<string>Desert</string>
<string>Blackjack</string>
<string>Fireworks</string>
<string>Sportscar</string>
<string>Feline</string>
<string>Soccer</string>
<string>Museum</string>
<string>Baby</string>
<string>Fencing</string>
<string>Railroad</string>
<string>Nascar</string>
<string>Sky Surfing</string>
<string>Bird</string>
<string>Games</string>
<string>Baseball</string>
<string>Dressage</string>
<string>Snorkeling</string>
<string>Pyramid</string>
<string>Kite</string>
<string>Rowboat</string>
<string>Golf</string>
<string>Watersports</string>
<string>Lightning</string>
<string>Canyon</string>
<string>Auditorium</string>
<string>Night Sky</string>
<string>Karaoke</string>
<string>Skiing</string>
<string>Parade</string>
<string>Forest</string>
<string>Hot Air Balloon</string>
<string>Dragon Parade</string>
<string>Easter Egg</string>
<string>Monument</string>
<string>Jungle</string>
<string>Thanksgiving</string>
<string>Jockey Horse</string>
<string>Stadium</string>
<string>Airplane</string>
<string>Ballet</string>
<string>Yoga</string>
<string>Coral Reef</string>
<string>Skating</string>
<string>Wrestling</string>
<string>Bicycle</string>
<string>Tattoo</string>
<string>Amusement Park</string>
<string>Canoe</string>
<string>Cheerleading</string>
<string>Ping Pong</string>
<string>Fishing</string>
<string>Magic</string>
<string>Reptile</string>
<string>Winter Sport</string>
<string>Waterfall</string>
<string>Train</string>
<string>Bonsai</string>
<string>Surfing</string>
<string>Dog</string>
<string>Cake</string>
<string>Sledding</string>
<string>Sandcastle</string>
<string>Glacier</string>
<string>Lighthouse</string>
<string>Equestrian</string>
<string>Rafting</string>
<string>Shore</string>
<string>Hockey</string>
<string>Santa Claus</string>
<string>Formula One Car</string>
<string>Sport</string>
<string>Vehicle</string>
<string>Boxing</string>
<string>Rollerskating</string>
<string>Underwater</string>
<string>Orchestra</string>
<string>Carnival</string>
<string>Rocket</string>
<string>Skateboarding</string>
<string>Helicopter</string>
<string>Performance</string>
<string>Oktoberfest</string>
<string>Water Polo</string>
<string>Skate Park</string>
<string>Animal</string>
<string>Nightclub</string>
<string>String Instrument</string>
<string>Dinosaur</string>
<string>Gymnastics</string>
<string>Cricket</string>
<string>Volcano</string>
<string>Lake</string>
<string>Aurora</string>
<string>Dancing</string>
<string>Concert</string>
<string>Rock Climbing</string>
<string>Hang Glider</string>
<string>Rodeo</string>
<string>Fish</string>
<string>Art</string>
<string>Motorcycle</string>
<string>Volleyball</string>
<string>Wake Boarding</string>
<string>Badminton</string>
<string>Motor Sport</string>
<string>Sumo</string>
<string>Parasailing</string>
<string>Skydiving</string>
<string>Kickboxing</string>
<string>Pinata</string>
<string>Foosball</string>
<string>Go Kart</string>
<string>Poker</string>
<string>Kayak</string>
<string>Swimming</string>
<string>Atv</string>
<string>Beach</string>
<string>Dartboard</string>
<string>Athletics</string>
<string>Camping</string>
<string>Tornado</string>
<string>Billiards</string>
<string>Rugby</string>
<string>Airshow</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>insertAlbum</key>
<array/>
<key>insertAsset</key>
<array/>
<key>insertHighlight</key>
<array/>
<key>insertMemory</key>
<array/>
<key>insertMoment</key>
<array/>
<key>removeAlbum</key>
<array/>
<key>removeAsset</key>
<array/>
<key>removeHighlight</key>
<array/>
<key>removeMemory</key>
<array/>
<key>removeMoment</key>
<array/>
</dict>
</plist>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>embeddingVersion</key>
<string>1</string>
<key>localeIdentifier</key>
<string>en_US</string>
<key>sceneTaxonomySHA</key>
<string>87914a047c69fbe8013fad2c70fa70c6c03b08b56190fe4054c880e6b9f57cc3</string>
<key>searchIndexVersion</key>
<string>10</string>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CollapsedSidebarSectionIdentifiers</key>
<array/>
<key>ExpandedSidebarItemIdentifiers</key>
<array>
<string>PXSharedAlbumsVirtualCollection</string>
<string>13A08E24-F8C0-458F-9D29-BDDCAE13BB00/L0/020</string>
</array>
<key>lastAddToDestination</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGuCwwZGhshJy40NTY6PkFVJG51
bGzWDQ4PEBESExQVFhcYXxAwSVBYTmF2aWdhdGlvbkRlc3RpbmF0aW9uQXV4aWxpYXJ5
U3RvcmVBcmNoaXZlS2V5XxAzSVBYTmF2aWdhdGlvbkRlc3RpbmF0aW9uUGFyZW50RGVz
dGluYXRpb25BcmNoaXZlS2V5XxBCSVBYTmF2aWdhdGlvbkRlc3RpbmF0aW9uUmVxdWly
ZWREZXN0aW5hdGlvbkF1eGlsaWFyeUtleXNBcmNoaXZlS2V5XxAnSVBYTmF2aWdhdGlv
bkRlc3RpbmF0aW9uVGl0bGVBcmNoaXZlS2V5XxAsSVBYTmF2aWdhdGlvbkRlc3RpbmF0
aW9uSWRlbnRpZmllckFyY2hpdmVLZXlWJGNsYXNzgASAAIALgAOAAoANXxAWY29tLmFw
cGxlLnBob3Rvcy5hbGJ1bVtQaG90byBTaG9vdNMcHRIeHyBfEDFVWEF1eGlsaWFyeU5h
dmlnYXRpb25TdG9yZU5hbWVzcGFjZURpY3RBcmNoaXZlS2V5XxAuVVhBdXhpbGlhcnlO
YXZpZ2F0aW9uU3RvcmVHbG9iYWxEaWN0QXJjaGl2ZUtleYAFgAeACtMiIxIkJSZXTlMu
a2V5c1pOUy5vYmplY3RzoKCABtIoKSorWiRjbGFzc25hbWVYJGNsYXNzZXNfEBNOU011
dGFibGVEaWN0aW9uYXJ5oyosLVxOU0RpY3Rpb25hcnlYTlNPYmplY3TTIiMSLzEmoTCA
CKEygAmABl8QHklQWFBob3Rvc09iamVjdExvY2FsSWRlbnRpZmllcl8QKzIwRjlGNzEy
LTQwMTMtNDFBOC1BMUYzLURERUIyRUYwRUI1NC9MMC8wNDDSKCk3OF8QG1VYRGVzdGlu
YXRpb25BdXhpbGlhcnlTdG9yZaI5LV8QG1VYRGVzdGluYXRpb25BdXhpbGlhcnlTdG9y
ZdIjEjs9oTCACIAM0igpP0BVTlNTZXSiPy3SKClCQ18QGElQWE5hdmlnYXRpb25EZXN0
aW5hdGlvbqJELV8QGElQWE5hdmlnYXRpb25EZXN0aW5hdGlvbgAIABEAGgAkACkAMgA3
AEkATABRAFMAYgBoAHUAqADeASMBTQF8AYMBhQGHAYkBiwGNAY8BqAG0AbsB7wIgAiIC
JAImAi0CNQJAAkECQgJEAkkCVAJdAnMCdwKEAo0ClAKWApgCmgKcAp4CvwLtAvIDEAMT
AzEDNgM4AzoDPANBA0cDSgNPA2oDbQAAAAAAAAIBAAAAAAAAAEUAAAAAAAAAAAAAAAAA
AAOI
</data>
</dict>
</plist>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BackgroundHighlightCollection</key>
<date>2019-12-27T03:55:20Z</date>
<key>BackgroundHighlightEnrichment</key>
<date>2019-12-27T03:55:20Z</date>
<key>BackgroundJobAssetRevGeocode</key>
<date>2019-12-27T03:55:20Z</date>
<key>BackgroundJobSearch</key>
<date>2019-12-27T03:55:20Z</date>
<key>BackgroundPeopleSuggestion</key>
<date>2019-12-27T03:55:20Z</date>
<key>BackgroundUserBehaviorProcessor</key>
<date>2019-12-27T03:55:21Z</date>
<key>PhotoAnalysisGraphLastBackgroundGraphConsistencyUpdateJobDateKey</key>
<date>2019-12-27T03:55:23Z</date>
<key>PhotoAnalysisGraphLastBackgroundGraphRebuildJobDate</key>
<date>2019-12-27T03:55:20Z</date>
<key>PhotoAnalysisGraphLastBackgroundMemoryGenerationJobDate</key>
<date>2019-12-27T03:55:21Z</date>
<key>SiriPortraitDonation</key>
<date>2019-12-27T03:55:21Z</date>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>revgeoprovider</key>
<string>7618</string>
</dict>
</plist>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NumberOfFacesProcessedOnLastRun</key>
<integer>0</integer>
<key>ProcessedInQuiescentState</key>
<true/>
<key>Version</key>
<integer>4</integer>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LastContactClassificationKey</key>
<date>2019-12-27T03:55:22Z</date>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PVClustererBringUpState</key>
<integer>50</integer>
</dict>
</plist>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IncrementalPersonProcessingStage</key>
<integer>6</integer>
<key>PersonBuilderLastMinimumFaceGroupSizeForCreatingMergeCandidates</key>
<integer>15</integer>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PLLibraryServicesManager.LocaleIdentifier</key>
<string>en_US</string>
</dict>
</plist>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>date</key>
<date>2019-12-27T04:12:36Z</date>
<key>derivativesCount</key>
<integer>2</integer>
<key>thumbnailsCount</key>
<integer>0</integer>
</dict>
</plist>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>cloudOwnerEmail</key>
<string>rhettbull@mac.com</string>
<key>cloudOwnerFirstName</key>
<string>Rhet</string>
<key>cloudOwnerHashedPersonID</key>
<string>01cac7cde8a8767251a2cdd183b8ed490fc6e87825f4a495389e824a41a01ba7</string>
<key>cloudOwnerLastName</key>
<string>Turnbull</string>
<key>cloudPublicURLEnabled</key>
<integer>0</integer>
<key>cloudRelationshipState</key>
<integer>2</integer>
<key>cloudSubscriptionDate</key>
<date>2019-12-27T04:16:49Z</date>
<key>title</key>
<string>osxphotos</string>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>rhettbull@mac.com</key>
<integer>2</integer>
</dict>
</plist>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>01cac7cde8a8767251a2cdd183b8ed490fc6e87825f4a495389e824a41a01ba7</key>
<dict>
<key>email</key>
<string>rhettbull@mac.com</string>
<key>firstName</key>
<string>Rhet</string>
<key>fullName</key>
<string>Rhet Turnbull</string>
<key>lastName</key>
<string>Turnbull</string>
</dict>
<key>20d4816ae2cf97606e685eaa167b6aa863ddd258bc33ff84ebb40140cab74622</key>
<dict>
<key>email</key>
<string>rturnbull2@gmail.com</string>
<key>firstName</key>
<string>Wallace</string>
<key>fullName</key>
<string>Wallace Rutherford</string>
<key>lastName</key>
<string>Rutherford</string>
</dict>
<key>2221EED2-5C25-4BAF-95C0-9B4F08BC1F98</key>
<dict>
<key>emails</key>
<array>
<string>rturnbull2@gmail.com</string>
</array>
</dict>
</dict>
</plist>

View File

@ -0,0 +1 @@
17058154511

View File

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.sharedstreams.config.configVersion</key>
<string>1.8</string>
<key>com.apple.sharedstreams.config.defaultRetryAfterInSeconds</key>
<true/>
<key>com.apple.sharedstreams.config.dimensions.invites</key>
<string>308:399:547:308:399:547:152:197:270:152:197:270:100:130:178:100:130:178</string>
<key>com.apple.sharedstreams.config.dimensions.preview</key>
<string>1536:2048:5400</string>
<key>com.apple.sharedstreams.config.dimensions.thumbnail</key>
<string>256:332:455</string>
<key>com.apple.sharedstreams.config.dimensions.videoposterframe</key>
<string>1280:720</string>
<key>com.apple.sharedstreams.config.maxActiveTimeAfterGlobalResetSync</key>
<string>600</string>
<key>com.apple.sharedstreams.config.maxActiveTimeAfterLossOfForeground</key>
<string>120</string>
<key>com.apple.sharedstreams.config.maxActiveTimeAfterPush</key>
<string>60</string>
<key>com.apple.sharedstreams.config.maxMMCSTokenValidity</key>
<integer>1200</integer>
<key>com.apple.sharedstreams.config.maxNumDerivativesToDownloadPerPush</key>
<string>15</string>
<key>com.apple.sharedstreams.config.maxNumDerivativesToPrefetchPerDay</key>
<string>50</string>
<key>com.apple.sharedstreams.config.maxNumInvites.daily</key>
<string>200</string>
<key>com.apple.sharedstreams.config.maxNumPhotosToSendInShareAction</key>
<string>1</string>
<key>com.apple.sharedstreams.config.maxNumPhotosToShare.daily</key>
<string>10000</string>
<key>com.apple.sharedstreams.config.maxNumPhotosToShare.hourly</key>
<string>1000</string>
<key>com.apple.sharedstreams.config.maxNumRetriesOnFailure.content</key>
<string>5</string>
<key>com.apple.sharedstreams.config.maxNumRetriesOnFailure.network</key>
<string>10</string>
<key>com.apple.sharedstreams.config.maxNumRetriesOnFailure.server</key>
<string>5</string>
<key>com.apple.sharedstreams.config.maxUploadAssetBatchSize</key>
<string>5</string>
<key>com.apple.sharedstreams.config.maxVideoDurationInSeconds</key>
<string>900</string>
<key>com.apple.sharedstreams.config.maxnum.charactersPerComment</key>
<string>1024</string>
<key>com.apple.sharedstreams.config.maxnum.commentsPerPhoto</key>
<string>200</string>
<key>com.apple.sharedstreams.config.maxnum.ownedAlbums</key>
<string>200</string>
<key>com.apple.sharedstreams.config.maxnum.photosPerAlbum</key>
<string>5000</string>
<key>com.apple.sharedstreams.config.maxnum.subscribedAlbums</key>
<string>200</string>
<key>com.apple.sharedstreams.config.maxnum.subscribersPerAlbum</key>
<string>100</string>
<key>com.apple.sharedstreams.config.maxpixels.preview</key>
<string>3145728</string>
<key>com.apple.sharedstreams.config.maxpixels.thumbnail</key>
<string>172800</string>
<key>com.apple.sharedstreams.config.prevVersion</key>
<string>1.7</string>
<key>com.apple.sharedstreams.config.switch.3G</key>
<string>1</string>
<key>com.apple.sharedstreams.config.switch.comments</key>
<string>1</string>
<key>com.apple.sharedstreams.config.videoderivatives</key>
<array>
<dict>
<key>bitRate</key>
<string>0.84</string>
<key>cellular</key>
<string>1</string>
<key>powerRequired</key>
<string>0</string>
<key>videoType</key>
<string>PosterFrame</string>
</dict>
<dict>
<key>bitRate</key>
<string>2.8</string>
<key>cellular</key>
<string>1</string>
<key>powerRequired</key>
<string>1</string>
<key>videoType</key>
<string>720p</string>
</dict>
<dict>
<key>bitRate</key>
<string>0.84</string>
<key>cellular</key>
<string>1</string>
<key>powerRequired</key>
<string>0</string>
<key>videoType</key>
<string>360p</string>
</dict>
</array>
<key>mme.basephotos.config.defaultRetryAfterInSeconds</key>
<string>60</string>
<key>mme.sharedstreams.client.downloadMMCSBatchSize</key>
<integer>6</integer>
</dict>
</plist>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CountKeyImages</key>
<integer>1</integer>
<key>CountKeyVideos</key>
<integer>0</integer>
</dict>
</plist>

View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>configuration</key>
<dict>
<key>client.request.throttle</key>
<dict>
<key>forget-after</key>
<integer>3600</integer>
<key>give-up-after</key>
<integer>1800</integer>
<key>start-after</key>
<integer>2</integer>
<key>wait-at-least</key>
<integer>2</integer>
<key>wait-at-most</key>
<integer>60</integer>
</dict>
<key>max.days.inRecentlyDeleted</key>
<integer>30</integer>
<key>max.num.photosToImport.daily</key>
<integer>50000</integer>
<key>max.num.photosToImport.hourly</key>
<integer>5000</integer>
<key>max.num.recordsToUploadPerBatch</key>
<integer>200</integer>
<key>max.num.resourcesToDownloadPerPush</key>
<integer>30</integer>
<key>max.num.resourcesToUploadPerBatch</key>
<integer>8</integer>
<key>photo.derivatives</key>
<array>
<dict>
<key>pixels</key>
<integer>172800</integer>
<key>type</key>
<string>thumbnail</string>
</dict>
<dict>
<key>pixels</key>
<integer>3145728</integer>
<key>type</key>
<string>preview</string>
</dict>
<dict>
<key>pixels</key>
<integer>8388608</integer>
<key>type</key>
<string>fullSize</string>
</dict>
</array>
<key>refresh.interval.seconds</key>
<integer>7200</integer>
<key>video.derivatives</key>
<array>
<dict>
<key>pixels</key>
<integer>921600</integer>
<key>type</key>
<string>PosterFrame</string>
</dict>
<dict>
<key>pixels</key>
<integer>230400</integer>
<key>type</key>
<string>PosterFrameThumbnail</string>
</dict>
<dict>
<key>type</key>
<string>720p</string>
</dict>
<dict>
<key>type</key>
<string>360p</string>
</dict>
</array>
</dict>
<key>lastUpdate</key>
<date>2019-12-27T04:12:27Z</date>
</dict>
</plist>

View File

@ -0,0 +1 @@
2019-12-26 20.12.30.797

View File

@ -0,0 +1 @@
2019-12-26 20.15.43.424

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>cloudVersion</key>
<string>16B1936C-248E-480A-BD75-6406D987F9C6</string>
<key>localVersionToken</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGnCwwRGRobIVUkbnVsbNINDg8Q
ViRjbGFzc18QIk5TUGVyc2lzdGVudEhpc3RvcnlUb2tlbkRpY3Rpb25hcnmABoAC0xIT
DRQWGFdOUy5rZXlzWk5TLm9iamVjdHOhFYADoReABIAFXxAkODcyRUIyNjItMEE3Mi00
NkRGLThCQUUtRUI0MDMxQTMwNkRBEDvSHB0eH1okY2xhc3NuYW1lWCRjbGFzc2VzXE5T
RGljdGlvbmFyeaIeIFhOU09iamVjdNIcHSIjXxAZX05TUGVyc2lzdGVudEhpc3RvcnlU
b2tlbqMkJSBfEBlfTlNQZXJzaXN0ZW50SGlzdG9yeVRva2VuXxAYTlNQZXJzaXN0ZW50
SGlzdG9yeVRva2VuAAgAEQAaACQAKQAyADcASQBMAFEAUwBbAGEAZgBtAJIAlACWAJ0A
pQCwALIAtAC2ALgAugDhAOMA6ADzAPwBCQEMARUBGgE2AToBVgAAAAAAAAIBAAAAAAAA
ACYAAAAAAAAAAAAAAAAAAAFx
</data>
<key>storeUUID</key>
<string>872EB262-0A72-46DF-8BAE-EB4031A306DA</string>
</dict>
</plist>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>accountFlags</key>
<data>
CAEQABgB
</data>
<key>cloudAssetCountPerType</key>
<dict>
<key>public.image</key>
<integer>1</integer>
<key>public.movie</key>
<integer>0</integer>
</dict>
<key>cloudAssetCountPerTypeLastCheckDate</key>
<date>2019-12-27T04:14:42Z</date>
<key>constrainedNetwork</key>
<false/>
<key>hasBatteryBudgetKey</key>
<true/>
<key>hasCellularBudgetKey</key>
<true/>
<key>hasChangesToProcess</key>
<false/>
<key>hasValidSystemBudgetKey</key>
<true/>
<key>iCloudLibraryExists</key>
<true/>
<key>initialSyncDate</key>
<date>2019-12-27T04:15:43Z</date>
<key>lastCompletePrefetchDate</key>
<date>2019-12-27T04:15:43Z</date>
<key>lastSyncDate</key>
<date>2019-12-27T04:16:48Z</date>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PLThumbnailManagerThumbnailFormatKey</key>
<integer>5005</integer>
<key>PLThumbnailManagerVersionKey</key>
<integer>28</integer>
</dict>
</plist>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>currentPayloadVersion</key>
<integer>1</integer>
<key>snapshotDate</key>
<date>2019-12-27T03:54:36Z</date>
<key>snapshotPayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>currentPayloadVersion</key>
<integer>10</integer>
<key>snapshotDate</key>
<date>2019-12-27T03:54:36Z</date>
<key>snapshotPayloadVersion</key>
<integer>10</integer>
</dict>
</plist>

Some files were not shown because too many files have changed in this diff Show More