
    +jG                       S SK Jr  S SKrS SKrS SKrS SKrS SKJr  S SKrS SK	r
S SKr S SKrSrS SKJr  S SKJr  S SKrS SKJr  S	S
KJrJrJrJr   " S S\5      r " S S\5      r " S S\5      rS%S jr " S S5      r " S S5      r  " S S\5      r! " S S\!5      r" " S S\5      r# " S S\5      r$ " S S\5      r% " S  S!\5      r& " S" S#\5      r'/ S$Qr(g!   Sr N= f)&    )annotationsN)BytesIOTF)Image)PngInfo)args   )	ComfyNode
FolderTyper   	_UIOutputc                  h   ^  \ rS rSrSU 4S jjr\SS j5       r\SS j5       r\S	S j5       rSr	U =r
$ )
SavedResult   c                6   > [         TU ]  XUR                  S9  g )N)filename	subfoldertype)super__init__value)selfr   r   r   	__class__s       4/home/wildlama/comfy/ComfyUI/comfy_api/latest/_ui.pyr   SavedResult.__init__   s    (TZZP    c                    U S   $ )Nr    r   s    r   r   SavedResult.filename   s    Jr   c                    U S   $ )Nr   r   r   s    r   r   SavedResult.subfolder#   s    K  r   c                    [        U S   5      $ )Nr   )r
   r   s    r   r   SavedResult.type'   s    $v,''r   r   )r   strr   r#   r   r
   )returnr#   )r$   r
   )__name__
__module____qualname____firstlineno__r   propertyr   r   r   __static_attributes____classcell__r   s   @r   r   r      sE    Q     ! ! ( (r   r   c                  >   ^  \ rS rSrSrSSU 4S jjjrSS jrSrU =r$ )	SavedImages,   zNA UI output class to represent one or more saved images, potentially animated.c                :   > [         TU ]  5         Xl        X l        g N)r   r   resultsis_animated)r   r2   r3   r   s      r   r   SavedImages.__init__.   s    &r   c                N    SU R                   0nU R                  (       a  SUS'   U$ )NimagesTanimated)r2   r3   )r   datas     r   as_dictSavedImages.as_dict3   s(    $,,'&Dr   )r3   r2   )F)r2   list[SavedResult]r3   boolr$   dict	r%   r&   r'   r(   __doc__r   r:   r*   r+   r,   s   @r   r.   r.   ,   s    X' '
 r   r.   c                  :   ^  \ rS rSrSrSU 4S jjrSS jrSrU =r$ )SavedAudios:   zFUI wrapper around one or more audio files on disk (FLAC / MP3 / Opus).c                .   > [         TU ]  5         Xl        g r1   )r   r   r2   )r   r2   r   s     r   r   SavedAudios.__init__<   s    r   c                    SU R                   0$ Naudior2   r   s    r   r:   SavedAudios.as_dict@   s    &&r   rJ   )r2   r<   r>   r@   r,   s   @r   rC   rC   :   s    P' 'r   rC   c                    U [         R                  :X  a  [        R                  " 5       $ U [         R                  :X  a  [        R
                  " 5       $ [        R                  " 5       $ r1   )r
   inputfolder_pathsget_input_directoryoutputget_output_directoryget_temp_directory)folder_types    r   _get_directory_by_folder_typerT   D   sK    j&&&//11j'''0022**,,r   c                  `   \ rS rSrSr\SS j5       r\SS j5       r\SS j5       r\SS j5       r	\ S       SS jj5       r
\SSS jj5       r\            SS	 j5       r\          SS
 j5       r\                SS j5       r\              SS j5       rSrg)ImageSaveHelperL   zGA helper class with static methods to handle image saving and metadata.c                    [         R                  " [        R                  " SU R	                  5       R                  5       -  SS5      R                  [        R                  5      5      $ )z.Converts a single torch tensor to a PIL Image.g     o@r      )PILImage	fromarraynpclipcpunumpyastypeuint8)image_tensors    r   _convert_tensor_to_pil&ImageSaveHelper._convert_tensor_to_pilO   sL     !!"''%,2B2B2D2J2J2L*LaQT"U"\"\]_]e]e"fggr   c                   [         R                  (       d  U b  U R                  (       d  g[        5       nU R                  R                  (       a:  UR                  S[        R                  " U R                  R                  5      5        U R                  R                  (       aZ  U R                  R                   H@  nUR                  U[        R                  " U R                  R                  U   5      5        MB     U$ )z7Creates a PngInfo object with prompt and extra_pnginfo.Nprompt)	r   disable_metadatahiddenr   rf   add_textjsondumpsextra_pnginfoclsmetadataxs      r   _create_png_metadata$ImageSaveHelper._create_png_metadataT   s       CKszz9::h

3::3D3D(EF::##ZZ--!!!TZZ

0H0H0K%LM .r   c           	        [         R                  (       d  U b  U R                  (       d  g[        5       nU R                  R                  (       a_  UR                  SSR                  SS5      S-   [        R                  " U R                  R                  5      R                  SS5      -   SS9  U R                  R                  (       a  U R                  R                   He  nUR                  SUR                  SS5      S-   [        R                  " U R                  R                  U   5      R                  SS5      -   SS9  Mg     U$ )	zPCreates a PngInfo object with prompt and extra_pnginfo for animated PNGs (APNG).Ns   comfrf   zlatin-1strict    T)
after_idat)
r   rg   rh   r   rf   addencoderj   rk   rl   rm   s      r   _create_animated_png_metadata-ImageSaveHelper._create_animated_png_metadataa   s      CKszz9::LL	84**SZZ../66y(KL     ::##ZZ--HHY1jj!9!9!!<=DDYPXYZ  $   . r   c                    U R                  5       n[        R                  (       d  Ub  UR                  c  U$ UR                  R                  b<  SR                  [        R                  " UR                  R                  5      5      US'   UR                  R                  b\  SnUR                  R                  R                  5        H2  u  pESR                  U[        R                  " U5      5      X#'   US-  nM4     U$ )z,Creates EXIF metadata bytes for WebP images.z	prompt:{}i  i  z{}:{}r   )
getexifr   rg   rh   rf   formatrj   rk   rl   items)	pil_imagern   	exif_datainital_exif_tagkeyr   s         r   _create_webp_metadata%ImageSaveHelper._create_webp_metadataz   s     %%'	  CK3::3E::( + 2 24::cjj>O>O3P QIf::##/$O!jj66<<>
-4^^CEAR-S	*1$ ? r   c                   [         R                  " U[        U5      U S   R                  S   U S   R                  S   5      u  pVpxn	/ n
[        R                  U5      n[        U 5       H  u  p[        R                  U5      nUR                  S[        U5      5      nU SUS S3nUR                  [        R                  R                  UU5      XS9  U
R                  [        UX5      5        US-  nM     U
$ )z0Saves a batch of images as individual PNG files.r   r   %batch_num%_05_.png)pnginfocompress_level)rN   get_save_image_pathrT   shaperV   rq   	enumeraterc   replacer#   saveospathjoinappendr   )r6   filename_prefixrS   rn   r   full_output_folderr   counterr   r   r2   ro   batch_numberrb   imgfilename_with_batch_numfiles                    r   save_imagesImageSaveHelper.save_images   s    
 ?K>^>^:;GPQYZI[]cde]f]l]lmn]o?
;g! "77<*3F*;&L!88FC&.&6&6}c,FW&X#-.a|5ADHHRWW\\"4d;XHmNN;tYDEqLG +< r   c           
     ^    [        [        R                  U U[        R                  UUS95      $ )zDSaves a batch of images and returns a UI object for the node output.r   rS   rn   r   )r.   rV   r   r
   rP   )r6   r   rn   r   s       r   get_save_images_ui"ImageSaveHelper.get_save_images_ui   s9     ++ /&--- , 
 	
r   c           
        [         R                  " U[        U5      U S   R                  S   U S   R                  S   5      u  pgpn
U  Vs/ s H  n[        R                  U5      PM     nn[        R                  U5      nU SUS S3n[        R                  R                  Xn5      nUS   R                  UUUS[        SU-  5      USS S	9  [        XU5      $ s  snf )
z1Saves a batch of images as a single animated PNG.r   r   r   r   r   T     @@N)r   r   save_alldurationappend_images)rN   r   rT   r   rV   rc   ry   r   r   r   r   intr   )r6   r   rS   rn   fpsr   r   r   r   r   r   r   
pil_imagesro   r   	save_paths                   r   save_animated_png!ImageSaveHelper.save_animated_png   s    
 ?K>^>^:;GPQYZI[]cde]f]l]lmn]o?
;g! NTTVco<<SAV
T"@@E1WRL.GGLL!3:	1)#&$QR. 	 	
 4K88 Us   Cc           	     |    [         R                  U U[        R                  UUUS9n[	        U/[        U 5      S:  S9$ )zBSaves an animated PNG and returns a UI object for the node output.)r   rS   rn   r   r   r   r3   )rV   r   r
   rP   r.   len)r6   r   rn   r   r   results         r   get_save_animated_png_ui(ImageSaveHelper.get_save_animated_png_ui   sJ    
 !22+"))) 3 
 F8VqAAr   c                   [         R                  " U[        U5      U S   R                  S   U S   R                  S   5      u  ppnU  Vs/ s H  n[        R                  U5      PM     nn[        R                  US   U5      nU	 SU
S S3nUS   R                  [        R                  R                  UU5      S[        SU-  5      USS UUUUS	9  [        UX5      $ s  snf )
z2Saves a batch of images as a single animated WebP.r   r   r   r   z_.webpTr   N)r   r   r   exiflosslessqualitymethod)rN   r   rT   r   rV   rc   r   r   r   r   r   r   r   )r6   r   rS   rn   r   r   r   r   r   r   r   r   r   r   r   pil_exifr   s                    r   save_animated_webp"ImageSaveHelper.save_animated_webp   s     ?K>^>^:;GPQYZI[]cde]f]l]lmn]o?
;g! NTTVco<<SAV
T"88AL1WRL/1GGLL+T2#&$QR. 	 		
 488 Us   C c                    [         R                  U U[        R                  UUUUUS9n[	        U/[        U 5      S:  S9$ )zCSaves an animated WebP and returns a UI object for the node output.)r   rS   rn   r   r   r   r   r   r   )rV   r   r
   rP   r.   r   )r6   r   rn   r   r   r   r   r   s           r   get_save_animated_webp_ui)ImageSaveHelper.get_save_animated_webp_ui   sP     !33+")) 4 	
 F8VqAAr   r   N)rb   ztorch.Tensorr$   PILImage.Image)rn   type[ComfyNode] | Noner$   zPngInfo | None)r   r   rn   r   r$   zPILImage.Exif)   )r   r#   rS   r
   rn   r   r$   r<   )r   r#   rn   r   r$   r.   )r   r#   rS   r
   rn   r   r   floatr   r   r$   r   )
r   r#   rn   r   r   r   r   r   r$   r.   )r   r#   rS   r
   rn   r   r   r   r   r=   r   r   r   r   r$   r   )r   r#   rn   r   r   r   r   r=   r   r   r   r   r$   r.   )r%   r&   r'   r(   rA   staticmethodrc   rq   ry   r   r   r   r   r   r   r   r*   r   r   r   rV   rV   L   s   Qh h 
 
  0   mn!$3=DZ	 $ 

 

 9!$93=9DZ9af9x{9	9 9* B!$B+ABHMB_bB	B B 99  9 $	9
 9 9 9 9 
9 9: BB $B 	B
 B B B 
B Br   rV   c                      \ rS rSrSr/ SQr\  S             S	S jj5       r\ S         S
S jj5       rSr	g)AudioSaveHelperi  zGA helper class with static methods to handle audio saving and metadata.)i@  i.  i>  i]  逻  c                   [         R                  " U[        U5      5      u  pgpn
0 n[        R                  (       d  Ub  UR
                  R                  b-  [        R                  " UR
                  R                  5      US'   UR
                  R                  bL  UR
                  R                   H2  n[        R                  " UR
                  R                  U   5      X'   M4     / n[        U S   R                  5       5       GH-  u  pUR                  S[        U5      5      nU SUS SU 3n[        R                  R!                  UU5      nU S   nUS:X  a  US	:  a  S	nOTU["        R$                  ;  a@  ['        ["        R$                  5       H  nUU:  d  M  Un  O   U["        R$                  ;  a  S	nUU S   :w  a9  [(        (       d  [+        S
5      e[,        R.                  R1                  XS   U5      n[3        5       n[4        R6                  " USUS9nUR9                  5        H  u  nnUUR:                  U'   M     UR<                  S   S:X  a  SOSnUS:X  aW  UR?                  SUUS9nUS:X  a  SUl         OUS:X  a  SUl         OUS:X  a  SUl         OxUS:X  a  SUl         OjUS:X  a  SUl         O\US:X  aE  UR?                  SUUS9nUS:X  a  SURB                  l"        O-US:X  a  SUl         OUS:X  a  SUl         OUR?                  S UUS9n[4        RF                  RI                  URK                  SS5      RM                  SS!5      RO                  5       RQ                  5       S"US#9nUUl)        SUl*        URW                  URY                  U5      5        URW                  URY                  S 5      5        UR[                  5         UR]                  S5        [7        US$5       nUR_                  URa                  5       5        S S S 5        URc                  [e        UX5      5        US-  nGM0     U$ ! , (       d  f       N5= f)%Nrf   waveformr   r   r   .sample_rateopusr   z3torchaudio is not available; cannot resample audio.w)moder}   r   r   monostereolibopus)ratelayout64ki   96ki w 128ki  192ki  320ki  mp3
libmp3lameV0flacflt)r}   r   wb)3rN   r   rT   r   rg   rh   rf   rj   rk   rl   r   r^   r   r#   r   r   r   r   _OPUS_RATESsortedTORCH_AUDIO_AVAILABLE	Exception
torchaudio
functionalresampler   avopenr~   ro   r   
add_streambit_ratecodec_contextqscale
AudioFramefrom_ndarraymovedimreshaper   r_   r   ptsmuxrx   closeseekwrite	getbufferr   r   )rI   r   rS   rn   r}   r   r   r   r   r   r   ro   rp   r2   r   r   r   r   output_pathr   r   output_bufferoutput_containerr   r   r   
out_streamframefs                                r   
save_audioAudioSaveHelper.save_audio  s    ?K>^>^:;G?
;g! $$zz  ,%)ZZ

0A0A%B"zz''311A"&**SZZ-E-Ea-H"IHK 2 &/j0A0E0E0G&H"L&.&6&6}c,FW&X#-.a|1VHED'',,'94@K  .K &"'K (C(CC &'B'B C+-*.K! !D #/*E*EE&+ %"6600'(]^^)44==hmH\^ijH $IM!ww}3vN 'nn.
U16 ))#. /  (~~a0A5V8F-88]c8d
e#*/J'%*/J'&*0J'&*0J'&*0J'5-88K`f8g
d?67J,,3&*0J'&*0J'-88kZ`8a
MM..  A&..q"5;;=CCE / E
 !,EEI  !2!25!9:   !2!24!89 ""$ q!k4(A//12 ) NN;tYDEqLGe 'Ih  )(s   ) P88
Q	c                `    [        [        R                  U U[        R                  UUUS95      $ )zSave and instantly wrap for UI.r   rS   rn   r}   r   )rC   r   r   r
   rP   )rI   r   rn   r}   r   s        r   get_save_audio_ui!AudioSaveHelper.get_save_audio_uit  s<    
 && /&-- ' 	
 		
r   r   N)r   r   )rI   r?   r   r#   rS   r
   rn   r   r}   r#   r   r#   r$   r<   )
r   r#   rn   r   r}   r#   r   r#   r$   rC   )
r%   r&   r'   r(   rA   r   r   r   r   r*   r   r   r   r   r     s    Q4K iii  i $	i
 i i 
i iV gm
 #
*@
JM
ad
	
 
r   r   c                  (    \ rS rSrSSS jjrS rSrg)PreviewImagei  Nc           
         [         R                  USSR                  S [        S5       5       5      -   [        R
                  USS9U l        X l        g )NComfyUI_temp_ c              3  N   #    U  H  n[         R                  " S 5      v   M     g7f)abcdefghijklmnopqrstupvxyzNrandomchoice.0r   s     r   	<genexpr>(PreviewImage.__init__.<locals>.<genexpr>        5tksfgfmmD`6a6aks   #%   r   r   )rV   r   r   ranger
   tempvaluesr8   )r   imager8   rn   kwargss        r   r   PreviewImage.__init__  sN    %11+bgg5tkpqrks5t.tt" 2 
 !r   c                6    U R                   U R                  4S.$ )Nr6   r8   )r  r8   r   s    r   r:   PreviewImage.as_dict  s    kk(
 	
r   )r8   r  FN)r  z
Image.Typer8   r=   rn   type[ComfyNode]r%   r&   r'   r(   r   r:   r*   r   r   r   r  r    s    !
r   r  c                  0   ^  \ rS rSrSSU 4S jjjrSrU =r$ )PreviewMaski  c                   > UR                  SSUR                  S   UR                  S   45      R                  SS5      R                  SSSS5      n[        TU ]  " XRU40 UD6  g )Nr   r      )r   r   r   expandr   r   )r   maskr8   rn   r  previewr   s         r   r   PreviewMask.__init__  sb    ,,Atzz"~tzz"~FGOOPQSUV]]^`bdfhjklC:6:r   r   r  )r$  zPreviewMask.Typer8   r=   rn   r	   )r%   r&   r'   r(   r   r*   r+   r,   s   @r   r  r    s    ; ;r   r  c                  ,    \ rS rSrSSS jjrSS jrSrg)	PreviewAudioi  Nc           
         [         R                  USSR                  S [        S5       5       5      -   [        R
                  USSS9U l        g )Nr  r  c              3  N   #    U  H  n[         R                  " S 5      v   M     g7f)abcdefghijklmnopqrstuvwxyzNr  r  s     r   r  (PreviewAudio.__init__.<locals>.<genexpr>  r  r  r  r   r   r   )r   r   r   r  r
   r  r  )r   rI   rn   r  s       r   r   PreviewAudio.__init__  sJ    %00+bgg5tkpqrks5t.tt" 1 
r   c                    SU R                   0$ rH   r  r   s    r   r:   PreviewAudio.as_dict  s    %%r   r/  r1   )rI   r?   rn   r  r>   r  r   r   r   r(  r(    s    
&r   r(  c                  $    \ rS rSrSS jrS rSrg)PreviewVideoi  c                    Xl         g r1   r/  )r   r  r  s      r   r   PreviewVideo.__init__  s    r   c                     U R                   SS.$ )Nr7   r  r/  r   s    r   r:   PreviewVideo.as_dict  s    ++7;;r   r/  N)r  zlist[SavedResult | dict]r  r   r   r   r2  r2    s    <r   r2  c                       \ rS rSrS rS rSrg)PreviewUI3Di  c                   Xl         X l        S U l        UR                  SS 5      nUb  US   R	                  5       R                  5       S-  R                  [        R                  5      n[        R                  " U5      n[        R                  " 5       nS[        R                  " 5       R                   S3n[         R"                  R%                  Xx5      n	UR'                  U	SS9  SU 3U l        g g )	Nbg_imager   rY   bg_z.pngr   )r   ztemp/)
model_filecamera_infobg_image_pathgetr^   r_   r`   r\   ra   rZ   r[   rN   rR   uuiduuid4hexr   r   r   r   )
r   r<  r=  r  r:  	img_arrayr   temp_dirr   r>  s
             r   r   PreviewUI3D.__init__  s    $&!::j$/!!*002S8@@JI$$Y/C#668HTZZ\--.d3HGGLL<MHH]1H5#(
!3D  r   c                L    SU R                   U R                  U R                  /0$ Nr   )r<  r=  r>  r   s    r   r:   PreviewUI3D.as_dict  $    4??D,<,<d>P>PQRRr   )r>  r=  r<  Nr  r   r   r   r8  r8    s    4Sr   r8  c                       \ rS rSrS rS rSrg)PreviewUI3DAdvancedi  c                (    Xl         X l        X0l        g r1   r<  r=  model_3d_info)r   r<  r=  rN  s       r   r   PreviewUI3DAdvanced.__init__  s    $&*r   c                L    SU R                   U R                  U R                  /0$ rG  rM  r   s    r   r:   PreviewUI3DAdvanced.as_dict  rI  r   )r=  rN  r<  Nr  r   r   r   rK  rK    s    +
Sr   rK  c                  $    \ rS rSrSS jrS rSrg)PreviewTexti  c                    Xl         g r1   r   )r   r   r  s      r   r   PreviewText.__init__  s    
r   c                     SU R                   40$ )NtextrU  r   s    r   r:   PreviewText.as_dict  s    &&r   rU  N)r   r#   r  r   r   r   rS  rS    s    'r   rS  )r   r.   rC   rV   r   r  r  r(  r2  r8  rK  rS  )rS   r
   r$   r#   ))
__future__r   rj   r   r	  r@  ior   r   r_   r\   torchr   r   PILr   rZ   PIL.PngImagePluginr   rN   comfy.cli_argsr   _ior	   r
   r   r?   r   r.   rC   rT   rV   r   r  r  r(  r2  r8  rK  rS  __all__r   r   r   <module>rb     s    "  	    	  "  " &    8 8($ (") ') '-uB uBp~
 ~
B
9 
$;, ;&9 &<9 <S) S&S) S') 'U"!s   C C$