
    +j                         S SK r S SKrS SKrS SKJr  S SKJr  S SKrS SKJ	r	J
r
  S SKJr  S\S\4S jrS	\R                  S
\\/\4   S\	4S jrS\S-  SS4S jrg)    N)Callable)web)ParsedUploadUploadError)validate_blake3_hashsreturnc                 P     [        U 5      $ ! [         a    [        SSS5      ef = f)z_Validate and normalize a hash string.

Returns canonical 'blake3:<hex>' or raises UploadError.
  INVALID_HASH hash must be like 'blake3:<hex>')r   
ValueErrorr   )r   s    5/home/wildlama/comfy/ComfyUI/app/assets/api/upload.pynormalize_and_validate_hashr      s4    
S#A&& S#~/QRRSs   
 %requestcheck_hash_existsc                 	  #    U R                   =(       d    SR                  5       R                  S5      (       d  [        SSS5      eU R	                  5       I Sh  vN nSnSn/ nSnSnSnSn	Sn
SnSnSn UR                  5       I Sh  vN nUc  GO[        US
S5      =(       d    SnUS:X  a]   UR                  5       I Sh  vN =(       d    SR                  5       R                  5       nU(       a  [        U5      n U" U5      n	GOGOUS:X  Gag  S	nUR                  =(       d    SR                  5       nU(       a;  U	S	L a6    UR                  S5      I Sh  vN nU(       d  OU[        U5      -  nM1  GM  [         R"                  R%                  [&        R(                  " 5       S5      n[         R"                  R%                  U[*        R,                  " 5       R.                  5      n[         R0                  " US	S9  [         R"                  R%                  US5      n [3        US5       n UR                  S5      I Sh  vN nU(       d  O!UR5                  U5        U[        U5      -  nMB  SSS5        GOUS:X  a1  UR9                  UR                  5       I Sh  vN =(       d    S5        OUS
:X  a"  UR                  5       I Sh  vN =(       d    SnOUS:X  a"  UR                  5       I Sh  vN =(       d    SnOUS:X  a  [        SSS 5      eUS!:X  a9  UR                  5       I Sh  vN =(       d    SR                  5       =(       d    Sn
O>US":X  a8  UR                  5       I Sh  vN =(       d    SR                  5       =(       d    SnGM  U(       d  U(       a  U	(       d  [        SS#S$5      eU(       a,  US:X  a&  U(       a  U	(       d  [7        U5        [        SS%S&5      e[;        UUUUUUUUU	U
US'9$  GN GNv GN?! [         a    [        SSS5      ef = f! [         a*  n[        R                  " SUU5        [        SSS5      eSnAff = f GN! [         a    [        SSS5      ef = f GN3! , (       d  f       N= f! [         a    [7        U5        [        SSS5      ef = f GN GN GN GN GNO7f)(a  
Parse a multipart/form-data upload request.

Args:
    request: The aiohttp request
    check_hash_exists: Callable(hash_str) -> bool to check if a hash exists

Returns:
    ParsedUpload with parsed fields and temp file path

Raises:
    UploadError: On validation or I/O errors
 z
multipart/i  UNSUPPORTED_MEDIA_TYPEz$Use multipart/form-data for uploads.NFr   Tnamehashr   r   r   z(check_hash_exists failed for hash=%s: %si  HASH_CHECK_FAILEDz(Backend error while checking asset hash.filei   UPLOAD_IO_ERRORz Failed to receive uploaded file.uploads)exist_okz.upload.partwbz*Failed to receive and store uploaded file.tagsuser_metadataidUNSUPPORTED_FIELDzLClient-provided 'id' is not supported. Asset IDs are assigned by the server.	mime_type
preview_idMISSING_FILEz2Form must include a 'file' part or a known 'hash'.EMPTY_UPLOADzUploaded file is empty.)file_presentfile_writtenfile_client_nametmp_pathtags_rawprovided_nameuser_metadata_rawprovided_hashprovided_hash_existsprovided_mime_typeprovided_preview_id)content_typelower
startswithr   	multipartnextgetattrtextstrip	Exceptionr   logging	exceptionfilename
read_chunklenospathjoinfolder_pathsget_temp_directoryuuiduuid4hexmakedirsopenwritedelete_temp_file_if_existsappendr   )r   r   readerr&   r(   r*   r+   r,   r-   r.   r/   r0   r'   r)   fieldfnamer   echunkuploads_root
unique_dirfs                         r   parse_multipart_uploadrT      si    "   &B--/::<HH)+Q
 	
 $$&&FL#'H $M$( $M(,%)&*LH
kkm#=vr*0bF?!JJL(/R668>>@  ;A >
+<]+K(  f_L % 4";;=!5!=	&+&6&6&G G$!$E
2	  77<<(G(G(I9ULlDJJL4D4DEJKK
T2ww||J?H(D)Q&+&6&6&G G$!$E
2  *) f_OO5::</6B7f_#(::</8DMo%',zz|!3 <d]#^ 
 k!).#5"<"!C!C!E!Ml"*/**,$6#=2"D"D"F"N$c f 3G!U
 	

 	A#7"8,#~/HII!!)#+#1-/ _ '  $ ) !)K  ! %%BMST &+B 	$ !H ! %.0R  !H *)  *84!*,X  0/!3 $6$6sL  AR>O<.R>	O?
%R>0P P)P -R> P  <R>Q QQ &R>'Q 7B(R> R	 ,Q8Q5-Q80R	 8&R>R/+R>
R2'R>2R53:R>-R8.>R>,R;-BR>?R>P PR> 
Q*%QQR>Q Q22R>5Q88
RR	 R>R	 	#R,,R>2R>5R>8R>;R>r)   c                    U (       a   [         R                  R                  U 5      (       a  [         R                  " U 5         [         R                  R                  U 5      nU(       a<  [         R                  R                  U5      (       a  [         R                  " U5        gggg! [         a!  n[
        R                  " SX5         SnANSnAff = f! [         a     gf = f)z<Safely remove a temp file and its parent directory if empty.z!Failed to delete temp file %s: %sN)
r?   r@   existsremoveOSErrorr:   debugdirnameisdirrmdir)r)   rO   parents      r   rJ   rJ      s    	Lww~~h''		(#	WW__X.F"''--//  0v   	LMM=xKK	L  		s*   :B( A C (
C2CC
C#"C#)r:   r?   rD   typingr   aiohttpr   rB   app.assets.api.schemas_inr   r   app.assets.helpersr   strr   RequestboolrT   rJ        r   <module>rg      s}     	     ? 3S3 S3 SQ[[Qt,Q Qht  rf   