
    DjvP                        U d Z ddlZddlZddl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 ddlmZmZ ddlmZmZ dd	lmZ dd
lmZ  ej        e          Zej        e d<   dZ!e"e d<   dZ#e"e d<   dZ$e"e d<   dZ%e"e d<   de# de$ Z&e"e d<   de# de% Z'e"e d<    G d de          Z( G d d          Z)dee         fdZ*dS )zDrive service.    N)datetime	timedelta)Matchsearch)IOAnyOptional)Response)CONTENT_TYPECONTENT_TYPE_TEXT)PyiCloudAPIResponseExceptionTokenException)BaseService)PyiCloudSessionLOGGERzX-APPLE-WEBAUTH-VALIDATECOOKIE_APPLE_WEBAUTH_VALIDATEzcom.apple.CloudDocsCLOUD_DOCS_ZONEroot	NODE_ROOT
TRASH_ROOT
NODE_TRASHzFOLDER::z::CLOUD_DOCS_ZONE_ID_ROOTCLOUD_DOCS_ZONE_ID_TRASHc                   0    e Zd ZdZdedededeeef         ddf
 fdZdeeef         fd	Z		 d/d
ede
eeef                  deeef         fdZefdededefdZd Zefdededeeef         fdZefdedeeef         dededef
dZefdedededdfdZdedefdZdedefdZdededefdZded          d!d fd"Zdedefd#Zdedefd$Zdedefd%Zed0d&            Zed0d'            Zd1d(Z d1d)Z!d* Z"d+edd fd,Z#e$d-eddfd.            Z% xZ&S )2DriveServicezThe 'Drive' iCloud service.service_rootdocument_rootsessionparamsreturnNc                 x    t                                          |||           || _        d | _        d | _        d S N)super__init___document_root_root_trash)selfr   r   r   r   	__class__s        R/home/thesage/.hermes/venv/lib/python3.11/site-packages/pyicloud/services/drive.pyr$   zDriveService.__init__!   s;     	w777#0*.
+/    c                    | j         j                                        D ]`}|j        t          k    rN|j        rGt          d|j                  }|t          d|j                   d|                    d          ic S at          d          )Nz\bt=([^:]+)zCan't extract token from token   zToken cookie not found)	r   cookiescopynamer   valuer   r   group)r(   cookiematchs      r*   _get_token_from_cookiez#DriveService._get_token_from_cookie-   s     l*//11 	1 	1F{;;;;.4^V\.R.R=()SV\)S)STTTQ00005666r+   	drivewsidshare_idc                     |ddg}|r||d         d<   | j                             | j        dz   | j        |          }|                     |           |                                d         S )zReturns the node data.F)r7   partialDatar   shareIDz/retrieveItemDetailsInFoldersr   jsonr   postr   r   _raise_if_errorr=   )r(   r7   r8   payloadrequests        r*   get_node_datazDriveService.get_node_data8   s     '$ 
  	-$,GAJy! L-- ??; . 
 

 	W%%%||~~a  r+   file_idzonec                 H   t          | j                  }|                    d|i           | j                            | j        d| dz   |          }|                     |           |                                }|                    d          }|                    d          }|r5|                    d          r  | j        j        |d         fd| j        i|S |r5|                    d          r  | j        j        |d         fd| j        i|S t          d	          )
zReturns iCloud Drive file.document_id/ws/z/download/by_idr   package_token
data_tokenurlr   z 'data_token' nor 'package_token')	dictr   updater   getr%   r@   r=   KeyError)	r(   rD   rE   kwargsfile_paramsresponseresponse_jsonrJ   rK   s	            r*   get_filezDriveService.get_fileL   sG   &*4;&7&7M73444!\--">">">">> . 
 
 	X&&& %))/::"&&|44
 	U*..// 	U#4<#Ju$5TTdkTVTTT 	X]..u55 	X#4<#M%$8WWWPVWWW9:::r+   c                     | j                             | j        dz   | j                  }|                     |           |                                d         S )z.Returns the app library (previously ubiquity).z/retrieveAppLibrariesrI   items)r   rO   r   r   r@   r=   )r(   rB   s     r*   get_app_datazDriveService.get_app_data^   sX     L,, 77; - 
 
 	W%%%||~~g&&r+   file_objectc           
         t          j        |j                  d         }|d}|                                }|                    dt
          j                   |                                }|                    |t
          j                   | j        }|	                    | 
                                           | j                            | j        d| dz   |t          t          i|j        d||d          }|                     |           |                                d         d	         |                                d         d
         fS )z1Get the contentWS endpoint URL to add a new file.r   N rH   z/upload/webFILE)filenametypecontent_typesizer   headersr=   rG   rL   )	mimetypes
guess_typer1   tellseekosSEEK_ENDSEEK_SETr   rN   r6   r   r?   r%   r   r   r@   r=   )r(   rY   rE   r_   orig_pos	file_sizerR   rB   s           r*   _get_upload_contentws_urlz&DriveService._get_upload_contentws_urlg   s?    '0&:;;K&L&LQ&OL $((**BK((($))++	2;///&*k46688999 L--":":":"::!#45', ,!	 	 . 

 

 	W%%%||~~a /1B51IIIr+   	folder_id	file_inforG   c                    |d         |d         |d         |d         ddd||t           j                            |j                  dddd	d	d
t	          |                    dt          j                              dz            t	          |                    dt          j                              dz            d	}|                    d          r#|d                             d|d         i           | j        	                    | j
        d| dz   | j        t          t          i|          }|                     |           |                                S )NfileChecksumwrappingKeyreferenceChecksumr`   )	signaturewrapping_keyreference_signaturer`   add_fileT)starting_document_idpathF)is_writableis_executable	is_hiddenmtimei  ctime)	datacommandcreate_short_guidrG   rx   allow_conflict
file_flagsr|   btimereceiptr~   rH   z/update/documentsra   )rg   rx   basenamer1   intrO   timerN   r   r?   r%   r   r   r   r@   r=   )	r(   rm   rn   rG   rY   rE   rQ   r~   rB   s	            r*   _update_contentwszDriveService._update_contentws   sl    '~6 )- 8'01D'E!&)	  "!%&(1(()9::  ##!&" 
 GTY[[99D@AAGTY[[99D@AA+ 
  
2 ==## 	CLIi,@ ABBB L--"@"@"@"@@;!#45	 . 
 
 	W%%%||~~r+   c                    |                      ||          \  }}| j                            ||j        |i          }|                     |           |                                d         } | j        |||||fi | dS )zSend new file to iCloud Drive.)rY   rE   )files
singleFileN)rl   r   r?   r1   r@   r=   r   )	r(   rm   rY   rE   rQ   rG   content_urlrB   content_responses	            r*   	send_filezDriveService.send_file   s     $(#A#A#$ $B $
 $
 [ !L-- 0+> . 
 
 	W%%%"<<>>,7	
 	
 	
 	
 	
 	
 	
r+   parentr1   c           	          dt          j                     }| j                            | j        dz   | j        t          t          i|||dgd          }|                     |           |	                                S )z!Creates a new iCloud Drive folderzFOLDER::UNKNOWN_ZONE::TempId-z/createFolders)clientIdr1   )destinationDrivewsIdfoldersra   )
uuiduuid4r   r?   r   r   r   r   r@   r=   )r(   r   r1   temp_client_idrB   s        r*   create_folderszDriveService.create_folders   s     MdjllLL L-- 00;!#45(. %3 $  	 . 
 
 	W%%%||~~r+   node_idetagc           	          | j                             | j        dz   | j        d||| j        d         dgi          }|                     |           |                                S )zDeletes an iCloud Drive node/deleteItemsrW   r   r7   r   r   r<   r>   r(   r   r   rB   s       r*   delete_itemszDriveService.delete_items   sy     L--.;%, $$(K
$;  . 
 
 	W%%%||~~r+   c           	          | j                             | j        dz   | j        d|||dgi          }|                     |           |                                S )zRenames an iCloud Drive nodez/renameItemsrW   )r7   r   r1   r<   r>   )r(   r   r   r1   rB   s        r*   rename_itemszDriveService.rename_items   sr     L--.;%, $ $  . 
 
 	W%%%||~~r+   nodes	DriveNodedestinationc                 *   d |D             }d |D             }t          |||          }| j                            | j        dz   | j        |j        d         d |D             d          }|                     |           |                                S )z2Moves iCloud Drive node(s) to the specified folderc                 (    g | ]}|j         d          S )r7   r~   .0nodes     r*   
<listcomp>z3DriveService.move_nodes_to_node.<locals>.<listcomp>  s    ===tDIk*===r+   c                 (    g | ]}|j         d          S )r   r   r   s     r*   r   z3DriveService.move_nodes_to_node.<locals>.<listcomp>  s    555t6"555r+   z
/moveItemsr7   c                 "    g | ]\  }}}|||d S )r    )r   
_drivewsid_etag
_client_ids       r*   r   z3DriveService.move_nodes_to_node.<locals>.<listcomp>  s@        6
E:	 &0 %$.   r+   )r   rW   r<   )zipr   r?   r   r   r~   r@   r=   )r(   r   r   node_idsetagsrW   rB   s          r*   move_nodes_to_nodezDriveService.move_nodes_to_node
  s    ==u===55u555HeX.. !L--,;(3(8(E  :?  
 
 . 
 
 	W%%%||~~r+   c           	          |}| j                             | j        dz   | j        d|||dgi          }|                     |           |                                S )z+Moves an iCloud Drive node to the trash binz/moveItemsToTrashrW   r   r<   r>   )r(   r   r   r   rB   s        r*   move_items_to_trashz DriveService.move_items_to_trash$  sz     & L-- 33;%, $$2  . 
 
 	W%%%||~~r+   c                     | j                             | j        dz   | j        d||dgi          }|                     |           |                                S )z0Restores an iCloud Drive node from the trash binz/putBackItemsFromTrashrW   r7   r   r<   r>   r   s       r*   recover_items_from_trashz%DriveService.recover_items_from_trash8  sp     L-- 88;%, $  . 
 
 	W%%%||~~r+   c                     | j                             | j        dz   | j        d||dgi          }|                     |           |                                S )z;Permanently deletes an iCloud Drive node from the trash binr   rW   r   r<   r>   r   s       r*   delete_forever_from_trashz&DriveService.delete_forever_from_trashI  so     L--.;%, $  . 
 
 	W%%%||~~r+   c                 r    | j         s|                                  | j         r| j         S t          d          )zReturns the root node.zRoot not found)r&   refresh_root
ValueErrorr(   s    r*   r   zDriveService.rootZ  sA     z 	 : 	:)***r+   c                 r    | j         s|                                  | j         r| j         S t          d          )zReturns the trash node.zTrash not found)r'   refresh_trashr   r   s    r*   trashzDriveService.trashc  sA     { 	!   ; 	;*+++r+   c                 `    t          | |                     t                              | _        dS )z(Refreshes and returns a fresh root node.N)r   rC   r   r&   r   s    r*   r   zDriveService.refresh_rootl  s&    tT%7%78O%P%PQQ


r+   c                 `    t          | |                     t                              | _        dS )z)Refreshes and returns a fresh trash node.N)r   rC   r   r'   r   s    r*   r   zDriveService.refresh_trashp  s&    d&8&89Q&R&RSSr+   c                 ,    t          | j        |          S r"   )getattrr   )r(   attrs     r*   __getattr__zDriveService.__getattr__t  s    ty$'''r+   keyc                     | j         |         S r"   )r   )r(   r   s     r*   __getitem__zDriveService.__getitem__w  s    y~r+   rS   c                     | j         s6t          | j        | j                  }t                              |           |d S r"   )okr   reasonstatus_coder   error)rS   	api_errors     r*   r@   zDriveService._raise_if_errorz  sH    { 	4!5 I LL###O	 	r+   r"   )r    r   )r    N)'__name__
__module____qualname____doc__strr   rM   r   r$   r6   r	   rC   r   r
   rU   rX   r   tuplerl   r   r   r   r   r   listr   r   r   r   propertyr   r   r   r   r   r   staticmethodr@   __classcell__)r)   s   @r*   r   r      s       %%
0
0 
0 !	
0
 S#X
0 

0 
0 
0 
0 
0 
0	7S#X 	7 	7 	7 	7 DH! !!(0c3h(@!	c3h! ! ! !( 2A ; ; ;3 ;x ; ; ; ;$' ' ' $ J  J J  J 
sCx	 J  J  J  JP $, ,, S>, 	,
 , , , , ,d $	
 

 
 	
 

 
 
 
4S     *C s    $C s #    $[(9     43 c    ( 3    " C    " + + + X+ , , , X,R R R RT T T T( ( (s {     ( t    \    r+   r   c                      e Zd ZdZdZdZdZdZdede	e
ef         dd	fd
Zede
fd            Zede
fd            Zd&deded          fdZd'dZedee         fd            Zedee         fd            Zedee         fd            Zedee         fd            Zd Zd Zdee
         fdZde
fdZde
fdZd Z d Z!d Z"d  Z#de
dd fd!Z$d"e
dd fd#Z%de
fd$Z&de
fd%Z'd	S )(r   zDrive node.unknownr   r   z	<UNKNOWN>connr~   r    Nc                 0    || _         || _        d | _        d S r"   )r~   
connection	_children)r(   r   r~   s      r*   r$   zDriveNode.__init__  s    $(	(,48r+   c                     | j                             d          }|s5| j                             d          }|t          k    r| j        }|s| j        }d| j         v r| d| j         d          S |S )zGets the node name.r1   r7   	extension.)r~   rO   r   	NAME_ROOTNAME_UNKNOWN)r(   	node_names     r*   r1   zDriveNode.name  s     $(9==#8#8	 	.	k22I333 N	 . -	$)##::$)K"8:::r+   c                     | j                             d          }|s*| j                             d          t          k    r| j        }|s| j        }|                                S )zGets the node type.r^   r7   )r~   rO   r   
TYPE_TRASHTYPE_UNKNOWNlower)r(   	node_types     r*   r^   zDriveNode.type  s^     $(9==#8#8	 	(TY]];77:EEI 	*)I   r+   Fforcec                      j         r|rd j        vs|rN j                             j        d          j                            d                    }i  j        | _        d j        vrt          d j        d                     fd j        d                                         D              _          j         S )zGets the node children.rW   r7   r;   zNo items in folder, status: statusc                 :    g | ]}t          j        |          S r   )r   r   )r   	item_datar(   s     r*   r   z*DriveNode.get_children.<locals>.<listcomp>  s5        $/955  r+   )r   r~   r   rC   rO   rP   r0   )r(   r   	node_datas   `  r*   get_childrenzDriveNode.get_children  s    ~ 	 	di''5' O99Ik*DIMM),D,D 	 7ty6I6	di''Sdi>QSSTTT   !%7!3!8!8!:!:  DN ~r+   childc                     | j         re| j        d         D ];}|d         |j        d         k    r"| j        d                             |            n<| j                             |           dS t          d          )zRemoves a child from the node.rW   docwsidzNo children to removeN)r   r~   remover   )r(   r   r   s      r*   r   zDriveNode.remove  s    > 	6!Yw/  	Y'5:i+@@@Ig&--i888E A N!!%(((((4555r+   c                 \    | j                             d          }|sdS t          |          S )zGets the node size.r`   N)r~   rO   r   )r(   r`   s     r*   r`   zDriveNode.size  s0     #immF33 	44yyr+   c                 P    t          | j                            d                    S )z$Gets the node changed date (in UTC).dateChanged_date_to_utcr~   rO   r   s    r*   date_changedzDriveNode.date_changed  s      DIMM-88999r+   c                 P    t          | j                            d                    S )z%Gets the node modified date (in UTC).dateModifiedr   r   s    r*   date_modifiedzDriveNode.date_modified        DIMM.99:::r+   c                 P    t          | j                            d                    S )z&Gets the node last open date (in UTC).lastOpenTimer   r   s    r*   date_last_openzDriveNode.date_last_open  r  r+   c                     | j         d         dk    r(t                      }t          j                    |_        |S  | j        j        | j         d         fd| j         d         i|S )zGets the node file.r`   r   r   rE   )r~   r
   ioBytesIOrawr   rU   )r(   rQ   rS   s      r*   openzDriveNode.open  sp     9V!!zzH:<<HLO't'Ii 
 
'+y'8
<B
 
 	
r+   c                 Z     | j         j        | j        d         |fd| j        d         i|S )zUpload a new file.r   rE   )r   r   r~   )r(   rY   rQ   s      r*   uploadzDriveNode.upload  sC    (t(Ii +
 
48If4E
IO
 
 	
r+   c                 |    | j         dk    rt          | j                  d |                                 D             S )z"Gets the node list of directories.filec                     g | ]	}|j         
S r   r1   )r   r   s     r*   r   z!DriveNode.dir.<locals>.<listcomp>  s    <<<u
<<<r+   )r^   NotADirectoryErrorr1   r   r   s    r*   dirzDriveNode.dir  s?    9$TY///<<(9(9(;(;<<<<r+   folderc                 N    | j                             | j        d         |          S )z!Create a new directory directory.r7   )r   r   r~   )r(   r  s     r*   mkdirzDriveNode.mkdir  s!    --di.DfMMMr+   r1   c                 f    | j                             | j        d         | j        d         |          S )zRename an iCloud Drive item.r7   r   )r   r   r~   r(   r1   s     r*   renamezDriveNode.rename   s1    ++Ik"DIf$5t
 
 	
r+   c                 d    | j                             | j        d         | j        d                   S )z>Move an iCloud Drive item to the trash bin (Recently Deleted).r7   r   )r   r   r~   r   s    r*   move_to_trashzDriveNode.move_to_trash  s/    22Ik"DIf$5
 
 	
r+   c                 d    | j                             | j        d         | j        d                   S )zDelete an iCloud Drive item.r7   r   )r   r   r~   r   s    r*   deletezDriveNode.delete  s(    ++DIk,BDIfDUVVVr+   c                     | j                             d          r1| j                            | j         d         | j         d                   S t	          d| j         d          )z)Recovers an iCloud Drive item from trash.restorePathr7   r   'z%' does not appear to be in the Trash.)r~   rO   r   r   r   r1   r   s    r*   recoverzDriveNode.recover  se     9=='' 	?;;	+&	&(9   MTYMMMNNNr+   c                     | j                             d          r1| j                            | j         d         | j         d                   S t	          d| j         d          )z4Permanently deletes an iCloud Drive item from trash.r  r7   r   r  ze' does not appear to be in the Trash. Please 'delete()' it first before trying to 'delete_forever()'.)r~   rO   r   r   r   r1   r   s    r*   delete_foreverzDriveNode.delete_forever  ss     9=='' 	?<<	+&	&(9   -	 - - -
 
 	
r+   c                     | j         dk    rt                    fd|                                 D             d         S )zGets the node child.r  c                 *    g | ]}|j         k    |S r   r  )r   r   r1   s     r*   r   z!DriveNode.get.<locals>.<listcomp>)  s%    MMM%%*:L:L:L:L:Lr+   r   )r^   r  r   r  s    `r*   rO   zDriveNode.get%  sI    9$T***MMMM4#4#4#6#6MMMaPPr+   r   c                 z    	 |                      |          S # t          $ r}t          d| d          |d }~ww xY w)NzNo child named 'z' exists)rO   
IndexErrorrP   )r(   r   is      r*   r   zDriveNode.__getitem__+  sW    	D88C==  	D 	D 	D;c;;;<<!C	Ds    
:5:c                 2    dd| j          d| j         z   dz   S )N{ztype: z, name: })r^   r1   r   s    r*   __str__zDriveNode.__str__1  s'    <di<<<<<sBBr+   c                 R    dt          |           j         dt          |            dS )N<z: >)r^   r   r   r   s    r*   __repr__zDriveNode.__repr__4  s*    64::&66#d))6666r+   )F)r   r   r    N)(r   r   r   r   r   r   r   r   r   rM   r   r   r$   r   r1   r^   boolr   r   r   r	   r   r`   r   r   r   r  r	  r  r  r  r  r  r  r  r!  rO   r   r*  r.  r   r+   r*   r   r     s       LJIL9\ 9c3h 9D 9 9 9 9
 c    X$ 
!c 
! 
! 
! X
! $ 43D    $	6 	6 	6 	6 hsm    X :hx0 : : : X: ;x1 ; ; ; X; ; 2 ; ; ; X;	
 	
 	

 
 
=T#Y = = = =NC N N N N
3 
 
 
 

 
 
W W WO O O

 

 

Q Q Q Q Q QDs D{ D D D DC C C C C7# 7 7 7 7 7 7r+   r   r    c                 T   | sd S t          d|           }|st          j        | d          S t          j        |                    d          d          }t	          t          |                    d                    t          |                    d                              }||z
  S )Nz^(.+?)([\+\-]\d+):(\d\d)$z%Y-%m-%dT%H:%M:%SZr.   z%Y-%m-%dT%H:%M:%S      )hoursminutes)r   r   strptimer3   r   r   )dater5   basediffs       r*   r   r   8  s     t"()Et"L"LE = ';<<<&u{{1~~7JKKD3u{{1~~..EKKNN8K8KLLLD$;r+   )+r   r  loggingrc   rg   r   r   r   r   rer   r   typingr   r   r	   requestsr
   pyicloud.constr   r   pyicloud.exceptionsr   r   pyicloud.services.baser   pyicloud.sessionr   	getLoggerr   r   Logger__annotations__r   r   r   r   r   r   r   r   r   r   r   r+   r*   <module>rD     s+      				      				   ( ( ( ( ( ( ( (         $ $ $ $ $ $ $ $ $ $       : : : : : : : : L L L L L L L L . . . . . . , , , , , ,**844 4 4 4%? s ? ? ?, , , ,	3   
C   H/HHYHH  H H H J? J Jj J J # J J Jc c c c c; c c cLq7 q7 q7 q7 q7 q7 q7 q7h
(8, 
 
 
 
 
 
r+   