
    Dj                    p   U d 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
mZmZ ddlmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZmZ ddlm Z  ddl!m"Z"  ej#        e$          Z%ej&        e'd<    G d de          Z(de)e*ef         de+e)e*ef                  fdZ,e G d de                      Z- G d de*e
          Z. G d de*e
          Z/ G d de*e
          Z0 G d de*e
          Z1dddZ2e)e*e*f         e'd <    G d! d"e          Z3 G d# d$e          Z4 G d% d&e4          Z5 G d' d(e4          Z6 G d) d*e           Z7 G d+ d,ee          Z8 G d- d.e8          Z9 G d/ d0e9          Z: G d1 d2e9          Z; G d3 d4e8          Z< G d5 d6          Z= G d7 d8e=          Z>dS )9zPhoto service.    N)ABCabstractmethod)datetimetimezone)EnumIntEnumunique)Any	GeneratorIterableIteratorOptionalcast)	urlencode)Response)CONTENT_TYPECONTENT_TYPE_TEXT)PyiCloudAPIResponseExceptionPyiCloudException$PyiCloudServiceNotActivatedException)BaseService)PyiCloudSession_LOGGERc                   6     e Zd ZdZddd	 	 	 	 	 d
 fd	Z xZS )PhotosServiceExceptionzPhoto service exception.N)photoalbumr   PhotoAsset|Noner   BasePhotoAlbum|Nonereturnc                P     t                      j        |  || _        || _        d S N)super__init__r   r   )selfr   r   args	__class__s       Z/home/thesage/.hermes/venv/lib/python3.11/site-packages/pyicloud/services/photos_legacy.pyr$   zPhotosServiceException.__init__   s+     	$(-
,1


    )r   r   r   r   r    N)__name__
__module____qualname____doc__r$   __classcell__r'   s   @r(   r   r      sn        ""
 $('+	2 2 !2 %	2
 
2 2 2 2 2 2 2 2 2 2r)   r   payloadr    c                 "   |                      d          rg S |                      d          }t          |t                    sg S g }|D ]F}t          |t                    s|                     d          rg c S |                    |           G|S )z=Return non-error record dicts from a CloudKit modify payload.errorsrecordsserverErrorCode)get
isinstancelistdictappend)r0   r3   valid_recordsrecords       r(   _valid_modify_recordsr<   (   s    {{8 	kk)$$Ggt$$ 	*,M % %&$'' 	::'(( 	IIIV$$$$r)   c                       e Zd ZdZdZdZdZdS )AlbumTypeEnumzAlbum typesr         N)r*   r+   r,   r-   ALBUMFOLDERSMART_ALBUM r)   r(   r>   r>   9   s#        EFKKKr)   r>   c                   >    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdS )SmartAlbumEnumzSmart albums names.LibraryBursts	FavoritesHiddenLive	PanoramaszRecently DeletedScreenshotszSlo-moz
Time-lapseVideosN)r*   r+   r,   r-   
ALL_PHOTOSBURSTS	FAVORITESHIDDENLIVE	PANORAMASRECENTLY_DELETEDSCREENSHOTSSLO_MO
TIME_LAPSEVIDEOSrD   r)   r(   rF   rF   B   sL        JFIFDI)KFJFFFr)   rF   c                       e Zd ZdZdZdZdS )DirectionEnumzDirection names.	ASCENDING
DESCENDINGN)r*   r+   r,   r-   r\   r]   rD   r)   r(   r[   r[   R   s        IJJJr)   r[   c                   .    e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
ListTypeEnumzList type names.2CPLAssetAndMasterByAssetDateWithoutHiddenOrDeleted&CPLAssetAndMasterDeletedByExpungedDate"CPLAssetAndMasterHiddenByAssetDate(CPLAssetAndMasterInSmartAlbumByAssetDate&CPLBurstStackAssetAndMasterByAssetDate#CPLContainerRelationLiveByAssetDatesharedstreamN)r*   r+   r,   r-   DEFAULTDELETEDrR   rC   STACK	CONTAINERSHARED_STREAMrD   r)   r(   r_   r_   Y   s7        BG6G1F<K4E5I"MMMr)   r_   c                   B    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )ObjectTypeEnumzObject type names.)CPLAssetByAssetDateWithoutHiddenOrDeleted"CPLAssetBurstStackAssetByAssetDateCPLAssetDeletedByExpungedDatez(CPLAssetInSmartAlbumByAssetDate:FavoriteCPLAssetHiddenByAssetDatez$CPLAssetInSmartAlbumByAssetDate:Livez(CPLAssetInSmartAlbumByAssetDate:Panoramaz*CPLAssetInSmartAlbumByAssetDate:Screenshotz%CPLAssetInSmartAlbumByAssetDate:Slomoz)CPLAssetInSmartAlbumByAssetDate:Timelapsez%CPLAssetInSmartAlbumByAssetDate:Video)CPLContainerRelationNotDeletedByAssetDateN)r*   r+   r,   r-   ALLBURSTrh   FAVORITErR   rS   PANORAMA
SCREENSHOTSLOMO	TIMELAPSEVIDEOrj   rD   r)   r(   rm   rm   e   sP        
5C0E-G9H(F1D9H=J3E;I3E;IIIr)   rm   PrimarySyncREGULAR_CUSTOM_ZONE)zoneNamezoneTypePRIMARY_ZONEc                       e Zd ZdZdded         dz  ddfdZdefdZdeez  ddfd	Z	de
d         fd
ZdedefdZdeded         fdZ	 ddeddddfdZddZdeddfdZdS )AlbumContainerzf
    Container for photo albums.
    This provides a way to access all the albums in the library.
    NalbumsBasePhotoAlbumr    c                     |d |D             | _         ni | _         t          | j                                                   | _        d S )Nc                     i | ]
}|j         |S rD   )id).0r   s     r(   
<dictcomp>z+AlbumContainer.__init__.<locals>.<dictcomp>   s)     9 9 9$)%9 9 9r)   )_albumsr7   keys_index)r%   r   s     r(   r$   zAlbumContainer.__init__   sT    9 9-39 9 9DLL DL!%dl&7&7&9&9!:!:r)   c                 *    t          | j                  S r"   )lenr   r%   s    r(   __len__zAlbumContainer.__len__   s    4<   r)   keyc                     t          |t                    r| j        | j        |                  S || j        v r| j        |         S |                     |          }||S t          d|           )z#Returns the album for the given id.NzPhoto album does not exist: )r6   intr   r   findKeyError)r%   r   r   s      r(   __getitem__zAlbumContainer.__getitem__   ss    c3 	2<C 011$,<$$'+yy~~L;c;;<<<r)   c                 N    t          | j                                                  S r"   )iterr   valuesr   s    r(   __iter__zAlbumContainer.__iter__   s    DL''))***r)   namec                 0    |                      |          duS )z+Checks if an album exists in the container.N)r   )r%   r   s     r(   __contains__zAlbumContainer.__contains__   s    yyd**r)   c                 \    | j                                         D ]}||j        k    r|c S dS )z2Finds an album by name, returns None if not found.N)r   r   fullname)r%   r   r   s      r(   r   zAlbumContainer.find   s?    \((** 	 	Eu~%% &tr)   defaultzBasePhotoAlbum | Nonec                 8    | j                             ||          S )z=Returns the album for the given key, or default if not found.)r   r5   )r%   r   r   s      r(   r5   zAlbumContainer.get   s     |W---r)   r   c                 z    || j         |j        <   t          | j                                                   | _        dS )z"Appends an album to the container.N)r   r   r7   r   r   )r%   r   s     r(   r9   zAlbumContainer.append   s1    !&UX!%dl&7&7&9&9!:!:r)   idxc                     |dk     s|t          | j                  k    rt          d          | j        | j        |                  S )z%Returns the album at the given index.r   zPhoto album index out of range)r   r   
IndexErrorr   )r%   r   s     r(   indexzAlbumContainer.index   sB    77cS----=>>>|DK,--r)   r"   )r   r   r    N)r*   r+   r,   r-   r7   r$   r   r   strr   r   r   boolr   r   r   r5   r9   r   rD   r)   r(   r   r   }   sk        
; ;t$45< ; ; ; ; ;! ! ! ! !	=sSy 	=-= 	= 	= 	= 	=+(#34 + + + ++ + + + + + *:!;     <@. ..!8.	 . . . .; ; ; ;
. .!1 . . . . . .r)   r   c            	          e Zd ZdZ	 dddded         dee         ddfd	Zede	fd
            Z
ede	fd            Zdeeeeeef                  f         deeeeeef         f         eeeef                  f         fdZdS )BasePhotoLibraryzrRepresents a library in the user's photos.

    This provides access to all the albums as well as the photos.
    NservicePhotosService
asset_type
PhotoAsset
upload_urlr    c                 >    || _         || _        d | _        || _        d S r"   )r   r   r   _upload_url)r%   r   r   r   s       r(   r$   zBasePhotoLibrary.__init__   s'     '.,615*4r)   c                     t           zReturns the photo albums.NotImplementedErrorr   s    r(   _get_albumszBasePhotoLibrary._get_albums   
     "!r)   c                 P    | j         |                                 | _         | j         S r   )r   r   r   s    r(   r   zBasePhotoLibrary.albums   s'     <++--DL|r)   responsec                    i }g }|                     dg           }t          |t                    s||fS |D ]+}t          |t                    s|                     d          }|dk    r|                     di           }t          |t                    s`|                     di           }t          |t                    s|                     di           }	t          |	t                    s|	                     d          }
t          |
t                    r|||
<   |dk    r=t          |                     d          t                    r|                    |           -||fS )	zParses the asset response.r3   
recordTypeCPLAssetfields	masterRefvalue
recordName	CPLMaster)r5   r6   r7   r8   r   r9   )r%   r   asset_recordsmaster_recordsr3   recrecord_typer   
master_refmaster_value	master_ids              r(   parse_asset_responsez%BasePhotoLibrary.parse_asset_response   sm    46/1,,y"--'4(( 	3!>22 	+ 	+Cc4(( '',//Kj((2..!&$// #ZZR88
!*d33 )~~gr::!,55 (,,\::	i-- 3/2M),++
377<;P;PRU0V0V+%%c***~..r)   r"   )r*   r+   r,   r-   typer   r   r$   r   r   r   propertyr   r8   r7   r
   tupler   rD   r)   r(   r   r      s         %)		5 	5 	5 &	5 SM		5
 
	5 	5 	5 	5 "^ " " " ^"     X/S$tCH~"667/	tCc3h'($tCH~*>>	?/ / / / / /r)   r   c                       e Zd ZU dZej        ej        ej	        e
j        ddej        ej        ej        e
j        dddddd	gdej        ej        ej        e
j        dddd
dd	gdej        ej        ej        e
j        dddddd	gdej        ej        ej        e
j        ddej        ej        ej        e
j        dddddd	gdej        ej        ej        e
j        dddddd	gdej        ej        ej        e
j        dddddd	gdej        ej        ej        e
j        dddddd	gdej        ej        ej        e
j        ddej         ej         ej         e
j        ddiZ!e"ee"e#e$f         f         e%d<   	 d$ddde"e#e#f         de&e#         ddf fdZ'd$de&e#         de(e"e#e$f                  fdZ)de"e#e$f         de&d         fdZ*de+fdZ,e-j.        fde#de-de&d         fdZ/d e#de&d!         fd"Z0e1d%d#            Z2 xZ3S )&PhotoLibraryz.Represents the user's primary photo libraries.N)obj_type	list_type	directionquery_filter
smartAlbumEQUALSSTRINGry   r   r   	fieldName
comparator
fieldValuerz   rx   ru   rv   rw   rS   SMART_ALBUMSr   r   zone_idr   r    c                 .   t                                          |t          |           || _        | j        j         dt          | j        j                   | _        | j        j	        
                    | j        ddi| j        dt          t          i          }|                                }|                    d          }d }t          |t                     r|r|d         }t          |t"                    rk|                    d	i           }	t          |	t"                    r@|	                    d
i           }
t          |
t"                    r|
                    d          }|dk    r)t$                              d           t)          d          d S )Nr   r   z/records/query?r   CheckIndexingStatequeryzoneIDurljsonheadersr3   r   r   stater   FINISHEDz*iCloud Photo Library not finished indexingzNiCloud Photo Library not finished indexing. Please try again in a few minutes.)r#   r$   r   r   r   service_endpointr   paramsr   sessionpostr   r   r   r5   r6   r7   r8   r   debugr   )r%   r   r   r   requestr   r3   indexing_statefirst_recordr   r   r'   s              r(   r$   zPhotoLibrary.__init__j  s    	ZJOOO'. |, ? ?'(;<<? ? 	 !L055 !"6 ,	  "#45 6 	
 	
 $+<<>>,,y))gt$$ 	< 	<"1:L,-- <%))(B77fd++ <"JJw33E!%.. <).7););Z''MMFGGG65   ('r)   	parent_idc                    ddi| j         d}|rdd|dddg|d	         d
<   | j        j                            | j        |t
          t          i          }|                                }|d         }d|v rq|d         |d<   | j        j                            | j        |t
          t          i          }|                                }|                    |d                    d|v q|	                                D ]s}|d         
                    d          rV|d         d         d         t          j        j        k    r/|                    |                     |d                              t|S )zFetches records.r   CPLAlbumByPositionLiver   parentIdr   r   )r   r   r   r   filterByr   r3   continuationMarkerr   	albumTyper   r   )r   )r   r   r   r   r   r   r   r   extendcopyr5   r>   rB   r   _fetch_records)r%   r   r   r   r   r3   r;   s          r(   r   zPhotoLibrary._fetch_records  s    6 l	!
 !
  
	 ","*!* (# # 	*E'N:& !L055!#45 6 
 

 5<LLNN(0(;"h..*23G*HE&' $ 4 9 9H%'89 !: ! !G
 ||~~HNN8I./// #h.. llnn 	T 	TFx $$[11T8$[1':m>R>XXXt22VL=Q2RRSSSr)   r;   
PhotoAlbumc                    d|d         vs/|d                              d          r|d         d         d         rdS |d         }t          j        |d         d         d                                       d          }dd	d
|ddg}|d                              di                                d          }t          }|d                              d          r.|d         d         d         t
          j        j        k    rt          }t          j
        }|d                              di                                dd          dk    rt          j        }|d                              di                                dd          } || ||t          j        t          j        || j        ||                     d| j                  ||d         |          S )z#Converts a record to a photo album.albumNameEncr   	isDeletedr   Nr   utf-8r   r   r   r   r   r   sortAscending   recordModificationDater   recordChangeTag)libraryr   	record_idr   r   r   r   r   r   r   record_change_tagrecord_modification_date)r5   base64	b64decodedecoder   r>   rB   r   PhotoAlbumFolderr[   r\   r]   r_   rj   rm   r   r   )	r%   r;   r  
album_namer   r   
album_typer   r  s	            r(   _convert_record_to_albumz%PhotoLibrary._convert_record_to_album  s    &"222x $$[11 3 8$[1': 3 4-	 *8^,W5
 

&// 	 (&'/)DD .
 $*(#3#7#7
B#G#G#K#KG#T#T	'1
 8  --	*x -g6-:N:TTT)J#0#:	(4488!DDII%0I 8  !92>>BB7DQQ 	! z",#-%JJx66$%67%=
 
 
 	
r)   c                      t           fd j                                        D                       }                                 D ].}                     |          }||                    |           /|S )zReturns photo albums.c           
      L    g | ] \  }}t          d|j        j        d |!S ))r  r   r   r   rD   )SmartPhotoAlbumr   r   )r   r   propsr%   s      r(   
<listcomp>z,PhotoLibrary._get_albums.<locals>.<listcomp>  s]     	 	 	 "T5     L	 
  	 	 	r)   )r   r   itemsr   r  r9   )r%   r   r;   r   s   `   r(   r   zPhotoLibrary._get_albums   s    	 	 	 	 &*%6%<%<%>%>	 	 	
 
 ))++ 	% 	%F'+'D'DV'L'LE e$$$r)   r   r  c           	         dddt          j        |                    d                                        d          id|j        iddiddiddiddiddd	g| j        d
d}| j        j        }t          | j        j	                  }| d| }	 | j        j
                            ||t          t          i          }|                                }|                    dg           }	|	sdS n=# t           $ r0}
t"                              d|
           t'          d          |
d}
~
ww xY w|                     |	d                   S )z2Creates a new album, returns the request response.createCPLAlbumr   r   r   r   )r   r   r   
isExpungedsortTyper   )r   r   operationTyper;   T
operationsr   atomic/records/modify?r   r   r3   NzFailed to create album: %szFailed to create album)r  	b64encodeencoder	  r   r   r   r   r   r   r   r   r   r   r   r5   r   r   errorr   r  )r%   r   r  dataendpointr   r   respr0   r3   exs              r(   create_albumzPhotoLibrary.create_album  s    &.&0 !()9$++g:N:N)O)O)V)V$+*" *"- !()9* !(* !(+ !() !(.%# #  < lA! 
 ! 
F 5 3448888	K!\166%'89 7  D '+iikkG,3KK	2,F,FG t+ 	K 	K 	KMM6;;;()ABBJ	K ,,WQZ888s   AC- -
D'7+D""D'pathr   c                    | j         s5t                              d| j                            d                     dS t
          j                            |          }| j        j	        
                                }||d<   | j          dt          |           }t          |d          5 }| j        j                            ||          }ddd           n# 1 swxY w Y   |                                }d|v rt!          d	|d                   d
 |d         D             }d|vsd|vrdS |                     | j        |d         |d                   S )z.Upload a photo from path, returns a recordNamez5Uploads are not supported for photo library zone '%s'r}   Nfilenamez/upload?rb)r   r#  r2    c                      i | ]}|d          |S )r   rD   )r   r   s     r(   r   z,PhotoLibrary.upload_file.<locals>.<dictcomp>m  s,     .
 .
 .
'*Cs.
 .
 .
r)   r3   r   r   )r   r   r"  r   r5   osr(  basenamer   r   r   r   openr   r   r   r   r   )	r%   r(  r*  r   r   file_objr   json_responser3   s	            r(   upload_filezPhotoLibrary.upload_fileR  s     	MMG  ,,   4((..!%!4!9!9!;!;%z&CC	&0A0ACC$ 	!%!5!:!: "; " "H	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 )1}$$.r=3JKKK.
 .
.;I.F.
 .
 .
 g%%7)B)B4t|W[-A7:CVWWWs   ("CCCc                 V    t          t          | j        t          j                           S )zReturns the All Photos album.)r   r   r   rF   rO   r   s    r(   allzPhotoLibrary.allv  s     JN,E FGGGr)   r"   r    r   )4r*   r+   r,   r-   rF   rO   rm   rs   r_   rg   r[   r]   rX   ry   rC   r\   rY   rz   rW   rx   rP   rt   ri   rQ   ru   rT   rv   rV   rw   rS   rU   rh   rR   r   r8   r   r
   __annotations__r   r$   r7   r   r  r   r   r>   rA   r'  r3  r   r5  r.   r/   s   @r(   r   r      sU        88 	!&*%-&1 	$
 $
 	!&0%1&0 "."*+3k"J"J 	$
 $
 	&,%1&0 "."*+3g"F"F 	 
  
 	&,%1&0 "."*+3g"F"F 	 
  
 	&,%+&0 	 
  
 	 &/%1&0 "."*+3j"I"I 	#
 #
 	 &/%1&0 "."*+3j"I"I 	#
 #
 	"&1%1&0 "."*+3l"K"K 	%
 %
 	&+%1&0 "."*+3f"E"E 	
 
 	'&.%-&0 	*
 *
 	&-%,&0 	 
  
Om:L$~tCH~56 m m mf %)	' ' ' c3h' SM	'
 
' ' ' ' ' 'R/ / /d3PS8nAU / / / /b:
38n:
	,	:
 :
 :
 :
x^    . 6C5H:9 :9:9%2:9	,	:9 :9 :9 :9x"X "X(> "X "X "X "XH H H H XH H H H Hr)   r   c                   <     e Zd ZdZdddeddf fdZdefdZ xZS )	PhotoStreamLibraryz"Represents a shared photo library.r   r   shared_streams_urlr    Nc                 h    t                                          |t          d            || _        d S )Nr   )r#   r$   PhotoStreamAssetr:  )r%   r   r:  r'   s      r(   r$   zPhotoStreamLibrary.__init__  s3    
 	-=$OOO'9r)   c                 2   t                      }| j         dt          | j        j                   }| j        j                            |i t          t          i          }|	                                }|d         D ]}t          | |d         d         |d         |d         |d         |d	         |d         d
         |d         |d         d         |d         d         |d         |                    dd                    }|                    |           |S )zReturns albums.?r  r   
attributesr   albumlocation	albumctag	albumguid	ownerdsidcreationDatesharingtypeallowcontributionsispubliciswebuploadsupported	publicurlN)r  r   album_location
album_ctag
album_guid
owner_dsidcreation_datesharing_typeallow_contributions	is_publicis_web_upload_supported
public_url)r   r:  r   r   r   r   r   r   r   r   SharedPhotoStreamAlbumr5   r9   )r%   r   r   r   r   r   shared_streams          r(   r   zPhotoStreamLibrary._get_albums  s)   !/!1!1-PP	$,:M0N0NPP L055b<1B"C 6 
 
 %,LLNNh' 	) 	)E2<(0$_5 - - -#L1.A"=1$),$78L$M-j9(-.D(E 99[$77  M MM-((((r)   )	r*   r+   r,   r-   r   r$   r   r   r.   r/   s   @r(   r9  r9  |  sz        ,,: :  : 
	: : : : : :^        r)   r9  c                       e Zd ZdZdededeeef         dededdfd	Zde	fd
Z
edeeef         fd            Zedd            Zedefd            Zedefd            Zej        fdededed         fdZdS )r   z_The 'Photos' iCloud service.

    This also acts as a way to access the user's primary library.service_rootr   r   r   r:  r    Nc                    t          j        | |||           | j         d| _        || _        d | _        | j                            ddd           i | _        d | _	        t          | | d| j        d          d          | _        d S )	N)rW  r   r   z5/database/1/com.apple.photos.cloud/production/privateT)
remapEnumsgetCurrentSyncToken/dsidz/sharedstreams/webgetalbumslist)r:  )r   r$   rW  r   r   
_librariesr   update_photo_assets_root_libraryr9  _shared_library)r%   rW  r   r   r   r:  s         r(   r$   zPhotosService.__init__  s     	%		
 	
 	
 	
  WWW 	 !+AE$tLLMMM#%593E% 2 2F(; 2 2 24
 4
 4
r)   c                 `    | j         !t          | t          | j                  | _         | j         S )zCBuild the primary library lazily so shared-only callers still work.Nr   )r`  r   r   r   r   s    r(   _get_root_libraryzPhotosService._get_root_library  s;     %!-+" " "D
 !!r)   c                    | j         s| j         d}| j                            || j        dt
          t          i          }|                                }|d         }|                                 | j	        d}|D ]E}|
                    d          s.|d         d         }t          | |d         | j        	          ||<   F|| _         | j         S )
zReturns photo libraries.z/changes/databasez{})r   r#  r   zones)rootshareddeletedr   r}   rc  )r]  r   r   r   r   r   r   r   rd  ra  r5   r   r   )r%   r   r   r   rf  	librarieszone	zone_names           r(   rj  zPhotosService.libraries  s      	(/BBBC $ 1 1{%'89	 !2 ! !G (/||~~H*27*;E ..00.6 6I   xx	** %)(^J%?I+7d8n9I, , ,Ii( (DOr)   r   c                 4    |                                  j        S )z"Returns the primary photo library.)rd  r5  r   s    r(   r5  zPhotosService.all  s     %%''++r)   c                 4    |                                  j        S )z"Returns the standard photo albums.)rd  r   r   s    r(   r   zPhotosService.albums  s     %%''..r)   c                     | j         j        S )z Returns the shared photo albums.)ra  r   r   s    r(   shared_streamszPhotosService.shared_streams  s     #**r)   r   r  c                 R    |                                                      ||          S )z1Creates a new album in the primary photo library.)rd  r'  )r%   r   r  s      r(   r'  zPhotosService.create_album  s&     %%''44T:FFFr)   r6  )r*   r+   r,   r-   r   r   r8   r
   r$   r   rd  r   r   rj  r5  r   r   rp  r>   rA   r   r'  rD   r)   r(   r   r     s{       E E 
 
 ! 
 S#X	 

  
   
 
 
  
  
  
D	"< 	" 	" 	" 	" 4%5 56    X: , , , X, / / / / X/ + + + + X+
 6C5HG GG%2G	,	G G G G G Gr)   r   c                      e Zd ZdZdej        fdededede	dedd	fd
Z
eedefd                        Zede	fd            Zedefd            Zde	dede	ded         fdZdeddfdZdeeeeeef                  f         ded         fdZd-dZedefd            Zedefd            Zej        dedd	fd            Zdedd	fdZdefdZeded         fd            Zeedefd                        Z ede	de	dedeeef         fd             Z!ededeeef         fd!            Z"edefd"            Z#ede	fd#            Z$ded         fd$Z%de	fd%Z&defd&Z'defd'Z(d(edd)fd*Z)d(e	ez  ddfd+Z*d(edefd,Z+d	S ).r   zAn abstract photo album.d   r  r   r   	page_sizer   r    Nc                 Z    || _         || _        || _        || _        || _        d | _        d S r"   )_name_library
_page_size
_direction
_list_type_len)r%   r  r   r   rt  r   s         r(   r$   zBasePhotoAlbum.__init__  s2     
*1()2(1#'			r)   c                     t           z.Gets the full name of the album including pathr   r   s    r(   r   zBasePhotoAlbum.fullname  
     "!r)   c                 *    | j         dk     r| j         ndS )zGets the page size.rs  )rx  r   s    r(   rt  zBasePhotoAlbum.page_size   s     #'/C"7"7tS@r)   c                     | j         j        S )zGet the Photo service)rw  r   r   s    r(   r   zBasePhotoAlbum.service%  s     }$$r)   r   )r   NNc                 &   t          d|          }| j        j                            |                                 |                     ||dz  |          t          t          i          }|                                }| 	                    |          S )Nr      )offsetrt  r   r   )
maxr   r   r   _get_url_get_payloadr   r   r   _process_photo_list_response)r%   r   r   rt  r  r   r2  s          r(   _get_photos_atzBasePhotoAlbum._get_photos_at*  s     !Umm!\166""##	 #   "#45 7 	
 	
 :B00???r)   photo_idr   c                 B   | j         j                            |                                 |                     |          t
          t          i          }|                                }|                     |          D ]}|j	        |k    r|c S t          d|           )zReturns a photo by id.r   Photo does not exist: )r   r   r   r  _get_photo_payloadr   r   r   r  r   r   )r%   r  r   r2  r   s        r(   
_get_photozBasePhotoAlbum._get_photo<  s    !\166((22!#45 7 
 

 :B66}EE 	 	Ex8## $:::;;;r)   r   c              #   
  K   | j                             |          \  }}|D ]`}|d         }|                    |          }|st                              d|           =| j                             | j        ||          V  ad S )Nr   z+No asset record found for master record: %s)rw  r   r5   r   r   r   r   )r%   r   r   r   master_recordrecord_nameasset_records          r(   r  z+BasePhotoAlbum._process_photo_list_responseI  s      
 )-(J(J4(P(P%~+ 	V 	VM,\:K(,,[99L A;   -**4<UUUUUU	V 	Vr)   c                 T    t          |                     || j        d                    S )z#Returns a photo at the given index.r   )nextr  ry  )r%   r   s     r(   r   zBasePhotoAlbum.photoY  s$    D''tBBCCCr)   c                     | j         S )zGets the album title.r   r   s    r(   titlezBasePhotoAlbum.title]       yr)   c                     | j         S )zGets the album name.)rv  r   s    r(   r   zBasePhotoAlbum.nameb  s     zr)   r   c                 J    | j         |k    r|                     |           dS dS )zSets the album name.N)rv  renamer%   r   s     r(   r   zBasePhotoAlbum.nameg  s1     :KK r)   c                      t          d          )Renames the album.zAlbum name is read-onlyr   r  s     r(   r  zBasePhotoAlbum.renamem  s    !";<<<r)   c                      t          d          )Deletes the album.zAlbum delete is not implementedr   r   s    r(   deletezBasePhotoAlbum.deleteq  s    !"CDDDr)   c              #     K   d| _         | j        t          j        k    rt	          |           dz
  }nd}t                      }	 d}|                     || j        | j                  D ]O}|dz  }|j        |v r!t          
                    d|j                   1|                    |j                   |V  P|| j        k     rt          
                    d|           || j        dz  k     rdS | j        t          j        k    r||z
  }n||z   })zReturns the album photos.Nr   r   Tz#Duplicate photo found: %s, skippingz Less than page size returned: %dr  )r{  ry  r[   r]   r   setr  rt  r   r   r   add)r%   r  
photos_idsnum_resultsr   s        r(   photoszBasePhotoAlbum.photosu  s!      	?m666d))a-FFF"uu
	.K,,VT_dnUU  q 8z))MM"GRRRux(((T^++@+NNNdn111-":::+-+-%	.r)   c                     t           zGets the album id.r   r   s    r(   r   zBasePhotoAlbum.id  r~  r)   r  c                     t           )z/Returns the payload for the photo list request.r   r%   r  rt  r   s       r(   r  zBasePhotoAlbum._get_payload  s
    
 "!r)   c                     t           )z1Returns the payload for the photo record request.r   r%   r  s     r(   r  z!BasePhotoAlbum._get_photo_payload  r   r)   c                     t           )z+Returns the URL for the photo list request.r   r   s    r(   r  zBasePhotoAlbum._get_url  r   r)   c                     t           )z*Returns the number of photos in the album.r   r   s    r(   _get_lenzBasePhotoAlbum._get_len  r   r)   c                     | j         S r"   )r  r   s    r(   r   zBasePhotoAlbum.__iter__  s
    {r)   c                 P    | j         |                                 | _         | j         S r"   )r{  r  r   s    r(   r   zBasePhotoAlbum.__len__  s!    9DIyr)   c                     | j         S r"   )r  r   s    r(   __str__zBasePhotoAlbum.__str__  s
    zr)   c                 8    dt          |           j         d|  dS )N<z: 'z'>)r   r*   r   s    r(   __repr__zBasePhotoAlbum.__repr__  s$    34::&3343333r)   r   zPhotoAsset | Nonec                 P    	 |                      |          S # t          $ r Y dS w xY w)zGets a photo by id.N)r  r   r%   r   s     r(   r5   zBasePhotoAlbum.get  s;    	??3''' 	 	 	44	s    
%%c                    t          |t                    rt          |           }|dk     r||z   }|dk     s||k    rt          d          	 t	          |                     || j        d                    S # t          $ r}t          d          |d}~ww xY w|                     |          x}r|S t          d|           )zGets a photo by index.r   zPhoto index out of ranger   Nr  )
r6   r   r   r   r  r  ry  StopIterationr5   r   )r%   r   	album_lenexcr   s        r(   r   zBasePhotoAlbum.__getitem__  s    c3 	D		I Qww#oQww#** !;<<<FD//T_aHHIII  F F F !;<<#EF %u 555666s   (A5 5
B?BBc                 0    |                      |          duS )z,Checks if a photo exists in the album by id.N)r5   r  s     r(   r   zBasePhotoAlbum.__contains__  s    xx}}D((r)   )r    r   ),r*   r+   r,   r-   r[   r\   r   r   r_   r   r$   r   r   r   rt  r   r   r   r  r  r8   r7   r
   r  r   r  r   setterr  r   r  r  r   r  r  r  r  r   r   r  r  r5   r   r   rD   r)   r(   r   r     s       "" #0#:( (!( (  	(
 ( !( 
( ( ( ( "# " " " ^ X" A3 A A A XA % % % % X%@@%2@?B@	+	,@ @ @ @$<3 << < < < <Vd4S>223V	+	,V V V V D D D D s    X c    X 
[# $    [
=C =D = = = =E E E E E .	":; . . . X.< "C " " " ^ X" ""&)"6C"	c3h" " " ^" "3 "4S> " " " ^" "# " " " ^" "# " " " ^")$<=        
    4# 4 4 4 4s 2    7sSy 7\ 7 7 7 7*) ) ) ) ) ) ) )r)   r   c                       e Zd ZdZ	 	 	 	 	 	 d%dededededed	ed
ede	e
eeef                           de	eeef                  dede	e         de	e         de	e         ddf fdZedefd            Zedefd            ZdeddfdZdefdZdddefdZde	d         fdZedefd            ZdefdZdefdZdeded	edeeef         fd Zd!edeeef         fd"Z	 d&deded	ed#edeeef         f
d$Z xZS )'r   zA photo album.Nrs  r  r   r  r   r   r   r   r   r   rt  r   r  r  r    c                     t                                          ||||
|           || _        || _        || _        || _        || _        || _        || _        |	r	|	| _	        d S t          | _	        d S )N)r  r   r   rt  r   )r#   r$   
_record_id	_obj_type_query_filter_url
_parent_id_record_change_tag_record_modification_date_zone_idr   )r%   r  r   r  r   r   r   r   r   r   rt  r   r  r  r'   s                 r(   r$   zPhotoAlbum.__init__  s      	 	 	
 	
 	
  ))1=I	)21B8P& 	),3DMMM(DMMMr)   c                     | j         S r  )r  r   s    r(   r   zPhotoAlbum.id       r)   c                    | j         g}| j        h}| j        }|||v r!t                              d| j                   nd|                    |           | j        j                            |          }|n-|	                    |j                    t          |dd           }|d                    t          |                    S )Nz+Cycle detected in album parent chain for %sr  r[  )r   r   r  r   warningr  rw  r   r5   r9   getattrjoinreversed)r%   partsvisitedr   parents        r(   r   zPhotoAlbum.fullname  s     I;!WIO	#G## MtwWWWKK	"""])--i88F~LL%%%d;;I # xx(((r)   r   c                    | j         |k    rdS d| j        d| j        d| j        ddt	          j        |                    d                                        d          iidd	gd
}| j        j	         dt          | j        j                   }| j        j                            ||t          t          i          }|                                }t#          |          }|st%          d|           |d         }t'          |t(                    rj|                    d| j                  | _        |                    di           }|                    di                               d| j                  | _        || _         dS )r  NTr^  r  r   r   r   r   r   r  r   r  r  r   r  r  r  zFailed to rename albumr   r   r  r   r  )rv  r  r  r  r  r   r!  r	  r   r   r   r   r   r   r   r   r   r<   r   r6   r8   r5   r  )	r%   r   r#  r   r   r0   r3   latestr   s	            r(   r  zPhotoAlbum.rename  s   :F m &.&*o&0+/+B* ')9%,,w:O:O)P)P)W)W$+*" *"-#	   
  
, |, 1 1$,-..1 1 	
 "\166!#45 7 
 

 #+--//'00 	O()ANNNN!(fd## 	;&,jj!4#:' 'D# &,ZZ"%=%=F-3ZZ(". .c'49:: * 


r)   c           	         d| j         d| j        | j        ddddiiddgd	}| j        j         d
t          | j        j                   }	 | j        j                            ||t          t          i          }|                                }t          |          }|sdS |d         }t          |t                    rh|                    d| j                  | _        |                    di                               di                               d| j                  | _        n?# t"          $ r2}t$                              d|           t)          d|           |d}~ww xY wdS )r  Tr^  r  r   r   r   )r   r  r   r   r  r  r  r  Fr   r  r   r  z%Failed to delete photo from album: %sz!Failed to delete photo from albumr  N)r  r  r  r   r   r   r   r   r   r   r   r   r<   r6   r8   r5   r  r   r   r"  r   )r%   r#  r   r   r0   r3   r  r&  s           r(   r  zPhotoAlbum.deleteQ  s    m &.&*o+/+B&0''1#	 
 
 
  
$ |, 1 1$,-..1 1 	
	!%!5!:!:%'89 "; " "H
 '/mmooG+G44G u%,QZF&$'' *0**%t'>+ +' JJx,,S1266S$"@AA .
 , 	 	 	MMA2FFF(34  	 ts    AD' !BD' '
E#1-EE#r   r   c                 "   d| j         dd|j        iddid| j        idd|j         d| j         dd	gd
}| j        j         dt          | j        j                   }	 | j        j                            ||t          t          i          }|                                }t          |          }|sdS |D ]}|                    d          dk    s|                    d          | j        k    rj|                    d| j                  | _        |                    di                               di                               d| j                  | _         nn3# t           $ r&}t"                              d|           Y d}~dS d}~ww xY wdS )z$Adds an existing photo to the album.Tr  r   i   )itemIdpositioncontainerIdCPLContainerRelationz-IN-)r   r   r   r  r  r  r  Fr   r  r   r  r   r  z Failed to add photo to album: %sN)r  r   r  r   r   r   r   r   r   r   r   r   r<   r5   r  r  r   r   r"  )	r%   r   r#  r   r   r0   r3   r;   r&  s	            r(   	add_photozPhotoAlbum.add_photo  s    m &. (/&9)0$,3T_+E# #
 '=).&H&Ht&H&H   
  
& |, 1 1$,-..1 1 	
	!%!5!:!:%'89 "; " "H '/mmooG+G44G u!  JJ|,,
::zz,//4?BB.4jj)4+B/ /D+ 

8R005r::Wd&DEE 2
 E C , 	 	 	MM<bAAA55555	 ts     AE 5B&E 
F&FFc                     t          | j        t                    sdS | j                            |          }|dS |                     |          s,t
                              d           t          d| |          |S )Uploads a photo to the album.NzFailed to add photo to album)r   r   )r6   rw  r   r3  r  r   r"  r   )r%   r(  photo_assets      r(   uploadzPhotoAlbum.upload  s    $-66 	4)-)B)B4)H)H4~~k** 	MM8999(.!    r)   c                 .    | j         j         d| j         S )zReturns the container ID.:)r  r   r  r   s    r(   _get_container_idzPhotoAlbum._get_container_id  s     .&:::::r)   c                    | j         j         dt          | j         j                   }| j         j                            |dddddd| j        gdd	d
d| j        dgit          t          i          }|
                                }	 t          |d         d         d         d         d         d         d                   S # t          t          t          t          f$ r' t                               d| j        |d           Y dS w xY w)Nz/internal/records/query/batch?batchr   HyperionIndexCountLookupindexCountIDINSTRING_LISTr   r   r   r   T)resultsLimitr   zoneWider   r  r   r3   r   	itemCountr   z+Unexpected Photos count response for %s: %r)exc_info)r   r   r   r   r   r   r  r  r   r   r   r   r   r   	TypeError
ValueErrorr   r   r%   r   r   r   s       r(   r  zPhotoAlbum._get_len  s^   |, 1 1$,-..1 1 	 !L055()*D-;.2,9.2.D-E/" /") )
" 
" %)"&- ( "#45- 6 
 
0 $+<<>>	!!$Y/28<[I'R   Hi< 	 	 	MM=&	     11	s   	8C A DDc                     | j         S r"   )r  r   s    r(   r  zPhotoAlbum._get_url  s
    yr)   r  c                 H    |                      || j        ||| j                  S r"   )_list_query_genrz  r  r  s       r(   r  zPhotoAlbum._get_payload  s0     ##O
 
 	
r)   r  c                 b    |                      d| j        t          j        dddd|ddg          S )Nr   r   r   r   r   r   r   )r  rz  r[   r\   r  s     r(   r  zPhotoAlbum._get_photo_payload  sM    ##O# "."*+3h"G"G 
 
 	
r)   r  c                     |j         ddd|j         ddddd|ddgd|g d	| j        d
}|r!|d         d                             |           |S )Nr   r   r   r   r   	startRankINT64r  )aresJPEGFullWidthresJPEGFullHeightresJPEGFullFileTyperesJPEGFullFingerprintresJPEGFullResresJPEGLargeWidthresJPEGLargeHeightresJPEGLargeFileTyperesJPEGLargeFingerprintresJPEGLargeResresJPEGMedWidthresJPEGMedHeightresJPEGMedFileTyperesJPEGMedFingerprintresJPEGMedResresJPEGThumbWidthresJPEGThumbHeightresJPEGThumbFileTyperesJPEGThumbFingerprintresJPEGThumbResresVidFullWidthresVidFullHeightresVidFullFileTyperesVidFullFingerprintresVidFullResresVidMedWidthresVidMedHeightresVidMedFileTyperesVidMedFingerprintresVidMedResresVidSmallWidthresVidSmallHeightresVidSmallFileTyperesVidSmallFingerprintresVidSmallResresSidecarWidthresSidecarHeightresSidecarFileTyperesSidecarFingerprintresSidecarResitemTypedataClassTypefilenameEncoriginalOrientationresOriginalWidthresOriginalHeightresOriginalFileTyperesOriginalFingerprintresOriginalResresOriginalAltWidthresOriginalAltHeightresOriginalAltFileTyperesOriginalAltFingerprintresOriginalAltResresOriginalVidComplWidthresOriginalVidComplHeightresOriginalVidComplFileTyperesOriginalVidComplFingerprintresOriginalVidComplResr   r  dateExpungedremappedRefr   r   r  r   adjustmentRenderType	assetDate	addedDate
isFavoriteisHiddenorientationdurationassetSubtypeassetSubtypeV2assetHDRType
burstFlagsburstFlagsExtburstId
captionEnclocationEnclocationV2EnclocationLatitudelocationLongitudeadjustmentTypetimeZoneOffsetvidComplDurValuevidComplDurScalevidComplDispValuevidComplDispScalevidComplVisibilityStatecustomRenderedValuer  r  r  
isKeyAsset)r   r  desiredKeysr   r   r   )r   r  r   )r%   r  r   r   r  r   r   s          r(   r  zPhotoAlbum._list_query_gen  s     (o &1&./7)/&R&R  &1&./6&H&H   (b b bF miu!
 u!
n  	<'N:&--l;;;r)   )NNrs  NNNr"   )r*   r+   r,   r-   r   r   rm   r_   r[   r   r7   r8   r
   r   r$   r   r   r   r  r   r  r  r  r  r  r  r  r  r  r.   r/   s   @r(   r   r     s
        8<,0#'+/26#) #)#) #) 	#)
 !#)  #) !#) #) tDcN34#) $sCx.)#) #) C=#) $C=#) #+3-#) 
#) #) #) #) #) #)J C    X )# ) ) ) X) 2C 2D 2 2 2 2h2 2 2 2 2h7| 7 7 7 7 7rh|4    & ;3 ; ; ; X;*# * * * *X#    	
	
&)	
6C	
	c3h	
 	
 	
 	

3 
4S> 
 
 
 
* B BB  B !	B
 B 
c3hB B B B B B B Br)   r   c                   *    e Zd ZdZded         fdZdS )r
  zA Photo Album Folder.r    r   c                     dS r  NrD   r%   r(  s     r(   r  zPhotoAlbumFolder.upload  	     tr)   N)r*   r+   r,   r-   r   r  rD   r)   r(   r
  r
    s:        h|4      r)   r
  c                       e Zd ZdZ	 	 	 	 ddededededed	e	d
e
eee	ef                           de
ee	e	f                  dede
e	         ddf fdZede	fd            Zde
d         fdZede	fd            Zede	fd            Z xZS )r  zA Smart Photo Album.Nrs  r  r   r   r   r   r   r   r   rt  r   r    c                 t    t                                          ||j        |j        |||||||	|
           d S )N)r  r   r  r   r   r   r   r   r   rt  r   )r#   r$   r   )r%   r  r   r   r   r   r   r   r   rt  r   r'   s              r(   r$   zSmartPhotoAlbum.__init__  sU     	j% 	 	
 	
 	
 	
 	
r)   c                     | j         S r  r  r   s    r(   r   zSmartPhotoAlbum.id  r  r)   r   c                     dS rV  rD   rW  s     r(   r  zSmartPhotoAlbum.upload  rX  r)   c                     | j         S r}  r  r   s    r(   r   zSmartPhotoAlbum.fullname  r  r)   c                     | j         j         S )zGets the container ID.)r  r   r   s    r(   r  z!SmartPhotoAlbum._get_container_id  s     .&((r)   )NNrs  N)r*   r+   r,   r-   r   rF   rm   r_   r[   r   r   r7   r8   r
   r   r$   r   r   r  r   r  r.   r/   s   @r(   r  r    sz        8<,0#'
 

 
 !	

  
 !
 
 tDcN34
 $sCx.)
 
 C=
 

 
 
 
 
 
6 C    Xh|4    
 #    X )3 ) ) ) X) ) ) ) )r)   r  c                       e Zd ZdZ	 	 	 	 	 	 d(dededed	ed
edededededededee         deddf fdZ	e
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
dee         fd            Zdedededeeef         fdZdedeeef         fd Zdedd!fd"Zdefd#Zdefd$Zdefd%Zd&eddfd'Z xZS ))rT  zA Shared Stream Photo Album.ownedFNrs  r  r   rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rt  r    c                    t                                          ||t          j        |           || _        || _        || _        || _        	 t          j	        t          |          dz  t          j                  | _        nA# t          t          t           f$ r' t          j	        dt          j                  | _        Y nw xY w|| _        |	| _        |
| _        || _        || _        d S )N)r  r   r   rt       @@r   )r#   r$   r_   rk   _album_location_album_ctag_album_guid_owner_dsidr   fromtimestampr   r   utcrN  r  r  OverflowError_sharing_type_allow_contributions
_is_public_is_web_upload_supported_public_url)r%   r  r   rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rt  r'   s                 r(   r$   zSharedPhotoStreamAlbum.__init__  s      	"0	 	 	
 	
 	
 %3 * * *	I+3+AM""V+X\, ,D :}5 	I 	I 	I!)!78<!H!HD	I #/*=! ).E%*4s   4B ;C Cc                     | j         S r  )re  r   s    r(   r   zSharedPhotoStreamAlbum.id       r)   c                     | j         S r"   r  r   s    r(   r   zSharedPhotoStreamAlbum.fullname  s
    yr)   c                     | j         S )zGets the sharing type.)rj  r   s    r(   rO  z#SharedPhotoStreamAlbum.sharing_type  s     !!r)   c                     | j         S )z"Gets if contributions are allowed.)rk  r   s    r(   rP  z*SharedPhotoStreamAlbum.allow_contributions  s     ((r)   c                     | j         S )zGets if the album is public.)rl  r   s    r(   rQ  z SharedPhotoStreamAlbum.is_public  r  r)   c                     | j         S )z"Gets if web uploads are supported.)rm  r   s    r(   rR  z.SharedPhotoStreamAlbum.is_web_upload_supported$  s     ,,r)   c                     | j         S )zGets the public URL.)rn  r   s    r(   rS  z!SharedPhotoStreamAlbum.public_url)  rp  r)   r  r   c                 ^    | j         | j        t          ||z             t          |          dS )N)rB  rA  limitr  )re  rd  r   r  s       r(   r  z#SharedPhotoStreamAlbum._get_payload.  s8     )))+,,&kk	
 
 	
r)   r  c                      t          d          )Nz@_get_photo_payload is not implemented for SharedPhotoStreamAlbumr   r  s     r(   r  z)SharedPhotoStreamAlbum._get_photo_payload8  s     "N
 
 	
r)   r   c                     d}	 |                      |t          j        | j                  }d}|D ]}|dz  }|j        |k    r|c S || j        k     rn||z  }St          d|           )z
        Fetch a single photo by id by paging through the shared stream.
        This avoids an upfront call to get the album size and does not
        require fetching the entire album in one request.
        r   Tr   r  )r  r[   r\   rt  r   r   )r%   r  r  pagephoto_countr   s         r(   r  z!SharedPhotoStreamAlbum._get_photo@  s     		"&&v}/FWWDK ! !q 8x'' LLL (T^++k!F		" :::;;;r)   c                 H    | j          dt          | j        j                   S )Nzwebgetassets?)rc  r   r   r   r   s    r(   r  zSharedPhotoStreamAlbum._get_urlS  s&    &UUYt|?R5S5SUUUr)   c                     | j          dt          | j        j                   }| j        j                            |d| j        it          t          i          }|	                                }|d         S )Nzwebgetassetcount?rB  r  albumassetcount)
rc  r   r   r   r   r   re  r   r   r   r  s       r(   r  zSharedPhotoStreamAlbum._get_lenV  s    #VVi@S6T6TVV 	 !L055T- "#45 6 
 
 $+<<>>)**r)   c                     dS )r  FrD   r   s    r(   r  zSharedPhotoStreamAlbum.deletee  s	     ur)   r   c                     dS )r  NrD   r  s     r(   r  zSharedPhotoStreamAlbum.renamej  rX  r)   )r`  FFFNrs  )r*   r+   r,   r-   r   r   r   r   r   r$   r   r   r   rO  rP  rQ  rR  rS  r[   r8   r
   r  r  r  r  r  r  r  r.   r/   s   @r(   rT  rT    s        && $$)(-$('5 '5!'5 '5 	'5
 '5 '5 '5 '5 '5 "'5 '5 "&'5 SM'5 '5 
'5 '5 '5 '5 '5 '5R  C       X  #    X "c " " " X" )T ) ) ) X) 4    X - - - - X-  HSM       X 

&)
6C
	c3h
 
 
 

3 
4S> 
 
 
 
<3 << < < < <&V# V V V V+# + + + +    
C D        r)   rT  c                      e Zd ZU dZdedeeef         deeef         ddfdZdddd	d
Z	eeef         e
d<   ddddd
Zeeef         e
d<   dddddddZeeef         e
d<   ddddddZeeef         e
d<   edefd            Zedefd            Zedefd            Zedefd            Zed             Zedefd             Zd2d"ed#edefd$Zedefd%            Zedefd&            Zed'             Zedefd(            Zedefd)            Zedeeeeef         f         fd*            Zd3dee         fd,Zd-edeeef         fd.Z d3dee!         fd/Z"defd0Z#defd1Z$dS )4r   zA photo.r   r  r  r    Nc                 >    || _         || _        || _        d | _        d S r"   )_service_master_record_asset_record	_versions)r%   r   r  r  s       r(   r$   zPhotoAsset.__init__s  s&     (/.;-9>Br)   imagemovie)zpublic.heiczpublic.jpegz
public.pngzcom.apple.quicktime-movie
ITEM_TYPESz.HEICz.JPGz.PNG.MOVFILE_TYPE_EXTENSIONSresOriginal
resJPEGMedresJPEGThumbresOriginalVidCompl	resVidMedresVidSmall)originalmediumthumboriginal_videomedium_videothumb_videoPHOTO_VERSION_LOOKUP)r  r  r  thumb_imagemedium_imageVIDEO_VERSION_LOOKUPc                     | j         d         S )zGets the photo id.r   r  r   s    r(   r   zPhotoAsset.id       !,//r)   c                     | j         d         S )z(Gets the master record id for the photo.r   r  r   s    r(   r   zPhotoAsset.master_id  s     "<00r)   c                     | j         d         S )z'Gets the asset record id for the photo.r   r  r   s    r(   asset_idzPhotoAsset.asset_id  r  r)   c                 ~    t          j        | j        d         d         d                                       d          S )zGets the photo file name.r   r%  r   r   )r  r  r  r	  r   s    r(   r*  zPhotoAsset.filename  s9     )-8A
 

&//	r)   c                 @    | j         d         d         d         d         S )zGets the photo size.r   r+  r   sizer  r   s    r(   r  zPhotoAsset.size  s"     "8,-=>wGOOr)   c                     | j         S )zGets the photo created date.)
asset_dater   s    r(   createdzPhotoAsset.created  r  r)   F
field_namemasterc                    	 |r| j         n| j        }|d         |         d         }t          j        |dz  t          j                  S # t          t          t          t          f$ r" t          j        dt          j                  cY S w xY w)zDRead a millisecond timestamp field from the master or asset records.r   r   rb  r   )
r  r  r   rg  r   rh  r   r  r  ri  )r%   r  r  r;   	raw_values        r(   _record_timestampzPhotoAsset._record_timestamp  s    	;,2JT((8JFx(4W=I))f*<hlKKK)Z? 	; 	; 	;)!X\:::::	;s   AA <BBc                 ,    |                      d          S )Gets the photo asset date.r9  r  r   s    r(   r  zPhotoAsset.asset_date       %%k222r)   c                 ,    |                      d          S )zGets the photo added date.r:  r  r   s    r(   
added_datezPhotoAsset.added_date  r  r)   c                 f    | j         d         d         d         | j         d         d         d         fS )zGets the photo dimensions.r   r'  r   r(  r  r   s    r(   
dimensionszPhotoAsset.dimensions  s:     )*<=gF)*=>wG
 	
r)   c                 >   d}	 | j         d         d         d         }n;# t          $ r. 	 | j         d         d         d         }n# t          $ r Y nw xY wY nw xY w|| j        v r| j        |         S | j                                                            d          rdS dS )	zGets the photo item type.r,  r   r#  r   r)  )z.heicz.pngz.jpgz.jpegr  r  )r  r   r  r*  lowerendswith)r%   	item_types     r(   r  zPhotoAsset.item_type  s     			+H5jA'JII 	 	 	 /9:OP		    	 ''?9--=  ))*LMM 	7ws2    
AAA
AAAAAc                 6    | j         dk    od| j        d         v S )z#Check if the photo is a live photo.r  r3  r   )r  r  r   s    r(   is_live_photozPhotoAsset.is_live_photo  s)     Ng% O-1DX1NN	
r)   c                     | j         sji | _         | j        dk    r| j        }n| j        }|                                D ]4\  }}| d| j        d         v r|                     |          | j         |<   5| j         S )zGets the photo versions.r  Resr   )r  r  r  r  r  r  _get_photo_version)r%   typed_version_lookupr   prefixs       r(   versionszPhotoAsset.versions  s     ~ 		JDN~((7;7P$$'+'@$399;; J JV>>>T%8%BBB*.*A*A&*I*IDN3'~r)   r  c                 >    || j         vrdS | j         |         d         S )zReturns the photo download URL.Nr   )r  )r%   versions     r(   download_urlzPhotoAsset.download_url  s&    $-''4}W%e,,r)   r  c                    i }| j         d         }|                    | d          }|r|d         |d<   nd |d<   |                    | d          }|r|d         |d<   nd |d<   |                    | d          }|r#|d         d         |d<   |d         d	         |d
<   n
d |d<   d |d
<   |                    | d          }|r|d         |d<   nd |d<   | j        |d<   | j        r|                    d          }|rl| j                            |d           dk    rMt
          j                            | j                  \  }	}
| j                            |d          }|	 | }||d<   |S )Nr   Widthr   widthHeightheightr  r  downloadURLr   FileTyper   r*  r  r  )	r  r5   r*  r  r  r.  r(  splitextr  )r%   r  r  r   width_entryheight_entry
size_entry
type_entryversion_typefilename_base_	extensionlive_photo_video_filenames                r(   r  zPhotoAsset._get_photo_version  s   "$,0,?,I06

f;K;K;K0L0L 	$*73GG#GG17v<M<M<M1N1N 	% ,W 5GH $GH/5zzV.../I/I
 	"(1&9GFO'0?GENN"GFO!GEN/5zzV:M:M:M/N/N
 	#(1GFOO"GFO #m
 		@*1++f*=*=L @ 3 3L$ G G7 R R $&7#3#3DM#B#B q!%!:!>!>|V!T!T	4A1N91N1N)&?
#r)   c                     || j         vrdS  | j        j        j        | j         |         d         fddi|}|j                                        S )zReturns the photo file.Nr   streamT)r  r  r   r5   rawread)r%   r  kwargsr   s       r(   downloadzPhotoAsset.download9  si    $-''46T]26M'"5)
 

 
 

 |  """r)   c                    | j         j        }t          | j         j                  }| d| }| j         j                            |d| j        d         | j        d         | j                            d| j                            d                    dddiid	d
g| j        d         ddt          t          i          }|j        dk    rdS |                                }|                    d          rdS |                    d          }t          |t                    r|D ]/}t          |t                    r|                    d          r dS 0|r|d         }t          |t                    ro|                    di           }	t          |	t                    rD|	                    di           }
t          |
t                    rd|
v rt!          |
d                   S dS )zDeletes the photo.r  r^  r   r   r  r   r   r   r  r  r   Tr  r     Fr2   r3   r4   r   r   )r  r   r   r   r   r   r  r5   r  r   r   status_coder   r6   r7   r8   r   )r%   r$  r   r   r%  r0   r3   r;   r   r   
is_deleteds              r(   r  zPhotoAsset.deleteE  s   6 4558888.33 *2*.*<\*J*.*<\*J/3/A/E/E 1 $ 3 7 78I J J0 0 (3WaL&A# #  ,X6! $ "#45) 4 
 
, s""5"&))++;;x   	5++i((gt$$ 	=! ! !fd++ !

;L0M0M ! 55 =&qzlD11 =)--h;;F!&$// =%+ZZR%@%@
%j$77 =Gz<Q<Q#'
7(;#<#<<tr)   c                 B    dt          |           j         d| j         dS )Nr  z: id=>)r   r*   r   r   s    r(   r  zPhotoAsset.__repr__u  s&    74::&77TW7777r)   )F)r  )%r*   r+   r,   r-   r   r8   r   r
   r$   r  r7  r  r  r  r   r   r   r  r*  r  r   r  r   r  r  r  r  r  r  r  r   r  r  bytesr  r  r  rD   r)   r(   r   r   p  s        N
C
C CH~
C 38n	
C
 

C 
C 
C 
C %,	" "JS#X    %+	, ,$sCx.    "/#$, ,$sCx.    "%$, ,$sCx.    0C 0 0 0 X0 13 1 1 1 X1 0# 0 0 0 X0 #    X P P XP     X; ;C ; ;( ; ; ; ; 3H 3 3 3 X3 3H 3 3 3 X3 
 
 X
 3    X& 
t 
 
 
 X
 $sDcN23    X- -(3- - - - -+ +c3h + + + +Z
# 
# 
# 
# 
# 
#. . . . .`8# 8 8 8 8 8 8r)   r   c                       e Zd ZdZedefd            Zedefd            Zede	fd            Z
edefd            ZdS )r<  zA Shared Stream Photo Assetr    c                     | j                             di                               di                               dd          S )zGets the photo like count.pluginFields	likeCountr   r   )r  r5   r   s    r(   
like_countzPhotoStreamAsset.like_count|  s;     "">266Sb!!S!__	
r)   c                     t          | j                            di                               di                               dd                    S )zGets if the photo is liked.r  likedByCallerr   F)r   r  r5   r   s    r(   likedzPhotoStreamAsset.liked  sJ     "">266S"%%S%  
 
 	
r)   c                 0    |                      dd          S )r  originalCreationDateT)r  r  r   s    r(   r  zPhotoStreamAsset.asset_date  s     %%&<T%JJJr)   c                     	 | j                             di           }|                    di           }|                    dd          }|t          |          ndS # t          t          t
          f$ r Y dS w xY w)zGets the photo asset size.r   resOriginalFileSizer   r   )r  r5   r   r   r  r  )r%   r   res_sizer   s       r(   r  zPhotoStreamAsset.size  s    	(,,Xr::Fzz"7<<HLL!,,E!&!23u:::9)Z0 	 	 	11	s   AA A76A7N)r*   r+   r,   r-   r   r   r  r   r  r   r  r  rD   r)   r(   r<  r<  y  s        %%
C 
 
 
 X
 
t 
 
 
 X
 KH K K K XK c    X  r)   r<  )?r-   r  loggingr.  abcr   r   r   r   enumr   r   r	   typingr
   r   r   r   r   r   urllib.parser   requestsr   pyicloud.constr   r   pyicloud.exceptionsr   r   r   pyicloud.services.baser   pyicloud.sessionr   	getLoggerr*   r   Loggerr7  r   r8   r   r7   r<   r>   rF   r[   r_   rm   r   r   r   r   r9  r   r   r   r
  r  rT  r   r<  rD   r)   r(   <module>r     s        				 # # # # # # # # ' ' ' ' ' ' ' ' & & & & & & & & & & E E E E E E E E E E E E E E E E " " " " " "       : : : : : : : :         
 / . . . . . , , , , , ,+'+H55 5 5 52 2 2 2 2. 2 2 24S> d4S>6J    "     G       S$        C   	# 	# 	# 	# 	#3 	# 	# 	#< < < < <S$ < < <& %   d38n   ;. ;. ;. ;. ;.X ;. ;. ;.|:/ :/ :/ :/ :/s :/ :/ :/zAH AH AH AH AH# AH AH AHH# # # # #) # # #LcG cG cG cG cGK cG cG cGLT) T) T) T) T)Xs T) T) T)nB B B B B B B BJ    z   0) 0) 0) 0) 0)j 0) 0) 0)fM M M M M^ M M M`F8 F8 F8 F8 F8 F8 F8 F8R# # # # #z # # # # #r)   