
    Dj>                        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j        e          Zd)dZd*dZd+dZd,dZd,dZd-dZd.dZd/dZd0d(ZdS )1z,Mapping helpers for Photos CloudKit records.    )annotationsN)datetimetimezone)AnyIterable)CKRecord)CKAssetToken   )PhotoResourcerecordr   
field_namestrreturn
str | Nonec           	        t          | |          }|dS t          |t                    r|}n@t          |t                    r)	 |                    d          }n# t
          $ r |cY S w xY wdS 	 t          j        |                              d          S # t          $ rT 	 |                    d          cY S # t          $ r. t                              d|t          |                      Y Y dS w xY ww xY 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raws       d/home/thesage/.hermes/venv/lib/python3.11/site-packages/pyicloud/services/photos_cloudkit/mappers.pydecode_encrypted_textr"      s*    vz22E}t% 	E3		 	,,w''CC! 	 	 	LLL	 t$$++G444   	::g&&&&& 	 	 	LL4j+fBUBUVVV444	sB   A A('A(.&B 
C3 B74C373C/*C3.C//C3CKRecord | dict[str, Any]c                >   t          | t                    r=| j                            |          }t          |t                    rd|v r|d         S |S |                     di                               |          }t          |t                    rd|v r|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   fields       r!   r   r   .   s     &(## ''
33eT"" 	"w%'7'7>!JJx$$((44E% 7e#3#3W~4    c                d    t          | t                    r| j        S |                     d          S )z6Return ``recordChangeTag`` from a typed or raw record.recordChangeTag)r   r   r,   r(   r   s    r!   record_change_tagr.   <   s2     &(## &%%::'(((r*   c                J    t          | t                    r| j        S | d         S )z1Return ``recordName`` from a typed or raw record.
recordName)r   r   r0   r-   s    r!   r   r   D   *     &(## !  ,r*   c                J    t          | t                    r| j        S | d         S )z1Return ``recordType`` from a typed or raw record.
recordType)r   r   r3   r-   s    r!   record_record_typer4   L   r1   r*   dict[str, Any] | Nonec                    t          | t                    r$| j        dS | j                            d          S |                     d          S )z:Return ``zoneID`` as a mapping from a typed or raw record.NT)exclude_nonezoneID)r   r   r8   
model_dumpr(   r-   s    r!   record_zoner:   T   sN     &(## ;= 4}''T':::::hr*   recordsIterable[CKRecord]*tuple[dict[str, CKRecord], list[CKRecord]]c                    i }g }| D ]e}|j         dk    r8|j                            d          }t          |dd          p|j        }|||<   E|j         dk    r|                    |           f||fS )zBReturn ``master_id -> asset`` mapping plus ordered master records.CPLAsset	masterRefr0   N	CPLMaster)r3   r%   r&   getattrr0   append)r;   assets_by_mastermastersr   refmaster_names         r!   master_asset_pairsrH   ^   s    
 -/ G # #
**-))+66C!#|T::Of>OK,2[))+--NN6"""W$$r*   r   c                n    t          | t                    r| S t          j        dt          j                  S )z<Normalize optional CloudKit timestamps to a stable datetime.r   )r   r   fromtimestampr   utc)r   s    r!   timestamp_or_epochrL   q   s0     %"" !!X\222r*   keyprefixmaster_recordfilenameitem_type_extensionsdict[str, str]is_live_photoboolitem_type_lookupPhotoResource | Nonec           
        t          || d          }|dS t          |t                    r|j        }|j        }	nbt          |t
                    r+|                    d          }|                    d          }	n"t          |dd          }t          |dd          }	t          || d          }
t          || d          }t          || d          }t          || d          }|}|
rl|r|                    |
          d	k    s|                    |
          r<t          j	        
                    |          \  }}| |                    |
d
           }t          | |||	|
|||          S )z?Build a ``PhotoResource`` from a ``CPLMaster`` resource prefix.ResNdownloadURLsizeFileTypeFingerprintWidthHeightmoviez.MOV)rM   rP   urlrZ   typechecksumwidthheight)r   r   r	   rY   rZ   r'   r(   rB   ospathsplitextr   )rM   rN   rO   rP   rQ   rS   rU   tokenr`   rZ   resource_typerb   rc   rd   resource_filename	name_base_s                    r!   build_photo_resourcerm   y   s    }nnn==E}t%&& ,z	E4	 	  ,ii&&yy  e]D11ufd++&}6I6I6IJJM!-F1G1G1GHHH}.>.>.>??E&/@/@/@AAF  
	
+//>>'II##M22 J w''11	1K.22=&IIKK 	 "	 	 	 	r*   )r   r   r   r   r   r   )r   r#   r   r   )r   r#   r   r   )r   r#   r   r   )r   r#   r   r5   )r;   r<   r   r=   )r   r   )rM   r   rN   r   rO   r#   rP   r   rQ   rR   rS   rT   rU   rR   r   rV   )__doc__
__future__r   r   loggingre   r   r   typingr   r   pyicloud.common.cloudkitr   pyicloud.common.cloudkit.modelsr	   modelsr   	getLogger__name__r   r"   r   r.   r   r4   r:   rH   rL   rm    r*   r!   <module>rx      sn   2 2 " " " " " "   				 ' ' ' ' ' ' ' '                 - - - - - - 8 8 8 8 8 8 ! ! ! ! ! !		8	$	$   6   ) ) ) )                     % % % %&3 3 3 32 2 2 2 2 2r*   