
    
3jE              
       *   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  S SKrS SK	r
S SKJr  S SKJrJr  S SKJrJrJr  S SKJr  S SKJr  S SKJrJr  S SKrS	S
KJrJrJrJ r J!r!J"r"J#r#J$r$J%r%  \RL                  RO                  S \RL                  RQ                  \RL                  RS                  \RL                  RU                  \+5      5      S5      5         " S S\5      r, " S S\5      r- " S S5      r. " S S5      r/ " S S\5      r0S r1S r2g)    N)datetime)Path)ImageImageOps)TAGSGPSTAGSIFD)PngImageFile)JpegImageFile)PreviewImage	SaveImage   )	CATEGORYCONFIGBOOLEANMETADATA_RAWTEXTSsetWidgetValuesloggergetResolutionByTensorget_sizecomfyc                       \ rS rSrS r\S 5       r\R                  R                  \R                  R                  -   rSrSrSrSrSS	 jrS
rg)CImagePreviewFromImage   c                     [         R                  " 5       U l        SU l        SSR	                  S [        S5       5       5      -   U l        SU l        S U l        S U l	        g )Ntemp_ c              3   N   #    U  H  n[         R                  " S 5      v   M     g7f)abcdefghijklmnopqrstupvxyzN)randomchoice).0xs     J/home/wildlama/comfy/ComfyUI/custom_nodes/ComfyUI-Crystools/nodes/image.py	<genexpr>2CImagePreviewFromImage.__init__.<locals>.<genexpr>   s      *i`h[\6==9U+V+V`hs   #%      )
folder_pathsget_temp_directory
output_dirtypejoinrangeprefix_appendcompress_leveldata_cacheddata_cached_textselfs    r&   __init__CImagePreviewFromImage.__init__   sT    &99;	 277*i`efg`h*i#ii $    c                     0 SS0SSS.S.$ )NimageIMAGEPROMPTEXTRA_PNGINFOpromptextra_pnginforequiredoptionalhidden clss    r&   INPUT_TYPES"CImagePreviewFromImage.INPUT_TYPES!   s*      #!0
 	
r9   r   Metadata RAWTexecuteNc                    SnSnS/S// S.S.nUb  U R                  USX#5      nUS   S   S   n[        U R                  5      R                  US   US	   5      n[	        U5      u  pnU/nUnU/US
'   XS   S'   SnU[        U5      -  nUS-  nU[        R                  " U
[        S   S9-  nX@l	        X`l
        OCUc(  U R                  b  SnU R                  nU R                  nO[        R                  " S5        SnXT-   /US   S'   U$ )Nr   textimagesresultuizcrystools/irV   rS   r   	subfolderfilenamerU   zSource: Image link 
z!Current prompt (NO FROM IMAGE!):
indentrY   zSource: Image link - CACHED
z'Source: Empty on CImagePreviewFromImageSource: EmptyrR   )save_imagesr   r-   joinpathbuildMetadatabuildPreviewTextjsondumpsr   r4   r3   r   debug)r6   r;   rA   rB   rR   titledatasaved
image_pathimgpromptFromImagemetadatarS   rU   s                 r&   rO   CImagePreviewFromImage.execute7   sH   d
 $$UM6QE$K)!,Edoo.77k8JER\L]^J-::-F*C(WFF$XDN#)Jx +E$X..D89DDJJvh7GHHD$(!#]t//;3E##D((D LLBC"D#l^T
6r9   )r2   r3   r4   r-   r1   r.   )NNN__name__
__module____qualname____firstlineno__r7   classmethodrJ   r   MAINvaluer=   RETURN_TYPESRETURN_NAMESOUTPUT_NODEFUNCTIONrO   __static_attributes__rG   r9   r&   r   r      sT    % 
 
 }}""X^^%9%99H$L$LKH*r9   r   c                       \ rS rSrS r\S 5       r\R                  R                  \R                  R                  -   rSrSrSrSrSS	 jrSS
 jrSrg)CImagePreviewFromMetadatad   c                      S U l         S U l        g Nr3   r4   r5   s    r&   r7   "CImagePreviewFromMetadata.__init__e   s     $r9   c                     0 S[         0S.$ )Nmetadata_raw)rD   rE   rL   rH   s    r&   rJ   %CImagePreviewFromMetadata.INPUT_TYPESi   s     	
 	
r9   rL   rM   TrO   Nc                    SnSnS/S// S.S.nUbz  US:w  at  0 nSU;   a  US   nSnU[        U5      -  nUS-  nU[        R                  " U[        S   S9-  nU R	                  US	   S
   5      nUnU/US'   XdS   S'   X l        X@l        OCUc(  U R                  b  SnU R                  nU R
                  nO[        R                  " S5        SnX2-   /US   S'   U$ )Nr   rQ   rT   rA   zSource: Metadata RAW
zPrompt from image:
rY   rZ   fileinforX   rU   rV   rS   zSource: Metadata RAW - CACHED
z*Source: Empty on CImagePreviewFromMetadatar[   rR   )	r_   r`   ra   r   resolveImager4   r3   r   rb   )r6   r   rR   rc   rd   rh   rS   rU   s           r&   rO   !CImagePreviewFromMetadata.execute{   s   d
 #(: O<' ,X 6o,E$\22D*+DDJJvh7GHHD&&|J'?
'KLF!F$XDN#)Jx $(!#!d&6&6&B5E##D((D LLEF"D#l^T
6r9   c                 Z   / nUGbv  [         R                  R                  [        R                  " 5       5      n[        U5      R                  5       n[         R                  R                  U5      n[        U5      R                  5       n[        U5      R                  5       SL a#  [        [        R                  R                  5      e [         R                  R                  XF/5      nXs:w  a  [        S5      e[         R                  R                  [         R                  R                  Xd5      5      nUR                  [        U5      R                  [         R                  R!                  U5      SS.5        U$ U$ ! [         a!  n	["        R$                  " U	5         S n	A	U$ S n	A	ff = f)NFz,Path invalid (should be in the input folder)input)rX   rW   r.   )ospathnormpathr+   get_input_directoryr   resolveis_file	Exceptionr   FILE_NOT_FOUNDrr   
commonpathrelpathappendnamedirnamer   warn)
r6   rX   rS   image_input_folderimage_input_folder_absrf   image_path_abscommonrelativees
             r&   r   &CImagePreviewFromMetadata.resolveImage   sD   !#!1!1,2R2R2T!U%)*<%=%E%E%G"))(3J!*-557NN#++-6 4 4 : :;;++-C,TU/#$RSS77++BGGOON,cd $X 3 3!#!:#  v  As   
B1E? ?
F*	F%%F*r}   r|   )rl   rm   rn   ro   r7   rp   rJ   r   rq   rr   r=   rs   rt   ru   rv   rO   r   rw   rG   r9   r&   ry   ry   d   sZ    % 
 
 }}""X^^%9%99H$L$LKH(Tr9   ry   c                       \ rS rSrS r\S 5       r\R                  R                  \R                  R                  -   rSrSrSrSrSS	 jrS
rg)CImageGetResolution   c                     g r|   rG   r5   s    r&   r7   CImageGetResolution.__init__       r9   c                     SS0SSS.S.$ )Nr;   r<   	UNIQUE_IDr?   )	unique_idrB   )rD   rF   rG   rH   s    r&   rJ   CImageGetResolution.INPUT_TYPES   s%      )!0	
 	
r9   )INTr   )widthheightTrO   Nc                     [        U5      nUS    SUS    3/n[        XSU5        [        R                  " SU 35        SU0US   US   4S.$ )Nr%   yResolution: rR   )rV   rU   )r   r   r   rb   )r6   r;   rB   r   resrR   s         r&   rO   CImageGetResolution.execute   s`    #E*s8*Ac#hZ()7|D6*+tnS3s80DEEr9   rG   )NNrk   rG   r9   r&   r   r      sU     	
 	
 }}""X^^%9%99H"L'LKHFr9   r   c                       \ rS rSrS r\S 5       r\R                  R                  \R                  R                  -   rSrSrSrSrS rS	 r\S
 5       r\S 5       rSrg)CImageLoadWithMetadata   c                     g r|   rG   r5   s    r&   r7   CImageLoadWithMetadata.__init__   r   r9   c                 N  ^^	 [         R                  " 5       n1 SknSS1n/ n[        R                  " USS9 H  u  pVnU V^s/ s H!  m[	        U4S jU 5       5      (       a  M  TPM#     snUS S & U V	^	s/ s H!  m	[	        U	4S jU 5       5      (       a  M  T	PM#     nn	U Ha  n
[        R
                  R                  [        R
                  R                  XZ5      US9nUR                  S	S
5      nUR                  U5        Mc     M     SS[        U5      SS0400$ s  snf s  sn	f )N>   *.lock	Thumbs.db
*.DS_Storedesktop.ini	clipspacez.*T)followlinksc              3   R   >#    U  H  n[         R                   " TU5      v   M     g 7fr|   fnmatch)r$   excludeds     r&   r'   5CImageLoadWithMetadata.INPUT_TYPES.<locals>.<genexpr>   s"     1m]lRY'//!W2M2M]l   $'c              3   R   >#    U  H  n[         R                   " TU5      v   M     g 7fr|   r   )r$   r   fs     r&   r'   r      s"     0j\iQXG1L1L\ir   )start\/rD   r;   image_upload)r+   r   r   walkanyr   r   r/   replacer   sorted)rI   	input_direxclude_filesexclude_folders	file_listrootdirsfilesr   r   filer   s           ``  r&   rJ   "CImageLoadWithMetadata.INPUT_TYPES   s    446	M&-	!#!ED"&n$Qc1m]l1m.mq$nDG %k1S0j\i0j-jQEk ''//"'',,t*B)/T!//$4  )	  "F &+nd-CD
 	
 oks   D$D5D"D")r=   MASKJSONr   )r;   maskrA   rN   TrO   c                 P   [         R                  " U5      n[        R                  " U5      n[	        U5      u  pEnUR
                  S:X  a*   [        R                  " U5      nU R                  U5      u  pV[        R                  " U5      nUR                  S5      n[        R                  " U5      R                  [        R                   5      S-  n["        R$                  " U5      S   nSUR'                  5       ;   a_  [        R                  " UR)                  S5      5      R                  [        R                   5      S-  nS["        R$                  " U5      -
  nO$["        R*                  " S["        R                   SS	9nXR-                  S
5      XV4$ ! [         a    0 n GN/f = f)NWEBPRGBg     o@r|   Ag      ?)@   r   cpu)dtypedevicer   )r+   get_annotated_filepathr   openr^   formatpiexifloadprocess_exif_data
ValueErrorr   exif_transposeconvertnparrayastypefloat32torch
from_numpygetbands
getchannelzeros	unsqueeze)	r6   r;   rf   imgFrg   rA   ri   	exif_datar   s	            r&   rO   CImageLoadWithMetadata.execute  sE   !88?
zz*% -j 9X;;&  ++j1i!%!7!7	!Bf %%c*E"&&rzz2U:  '.#,,. 88CNN3/077

CeKD((..D;;xu}}UKDnnQ'99  fs   )F F%$F%c                    0 nSU;   aM  SUS   ;   aD  US   S   R                  S5      nUR                  SSS5      n [        R                  " U5      US'   SU;   aM  SUS   ;   aD  US   S   R                  S5      nUR                  S	SS5      n [        R                  " U5      US
'   UR                  U5        U$ ! [        R                   a    X2S'    Nf = f! [        R                   a    XBS
'    NKf = f)N0thi  zutf-8zPrompt:r   r*   rA   i  z	Workflow:workflow)decoder   r`   loadsJSONDecodeErrorupdate)r6   r   ri   prompt_dataworkflow_datas        r&   r   (CImageLoadWithMetadata.process_exif_data&  s   I#5)9"9#E*3/66w?K%--iQ?K1%)ZZ%<"
 I#5)9"9%e,S188AM)11+r1EM5'+zz-'@$
 		"! '' 1%0"1 '' 5'4$5s#   B< C <CCC54C5c                    [         R                  " U5      n[        R                  " 5       n[	        US5       nUR                  UR                  5       5        S S S 5        UR                  5       R                  5       $ ! , (       d  f       N,= f)Nrb)	r+   r   hashlibsha256r   r   readdigesthex)rI   r;   rf   mr   s        r&   
IS_CHANGED!CImageLoadWithMetadata.IS_CHANGEDB  s]    !88?
NN*d#qHHQVVX $xxz~~ $#s    A>>
Bc                 \    [         R                  " U5      (       d  SR                  U5      $ g)NzInvalid image file: {}T)r+   exists_annotated_filepathr   )rI   r;   s     r&   VALIDATE_INPUTS&CImageLoadWithMetadata.VALIDATE_INPUTSJ  s'    55e<<+22599r9   rG   N)rl   rm   rn   ro   r7   rp   rJ   r   rq   rr   r=   rs   rt   ru   rv   rO   r   r  r  rw   rG   r9   r&   r   r      s     
 
4 }}""X^^%9%99H<L>LKH:28      r9   r   c                      ^  \ rS rSrU 4S jr\S 5       r\R                  R                  \R                  R                  -   rSrSrSrSrS
U 4S jjrS	rU =r$ )CImageSaveWithExtraMetadataiR  c                 >   > [         TU ]  5         S U l        S U l        g r|   )superr7   r3   r4   )r6   	__class__s    r&   r7   $CImageSaveWithExtraMetadata.__init__S  s     $r9   c                     SSSS04[         S.SSS[        R                  " SS	S
SSSSS/SS.	[        S   S9R	                  SS5      S.40SSS.S.$ )Nr<   STRINGdefaultComfyUI)r;   filename_prefixwith_workflowmetadata_extraTzImage generated by Crystianz3More info: https:\/\/www.instagram.com\/crystian.iazcrystian.iaStableDiffusionr)   r   )	TitleDescriptionAuthorSoftwareCategoryRatingUserCommentKeywords
CopyrightsrY   rZ   z\/r   )	multiliner  r>   r?   r@   rC   )r   r`   ra   r   r   rH   s    r&   rJ   'CImageSaveWithExtraMetadata.INPUT_TYPESX  s    
 $$,y).D#E!(	 !84DJJ8!V)'/!# !#X !*M, -4GE3,?. #" #!0/
 	
r9   rL   rM   TrO   c                   > S/S// S.S.nUb  USL a!  UR                  5       nUR                  5       nOS nS nUbT  US:w  aN   [        R                  " U5      n[        U[        5      (       a"  UR                  5        H  u  pUc  0 nXU
'   M     [        TU ]-  XXX5      nUS   S	   S
   n[        U R                  5      R                  US   US   5      n[        U5      u  pnU/nUnU/US'   UUS   S	'   U$ [        R                   " S5        U$ ! [         a0  n	[        R
                  " SU	 35        S[        U5      0n S n	A	NS n	A	ff = f)Nr   rQ   rT   T	undefinedz>Error parsing metadata_extra (it will send as string), error: extrarV   rS   r   rW   rX   rU   z,Source: Empty on CImageSaveWithExtraMetadata)copyr`   r   r   r   errorstr
isinstancedictitemsr  r\   r   r-   r]   r^   rb   )r6   r;   r  r  r  rA   rB   rd   extra_pnginfo_newr   kvre   rf   rg   rh   ri   rS   rU   r  s                      r&   rO   #CImageSaveWithExtraMetadata.execute~  s~   d
 $$1$6$6$8!$(!)n.KD%)ZZ%?N
 nd33 . 4 4 6,402-/0!,	 !7 G'ZE$K)!,Edoo.77k8JER\L]^J-::-F*C(WFF$XDN#)DJx 
  LLGH5 ! DLL#abcad!ef&-s>/B%CNDs   D 
E&EEr}   )Nr  TNNN)rl   rm   rn   ro   r7   rp   rJ   r   rq   rr   r=   rs   rt   ru   rv   rO   rw   __classcell__)r  s   @r&   r  r  R  sZ    %
 
 
< }}""X^^%9%99H$L$LKH. .r9   r  c           	      0   [        U 5      R                  5       SL a#  [        [        R                  R
                  5      e[        R                  " U 5      n0 n0 n[        U 5      R                  5       UR                   SUR                   3[        [        R                  " [        R                  R!                  U 5      5      5      [        [#        U 5      5      S.US'   [%        U[&        5      (       a  UR(                  nUR+                  5        Hw  u  pVUS:X  a   [,        R.                  " US   5      US'   M*  US:X  a$   [,        R.                  " US   5      US'   US   nMT   [,        R.                  " U5      U[        U5      '   My     [%        U[6        5      (       a  UR9                  5       nUR+                  5        H7  u  pV[:        R<                  " XU5      n	Uc  M   [        U5      U[        U	5      '   M9     [>         H  n
 U
[>        R@                  :X  a  [B        nO[:        nURE                  U
5      n[        U
RF                  5      n0 X-'   UR+                  5        H/  u  pVUR=                  XU5      n	[        U5      X-   [        U	5      '   M1     M     XU4$ ! [         a%  n[0        R2                  " SU 35         S nAGM  S nAff = f! [         a%  n[0        R2                  " SU 35         S nAGM  S nAff = f! [         ay  n[0        R4                  " S	U S
U 35         [        U5      U[        U5      '    S nAGM4  ! [         a,  n[0        R4                  " S	U SU 35         S nA S nAGMe  S nAff = fS nAff = f! [H         a     GM  f = f)NFr%   )rX   
resolutiondatesizer   r   z*Error parsing metadataFromImg 'workflow': rA   z(Error parsing metadataFromImg 'prompt': zError parsing z as json, trying as string: z it will be skipped: )%r   r   r   r   r   rr   r   r   as_posixr   r   r,  r   fromtimestampr   r   getmtimer   r-  r
   infor/  r`   r   r   r   rb   r   getexifr   getr	   GPSInfor   get_ifdr   KeyError)rf   rg   ri   rA   metadataFromImgr1  r2  r   exiftagifd_idr   ifdifd_names                 r&   r^   r^     s   J!U*,,2233
**Z
 CHF $--/1SZZL1H**277+;+;J+GHIHZ()	HZ #|$$(( $))+DAJR+/::oj6Q+RHZ(
 hP)-OH4M)NHX& &h/F
S'+zz!}HSV$+ ,: #}%%{{}JJLDA((1.C}%(VS" !
 FS[[(%G"Gll6*v{{+%'"IIKDA!++a+C36q6H&s3x0 ( &   g ! RKK"LQC PQQR ! PKK"J1# NOOP ! SLL>!4PQRPS!TUS+.q6Q(($ S~aS8MaS%QRRS	S<  s   J!K&"L BN
K&KK
K=K88K= 
N
M>'M
M;M6+M>6M;;M>>N
NNc                 x    SU S   S    S3nUSU S   S    S3-  nUSU S   S    S3-  nUS	U S   S
    S3-  nU$ )NzFile: r   rX   
r   r6  zDate: r7  zSize: r8  rG   )ri   rR   s     r&   r_   r_      sz    HZ(45R8Dl8J/=>bAADfXj)&12"55DfXj)&12"55DKr9   )3r   r   r"   sysr`   r   r  r   r   numpyr   pathlibr   PILr   r   PIL.ExifTagsr   r   r	   PIL.PngImagePluginr
   PIL.JpegImagePluginr   nodesr   r   r+   corer   r   r   r   r   r   r   r   r   r   insertr/   r   realpath__file__r   ry   r   r   r  r^   r_   rG   r9   r&   <module>rV     s     	  
         + + + - )  z z z 277<<0@0@0J KWU VI\ IX` `FF F@h hVZ) Z|M!`r9   