Added cloud_metadata to PhotoInfo

This commit is contained in:
Rhet Turnbull
2022-05-25 22:56:52 -07:00
parent 8d020cbf09
commit ed3473f602

View File

@@ -3,6 +3,8 @@ PhotoInfo class
Represents a single photo in the Photos library and provides access to the photo's attributes Represents a single photo in the Photos library and provides access to the photo's attributes
PhotosDB.photos() returns a list of PhotoInfo objects PhotosDB.photos() returns a list of PhotoInfo objects
""" """
import contextlib
import dataclasses import dataclasses
import datetime import datetime
import json import json
@@ -10,14 +12,16 @@ import logging
import os import os
import os.path import os.path
import pathlib import pathlib
import plistlib
from datetime import timedelta, timezone from datetime import timedelta, timezone
from functools import cached_property from functools import cached_property
from typing import Optional from typing import Dict, Optional
import yaml import yaml
from osxmetadata import OSXMetaData from osxmetadata import OSXMetaData
from ._constants import ( from ._constants import (
_DB_TABLE_NAMES,
_MOVIE_TYPE, _MOVIE_TYPE,
_PHOTO_TYPE, _PHOTO_TYPE,
_PHOTOS_4_ALBUM_KIND, _PHOTOS_4_ALBUM_KIND,
@@ -1372,6 +1376,30 @@ class PhotoInfo:
useful for detecting changes in any property/metadata of the photo""" useful for detecting changes in any property/metadata of the photo"""
return hexdigest(self.json()) return hexdigest(self.json())
@cached_property
def cloud_metadata(self) -> Dict:
"""Returns contents of ZCLOUDMASTERMEDIAMETADATA as dict"""
# This is a large blob of data so don't load it unless requested
asset_table = _DB_TABLE_NAMES[self._db._photos_ver]["ASSET"]
sql_cloud_metadata = f"""
SELECT ZCLOUDMASTERMEDIAMETADATA.ZDATA
FROM ZCLOUDMASTERMEDIAMETADATA
JOIN ZCLOUDMASTER ON ZCLOUDMASTER.Z_PK = ZCLOUDMASTERMEDIAMETADATA.ZCLOUDMASTER
JOIN {asset_table} on {asset_table}.ZMASTER = ZCLOUDMASTER.Z_PK
WHERE {asset_table}.ZUUID = ?
"""
if self._db._db_version <= _PHOTOS_4_VERSION:
logging.debug(f"cloud_metadata not implemented for this database version")
return {}
_, cursor = self._db.get_db_connection()
metadata = {}
if results := cursor.execute(sql_cloud_metadata, (self.uuid,)).fetchone():
with contextlib.suppress(Exception):
metadata = plistlib.loads(results[0])
return metadata
def detected_text(self, confidence_threshold=TEXT_DETECTION_CONFIDENCE_THRESHOLD): def detected_text(self, confidence_threshold=TEXT_DETECTION_CONFIDENCE_THRESHOLD):
"""Detects text in photo and returns lists of results as (detected text, confidence) """Detects text in photo and returns lists of results as (detected text, confidence)