§
    šŠtjJ  ã                  ór  — d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ  ej        e¦  «        ZdgZ e G d„ d¦  «        ¦   «         Z!ddhZ"h d£Z#dd„Z$ G d„ de¦  «        Z% G d„ de¦  «        Z&e G d„ de¦  «        ¦   «         Z'dS )zLoads YouTube transcript.é    )ÚannotationsN)ÚEnum)ÚPath)ÚAnyÚDictÚ	GeneratorÚListÚOptionalÚSequenceÚUnion)Úparse_qsÚurlparse)Ú
ParseError)ÚDocument)Úmodel_validator)Ú	dataclass)Ú
BaseLoaderz0https://www.googleapis.com/auth/youtube.readonlyc                  óü   — e Zd ZU dZ ej        ¦   «         dz  dz  Zded<    ej        ¦   «         dz  dz  Zded<    ej        ¦   «         dz  dz  Z	ded<   dd„Z
 ed¬¦  «        edd„¦   «         ¦   «         Zdd„ZdS )ÚGoogleApiClientaØ  Generic Google API Client.

    To use, you should have the ``google_auth_oauthlib,youtube_transcript_api,google``
    python package installed.
    As the google api expects credentials you need to set up a google account and
    register your Service. "https://developers.google.com/docs/api/quickstart/python"

    *Security Note*: Note that parsing of the transcripts relies on the standard
        xml library but the input is viewed as trusted in this case.


    Example:
        .. code-block:: python

            from langchain_community.document_loaders import GoogleApiClient
            google_api_client = GoogleApiClient(
                service_account_path=Path("path_to_your_sec_file.json")
            )

    z.credentialszcredentials.jsonr   Úcredentials_pathÚservice_account_pathz
token.jsonÚ
token_pathÚreturnÚNonec                ó8   — |                       ¦   «         | _        d S ©N)Ú_load_credentialsÚcreds©Úselfs    új/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/document_loaders/youtube.pyÚ__post_init__zGoogleApiClient.__post_init__2   s   € Ø×+Ò+Ñ-Ô-ˆŒ
ˆ
ˆ
ó    Úbefore©ÚmodeÚvaluesr   c                ó–   — |j                              d¦  «        s)|j                              d¦  «        st          d¦  «        ‚|j         S )úDValidate that either folder_id or document_ids is set, but not both.r   r   ú-Must specify either channel_name or video_ids©ÚkwargsÚgetÚ
ValueError©Úclsr'   s     r!   Ú#validate_channel_or_videoIds_is_setz3GoogleApiClient.validate_channel_or_videoIds_is_set5   sT   € ð
 Œ}× Ò Ð!3Ñ4Ô4ð 	N¸V¼]×=NÒ=NØ"ñ>
ô >
ð 	Nõ ÐLÑMÔMÐMØŒ}Ðr#   c                ó6  — 	 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                             ¦   «         r,|j                             t          | j        ¦  «        ¦  «        S | j                             ¦   «         r-|                     t          | j        ¦  «        t"          ¦  «        }|r|j        sÅ|r,|j        r%|j        r|                      |¦   «         ¦  «         nC|                     t          | j        ¦  «        t"          ¦  «        }|                     d¬	¦  «        }t3          | j        d
¦  «        5 }|                     |                     ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   |S )zLoad credentials.r   )ÚRequest)Úservice_account)ÚCredentials)ÚInstalledAppFlow©ÚYouTubeTranscriptApiúœYou must run`pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib youtube-transcript-api` to use the Google Drive loaderN)ÚportÚw)Úgoogle.auth.transport.requestsr3   Úgoogle.oauth2r4   Úgoogle.oauth2.credentialsr5   Úgoogle_auth_oauthlib.flowr6   Úyoutube_transcript_apir8   ÚImportErrorr   ÚexistsÚfrom_service_account_fileÚstrr   Úfrom_authorized_user_fileÚSCOPESÚvalidÚexpiredÚrefresh_tokenÚrefreshÚfrom_client_secrets_filer   Úrun_local_serverÚopenÚwriteÚto_json)	r    r3   r4   r5   r6   r8   r   ÚflowÚtokens	            r!   r   z!GoogleApiClient._load_credentials@   s  € ð	Ø>Ð>Ð>Ð>Ð>Ð>Ø5Ð5Ð5Ð5Ð5Ð5Ø=Ð=Ð=Ð=Ð=Ð=ØBÐBÐBÐBÐBÐBØCÐCÐCÐCÐCÐCÐCøÝð 	ð 	ð 	Ýð1ñô ð ð	øøøð ˆØÔ$×+Ò+Ñ-Ô-ð 	Ø"Ô.×HÒHÝ�DÔ-Ñ.Ô.ñô ð ð Œ?×!Ò!Ñ#Ô#ð 	XØ×9Ò9½#¸d¼oÑ:NÔ:NÕPVÑWÔWˆEàð 		-˜EœKð 		-Øð 6˜œð 6¨5Ô+>ð 6Ø—’˜g˜g™iœiÑ(Ô(Ð(Ð(à'×@Ò@Ý˜Ô-Ñ.Ô.µñô �ð ×-Ò-°1Ð-Ñ5Ô5�Ý�d”o sÑ+Ô+ð -¨uØ—’˜EŸMšM™OœOÑ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð ˆs   ‚! ¡;Å(FÆFÆFN©r   r   ©r'   r   r   r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úhomer   Ú__annotations__r   r   r"   r   Úclassmethodr1   r   © r#   r!   r   r      sï   € € € € € € ðð ð* '˜TœY™[œ[¨>Ñ9Ð<NÑNÐÐNÐNÐNÑNØ!* ¤¡¤¨~Ñ!=Ð@RÑ!RÐÐRÐRÐRÑRØ �t”y‘{”{ ^Ñ3°lÑB€JÐBÐBÐBÑBð.ð .ð .ð .ð €_˜(Ð#Ñ#Ô#Øðð ð ñ „[ñ $Ô#ðð&ð &ð &ð &ð &ð &r#   r   ÚhttpÚhttps>   úvid.plusúyoutu.beúyoutube.comúm.youtube.comúwww.youtube.comúwww.youtube-nocookie.comÚurlrD   r   úOptional[str]c                ó¸  — t          | ¦  «        }|j        t          vrdS |j        t          vrdS |j        }|                     d¦  «        rD|j        }t          |¦  «        }d|v r(|d         }t          |t          ¦  «        r|n|d         }n7dS |j                             d¦  «        }|                     d¦  «        d         }t          |¦  «        dk    rdS |S )zEParse a YouTube URL and return the video ID if valid, otherwise None.Nz/watchÚvr   ú/éÿÿÿÿé   )r   ÚschemeÚALLOWED_SCHEMESÚnetlocÚALLOWED_NETLOCSÚpathÚendswithÚqueryr   Ú
isinstancerD   ÚlstripÚsplitÚlen)rd   Ú
parsed_urlro   rq   Úparsed_queryÚidsÚvideo_ids          r!   Ú_parse_video_idrz   t   sÝ   € å˜#‘”€JàÔ¥Ð/Ð/ØˆtàÔ¥Ð/Ð/ØˆtàŒ?€Dà‡}‚}�XÑÔð 
'ØÔ ˆÝ ‘”ˆØ�,ÐÐØ˜sÔ#ˆCÝ(¨­cÑ2Ô2Ð>�s�s¸¸A¼ˆHˆHà�4àŒ×%Ò% cÑ*Ô*ˆØ—:’:˜c‘?”? 2Ô&ˆå
ˆ8�}„}˜ÒÐØˆtà€Or#   c                  ó   — e Zd ZdZdZdZdZdS )ÚTranscriptFormatz3Output formats of transcripts from `YoutubeLoader`.ÚtextÚlinesÚchunksN)rT   rU   rV   rW   ÚTEXTÚLINESÚCHUNKSr[   r#   r!   r|   r|   ’   s#   € € € € € Ø=Ð=à€DØ€EØ€F€F€Fr#   r|   c                  ó‚   — e Zd ZdZdddej        ddfd&d„Zed'd„¦   «         Ze	d(d„¦   «         Z
d)d„Zd*d!„Zd+d#„Zd,d%„ZdS )-ÚYoutubeLoaderz!Load `YouTube` video transcripts.FÚenNéx   ry   rD   Úadd_video_infoÚboolÚlanguageúUnion[str, Sequence[str]]Útranslationre   Útranscript_formatr|   Úcontinue_on_failureÚchunk_size_secondsÚintc                óÄ   — || _         d|i| _        || _        || _        t	          |t
          ¦  «        r	|g| _        n|| _        || _        || _        || _        || _	        dS )z!Initialize with YouTube video ID.ÚsourceN)
ry   Ú	_metadatar‡   r‰   rr   rD   r‹   rŒ   r�   rŽ   )r    ry   r‡   r‰   r‹   rŒ   r�   rŽ   s           r!   Ú__init__zYoutubeLoader.__init__�   sp   € ð !ˆŒØ" HÐ-ˆŒØ,ˆÔØ ˆŒÝ�h¥Ñ$Ô$ð 	%Ø%˜JˆDŒMˆMà$ˆDŒMØ&ˆÔØ!2ˆÔØ#6ˆÔ Ø"4ˆÔÐÐr#   Úyoutube_urlr   c                óN   — t          | ¦  «        }|st          d| › d�¦  «        ‚|S )z*Extract video ID from common YouTube URLs.z.Could not determine the video ID for the URL "z".)rz   r.   )r”   ry   s     r!   Úextract_video_idzYoutubeLoader.extract_video_idµ   s@   € õ # ;Ñ/Ô/ˆØð 	ÝØPÀÐPÐPÐPñô ð ð ˆr#   r,   r   c                ó>   — |                       |¦  «        } | |fi |¤ŽS )z|Given a YouTube URL, construct a loader.
        See `YoutubeLoader()` constructor for a list of keyword arguments.
        )r–   )r0   r”   r,   ry   s       r!   Úfrom_youtube_urlzYoutubeLoader.from_youtube_url¿   s/   € ð
 ×'Ò'¨Ñ4Ô4ˆØˆs�8Ð&Ð&˜vÐ&Ð&Ð&r#   Úchunk_piecesú
List[Dict]Úchunk_start_secondsr   c                óü   — t          |d¦  «        \  }}t          |d¦  «        \  }}t          d                     t          d„ |¦  «        ¦  «        i | j        ¥||d›d|d›d|d›�d| j        › d|› d�d	œ¥¬
¦  «        S )z0Create Document from chunk of transcript pieces.é<   ú c                ó8   — | d                               d¦  «        S ©Nr}   rž   ©Ústrip)Úchunk_pieces    r!   ú<lambda>z4YoutubeLoader._make_chunk_document.<locals>.<lambda>Ï   s   € ¨°FÔ(;×(AÒ(AÀ#Ñ(FÔ(F€ r#   Ú02dú:ú https://www.youtube.com/watch?v=z&t=Ús)Ústart_secondsÚstart_timestampr‘   ©Úpage_contentÚmetadata)Údivmodr   ÚjoinÚmapr’   ry   )r    r™   r›   Úmr¨   Úhs         r!   Ú_make_chunk_documentz"YoutubeLoader._make_chunk_documentÇ   sÊ   € õ Ð)¨2Ñ.Ô.‰ˆˆ1Ý�a˜‰}Œ}‰ˆˆ1ÝØŸšÝÐFÐFÈÑUÔUñô ðØ”.ðà!4Ø&'Ð#=Ð#=Ð#=¨aÐ#=Ð#=Ð#=°aÐ#=Ð#=Ð#=ð-°4´=ð -ð -Ø)ð-ð -ð -ðð ð ð	
ñ 
ô 
ð 	
r#   Útranscript_piecesúGenerator[Document, None, None]c              #  ó,  K  — g }d}| j         }|D ]V}|d         |d         z   }||k    r(|r|                      ||¦  «        V — g }|}|| j         z  }|                     |¦  «         ŒWt          |¦  «        dk    r|                      ||¦  «        V — d S d S )Nr   ÚstartÚduration)rŽ   r³   Úappendru   )r    r´   r™   r›   Úchunk_time_limitÚtranscript_pieceÚ	piece_ends          r!   Ú_get_transcript_chunksz$YoutubeLoader._get_transcript_chunksÜ   sâ   è è € ð .0ˆØÐØÔ2ÐØ 1ð 		2ð 		2ÐØ(¨Ô1Ð4DÀZÔ4PÑPˆIØÐ+Ò+Ð+Øð WØ×3Ò3°LÐBUÑVÔVÐVÐVÐVØ!�Ø&6Ð#Ø  DÔ$;Ñ;Ð à×ÒÐ 0Ñ1Ô1Ð1Ð1åˆ|ÑÔ˜qÒ Ð Ø×+Ò+¨LÐ:MÑNÔNÐNÐNÐNÐNÐNð !Ð r#   úList[Document]c                óâ  — 	 ddl m}m}m}m} n# t
          $ r t          d¦  «        ‚w xY w| j        r.|                      ¦   «         }| j         	                    |¦  «         	  |¦   «          
                    | j        ¦  «        }n# |$ r g cY S w xY w	 |                     | j        ¦  «        }n!# |$ r |                     dg¦  «        }Y nw xY w| j        �|                     | j        ¦  «        }|                     ¦   «         }t#          ||¦  «        rd„ |j        D ¦   «         }	n|}	| j        t(          j        k    r;d                     t/          d„ |	¦  «        ¦  «        }t1          || j        ¬	¦  «        gS | j        t(          j        k    rt          t/          d
„ |	¦  «        ¦  «        S | j        t(          j        k    r"t          |                      |	¦  «        ¦  «        S t9          d¦  «        ‚)z1Load YouTube transcripts into `Document` objects.r   )ÚFetchedTranscriptÚNoTranscriptFoundÚTranscriptsDisabledr8   zvCould not import "youtube_transcript_api" Python package. Please install it with `pip install youtube-transcript-api`.r…   Nc                ó8   — g | ]}|j         |j        |j        d œ‘ŒS )©r}   r·   r¸   rÄ   )Ú.0Úsnippets     r!   ú
<listcomp>z&YoutubeLoader.load.<locals>.<listcomp>  sA   € ð !ð !ð !ð ð	 $œLØ$œ]Ø 'Ô 0ðð ð!ð !ð !r#   rž   c                ó8   — | d                               d¦  «        S r    r¡   ©r»   s    r!   r¤   z$YoutubeLoader.load.<locals>.<lambda>!  s   € Ð-=¸fÔ-E×-KÒ-KÈCÑ-PÔ-P€ r#   r«   c           
     ó²   — t          | d                              d¦  «        t          t          d„ |                      ¦   «         ¦  «        ¦  «        ¬¦  «        S )Nr}   rž   c                ó   — | d         dk    S )Nr   r}   r[   )Úitems    r!   r¤   z6YoutubeLoader.load.<locals>.<lambda>.<locals>.<lambda>-  s   € ¨T°!¬W¸Ò->€ r#   r«   )r   r¢   ÚdictÚfilterÚitemsrÉ   s    r!   r¤   z$YoutubeLoader.load.<locals>.<lambda>)  sZ   € ­XØ%5°fÔ%=×%CÒ%CÀCÑ%HÔ%HÝ!%Ý"Ø >Ð >Ð@P×@VÒ@VÑ@XÔ@Xñô ñ"ô "ð.ñ .ô .€ r#   zUnknown transcript format.)r@   rÀ   rÁ   rÂ   r8   rA   r‡   Ú_get_video_infor’   ÚupdateÚlistry   Úfind_transcriptr‰   r‹   Ú	translateÚfetchrr   ÚsnippetsrŒ   r|   r€   r¯   r°   r   r�   r‚   r½   r.   )
r    rÀ   rÁ   rÂ   r8   Ú
video_infoÚtranscript_listÚ
transcriptÚtranscript_objectr´   s
             r!   ÚloadzYoutubeLoader.loadð   s   € ð	ðð ð ð ð ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	ÝðOñô ð ð	øøøð Ôð 	.ð ×-Ò-Ñ/Ô/ˆJØŒN×!Ò! *Ñ-Ô-Ð-ð	Ø2Ð2Ñ4Ô4×9Ò9¸$¼-ÑHÔHˆOˆOøØ"ð 	ð 	ð 	ØˆIˆIˆIð	øøøð	AØ(×8Ò8¸¼ÑGÔGˆJˆJøØ ð 	Að 	Að 	AØ(×8Ò8¸$¸Ñ@Ô@ˆJˆJˆJð	Aøøøð ÔÐ'Ø#×-Ò-¨dÔ.>Ñ?Ô?ˆJØ&×,Ò,Ñ.Ô.ÐÝÐ'Ð):Ñ;Ô;ð 
	Hð!ð !ð  1Ô9ð!ñ !ô !ÐÐð 7HÐàÔ!Õ%5Ô%:Ò:Ð:ØŸšÝØPÐPØ%ñô ñô ˆJõ ¨*¸t¼~ÐNÑNÔNÐOÐOØÔ#Õ'7Ô'=Ò=Ð=ÝÝðð ð &ñ
ô 
ñô ð ð Ô#Õ'7Ô'>Ò>Ð>Ý˜×3Ò3Ð4EÑFÔFÑGÔGÐGõ Ð9Ñ:Ô:Ð:s,   ‚ �)Á""B ÂBÂBÂB. Â.CÃCr   c                ó   — 	 ddl m} n# t          $ r t          d¦  «        ‚w xY w |d| j        › �¦  «        }|j        pd|j        pd|j        pd|j        pd|j        r|j         	                    d¦  «        nd|j
        pd|j        pddœ}|S )záGet important video information.

        Components include:
            - title
            - description
            - thumbnail URL,
            - publish_date
            - channel author
            - and more.
        r   )ÚYouTubezVCould not import "pytube" Python package. Please install it with `pip install pytube`.r§   ÚUnknownz%Y-%m-%d %H:%M:%S)ÚtitleÚdescriptionÚ
view_countÚthumbnail_urlÚpublish_dateÚlengthÚauthor)ÚpytuberÝ   rA   ry   rß   rà   Úviewsrâ   rã   Ústrftimerä   rå   )r    rÝ   Úytr×   s       r!   rÐ   zYoutubeLoader._get_video_info:  sÜ   € ð	Ø&Ð&Ð&Ð&Ð&Ð&Ð&øåð 	ð 	ð 	Ýð?ñô ð ð	øøøð
 ˆWÐG¸¼ÐGÐGÑHÔHˆà”XÐ* Øœ>Ð6¨YØœ(˜- aØÔ-Ð:°àŒð˜BœO×4Ò4Ð5HÑIÔIÐIàØ”i�n 1Ø”iÐ, 9ð

ð 

ˆ
ð Ðs   ‚	 ‰#)ry   rD   r‡   rˆ   r‰   rŠ   r‹   re   rŒ   r|   r�   rˆ   rŽ   r�   )r”   rD   r   rD   )r”   rD   r,   r   r   r„   )r™   rš   r›   r�   r   r   )r´   rš   r   rµ   ©r   r¾   )r   r   )rT   rU   rV   rW   r|   r€   r“   Ústaticmethodr–   rZ   r˜   r³   r½   rÛ   rÐ   r[   r#   r!   r„   r„   š   sã   € € € € € Ø+Ð+ð
  %Ø.2Ø%)Ø.>Ô.CØ$)Ø"%ð5ð 5ð 5ð 5ð 5ð0 ðð ð ñ „\ðð ð'ð 'ð 'ñ „[ð'ð
ð 
ð 
ð 
ð*Oð Oð Oð Oð(H;ð H;ð H;ð H;ðTð ð ð ð ð r#   r„   c                  óà   — e Zd ZU dZded<   dZded<   dZded<   d	Zd
ed<   dZded<   dZ	d
ed<   d'd„Z
d(d„Z ed¬¦  «        ed)d„¦   «         ¦   «         Zd*d„Zd+d„Zd,d „Zd-d"„Zd.d%„Zd/d&„ZdS )0ÚGoogleApiYoutubeLoadera�  Load all Videos from a `YouTube` Channel.

    To use, you should have the ``googleapiclient,youtube_transcript_api``
    python package installed.
    As the service needs a google_api_client, you first have to initialize
    the GoogleApiClient.

    Additionally you have to either provide a channel name or a list of videoids
    "https://developers.google.com/docs/api/quickstart/python"



    Example:
        .. code-block:: python

            from langchain_community.document_loaders import GoogleApiClient
            from langchain_community.document_loaders import GoogleApiYoutubeLoader
            google_api_client = GoogleApiClient(
                service_account_path=Path("path_to_your_sec_file.json")
            )
            loader = GoogleApiYoutubeLoader(
                google_api_client=google_api_client,
                channel_name = "CodeAesthetic"
            )
            load.load()

    r   Úgoogle_api_clientNre   Úchannel_namezOptional[List[str]]Ú	video_idsTrˆ   r‡   r…   rD   Úcaptions_languageFr�   r   r   c                óN   — |                       | j        j        ¦  «        | _        d S r   )Ú_build_youtube_clientrî   r   Úyoutube_clientr   s    r!   r"   z$GoogleApiYoutubeLoader.__post_init__�  s$   € Ø"×8Ò8¸Ô9OÔ9UÑVÔVˆÔÐÐr#   r   r   c                ót   — 	 ddl m} ddlm} n# t          $ r t	          d¦  «        ‚w xY w |dd|¬¦  «        S )Nr   )Úbuildr7   r9   ÚyoutubeÚv3)Úcredentials)Úgoogleapiclient.discoveryrö   r@   r8   rA   )r    r   rö   r8   s       r!   ró   z,GoogleApiYoutubeLoader._build_youtube_client„  sy   € ð	Ø7Ð7Ð7Ð7Ð7Ð7ØCÐCÐCÐCÐCÐCÐCøÝð 	ð 	ð 	Ýð1ñô ð ð	øøøð ˆu�Y °%Ð8Ñ8Ô8Ð8s   ‚ �)r$   r%   r'   c                ó–   — |j                              d¦  «        s)|j                              d¦  «        st          d¦  «        ‚|j         S )r)   rï   rð   r*   r+   r/   s     r!   r1   z:GoogleApiYoutubeLoader.validate_channel_or_videoIds_is_set”  sL   € ð Œ}× Ò  Ñ0Ô0ð 	N¸¼×9JÒ9JÈ;Ñ9WÔ9Wð 	NÝÐLÑMÔMÐMØŒ}Ðr#   ry   c                ó@  — ddl m}m}  |¦   «                              |¦  «        }	 |                     | j        g¦  «        }n*# |$ r" |D ]}|                     | j        ¦  «        }ŒY nw xY w|                     ¦   «         }d                     d„ |D ¦   «         ¦  «        S )Nr   )rÁ   r8   rž   c                óD   — g | ]}|d                                d¦  «        ‘ŒS )r}   rž   r¡   )rÅ   Úts     r!   rÇ   zGGoogleApiYoutubeLoader._get_transcripe_for_video_id.<locals>.<listcomp>¨  s(   € ÐIÐIÐI°!˜˜6œŸš¨Ñ-Ô-ÐIÐIÐIr#   )	r@   rÁ   r8   rÒ   rÓ   rñ   rÔ   rÕ   r¯   )r    ry   rÁ   r8   rØ   rÙ   Úavailable_transcriptr´   s           r!   Ú_get_transcripe_for_video_idz3GoogleApiYoutubeLoader._get_transcripe_for_video_idœ  sÚ   € ØRÐRÐRÐRÐRÐRÐRÐRà.Ð.Ñ0Ô0×5Ò5°hÑ?Ô?ˆð	Ø(×8Ò8¸$Ô:PÐ9QÑRÔRˆJˆJøØ ð 	ð 	ð 	Ø(7ð ð Ð$Ø1×;Ò;¸DÔ<RÑSÔS�
Øðð ð	øøøð
 '×,Ò,Ñ.Ô.ÐØ�xŠxÐIÐIÐ7HÐIÑIÔIÑJÔJÐJs   §A Á$A*Á)A*r,   r   c                ó   — |                       |¦  «        }| j                             ¦   «                              d|¬¦  «                             ¦   «         }t          ||                     d¦  «        d         ¬¦  «        S )Nú
id,snippet©ÚpartÚidrÏ   r   r«   )r   rô   ÚvideosrÒ   Úexecuter   r-   )r    ry   r,   ÚcaptionsÚvideo_responses        r!   Ú_get_document_for_video_idz1GoogleApiYoutubeLoader._get_document_for_video_idª  sƒ   € Ø×4Ò4°XÑ>Ô>ˆàÔ×&Ò&Ñ(Ô(ßŠTØ!Øð ñ ô ÷ ŠW‰YŒYð 	õ Ø!Ø#×'Ò'¨Ñ0Ô0°Ô3ð
ñ 
ô 
ð 	
r#   c                óÂ   — | j                              ¦   «                              d|dd¬¦  «        }|                     ¦   «         }|d         d         d         d         }|S )Nr  Úchannelé   )r  ÚqÚtypeÚ
maxResultsrÏ   r   Ú	channelId)rô   ÚsearchrÒ   r  )r    rï   ÚrequestÚresponseÚ
channel_ids        r!   Ú_get_channel_idz&GoogleApiYoutubeLoader._get_channel_id¹  sg   € ØÔ%×,Ò,Ñ.Ô.×3Ò3ØØØØð	 4ñ 
ô 
ˆð —?’?Ñ$Ô$ˆØ˜gÔ& qÔ)¨$Ô/°Ô<ˆ
ØÐr#   r  c                óÆ   — | j                              ¦   «                              d|¬¦  «        }|                     ¦   «         }|d         d         d         d         d         S )NÚcontentDetailsr  rÏ   r   ÚrelatedPlaylistsÚuploads)rô   ÚchannelsrÒ   r  )r    r  r  r  s       r!   Ú_get_uploads_playlist_idz/GoogleApiYoutubeLoader._get_uploads_playlist_idÄ  sc   € ØÔ%×.Ò.Ñ0Ô0×5Ò5Ø!Øð 6ñ 
ô 
ˆð —?’?Ñ$Ô$ˆØ˜Ô  Ô#Ð$4Ô5Ð6HÔIÈ)ÔTÐTr#   r  r¾   c           	     ór  — 	 ddl m}m} n# t          $ r t          d¦  «        ‚w xY w|                      |¦  «        }|                      |¦  «        }| j                             ¦   «                              d|d¬¦  «        }g }|��1| 	                    ¦   «         }	|	d         D ]ä}
|
d         d	         d
         }d
|i}| j
        r6|
d                              d¦  «         |                     |
d         ¦  «         	 |                      |¦  «        }|                     t          ||¬¦  «        ¦  «         Œ’# ||t           f$ rC}| j        r0t$                               dd|
d         d
         › d|› �z   ¦  «         n|‚Y d }~ŒÝd }~ww xY w| j                             ¦   «                              ||	¦  «        }|�­1|S )Nr   )rÁ   rÂ   zTYou must run`pip install --upgrade youtube-transcript-api` to use the youtube loaderr  é2   )r  Ú
playlistIdr  rÏ   rÆ   Ú
resourceIdÚvideoIdÚ
thumbnailsr«   zError fetching transscript rž   r  z, exception: )r@   rÁ   rÂ   rA   r  r  rô   ÚplaylistItemsrÒ   r  r‡   ÚpoprÑ   r   r¹   r   r   r�   ÚloggerÚerrorr  Ú	list_next)r    r  r,   rÁ   rÂ   r  Úuploads_playlist_idr  rð   r  rÌ   ry   Ú	meta_datar¬   Úes                  r!   Ú_get_document_for_channelz0GoogleApiYoutubeLoader._get_document_for_channelÌ  sV  € ð	ðð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	Ýð,ñô ð ð	øøøð ×)Ò)¨'Ñ2Ô2ˆ
Ø"×;Ò;¸JÑGÔGÐØÔ%×3Ò3Ñ5Ô5×:Ò:ØØ*Øð ;ñ 
ô 
ˆð
 ˆ	ØÑ!Ø—’Ñ(Ô(ˆHð ! Ô)ð ð �Ø 	œ?¨<Ô8¸ÔC�Ø&¨Ð1�	ØÔ&ð 6Ø˜”O×'Ò'¨Ñ5Ô5Ð5Ø×$Ò$ T¨)¤_Ñ5Ô5Ð5ðØ#'×#DÒ#DÀXÑ#NÔ#N�LØ×$Ò$Ý Ø)5Ø%.ðñ ô ñô ð ð øð ,Ð->Å
ÐKð ð ð ØÔ/ð  ÝŸšØ9ØI $ t¤*¨YÔ"7ÐIÐIÀaÐIÐIñJñô ð ð ð
  ˜Ø�D�D�D�Døøøøðøøøð Ô)×0Ò0Ñ2Ô2×<Ò<¸WÀhÑOÔOˆGð7 Ñ!ð: Ðs    ‚ ‹%Ã:9D4Ä4FÅ9E?Å?Fc                óð   ‡ — g }‰ j         r.|                     ‰                      ‰ j         ¦  «        ¦  «         n=‰ j        r'|                     ˆ fd„‰ j        D ¦   «         ¦  «         nt	          d¦  «        ‚|S )zLoad documents.c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r[   )r
  )rÅ   ry   r    s     €r!   rÇ   z/GoogleApiYoutubeLoader.load.<locals>.<listcomp>  s7   ø€ ð ð ð à ð ×3Ò3°HÑ=Ô=ðð ð r#   r*   )rï   Úextendr+  rð   r.   )r    Údocument_lists   ` r!   rÛ   zGoogleApiYoutubeLoader.load  s£   ø€ àˆØÔð 
	NØ× Ò  ×!?Ò!?ÀÔ@QÑ!RÔ!RÑSÔSÐSÐSØŒ^ð 	NØ× Ò ðð ð ð à$(¤Nðñ ô ñô ð ð õ ÐLÑMÔMÐMØÐr#   rR   )r   r   r   r   rS   )ry   rD   r   rD   )ry   rD   r,   r   r   r   )rï   rD   r   rD   )r  rD   r   rD   )r  rD   r,   r   r   r¾   rê   )rT   rU   rV   rW   rY   rï   rð   r‡   rñ   r�   r"   ró   r   rZ   r1   r   r
  r  r  r+  rÛ   r[   r#   r!   rí   rí   \  sj  € € € € € € ðð ð8 'Ð&Ð&Ñ&Ø"&€LÐ&Ð&Ð&Ñ&Ø%)€IÐ)Ð)Ð)Ñ)Ø€NÐÐÐÑØ!ÐÐ!Ð!Ð!Ñ!Ø %ÐÐ%Ð%Ð%Ñ%ðWð Wð Wð Wð9ð 9ð 9ð 9ð  €_˜(Ð#Ñ#Ô#Øðð ð ñ „[ñ $Ô#ððKð Kð Kð Kð
ð 
ð 
ð 
ð	ð 	ð 	ð 	ðUð Uð Uð Uð3ð 3ð 3ð 3ðjð ð ð ð ð r#   rí   )rd   rD   r   re   )(rW   Ú
__future__r   ÚloggingÚenumr   Úpathlibr   Útypingr   r   r   r	   r
   r   r   Úurllib.parser   r   Úxml.etree.ElementTreer   Úlangchain_core.documentsr   Úpydanticr   Úpydantic.dataclassesr   Ú)langchain_community.document_loaders.baser   Ú	getLoggerrT   r%  rF   r   rl   rn   rz   r|   r„   rí   r[   r#   r!   ú<module>r<     s!  ðØ Ð à "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,à -Ð -Ð -Ð -Ð -Ð -Ø $Ð $Ð $Ð $Ð $Ð $Ø *Ð *Ð *Ð *Ð *Ð *à @Ð @Ð @Ð @Ð @Ð @à	ˆÔ	˜8Ñ	$Ô	$€à
<Ð	=€ð ðNð Nð Nð Nð Nñ Nô Nñ „ðNðb ˜7Ð#€ðð ð €ðð ð ð ð<ð ð ð ð �tñ ô ð ðð ð ð ð �Jñ ô ð ðD ðrð rð rð rð r˜Zñ rô rñ „ðrð rð rr#   