
    7|hn9                         d dl 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mZ d dlmZ dgZ e
dd	d
       G d dee             Zy)    )Path)AnyDictListOptionalSequenceUnion)
deprecated)Document)	BaseModelmodel_validator	validator)
BaseLoaderz.https://www.googleapis.com/auth/drive.readonlyz0.0.32z1.0z,langchain_google_community.GoogleDriveLoader)sinceremovalalternative_importc                      e Zd ZU dZ ej
                         dz  dz  Zeed<   	  ej
                         dz  dz  Zeed<   	  ej
                         dz  dz  Z	eed<   	 d	Z
ee   ed
<   	 d	Zeee      ed<   	 d	Zeee      ed<   	 dZeed<   	 d	Zeee      ed<   	 dZeed<   	 d	Zeed<   	 i Zedef   ed<   	  ed      edeeef   defd              Z ed      dededefd       ZdefdZdedee   fdZ dedefdZ!d	d d
edeee      dee   fd!Z"d"ed
edeeee#eee   f   f      fd#Z$dee   fd$Z%dedee   fd%Z&dee   fd&Z'dee   fd'Z(y	)(GoogleDriveLoaderz%Load Google Docs from `Google Drive`.z.credentialsz	keys.jsonservice_account_keyzcredentials.jsoncredentials_pathz
token.json
token_pathN	folder_iddocument_idsfile_idsF	recursive
file_typesload_trashed_filesfile_loader_clsstrfile_loader_kwargsbefore)modevaluesreturnc           	      j  	 |j                  d      r-|j                  d      s|j                  d      rt        d      |j                  d      s-|j                  d      s|j                  d      st        d      |j                  d      }|r|j                  d      s|j                  d      rt        d      dd	d
d	t        	j                               t        	j	                               z   }dj                  	j                         D cg c]  }d| d
 c}      }dj                  	j	                         D cg c]  }d| d
 c}      }|D ]  }||vst        d| d| d|        dt        dt        f	fd}|D cg c]
  } ||       c}|d<   |S c c}w c c}w c c}w )zDValidate that either folder_id or document_ids is set, but not both.r   r   r   zICannot specify both folder_id and document_ids nor folder_id and file_idsz8Must specify either folder_id, document_ids, or file_idsr   zdfile_types can only be given when folder_id is given, (not when document_ids or file_ids are given).$application/vnd.google-apps.document'application/vnd.google-apps.spreadsheetapplication/pdf)documentsheetpdfz, 'zGiven file type z) is not supported. Supported values are: z; and their full-form names: xr$   c                     | v r|    S | S )N )r-   type_mappings    o/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/document_loaders/googledrive.py	full_formz4GoogleDriveLoader.validate_inputs.<locals>.full_forma   s    *+|*;|ABB    )get
ValueErrorlistkeysr#   joinr   )
clsr#   r   allowed_typesr-   short_names
full_names	file_typer2   r0   s
            @r1   validate_inputsz!GoogleDriveLoader.validate_inputs7   s    ::k"JJ~&&**Z*@) 
 

;'JJ~.JJz*WXXZZ-
zz.)VZZ
-C F 
 CB(L
 !!2!2!45\=P=P=R8SSM))|7H7H7J$K!q1X$KLKl6I6I6K#Las!H#LMJ' 	M1$*9+ 611< >22<? CS CS C KU#UYIi$8#UF<  %L#L $Vs   F&F+F0vkwargsc                 D    |j                         st        d| d      |S )z&Validate that credentials_path exists.zcredentials_path z does not exist)existsr5   )r9   r?   r@   s      r1   validate_credentials_pathz+GoogleDriveLoader.validate_credentials_pathg   s'     xxz0?CDDr3   c                 ~   	 ddl m} ddlm} ddlm} ddlm} ddlm	} d}| j                  j                         r4|j                  j                  t        | j                        t        	      S | j                   j                         r)|j#                  t        | j                         t              }|r|j$                  s|r/|j&                  r#|j(                  r|j+                   |              nU| j,                  j                         r;|j/                  t        | j,                        t              }|j1                  d
      }|r>t3        | j                   d      5 }|j5                  |j7                                ddd       |s |t        	      \  }}	|S # t        $ r t        d      w xY w# 1 sw Y   5xY w)a?  Load credentials.
        The order of loading credentials:
        1. Service account key if file exists
        2. Token path (for OAuth Client) if file exists
        3. Credentials path (for OAuth Client) if file exists
        4. Default credentials. if no credentials found, raise DefaultCredentialsError
        r   )default)Request)service_account)Credentials)InstalledAppFlowzYou must run `pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib` to use the Google Drive loader.N)scopes)portw)google.authrE   google.auth.transport.requestsrF   google.oauth2rG   google.oauth2.credentialsrH   google_auth_oauthlib.flowrI   ImportErrorr   rB   from_service_account_filer   SCOPESr   from_authorized_user_filevalidexpiredrefresh_tokenrefreshr   from_client_secrets_filerun_local_serveropenwriteto_json)
selfrE   rF   rG   rH   rI   credsflowtoken_s
             r1   _load_credentialsz#GoogleDriveLoader._load_credentialsn   sq   	+>5=B ##**,"..HHD,,-f I  
 ??!!#99#doo:NPVWEEKK5+>+>gi(&&--/'@@--. --1-5$//3/ 15KK01 f-HE1I  	2 	:1 1s   F  F3F03F<idc           	         ddl m} | j                         } |dd|      }|j                         j	                  |      j                         }|j	                  dg       }g }|D ]   }|d   d   }	|j                         j                         j	                  ||		      j                         }
|
j	                  d
g       }|s^|d   }t        |dd d      D ]  \  }}d| d|d   d    |d   d    d|	 |d}g }t        |      D ]L  \  }}t        |      |kD  r||   j                         nd}|j                  | d|j                                 N dj                  |      }|j                  t        ||              # |S )z%Load a sheet and all tabs from an ID.r   buildsheetsv4credentials)spreadsheetId
propertiestitle)rm   ranger#      N)startz'https://docs.google.com/spreadsheets/d/z
/edit?gid=sheetIdz - )sourcero   row z: 
page_contentmetadata)googleapiclient.discoveryrh   rd   spreadsheetsr4   executer#   	enumeratelenstripappendr8   r   )r_   re   rh   r`   sheets_servicespreadsheetri   	documentsr*   
sheet_nameresultr#   headeriru   rz   contentjr?   ro   ry   s                        r1   _load_sheet_from_idz%GoogleDriveLoader._load_sheet_from_id   s    	4&&(x5A$11377b7IQQS2.	 	YE|,W5J++-2Z8	  ZZ"-FAYF#F12Ja8 Y3 B" F$$),$7	$B#CE !,L 9' BC3zlS %cN <DAq14VqF1IOO-bENNeWBqwwyk#:;<  $yy1  |h!WXY	Y< r3   c                    ddl m} ddlm} ddlm} ddlm} | j                         } |dd|      }|j                         j                  |d	d
      j                         }|j                         j                  |d      }	 |       }
 ||
|	      }d}	 |du r|j                         \  }}|du r|
j%                         j'                  d      }d| d|j                  d       |j                  d       d}t)        ||      S # |$ rX}|j                  j                  dk(  rt!        dj#                  |             nt!        dj#                  |             Y d}~d}~ww xY w)zLoad a document from an ID.r   BytesIOrg   )	HttpErrorMediaIoBaseDownloaddrivev3rk   TzmodifiedTime,name)fileIdsupportsAllDrivesfieldsz
text/plain)r   mimeTypeFi  zFile not found: {}zAn error occurred: {}Nzutf-8z#https://docs.google.com/document/d/z/editnamemodifiedTime)rt   ro   whenrx   )ior   r{   rh   googleapiclient.errorsr   googleapiclient.httpr   rd   filesr4   r}   export_media
next_chunkrespstatusprintformatgetvaluedecoder   )r_   re   r   rh   r   r   r`   servicefilerequestfh
downloaderdoner   etextrz   s                    r1   _load_document_from_idz(GoogleDriveLoader._load_document_from_id   sQ   34<&&(59 MMOSd;NSOWY 	
 --/..b<.PY(W5
	9%-)446 %- {{}##G,;B4uE()xx/0

 TH==  	9vv}}#*11"56-44Q78		9s   D
 
E'AE""E'r   c                   ddl m} | j                         } |dd|      }| j                  ||      }|r|D cg c]  }|d   |v s| }}n|}g }	|D ]  }
|
d   r| j                  s|
d   dk(  r$|	j                  | j                  |
d	                A|
d   d
k(  r$|	j                  | j                  |
d	                m|
d   dk(  s| j                  $|	j                  | j                  |
d	                 |	S c c}w )zLoad documents from a folder.r   rg   r   r   rk   r   trashedr&   re   r'   r(   )r{   rh   rd   _fetch_files_recursiver   r   r   extendr   r   _load_file_from_id)r_   r   r   rh   r`   r   r   f_filesreturnsr   s              r1   _load_documents_from_folderz-GoogleDriveLoader._load_documents_from_folder   s    	4&&(59++GY?!&FA!J-:*EaFFFF 	DIt'>'>j!%KKt::4:FGj!%NNt77T
CDZ $55''3t66tDzBC	 ' Gs   C=C=r   c                 >   |j                         j                  d| ddddd      j                         }|j                  dg       }g }|D ]M  }|d   d	k(  r2| j                  s|j                  | j                  ||d
                =|j                  |       O |S )z+Fetch all files and subfolders recursively.r,   z' in parentsi  Tz:nextPageToken, files(id, name, mimeType, parents, trashed))qpageSizeincludeItemsFromAllDrivesr   r   r   r   z"application/vnd.google-apps.folderre   )r   r6   r}   r4   r   r   r   r   )r_   r   r   resultsr   r   r   s          r1   r   z(GoogleDriveLoader._fetch_files_recursive  s    
 MMOTi[-*."&S   WY 	 GR( 	%DJ#GG>>NN4#>#>wT
#STt$	% r3   c                     | j                   st        d      | j                   D cg c]  }| j                  |       c}S c c}w )z"Load documents from a list of IDs.zdocument_ids must be set)r   r5   r   )r_   doc_ids     r1   _load_documents_from_idsz*GoogleDriveLoader._load_documents_from_ids.  s<      788BFBSBST++F3TTTs   Ac                    ddl m} ddlm} ddlm} | j                         } |dd|      }|j                         j                  |d	      j                         }|j                         j                  |
      } |       }	 ||	|      }
d}|du r|
j                         \  }}|du r| j                  |	j                  d        | j                  dd|	i| j                  }|j                         }|D ]C  }d| d|j                   d<   d|j                   vs%|j                  d       |j                   d<   E |S ddlm} |	j'                         } | ||            }t)        |j*                        D cg c]8  \  }}t-        |j/                         d| d|j                  d       |d      : c}}S c c}}w )zLoad a file from an ID.r   r   rg   r   r   r   rk   T)r   r   )r   Fr   z https://drive.google.com/file/d/z/viewrt   ro   r   )	PdfReader)rt   ro   pagerx   r/   )r   r   r{   rh   r   r   rd   r   r4   r}   	get_mediar   r   seekr    loadrz   PyPDF2r   r   r~   pagesr   extract_text)r_   re   r   rh   r   r`   r   r   r   r   r   r   r   loaderdocsdocr   r   
pdf_readerr   r   s                        r1   r   z$GoogleDriveLoader._load_file_from_id5  s   3<&&(59}}""""EMMO--/++2+6Y(W5
em%002LFD em +GGAJ)T))MrMT5L5LMF;;=D B+KB4u)UX&#,,./3xx/?.@CLL)B K )kkmG"77#34J  ))9)9:
 At !%!2!2!4$DRD"N$(HHV$4#5 !
 
 
s   <=F=c                     | j                   st        d      g }| j                   D ]"  }|j                  | j                  |             $ |S )zLoad files from a list of IDs.zfile_ids must be set)r   r5   r   r   )r_   r   file_ids      r1   _load_file_from_idsz%GoogleDriveLoader._load_file_from_idsc  sI    }}344}} 	:GKK//89	:r3   c                     | j                   r'| j                  | j                   | j                        S | j                  r| j	                         S | j                         S )zLoad documents.r   )r   r   r   r   r   r   )r_   s    r1   r   zGoogleDriveLoader.loadl  sW    >>334?? 4   0022++--r3   ))__name__
__module____qualname____doc__r   homer   __annotations__r   r   r   r   r   r   r   r   r   boolr   r   r   r   r   r    r   r   classmethodr>   r   rC   rd   r   r   r   r   r	   r   r   r   r   r   r/   r3   r1   r   r      sN    0 )		n <{ JJ/&TYY[>9<NNdN' tyy{^3lBJB!#Ix}#%(,L(49%,($(HhtCy!($ItL*.J#'.G$$N  OS'+-UCZ(-((#,T#s(^ , ,  $,\ !"#    #33 3j)c )d8n )V$> $> $>N HL-5hsm-D	h@'*	d3c49n--.	/4U$x. U,S ,T(^ ,\T(^ 	.d8n 	.r3   r   N)pathlibr   typingr   r   r   r   r   r	   langchain_core._api.deprecationr
   langchain_core.documentsr   pydanticr   r   r   )langchain_community.document_loaders.baser   rT   r   r/   r3   r1   <module>r      sU     = = 6 - : : @
:	; 
E
Z.
I Z.
Z.r3   