o
    l>jvP                     @   sV  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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 deZ(G dd dZ)dee fd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                       s  e Zd ZdZdedededeeef ddf
 fdd	Zdeeef fd
dZ		dEdede
eeef  deeef fddZefdededefddZdd Zefdededeeef fddZefdedeeef dededef
ddZefdedededdfddZd ed!efd"d#Zd$ed%efd&d'Zd$ed%ed!efd(d)Zd*ed+ d,d+fd-d.Zd$ed%efd/d0Zd$ed%efd1d2Zd$ed%efd3d4ZedFd5d6ZedFd7d8ZdGd9d:Z dGd;d<Z!d=d> Z"d?edd+fd@dAZ#e$dBeddfdCdDZ%  Z&S )HDriveServicezThe 'Drive' iCloud service.service_rootdocument_rootsessionparamsreturnNc                    s&   t  ||| || _d | _d | _d S N)super__init___document_root_root_trash)selfr   r   r   r   	__class__ L/home/thesage/.local/lib/python3.10/site-packages/pyicloud/services/drive.pyr!   !   s   
zDriveService.__init__c                 C   s`   | j j D ]%}|jtkr+|jr+td|j}|d u r"td|j d|di  S qtd)Nz\bt=([^:]+)zCan't extract token from token   zToken cookie not found)	r   cookiescopynamer   valuer   r   group)r%   cookiematchr(   r(   r)   _get_token_from_cookie-   s   z#DriveService._get_token_from_cookie	drivewsidshare_idc                 C   sL   |ddg}|r||d d< | j j| jd | j|d}| | | d S )zReturns the node data.F)r4   partialDatar   shareIDz/retrieveItemDetailsInFoldersr   jsonr   postr   r   _raise_if_errorr9   )r%   r4   r5   payloadrequestr(   r(   r)   get_node_data8   s   
zDriveService.get_node_datafile_idzonec           	      K   s   t | j}|d|i | jj| jd| d |d}| | | }|d}|d}|rD|drD| jj|d fd| ji|S |rZ|drZ| 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<   r9   KeyError)	r%   r@   rA   kwargsfile_paramsresponseresponse_jsonrE   rF   r(   r(   r)   get_fileL   s   



zDriveService.get_filec                 C   s.   | j j| jd | jd}| | | d S )z.Returns the app library (previously ubiquity).z/retrieveAppLibrariesrD   items)r   rJ   r   r   r<   r9   )r%   r>   r(   r(   r)   get_app_data^   s   
zDriveService.get_app_datafile_objectc              	   C   s   t |jd }|du rd}| }|dtj | }||tj | j}|	| 
  | jj| jd| d |tti|jd||dd}| | | d d	 | d d
 fS )z1Get the contentWS endpoint URL to add a new file.r   N rC   z/upload/webFILE)filenametypecontent_typesizer   headersr9   rB   rG   )	mimetypes
guess_typer.   tellseekosSEEK_ENDSEEK_SETr   rI   r3   r   r;   r"   r
   r   r<   r9   )r%   rS   rA   rX   orig_pos	file_sizerM   r>   r(   r(   r)   _get_upload_contentws_urlg   s*   
 z&DriveService._get_upload_contentws_url	folder_id	file_inforB   c           	      K   s   |d |d |d |d ddd||t j|jdddd	d	d
t|dt d t|dt d d	}|drI|d d|d i | jj	| j
d| d | jtti|d}| | | S )NfileChecksumwrappingKeyreferenceChecksumrY   )	signaturewrapping_keyreference_signaturerY   add_fileT)starting_document_idpathF)is_writableis_executable	is_hiddenmtimei  ctime)	datacommandcreate_short_guidrB   rp   allow_conflict
file_flagsrt   btimereceiptrv   rC   z/update/documentsrZ   )r`   rp   basenamer.   intrJ   timerI   r   r;   r"   r   r
   r   r<   r9   )	r%   rf   rg   rB   rS   rA   rL   rv   r>   r(   r(   r)   _update_contentws   s:   

zDriveService._update_contentwsc           	      K   s\   | j ||d\}}| jj||j|id}| | | d }| j|||||fi | dS )zSend new file to iCloud Drive.)rS   rA   )files
singleFileN)re   r   r;   r.   r<   r9   r   )	r%   rf   rS   rA   rL   rB   content_urlr>   content_responser(   r(   r)   	send_file   s"   



zDriveService.send_fileparentr.   c                 C   sN   dt   }| jj| jd | jtti|||dgdd}| | |	 S )z!Creates a new iCloud Drive folderzFOLDER::UNKNOWN_ZONE::TempId-z/createFolders)clientIdr.   )destinationDrivewsIdfoldersrZ   )
uuiduuid4r   r;   r   r   r
   r   r<   r9   )r%   r   r.   temp_client_idr>   r(   r(   r)   create_folders   s   
zDriveService.create_foldersnode_idetagc                 C   s@   | j j| jd | jd||| jd dgid}| | | S )zDeletes an iCloud Drive node/deleteItemsrQ   r   r4   r   r   r8   r:   r%   r   r   r>   r(   r(   r)   delete_items   s   
zDriveService.delete_itemsc                 C   s:   | j j| jd | jd|||dgid}| | | S )zRenames an iCloud Drive nodez/renameItemsrQ   )r4   r   r.   r8   r:   )r%   r   r   r.   r>   r(   r(   r)   rename_items   s   
zDriveService.rename_itemsnodes	DriveNodedestinationc                 C   sj   dd |D }dd |D }t |||}| jj| jd | j|jd dd |D dd}| | | S )	z2Moves iCloud Drive node(s) to the specified folderc                 S      g | ]}|j d  qS )r4   rv   .0noder(   r(   r)   
<listcomp>      z3DriveService.move_nodes_to_node.<locals>.<listcomp>c                 S   r   )r   r   r   r(   r(   r)   r     r   z
/moveItemsr4   c                 S   s   g | ]\}}}|||d qS )r   r(   )r   
_drivewsid_etag
_client_idr(   r(   r)   r     s    )r   rQ   r8   )zipr   r;   r   r   rv   r<   r9   )r%   r   r   node_idsetagsrQ   r>   r(   r(   r)   move_nodes_to_node
  s   
zDriveService.move_nodes_to_nodec                 C   s>   |}| j j| jd | jd|||dgid}| | | S )z+Moves an iCloud Drive node to the trash binz/moveItemsToTrashrQ   r   r8   r:   )r%   r   r   r   r>   r(   r(   r)   move_items_to_trash$  s   
z DriveService.move_items_to_trashc                 C   8   | j j| jd | jd||dgid}| | | S )z0Restores an iCloud Drive node from the trash binz/putBackItemsFromTrashrQ   r4   r   r8   r:   r   r(   r(   r)   recover_items_from_trash8     
z%DriveService.recover_items_from_trashc                 C   r   )z;Permanently deletes an iCloud Drive node from the trash binr   rQ   r   r8   r:   r   r(   r(   r)   delete_forever_from_trashI  r   z&DriveService.delete_forever_from_trashc                 C   "   | j s|   | j r| j S td)zReturns the root node.zRoot not found)r#   refresh_root
ValueErrorr%   r(   r(   r)   r   Z  
   zDriveService.rootc                 C   r   )zReturns the trash node.zTrash not found)r$   refresh_trashr   r   r(   r(   r)   trashc  r   zDriveService.trashc                 C      t | | t| _dS )z(Refreshes and returns a fresh root node.N)r   r?   r   r#   r   r(   r(   r)   r   l     zDriveService.refresh_rootc                 C   r   )z)Refreshes and returns a fresh trash node.N)r   r?   r   r$   r   r(   r(   r)   r   p  r   zDriveService.refresh_trashc                 C   s   t | j|S r   )getattrr   )r%   attrr(   r(   r)   __getattr__t  s   zDriveService.__getattr__keyc                 C   s
   | j | S r   )r   )r%   r   r(   r(   r)   __getitem__w  s   
zDriveService.__getitem__rN   c                 C   s&   | j st| j| j}t| |d S r   )okr   reasonstatus_coder   error)rN   	api_errorr(   r(   r)   r<   z  s   
zDriveService._raise_if_errorr   )r   r   )r   N)'__name__
__module____qualname____doc__strr   rH   r   r!   r3   r   r?   r   r	   rP   rR   r   tuplere   r   r   r   r   r   listr   r   r   r   propertyr   r   r   r   r   r   staticmethodr<   __classcell__r(   r(   r&   r)   r      s    




(

2


r   c                   @   sz  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
dZede
fddZede
fddZd<deded  fddZd=ddZedee fddZedee fddZedee fddZedee fddZdd  Zd!d" Zdee
 fd#d$Zd%e
fd&d'Zd(e
fd)d*Zd+d, Z d-d. Z!d/d0 Z"d1d2 Z#d(e
dd fd3d4Z$d5e
dd fd6d7Z%de
fd8d9Z&de
fd:d;Z'd	S )>r   zDrive node.unknownr   r   z	<UNKNOWN>connrv   r   Nc                 C   s   || _ || _d | _d S r   )rv   
connection	_children)r%   r   rv   r(   r(   r)   r!     s   
zDriveNode.__init__c                 C   sV   | j d}|s| j d}|tkr| j}|s| j}d| j v r)| d| j d  S |S )zGets the node name.r.   r4   	extension.)rv   rJ   r   	NAME_ROOTNAME_UNKNOWN)r%   	node_namer(   r(   r)   r.     s   
zDriveNode.namec                 C   s8   | j d}|s| j dtkr| j}|s| j}| S )zGets the node type.rW   r4   )rv   rJ   r   
TYPE_TRASHTYPE_UNKNOWNlower)r%   	node_typer(   r(   r)   rW     s   zDriveNode.typeFforcec                    s    j r|r@d jvs|r" j jd  jd}i  j| _d jvr1td jd   fdd jd  D  _  j S )zGets the node children.rQ   r4   r7   zNo items in folder, status: statusc                    s   g | ]}t  j|qS r(   )r   r   )r   	item_datar   r(   r)   r     s    
z*DriveNode.get_children.<locals>.<listcomp>)r   rv   r   r?   rJ   rK   r-   )r%   r   	node_datar(   r   r)   get_children  s   


zDriveNode.get_childrenchildc                 C   sT   | j r&| jd D ]}|d |jd kr| jd |  nq| j | dS td)zRemoves a child from the node.rQ   docwsidzNo children to removeN)r   rv   remover   )r%   r   r   r(   r(   r)   r     s   zDriveNode.removec                 C   s   | j d}|s
dS t|S )zGets the node size.rY   N)rv   rJ   r~   )r%   rY   r(   r(   r)   rY     s   zDriveNode.sizec                 C      t | jdS )z$Gets the node changed date (in UTC).dateChanged_date_to_utcrv   rJ   r   r(   r(   r)   date_changed     zDriveNode.date_changedc                 C   r   )z%Gets the node modified date (in UTC).dateModifiedr   r   r(   r(   r)   date_modified  r   zDriveNode.date_modifiedc                 C   r   )z&Gets the node last open date (in UTC).lastOpenTimer   r   r(   r(   r)   date_last_open  r   zDriveNode.date_last_openc                 K   sF   | j d dkrt }t |_|S | jj| j d fd| j d i|S )zGets the node file.rY   r   r   rA   )rv   r	   ioBytesIOrawr   rP   )r%   rL   rN   r(   r(   r)   open  s   
zDriveNode.openc                 K   s&   | j j| jd |fd| jd i|S )zUpload a new file.r   rA   )r   r   rv   )r%   rS   rL   r(   r(   r)   upload  s   
zDriveNode.uploadc                 C   s&   | j dkr
t| jdd |  D S )z"Gets the node list of directories.filec                 S   s   g | ]}|j qS r(   r.   r   r   r(   r(   r)   r     s    z!DriveNode.dir.<locals>.<listcomp>)rW   NotADirectoryErrorr.   r   r   r(   r(   r)   dir  s   

zDriveNode.dirfolderc                 C   s   | j | jd |S )z!Create a new directory directory.r4   )r   r   rv   )r%   r   r(   r(   r)   mkdir  s   zDriveNode.mkdirr.   c                 C   s   | j | jd | jd |S )zRename an iCloud Drive item.r4   r   )r   r   rv   r%   r.   r(   r(   r)   rename   s   zDriveNode.renamec                 C      | j | jd | jd S )z>Move an iCloud Drive item to the trash bin (Recently Deleted).r4   r   )r   r   rv   r   r(   r(   r)   move_to_trash  s   zDriveNode.move_to_trashc                 C   r   )zDelete an iCloud Drive item.r4   r   )r   r   rv   r   r(   r(   r)   delete  s   zDriveNode.deletec                 C   8   | j dr| j| j d | j d S td| j d)z)Recovers an iCloud Drive item from trash.restorePathr4   r   'z%' does not appear to be in the Trash.)rv   rJ   r   r   r   r.   r   r(   r(   r)   recover  s
   zDriveNode.recoverc                 C   r   )z4Permanently deletes an iCloud Drive item from trash.r   r4   r   r   ze' does not appear to be in the Trash. Please 'delete()' it first before trying to 'delete_forever()'.)rv   rJ   r   r   r   r.   r   r(   r(   r)   delete_forever  s   zDriveNode.delete_foreverc                    s,   | j dkr	t  fdd|  D d S )zGets the node child.r   c                    s   g | ]	}|j  kr|qS r(   r   r   r   r(   r)   r   )  s    z!DriveNode.get.<locals>.<listcomp>r   )rW   r   r   r   r(   r   r)   rJ   %  s   
zDriveNode.getr   c              
   C   s8   z|  |W S  ty } z	td| d|d }~ww )NzNo child named 'z' exists)rJ   
IndexErrorrK   )r%   r   ir(   r(   r)   r   +  s   zDriveNode.__getitem__c                 C   s   dd| j  d| j  d S )N{ztype: z, name: })rW   r.   r   r(   r(   r)   __str__1     zDriveNode.__str__c                 C   s   dt | j dt|  dS )N<z: >)rW   r   r   r   r(   r(   r)   __repr__4  r  zDriveNode.__repr__)F)r   r   r   N)(r   r   r   r   r   r   r   r   r   rH   r   r   r!   r   r.   rW   boolr   r   r   r   r~   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   r   r  r  r(   r(   r(   r)   r     sD    
	r   r   c                 C   s\   | sd S t d| }|st| dS t|dd}tt|dt|dd}|| S )Nz^(.+?)([\+\-]\d+):(\d\d)$z%Y-%m-%dT%H:%M:%SZr+   z%Y-%m-%dT%H:%M:%S      )hoursminutes)r   r   strptimer0   r   r~   )dater2   basediffr(   r(   r)   r   8  s   
 r   )+r   r   loggingr\   r`   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(   r)   <module>   s8      h 5