o
    ip$                     @   sx  d dl Z d dlZd dlmZ dejdeeef fddZ				d>dejdedB dedB d	edB d
edB f
ddZ		d?dddejdee	e	f dB dee	e	f dB de
de	f
ddZdddejdejde	de	de
de	fddZ		d?dddedee	e	f dB dee	e	f dB de
de	f
ddZ				d>dejdedB dedB d	edB d
edB f
dd Z		d?dejd!e	dB d"e	dB fd#d$Z		d?dejd%edB d&edB fd'd(Zd)d* Z		d?d+ejd!e	dB d"e	dB ddfd,d-Z		.		d@d/efd0d1Zdejddfd2d3Zd4ee	e	f de	fd5d6Zdddd7d8e	dee	e	f dB dee	e	f dB de
ddf
d9d:Zd;ede	fd<d=ZdS )A    N)Inputimagereturnc                 C   sL   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    r   C/mnt/c/Users/fbmor/ComfyUI/comfy_api_nodes/util/validation_utils.pyget_image_dimensions   s
   r   	min_width	max_width
min_height
max_heightc                 C   s   t | \}}|d ur||k rtd| d| d|d ur,||kr,td| d| d|d ur?||k r?td| d| d|d urR||krTt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widthr   r   r   validate_image_dimensions   s   r   T)strict	min_ratio	max_ratior   c                C   sL   t | \}}|dks|dkrtd| d| || }t||||d |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arr   r   r   validate_image_aspect_ratio$   s   r!   Ffirst_imagesecond_imagemin_relmax_relc             
   C   s   t | \}}t |\}}t||||dkrtd|| }	|| }
t|	|
t|	|
 }t|d| }|r9||krRn||krRtd|	|
 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limitr   r   r   &validate_images_aspect_ratio_closeness4   s&   r2   aspect_ratioc                C   s   t | }t||||d |S )zQParses 'X:Y' and validates it against optional bounds. Returns the numeric ratio.r   )_parse_aspect_ratio_stringr   )r3   r   r   r   r    r   r   r   validate_aspect_ratio_stringS   s   r5   videoc              
   C   s   z|   \}}W n ty! } ztd| W Y d }~d S d }~ww |d ur5||k r5td| d| d|d urH||krHtd| d| d|d ur[||k r[td| d| d|d urn||krpt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   )r6   r   r   r   r   r   r   er   r   r   validate_video_dimensions`   s    r<   min_durationmax_durationc              
   C   s   z|   }W n ty } ztd| W Y d }~d S d }~ww d}|d ur7|| |kr7td| d| d|d urL||| krNt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_durationr8   r9   r:   r   )r6   r=   r>   durationr;   epsilonr   r   r   validate_video_durationw   s   rD   min_frame_countmax_frame_countc              
   C   s   z|   }W n ty } ztd| W Y d }~d S d }~ww |d ur2||kr2td| d| |d urD||krFt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_countr8   r9   r:   r   )r6   rE   rF   frame_countr;   r   r   r   validate_video_frame_count   s   rI   c                 C   s,   t | tjr| jdkr| jd S dS t| S )Nr   r   r   )
isinstancetorchTensorndimr
   r	   )imagesr   r   r   get_number_of_images   s   rO   audioc                 C   s   t | d }t | d jd | }d| }|d ur-|| |k r-td| d|| dd|d urE|| |krGtd	| d|| ddd S d S )
Nsample_ratewaveformr&   z Audio duration must be at least r?   z.2fr@   zAudio duration must be at most )intr
   r   )rP   r=   r>   srdurepsr   r   r   validate_audio_duration   s   rX   promptstringc                 C   s   | d u rt d| d|r|  } |r*t| |k r*t d| d| dt|  d|rBt| |krDt 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 )r8   stripr	   )rZ   strip_whitespace
field_name
min_length
max_lengthr   r   r   validate_string   s   r`   c                 C   s"   |   }|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   )r6   container_formatr   r   r    validate_container_format_is_mp4   s   rd   rc                 C   s6   | \}}|dks|dkrt d| d| d|| S )Nr   zRatios must be positive, got :.)r   )re   abr   r   r   _ratio_from_tuple   s   rj   r   r    c                C   s   |durt |nd}|durt |nd}|dur%|dur%||kr%||}}|durJ|r0| |krJn| |k rJ|r8dnd}td| dd| d|dd|duro|rU| |krsn| |krq|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  rg   )rj   r   )r    r   r   r   lohiopr   r   r   r      s   
  r   ar_strc              
   C   s   |  d}t|dkrtd|  dzt|d  }t|d  }W n ty: } z	td|  d|d}~ww |dksC|dkrNtd	| d| d
|| S )z?Parse 'X:Y' with integer parts into a positive float ratio X/Y.rf   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 rg   )splitr	   r   rT   r[   )rp   partsrh   ri   excr   r   r   r4      s   
r4   )NNNN)NN)TrY   NN)r9   rK   comfy_api.latestr   rL   tuplerT   r   r   floatboolr!   r2   strr5   Videor<   rD   rI   rO   AudiorX   r`   rd   rj   r   r4   r   r   r   r   <module>   s   


!







