§
    µBÄjâ5  ã                  ód  — d dl mZ d dlZd dlmZ d dlZd dlZd dl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 d dlZd dl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 ddlmZ ddlmZ  edd¬¦  «         G d„ d¦  «        ¦   «         Zd8d„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 d9d:d0„Zd;d1„Z d<d6„Z!d=d7„Z"dS )>é    )ÚannotationsN)Ú	dataclass)Úfield)Ú
HTTPStatus)ÚClassVar)ÚFinalé   )ÚGoogleDriveFileToDownload)Ú_get_session)Ú_sanitize_filename)Ú_validate_retries)Údownload)ÚDownloadError)Ú_parse_google_drive_folder_idTF)Úkw_onlyÚeqc                  ó˜   — e Zd ZU ded<   ded<   ded<    ee¬¦  «        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dS )Ú_GoogleDriveFileÚstrÚidÚnameÚtype)Údefault_factoryzlist[_GoogleDriveFile]Úchildrenz"application/vnd.google-apps.folderzClassVar[str]ÚTYPE_FOLDERz$application/vnd.google-apps.documentÚTYPE_DOCUMENTz'application/vnd.google-apps.spreadsheetÚTYPE_SPREADSHEETz(application/vnd.google-apps.presentationÚTYPE_PRESENTATIONÚreturnÚboolc                ó"   — | j         | j        k    S )N)r   r   ©Úselfs    úFC:\Projects\Historical\venv\Lib\site-packages\gdown/download_folder.pyÚ	is_folderz_GoogleDriveFile.is_folder(   s   € ØŒy˜DÔ,Ò,Ð,ó    c                ó`   — | j                              d¦  «        o|                      ¦   «          S )Núapplication/vnd.google-apps.)r   Ú
startswithr%   r"   s    r$   Úis_google_nativez!_GoogleDriveFile.is_google_native+   s5   € ð Œy×#Ò#Ð$BÑCÔCð 
Ø�NŠNÑÔðI
ð 	
r&   N)r   r    )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   Úlistr   r   r   r   r   r%   r*   © r&   r$   r   r      sÀ   € € € € € € à€G€G�GØ€I€I�IØ€I€I�IØ', u¸TÐ'BÑ'BÔ'B€HÐBÐBÐBÑBð "F€KÐEÐEÐEÑEØ#I€MÐIÐIÐIÑIØ&OÐÐOÐOÐOÑOØ'QÐÐQÐQÐQÑQð-ð -ð -ð -ð
ð 
ð 
ð 
ð 
ð 
r&   r   Úgdrive_fileÚprevious_pathr   r   ú)list[tuple[_GoogleDriveFile | None, str]]c                óÈ  — g }| j         D ]×}t          |j        ¬¦  «        |_        |                     ¦   «         rq|                     d t          j        ||j        ¦  «        f¦  «         t          |t          j        ||j        ¦  «        ¬¦  «        D ]}|                     |¦  «         ŒŒ¡|j         s/|                     |t          j        ||j        ¦  «        f¦  «         ŒØ|S )N©Úfilename©r1   r2   )r   r   r   r%   ÚappendÚospÚjoinÚ_get_directory_structure)r1   r2   Údirectory_structureÚfileÚis        r$   r;   r;   3   s÷   € ð ÐØÔ$ð 
Sð 
SˆÝ&°´	Ð:Ñ:Ô:ˆŒ	Ø�>Š>ÑÔð 	SØ×&Ò&¨­c¬h°}ÀdÄiÑ.PÔ.PÐ'QÑRÔRÐRÝ-Ø Ý!œh }°d´iÑ@Ô@ðñ ô ð .ð .�ð $×*Ò*¨1Ñ-Ô-Ð-Ð-ð	.ð
 ”ð 	SØ×&Ò&¨­c¬h°}ÀdÄiÑ.PÔ.PÐ'QÑRÔRÐRøØÐr&   Úurlú
str | Noner   ÚoutputÚquietr    ÚproxyÚspeedúfloat | NoneÚuse_cookiesÚverifyú
bool | strÚ
user_agentÚskip_downloadÚresumeÚcookies_fileÚtimeoutú"float | tuple[float, float] | NoneÚretriesÚintú+list[str] | list[GoogleDriveFileToDownload]c                óè  — t          |¬¦  «         |du | du z  st          d¦  «        ‚|€| €J ‚t          | ¬¦  «        }n|}d}t          |||€|n||¬¦  «        \  }}	 |st	          dt
          j        ¬¦  «         t          |||||¬	¦  «        }|                     ¦   «          n# |                     ¦   «          w xY wt          |j
        ¬
¦  «        |_
        |s6t	          dt
          j        ¬¦  «         t	          dt
          j        ¬¦  «         t          |d¬¦  «        }|st	          dt
          j        ¬¦  «         |€ t          j        ¦   «         t          j        z   }|                     t          j        ¦  «        rt          j        ||j
        ¦  «        }n|}|	s(t          j        |¦  «        st          j        |¦  «         g }g }|D �]Ö\  }}t          j        ||¦  «        }|€+|	s(t          j        |¦  «        st          j        |¦  «         ŒH|	r?|                     ¦   «         s+|                     t-          |j        ||¬¦  «        ¦  «         Œ‰|}|                     ¦   «         r%|	rdn t          j        |¦  «        t          j        z   }	 t3          d|j        z   |||||||
|||	||¬¦  «        }nS# t4          $ rF}|	r‚ |                     |¦  «         |s!t	          d|› d|› �t
          j        ¬¦  «         Y d}~�Œ5d}~ww xY w|	r‚t7          |t,          ¦  «        sJ ‚t          j        t          j        |¦  «        |j        ¦  «        }|                     t-          |j        |t          j        ||¦  «        ¬¦  «        ¦  «         �ŒÁ|                     |¦  «         �ŒØ|r/t5          dd                     d„ |D ¦   «         ¦  «        z   ¦  «        ‚|st	          dt
          j        ¬¦  «         |S )aB	  Downloads entire folder from URL.

    Parameters
    ----------
    url:
        URL of the Google Drive folder.
        Must be of the format 'https://drive.google.com/drive/folders/{url}'.
    id:
        Google Drive's folder ID.
    output:
        String containing the path of the output folder.
        Defaults to current working directory.
    quiet:
        Suppress terminal output.
    proxy:
        Proxy.
    speed:
        Download byte size per second (e.g., 256KB/s = 256 * 1024).
    use_cookies:
        Flag to use cookies. Default is True.
    verify:
        Either a bool, in which case it controls whether the server's TLS
        certificate is verified, or a string, in which case it must be a path
        to a CA bundle to use. Default is True.
    user_agent:
        User-agent to use in the HTTP request.
    skip_download:
        If True, return the list of files to download without downloading them.
        Defaults to False.
    resume:
        Resume interrupted transfers.
        Completed output files will be skipped.
        Partial tempfiles will be reused, if the transfer is incomplete.
        Default is False.
    cookies_file:
        Netscape cookies file to load when a session opens and save after
        every Google Drive file response. Default is
        ~/.cache/gdown/cookies.txt. Ignored when use_cookies is False.
    timeout:
        Seconds to wait for the server between bytes, either as a single
        value or as a (connect, read) pair, as in requests. Default is None,
        which waits forever.
    retries:
        Additional attempts per file for transient network failures. Default is
        zero. Retries resume the current transfer; resume=True also reuses earlier
        downloads. Folder discovery and skip_download do not retry.

    Returns
    -------
    files:
        If skip_download is False, list of local file paths downloaded.
        If skip_download is True, list of GoogleDriveFileToDownload that contains
        id, path, and local_path.

    Raises
    ------
    ValueError
        If neither url nor id is specified, or both are specified.
    DownloadError
        If a file in the folder fails to download.

    Example
    -------
    gdown.download_folder(
        "https://drive.google.com/drive/folders/" +
        "1ZXEhzbLRLU1giKKRJkjm8N04cO_JoYE2",
    )
    )rO   Nz$Either url or id has to be specified©r?   zyMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36)rC   rF   rI   rL   zRetrieving folder contents)r=   ©ÚsessÚ	folder_idrB   rG   rM   r5   z$Retrieving folder contents completedzBuilding directory structureÚ r7   z&Building directory structure completed)r   ÚpathÚ
local_pathzhttps://drive.google.com/uc?id=)r?   rA   rB   rC   rD   rF   rG   rK   rL   rI   rJ   rM   rO   zFailed to download z: z(Failed to download the following files:
ú
c              3  ó    K  — | ]	}d |› �V — Œ
dS )z- Nr0   )Ú.0rX   s     r$   ú	<genexpr>z"download_folder.<locals>.<genexpr>
  s(   è è € Ð=Ð=¨˜˜T˜˜Ð=Ð=Ð=Ð=Ð=Ð=r&   zDownload completed)r   Ú
ValueErrorÚ_extract_folder_idr   ÚprintÚsysÚstderrÚ%_download_and_parse_google_drive_linkÚcloser   r   r;   ÚosÚgetcwdr9   ÚsepÚendswithr:   ÚexistsÚmakedirsr*   r8   r
   r   Údirnamer   r   Ú
isinstancerX   )r?   r   rA   rB   rC   rD   rF   rG   rI   rJ   rK   rL   rM   rO   rV   ÚFOLDER_USER_AGENTrU   Ú_r1   r<   Úroot_dirÚfilesÚfailed_pathsrX   rY   Údownload_outputÚdownloaded_fileÚes                               r$   Údownload_folderru   F   s©  € õh ˜gÐ&Ñ&Ô&Ð&Ø�$ˆJ˜3 $˜;Ñ'ð AÝÐ?Ñ@Ô@Ð@Ø	€zØˆˆˆÝ&¨3Ð/Ñ/Ô/ˆ	ˆ	àˆ	ð  [ÐÝØØà(2Ð(:Ð$Ð$À
Ø!ðñ ô �G€Dˆ!ðØð 	AÝÐ.µS´ZÐ@Ñ@Ô@Ð@Ý;ØØØØØð
ñ 
ô 
ˆð 	�
Š
‰Œˆˆøˆ�
Š
‰Œˆˆøøøå)°;Ô3CÐDÑDÔD€KÔàð ?ÝÐ4½3¼:ÐFÑFÔFÐFÝÐ,µ3´:Ð>Ñ>Ô>Ð>Ý2Ø¨rðñ ô Ðð ð IÝÐ6½S¼ZÐHÑHÔHÐHà€~Ý”‘”�sœwÑ&ˆØ‡‚•s”wÑÔð Ý”8˜F KÔ$4Ñ5Ô5ˆˆàˆØð ¥¤¨HÑ!5Ô!5ð Ý
Œ�HÑÔÐà€EØ €LØ0ð 9*ñ 9*Ñˆ�TÝ”X˜h¨Ñ-Ô-ˆ
àÐØ ð (­¬°JÑ)?Ô)?ð (Ý”˜JÑ'Ô'Ð'Øàð 	 ×!=Ò!=Ñ!?Ô!?ð 	Ø�LŠLÝ)Ø"”~¨D¸Zðñ ô ñô ð ð
 à$ˆØ×'Ò'Ñ)Ô)ð 	ð &ÐL��­3¬;°zÑ+BÔ+BÅSÄWÑ+Lð ð	Ý&Ø5¸¼ÑFØ&ØØØØ'ØØØ)Ø%Ø+ØØðñ ô ˆOˆOøõ ð 	ð 	ð 	Øð ØØ×Ò 
Ñ+Ô+Ð+Øð PÝÐ=¨JÐ=Ð=¸!Ð=Ð=ÅCÄJÐOÑOÔOÐOØˆHˆHˆH‰Høøøøð	øøøð ð 	*Ý˜oÕ/HÑIÔIÐIÐIÐIÝ”8�CœK¨Ñ-Ô-¨Ô/CÑDÔDˆDØ�LŠLÝ)Ø"”~ØÝ"œx¨°$Ñ7Ô7ðñ ô ñô ð ñ ð �LŠL˜Ñ)Ô)Ð)Ñ)Øð 
ÝØ7Ø�iŠiÐ=Ð=°Ð=Ñ=Ô=Ñ=Ô=ñ>ñ
ô 
ð 	
ð ð 5ÝÐ"­¬Ð4Ñ4Ô4Ð4Ø€Ls$   Á1B% Â%B;Ê$J6Ê6
LË ;LÌLc                óÂ   — t          | ¬¦  «        pOt          j                             | ¦  «        j                             d¦  «                             d¦  «        d         S )NrS   ú/éÿÿÿÿ)r   ÚurllibÚparseÚurlparserX   ÚrstripÚsplitrS   s    r$   r_   r_     sR   € å%¨#Ð.Ñ.Ô.ð 	FÝŒ<× Ò  Ñ%Ô%Ô*×1Ò1°#Ñ6Ô6×<Ò<¸SÑAÔAÀ"ÔEðr&   rU   úrequests.SessionrV   ú&tuple[str, list[tuple[str, str, str]]]c                óP  — t           j                             d|i¦  «        }d|› �}|                      |||¬¦  «        }|j        t
          j        k    rt          d|› d|j        › d�¦  «        ‚t          j	        |j
        d¬¦  «        }|j        �|j        j        €t          d	|› d
�¦  «        ‚|j        j        }g }	|                     d¬¦  «        D �]N}
|
                     dd¦  «        }t          |t          ¦  «        sŒ/t!          j        d|¬¦  «        }|rD|                     d¦  «        }|
                     d¬¦  «        }|	                     ||df¦  «         Œ‹t!          j        d|¬¦  «        }|r_|                     ¦   «         \  }}|
                     d¬¦  «        }d|                     d¦  «        z   }|	                     |||f¦  «         �Œt/          |¬¦  «        }|�:|
                     d¬¦  «        }|	                     ||t0          j        f¦  «         �ŒN�ŒP||	fS )Nr   z,https://drive.google.com/embeddedfolderview?)rG   rM   z2Failed to retrieve folder contents for folder ID: z (status code z¥). You may need to change the permission to 'Anyone with the link', or have had many accesses. Check FAQ in https://github.com/wkentaro/gdown?tab=readme-ov-file#faq.zhtml.parser)Úfeaturesz/Failed to parse folder contents for folder ID: z&. The page structure may have changed.Úa)r   ÚhrefrW   z3https://drive\.google\.com/file/d/([-\w]{25,})/view)ÚpatternÚstringr	   T)Ústripzapplication/octet-streamz/https://docs\.google\.com/(\w+)/d/([-\w]{25,})/r(   ÚsrS   )ry   rz   Ú	urlencodeÚgetÚstatus_coder   ÚOKr   Úbs4ÚBeautifulSoupÚtextÚtitler…   Úfind_allrl   r   ÚreÚmatchÚgroupÚget_textr8   ÚgroupsÚremovesuffixr   r   r   )rU   rV   rG   rM   Úparamsr?   ÚresÚsoupÚfolder_namer   Úa_tagrƒ   Ú
file_matchÚfile_idÚ	file_nameÚ
docs_matchÚkindÚ	file_typeÚchild_folder_idÚ
child_names                       r$   Ú_parse_embedded_folder_viewr¤     s  € õ Œ\×#Ò# T¨9Ð$5Ñ6Ô6€FØ
A¸Ð
AÐ
A€CØ
�(Š(�3˜v¨wˆ(Ñ
7Ô
7€CØ
„�*œ-Ò'Ð'ÝðUÀð Uð UØœOðUð Uð Uñ
ô 
ð 	
õ Ô˜SœX°Ð>Ñ>Ô>€Dà„zÐ˜TœZÔ.Ð6Ýð3¸ið 3ð 3ð 3ñ
ô 
ð 	
ð ”*Ô#€Kà+-€HØ—’ C�Ñ(Ô(ð  ñ  ˆØ�yŠy˜ Ñ$Ô$ˆÝ˜$¥Ñ$Ô$ð 	Øå”XØJØð
ñ 
ô 
ˆ
ð ð 	Ø ×&Ò& qÑ)Ô)ˆGØŸš¨T˜Ñ2Ô2ˆIØ�OŠO˜W iÐ1KÐLÑMÔMÐMØõ ”XØFØð
ñ 
ô 
ˆ
ð ð 	Ø&×-Ò-Ñ/Ô/‰MˆD�'ØŸš¨T˜Ñ2Ô2ˆIà6¸×9JÒ9JÈ3Ñ9OÔ9OÑOˆIØ�OŠO˜W i°Ð;Ñ<Ô<Ð<Ùå7¸DÐAÑAÔAˆØÐ&ØŸš¨d˜Ñ3Ô3ˆJØ�OŠO˜_¨jÕ:JÔ:VÐWÑXÔXÐXÙñ 'ð
 ˜Ð"Ð"r&   c                óš  — t          | |||¬¦  «        \  }}t          ||t          j        ¬¦  «        }|D ]•\  }}	}
|
t          j        k    r>|st          d||	¦  «         |j                             t          ||	|
¬¦  «        ¦  «         ŒT|st          d||	¦  «         t          | ||||¬¦  «        }|j                             |¦  «         Œ–|S )N)rU   rV   rG   rM   )r   r   r   zProcessing filezRetrieving folderrT   )r¤   r   r   r`   r   r8   rc   )rU   rV   rB   rG   rM   rš   r   r1   Úchild_idr£   Ú
child_typeÚchilds               r$   rc   rc   Z  s9  € õ 8Ø˜Y¨v¸wðñ ô Ñ€K�õ #ØØÝÔ)ðñ ô €Kð -5ð +ð +Ñ(ˆ�*˜jØÕ)Ô5Ò5Ð5Øð ÝØ%ØØñô ð ð
 Ô ×'Ò'Ý ØØ#Ø#ðñ ô ñô ð ð àð 	ÝØ#ØØñô ð õ
 6ØØØØØð
ñ 
ô 
ˆð 	Ô×#Ò# EÑ*Ô*Ð*Ð*ØÐr&   )r1   r   r2   r   r   r3   )NNNFNNTTNFFNNr   )r?   r@   r   r@   rA   r@   rB   r    rC   r@   rD   rE   rF   r    rG   rH   rI   r@   rJ   r    rK   r    rL   r@   rM   rN   rO   rP   r   rQ   )r?   r   r   r   )
rU   r~   rV   r   rG   rH   rM   rN   r   r   )rU   r~   rV   r   rB   r    rG   rH   rM   rN   r   r   )#Ú
__future__r   re   Úos.pathrX   r9   r‘   ra   Úurllib.parsery   Údataclassesr   r   Úhttpr   Útypingr   r   rŒ   Úrequestsr   r
   r   r   r   Ú
exceptionsr   Ú	parse_urlr   r   r;   ru   r_   r¤   rc   r0   r&   r$   ú<module>r²      s$  ðØ "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à 
€
€
€
Ø €€€à /Ð /Ð /Ð /Ð /Ð /Ø "Ð "Ð "Ð "Ð "Ð "Ø (Ð (Ð (Ð (Ð (Ð (Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ð €�4˜EÐ"Ñ"Ô"ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ #Ô"ð
ð0ð ð ð ð( ØØØØØØØØ!ØØØ#Ø26ØðHð Hð Hð Hð HðVð ð ð ð?#ð ?#ð ?#ð ?#ðD1ð 1ð 1ð 1ð 1ð 1r&   