
    +jG                       d dl m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Zd dl	Z
d dlZ	 d dlZdZn	#  dZY nxY wd dlmZ d dlmZ d dlZd dlmZ d	d
lmZmZmZmZ  G d de          Z G d de          Z G d de          Zd)dZ G d d          Z G d d          Z  G d de          Z! G d de!          Z" G d de          Z# G d  d!e          Z$ G d" d#e          Z% G d$ d%e          Z& G d& d'e          Z'g d(Z(dS )*    )annotationsN)BytesIOTF)Image)PngInfo)args   )	ComfyNode
FolderTyper   	_UIOutputc                  h     e Zd Zd fdZedd            Zedd	            Zedd
            Z xZS )SavedResultfilenamestr	subfoldertyper
   c                Z    t                                          |||j                   d S )N)r   r   r   )super__init__value)selfr   r   r   	__class__s       4/home/wildlama/comfy/ComfyUI/comfy_api/latest/_ui.pyr   zSavedResult.__init__   s*    (iTZPPPPP    returnc                    | d         S )Nr    r   s    r   r   zSavedResult.filename   s    Jr   c                    | d         S )Nr   r   r   s    r   r   zSavedResult.subfolder#   s    K  r   c                ,    t          | d                   S )Nr   )r
   r   s    r   r   zSavedResult.type'   s    $v,'''r   )r   r   r   r   r   r
   )r   r   )r   r
   )	__name__
__module____qualname__r   propertyr   r   r   __classcell__r   s   @r   r   r      s        Q Q Q Q Q Q       X  ! ! ! X! ( ( ( X( ( ( ( (r   r   c                  .     e Zd ZdZdd fdZdd
Z xZS )SavedImageszNA UI output class to represent one or more saved images, potentially animated.Fresultslist[SavedResult]is_animatedboolc                d    t                                                       || _        || _        d S N)r   r   r(   r*   )r   r(   r*   r   s      r   r   zSavedImages.__init__.   s.    &r   r   dictc                0    d| j         i}| j        rd|d<   |S )NimagesTanimated)r(   r*   )r   datas     r   as_dictzSavedImages.as_dict3   s(    $,' 	'&Dr   )F)r(   r)   r*   r+   r   r.   r    r!   r"   __doc__r   r4   r$   r%   s   @r   r'   r'   ,   s\        XX' ' ' ' ' ' '
       r   r'   c                  ,     e Zd ZdZd fdZd	dZ xZS )
SavedAudioszFUI wrapper around one or more audio files on disk (FLAC / MP3 / Opus).r(   r)   c                V    t                                                       || _        d S r-   )r   r   r(   )r   r(   r   s     r   r   zSavedAudios.__init__<   s$    r   r   r.   c                    d| j         iS Naudio)r(   r   s    r   r4   zSavedAudios.as_dict@   s    &&r   )r(   r)   r5   r6   r%   s   @r   r9   r9   :   sW        PP     ' ' ' ' ' ' ' 'r   r9   folder_typer
   r   r   c                    | t           j        k    rt          j                    S | t           j        k    rt          j                    S t          j                    S r-   )r
   inputfolder_pathsget_input_directoryoutputget_output_directoryget_temp_directory)r>   s    r   _get_directory_by_folder_typerF   D   sK    j&&&/111j'''0222*,,,r   c                     e Zd ZdZed&d            Zed'd
            Zed'd            Zed(d            Ze	 d)d*d            Z	ed)d+d            Z
ed,d            Zed-d            Zed.d#            Zed/d$            Zd%S )0ImageSaveHelperzGA helper class with static methods to handle image saving and metadata.image_tensortorch.Tensorr   PILImage.Imagec                    t          j        t          j        d|                                                                 z  dd                              t          j                            S )z.Converts a single torch tensor to a PIL Image.g     o@r      )PILImage	fromarraynpclipcpunumpyastypeuint8)rI   s    r   _convert_tensor_to_pilz&ImageSaveHelper._convert_tensor_to_pilO   sS     !"'%,2B2B2D2D2J2J2L2L*LaQT"U"U"\"\]_]e"f"fgggr   clstype[ComfyNode] | NonePngInfo | Nonec                r   t           j        s	| | j        sdS t                      }| j        j        r2|                    dt          j        | j        j                             | j        j        rG| j        j        D ]:}|                    |t          j        | j        j        |                              ;|S )z7Creates a PngInfo object with prompt and extra_pnginfo.Nprompt)	r   disable_metadatahiddenr   r[   add_textjsondumpsextra_pnginforW   metadataxs      r   _create_png_metadataz$ImageSaveHelper._create_png_metadataT   s       	CKszK499: 	Gh
3:3D(E(EFFF:# 	NZ- N N!!!TZ
0H0K%L%LMMMMr   c           	     2   t           j        s	| | j        sdS t                      }| j        j        rb|                    dd                    dd          dz   t          j        | j        j                                      dd          z   d           | j        j	        rw| j        j	        D ]j}|                    d|                    dd          dz   t          j        | j        j	        |                                       dd          z   d           k|S )	zPCreates a PngInfo object with prompt and extra_pnginfo for animated PNGs (APNG).Ns   comfr[   zlatin-1strict    T)
after_idat)
r   r\   r]   r   r[   addencoder_   r`   ra   rb   s      r   _create_animated_png_metadataz-ImageSaveHelper._create_animated_png_metadataa   s1      	CKszK499: 	LL	844*SZ.//66y(KKL       :# 	Z-  HHY11j!9!!<==DDYPXYYZ  $      r   	pil_imagePILImage.Exifc                   |                                  }t          j        s	||j        |S |j        j        4d                    t          j        |j        j                            |d<   |j        j        Vd}|j        j        	                                D ]5\  }}d                    |t          j        |                    ||<   |dz  }6|S )z,Creates EXIF metadata bytes for WebP images.Nz	prompt:{}i  i  z{}:{}r   )
getexifr   r\   r]   r[   formatr_   r`   ra   items)rm   rW   	exif_datainital_exif_tagkeyr   s         r   _create_webp_metadataz%ImageSaveHelper._create_webp_metadataz   s     %%''	  	CK3:3E:( + 2 24:cj>O3P3P Q QIf:#/$O!j6<<>> % %
U-4^^CEARAR-S-S	/*1$r      filename_prefixr   r>   r
   r)   c                J   t          j        |t          |          | d         j        d         | d         j        d                   \  }}}}}	g }
t                              |          }t          |           D ]\  }}t                              |          }|                    dt          |                    }| d|dd}|
                    t          j                            ||          ||           |
                    t          |||                     |dz  }|
S )z0Saves a batch of images as individual PNG files.r   r   %batch_num%_05_.png)pnginfocompress_level)rA   get_save_image_pathrF   shaperH   re   	enumeraterV   replacer   saveospathjoinappendr   )r0   rx   r>   rW   r   full_output_folderr   counterr   r{   r(   rc   batch_numberrI   imgfilename_with_batch_numfiles                    r   save_imageszImageSaveHelper.save_images   s*   
 ?K>^:;GGPQYZI[]cde]f]lmn]o?
 ?
;Hgy! "77<<*3F*;*; 	 	&L,!88FFC&.&6&6}c,FWFW&X&X#-AAAAAADHHRW\\"4d;;X^lHmmmNN;tYDDEEEqLGGr   r'   c           	     n    t          t                              | |t          j        ||                    S )zDSaves a batch of images and returns a UI object for the node output.rx   r>   rW   r   )r'   rH   r   r
   rC   )r0   rx   rW   r   s       r   get_save_images_uiz"ImageSaveHelper.get_save_images_ui   s@     ++ /&-- ,  
 
 	
r   fpsfloatr   intr   c           
        t          j        |t          |          | d         j        d         | d         j        d                   \  }}}}	}
d | D             }t                              |          }| d|dd}t          j                            ||          }|d         	                    |||dt          d|z            |dd	         
           t          ||	|          S )z1Saves a batch of images as a single animated PNG.r   r   c                B    g | ]}t                               |          S r   rH   rV   .0r   s     r   
<listcomp>z5ImageSaveHelper.save_animated_png.<locals>.<listcomp>   &    TTTco<<SAATTTr   r{   r|   r}   T     @@N)r~   r   save_alldurationappend_images)rA   r   rF   r   rH   rl   r   r   r   r   r   r   )r0   rx   r>   rW   r   r   r   r   r   r   r{   
pil_imagesrc   r   	save_paths                  r   save_animated_pngz!ImageSaveHelper.save_animated_png   s   
 ?K>^:;GGPQYZI[]cde]f]lmn]o?
 ?
;Hgy! UTVTTT
"@@EE..W....GLL!3T::	1)#&&$QRR. 	 	
 	
 	
 4K888r   c                    t                               | |t          j        |||          }t	          |gt          |           dk              S )zBSaves an animated PNG and returns a UI object for the node output.)rx   r>   rW   r   r   r   r*   )rH   r   r
   rC   r'   len)r0   rx   rW   r   r   results         r   get_save_animated_png_uiz(ImageSaveHelper.get_save_animated_png_ui   sT    
 !22+")) 3 
 
 F8VqAAAAr   losslessr+   qualitymethodc           
        t          j        |t          |          | d         j        d         | d         j        d                   \  }}	}
}}d | D             }t                              |d         |          }|	 d|
dd}|d                             t          j        	                    ||          dt          d|z            |dd	         ||||
           t          |||          S )z2Saves a batch of images as a single animated WebP.r   r   c                B    g | ]}t                               |          S r   r   r   s     r   r   z6ImageSaveHelper.save_animated_webp.<locals>.<listcomp>   r   r   r{   r|   z_.webpTr   N)r   r   r   exifr   r   r   )rA   r   rF   r   rH   rv   r   r   r   r   r   r   )r0   rx   r>   rW   r   r   r   r   r   r   r   r   r{   r   pil_exifr   s                   r   save_animated_webpz"ImageSaveHelper.save_animated_webp   s    ?K>^:;GGPQYZI[]cde]f]lmn]o?
 ?
;Hgy! UTVTTT
"88ALL//W////1GLL+T22#&&$QRR. 	 		
 		
 		
 4K888r   c           
         t                               | |t          j        |||||          }t	          |gt          |           dk              S )zCSaves an animated WebP and returns a UI object for the node output.)rx   r>   rW   r   r   r   r   r   r   )rH   r   r
   rC   r'   r   )r0   rx   rW   r   r   r   r   r   s           r   get_save_animated_webp_uiz)ImageSaveHelper.get_save_animated_webp_ui   sZ     !33+") 4 	
 	
 F8VqAAAAr   N)rI   rJ   r   rK   )rW   rX   r   rY   )rm   rK   rW   rX   r   rn   )rw   )rx   r   r>   r
   rW   rX   r   r)   )rx   r   rW   rX   r   r'   )rx   r   r>   r
   rW   rX   r   r   r   r   r   r   )
rx   r   rW   rX   r   r   r   r   r   r'   )rx   r   r>   r
   rW   rX   r   r   r   r+   r   r   r   r   r   r   )rx   r   rW   rX   r   r   r   r+   r   r   r   r   r   r'   )r    r!   r"   r7   staticmethodrV   re   rl   rv   r   r   r   r   r   r   r   r   r   rH   rH   L   ss       QQh h h \h 
 
 
 \
    \0    \ mn    \$ 

 

 

 

 \

 9 9 9 \9* B B B \B 9 9 9 \9: B B B \B B Br   rH   c                  T    e Zd ZdZg dZe	 	 ddd            Ze	 ddd            ZdS )AudioSaveHelperzGA helper class with static methods to handle audio saving and metadata.)i@  i.  i>  i]  逻  flac128kr=   r.   rx   r   r>   r
   rW   rX   rq   r   r   r)   c                   t          j        |t          |                    \  }}}}	}
i }t          j        sq|o|j        j        !t          j        |j        j                  |d<   |j        j	        6|j        j	        D ])}t          j        |j        j	        |                   ||<   *g }t          | d                                                   D ]\  }}|                    dt          |                    }| d|dd| }t          j                            ||          }| d         }|dk    r|d	k    rd	}nD|t"          j        vr6t'          t"          j                  D ]}||k    r|} n|t"          j        vrd	}|| d         k    r=t(          st+          d
          t,          j                            || d         |          }t3                      }t5          j        |d|          }|                                D ]\  }}||j        |<   |j        d         dk    rdnd}|dk    r^|                    d||          }|dk    rd|_         n|dk    rd|_         n|dk    rd|_         n|dk    rd|_         ns|dk    rd|_         ne|dk    rG|                    d||          }|dk    rd|j!        _"        n4|dk    rd|_         n&|dk    rd|_         n|                    d ||          }t4          j#        $                    |%                    dd          &                    dd!          '                                (                                d"|#          }||_)        d|_*        |+                    |,                    |                     |+                    |,                    d                      |-                                 |.                    d           t7          |d$          5 }|/                    |0                                           d d d            n# 1 swxY w Y   |1                    te          ||	|                     |dz  }|S )%Nr[   waveformrz   r{   r|   .sample_rateopusr   z3torchaudio is not available; cannot resample audio.w)moderq   r   r   monostereolibopus)ratelayout64ki   96ki w r   i  192ki  320ki  mp3
libmp3lameV0r   flt)rq   r   wb)3rA   r   rF   r   r\   r]   r[   r_   r`   ra   r   rR   r   r   r   r   r   r   _OPUS_RATESsortedTORCH_AUDIO_AVAILABLE	Exception
torchaudio
functionalresampler   avopenrr   rc   r   
add_streambit_ratecodec_contextqscale
AudioFramefrom_ndarraymovedimreshaper   rS   r   ptsmuxrk   closeseekwrite	getbufferr   r   )r=   rx   r>   rW   rq   r   r   r   r   r   r{   rc   rd   r(   r   r   r   r   output_pathr   r   output_bufferoutput_containerru   r   r   
out_streamframefs                                r   
save_audiozAudioSaveHelper.save_audio  s
    ?K>^:;GG?
 ?
;Hgy! $ 	Jz ,%)Z
0A%B%B"z'31 J JA"&*SZ-Ea-H"I"IHQKK&/j0A0E0E0G0G&H&H R	 R	"L(&.&6&6}c,FWFW&X&X#-EEEEEVEED',,'94@@K  .K &&"'KK (CCC &'B C C " "+--*.K!E . #/*EEE&+ %"6660 _'(]^^^)4==hmH\^ijjH $IIM!w}3vNNN 'nn.. 7 7
U16 )#..'~a0A55VV8F-88]c8dd
e##*/J''%%*/J''&&*0J''&&*0J''&&*0J'5-88K`f8gg
d??67J,33&&*0J''&&*0J'-88kZ`8aa
M..  A&&..q"55;;==CCEE /  E
 !,EEI  !2!25!9!9:::   !2!24!8!8999 ""$$$ q!!!k4(( 3A//112223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 NN;tYDDEEEqLGGs   5(P))P-	0P-	r9   c           
     p    t          t                              | |t          j        |||                    S )zSave and instantly wrap for UI.rx   r>   rW   rq   r   )r9   r   r   r
   rC   )r=   rx   rW   rq   r   s        r   get_save_audio_uiz!AudioSaveHelper.get_save_audio_uit  sC    
 && /&- '  	
 	
 		
r   N)r   r   )r=   r.   rx   r   r>   r
   rW   rX   rq   r   r   r   r   r)   )
rx   r   rW   rX   rq   r   r   r   r   r9   )r    r!   r"   r7   r   r   r   r   r   r   r   r   r     s~        QQ444K i i i i \iV gm
 
 
 
 \
 
 
r   r   c                      e Zd Zddd	Zd
 ZdS )PreviewImageFNimage
Image.Typer2   r+   rW   type[ComfyNode]c           
         t                               |dd                    d t          d          D                       z   t          j        |d          | _        || _        d S )NComfyUI_temp_ c              3  >   K   | ]}t          j        d           V  dS )abcdefghijklmnopqrstupvxyzNrandomchoicer   r{   s     r   	<genexpr>z(PreviewImage.__init__.<locals>.<genexpr>  .      5t5tfgfmD`6a6a5t5t5t5t5t5tr      r   r   )rH   r   r   ranger
   tempvaluesr2   )r   r   r2   rW   kwargss        r   r   zPreviewImage.__init__  sf    %11+bgg5t5tkpqrksks5t5t5t.t.tt" 2 
 
 !r   c                "    | j         | j        fdS )Nr0   r2   )r  r2   r   s    r   r4   zPreviewImage.as_dict  s    k(
 
 	
r   FN)r   r   r2   r+   rW   r   r    r!   r"   r   r4   r   r   r   r   r     s<        ! ! ! ! !
 
 
 
 
r   r   c                  "     e Zd Zd
d fd	Z xZS )PreviewMaskFNmaskPreviewMask.Typer2   r+   rW   r	   c                    |                     dd|j        d         |j        d         f                              dd                              dddd          } t	                      j        |||fi | d S )Nr   r      )r   r   r   expandr   r   )r   r  r2   rW   r  previewr   s         r   r   zPreviewMask.__init__  s|    ,,Atz"~tz"~FGGOOPQSUVV]]^`bdfhjkll(C::6:::::r   r  )r  r  r2   r+   rW   r	   )r    r!   r"   r   r$   r%   s   @r   r
  r
    sB        ; ; ; ; ; ; ; ; ; ; ;r   r
  c                       e Zd Zd	d
dZddZdS )PreviewAudioNr=   r.   rW   r   c           
         t                               |dd                    d t          d          D                       z   t          j        |dd          | _        d S )Nr   r   c              3  >   K   | ]}t          j        d           V  dS )abcdefghijklmnopqrstuvwxyzNr   r   s     r   r   z(PreviewAudio.__init__.<locals>.<genexpr>  r   r   r   r   r   r   )r   r   r   r  r
   r  r  )r   r=   rW   r  s       r   r   zPreviewAudio.__init__  s`    %00+bgg5t5tkpqrksks5t5t5t.t.tt" 1 
 
r   r   c                    d| j         iS r<   r  r   s    r   r4   zPreviewAudio.as_dict  s    %%r   r-   )r=   r.   rW   r   r5   r  r   r   r   r  r    sA        
 
 
 
 
& & & & & &r   r  c                      e Zd ZddZd ZdS )PreviewVideor  list[SavedResult | dict]c                    || _         d S r-   r  )r   r  r  s      r   r   zPreviewVideo.__init__  s    r   c                    | j         ddS )Nr1   r  r  r   s    r   r4   zPreviewVideo.as_dict  s    +7;;;r   N)r  r  r  r   r   r   r  r    s7           < < < < <r   r  c                      e Zd Zd Zd ZdS )PreviewUI3Dc                   || _         || _        d | _        |                    dd           }||d                                                                         dz                      t          j                  }t          j
        |          }t          j                    }dt          j                    j         d}t           j                            ||          }	|                    |	d           d| | _        d S d S )	Nbg_imager   rM   bg_z.pngr   )r   ztemp/)
model_filecamera_infobg_image_pathgetrR   rS   rT   rP   rU   rN   rO   rA   rE   uuiduuid4hexr   r   r   r   )
r   r#  r$  r  r!  	img_arrayr   temp_dirr   r%  s
             r   r   zPreviewUI3D.__init__  s    $&!::j$//!!**0022S8@@JJI$Y//C#688H3TZ\\-333HGLL8<<MHH]1H555!3!3!3D  r   c                .    d| j         | j        | j        giS Nr   )r#  r$  r%  r   s    r   r4   zPreviewUI3D.as_dict      4?D,<d>PQRRr   Nr  r   r   r   r  r    s7        4 4 4S S S S Sr   r  c                      e Zd Zd Zd ZdS )PreviewUI3DAdvancedc                0    || _         || _        || _        d S r-   r#  r$  model_3d_info)r   r#  r$  r3  s       r   r   zPreviewUI3DAdvanced.__init__  s    $&*r   c                .    d| j         | j        | j        giS r-  r2  r   s    r   r4   zPreviewUI3DAdvanced.as_dict  r.  r   Nr  r   r   r   r0  r0    s7        + + +
S S S S Sr   r0  c                      e Zd ZddZd ZdS )PreviewTextr   r   c                    || _         d S r-   r   )r   r   r  s      r   r   zPreviewText.__init__  s    


r   c                    d| j         fiS )Ntextr8  r   s    r   r4   zPreviewText.as_dict  s    &&r   N)r   r   r  r   r   r   r6  r6    s7           ' ' ' ' 'r   r6  )r   r'   r9   rH   r   r   r
  r  r  r  r0  r6  )r>   r
   r   r   ))
__future__r   r_   r   r   r'  ior   r   rS   rP   torchr   r   PILr   rN   PIL.PngImagePluginr   rA   comfy.cli_argsr   _ior	   r
   r   r.   r   r'   r9   rF   rH   r   r   r
  r  r  r  r0  r6  __all__r   r   r   <module>rC     sI   " " " " " "  				         				     " "! ! ! ! ! ! ! & & & & & &            8 8 8 8 8 8 8 8 8 8 8 8( ( ( ( ($ ( ( ("    )   ' ' ' ' ') ' ' '- - - -uB uB uB uB uB uB uB uBp~
 ~
 ~
 ~
 ~
 ~
 ~
 ~
B
 
 
 
 
9 
 
 
$; ; ; ; ;, ; ; ;& & & & &9 & & &< < < < <9 < < <S S S S S) S S S&S S S S S) S S S' ' ' ' ') ' ' '  s   1 7