Ë
    Fêñiá  ã                  ó„   — 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
  G d„ d«      Z	 	 	 	 d
	 	 	 	 	 	 	 	 	 	 	 	 	 dd	„Zy)zBUpload utilities for Ultralytics, mirroring downloads.py patterns.é    )ÚannotationsN)ÚPath)Úsleep)ÚLOGGERÚTQDMc                  ó*   — e Zd ZdZd„ Zdd„Zd„ Zd„ Zy)Ú_ProgressReaderz>File wrapper that reports read progress for upload monitoring.c                ó|   — t        |d«      | _        || _        t        j                  j                  |«      | _        y )NÚrb)ÚopenÚfileÚpbarÚosÚpathÚgetsizeÚ_size)ÚselfÚ	file_pathr   s      ú[/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/utils/uploads.pyÚ__init__z_ProgressReader.__init__   s+   € Ü˜ DÓ)ˆŒ	ØˆŒ	Ü—W‘W—_‘_ YÓ/ˆ�
ó    c                ó    — | j                   j                  |«      }|r0| j                  r$| j                  j                  t	        |«      «       |S )z"Read data and update progress bar.)r   Úreadr   ÚupdateÚlen)r   ÚsizeÚdatas      r   r   z_ProgressReader.read   s8   € à�y‰y�~‰~˜dÓ#ˆÙ�D—I’IØ�I‰I×ÑœS ›YÔ'Øˆr   c                ó   — | j                   S )z+Return file size for Content-Length header.)r   ©r   s    r   Ú__len__z_ProgressReader.__len__   s   € à�z‰zÐr   c                ó8   — | j                   j                  «        y)zClose the file.N)r   Úcloser   s    r   r"   z_ProgressReader.close    s   € à�	‰	�‰Õr   N)éÿÿÿÿ)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r    r"   © r   r   r	   r	      s   „ ÙHò0ó
òór   r	   c                ó”  — ddl }t        | «      } | j                  «       st        d| › �«      ‚| j	                  «       j
                  }d| j                  › �}ddi}	|r|	j                  |«       d}
t        |dz   «      D ]»  }d}d}	 |rt        ||dd	d
¬«      }t        | |«      }|j                  |||	|¬«      }|j                  «        |j                  «        d}|r|j                  «        d}t        j                  d| j                  › d�«       	 |r|j                  «        |r|j                  «         y	 y	 t        j(                  |› d|dz   › d|
› �«       y# |j                   j"                  $ r£}|j$                  �|j$                  j&                  nd}d|cxk  rdk  ren nb|dvr^t        j(                  |› d|› dt+        |j$                  dd«      › �«       Y d}~|r|j                  «        |r|j                  «         y yd|› �}
Y d}~n$d}~wt,        $ r}t/        |«      }
Y d}~nd}~ww xY w|r|j                  «        |r;|j                  «        n*# |r|j                  «        |r|j                  «        w w xY w||k  s�Œd|dz   z  }t        j(                  |› d|
› d|dz   › d|› d|› d�
«       t1        |«       �ŒL) a  Upload a file to a URL with retry logic and optional progress bar.

    Args:
        file (str | Path): Path to the file to upload.
        url (str): The URL endpoint to upload the file to (e.g., signed GCS URL).
        headers (dict, optional): Additional headers to include in the request.
        retry (int, optional): Number of retry attempts on failure (default: 2 for 3 total attempts).
        timeout (int, optional): Request timeout in seconds.
        progress (bool, optional): Whether to display a progress bar during upload.

    Returns:
        (bool): True if upload succeeded, False otherwise.

    Examples:
        >>> from ultralytics.utils.uploads import safe_upload
        >>> success = safe_upload("model.pt", "https://storage.googleapis.com/...", progress=True)
    r   NzFile not found: z
Uploading zContent-Typezapplication/octet-streamé   ÚBTi   )ÚtotalÚdescÚunitÚ
unit_scaleÚunit_divisor)r   ÚheadersÚtimeoutz	Uploaded u    âœ…i�  iô  >   é˜  é­  z	 failed: ú ÚreasonÚ FzHTTP é   z	 failed (z), retrying ú/z in zs...z failed after z attempts: )Úrequestsr   ÚexistsÚFileNotFoundErrorÚstatÚst_sizeÚnamer   Úranger   r	   ÚputÚraise_for_statusr"   r   ÚinfoÚ
exceptionsÚ	HTTPErrorÚresponseÚstatus_codeÚwarningÚgetattrÚ	ExceptionÚstrr   )r   Úurlr1   Úretryr2   Úprogressr:   Ú	file_sizer-   Úupload_headersÚ
last_errorÚattemptr   ÚreaderÚrÚeÚstatusÚ	wait_times                     r   Úsafe_uploadrX   %   s¦  € ó2 ä�‹:€DØ�;‰;Œ=ÜÐ"2°4°&Ð 9Ó:Ð:à—	‘	“×#Ñ#€IØ˜Ÿ	™	�{Ð#€Dð %Ð&@ÐA€NÙØ×Ñ˜gÔ&à€JÜ˜ ™Ó#ò #ˆØˆØˆð	ÙÜ )°$¸SÈTÐ`dÔe�Ü$ T¨4Ó0ˆFà—‘˜S v°~Èw�ÓWˆAØ×ÑÔ Ø�L‰LŒNØˆFÙØ—
‘
”Ø�Ü�K‰K˜) D§I¡I ;¨dÐ3Ô4Øñ Ø—‘”ÙØ—
‘
–ñ ð;#ôJ ‡N�N�d�V˜>¨%°!©)¨°KÀ
¸|ÐLÔMØøð) ×"Ñ"×,Ñ,ò 	*Ø/0¯z©zÐ/E�Q—Z‘Z×+Ò+È1ˆFØ�fÔ"˜sÕ" v°ZÑ'?Ü—‘ $  y°°¸¼'À!Ç*Á*ÈhÐXZÓ:[Ð9\Ð]Ô^Ûñ
 Ø—‘”ÙØ—
‘
–ñ ð !  Ð)�JûÜò 	 Ü˜Q›�Jûð	 úñ Ø—‘”ÙØ—
‘
•øñ Ø—‘”ÙØ—
‘
•ð úð �UŒ?Ø˜g¨™kÑ*ˆIÜ�N‰N˜d˜V 9¨Z¨L¸ÀWÈqÁ[ÀMÐQRÐSXÐRYÐY]Ð^gÐ]hÐhlÐmÔnÜ�)ÖsJ   ÂBEÅH5Å6A(HÇIÈ
HÈIÈH5È H0È+IÈ0H5È5IÉ'J)Nr8   iX  F)r   z
str | PathrL   rK   r1   zdict | NonerM   Úintr2   rY   rN   ÚboolÚreturnrZ   )r'   Ú
__future__r   r   Úpathlibr   Útimer   Úultralytics.utilsr   r   r	   rX   r(   r   r   ú<module>r`      s~   ðá Hå "ã 	Ý Ý ç *÷ñ ð6  ØØØðNØ
ðNà	ðNð ðNð ð	Nð
 ðNð ðNð 
ôNr   