
    Ngn9                         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dS )    )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                   J   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(d	S )(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           	         |                     d          r9|                     d          s|                     d          rt          d          |                     d          s9|                     d          s$|                     d          st          d          |                     d          }|r*|                     d          s|                     d          rt          d          dd	d
dt                                                    t                                                    z   }d                    d                                 D                       }d                    d                                 D                       }|D ]}||vrt          d| d| d|           dt          dt          ffdfd|D             |d<   |S )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, c                     g | ]}d | d 	S ' .0xs     l/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/document_loaders/googledrive.py
<listcomp>z5GoogleDriveLoader.validate_inputs.<locals>.<listcomp>V   s     $K$K$K!XXXX$K$K$K    c                     g | ]}d | d 	S r-   r/   r0   s     r3   r4   z5GoogleDriveLoader.validate_inputs.<locals>.<listcomp>W   s     #L#L#LHHHH#L#L#Lr5   zGiven file type z) is not supported. Supported values are: z; and their full-form names: r2   r$   c                      | v r|          n| S )Nr/   )r2   type_mappings    r3   	full_formz4GoogleDriveLoader.validate_inputs.<locals>.full_forma   s    *+|*;*;|ABr5   c                 &    g | ]} |          S r/   r/   )r1   	file_typer9   s     r3   r4   z5GoogleDriveLoader.validate_inputs.<locals>.<listcomp>d   s#    #U#U#UYIIi$8$8#U#U#Ur5   )get
ValueErrorlistkeysr#   joinr   )	clsr#   r   allowed_typesshort_names
full_namesr;   r9   r8   s	          @@r3   validate_inputsz!GoogleDriveLoader.validate_inputs7   sb    ::k"" 	JJ~&&	*0**Z*@*@	 )  
 

;''	YJJ~..	Y JJz**	Y
 WXXXZZ--
 	Vzz.)) VZZ
-C-C  F  
 CB( L
 !!2!2!4!455\=P=P=R=R8S8SSM))$K$K|7H7H7J7J$K$K$KLLK#L#Ll6I6I6K6K#L#L#LMMJ'  	M11$?9 ? ?1<? ?2<? ?   2CS CS C C C C C C $V#U#U#U*#U#U#UF< r5   vkwargsc                 T    |                                 st          d| d          |S )z&Validate that credentials_path exists.zcredentials_path z does not exist)existsr=   )rA   rF   rG   s      r3   validate_credentials_pathz+GoogleDriveLoader.validate_credentials_pathg   s4     xxzz 	ECCCCDDDr5   c                    	 ddl m} ddlm} ddlm} ddlm} ddlm	} n# t          $ r t          d          w xY wd}| j                                        r3|j                            t          | j                  t          	          S | j                                        r-|                    t          | j                  t                    }|r|j        s|r,|j        r%|j        r|                     |                       n\| j                                        rC|                    t          | j                  t                    }|                    d
          }|rTt3          | j        d          5 }|                    |                                           ddd           n# 1 swxY w Y   |s |t          	          \  }}	|S )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.authrL   google.auth.transport.requestsrM   google.oauth2rN   google.oauth2.credentialsrO   google_auth_oauthlib.flowrP   ImportErrorr   rI   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)
selfrL   rM   rN   rO   rP   credsflowtoken_s
             r3   _load_credentialsz#GoogleDriveLoader._load_credentialsn   sd   	++++++>>>>>>555555======BBBBBBB 	 	 	2  	 #**,, 	".HHD,--f I   
 ?!!## 	X99#do:N:NPVWWE 
	1EK 
	1 6 65+> 6ggii((((&--// 6'@@-..  --1-55 1$/3// 15KK0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1  	.wf---HE1s   ! ;<(F00F47F4idc           	         ddl m} |                                 } |dd|          }|                                                    |                                          }|                    dg           }g }|D ]r}|d         d         }	|                                                                                    ||		                                          }
|
                    d
g           }|sw|d         }t          |dd         d          D ]\  }}d| d|d         d          |d         d          d|	 |d}g }t          |          D ]`\  }}t          |          |k    r||         	                                nd}|
                    | d|	                                            ad                    |          }|
                    t          ||                     ڐt|S )z%Load a sheet and all tabs from an ID.r   buildsheetsv4credentials)spreadsheetId
propertiestitle)rt   ranger#      N)startz'https://docs.google.com/spreadsheets/d/z
/edit?gid=sheetIdz - )sourcerv   row z: 
page_contentmetadata)googleapiclient.discoveryro   rk   spreadsheetsr<   executer#   	enumeratelenstripappendr@   r   )rf   rl   ro   rg   sheets_servicespreadsheetrp   	documentsr*   
sheet_nameresultr#   headerir|   r   contentjrF   rv   r   s                        r3   _load_sheet_from_idz%GoogleDriveLoader._load_sheet_from_id   s:    	433333&&((x5AAA$113377b7IIQQSS2..	 	Y 	YE|,W5J++--2Z88	  ZZ"--F AYF#F122Ja888 Y Y3E" E E$),$7	$BE E !,L 9' BSSzSS  %cNN < <DAq14VqF1IOO---bENNe#:#:qwwyy#:#:;;;;#yy11  |h!W!W!WXXXXY" r5   c                 T   ddl m} ddlm} ddlm} ddlm} |                                 } |dd|          }|	                                
                    |d	d
                                          }|	                                                    |d          }	 |            }
 ||
|	          }d}	 |du r|                                \  }}|du ng# |$ r_}|j        j        dk    r#t!          d                    |                     n"t!          d                    |                     Y d}~nd}~ww xY w|
                                                    d          }d| d|
                    d           |
                    d           d}t)          ||          S )zLoad a document from an ID.r   BytesIOrn   )	HttpErrorMediaIoBaseDownloaddrivev3rr   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)r{   rv   whenr   )ior   r   ro   googleapiclient.errorsr   googleapiclient.httpr   rk   filesr<   r   export_media
next_chunkrespstatusprintformatgetvaluedecoder   )rf   rl   r   ro   r   r   rg   servicefilerequestfh
downloaderdoner   etextr   s                    r3   _load_document_from_idz(GoogleDriveLoader._load_document_from_id   s   333333444444<<<<<<&&((%5999 MMOOSd;NSOOWYY 	
 --//..b<.PPWYY((W55
	9%--)4466 %--  	9 	9 	9v}##*11"556666-44Q77888		9 {{}}##G,,EBEEE((*xx//1
 

 TH====s   9C D=AD88D=r   c                H   ddl m} |                                 } |dd|          }|                     ||          }rfd|D             }n|}g }|D ]}	|	d         r| j        s|	d         d	k    r/|                    |                     |	d
                              M|	d         dk    r/|                    |                     |	d
                              |	d         dk    s| j	        /|                    | 
                    |	d
                              ʌ|S )zLoad documents from a folder.r   rn   r   r   rr   c                 (    g | ]}|d          v |S )r   r/   )r1   fr   s     r3   r4   zAGoogleDriveLoader._load_documents_from_folder.<locals>.<listcomp>   s'    FFFA!J-:*E*Ea*E*E*Er5   trashedr   r&   rl   r'   r(   )r   ro   rk   _fetch_files_recursiver   r   r   extendr   r   _load_file_from_id)
rf   r   r   ro   rg   r   r   _filesreturnsr   s
     `       r3   _load_documents_from_folderz-GoogleDriveLoader._load_documents_from_folder   sa    	433333&&((%5999++GY?? 	FFFFFFFFFF 	 	DI t'> j!%KKKt::4:FFGGGGj!%NNNt77T
CCDDDDZ $555'3t66tDzBBCCCCr5   r   c                 t   |                                                     d| ddddd                                          }|                    dg           }g }|D ]Z}|d         d	k    r7| j        r/|                    |                     ||d
                              E|                    |           [|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.folderrl   )r   r>   r   r<   r   r   r   r   )rf   r   r   resultsr   r   r   s          r3   r   z(GoogleDriveLoader._fetch_files_recursive  s    
 MMOOT-i---*."&S    WYY 	 GR(( 	% 	%DJ#GGG> UNN4#>#>wT
#S#STTTt$$$$r5   c                 V      j         st          d           fd j         D             S )z"Load documents from a list of IDs.zdocument_ids must be setc                 :    g | ]}                     |          S r/   )r   )r1   doc_idrf   s     r3   r4   z>GoogleDriveLoader._load_documents_from_ids.<locals>.<listcomp>3  s'    TTT++F33TTTr5   )r   r=   rf   s   `r3   _load_documents_from_idsz*GoogleDriveLoader._load_documents_from_ids.  s:      	97888TTTT$BSTTTTr5   c                 @   ddl m} ddlm} ddlm} |                                 } |dd|          }|                                                    d	          	                                |                                
                    
          } |            } |||          }	d}
|
du r|	                                \  }}
|
du | j        y|                    d            | j        dd|i| j        }|                                }|D ]7}d d|j        d<   d|j        vr                    d           |j        d<   8|S ddlm} |                                } | ||                    }fdt)          |j                  D             S )zLoad a file from an ID.r   r   rn   r   r   r   rr   T)r   r   )r   FNr    https://drive.google.com/file/d//viewr{   rv   r   )	PdfReaderc           	          g | ]D\  }}t          |                                d  d                    d           |d          ES )r   r   r   )r{   rv   pager   )r   extract_textr<   )r1   r   r   r   rl   s      r3   r4   z8GoogleDriveLoader._load_file_from_id.<locals>.<listcomp>W  sz     
 
 
 At !%!2!2!4!4"NR"N"N"N$(HHV$4$4!6 !   
 
 
r5   r/   )r   r   r   ro   r   r   rk   r   r<   r   	get_mediar   r   seekr    loadr   PyPDF2r   r   r   pages)rf   rl   r   ro   r   rg   r   r   r   r   r   r   loaderdocsdocr   r   
pdf_readerr   s    `                @r3   r   z$GoogleDriveLoader._load_file_from_id5  s
   333333<<<<<<&&((%5999}}""""EEMMOO--//++2+66WYY((W55
emm%0022LFD emm +GGAJJJ)T)MMrMT5LMMF;;==D B B)UB)U)U)UX&#,../3xx/?/?,ACL)K )(((((kkmmG"777#3#344J
 
 
 
 
  ))9::
 
 
 
r5   c                     | j         st          d          g }| j         D ]*}|                    |                     |                     +|S )zLoad files from a list of IDs.zfile_ids must be set)r   r=   r   r   )rf   r   file_ids      r3   _load_file_from_idsz%GoogleDriveLoader._load_file_from_idsc  sY    } 	53444} 	: 	:GKK//889999r5   c                     | j         r!|                     | j         | j                  S | j        r|                                 S |                                 S )zLoad documents.r   )r   r   r   r   r   r   r   s    r3   r   zGoogleDriveLoader.loadl  sc    > 	.334? 4     	.00222++---r5   ))__name__
__module____qualname____doc__r   homer   __annotations__r   r   r   r   r   r   r   r   r   boolr   r   r   r   r   r    r   r   classmethodrE   r   rJ   rk   r   r   r   r   r	   r   r   r   r   r   r/   r5   r3   r   r      sd         0/ )	n <{ JJJJ/&TY[[>9<NNdNNN' ty{{^3lBJBBB!#Ix}###%(,L(49%,,,($(HhtCy!((($ItL*.J#'...G$$$$N  OS'+-UCZ(---(_(###,T#s(^ , , , , [ $#,\ Y!""#      #"33 3 3 3 3j)c )d8n ) ) ) )V$> $> $> $> $> $>N HL  -5hsm-D	h   @'*	d3c49n--.	/   4U$x. U U U U,S ,T(^ , , , ,\T(^    	.d8n 	. 	. 	. 	. 	. 	.r5   r   N)pathlibr   typingr   r   r   r   r   r	   langchain_core._api.deprecationr
   langchain_core.documentsr   pydanticr   r   r   )langchain_community.document_loaders.baser   r[   r   r/   r5   r3   <module>r      s         = = = = = = = = = = = = = = = = 6 6 6 6 6 6 - - - - - - : : : : : : : : : : @ @ @ @ @ @
:	; 
E  
Z. Z. Z. Z. Z.
I Z. Z. 
Z. Z. Z.r5   