U
    h                     @   sr   d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZ G dd deeZdS )	    N)Path)AnyDictListOptional)Document)	BaseModelroot_validator)
BaseLoaderc                   @   s   e Zd ZU dZeed< dZee ed< dZee	e  ed< dZ
eed< edd	eeef eeef d
ddZedddZee	e dddZeee dddZe	e dddZe	e dddZdS )DropboxLoaderzLoad files from `Dropbox`.

    In addition to common files such as text and PDF files, it also supports
    *Dropbox Paper* files.
    dropbox_access_tokenNdropbox_folder_pathdropbox_file_pathsF	recursiveT)pre)valuesreturnc                 C   sH   | ddk	r$| ddk	r$td| ddkrD| dsDtd|S )zDValidate that either folder_path or file_paths is set, but not both.r   Nr   z.Cannot specify both folder_path and file_pathsz-Must specify either folder_path or file_paths)get
ValueError)clsr    r   P/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/document_loaders/dropbox.pyvalidate_inputs$   s    zDropboxLoader.validate_inputs)r   c              
   C   s|   zddl m}m} W n tk
r0   tdY nX z|| j}|  W n. |jk
rv } ztd|W 5 d}~X Y nX |S )zCreate a Dropbox client.r   )Dropbox
exceptions!You must run `pip install dropboxzEInvalid Dropbox access token. Please verify your token and try again.N)dropboxr   r   ImportErrorr   Zusers_get_current_accountZ	AuthErrorr   )selfr   r   dbxexr   r   r   _create_dropbox_client3   s    
z$DropboxLoader._create_dropbox_client)folder_pathr   c              
      s     }zddlm} ddlm  W n tk
r@   tdY nX z|j|jd}W n6 |jk
r } zt	d| d|W 5 d}~X Y nX  fd	d
|j
D }dd
 fdd|D D }|S )z%Load documents from a Dropbox folder.r   r   FileMetadatar   )r   z$Could not list files in the folder: z.. Please verify the folder path and try again.Nc                    s   g | ]}t | r|qS r   )
isinstance).0entryr$   r   r   
<listcomp>U   s     
 z=DropboxLoader._load_documents_from_folder.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|qS Nr   r'   docr   r   r   r)   V   s   c                 3   s   | ]}  |jV  qd S r*   )_load_file_from_pathZpath_display)r'   filer   r   r   	<genexpr>X   s     z<DropboxLoader._load_documents_from_folder.<locals>.<genexpr>)r!   r   r   Zdropbox.filesr%   r   Zfiles_list_folderr   ApiErrorr   entries)r   r"   r   r   resultsr    filesZ	documentsr   )r%   r   r   _load_documents_from_folderC   s&    
z)DropboxLoader._load_documents_from_folder)	file_pathr   c                 C   s  |   }zddlm} W n tk
r4   tdY nX z:||}|jrX||\}}n|jrn||d\}}W n6 |j	k
r } zt
d| d|W 5 d}~X Y nX z|jd}W n tk
r   tj|d	  }	|	d
krtd| d ddlm}
 t }t|jd }t|dd}||j W 5 Q R X z,|
t|}| }|rj|d W  Y S W n@ tk
r } z td| d|  W Y Y dS d}~X Y nX ntd| d Y dS X d| tj|d}t||dS )z Load a file from a Dropbox path.r   r#   r   ZmarkdownzCould not load file: z+. Please verify the file pathand try again.Nzutf-8   z.pdfzFile z type detected as .pdf)UnstructuredPDFLoaderztmp.pdfwb)modez Error while trying to parse PDF z: z/ could not be decoded as pdf or text. Skipping.z
dropbox://)sourcetitle)Zpage_contentmetadata) r!   r   r   r   Zfiles_get_metadataZis_downloadableZfiles_downloadZexport_infoZfiles_exportr1   r   contentdecodeUnicodeDecodeErrorospathsplitextlowerprintZ$langchain_community.document_loadersr8   tempfileTemporaryDirectoryr   nameopenwritestrload	Exceptionbasenamer   )r   r6   r   r   Zfile_metadata_responser    textZfile_extensionr8   temp_dirZtemp_pdffloaderZdocsZpdf_exr=   r   r   r   r-   ]   sX    




z"DropboxLoader._load_file_from_pathc                    s,    j stddd  fdd j D D S )z1Load documents from a list of Dropbox file paths.zfile_paths must be setc                 S   s   g | ]}|d k	r|qS r*   r   r+   r   r   r   r)      s   z<DropboxLoader._load_documents_from_paths.<locals>.<listcomp>c                 3   s   | ]}  |V  qd S r*   )r-   )r'   r6   r/   r   r   r0      s   z;DropboxLoader._load_documents_from_paths.<locals>.<genexpr>)r   r   r/   r   r/   r   _load_documents_from_paths   s    
z(DropboxLoader._load_documents_from_pathsc                 C   s"   | j dk	r| | j S |  S dS )zLoad documents.N)r   r5   rU   r/   r   r   r   rL      s    
zDropboxLoader.load)__name__
__module____qualname____doc__rK   __annotations__r   r   r   r   r   boolr	   r   r   r   r!   r   r5   r-   rU   rL   r   r   r   r   r      s   
"=r   )rA   rF   pathlibr   typingr   r   r   r   Zlangchain_core.documentsr   Zlangchain_core.pydantic_v1r   r	   Z)langchain_community.document_loaders.baser
   r   r   r   r   r   <module>	   s   