ó
    Ú°›j¯,  ã                   ó@  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
JrJr  SSKJr  SSKJr  \
(       a  SSKJr  SSKJr  \R*                  " S5      rS	r\R0                  " \R2                  \\R4                  " 5       /S
9  S r   S S\S\\   S\\   S\S\4
S jjrS r S!S\\    S\\S   \S   4   4S jjr!   S"S\\   4S jjr"S r#S r$    S#S\S\S\\    S\\   S\\   S\\    S\4S jjr%   S$S\S\S\\    S\\   S\\   S\4S jjr&g)%z PodWorker | modules | upload.py é    N)ÚTYPE_CHECKINGÚOptionalÚTuple)Úurlparse)Útqdm©ÚTransferConfig)Ú
BaseClientzrunpod upload utilityz4%(filename)-20s:%(lineno)-4d %(asctime)s %(message)s)ÚlevelÚformatÚhandlersc                  ól   •  SSK Jn   SSKJn  SSKJn  XU4$ ! [         a  n[        S5      UeSnAff = f)zi
Lazy-load boto3 dependencies.
Returns tuple of (session, TransferConfig, Config) or raises ImportError.
r   )Úsessionr   )ÚConfigzNboto3 is required for S3 upload functionality. Install with: pip install boto3N)Úboto3r   Úboto3.s3.transferr	   Úbotocore.configr   ÚImportError)r   r	   r   Úes       Ú^/home/mande/repo/quber/.venv/lib/python3.13/site-packages/runpod/serverless/utils/rp_upload.pyÚ_import_boto3_dependenciesr      sB   € ð
	Ý!Ý4Ý*Ø¨Ð.Ð.øÜó Üð.ó
ð ð	ûðús   ‚ ˜
3¢.®3Ú	file_nameÚsource_pathÚ	file_dataÚ	directoryÚreturnc                 ó:  • [         R                  SU S35        [        R                  " USS9  U SU  3nU(       a  [        R
                  " X5        U$ Ub(  [        US5       nUR                  U5        SSS5        U$ [        S5      e! , (       d  f       U$ = f)	a\  
Save file to local directory as fallback when S3 is unavailable.

Args:
    file_name: Name of the file to save
    source_path: Path to source file to copy (for file-based uploads)
    file_data: Bytes to write (for in-memory uploads)
    directory: Local directory to save to (default: 'local_upload')

Returns:
    Path to the saved local file
z/No bucket endpoint set, saving to disk folder 'z…'. If this is a live endpoint, please reference: https://github.com/runpod/runpod-python/blob/main/docs/serverless/utils/rp_upload.mdT)Úexist_okÚ/NÚwbz0Either source_path or file_data must be provided)	ÚloggerÚwarningÚosÚmakedirsÚshutilÚcopyfileÚopenÚwriteÚ
ValueError)r   r   r   r   Úlocal_upload_locationÚfile_outputs         r   Ú_save_to_local_fallbackr,   ,   s«   € ô$ ‡N�NØ
9¸)¸ð E_ð 	_ôô ‡K‚K�	 DÒ)Ø(˜k¨¨9¨+Ð6ÐæÜ�Š˜Ô;ð !Ð ð 
Ñ	ÜÐ'¨Ô.°+Ø×Ñ˜iÔ(÷ /ð
 !Ð ô ÐKÓLÐL÷ /Ô.ð
 !Ð ús   Á$BÂ
Bc                 óþ   • [        U 5      nSU ;   a&  U R                  S5      S   R                  S5      S   $ UR                  R                  S5      (       a&  U R                  S5      S   R                  S5      S   $ g)z,
Extracts the region from the endpoint URL.
z.s3.é   Ú.r   z.digitaloceanspaces.comN)r   ÚsplitÚnetlocÚendswith)Úendpoint_urlÚ
parsed_urls     r   Úextract_region_from_urlr5   R   s€   € ô ˜,Ó'€Jà�ÓØ×!Ñ! &Ó)¨!Ñ,×2Ñ2°3Ó7¸Ñ:Ð:ð ×Ñ×!Ñ!Ð";×<Ñ<Ø×!Ñ! #Ó& qÑ)×/Ñ/Ð0IÓJÈ1ÑMÐMàó    Úbucket_credsr
   r	   c           	      ó:  •  [        5       u  pnUR	                  5       nU" SSSS.S9nU" S[
        R                  " 5       SS	S
9nU (       a  U S   nU S   nU S   n	O`[        R                  R                  SS5      n[        R                  R                  SS5      n[        R                  R                  SS5      n	U(       a0  U(       a)  U	(       a"  [        U5      n
UR                  SUUU	UU
S9nX¶4$ SnX¶4$ ! [         a    [        R                  S5         gf = f)zl
Returns a boto3 client and transfer config for the bucket.
Lazy-loads boto3 to reduce initial import time.
zVboto3 not installed. S3 upload functionality disabled. Install with: pip install boto3)NNÚs3v4é   Ústandard©Úmax_attemptsÚmode©Úsignature_versionÚretriesi d  T)Úmultipart_thresholdÚmax_concurrencyÚmultipart_chunksizeÚuse_threadsÚendpointUrlÚaccessIdÚaccessSecretÚBUCKET_ENDPOINT_URLNÚBUCKET_ACCESS_KEY_IDÚBUCKET_SECRET_ACCESS_KEYÚs3)r3   Úaws_access_key_idÚaws_secret_access_keyÚconfigÚregion_name)r   r   r!   r"   ÚSessionÚmultiprocessingÚ	cpu_countr#   ÚenvironÚgetr5   Úclient)r7   r   r	   r   Úbucket_sessionÚboto_configÚtransfer_configr3   Úaccess_key_idÚsecret_access_keyÚregionÚboto_clients               r   Úget_boto_clientr^   c   s7  € ðÜ*DÓ*FÑ'ˆ ð —_‘_Ó&€NáØ ¸1ÀjÑ*Qñ€Kñ %Ø%Ü'×1Ò1Ó3Ø%Øñ	€Oö Ø# MÑ2ˆØ$ ZÑ0ˆØ(¨Ñ8Ñä—z‘z—~‘~Ð&;¸TÓBˆÜŸ
™
Ÿ™Ð'=¸tÓDˆÜŸJ™JŸN™NÐ+EÀtÓLÐæžÖ*;ä(¨Ó6ˆà$×+Ñ+ØØ%Ø+Ø"3ØØð ,ð 
ˆð Ð'Ð'ð ˆàÐ'Ð'øôY ó Ü�‰ð.ô	
ñ ðús   ‚C8 Ã8DÄDÚbucket_namec                 ó*  • [        [        R                  " 5       5      SS n[        5       u  pg[        R
                  R                  U5      S   nSUR                  S5      -   n	[        US5       n
U
R                  5       nSSS5        Uc  U U 3n[        UWSS9nUb  XÓU'   U$ U(       a  UO[        R                  " S	5      nUR                  U U  S
U U 3WU	S9  UR                  SU U  S
U U 3S.SS9nUb  XóU'   U$ ! , (       d  f       N‰= f)z)
Upload a single file to bucket storage.
Né   r.   zimage/r/   ÚrbÚsimulated_uploaded)r   r   ú%m-%yr   )ÚBucketÚKeyÚBodyÚContentTypeÚ
get_object©re   rf   é€:	 ©ÚParamsÚ	ExpiresIn)ÚstrÚuuidÚuuid4r^   r#   ÚpathÚsplitextÚlstripr'   Úreadr,   ÚtimeÚstrftimeÚ
put_objectÚgenerate_presigned_url)Újob_idÚimage_locationÚresult_indexÚresults_listr_   Ú
image_namer]   Ú_Úfile_extensionÚcontent_typeÚ
input_fileÚoutputÚfile_name_with_extÚsim_upload_locationÚbucketÚpresigned_urls                   r   Úupload_imagerˆ   ž   sL  € ô ”T—Z’Z“\Ó" 2 AÐ&€JÜ$Ó&�N€KÜ—W‘W×%Ñ% nÓ5°aÑ8€NØ˜n×3Ñ3°CÓ8Ñ8€Lä	ˆn˜dÔ	# zØ—‘Ó"ˆ÷ 
$ð Ñà *˜|¨NÐ+;Ð<ÐÜ5ØØØ*ñ
Ðð Ñ#Ø)<˜Ñ&à"Ð"æ'‰[¬T¯]ª]¸7Ó-C€FØ×ÑØ�Øˆh�a˜
�| NÐ#3Ð4ØØ ð	 ñ ð  ×6Ñ6ØØ#˜H°°¸¸*¸ÀnÐEUÐ.VÑWØð 7ð €Mð ÑØ%2�\Ñ"àÐ÷E 
$Õ	#ús   Á0DÄ
Dc                 óú   • / nS/[        U5      -  n[        U5       HA  u  pE[        R                  " [        XXC4S9nUR                  5         UR                  U5        MC     U H  nUR                  5         M     U$ )zq
Uploads a list of files in parallel.
Once all files are uploaded, the function returns the presigned URLs list.
N)ÚtargetÚargs)ÚlenÚ	enumerateÚ	threadingÚThreadrˆ   ÚstartÚappendÚjoin)rz   Ú	file_listÚupload_progressÚ	file_urlsÚindexÚselected_fileÚ
new_uploadÚuploads           r   Úfilesrš   Õ   s~   € ð
 €OØ�œ˜Y›Ñ'€Iä )¨)Ö 4ÑˆÜ×%Ò%Ü v¸eÐ&Oñ
ˆ
ð 	×ÑÔØ×Ñ˜zÖ*ñ !5ó "ˆØ�‰Žñ "ð Ðr6   c           
      óÀ  •  [        5       u  p4nUR	                  5       nU" SSSS.S9nUR                  SUS   US	   US
   US9n/ n	U H\  n
[        U
S5       nUR                  [        US   5      U  SU
 3US9  SSS5        U	R                  US    SUS    SU  SU
 35        M^     U	$ ! [         a    [        R                  S5        e f = f! , (       d  f       NZ= f)z"
Uploads files to bucket storage.
zPboto3 not installed. Cannot upload to S3 bucket. Install with: pip install boto3r9   r:   r;   r<   r?   rL   rF   rG   rH   )r3   rM   rN   rO   rb   Ú
bucketNamer   )re   rf   rg   N)
r   r   r!   ÚerrorrQ   rV   r'   rx   ro   r‘   )rz   r“   r7   r   r   r   Útemp_bucket_sessionÚtemp_boto_configÚtemp_boto_clientÚbucket_urlsr—   r   s               r   Úbucket_uploadr¢   í   s3  € ðÜ7Ó9Ñˆ�Fð "Ÿ/™/Ó+ÐáØ ¸1ÀjÑ*QñÐð +×1Ñ1ØØ! -Ñ0Ø& zÑ2Ø*¨>Ñ:Øð 2ð Ðð €Kã"ˆÜ�- Ô&¨)Ø×'Ñ'Ü˜<¨Ñ5Ó6Ø�h˜a ˜Ð/Øð (ñ ÷ 'ð 	×ÑØ˜MÑ*Ð+¨1¨\¸,Ñ-GÐ,HÈÈ&ÈÐQRÐS`ÐRaÐbö	
ñ #ð ÐøôG ó Ü�‰ð.ô	
ð 	ðú÷0 'Õ&ús   ‚B+ Á#CÂ+!CÃ
C	Úfile_locationÚprefixÚ
extra_argsc                 ó   • [        U5      u  pgU(       d  [        R                  " S5      nU(       a  U SU  3OU nUc	  [        XS9$ [        R
                  R                  U5      n	[        U	SSU S9 n
UUUUU
R                  S.nU(       a  X[S	'   UR                  " S0 UD6  SSS5        UR                  S
X8S.SS9nU$ ! , (       d  f       N#= f)zF
Uploads a single file to bucket storage and returns a presigned URL.
rd   r   N)r   ÚBT©ÚtotalÚunitÚ
unit_scaleÚdesc)ÚFilenamere   rf   r   ÚCallbackÚ	ExtraArgsri   rj   rk   rl   © )r^   rv   rw   r,   r#   rr   Úgetsizer   ÚupdateÚupload_filery   )r   r£   r7   r_   r¤   r¥   r]   rY   ÚkeyÚ	file_sizeÚprogress_barÚupload_file_argsr‡   s                r   Úupload_file_to_bucketr¸     sâ   € ô $3°<Ó#@Ñ €KæÜ—m’m GÓ,ˆæ%+ˆVˆH�A�i�[Ñ
!°€CàÑÜ& yÑLÐLä—‘—‘ Ó.€IÜ	Ø˜c¨d¸ò
à	à%Ø!ØØ%Ø$×+Ñ+ñ
Ðö Ø,6˜[Ñ)à×ÒÑ3Ð"2Ò3÷
ð   ×6Ñ6Ø¨Ñ@ÈFð 7ð €Mð Ð÷)
õ 
ús   Á20B?Â?
Cc           	      ó|  • [        U5      u  pVU(       d  [        R                  " S5      nU(       a  U SU  3OU nUc	  [        XS9$ [	        U5      n[        USSU S9 n	UR                  [        R                  " U5      UUUU	R                  S9  SSS5        UR                  S	X7S
.SS9n
U
$ ! , (       d  f       N#= f)zT
Uploads an in-memory object (bytes) to bucket storage and returns a presigned URL.
rd   r   N)r   r§   Tr¨   )r   r®   ri   rj   rk   rl   )r^   rv   rw   r,   rŒ   r   Úupload_fileobjÚioÚBytesIOr²   ry   )r   r   r7   r_   r¤   r]   rY   r´   rµ   r¶   r‡   s              r   Úupload_in_memory_objectr½   H  sÎ   € ô $3°<Ó#@Ñ €KæÜ—m’m GÓ,ˆæ%+ˆVˆH�A�i�[Ñ
!°€CàÑÜ& yÑFÐFä�I“€IÜ	Ø˜c¨d¸ò
à	Ø×"Ñ"Ü�JŠJ�yÓ!ØØØ"Ø!×(Ñ(ð 	#ñ 	
÷
ð  ×6Ñ6Ø¨Ñ@ÈFð 7ð €Mð Ð÷
õ 
ús   Á2B-Â-
B;)NNÚlocal_upload)N)r   NN)NNNN)NNN)'Ú__doc__r»   ÚloggingrR   r#   r%   rŽ   rv   rp   Útypingr   r   r   Úurllib.parser   Útqdm_loggable.autor   r   r	   Úbotocore.clientr
   Ú	getLoggerr!   ÚFMTÚbasicConfigÚINFOÚStreamHandlerr   ro   Úbytesr,   r5   Údictr^   rˆ   rš   r¢   r¸   r½   r°   r6   r   Ú<module>rÌ      sØ  ðÙ 'ó 
Û Û Û 	Û Û Û Û ß 1Ñ 1Ý !å #æÝ0Ý*à	×	Ò	Ð2Ó	3€Ø<€Ø × Ò ˜'Ÿ,™,¨s¸g×>SÒ>SÓ>UÐ=VÒ Wòð& "&Ø!%Ø#ñ	#!Øð#!à˜#‘ð#!ð ˜‰ð#!ð ð	#!ð
 	õ#!òLð$ $(ñ5(Ø˜4‘.ð5(à
ˆ8�LÑ! 8Ð,<Ñ#=Ð=Ñ>õ5(ð| ØØ!%ñ1ð
 ˜#‘õ1ònò0)ð` $(Ø!%Ø Ø!%ñ*Øð*àð*ð ˜4‘.ð*ð ˜#‘ð	*ð
 �S‰Mð*ð ˜‘ð*ð 	õ*ðb $(Ø!%Ø ñ$Øð$àð$ð ˜4‘.ð$ð ˜#‘ð	$ð
 �S‰Mð$ð 	ö$r6   