Initial support for Ventura developer preview (#715)

This commit is contained in:
Rhet Turnbull 2022-06-17 12:11:17 -07:00 committed by GitHub
parent b3a935bd90
commit 5f63cccc7c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
209 changed files with 3131 additions and 401 deletions

View File

@ -1626,18 +1626,6 @@ Returns list of x, y coordinates as tuples `[(x0, y0), (x1, y1)]` representing t
Coordinates as (x, y) tuple for the center of the detected face.
#### `mouth`
Coordinates as (x, y) tuple for the mouth of the detected face.
#### `left_eye`
Coordinates as (x, y) tuple for the left eye of the detected face.
#### `right_eye`
Coordinates as (x, y) tuple for the right eye of the detected face.
#### `size_pixels`
Diameter of detected face region in pixels.
@ -1654,29 +1642,25 @@ Roll of face region in radians.
Pitch of face region in radians.
**Note**: Only valid on Photos version <= 4, otherwise returns 0
#### yaw
Yaw of face region in radians.
**Note**: Only valid on Photos version <= 4, otherwise returns 0
#### `Additional properties`
The following additional properties are also available but are not yet fully documented.
* `center_x`: x coordinate of center of face in Photos' internal reference frame
* `center_y`: y coordinate of center of face in Photos' internal reference frame
* `mouth_x`: x coordinate of mouth in Photos' internal reference frame
* `mouth_y`: y coordinate of mouth in Photos' internal reference frame
* `left_eye_x`: x coordinate of left eye in Photos' internal reference frame
* `left_eye_y`: y coordinate of left eye in Photos' internal reference frame
* `right_eye_x`: x coordinate of right eye in Photos' internal reference frame
* `right_eye_y`: y coordinate of right eye in Photos' internal reference frame
* `size`: size of face region in Photos' internal reference frame
* `quality`: quality measure of detected face
* `source_width`: width in pixels of photo
* `source_height`: height in pixels of photo
* `has_smile`:
* `left_eye_closed`:
* `right_eye_closed`:
* `manual`:
* `face_type`:
* `age_type`:

View File

@ -5,7 +5,7 @@
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html" /><link rel="search" title="Search" href="../../search.html" />
<meta name="generator" content="sphinx-4.4.0, furo 2022.04.07"/>
<title>osxphotos._constants - osxphotos 0.48.1 documentation</title>
<title>osxphotos._constants - osxphotos 0.50.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?digest=68f4518137b9aefe99b631505a2064c3c42c9852" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
@ -123,7 +123,7 @@
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">osxphotos 0.48.1 documentation</div></a>
<a href="../../index.html"><div class="brand">osxphotos 0.50.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
@ -146,7 +146,7 @@
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">osxphotos 0.48.1 documentation</span>
<span class="sidebar-brand-text">osxphotos 0.50.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder=Search name="q" aria-label="Search">
@ -240,10 +240,8 @@
<span class="c1"># Ranges for model version by Photos version</span>
<span class="n">_PHOTOS_5_MODEL_VERSION</span> <span class="o">=</span> <span class="p">[</span><span class="mi">13000</span><span class="p">,</span> <span class="mi">13999</span><span class="p">]</span>
<span class="n">_PHOTOS_6_MODEL_VERSION</span> <span class="o">=</span> <span class="p">[</span><span class="mi">14000</span><span class="p">,</span> <span class="mi">14999</span><span class="p">]</span>
<span class="n">_PHOTOS_7_MODEL_VERSION</span> <span class="o">=</span> <span class="p">[</span>
<span class="mi">15000</span><span class="p">,</span>
<span class="mi">15999</span><span class="p">,</span>
<span class="p">]</span> <span class="c1"># Monterey developer preview is 15134, 12.1 is 15331</span>
<span class="n">_PHOTOS_7_MODEL_VERSION</span> <span class="o">=</span> <span class="p">[</span><span class="mi">15000</span><span class="p">,</span> <span class="mi">15999</span><span class="p">]</span> <span class="c1"># Dev preview: 15134, 12.1: 15331</span>
<span class="n">_PHOTOS_8_MODEL_VERSION</span> <span class="o">=</span> <span class="p">[</span><span class="mi">16000</span><span class="p">,</span> <span class="mi">16999</span><span class="p">]</span> <span class="c1"># Ventura dev preview: 16119</span>
<span class="c1"># some table names differ between Photos 5 and Photos 6</span>
<span class="n">_DB_TABLE_NAMES</span> <span class="o">=</span> <span class="p">{</span>
@ -283,6 +281,18 @@
<span class="s2">"ASSET_ALBUM_TABLE"</span><span class="p">:</span> <span class="s2">"Z_27ASSETS"</span><span class="p">,</span>
<span class="s2">"HDR_TYPE"</span><span class="p">:</span> <span class="s2">"ZHDRTYPE"</span><span class="p">,</span>
<span class="p">},</span>
<span class="mi">8</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"ASSET"</span><span class="p">:</span> <span class="s2">"ZASSET"</span><span class="p">,</span>
<span class="s2">"KEYWORD_JOIN"</span><span class="p">:</span> <span class="s2">"Z_1KEYWORDS.Z_40KEYWORDS"</span><span class="p">,</span>
<span class="s2">"ALBUM_JOIN"</span><span class="p">:</span> <span class="s2">"Z_28ASSETS.Z_3ASSETS"</span><span class="p">,</span>
<span class="s2">"ALBUM_SORT_ORDER"</span><span class="p">:</span> <span class="s2">"Z_28ASSETS.Z_FOK_3ASSETS"</span><span class="p">,</span>
<span class="s2">"IMPORT_FOK"</span><span class="p">:</span> <span class="s2">"null"</span><span class="p">,</span>
<span class="s2">"DEPTH_STATE"</span><span class="p">:</span> <span class="s2">"ZASSET.ZDEPTHTYPE"</span><span class="p">,</span>
<span class="s2">"UTI_ORIGINAL"</span><span class="p">:</span> <span class="s2">"ZINTERNALRESOURCE.ZCOMPACTUTI"</span><span class="p">,</span>
<span class="s2">"ASSET_ALBUM_JOIN"</span><span class="p">:</span> <span class="s2">"Z_28ASSETS.Z_28ALBUMS"</span><span class="p">,</span>
<span class="s2">"ASSET_ALBUM_TABLE"</span><span class="p">:</span> <span class="s2">"Z_28ASSETS"</span><span class="p">,</span>
<span class="s2">"HDR_TYPE"</span><span class="p">:</span> <span class="s2">"ZHDRTYPE"</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">}</span>
<span class="c1"># which version operating systems have been tested</span>
@ -303,6 +313,7 @@
<span class="p">(</span><span class="s2">"12"</span><span class="p">,</span> <span class="s2">"1"</span><span class="p">),</span>
<span class="p">(</span><span class="s2">"12"</span><span class="p">,</span> <span class="s2">"2"</span><span class="p">),</span>
<span class="p">(</span><span class="s2">"12"</span><span class="p">,</span> <span class="s2">"3"</span><span class="p">),</span>
<span class="p">(</span><span class="s2">"12"</span><span class="p">,</span> <span class="s2">"4"</span><span class="p">),</span>
<span class="p">]</span>
<span class="c1"># Photos 5 has persons who are empty string if unidentified face</span>

View File

@ -5,7 +5,7 @@
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html" /><link rel="search" title="Search" href="../../search.html" />
<meta name="generator" content="sphinx-4.4.0, furo 2022.04.07"/>
<title>osxphotos.export_db - osxphotos 0.50.1 documentation</title>
<title>osxphotos.export_db - osxphotos 0.50.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?digest=68f4518137b9aefe99b631505a2064c3c42c9852" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
@ -123,7 +123,7 @@
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">osxphotos 0.50.1 documentation</div></a>
<a href="../../index.html"><div class="brand">osxphotos 0.50.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
@ -146,7 +146,7 @@
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">osxphotos 0.50.1 documentation</span>
<span class="sidebar-brand-text">osxphotos 0.50.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder=Search name="q" aria-label="Search">
@ -1076,7 +1076,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">ExportDBTemp</span><span class="p">(</span><span class="n">ExportDBInMemory</span><span class="p">):</span>
<div class="viewcode-block" id="ExportDBTemp"><a class="viewcode-back" href="../../reference.html#osxphotos.ExportDBTemp">[docs]</a><span class="k">class</span> <span class="nc">ExportDBTemp</span><span class="p">(</span><span class="n">ExportDBInMemory</span><span class="p">):</span>
<span class="sd">"""Temporary in-memory version of ExportDB"""</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -1091,7 +1091,7 @@
<span class="n">filepath</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">filepath</span><span class="p">)</span>
<span class="k">if</span> <span class="n">filepath</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"/"</span><span class="p">:</span>
<span class="k">return</span> <span class="n">filepath</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">return</span> <span class="n">filepath</span>
<span class="k">return</span> <span class="n">filepath</span></div>
<span class="k">class</span> <span class="nc">ExportRecord</span><span class="p">:</span>

View File

@ -1,37 +1,200 @@
<!doctype html>
<html class="no-js">
<head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html" /><link rel="search" title="Search" href="../../search.html" />
<!DOCTYPE html>
<meta name="generator" content="sphinx-4.4.0, furo 2022.04.07"/>
<title>osxphotos.personinfo - osxphotos 0.50.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?digest=68f4518137b9aefe99b631505a2064c3c42c9852" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>osxphotos.personinfo &#8212; osxphotos 0.47.9 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/alabaster.css" />
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<style>
body {
--color-code-background: #f8f8f8;
--color-code-foreground: black;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-half" viewBox="0 0 24 24">
<title>Auto light/dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<circle cx="12" cy="12" r="9" />
<path d="M13 12h5" />
<path d="M13 15h4" />
<path d="M13 18h1" />
<path d="M13 9h4" />
<path d="M13 6h1" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
<label class="overlay sidebar-overlay" for="__navigation">
<div class="visually-hidden">Hide navigation sidebar</div>
</label>
<label class="overlay toc-overlay" for="__toc">
<div class="visually-hidden">Hide table of contents sidebar</div>
</label>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<div class="visually-hidden">Toggle site navigation sidebar</div>
<i class="icon"><svg><use href="#svg-menu"></use></svg></i>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">osxphotos 0.50.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<span class="sidebar-brand-text">osxphotos 0.50.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder=Search name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../overview.html">OSXPhotos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../tutorial.html">OSXPhotos Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../cli.html">OSXPhotos Command Line Interface (CLI)</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../template_help.html">OSXPhotos Template System</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../package_overview.html">OSXPhotos Python Package Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../reference.html">OSXPhotos python API</a></li>
</ul>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
</div>
</div>
<div class="body" role="main">
<h1>Source code for osxphotos.personinfo</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot; PhotoInfo and FaceInfo classes to expose info about persons and faces in the Photos library &quot;&quot;&quot;</span>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container"><div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
<article role="main">
<h1>Source code for osxphotos.personinfo</h1><div class="highlight"><pre>
<span></span><span class="sd">""" PhotoInfo and FaceInfo classes to expose info about persons and faces in the Photos library """</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="kn">import</span> <span class="nn">logging</span>
@ -39,17 +202,17 @@
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">namedtuple</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;PersonInfo&quot;</span><span class="p">,</span> <span class="s2">&quot;FaceInfo&quot;</span><span class="p">,</span> <span class="s2">&quot;rotate_image_point&quot;</span><span class="p">]</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"PersonInfo"</span><span class="p">,</span> <span class="s2">"FaceInfo"</span><span class="p">,</span> <span class="s2">"rotate_image_point"</span><span class="p">]</span>
<span class="n">MWG_RS_Area</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;MWG_RS_Area&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;x&quot;</span><span class="p">,</span> <span class="s2">&quot;y&quot;</span><span class="p">,</span> <span class="s2">&quot;h&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">])</span>
<span class="n">MPRI_Reg_Rect</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;MPRI_Reg_Rect&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;x&quot;</span><span class="p">,</span> <span class="s2">&quot;y&quot;</span><span class="p">,</span> <span class="s2">&quot;h&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">])</span>
<span class="n">MWG_RS_Area</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">"MWG_RS_Area"</span><span class="p">,</span> <span class="p">[</span><span class="s2">"x"</span><span class="p">,</span> <span class="s2">"y"</span><span class="p">,</span> <span class="s2">"h"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">])</span>
<span class="n">MPRI_Reg_Rect</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">"MPRI_Reg_Rect"</span><span class="p">,</span> <span class="p">[</span><span class="s2">"x"</span><span class="p">,</span> <span class="s2">"y"</span><span class="p">,</span> <span class="s2">"h"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">])</span>
<div class="viewcode-block" id="PersonInfo"><a class="viewcode-back" href="../../reference.html#osxphotos.PersonInfo">[docs]</a><span class="k">class</span> <span class="nc">PersonInfo</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Info about a person in the Photos library&quot;&quot;&quot;</span>
<span class="sd">"""Info about a person in the Photos library"""</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">pk</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Creates a new PersonInfo instance</span>
<span class="sd">"""Creates a new PersonInfo instance</span>
<span class="sd"> Arguments:</span>
<span class="sd"> db: instance of PhotosDB object</span>
@ -57,16 +220,16 @@
<span class="sd"> Returns:</span>
<span class="sd"> PersonInfo instance</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_db</span> <span class="o">=</span> <span class="n">db</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pk</span> <span class="o">=</span> <span class="n">pk</span>
<span class="n">person</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="o">.</span><span class="n">_dbpersons_pk</span><span class="p">[</span><span class="n">pk</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">uuid</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">&quot;uuid&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">&quot;fullname&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display_name</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">&quot;displayname&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">keyface</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">&quot;keyface&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">facecount</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">&quot;facecount&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">uuid</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">"uuid"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">"fullname"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display_name</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">"displayname"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">keyface</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">"keyface"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">facecount</span> <span class="o">=</span> <span class="n">person</span><span class="p">[</span><span class="s2">"facecount"</span><span class="p">]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">keyphoto</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@ -74,9 +237,9 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_keyphoto</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">person</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="o">.</span><span class="n">_dbpersons_pk</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_pk</span><span class="p">]</span>
<span class="k">if</span> <span class="n">person</span><span class="p">[</span><span class="s2">&quot;photo_uuid&quot;</span><span class="p">]:</span>
<span class="k">if</span> <span class="n">person</span><span class="p">[</span><span class="s2">"photo_uuid"</span><span class="p">]:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">key_photo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="o">.</span><span class="n">get_photo</span><span class="p">(</span><span class="n">person</span><span class="p">[</span><span class="s2">&quot;photo_uuid&quot;</span><span class="p">])</span>
<span class="n">key_photo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="o">.</span><span class="n">get_photo</span><span class="p">(</span><span class="n">person</span><span class="p">[</span><span class="s2">"photo_uuid"</span><span class="p">])</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="n">key_photo</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
@ -86,14 +249,14 @@
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">photos</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns list of PhotoInfo objects associated with this person&quot;&quot;&quot;</span>
<span class="sd">"""Returns list of PhotoInfo objects associated with this person"""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="o">.</span><span class="n">photos_by_uuid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="o">.</span><span class="n">_dbfaces_pk</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_pk</span><span class="p">])</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">face_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns a list of FaceInfo objects associated with this person sorted by quality score</span>
<span class="sd">"""Returns a list of FaceInfo objects associated with this person sorted by quality score</span>
<span class="sd"> Highest quality face is result[0] and lowest quality face is result[n]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">faces</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="o">.</span><span class="n">_db_faceinfo_person</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_pk</span><span class="p">]</span>
<span class="k">return</span> <span class="nb">sorted</span><span class="p">(</span>
@ -106,30 +269,32 @@
<span class="k">return</span> <span class="p">[]</span>
<div class="viewcode-block" id="PersonInfo.asdict"><a class="viewcode-back" href="../../reference.html#osxphotos.PersonInfo.asdict">[docs]</a> <span class="k">def</span> <span class="nf">asdict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns dictionary representation of class instance&quot;&quot;&quot;</span>
<span class="sd">"""Returns dictionary representation of class instance"""</span>
<span class="n">keyphoto</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">keyphoto</span><span class="o">.</span><span class="n">uuid</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">keyphoto</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;uuid&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">uuid</span><span class="p">,</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="s2">&quot;displayname&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">display_name</span><span class="p">,</span>
<span class="s2">&quot;keyface&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">keyface</span><span class="p">,</span>
<span class="s2">&quot;facecount&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">facecount</span><span class="p">,</span>
<span class="s2">&quot;keyphoto&quot;</span><span class="p">:</span> <span class="n">keyphoto</span><span class="p">,</span>
<span class="s2">"uuid"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">uuid</span><span class="p">,</span>
<span class="s2">"name"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="s2">"displayname"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">display_name</span><span class="p">,</span>
<span class="s2">"keyface"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">keyface</span><span class="p">,</span>
<span class="s2">"facecount"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">facecount</span><span class="p">,</span>
<span class="s2">"keyphoto"</span><span class="p">:</span> <span class="n">keyphoto</span><span class="p">,</span>
<span class="p">}</span></div>
<div class="viewcode-block" id="PersonInfo.json"><a class="viewcode-back" href="../../reference.html#osxphotos.PersonInfo.json">[docs]</a> <span class="k">def</span> <span class="nf">json</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns JSON representation of class instance&quot;&quot;&quot;</span>
<span class="sd">"""Returns JSON representation of class instance"""</span>
<span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asdict</span><span class="p">())</span></div>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;PersonInfo(name=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">, display_name=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">display_name</span><span class="si">}</span><span class="s2">, uuid=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">uuid</span><span class="si">}</span><span class="s2">, facecount=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">facecount</span><span class="si">}</span><span class="s2">)&quot;</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">"PersonInfo(name=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">, display_name=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">display_name</span><span class="si">}</span><span class="s2">, uuid=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">uuid</span><span class="si">}</span><span class="s2">, facecount=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">facecount</span><span class="si">}</span><span class="s2">)"</span>
<span class="k">def</span> <span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="nb">all</span><span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;_db&quot;</span><span class="p">,</span> <span class="s2">&quot;_pk&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="p">(</span>
<span class="nb">all</span><span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"_db"</span><span class="p">,</span> <span class="s2">"_pk"</span><span class="p">]</span>
<span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
<span class="k">else</span> <span class="kc">False</span>
<span class="p">)</span>
<span class="k">def</span> <span class="fm">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
@ -137,10 +302,10 @@
<span class="k">class</span> <span class="nc">FaceInfo</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Info about a face in the Photos library&quot;&quot;&quot;</span>
<span class="sd">"""Info about a face in the Photos library"""</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">pk</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Creates a new FaceInfo instance</span>
<span class="sd">"""Creates a new FaceInfo instance</span>
<span class="sd"> Arguments:</span>
<span class="sd"> db: instance of PhotosDB object</span>
@ -148,95 +313,59 @@
<span class="sd"> Returns:</span>
<span class="sd"> FaceInfo instance</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_db</span> <span class="o">=</span> <span class="n">db</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pk</span> <span class="o">=</span> <span class="n">pk</span>
<span class="n">face</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="o">.</span><span class="n">_db_faceinfo_pk</span><span class="p">[</span><span class="n">pk</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_info</span> <span class="o">=</span> <span class="n">face</span>
<span class="bp">self</span><span class="o">.</span><span class="n">uuid</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;uuid&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;fullname&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">asset_uuid</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;asset_uuid&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_person_pk</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;person&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center_x</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;centerx&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center_y</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;centery&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouth_x</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;mouthx&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouth_y</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;mouthy&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">left_eye_x</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;lefteyex&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">left_eye_y</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;lefteyey&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">right_eye_x</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;righteyex&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">right_eye_y</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;righteyey&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;size&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">quality</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;quality&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">source_width</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;sourcewidth&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">source_height</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;sourceheight&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">has_smile</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;has_smile&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">left_eye_closed</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;left_eye_closed&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">right_eye_closed</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;right_eye_closed&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">manual</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;manual&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">face_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;facetype&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">age_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;agetype&quot;</span><span class="p">]</span>
<span class="c1"># self.bald_type = face[&quot;baldtype&quot;]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">eye_makeup_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;eyemakeuptype&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">eye_state</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;eyestate&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">facial_hair_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;facialhairtype&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">gender_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;gendertype&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">glasses_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;glassestype&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hair_color_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;haircolortype&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">intrash</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;intrash&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lip_makeup_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;lipmakeuptype&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">smile_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">&quot;smiletype&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">uuid</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"uuid"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"fullname"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">asset_uuid</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"asset_uuid"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_person_pk</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"person"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center_x</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"centerx"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center_y</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"centery"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"size"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">quality</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"quality"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">source_width</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"sourcewidth"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">source_height</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"sourceheight"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">has_smile</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"has_smile"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">manual</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"manual"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">face_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"facetype"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">age_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"agetype"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">eye_makeup_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"eyemakeuptype"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">eye_state</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"eyestate"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">facial_hair_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"facialhairtype"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">gender_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"gendertype"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">glasses_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"glassestype"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hair_color_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"haircolortype"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">intrash</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"intrash"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lip_makeup_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"lipmakeuptype"</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">smile_type</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"smiletype"</span><span class="p">]</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">center</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Coordinates, in PIL format, for center of face</span>
<span class="sd">"""Coordinates, in PIL format, for center of face</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple of coordinates in form (x, y)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_point</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">center_x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">center_y</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">size_pixels</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Size of face in pixels (centered around center_x, center_y)</span>
<span class="sd">"""Size of face in pixels (centered around center_x, center_y)</span>
<span class="sd"> Returns:</span>
<span class="sd"> size, in int pixels, of a circle drawn around the center of the face</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="n">photo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">photo</span>
<span class="n">size_reference</span> <span class="o">=</span> <span class="n">photo</span><span class="o">.</span><span class="n">width</span> <span class="k">if</span> <span class="n">photo</span><span class="o">.</span><span class="n">width</span> <span class="o">&gt;</span> <span class="n">photo</span><span class="o">.</span><span class="n">height</span> <span class="k">else</span> <span class="n">photo</span><span class="o">.</span><span class="n">height</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">*</span> <span class="n">size_reference</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">mouth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Coordinates, in PIL format, for mouth position</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple of coordinates in form (x, y)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_point_with_rotation</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">mouth_x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mouth_y</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">left_eye</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Coordinates, in PIL format, for left eye position</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple of coordinates in form (x, y)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_point_with_rotation</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">left_eye_x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">left_eye_y</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">right_eye</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Coordinates, in PIL format, for right eye position</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple of coordinates in form (x, y)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_point_with_rotation</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">right_eye_x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">right_eye_y</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">person_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;PersonInfo instance for person associated with this face&quot;&quot;&quot;</span>
<span class="sd">"""PersonInfo instance for person associated with this face"""</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_person</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
@ -245,18 +374,18 @@
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">photo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;PhotoInfo instance associated with this face&quot;&quot;&quot;</span>
<span class="sd">"""PhotoInfo instance associated with this face"""</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_photo</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_photo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="o">.</span><span class="n">get_photo</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asset_uuid</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_photo</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not get photo for uuid: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">asset_uuid</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Could not get photo for uuid: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">asset_uuid</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_photo</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">mwg_rs_area</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates for Metadata Working Group Region Area.</span>
<span class="sd">"""Get coordinates for Metadata Working Group Region Area.</span>
<span class="sd"> Returns:</span>
<span class="sd"> MWG_RS_Area named tuple with x, y, h, w where:</span>
@ -267,7 +396,7 @@
<span class="sd"> Reference:</span>
<span class="sd"> https://photo.stackexchange.com/questions/106410/how-does-xmp-define-the-face-region</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">center_x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">center_y</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fix_orientation</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
@ -282,7 +411,7 @@
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">mpri_reg_rect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get coordinates for Microsoft Photo Region Rectangle.</span>
<span class="sd">"""Get coordinates for Microsoft Photo Region Rectangle.</span>
<span class="sd"> Returns:</span>
<span class="sd"> MPRI_Reg_Rect named tuple with x, y, h, w where:</span>
@ -293,7 +422,7 @@
<span class="sd"> Reference:</span>
<span class="sd"> https://docs.microsoft.com/en-us/windows/win32/wic/-wic-people-tagging</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">center_x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">center_y</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fix_orientation</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
@ -311,13 +440,13 @@
<span class="k">return</span> <span class="n">MPRI_Reg_Rect</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">face_rect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get face rectangle coordinates for current version of the associated image</span>
<span class="sd">"""Get face rectangle coordinates for current version of the associated image</span>
<span class="sd"> If image has been edited, rectangle applies to edited version, otherwise original version</span>
<span class="sd"> Coordinates in format and reference frame used by PIL</span>
<span class="sd"> Returns:</span>
<span class="sd"> list [(x0, x1), (y0, y1)] of coordinates in reference frame used by PIL</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="n">photo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">photo</span>
<span class="n">size_reference</span> <span class="o">=</span> <span class="n">photo</span><span class="o">.</span><span class="n">width</span> <span class="k">if</span> <span class="n">photo</span><span class="o">.</span><span class="n">width</span> <span class="o">&gt;</span> <span class="n">photo</span><span class="o">.</span><span class="n">height</span> <span class="k">else</span> <span class="n">photo</span><span class="o">.</span><span class="n">height</span>
<span class="n">radius</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="n">size_reference</span>
@ -327,34 +456,34 @@
<span class="k">return</span> <span class="p">[(</span><span class="n">x0</span><span class="p">,</span> <span class="n">y0</span><span class="p">),</span> <span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">y1</span><span class="p">)]</span>
<span class="k">def</span> <span class="nf">roll_pitch_yaw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Roll, pitch, yaw of face in radians as tuple&quot;&quot;&quot;</span>
<span class="sd">"""Roll, pitch, yaw of face in radians as tuple"""</span>
<span class="n">info</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_info</span>
<span class="n">roll</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">info</span><span class="p">[</span><span class="s2">&quot;roll&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">info</span><span class="p">[</span><span class="s2">&quot;roll&quot;</span><span class="p">]</span>
<span class="n">pitch</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">info</span><span class="p">[</span><span class="s2">&quot;pitch&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">info</span><span class="p">[</span><span class="s2">&quot;pitch&quot;</span><span class="p">]</span>
<span class="n">yaw</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">info</span><span class="p">[</span><span class="s2">&quot;yaw&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">info</span><span class="p">[</span><span class="s2">&quot;yaw&quot;</span><span class="p">]</span>
<span class="n">roll</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">info</span><span class="p">[</span><span class="s2">"roll"</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">info</span><span class="p">[</span><span class="s2">"roll"</span><span class="p">]</span>
<span class="n">pitch</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">info</span><span class="p">[</span><span class="s2">"pitch"</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">info</span><span class="p">[</span><span class="s2">"pitch"</span><span class="p">]</span>
<span class="n">yaw</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">info</span><span class="p">[</span><span class="s2">"yaw"</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">info</span><span class="p">[</span><span class="s2">"yaw"</span><span class="p">]</span>
<span class="k">return</span> <span class="p">(</span><span class="n">roll</span><span class="p">,</span> <span class="n">pitch</span><span class="p">,</span> <span class="n">yaw</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">roll</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return roll angle in radians of the face region&quot;&quot;&quot;</span>
<span class="sd">"""Return roll angle in radians of the face region"""</span>
<span class="n">roll</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">roll_pitch_yaw</span><span class="p">()</span>
<span class="k">return</span> <span class="n">roll</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">pitch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return pitch angle in radians of the face region&quot;&quot;&quot;</span>
<span class="sd">"""Return pitch angle in radians of the face region"""</span>
<span class="n">_</span><span class="p">,</span> <span class="n">pitch</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">roll_pitch_yaw</span><span class="p">()</span>
<span class="k">return</span> <span class="n">pitch</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">yaw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return yaw angle in radians of the face region&quot;&quot;&quot;</span>
<span class="sd">"""Return yaw angle in radians of the face region"""</span>
<span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">yaw</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">roll_pitch_yaw</span><span class="p">()</span>
<span class="k">return</span> <span class="n">yaw</span>
<span class="k">def</span> <span class="nf">_fix_orientation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xy</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Translate an (x, y) tuple based on image orientation</span>
<span class="sd">"""Translate an (x, y) tuple based on image orientation</span>
<span class="sd"> Arguments:</span>
<span class="sd"> xy: tuple of (x, y) coordinates for point to translate</span>
@ -362,7 +491,7 @@
<span class="sd"> Returns:</span>
<span class="sd"> (x, y) tuple of translated coordinates</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="c1"># Reference: https://github.com/neilpa/phace/blob/7594776480505d0c389688a42099c94ac5d34f3f/cmd/phace/draw.go#L79-L94</span>
<span class="n">orientation</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">photo</span><span class="o">.</span><span class="n">orientation</span>
@ -386,15 +515,15 @@
<span class="k">elif</span> <span class="n">orientation</span> <span class="o">==</span> <span class="mi">8</span><span class="p">:</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span>
<span class="k">elif</span> <span class="n">orientation</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># set by osxphotos if adjusted orientation cannot be read, assume it&#39;s 1</span>
<span class="c1"># set by osxphotos if adjusted orientation cannot be read, assume it's 1</span>
<span class="n">y</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="n">y</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unhandled orientation: </span><span class="si">{</span><span class="n">orientation</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unhandled orientation: </span><span class="si">{</span><span class="n">orientation</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">return</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_make_point</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xy</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Translate an (x, y) tuple based on image orientation</span>
<span class="sd">"""Translate an (x, y) tuple based on image orientation</span>
<span class="sd"> and convert to image coordinates</span>
<span class="sd"> Arguments:</span>
@ -403,7 +532,7 @@
<span class="sd"> Returns:</span>
<span class="sd"> (x, y) tuple of translated coordinates in pixels in PIL format/reference frame</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="c1"># Reference: https://github.com/neilpa/phace/blob/7594776480505d0c389688a42099c94ac5d34f3f/cmd/phace/draw.go#L79-L94</span>
<span class="n">orientation</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">photo</span><span class="o">.</span><span class="n">orientation</span>
@ -415,7 +544,7 @@
<span class="k">return</span> <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">dx</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">y</span> <span class="o">*</span> <span class="n">dy</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_make_point_with_rotation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xy</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Translate an (x, y) tuple based on image orientation and rotation</span>
<span class="sd">"""Translate an (x, y) tuple based on image orientation and rotation</span>
<span class="sd"> and convert to image coordinates</span>
<span class="sd"> Arguments:</span>
@ -424,7 +553,7 @@
<span class="sd"> Returns:</span>
<span class="sd"> (x, y) tuple of translated coordinates in pixels in PIL format/reference frame</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="c1"># convert to image coordinates</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_point</span><span class="p">(</span><span class="n">xy</span><span class="p">)</span>
@ -437,70 +566,58 @@
<span class="k">return</span> <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">xr</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">yr</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">asdict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns dict representation of class instance&quot;&quot;&quot;</span>
<span class="sd">"""Returns dict representation of class instance"""</span>
<span class="n">roll</span><span class="p">,</span> <span class="n">pitch</span><span class="p">,</span> <span class="n">yaw</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">roll_pitch_yaw</span><span class="p">()</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;_pk&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pk</span><span class="p">,</span>
<span class="s2">&quot;uuid&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">uuid</span><span class="p">,</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="s2">&quot;asset_uuid&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">asset_uuid</span><span class="p">,</span>
<span class="s2">&quot;_person_pk&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_person_pk</span><span class="p">,</span>
<span class="s2">&quot;center_x&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">center_x</span><span class="p">,</span>
<span class="s2">&quot;center_y&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">center_y</span><span class="p">,</span>
<span class="s2">&quot;center&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">,</span>
<span class="s2">&quot;mouth_x&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">mouth_x</span><span class="p">,</span>
<span class="s2">&quot;mouth_y&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">mouth_y</span><span class="p">,</span>
<span class="s2">&quot;mouth&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">mouth</span><span class="p">,</span>
<span class="s2">&quot;left_eye_x&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">left_eye_x</span><span class="p">,</span>
<span class="s2">&quot;left_eye_y&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">left_eye_y</span><span class="p">,</span>
<span class="s2">&quot;left_eye&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">left_eye</span><span class="p">,</span>
<span class="s2">&quot;right_eye_x&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">right_eye_x</span><span class="p">,</span>
<span class="s2">&quot;right_eye_y&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">right_eye_y</span><span class="p">,</span>
<span class="s2">&quot;right_eye&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">right_eye</span><span class="p">,</span>
<span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
<span class="s2">&quot;face_rect&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">face_rect</span><span class="p">(),</span>
<span class="s2">&quot;mpri_reg_rect&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">mpri_reg_rect</span><span class="o">.</span><span class="n">_asdict</span><span class="p">(),</span>
<span class="s2">&quot;mwg_rs_area&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">mwg_rs_area</span><span class="o">.</span><span class="n">_asdict</span><span class="p">(),</span>
<span class="s2">&quot;roll&quot;</span><span class="p">:</span> <span class="n">roll</span><span class="p">,</span>
<span class="s2">&quot;pitch&quot;</span><span class="p">:</span> <span class="n">pitch</span><span class="p">,</span>
<span class="s2">&quot;yaw&quot;</span><span class="p">:</span> <span class="n">yaw</span><span class="p">,</span>
<span class="s2">&quot;quality&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">quality</span><span class="p">,</span>
<span class="s2">&quot;source_width&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_width</span><span class="p">,</span>
<span class="s2">&quot;source_height&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_height</span><span class="p">,</span>
<span class="s2">&quot;has_smile&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_smile</span><span class="p">,</span>
<span class="s2">&quot;left_eye_closed&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">left_eye_closed</span><span class="p">,</span>
<span class="s2">&quot;right_eye_closed&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">right_eye_closed</span><span class="p">,</span>
<span class="s2">&quot;manual&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">manual</span><span class="p">,</span>
<span class="s2">&quot;face_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">face_type</span><span class="p">,</span>
<span class="s2">&quot;age_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">age_type</span><span class="p">,</span>
<span class="c1"># &quot;bald_type&quot;: self.bald_type,</span>
<span class="s2">&quot;eye_makeup_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">eye_makeup_type</span><span class="p">,</span>
<span class="s2">&quot;eye_state&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">eye_state</span><span class="p">,</span>
<span class="s2">&quot;facial_hair_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">facial_hair_type</span><span class="p">,</span>
<span class="s2">&quot;gender_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">gender_type</span><span class="p">,</span>
<span class="s2">&quot;glasses_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">glasses_type</span><span class="p">,</span>
<span class="s2">&quot;hair_color_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">hair_color_type</span><span class="p">,</span>
<span class="s2">&quot;intrash&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">intrash</span><span class="p">,</span>
<span class="s2">&quot;lip_makeup_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">lip_makeup_type</span><span class="p">,</span>
<span class="s2">&quot;smile_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">smile_type</span><span class="p">,</span>
<span class="s2">"_pk"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pk</span><span class="p">,</span>
<span class="s2">"uuid"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">uuid</span><span class="p">,</span>
<span class="s2">"name"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="s2">"asset_uuid"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">asset_uuid</span><span class="p">,</span>
<span class="s2">"_person_pk"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_person_pk</span><span class="p">,</span>
<span class="s2">"center_x"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">center_x</span><span class="p">,</span>
<span class="s2">"center_y"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">center_y</span><span class="p">,</span>
<span class="s2">"center"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">,</span>
<span class="s2">"size"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
<span class="s2">"face_rect"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">face_rect</span><span class="p">(),</span>
<span class="s2">"mpri_reg_rect"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">mpri_reg_rect</span><span class="o">.</span><span class="n">_asdict</span><span class="p">(),</span>
<span class="s2">"mwg_rs_area"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">mwg_rs_area</span><span class="o">.</span><span class="n">_asdict</span><span class="p">(),</span>
<span class="s2">"roll"</span><span class="p">:</span> <span class="n">roll</span><span class="p">,</span>
<span class="s2">"pitch"</span><span class="p">:</span> <span class="n">pitch</span><span class="p">,</span>
<span class="s2">"yaw"</span><span class="p">:</span> <span class="n">yaw</span><span class="p">,</span>
<span class="s2">"quality"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">quality</span><span class="p">,</span>
<span class="s2">"source_width"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_width</span><span class="p">,</span>
<span class="s2">"source_height"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_height</span><span class="p">,</span>
<span class="s2">"has_smile"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_smile</span><span class="p">,</span>
<span class="s2">"manual"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">manual</span><span class="p">,</span>
<span class="s2">"face_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">face_type</span><span class="p">,</span>
<span class="s2">"age_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">age_type</span><span class="p">,</span>
<span class="s2">"eye_makeup_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">eye_makeup_type</span><span class="p">,</span>
<span class="s2">"eye_state"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">eye_state</span><span class="p">,</span>
<span class="s2">"facial_hair_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">facial_hair_type</span><span class="p">,</span>
<span class="s2">"gender_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">gender_type</span><span class="p">,</span>
<span class="s2">"glasses_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">glasses_type</span><span class="p">,</span>
<span class="s2">"hair_color_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">hair_color_type</span><span class="p">,</span>
<span class="s2">"intrash"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">intrash</span><span class="p">,</span>
<span class="s2">"lip_makeup_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">lip_makeup_type</span><span class="p">,</span>
<span class="s2">"smile_type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">smile_type</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">json</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Return JSON representation of FaceInfo instance&quot;&quot;&quot;</span>
<span class="sd">"""Return JSON representation of FaceInfo instance"""</span>
<span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asdict</span><span class="p">())</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;FaceInfo(uuid=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">uuid</span><span class="si">}</span><span class="s2">, center_x=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">center_x</span><span class="si">}</span><span class="s2">, center_y = </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">center_y</span><span class="si">}</span><span class="s2">, size=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2">, person=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">, asset_uuid=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">asset_uuid</span><span class="si">}</span><span class="s2">)&quot;</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">"FaceInfo(uuid=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">uuid</span><span class="si">}</span><span class="s2">, center_x=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">center_x</span><span class="si">}</span><span class="s2">, center_y = </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">center_y</span><span class="si">}</span><span class="s2">, size=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2">, person=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">, asset_uuid=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">asset_uuid</span><span class="si">}</span><span class="s2">)"</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;FaceInfo(db=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="si">}</span><span class="s2">, pk=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_pk</span><span class="si">}</span><span class="s2">)&quot;</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">"FaceInfo(db=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="si">}</span><span class="s2">, pk=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_pk</span><span class="si">}</span><span class="s2">)"</span>
<span class="k">def</span> <span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="nb">all</span><span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;_db&quot;</span><span class="p">,</span> <span class="s2">&quot;_pk&quot;</span><span class="p">]</span>
<span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"_db"</span><span class="p">,</span> <span class="s2">"_pk"</span><span class="p">]</span>
<span class="p">)</span>
<span class="k">def</span> <span class="fm">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
@ -508,7 +625,7 @@
<span class="k">def</span> <span class="nf">rotate_image_point</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">xmid</span><span class="p">,</span> <span class="n">ymid</span><span class="p">,</span> <span class="n">angle</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;rotate image point about xm, ym by angle in radians</span>
<span class="sd">"""rotate image point about xm, ym by angle in radians</span>
<span class="sd"> Arguments:</span>
<span class="sd"> x: x coordinate of point to rotate</span>
@ -520,7 +637,7 @@
<span class="sd"> Returns:</span>
<span class="sd"> tuple of rotated points (xr, yr)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="sd"> """</span>
<span class="c1"># translate point relative to the mid point</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">-</span> <span class="n">xmid</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">-</span> <span class="n">ymid</span>
@ -535,72 +652,45 @@
<span class="k">return</span> <span class="p">(</span><span class="n">xr</span><span class="p">,</span> <span class="n">yr</span><span class="p">)</span>
</pre></div>
</div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../index.html">osxphotos</a></h1>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../overview.html">osxphotos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../tutorial.html">Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../cli.html">osxphotos command line interface (CLI)</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../reference.html">osxphotos package</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
<li><a href="../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2021, Rhet Turnbull
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
<div class="icons">
</div>
</div>
</div>
</div>
<div class="clearer"></div>
</footer>
</div>
<div class="footer">
&copy;2021, Rhet Turnbull.
<aside class="toc-drawer no-toc">
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 4.4.0</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</body>
</aside>
</div>
</div><script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/scripts/furo.js"></script>
<script src="../../_static/clipboard.min.js"></script>
<script src="../../_static/copybutton.js"></script>
</body>
</html>

View File

@ -5,7 +5,7 @@
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../../genindex.html" /><link rel="search" title="Search" href="../../../search.html" />
<meta name="generator" content="sphinx-4.4.0, furo 2022.04.07"/>
<title>osxphotos.photosdb.photosdb - osxphotos 0.50.0 documentation</title>
<title>osxphotos.photosdb.photosdb - osxphotos 0.50.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../../_static/styles/furo.css?digest=68f4518137b9aefe99b631505a2064c3c42c9852" />
<link rel="stylesheet" type="text/css" href="../../../_static/copybutton.css" />
@ -123,7 +123,7 @@
</label>
</div>
<div class="header-center">
<a href="../../../index.html"><div class="brand">osxphotos 0.50.0 documentation</div></a>
<a href="../../../index.html"><div class="brand">osxphotos 0.50.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
@ -146,7 +146,7 @@
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../../index.html">
<span class="sidebar-brand-text">osxphotos 0.50.0 documentation</span>
<span class="sidebar-brand-text">osxphotos 0.50.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../../search.html" role="search">
<input class="sidebar-search" placeholder=Search name="q" aria-label="Search">
@ -210,7 +210,7 @@
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">OrderedDict</span>
<span class="kn">from</span> <span class="nn">collections.abc</span> <span class="kn">import</span> <span class="n">Iterable</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span><span class="p">,</span> <span class="n">timezone</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>
<span class="kn">from</span> <span class="nn">unicodedata</span> <span class="kn">import</span> <span class="n">normalize</span>
<span class="kn">import</span> <span class="nn">bitmath</span>
@ -3054,16 +3054,16 @@
<div class="viewcode-block" id="PhotosDB.photos"><a class="viewcode-back" href="../../../reference.html#osxphotos.PhotosDB.photos">[docs]</a> <span class="k">def</span> <span class="nf">photos</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">keywords</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">uuid</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">persons</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">albums</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">images</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">movies</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">from_date</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">to_date</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">intrash</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="p">):</span>
<span class="n">keywords</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">uuid</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">persons</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">albums</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">images</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<span class="n">movies</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<span class="n">from_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">to_date</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">datetime</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">intrash</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">PhotoInfo</span><span class="p">]:</span>
<span class="sd">"""Return a list of PhotoInfo objects</span>
<span class="sd"> If called with no args, returns the entire database of photos</span>
<span class="sd"> If called with args, returns photos matching the args (e.g. keywords, persons, etc.)</span>

View File

@ -2446,6 +2446,8 @@
</li>
</ul></li>
<li><a href="reference.html#osxphotos.ExportDB">ExportDB (class in osxphotos)</a>
</li>
<li><a href="reference.html#osxphotos.ExportDBTemp">ExportDBTemp (class in osxphotos)</a>
</li>
<li><a href="reference.html#osxphotos.ExportOptions">ExportOptions (class in osxphotos)</a>
</li>

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -44,10 +44,8 @@ _PHOTOS_5_VERSION = "5000" # I've seen both 5001 and 6000. 6000 is most common
# Ranges for model version by Photos version
_PHOTOS_5_MODEL_VERSION = [13000, 13999]
_PHOTOS_6_MODEL_VERSION = [14000, 14999]
_PHOTOS_7_MODEL_VERSION = [
15000,
15999,
] # Monterey developer preview is 15134, 12.1 is 15331
_PHOTOS_7_MODEL_VERSION = [15000, 15999] # Dev preview: 15134, 12.1: 15331
_PHOTOS_8_MODEL_VERSION = [16000, 16999] # Ventura dev preview: 16119
# some table names differ between Photos 5 and Photos 6
_DB_TABLE_NAMES = {
@ -87,6 +85,18 @@ _DB_TABLE_NAMES = {
"ASSET_ALBUM_TABLE": "Z_27ASSETS",
"HDR_TYPE": "ZHDRTYPE",
},
8: {
"ASSET": "ZASSET",
"KEYWORD_JOIN": "Z_1KEYWORDS.Z_40KEYWORDS",
"ALBUM_JOIN": "Z_28ASSETS.Z_3ASSETS",
"ALBUM_SORT_ORDER": "Z_28ASSETS.Z_FOK_3ASSETS",
"IMPORT_FOK": "null",
"DEPTH_STATE": "ZASSET.ZDEPTHTYPE",
"UTI_ORIGINAL": "ZINTERNALRESOURCE.ZCOMPACTUTI",
"ASSET_ALBUM_JOIN": "Z_28ASSETS.Z_28ALBUMS",
"ASSET_ALBUM_TABLE": "Z_28ASSETS",
"HDR_TYPE": "ZHDRTYPE",
},
}
# which version operating systems have been tested
@ -107,6 +117,7 @@ _TESTED_OS_VERSIONS = [
("12", "1"),
("12", "2"),
("12", "3"),
("12", "4"),
]
# Photos 5 has persons who are empty string if unidentified face

Binary file not shown.

View File

@ -92,11 +92,13 @@ class PersonInfo:
return f"PersonInfo(name={self.name}, display_name={self.display_name}, uuid={self.uuid}, facecount={self.facecount})"
def __eq__(self, other):
if not isinstance(other, type(self)):
return False
return all(
getattr(self, field) == getattr(other, field) for field in ["_db", "_pk"]
return (
all(
getattr(self, field) == getattr(other, field)
for field in ["_db", "_pk"]
)
if isinstance(other, type(self))
else False
)
def __ne__(self, other):
@ -127,23 +129,14 @@ class FaceInfo:
self._person_pk = face["person"]
self.center_x = face["centerx"]
self.center_y = face["centery"]
self.mouth_x = face["mouthx"]
self.mouth_y = face["mouthy"]
self.left_eye_x = face["lefteyex"]
self.left_eye_y = face["lefteyey"]
self.right_eye_x = face["righteyex"]
self.right_eye_y = face["righteyey"]
self.size = face["size"]
self.quality = face["quality"]
self.source_width = face["sourcewidth"]
self.source_height = face["sourceheight"]
self.has_smile = face["has_smile"]
self.left_eye_closed = face["left_eye_closed"]
self.right_eye_closed = face["right_eye_closed"]
self.manual = face["manual"]
self.face_type = face["facetype"]
self.age_type = face["agetype"]
# self.bald_type = face["baldtype"]
self.eye_makeup_type = face["eyemakeuptype"]
self.eye_state = face["eyestate"]
self.facial_hair_type = face["facialhairtype"]
@ -174,33 +167,6 @@ class FaceInfo:
size_reference = photo.width if photo.width > photo.height else photo.height
return self.size * size_reference
@property
def mouth(self):
"""Coordinates, in PIL format, for mouth position
Returns:
tuple of coordinates in form (x, y)
"""
return self._make_point_with_rotation((self.mouth_x, self.mouth_y))
@property
def left_eye(self):
"""Coordinates, in PIL format, for left eye position
Returns:
tuple of coordinates in form (x, y)
"""
return self._make_point_with_rotation((self.left_eye_x, self.left_eye_y))
@property
def right_eye(self):
"""Coordinates, in PIL format, for right eye position
Returns:
tuple of coordinates in form (x, y)
"""
return self._make_point_with_rotation((self.right_eye_x, self.right_eye_y))
@property
def person_info(self):
"""PersonInfo instance for person associated with this face"""
@ -415,15 +381,6 @@ class FaceInfo:
"center_x": self.center_x,
"center_y": self.center_y,
"center": self.center,
"mouth_x": self.mouth_x,
"mouth_y": self.mouth_y,
"mouth": self.mouth,
"left_eye_x": self.left_eye_x,
"left_eye_y": self.left_eye_y,
"left_eye": self.left_eye,
"right_eye_x": self.right_eye_x,
"right_eye_y": self.right_eye_y,
"right_eye": self.right_eye,
"size": self.size,
"face_rect": self.face_rect(),
"mpri_reg_rect": self.mpri_reg_rect._asdict(),
@ -435,12 +392,9 @@ class FaceInfo:
"source_width": self.source_width,
"source_height": self.source_height,
"has_smile": self.has_smile,
"left_eye_closed": self.left_eye_closed,
"right_eye_closed": self.right_eye_closed,
"manual": self.manual,
"face_type": self.face_type,
"age_type": self.age_type,
# "bald_type": self.bald_type,
"eye_makeup_type": self.eye_makeup_type,
"eye_state": self.eye_state,
"facial_hair_type": self.facial_hair_type,

View File

@ -1,13 +1,11 @@
""" Methods for PhotosDB to add Photos face info
"""
import logging
from .._constants import _DB_TABLE_NAMES, _PHOTOS_4_VERSION
from ..utils import _open_sql_file, normalize_unicode
from .photosdb_utils import get_db_version
"""
This module should be imported in the class defintion of PhotosDB in photosdb.py
Do not import this module directly
@ -202,8 +200,8 @@ def _process_faceinfo_5(photosdb):
ZDETECTEDFACE.ZHASSMILE,
ZDETECTEDFACE.ZHIDDEN,
ZDETECTEDFACE.ZISINTRASH,
ZDETECTEDFACE.ZISLEFTEYECLOSED,
ZDETECTEDFACE.ZISRIGHTEYECLOSED,
NULL, -- ZDETECTEDFACE.ZISLEFTEYECLOSED
NULL, -- ZDETECTEDFACE.ZISRIGHTEYECLOSED
ZDETECTEDFACE.ZLIPMAKEUPTYPE,
ZDETECTEDFACE.ZMANUAL,
ZDETECTEDFACE.ZQUALITYMEASURE,
@ -213,17 +211,17 @@ def _process_faceinfo_5(photosdb):
ZDETECTEDFACE.ZBLURSCORE,
ZDETECTEDFACE.ZCENTERX,
ZDETECTEDFACE.ZCENTERY,
ZDETECTEDFACE.ZLEFTEYEX,
ZDETECTEDFACE.ZLEFTEYEY,
ZDETECTEDFACE.ZMOUTHX,
ZDETECTEDFACE.ZMOUTHY,
NULL, -- ZDETECTEDFACE.ZLEFTEYEX,
NULL, -- ZDETECTEDFACE.ZLEFTEYEY,
NULL, -- ZDETECTEDFACE.ZMOUTHX,
NULL, -- ZDETECTEDFACE.ZMOUTHY,
ZDETECTEDFACE.ZPOSEYAW,
ZDETECTEDFACE.ZQUALITY,
ZDETECTEDFACE.ZRIGHTEYEX,
ZDETECTEDFACE.ZRIGHTEYEY,
NULL, -- ZDETECTEDFACE.ZRIGHTEYEX,
NULL, -- ZDETECTEDFACE.ZRIGHTEYEY,
ZDETECTEDFACE.ZROLL,
ZDETECTEDFACE.ZSIZE,
ZDETECTEDFACE.ZYAW,
NULL, -- ZDETECTEDFACE.ZYAW,
ZDETECTEDFACE.ZMASTERIDENTIFIER
FROM ZDETECTEDFACE
JOIN {asset_table} ON {asset_table}.Z_PK = ZDETECTEDFACE.ZASSET
@ -237,7 +235,7 @@ def _process_faceinfo_5(photosdb):
# 3 ZDETECTEDFACE.ZPERSON,
# 4 ZPERSON.ZFULLNAME,
# 5 ZDETECTEDFACE.ZAGETYPE,
# 6 ZDETECTEDFACE.ZBALDTYPE, (Not available on Monterey)
# 6 NULL -- ZDETECTEDFACE.ZBALDTYPE, (Not available on Monterey)
# 7 ZDETECTEDFACE.ZEYEMAKEUPTYPE,
# 8 ZDETECTEDFACE.ZEYESSTATE,
# 9 ZDETECTEDFACE.ZFACIALHAIRTYPE,
@ -247,8 +245,8 @@ def _process_faceinfo_5(photosdb):
# 13 ZDETECTEDFACE.ZHASSMILE,
# 14 ZDETECTEDFACE.ZHIDDEN,
# 15 ZDETECTEDFACE.ZISINTRASH,
# 16 ZDETECTEDFACE.ZISLEFTEYECLOSED,
# 17 ZDETECTEDFACE.ZISRIGHTEYECLOSED,
# 16 NULL -- ZDETECTEDFACE.ZISLEFTEYECLOSED,
# 17 NULL -- ZDETECTEDFACE.ZISRIGHTEYECLOSED,
# 18 ZDETECTEDFACE.ZLIPMAKEUPTYPE,
# 19 ZDETECTEDFACE.ZMANUAL,
# 20 ZDETECTEDFACE.ZQUALITYMEASURE,
@ -258,17 +256,17 @@ def _process_faceinfo_5(photosdb):
# 24 ZDETECTEDFACE.ZBLURSCORE,
# 25 ZDETECTEDFACE.ZCENTERX,
# 26 ZDETECTEDFACE.ZCENTERY,
# 27 ZDETECTEDFACE.ZLEFTEYEX,
# 28 ZDETECTEDFACE.ZLEFTEYEY,
# 29 ZDETECTEDFACE.ZMOUTHX,
# 30 ZDETECTEDFACE.ZMOUTHY,
# 27 NULL -- ZDETECTEDFACE.ZLEFTEYEX, (Not available on Ventura)
# 28 NULL -- ZDETECTEDFACE.ZLEFTEYEY, (Not available on Ventura)
# 29 NULL -- ZDETECTEDFACE.ZMOUTHX, (Not available on Ventura)
# 30 NULL -- ZDETECTEDFACE.ZMOUTHY, (Not available on Ventura)
# 31 ZDETECTEDFACE.ZPOSEYAW,
# 32 ZDETECTEDFACE.ZQUALITY,
# 33 ZDETECTEDFACE.ZRIGHTEYEX,
# 34 ZDETECTEDFACE.ZRIGHTEYEY,
# 33 NULL -- ZDETECTEDFACE.ZRIGHTEYEX, (Not available on Ventura)
# 34 NULL -- ZDETECTEDFACE.ZRIGHTEYEY, (Not available on Ventura)
# 35 ZDETECTEDFACE.ZROLL,
# 36 ZDETECTEDFACE.ZSIZE,
# 37 ZDETECTEDFACE.ZYAW,
# 37 NULL -- ZDETECTEDFACE.ZYAW, (Not available on Ventura)
# 38 ZDETECTEDFACE.ZMASTERIDENTIFIER
for row in result:
@ -310,8 +308,8 @@ def _process_faceinfo_5(photosdb):
face["righteyey"] = row[34]
face["roll"] = row[35]
face["size"] = row[36]
face["yaw"] = row[37]
face["pitch"] = 0.0 # not defined in Photos 5
face["yaw"] = 0 # Photos 4 only (this is in Photos 5-7, but dropped in Ventura so just don't support it)
face["pitch"] = 0 # not defined in Photos 5
photosdb._db_faceinfo_pk[pk] = face

View File

@ -14,7 +14,7 @@ import tempfile
from collections import OrderedDict
from collections.abc import Iterable
from datetime import datetime, timedelta, timezone
from typing import List
from typing import List, Optional
from unicodedata import normalize
import bitmath
@ -2858,16 +2858,16 @@ class PhotosDB:
def photos(
self,
keywords=None,
uuid=None,
persons=None,
albums=None,
images=True,
movies=True,
from_date=None,
to_date=None,
intrash=False,
):
keywords: Optional[List[str]] = None,
uuid: Optional[List[str]] = None,
persons: Optional[List[str]] = None,
albums: Optional[List[str]] = None,
images: bool = True,
movies: bool = True,
from_date: Optional[datetime] = None,
to_date: Optional[datetime] = None,
intrash: bool = False,
) -> List[PhotoInfo]:
"""Return a list of PhotoInfo objects
If called with no args, returns the entire database of photos
If called with args, returns photos matching the args (e.g. keywords, persons, etc.)

View File

@ -12,6 +12,7 @@ from .._constants import (
_PHOTOS_5_VERSION,
_PHOTOS_6_MODEL_VERSION,
_PHOTOS_7_MODEL_VERSION,
_PHOTOS_8_MODEL_VERSION,
_TESTED_DB_VERSIONS,
)
from ..utils import _open_sql_file
@ -92,10 +93,12 @@ def get_db_model_version(db_file):
return 6
elif _PHOTOS_7_MODEL_VERSION[0] <= model_ver <= _PHOTOS_7_MODEL_VERSION[1]:
return 7
elif _PHOTOS_8_MODEL_VERSION[0] <= model_ver <= _PHOTOS_8_MODEL_VERSION[1]:
return 8
else:
logging.warning(f"Unknown model version: {model_ver}")
# cross our fingers and try latest version
return 7
return 8
class UnknownLibraryVersion(Exception):

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,16 @@
<?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>hostname</key>
<string>tc1.local</string>
<key>hostuuid</key>
<string>A22F6630-733E-54D7-99F1-B3805B38E11B</string>
<key>pid</key>
<integer>548</integer>
<key>processname</key>
<string>photolibraryd</string>
<key>uid</key>
<integer>501</integer>
</dict>
</plist>

View File

@ -0,0 +1,28 @@
<?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/>
<key>renamePerson</key>
<array/>
</dict>
</plist>

View File

@ -0,0 +1,18 @@
<?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>featureFlags</key>
<string>63</string>
<key>featuredContentAllowed</key>
<string>1</string>
<key>localeIdentifier</key>
<string>en_GB</string>
<key>sceneTaxonomySHA</key>
<string>35f76559cb0770342bcea46fce0e3f562844ab7506e0e4b4ad1256abb0a07be2,4afa5d3c45c08a664cf73cff957aaeeae3a325d2970aada51268407b9ad0f03e</string>
<key>searchIndexVersion</key>
<string>16016</string>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 KiB

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>MigrationService</key>
<dict>
<key>State</key>
<integer>4</integer>
</dict>
<key>MigrationService.LastCompletedTask</key>
<integer>12</integer>
<key>MigrationService.ValidationCounts</key>
<dict>
<key>MigrationDetectedFaceprint</key>
<integer>6</integer>
<key>MigrationManagedAsset</key>
<integer>0</integer>
<key>MigrationSceneClassification</key>
<integer>44</integer>
<key>MigrationUnmanagedAdjustment</key>
<integer>0</integer>
<key>RDVersion.cloudLocalState.CPLIsNotPushed</key>
<integer>7</integer>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,58 @@
<?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>92D68107-B6C7-453B-96D2-97B0F26D5B8B/L0/020</string>
<string>88A5F8B8-5B9A-43C7-BB85-3952B81580EB/L0/020</string>
<string>29EF7A97-7E76-4D5F-A5E0-CC0A93E8524C/L0/020</string>
<string>2C2AF115-BD1D-4434-A747-D1C8BD8E2045/L0/020</string>
<string>CB051A4C-2CB7-4B90-B59B-08CC4D0C2823/L0/020</string>
</array>
<key>IPXWorkspaceControllerZoomLevelsKey</key>
<dict>
<key>kZoomLevelIdentifierPhotosGrid</key>
<integer>2</integer>
</dict>
<key>Photos</key>
<dict>
<key>CollapsedSidebarSectionIdentifiers</key>
<array/>
<key>ExpandedSidebarItemIdentifiers</key>
<array>
<string>TopLevelAlbums</string>
<string>TopLevelSlideshows</string>
</array>
<key>IPXWorkspaceControllerZoomLevelsKey</key>
<dict>
<key>kZoomLevelIdentifierAlbums</key>
<integer>7</integer>
<key>kZoomLevelIdentifierVersions</key>
<integer>7</integer>
</dict>
<key>lastAddToDestination</key>
<dict>
<key>key</key>
<integer>1</integer>
<key>lastKnownDisplayName</key>
<string>September 28, 2018</string>
<key>type</key>
<string>album</string>
<key>uuid</key>
<string>DFFKmHt3Tk+AGzZLe2Xq+g</string>
</dict>
<key>lastKnownItemCounts</key>
<dict>
<key>other</key>
<integer>0</integer>
<key>photos</key>
<integer>7</integer>
<key>videos</key>
<integer>0</integer>
</dict>
</dict>
</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>FaceProcessingInternalVersion</key>
<integer>11</integer>
</dict>
</plist>

View File

@ -0,0 +1,870 @@
<?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>firstSeenDates</key>
<dict>
<key>com.apple.photos.CPAnalytics.addAssetsToLibrary</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.appleMusicPreparationFailed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.appleMusicPreparationSucceeded</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.appleMusicPreparedToPlay</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.appleMusicSongDownloaded</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetCollectionBlocked</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetCollectionDeleted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetCollectionFavorited</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetCollectionMoviePlayed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetCollectionUnfavorited</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetCollectionViewed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetExportItemPreparationCompleted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetExportPreparationCanceled</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetExportPreparationCompleted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetExportPreparationFailed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetFavorited</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetSharedStandardSelectionSize</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetUnfavorited</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetViewed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetsDeleted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetsDeletedFromTrash</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.assetsRestored</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmAddAssetToLibrary</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmPublishFromDetailViewMenuAction</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmPublishFromForYouSendBackSuggestions</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmPublishFromForYouSuggestion</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmPublishFromMessagesSuggestion</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmPublishFromShareSheet</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmPublishFromUnknown</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmReceivedSharesOpened</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmReceivedSharesSeen</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmSentSharesOpened</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmSentSharesSeen</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmShareBackOpened</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmShareBackPresentable</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmShareBackShown</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmSuggestionComposeFlowOpened</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmSuggestionOpened</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.cmmSuggestionSeen</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationEventFailed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationEventOneUpSelect</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationEventSkip</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationFromAlbumSection</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationFromAlbumSelection</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationFromOneUpMergeAll</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationFromOneUpSelection</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationFromUnspecified</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationMerge1</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationMerge11+</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationMerge2</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationMerge3-5</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationMerge6-10</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.deduplicationMergeAll</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterAllItemsSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterDuplicatesSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterEditedSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterFavoritedSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterHeaderSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterIncludeSharedWithYouSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterKeywordHeaderSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterKeywordManagerSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterKeywordsSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterPhotosSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterSavedItemsOnlySelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterSharedLibraryAllDisplayed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterSharedLibraryAllSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterSharedLibraryDismissed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterSharedLibraryMineDisplayed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterSharedLibraryMineSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterSharedLibraryPresented</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterSharedLibrarySharedDisplayed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterSharedLibrarySharedSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterUnsavedItemsOnlySelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.filterVideosSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.firstTimeExperienceNotReady</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.firstTimeExperienceReady</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.flexMusicDownloadRequiredAtPlaybackTime</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.flexMusicSongArtworkDownloaded</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.flexMusicSongAudioDownloaded</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeCMMPublishedShare</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeCMMReceivedShare</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumAccept</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumCoalescedWithComments</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumCoalescedWithCommentsAndLikes</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumComment</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumDecline</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumInvitation</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumLike</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumPost</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouTabOpenedFromInAppUserNavigation</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouTabOpenedFromNotification</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouTabOpenedFromOtherURL</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouTabOpenedFromStateRestoration</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouTabOpenedFromUndefined</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.forYouTabOpenedFromWidget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeAlbumGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeAlbumListGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeCMMInviteGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeCMMSuggestionGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeCPLCMMSuggestionGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeContentSyndication</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeDebugGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeFooterGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeInboxGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeListViewGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeMemoryRowGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeNoContentGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeRecentPhotosGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeRecentSearchesGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeSearchZeroKeywordGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeSettingsAdvisory</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeSharedAlbumActivityGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeSharedAlbumGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeSharedAlbumInviteGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeSuggestedEditGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeSuggestionGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeSurveyCongratulations</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeSurveyQuestionGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetSeenWithTypeTapToRadarGadget</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetWithTypeMemoryRowGadgetSelectedAccessoryButtonWithTypeSeeAll</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.gadgetWithTypeSharedAlbumGadgetSelectedAccessoryButtonWithTypeSeeAll</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.infoPanelAddLocationTapped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.infoPanelAdjustLocationTapped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.infoPanelLocationTapped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.mapViewAdjustLocationTapped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.mediaViewed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.memoryCreatedViaAddToMemories</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.memoryNotificationResponded</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.memoryNotificationSeen</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigateToFailedToUploadItemsAlbumFailed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigateToFailedToUploadItemsAlbumSucceeded</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigatedToSharedAlbumActivityViewFromCollageView</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigatedToSharedAlbumActivityViewFromRecentActivityEntry</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigatedToSharedAlbumActivityViewFromSeeAllButton</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.favorites</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.hidden</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.imports</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.animated</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.bursts</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.cinematicVideos</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.depthEffect</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.livePhotos</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.longExposures</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.panoramas</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.proRes</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.raw</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.screenrecordings</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.screenshots</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.selfPortraits</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.slomoVideos</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.timelapses</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.mediaTypes.videos</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.people</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.places</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.recentlyedited</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.recentlysaved</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.navigationList.trashBin</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExited</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith1-10Characters</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith101+Characters</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith11+Hashtags</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith11-20Characters</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith1Hashtags</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith21-30Characters</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith2Hashtags</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith31-50Characters</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith3Hashtags</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith4-5Hashtags</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith51-100Characters</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith6-10Hashtags</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.oneUpLivePhotoEffectApplied</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.addToPeopleHome</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.bootstrap.inlineControl.dismiss</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.bootstrap.inlineControl.review</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.bootstrap.mergeCandidates.confirmedAndRejectedCounts</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.bootstrap.speedbump.advance</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.bootstrap.speedbump.cancel</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.confirmAdditional.mergeCandidates.confirmedAndRejectedCounts</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.confirmAdditional.personSuggestions.confirmedAndRejectedCounts</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.detailView.keyPhotoChanged</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.detailView.notThisPerson</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.detailView.showFaces</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.manageTags.commitTapped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.me.confirmed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.me.rejected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.naming.contactChosen</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.naming.personChosen</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.naming.skipped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.naming.stringChosen</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.removeFromPeopleHome</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.untag.cancelTapped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.untag.newTagTapped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.people.untag.untagTapped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosCloudQuotaOfferAdded</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosCloudQuotaOfferRemoved</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosCloudQuotaOfferReplaced</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsAllAssetsCounted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth1</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth10</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth11-12</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth13-15</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth16-20</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth2</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth21-30</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth3</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth31-50</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth4</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth5</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth51+</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth6</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth7</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth8</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth9</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsShowMoreButtonSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsSummaryAssetsCounted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.photosDetailsSummaryButtonSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.places.locationAction</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.rendering.livePhotoEffectFailed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.rendering.livePhotoEffectPreviewRenderingDuration</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.search.session</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.search.siri</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.selectModeEntered</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.shareCanceled</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.shareCompleted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.shareFailed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.sharedAlbumInvitationAccepted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.sharedAlbumInvitationDeclined</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.sharedAlbumInvitationReportedAsJunk</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.sharedAlbumsActivityFeedPostLiked</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.sharedAlbumsActivityFeedPostUnliked</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportCancelledAfter10.0-60.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportCancelledAfter2.0-10.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportCancelledAfter&lt;2.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportCancelledAfter&gt;60.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter0.0-1.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter1.0-2.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter10.0-20.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter120.0-300.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter2.0-5.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter20.0-60.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter300.0-600.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter5.0-10.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter60.0-120.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter600.0-3600.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter&lt;0.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter&gt;3600.0Seconds</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportFailed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowExportStarted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.0-0.1</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.1-0.2</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.2-0.2</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.3-0.4</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.4-0.5</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.5-0.6</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.6-0.7</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.7-0.8</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.8-0.9</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.9-1.0</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction1.0-1.5</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction1.5-2.0</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction2.0-3.0</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction3.0-5.0</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction&lt;0.0</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction&gt;5.0</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedByEndReached</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedByUndefined</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedByUser</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStarted</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith0-Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith1-5Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith1001+Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith101-200Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith11-15Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith16-20Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith201-300Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith21-30Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith301-500Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith31-50Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith501-1000Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith51-100Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith6-10Assets</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.syndicatedAssetsFilterTipAnchorButtonTapped</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.syndicatedAssetsFilterTipDismissed</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.syndicatedAssetsFilterTipPresented</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.syndicatedAssetsSaved</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.syndicationSuggestionRemoved</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.tabIdentifierChanged</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.toggleMineAndSharedSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.toggleMyPhotosOnlySelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.userChoices.livePhotoEffectBounceSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.userChoices.livePhotoEffectLongExposureSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.userChoices.livePhotoEffectLoopSelected</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.userChoices.livePhotoEffectsAppeared</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.viewScrolledToBottom</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.viewScrolledToInitialPosition</key>
<string>15/06/2022</string>
<key>com.apple.photos.CPAnalytics.widget.open</key>
<string>15/06/2022</string>
<key>com.apple.photos.cpa.active_user_feature.interactiveMemoryExport</key>
<string>15/06/2022</string>
<key>com.apple.photos.cpa.active_user_feature.interactiveMemoryPlayback</key>
<string>15/06/2022</string>
<key>com.apple.photos.cpa.active_user_feature.memoryMoviePlayed</key>
<string>15/06/2022</string>
<key>com.apple.photos.cpa.active_user_feature.memoryViewed</key>
<string>15/06/2022</string>
<key>com.apple.photos.cpa.active_user_feature.mobileSlideShowActive</key>
<string>15/06/2022</string>
<key>com.apple.photos.cpa.active_user_feature.slideshowExported</key>
<string>15/06/2022</string>
<key>com.apple.photos.cpa.active_user_feature.slideshowPlayed</key>
<string>15/06/2022</string>
<key>com.apple.photos.edit.perf.exitedit</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.appleMusicFixation</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurred</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInAdditionalAutoEditDecisionLists</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInAssetsPreloading</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInAutoEditClip</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInAutoEditDecisionLists</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInAutoEditTransitionInfo</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInColorNormalization</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInCuratedSongs</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInInitialStyle</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInMovieHighlights</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInMusicPlayback</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInPersistableRecipe</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInPersistence</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInRecipePersistence</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInStoryModel</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInStyleManager</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInStyles</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInTargetDurationCuration</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInTimelineManager</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInTimelineValidation</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryErrorOccurredInTransitions</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryExportCancelled</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryExportFailed</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryExported</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStarted</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedByAutoplayedRelated</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedByUserSelectingRelated</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith1-10CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith10001-20000CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith1001-2000CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith101-200CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith11-50CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith20000+CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith2001-5000CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith201-300CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith301-500CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith5001-10000CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith501-1000CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith51-100CuratedAssets</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryMusicFellBackToLocalFlexSong</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryMusicUsedFlexMusic</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryMusicUseedAppleMusic</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryPlaybackFinishedTruncated</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith0Pauses</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith1-2Pauses</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith101+Pauses</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith11-50Pauses</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith3-5Pauses</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith51-100Pauses</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith6-10Pauses</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryRecipeErrorOccurred</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemorySessionBegan</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemorySessionEnded</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemorySessionPaused</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemorySessionPlayed</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryTimelinePlayedWith0-49PercentTransitionsOnBar</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryTimelinePlayedWith50-74PercentTransitionsOnBar</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryTimelinePlayedWith75-84PercentTransitionsOnBar</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryTimelinePlayedWith85-94PercentTransitionsOnBar</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.interactiveMemoryTimelinePlayedWith95-100PercentTransitionsOnBar</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.playbackLaunchPerformance</key>
<string>15/06/2022</string>
<key>com.apple.photos.memory.playbackReliability</key>
<string>15/06/2022</string>
<key>screen_CuratedLibrary_AllPhotos</key>
<string>15/06/2022</string>
<key>screen_CuratedLibrary_Days</key>
<string>15/06/2022</string>
<key>screen_CuratedLibrary_Months</key>
<string>15/06/2022</string>
<key>screen_CuratedLibrary_Years</key>
<string>15/06/2022</string>
<key>screen_DuplicatesAlbum</key>
<string>15/06/2022</string>
<key>screen_FavoriteMemories</key>
<string>15/06/2022</string>
<key>screen_IPXFeedViewController</key>
<string>15/06/2022</string>
<key>screen_InteractiveMemory</key>
<string>15/06/2022</string>
<key>screen_InteractiveMemoryBrowserGrid</key>
<string>15/06/2022</string>
<key>screen_InteractiveMemoryStyleSwitcher</key>
<string>15/06/2022</string>
<key>screen_MFMailComposeViewController</key>
<string>15/06/2022</string>
<key>screen_MFMessageComposeViewController</key>
<string>15/06/2022</string>
<key>screen_Memories</key>
<string>15/06/2022</string>
<key>screen_MemoriesFeed</key>
<string>15/06/2022</string>
<key>screen_MemoriesWidget</key>
<string>15/06/2022</string>
<key>screen_ObjectManipulationViewController</key>
<string>15/06/2022</string>
<key>screen_PMEditorNavigationController</key>
<string>15/06/2022</string>
<key>screen_PMiOSMainViewController</key>
<string>15/06/2022</string>
<key>screen_PXCMMAssetsViewController</key>
<string>15/06/2022</string>
<key>screen_PXEducationalTipViewController</key>
<string>15/06/2022</string>
<key>screen_PXFeedViewController</key>
<string>15/06/2022</string>
<key>screen_PXFeedbackTapToRadarViewController</key>
<string>15/06/2022</string>
<key>screen_PXFloatingCardViewController</key>
<string>15/06/2022</string>
<key>screen_PXForYouGadgetViewController</key>
<string>15/06/2022</string>
<key>screen_PXPeopleBootstrapConfirmationViewController</key>
<string>15/06/2022</string>
<key>screen_PXPeopleBootstrapFinalViewController</key>
<string>15/06/2022</string>
<key>screen_PXPeopleCollectionViewController</key>
<string>15/06/2022</string>
<key>screen_PXPeopleConfirmationSummaryViewController</key>
<string>15/06/2022</string>
<key>screen_PXPeopleDetailViewController</key>
<string>15/06/2022</string>
<key>screen_PXPeopleNamePickerViewController</key>
<string>15/06/2022</string>
<key>screen_PXPeopleRecoCollectionViewController</key>
<string>15/06/2022</string>
<key>screen_PXPlacesMapInfoViewController</key>
<string>15/06/2022</string>
<key>screen_PXPlacesMapViewController</key>
<string>15/06/2022</string>
<key>screen_PXSurveyRadarReporterViewController</key>
<string>15/06/2022</string>
<key>screen_PXUIPeopleBootstrapNamingViewController</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_Collection</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_CuratedLibraryDays</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_CuratedLibraryMonths</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_CuratedLibraryYears</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_Memories</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_Moment</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_NonTracking</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_OneUpAccessory</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_OtherAlbums</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_People</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_Places</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_RelatedWidget</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_Search</key>
<string>15/06/2022</string>
<key>screen_PhotosDetails_Year</key>
<string>15/06/2022</string>
<key>screen_PhotosUIApps.PUXStoryColorGradeEditorViewController</key>
<string>15/06/2022</string>
<key>screen_PhotosUIApps.PUXStoryExportActivityPreviewViewController</key>
<string>15/06/2022</string>
<key>screen_PhotosUIApps.PUXStoryExportActivityViewController</key>
<string>15/06/2022</string>
<key>screen_PhotosUIApps.PUXStoryMusicEditorViewController</key>
<string>15/06/2022</string>
<key>screen_PhotosView</key>
<string>15/06/2022</string>
<key>screen_SBSUIWallpaperPreviewViewController</key>
<string>15/06/2022</string>
<key>screen_SLComposeViewController</key>
<string>15/06/2022</string>
<key>screen_TPKContentPopoverViewController</key>
<string>15/06/2022</string>
<key>screen_UIImagePickerController</key>
<string>15/06/2022</string>
<key>screen__UIActivityUserDefaultsViewController</key>
<string>15/06/2022</string>
</dict>
<key>lastSeenDates</key>
<dict>
<key>screen_CuratedLibrary_AllPhotos</key>
<string>15/06/2022</string>
</dict>
</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>2020-06-24T04:02:13Z</date>
<key>BackgroundHighlightEnrichment</key>
<date>2020-06-24T04:02:12Z</date>
<key>BackgroundJobAssetRevGeocode</key>
<date>2020-06-24T04:02:13Z</date>
<key>BackgroundJobSearch</key>
<date>2020-06-24T04:02:13Z</date>
<key>BackgroundPeopleSuggestion</key>
<date>2020-06-24T04:02:12Z</date>
<key>BackgroundUserBehaviorProcessor</key>
<date>2020-06-24T04:02:13Z</date>
<key>PhotoAnalysisGraphLastBackgroundGraphConsistencyUpdateJobDateKey</key>
<date>2020-05-30T02:16:06Z</date>
<key>PhotoAnalysisGraphLastBackgroundGraphRebuildJobDate</key>
<date>2020-05-29T04:31:37Z</date>
<key>PhotoAnalysisGraphLastBackgroundMemoryGenerationJobDate</key>
<date>2020-06-24T04:02:13Z</date>
<key>SiriPortraitDonation</key>
<date>2020-06-24T04:02:13Z</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,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>NumberOfFacesProcessedOnLastRun</key>
<integer>7</integer>
<key>ProcessedInQuiescentState</key>
<true/>
<key>SuggestedMeIdentifier</key>
<string></string>
<key>Version</key>
<integer>4</integer>
</dict>
</plist>

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