o
    l>jo3                     @  s   d Z ddlm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ed
dG dd deZdS )as  
CloudKit-backed NoteDataSource implementation.

Provides an in-memory datasource for a single Note that can answer:
  - get_attachment_uti(identifier) -> Optional[str]
  - get_mergeable_gz(identifier)   -> Optional[bytes]
  - (optional) get_primary_asset_url/get_thumbnail_url/get_title

Population is performed by feeding CloudKit records into `add_attachment_record`.
    )annotationsN)	dataclassfield)DictOptional)CKRecord   )ExportConfig)NoteDataSourceT)slotsc                   @  s   e Zd ZU eedZded< eedZded< eedZded< eedZ	ded< eedZ
ded< d	Zd
ed< d#ddZd$ddZd#ddZd#ddZd#ddZd%ddZd&d!d"Zd	S )'CloudKitNoteDataSource)default_factoryzDict[str, str]_utizDict[str, bytes]_mergeable_gz_primary_asset_url_thumbnail_url_titleNzOptional[ExportConfig]_config
identifierstrreturnOptional[str]c                 C     | j |S N)r   getselfr    r   d/home/thesage/.local/lib/python3.10/site-packages/pyicloud/services/notes/rendering/ck_datasource.pyget_attachment_uti$      z)CloudKitNoteDataSource.get_attachment_utiOptional[bytes]c                 C  r   r   )r   r   r   r   r   r   get_mergeable_gz'   r    z'CloudKitNoteDataSource.get_mergeable_gzc                 C  r   r   )r   r   r   r   r   r   get_primary_asset_url+   r    z,CloudKitNoteDataSource.get_primary_asset_urlc                 C  r   r   )r   r   r   r   r   r   get_thumbnail_url.   r    z(CloudKitNoteDataSource.get_thumbnail_urlc                 C  r   r   )r   r   r   r   r   r   	get_title1   r    z CloudKitNoteDataSource.get_titleurlNonec                 C  s   |r|sd S || j |< d S r   r   )r   r   r&   r   r   r   set_primary_asset_url6   s   z,CloudKitNoteDataSource.set_primary_asset_urlrecr   c           0        s  |j }d8dd}d9dd}d }d	D ]}t||pd
dd }t|tr)|r)|} nq|jp.d }|s5|s5d S g }	|r>|	| |rI||	vrI|	| |rT||	vrT|	| d }
|dp_|d}t|trj|rj|}
n|d}t|tt	frz||nd }
|
r|	D ]}|
 j
|< q|
pd }|dk}|dv }|dp|dv }|d}t|tt	fr|r|	D ]	}t| j|< q|d}||}|r|	D ]}| j|< q|rt fdd|	D s|d}||rt|dd nd }|r|	D ]}| j|< q|rCt fdd|	D sC|d}z,|rt|dd nd }t|ttfr7|r7||d }|r7|	D ]}| j|< q.W n
 tyB   Y nw t fdd|	D s|r|d}z|rat|dd nd }t|ttfr|r|d}|r|t|dd nd }d}z jrt jd d rt jj  }W n ty   d}Y nw |d!v rd"nd}d }t|ttfrt|t|krt|D ](\}}zt|} W n ty   d } Y nw | |kr||| }|r nq|s |D ]}!||!}|r nq|r|	D ]}| j|< qW n
 ty   Y nw t fd#d|	D sI|rI|d$}"||"r8t|"dd nd }|rI|	D ]}| j|< q@z1|d}#|#rXt|#dd nd }$t|$ttfry|$ry||$d }%|%ry|	D ]}|% j|< qpW n
 ty   Y nw |d%}&t|&tt	fr|&rt fd&d|	D s|t|&}'|'r|	D ]}|' j|< q|d'|d(|d)|d*|d+|d,|d-|d.g}(d/})|(D ],}*d }+t|*tt	fr||*}+nt|*tr|*}+|+rd0})|	D ]}|+ j|< q nq|)s<|r< j|	r|	d nd},|,s.|d1}-t|-tr.|-r.|-},|,r<|	D ]}|, j|< q3|d2}.||.}/|/r^|	D ]}|/ j|< | jvr\|/ j|< qJztjd3d4d3|j|t|
t fd5d|	D d6d7 W d S  ty   Y d S w ):NvalOptional[bytes | bytearray]r   r   c                 S  s0   | d u rd S z|  ddW S  ty   Y d S w )Nzutf-8replace)decode	Exception)r+   r   r   r   _text_from_bytes?   s   zFCloudKitNoteDataSource.add_attachment_record.<locals>._text_from_bytesc                 S  sv   | du rdS z*t | tr| d}t |tr|r|W S dW S t| dd}t |tr.|r.|W S dW S  ty:   Y dS w )zBest-effort extractor for CloudKit asset token downloadURL.

            Accepts a mapping (dict-like) or an object with attribute `downloadURL`.
            Returns the URL string if present and non-empty.
            NdownloadURL)
isinstancedictr   r   getattrr/   )objr&   r   r   r   
_asset_urlG   s   

z@CloudKitNoteDataSource.add_attachment_record.<locals>._asset_url)AttachmentIdentifierattachmentIdentifier
Identifierr   valueUTIAttachmentUTIUTIEncrypted z
public.url)zcom.adobe.pdfz
public.pdfzcom.apple.paper.doc.pdfzpublic.image>
   
public.bmp
public.gif
public.jpg
public.pngpublic.heicpublic.heifpublic.jpegpublic.tiffpublic.webpcom.apple.paperMergeableDataEncryptedPrimaryAssetc                 3      | ]}| j v V  qd S r   r(   .0kr   r   r   	<genexpr>       z?CloudKitNoteDataSource.add_attachment_record.<locals>.<genexpr>FallbackPDFc                 3  rK   r   r(   rL   rO   r   r   rP      rQ   PaperAssetsr   c                 3  rK   r   r(   rL   rO   r   r   rP      rQ   PreviewImagesPreviewAppearanceslightpreview_appearance)dark1trueyesr   c                 3  rK   r   r(   rL   rO   r   r   rP      rQ   FallbackImageURLStringEncryptedc                 3  rK   r   r(   rL   rO   r   r   rP      rQ   TitleEncryptedSummaryEncryptedLocalizedTitleEncryptedAltTextEncryptedTokenContentIdentifierEncryptedTitleSummaryAltTextFT	URLStringMediazckds.add_attachment_recordnotesc                 3  rK   r   )r   rL   rO   r   r   rP   ;  rQ   )	componentoprecord_namer   has_utihas_mergeable)extra)r+   r,   r   r   )r   r   )fieldsr4   	get_fieldr2   r   
recordNameappend	get_valuebytes	bytearrayr   lower
startswithr   r   anylisttupler/   r   rW   striplen	enumerateintr   r   r   LOGGERdebugbool)0r   r*   ro   r0   r6   identkeyrawrec_namekeysuti_val	uti_plainuti_encrN   uti_l
is_url_uti
is_pdf_utiis_image_utimdpa_valr&   fp_fldpa_list_fldtokenspi_fldapp_fldappspref	pref_codeselectedidxappcodetokenfb_fldpi2_fldtokens2thumburl_encdec
titles_tryfound_titletv	dec_titleurl_valurl_raw	media_val	thumb_urlr   rO   r   add_attachment_record;   s|  














"




	



z,CloudKitNoteDataSource.add_attachment_record)r   r   r   r   )r   r   r   r!   )r   r   r&   r   r   r'   )r*   r   r   r'   )__name__
__module____qualname__r   r3   r   __annotations__r   r   r   r   r   r   r"   r#   r$   r%   r)   r   r   r   r   r   r      s   
 





r   )__doc__
__future__r   loggingdataclassesr   r   typingr   r   pyicloud.common.cloudkitr   optionsr	   renderer_ifacer
   	getLoggerr   r   r   r   r   r   r   <module>   s    
