
    +j{#                        d dl Z d dlZd dlmZ dej        deeef         fdZ	 	 	 	 d/dej        dedz  dedz  dedz  d	edz  f
d
Z	 	 d0dddej        dee	e	f         dz  dee	e	f         dz  de
de	f
dZdddej        dej        de	de	de
de	fdZ	 	 d0dddedee	e	f         dz  dee	e	f         dz  de
de	f
dZ	 	 	 	 d/dej        dedz  dedz  dedz  d	edz  f
dZ	 	 d0dej        de	dz  de	dz  fdZ	 	 d0dej        dedz  dedz  fd Zd! Z	 	 d0d"ej        de	dz  de	dz  ddfd#Z	 	 	 	 d1d%efd&Zdej        ddfd'Zd(ee	e	f         de	fd)Zdddd*d+e	dee	e	f         dz  dee	e	f         dz  de
ddf
d,Zd-ede	fd.ZdS )2    N)Inputimagereturnc                     t          | j                  dk    r| j        d         | j        d         fS t          | j                  dk    r| j        d         | j        d         fS t          d          )N            r   zInvalid image tensor shape.)lenshape
ValueError)r   s    E/home/wildlama/comfy/ComfyUI/comfy_api_nodes/util/validation_utils.pyget_image_dimensionsr      si    
5;1{1~u{1~--	U[		Q		{1~u{1~--6777    	min_width	max_width
min_height
max_heightc                    t          |           \  }}|||k     rt          d| d| d          |||k    rt          d| d| d          |||k     rt          d| d| d          |||k    rt          d| d| d          d S d S )NzImage width must be at least px, got pxzImage width must be at most zImage height must be at least zImage height must be at most )r   r   )r   r   r   r   r   heightwidths          r   validate_image_dimensionsr      s     )//MFE!2!2UUUEUUUVVV!2!2T	TT5TTTUUU&:"5"5X*XXfXXXYYY&:"5"5WWWVWWWXXX "5"5r   T)strict	min_ratio	max_ratior   c                    t          |           \  }}|dk    s|dk    rt          d| d|           ||z  }t          ||||           |S )zfValidates that image aspect ratio is within min and max. If a bound is None, that side is not checked.r   zInvalid image dimensions: xr   r   r   )r   r   _assert_ratio_bounds)r   r   r   r   whars          r   validate_image_aspect_ratior%   $   sj      &&DAqAvva=a==!==>>>	
QByIfUUUUIr   Ffirst_imagesecond_imagemin_relmax_relc                t   t          |           \  }}t          |          \  }}t          ||||          dk    rt          d          ||z  }	||z  }
t          |	|
          t          |	|
          z  }t          |d|z            }|r||k    r(n||k    r!t          d|	|
z  dd| d| d|dd		          |S )
a   
    Validates that the two images' aspect ratios are 'close'.
    The closeness factor is C = max(ar1, ar2) / min(ar1, ar2)  (C >= 1).
    We require C <= limit, where limit = max(max_rel, 1.0 / min_rel).

    Returns the computed closeness factor C.
    r   zInvalid image dimensions      ?z%Aspect ratios must be close: ar1/ar2=.2gz, allowed range u   –z (limit z).)r   minr   max)r&   r'   r(   r)   r   w1h1w2h2ar1ar2	closenesslimits                r   &validate_images_aspect_ratio_closenessr7   4   s    "+..FB!,//FB
2r2ra3444
r'C
r'CCC-Iw''E% 
	UI,=,=HCGC H H$H H)0H H:?GH H H
 
 	
 r   aspect_ratioc                J    t          |           }t          ||||           |S )zQParses 'X:Y' and validates it against optional bounds. Returns the numeric ratio.r    )_parse_aspect_ratio_stringr!   )r8   r   r   r   r$   s        r   validate_aspect_ratio_stringr;   S   s-     
$L	1	1ByIfUUUUIr   videoc                    	 |                                  \  }}n-# t          $ r }t          j        d|           Y d }~d S d }~ww xY w|||k     rt	          d| d| d          |||k    rt	          d| d| d          |||k     rt	          d| d| d          |||k    rt	          d| d| d          d S d S )Nz%Error getting dimensions of video: %szVideo width must be at least r   r   zVideo width must be at most zVideo height must be at least zVideo height must be at most )get_dimensions	Exceptionloggingerrorr   )r<   r   r   r   r   r   r   es           r   validate_video_dimensionsrC   `   s5   ,,..vv   =qAAA !2!2UUUEUUUVVV!2!2T	TT5TTTUUU&:"5"5X*XXfXXXYYY&:"5"5WWWVWWWXXX "5"5s    
A?Amin_durationmax_durationc                    	 |                                  }n-# t          $ r }t          j        d|           Y d }~d S d }~ww xY wd}|||z
  |k    rt	          d| d| d          ||||z   k    rt	          d| d| d          d S d S )Nz#Error getting duration of video: %sg-C6?z Video duration must be at least s, got szVideo duration must be at most )get_durationr?   r@   rA   r   )r<   rD   rE   durationrB   epsilons         r   validate_video_durationrL   w   s    
%%''   ;Q??? GL7$:X$E$E\L\\QY\\\]]]H|g/E$E$E[<[[PX[[[\\\  $E$E    
A<Amin_frame_countmax_frame_countc                    	 |                                  }n-# t          $ r }t          j        d|           Y d }~d S d }~ww xY w|||k    rt	          d| d|           |||k    rt	          d| d|           d S d S )Nz&Error getting frame count of video: %sz#Video frame count must be at least z, got z"Video frame count must be at most )get_frame_countr?   r@   rA   r   )r<   rN   rO   frame_countrB   s        r   validate_video_frame_countrS      s    
++--   >BBB "'D'DcccVaccddd"{_'D'DbobbU`bbccc #"'D'DrM   c                     t          | t          j                  r| j        dk    r| j        d         ndS t          |           S )Nr   r   r   )
isinstancetorchTensorndimr   r   )imagess    r   get_number_of_imagesrZ      s>    &%,'' :"(+"2"2v|A9v;;r   audioc                    t          | d                   }t          | d         j        d                   |z  }d|z  }|#||z   |k     rt          d| d||z   dd          |#||z
  |k    rt          d	| d||z
  dd          d S d S )
Nsample_ratewaveformr+   z Audio duration must be at least rG   z.2frH   zAudio duration must be at most )intr   r   )r[   rD   rE   srdurepss         r   validate_audio_durationrd      s    
 
U=!	"	"B
eJ%b)
*
*R
/C
(CC#I$<$<aLaaQTWZQZaaaabbbC#I$<$<`<``PSVYPY````aaa  $<$<r   promptstringc           
      L   | t          d| d          |r|                                 } |r9t          |           |k     r&t          d| d| dt          |            d          |r9t          |           |k    r(t          d| d| dt          |            d          d S d S )NzField 'z' cannot be empty.z' cannot be shorter than z characters; was z characters long.z Field 'z cannot be longer than )r?   stripr   )rf   strip_whitespace
field_name
min_length
max_lengths        r   validate_stringrm      s     ~@*@@@AAA   
c&kkJ..vjvv:vvX[\bXcXcvvv
 
 	
  
c&kkJ..uzuu*uuWZ[aWbWbuuu
 
 	

 
..r   c                 Z    |                                  }|dvrt          d|           dS )z(Validates video container format is MP4.)mp4zmov,mp4,m4a,3gp,3g2,mj2z*Only MP4 container format supported. Got: N)get_container_formatr   )r<   container_formats     r    validate_container_format_is_mp4rr      sA    1133AAAXFVXXYYY BAr   rc                 Z    | \  }}|dk    s|dk    rt          d| d| d          ||z  S )Nr   zRatios must be positive, got :.)r   )rs   abs      r   _ratio_from_tuplery      sG    DAqAvvaAAAQAAABBBq5Lr   r    r$   c          	      >   |t          |          nd}|t          |          nd}||
||k    r||}}|0|r| |k    r(n| |k     r!|rdnd}t          d| dd| d|dd          |0|r| |k    r,n| |k    r#|rdnd}t          d| dd| d|dd          dS dS dS )	zFValidate a numeric aspect ratio against optional min/max ratio bounds.N<u   ≤zAspect ratio `r,   z
` must be  rv   )ry   r   )r$   r   r   r   lohiops          r   r!   r!      s    *3)>	9	%	%	%DB)2)>	9	%	%	%DB	~".R"WWRB	~ 	PB"HHHb2gg)EBNbNNNNNRNNNNOOO	~ 	PB"HHHb2gg)EBNbNNNNNRNNNNOOO ~&-gHHr   ar_strc                    |                      d          }t          |          dk    rt          d|  d          	 t          |d                                                   }t          |d                                                   }n&# t          $ r}t          d|  d          |d}~ww xY w|dk    s|dk    rt          d	| d| d
          ||z  S )z?Parse 'X:Y' with integer parts into a positive float ratio X/Y.ru   r	   z.Aspect ratio must be 'X:Y' (e.g., 16:9), got 'z'.r   r   z:Aspect ratio must contain integers separated by ':', got 'Nz2Aspect ratio parts must be positive integers, got rv   )splitr   r   r`   rh   )r   partsrw   rx   excs        r   r:   r:      s    LLE
5zzQT&TTTUUUka  !!a  !! k k k`V\```aagjjkAvvaVaVVRSVVVWWWq5Ls   AB 
B/B**B/)NNNN)NN)Tre   NN)r@   rV   comfy_api.latestr   rW   tupler`   r   r   floatboolr%   r7   strr;   VideorC   rL   rS   rZ   Audiord   rm   rr   ry   r!   r:    r   r   <module>r      s     " " " " " "8 8sCx 8 8 8 8 ! !!Y Y<YTzY TzY d
	Y
 d
Y Y Y Y* -1,0
   <UE\"T) UE\"T)
     ,   ,  	     B -1,0

 
 
 

UE\"T)
 UE\"T)

 
 
 
 
 
 ! !!Y Y;YTzY TzY d
	Y
 d
Y Y Y Y2 "&!%] ];]$,] $,] ] ] ]( #'"&d d;d4Zd 4Zd d d d"   "&!%b b;b$,b $,b 
	b b b b  
 

 
 
 
*ZEK ZD Z Z Z Zue|,      -1,0P P PP UE\"T)P UE\"T)	P
 P 
P P P P0s u      r   