Ë
    ëÓ^j5  ã                   óž   — d Z ddlZddlZddlZddlZddlmZ ddlmZ  e«       Z	dZ
dedefd„Zded	edefd
„Zde
fdeded	edz  deddf
d„Zy)z)File download and MD5 validation helpers.é    N)Útqdm)Ú
get_loggerg      >@ÚfilepathÚreturnc                 óø   ‡— t        j                  «       }t        | d«      5 Št        ˆfd„d«      D ]  }|j	                  |«       Œ 	 ddd«       |j                  «       S # 1 sw Y   |j                  «       S xY w)z…Compute MD5 hash of a file.

    Args:
        filepath: Path to the file.

    Returns:
        MD5 hash as hexadecimal string.
    Úrbc                  ó&   •— ‰ j                  d«      S )Ni   )Úread)Úfs   €úa/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/utilities/files.pyú<lambda>z#_compute_file_md5.<locals>.<lambda>    s   ø€  !§&¡&¨£,€ ó    r   N)ÚhashlibÚmd5ÚopenÚiterÚupdateÚ	hexdigest)r   Úmd5_hashÚchunkr   s      @r   Ú_compute_file_md5r      sq   ø€ ô �{‰{‹}€HÜ	ˆh˜Ó	ð # ÜÓ.°Ó4ò 	#ˆEØ�O‰O˜EÕ"ñ	#÷#ð ×ÑÓÐ÷#ð ×ÑÓÐús   ¢&A!Á!A9Úexpected_md5c                 óš   — t         j                  j                  | «      syt        | «      }|j	                  «       |j	                  «       k(  S )zÔValidate that a file's MD5 hash matches the expected hash.

    Args:
        filepath: Path to the file.
        expected_md5: Expected MD5 hash.

    Returns:
        True if hash matches, False otherwise.
    F)ÚosÚpathÚexistsr   Úlower)r   r   Ú
actual_md5s      r   Ú_validate_file_md5r   %   s>   € ô �7‰7�>‰>˜(Ô#Øä" 8Ó,€JØ×ÑÓ ×!3Ñ!3Ó!5Ñ5Ð5r   ÚurlÚfilenameÚtimeoutc           	      óê  — t         j                  j                  |«      rV|rTt        ||«      rt        j                  d|› d�«       yt        j                  d|› d�«       t        j                  |«       t        j                  | d|¬«      }|j                  «        |j                  j                  d«      }	 |�t        |«      nd}t         j                  j                  |«      xs d}t!        j"                  t         j                  j%                  |«      › d�d	|¬
«      \  }}		 t        j&                  |d«      5 }
t)        ||ddd¬«      5 }|j+                  d¬«      D ]$  }|
j-                  |«      }|j/                  |«       Œ& 	 ddd«       ddd«       |r�t3        |	«      }|j5                  «       |j5                  «       k7  rIt         j                  j                  |	«      rt        j                  |	«       t        d|›d|›d|›d�«      ‚t        j                  d|› �«       	 t        j6                  |	|«       y# t        t        f$ r d}Y �ŒŒw xY w# 1 sw Y   ŒÐxY w# 1 sw Y   ŒÔxY w# t0        $ r6 t         j                  j                  |	«      rt        j                  |	«       ‚ w xY w# t0        $ r6 t         j                  j                  |	«      rt        j                  |	«       ‚ w xY w)aQ  Download a file from a URL with optional MD5 validation.

    Args:
        url: URL to download from.
        filename: Path to save the file.
        expected_md5: Expected MD5 hash for validation (optional).
        timeout: Timeout in seconds passed to ``requests.get``.

    Raises:
        ValueError: If MD5 validation fails.
    zFile z9 already exists with correct MD5 hash. Skipping download.Nz0 exists but MD5 hash mismatch. Re-downloading...T)Ústreamr"   zcontent-lengthú.z.tmp)ÚprefixÚsuffixÚdirÚwbÚiBi   )ÚdescÚtotalÚunitÚ
unit_scaleÚunit_divisor)Ú
chunk_sizezMD5 mismatch for z (expected z, got z).zMD5 validation successful for )r   r   r   r   ÚloggerÚinfoÚwarningÚremoveÚrequestsÚgetÚraise_for_statusÚheadersÚintÚ	TypeErrorÚ
ValueErrorÚdirnameÚtempfileÚmkstempÚbasenameÚfdopenr   Úiter_contentÚwriter   Ú	Exceptionr   r   Úreplace)r    r!   r   r"   ÚresponseÚtotal_size_headerÚ
total_sizeÚ
target_dirÚfdÚtemp_filenamer   ÚpbarÚdataÚsizer   s                  r   Ú_download_filerN   6   sƒ  € ô$ 
‡w�w‡~�~�hÔ¡LÜ˜h¨Ô5Ü�K‰K˜% ˜zÐ)bÐcÔdØä�N‰N˜U 8 *Ð,\Ð]Ô^Ü�I‰I�hÔä�|‰|˜C¨°gÔ>€HØ×ÑÔØ ×(Ñ(×,Ñ,Ð-=Ó>ÐðØ/@Ð/L”SÐ*Ô+ÐRVˆ
ô —‘—‘ Ó*Ò1¨c€JÜ ×(Ñ(Ü—'‘'×"Ñ" 8Ó,Ð-¨QÐ/ØØôÑ€Bˆð
ä�I‰I�b˜$Óð	"Ø#$ÜØØ ØØØ!ôð	"ð à ×-Ñ-¸Ð-Ó>ò "�Ø—w‘w˜t“}�Ø—‘˜DÕ!ñ"÷	"÷ 	"ñ& Ü& }Ó5ˆ
Ø×ÑÓ ×!3Ñ!3Ó!5Ò5Ü�w‰w�~‰~˜mÔ,Ü—	‘	˜-Ô(ÝÊXÒWcÒeoÐpÓqÐqä�K‰KÐ8¸¸
ÐCÔDðÜ
�
‰
�= (Õ+øôU ”zÐ"ò Ø‹
ðú÷	"ð 	"ú÷ 	"ð 	"ûô ò Ü�7‰7�>‰>˜-Ô(Ü�I‰I�mÔ$Øðûô$ ò Ü�7‰7�>‰>˜-Ô(Ü�I‰I�mÔ$ØðúsZ   Â:I Ä(I1 Ä>I%Å:IÆ
I%ÆI1 È*J3 ÉIÉIÉI"	ÉI%É%I.É*I1 É1?J0Ê3?K2)Ú__doc__r   r   r=   r5   Ú	tqdm.autor   Úrfdetr.utilities.loggerr   r1   Ú DEFAULT_DOWNLOAD_TIMEOUT_SECONDSÚstrr   Úboolr   ÚfloatrN   © r   r   ú<module>rW      s›   ðñ 0ã Û 	Û ã Ý å .á	‹€Ø#'Ð  ð  ð  ¨ó  ð 6 ð 6°Cð 6¸Dó 6ð(  $Ø5ñ	MØ	ðMàðMð ˜‘*ðMð ð	Mð
 
ôMr   