Initial support for Ventura developer preview (#715)
@ -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`:
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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 — 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">""" PhotoInfo and FaceInfo classes to expose info about persons and faces in the Photos library """</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">"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">__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">"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>
|
||||
<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">"""Info about a person in the Photos library"""</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">"""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"> """</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">"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="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">"photo_uuid"</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">"photo_uuid"</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">"""Returns list of PhotoInfo objects associated with this person"""</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">"""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"> """</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">"""Returns dictionary representation of class instance"""</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">"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="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">"""Returns JSON representation of class instance"""</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">"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">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">"_db"</span><span class="p">,</span> <span class="s2">"_pk"</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">"""Info about a face in the Photos library"""</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">"""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"> """</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">"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">mouth_x</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"mouthx"</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">"mouthy"</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">"lefteyex"</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">"lefteyey"</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">"righteyex"</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">"righteyey"</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">left_eye_closed</span> <span class="o">=</span> <span class="n">face</span><span class="p">[</span><span class="s2">"left_eye_closed"</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">"right_eye_closed"</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="c1"># self.bald_type = face["baldtype"]</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="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">"""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"> """</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">"""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"> """</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">></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">"""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"> """</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">"""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"> """</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">"""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"> """</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">"""PersonInfo instance for person associated with this face"""</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">"""PhotoInfo instance associated with this face"""</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">"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="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">"""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"> """</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">"""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"> """</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">"""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"> """</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">></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">"""Roll, pitch, yaw of face in radians as tuple"""</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">"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="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">"""Return roll angle in radians of the face region"""</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">"""Return pitch angle in radians of the face region"""</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">"""Return yaw angle in radians of the face region"""</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">"""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"> """</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'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">"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="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">"""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"> """</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">"""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"> """</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">"""Returns dict representation of class instance"""</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">"_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">"mouth_x"</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">"mouth_y"</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">"mouth"</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">"left_eye_x"</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">"left_eye_y"</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">"left_eye"</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">"right_eye_x"</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">"right_eye_y"</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">"right_eye"</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">"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">"left_eye_closed"</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">"right_eye_closed"</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">"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="c1"># "bald_type": self.bald_type,</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="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">"""Return JSON representation of FaceInfo instance"""</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">"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">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">"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">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">"_db"</span><span class="p">,</span> <span class="s2">"_pk"</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">"""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"> """</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 © 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">
|
||||
©2021, Rhet Turnbull.
|
||||
<aside class="toc-drawer no-toc">
|
||||
|
||||
|
|
||||
Powered by <a href="http://sphinx-doc.org/">Sphinx 4.4.0</a>
|
||||
& <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>
|
||||
@ -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">-></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>
|
||||
|
||||
@ -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>
|
||||
|
||||
BIN
docs/objects.inv
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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.)
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
|
After Width: | Height: | Size: 574 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 2.9 MiB |
|
After Width: | Height: | Size: 500 KiB |
|
After Width: | Height: | Size: 524 KiB |
|
After Width: | Height: | Size: 2.1 MiB |
|
After Width: | Height: | Size: 2.8 MiB |
|
After Width: | Height: | Size: 528 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 450 KiB |
|
After Width: | Height: | Size: 541 KiB |
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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<2.0Seconds</key>
|
||||
<string>15/06/2022</string>
|
||||
<key>com.apple.photos.CPAnalytics.slideshowExportCancelledAfter>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<0.0Seconds</key>
|
||||
<string>15/06/2022</string>
|
||||
<key>com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter>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<0.0</key>
|
||||
<string>15/06/2022</string>
|
||||
<key>com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction>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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||