
    +j                         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Zd dlm	Z	m
Z
 d dlmZ dedefdZd	ej        d
eegef         de	fdZdedz  ddfdZdS )    N)Callable)web)ParsedUploadUploadError)validate_blake3_hashsreturnc                 `    	 t          |           S # t          $ r t          ddd          w xY w)zgValidate 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      sH    
S#A&&& S S S#~/QRRRSs    -requestcheck_hash_existsc                 	  K   | j         pd                                                    d          st          ddd          |                                  d{V }d}d}g }d}d}d}d}	d}
d}d}d}	 |                                 d{V }|nt          |d
d          pd}|dk    r	 |                                 d{V pd                                                                }n# t          $ r t          ddd          w xY w|rVt          |          }	  ||          }	n# t          $ r,}t          j        d||           t          ddd          d}~ww xY wn|dk    rd	}|j        pd                                }|rY|	d	u rU	 	 |                    d           d{V }|sn|t          |          z  }1n# t          $ r t          ddd          w xY wrt           j                            t'          j                    d          }t           j                            |t+          j                    j                  }t!          j        |d	           t           j                            |d          }	 t3          |d          5 }	 |                    d           d{V }|sn(|                    |           |t          |          z  }F	 ddd           n# 1 swxY w Y   n.# t          $ r! t7          |           t          ddd          w xY w|dk    r0|                    |                                 d{V pd           n|d
k    r|                                 d{V pd}n|dk    r|                                 d{V pd}n|dk    rt          ddd           |d!k    r1|                                 d{V pd                                pd}
n6|d"k    r0|                                 d{V pd                                pd}|s|r|	st          dd#d$          |r*|dk    r$|r|	s t7          |           t          dd%d&          t;          |||||||||	|
|'          S )(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      sG     "  &B--//::<HH 
)+Q
 
 	
 $$&&&&&&&&FL#'H $M$( $M(,%)&*LHQOkkmm######=vr**0bF??!JJLL((((((/R6688>>@@   !)K  
   ;A > >
+<+<]+K+K((    %BMST   &+B  		 f__L % 4";;== !5!=!=	3&+&6&6&G&G G G G G G G$ "!$E

2	3 "    %.0R   7<<(G(I(I9UULlDJLL4DEEJK
T2222w||J??H(D)) 3Q3&+&6&6&G&G G G G G G G$ "!$E

23 "	3 3 3 3 3 3 3 3 3 3 3 3 3 3 3    *8444!*,X   f__OO5::<<//////6B7777f__#(::<<//////8DMMo%%',zz||!3!3!3!3!3!3 <d]]#^  
 k!!).#5#5#5#5#5#5"<"!C!C!E!E!Ml""*/**,,$6$6$6$6$6$6#=2"D"D"F"F"N$cQOf  
 
3G 
!U
 
 	

 	JA #7  	#8,,,#~/HIII!!)#+#1-/   sb   +A C, ,DD* *
E 4'EE 2G GK4 AK'K4 'K++K4 .K+/K4 4+Lr)   c                    | r	 t           j                            |           rt          j        |            n-# t          $ r }t          j        d| |           Y d}~nd}~ww xY w	 t           j                            |           }|r5t           j                            |          rt          j	        |           dS dS dS # t          $ r Y dS w xY wdS )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w~~h'' $	(### 	L 	L 	LM=xKKKKKKKK	L	W__X..F !"'--// !     ! ! ! ! 	 	 	DD	 s(   38 
A"AA"&A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 3 3 3 3 3S3 S3 S S S SQ[Qt,Q Q Q Q Qht       rf   