o
    l>j>                     @  s   d Z ddlmZ ddlZddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZ dd	lmZ eeZd2ddZd3ddZd4ddZd5ddZd5ddZd6ddZd7d!d"Zd8d$d%Zd9d0d1ZdS ):z,Mapping helpers for Photos CloudKit records.    )annotationsN)datetimetimezone)AnyIterable)CKRecord)CKAssetToken   )PhotoResourcerecordr   
field_namestrreturn
str | Nonec                 C  s   t | |}|du rdS t|tr|}nt|tr+z|d}W n ty*   | Y S w dS z	t|dW S  t	yZ   z|dW  Y S  t	yY   t
d|t|  Y Y dS w w )zBDecode a base64-wrapped text field from STRING or ENCRYPTED_BYTES.Nasciizutf-8zFailed to decode %s on %s)record_field_value
isinstancebytesr   encodeUnicodeEncodeErrorbase64	b64decodedecode	ExceptionLOGGERdebugrecord_name)r   r   valueraw r   ^/home/thesage/.local/lib/python3.10/site-packages/pyicloud/services/photos_cloudkit/mappers.pydecode_encrypted_text   s,   


r!   CKRecord | dict[str, Any]c                 C  sd   t | tr| j|}t |trd|v r|d S |S | di |}t |tr0d|v r0|d S dS )zEReturn a field value from a typed record or a legacy raw-dict record.r   fieldsN)r   r   r#   	get_valuedictget)r   r   r   fieldr   r   r    r   .   s   
r   c                 C  s   t | tr| jS | dS )z6Return ``recordChangeTag`` from a typed or raw record.recordChangeTag)r   r   r(   r&   r   r   r   r    record_change_tag<   s   

r*   c                 C     t | tr| jS | d S )z1Return ``recordName`` from a typed or raw record.
recordName)r   r   r,   r)   r   r   r    r   D      
r   c                 C  r+   )z1Return ``recordType`` from a typed or raw record.
recordType)r   r   r.   r)   r   r   r    record_record_typeL   r-   r/   dict[str, Any] | Nonec                 C  s0   t | tr| jdu rdS | jjddS | dS )z:Return ``zoneID`` as a mapping from a typed or raw record.NT)exclude_nonezoneID)r   r   r2   
model_dumpr&   r)   r   r   r    record_zoneT   s
   


r4   recordsIterable[CKRecord]*tuple[dict[str, CKRecord], list[CKRecord]]c                 C  s`   i }g }| D ]%}|j dkr!|jd}t|ddp|j}|||< q|j dkr+|| q||fS )zBReturn ``master_id -> asset`` mapping plus ordered master records.CPLAsset	masterRefr,   N	CPLMaster)r.   r#   r$   getattrr,   append)r5   assets_by_mastermastersr   refmaster_namer   r   r    master_asset_pairs^   s   



rA   r   c                 C  s   t | tr| S tdtjS )z<Normalize optional CloudKit timestamps to a stable datetime.r   )r   r   fromtimestampr   utc)r   r   r   r    timestamp_or_epochq   s   
rD   keyprefixmaster_recordfilenameitem_type_extensionsdict[str, str]is_live_photoboolitem_type_lookupPhotoResource | Nonec              
   C  s  t || d}|du rdS t|tr|j}|j}	nt|tr*|d}|d}	nt|dd}t|dd}	t || d}
t || d}t || d}t || d}|}|
rz|rc||
d	ksh||
rztj	
|\}}| ||
d
 }t| |||	|
|||dS )z?Build a ``PhotoResource`` from a ``CPLMaster`` resource prefix.ResNdownloadURLsizeFileTypeFingerprintWidthHeightmoviez.MOV)rE   rH   urlrQ   typechecksumwidthheight)r   r   r   rP   rQ   r%   r&   r;   ospathsplitextr
   )rE   rF   rG   rH   rI   rK   rM   tokenrW   rQ   resource_typerY   rZ   r[   resource_filename	name_base_r   r   r    build_photo_resourcey   sF   


rd   )r   r   r   r   r   r   )r   r"   r   r   )r   r"   r   r   )r   r"   r   r   )r   r"   r   r0   )r5   r6   r   r7   )r   r   )rE   r   rF   r   rG   r"   rH   r   rI   rJ   rK   rL   rM   rJ   r   rN   )__doc__
__future__r   r   loggingr\   r   r   typingr   r   pyicloud.common.cloudkitr   pyicloud.common.cloudkit.modelsr   modelsr
   	getLogger__name__r   r!   r   r*   r   r/   r4   rA   rD   rd   r   r   r   r    <module>   s(    









