
    +j                       d dl mZ d dlmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ dZdZdZdZ d	Z!	 d1de"ej#                 de$de	ez  ez  de%de&e         f
dZ' G d dej#                  Z( G d dej#                  Z) G d dej#                  Z* G d dej#                  Z+ G d dej#                  Z, G d dej#                  Z- G d dej#                  Z. G d d ej#                  Z/ G d! d"ej#                  Z0d#e%de&fd$Z1 G d% d&ej#                  Z2 G d' d(ej#                  Z3 G d) d*ej#                  Z4 G d+ d,ej#                  Z5 G d- d.e          Z6de6fd/Z7d0S )2    )override)IOComfyExtensionInput)FrameSettingSubjectReferenceTaskCreationRequestTaskCreationResponseTaskExtendCreationRequestTaskMultiFrameCreationRequest
TaskResultTaskStatusResponse)ApiEndpointdownload_url_to_video_outputget_number_of_imagespoll_opsync_opupload_image_to_comfyapiupload_images_to_comfyapiupload_video_to_comfyapivalidate_image_aspect_ratiovalidate_image_dimensions&validate_images_aspect_ratio_closenessvalidate_stringvalidate_video_durationz/proxy/vidu/text2videoz/proxy/vidu/img2videoz/proxy/vidu/reference2videoz/proxy/vidu/start-end2videoz/proxy/vidu/tasks/%s/creations  clsvidu_endpointpayloadmax_poll_attemptsreturnc           	      |  K   t          | t          |d          t          |           d {V }|j        dk    rt	          d|j                   t          | t          t          |j        z            t          d d d	 |
           d {V }|j
        st	          d|j         d|j                   |j
        S )NPOST)pathmethod)endpointresponse_modeldatafailedzVidu request failed. Code: )r$   c                     | j         S N)staters    :/home/wildlama/comfy/ComfyUI/comfy_api_nodes/nodes_vidu.py<lambda>zexecute_task.<locals>.<lambda>7   s    17     c                     | j         S r+   )progressr-   s    r/   r0   zexecute_task.<locals>.<lambda>8   s    QZ r1   c                 (    | j         
| j         dz  nd S )Ng{Gzt?)creditsr-   s    r/   r0   zexecute_task.<locals>.<lambda>9   s    qy7L!)e"3"3RV r1   )r'   status_extractorprogress_extractorprice_extractorr    z.Vidu request does not contain results. State: z, Error Code: )r   r   r
   r,   RuntimeErrorcoder   VIDU_GET_GENERATION_STATUStask_idr   	creationserr_code)r   r   r   r    task_creation_responseresponses         r/   execute_taskrA   %   s'      $+-???+	$ $ $       #x//V9O9TVVWWW36L6TTUUU)**//VV+        H  
nX^nn[c[lnn
 
 	
 r1   c                   f    e Zd Zed             Zedededededededed	ej        fd
            Z	dS )ViduTextToVideoNodec                 2   t          j        ddddt           j                            ddgd          t           j                            d	d
d          t           j                            dddddt           j        j        dd
          t           j                            dddddt           j        j        d
dd
	  	        t           j                            dg ddd
          t           j                            ddgdd
d
          t           j                            dg d d!d
d
          gt           j        	                                gt           j
        j        t           j
        j        t           j
        j        gd
t          j        d"#          $	  	        S )%NrC   zVidu Text To Video Generationpartner/video/Vidu!Generate video from a text promptmodelviduq1
Model nameoptionstooltippromptT*A textual description for video generation	multilinerL   duration      'Duration of the output video in secondsdefaultminmaxstepdisplay_moderL   optionalseedr   (Seed for video generation (0 for random)rV   rW   rX   rY   rZ   control_after_generaterL   r[   aspect_ratio16:99:161:1$The aspect ratio of the output videorK   rL   r[   
resolution1080p-Supported values may vary by model & durationrK   rL   r[   advancedmovement_amplitudeautosmallmediumlarge.The movement amplitude of objects in the frame{"type":"usd","usd":0.4}expr	node_iddisplay_namecategorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaCombor   StringIntNumberDisplaynumberVideoOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadger   s    r/   define_schemaz!ViduTextToVideoNode.define_schemaE   s   y)8);w
LQQ	"H    
 !#!1!8E!  	 	 "!#!1!8+/F!  
 
 "333B!	     $IK!!    (@@@L!!   S0d !! 	.	+	#
 3  B
 B
 B
 B	
r1   rG   rM   rQ   r\   ra   rh   rm   r!   c           	         K   |st          d          t          |||||||          }t          | t          |           d {V }	t	          j        t          |	d         j                   d {V           S )N1The prompt field is required and cannot be empty.rG   rM   rQ   r\   ra   rh   rm   r   )
ValueErrorr	   rA   VIDU_TEXT_TO_VIDEOr   
NodeOutputr   url)
r   rG   rM   rQ   r\   ra   rh   rm   r   resultss
             r/   executezViduTextToVideoNode.execute   s        	RPQQQ%%!1
 
 
 %S*<gFFFFFFFF}#?
#O#OOOOOOOPPPr1   N)
__name__
__module____qualname__classmethodr   strintr   r   r    r1   r/   rC   rC   C   s        C
 C
 [C
J QQ Q 	Q
 Q Q Q  Q 
Q Q Q [Q Q Qr1   rC   c                   p    e Zd Zed             Zededej        dededededed	e	j
        fd
            ZdS )ViduImageToVideoNodec                 .   t          j        ddddt           j                            ddgd          t           j                            d	d
          t           j                            ddddd          t           j                            dddddt           j        j        dd          t           j                            dddddt           j        j        ddd	  	        t           j                            ddgddd          t           j                            dg d d!dd          gt           j	        
                                gt           j        j        t           j        j        t           j        j        gdt          j        d"#          $	  	        S )%Nr   zVidu Image To Video GenerationrE   z-Generate video from image and optional promptrG   rH   rI   rJ   imagez=An image to be used as the start frame of the generated videorL   rM   T rN   )rP   rV   rL   r[   rQ   rR   rS   rT   rU   r\   r   r]   r^   r_   rh   ri   rj   rk   rm   rn   rs   rt   ru   rw   r   r   r   r   Imager   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   z"ViduImageToVideoNode.define_schema   s   y*9)Gw
LQQ[    	"H!     !#!1!8E!  	 	 "!#!1!8+/F!  
 
  $IK!!    (@@@L!!   S0d !! 	.	+	#
 3  B
 B
 B
 B	
r1   rG   r   rM   rQ   r\   rh   rm   r!   c                 n  K   t          |          dk    rt          d          t          |dd           t          ||||||          }t	          | |dd           d {V |_        t          | t          |           d {V }	t          j	        t          |	d         j                   d {V           S )	NrS    Only one input image is allowed.rS      r   rS   rG   rM   rQ   r\   rh   rm   	image/png
max_images	mime_typer   )r   r   r   r	   r   imagesrA   VIDU_IMAGE_TO_VIDEOr   r   r   r   )
r   rG   r   rM   rQ   r\   rh   rm   r   r   s
             r/   r   zViduImageToVideoNode.execute   s        &&**?@@@#E66:::%!1
 
 
  9!	 
  
  
 
 
 
 
 
 
 %S*=wGGGGGGGG}#?
#O#OOOOOOOPPPr1   Nr   r   r   r   r   r   r   r   r   r   r   r   r   r1   r/   r   r      s        C
 C
 [C
J QQ {Q 	Q
 Q Q Q  Q 
Q Q Q [Q Q Qr1   r   c                   t    e Zd Zed             Zededej        dededededed	ed
e	j
        fd            ZdS )ViduReferenceVideoNodec                 r   t          j        ddddt           j                            ddgd          t           j                            d	d
          t           j                            ddd          t           j                            dddddt           j        j        dd          t           j                            dddddt           j        j        ddd	  	        t           j                            dg ddd          t           j                            ddgd dd!          t           j                            d"g d#d$dd!          gt           j	        
                                gt           j        j        t           j        j        t           j        j        gdt          j        d%&          '	  	        S )(Nr   z"Vidu Reference To Video GenerationrE   z0Generate video from multiple images and a promptrG   rH   rI   rJ   r   zXImages to use as references to generate a video with consistent subjects (max 7 images).r   rM   TrN   rO   rQ   rR   rS   rT   rU   r\   r   r]   r^   r_   ra   rb   rf   rg   rh   ri   rj   rk   rm   rn   rs   rt   ru   rw   r   r   s    r/   r   z$ViduReferenceVideoNode.define_schema  s   y,=)Jw
LQQv    	"H    
 !#!1!8E!  	 	 "!#!1!8+/F!  
 
 "333B!	     $IK!!    (@@@L!!   [4l !! 	.	+	#
 3  GF
 F
 F
 F	
r1   rG   r   rM   rQ   r\   ra   rh   rm   r!   c	           	        K   |st          d          t          |          }	|	dk    rt          d          |D ]%}
t          |
dd           t          |
dd           &t	          |||||||          }t          | |dd	
           d {V |_        t          | t          |           d {V }t          j
        t          |d         j                   d {V           S )Nr      z&Too many images, maximum allowed is 7.r   r      	min_width
min_heightr   r   r   r   )r   r   r   r   r	   r   r   rA   VIDU_REFERENCE_VIDEOr   r   r   r   )r   rG   r   rM   rQ   r\   ra   rh   rm   ar   r   r   s                r/   r   zViduReferenceVideoNode.executeY  sB       	RPQQQ ((q55EFFF 	L 	LE'vv>>>%essKKKKK%%!1
 
 
  9!	 
  
  
 
 
 
 
 
 
 %S*>HHHHHHHH}#?
#O#OOOOOOOPPPr1   Nr   r   r1   r/   r   r     s        G
 G
 [G
R #Q#Q #Q 	#Q
 #Q #Q #Q #Q  #Q 
#Q #Q #Q [#Q #Q #Qr1   r   c                   ~    e Zd Zed             Zededej        dej        dedededed	ed
e	j
        fd            ZdS )ViduStartEndToVideoNodec                 l   t          j        ddddt           j                            ddgd          t           j                            d	d
          t           j                            dd          t           j                            dddd          t           j                            dddddt           j        j        dd          t           j                            dddddt           j        j        ddd	  	        t           j                            ddgddd          t           j                            d g d!d"dd          gt           j	        
                                gt           j        j        t           j        j        t           j        j        gdt          j        d#$          %	  	        S )&Nr   z"Vidu Start End To Video GenerationrE   z7Generate a video from start and end frames and a promptrG   rH   rI   rJ   first_framezStart framer   	end_framez	End framerM   TrN   )rP   rL   r[   rQ   rR   rS   rT   rU   r\   r   r]   r^   r_   rh   ri   rj   rk   rm   rn   rs   rt   ru   rw   r   r   s    r/   r   z%ViduStartEndToVideoNode.define_schema  s   y-=)Qw
LQQ!)    '    	"H!	     !#!1!8E!  	 	 "!#!1!8+/F!  
 
  $IK!!    (@@@L!!   Y3j !! 	.	+	#
 3  EE
 E
 E
 E	
r1   rG   r   r   rM   rQ   r\   rh   rm   r!   c	                 ,   K   t          ||ddd           t          ||||||          }	 fd||fD              d {V |	_        t           t          |	           d {V }
t          j        t          |
d         j                   d {V           S )N皙?      ?Fmin_relmax_relstrictr   c                 R   K   g | ]!}t          |d d           d{V d         "S rS   r   r   Nr   r   .0framer   s     r/   
<listcomp>z3ViduStartEndToVideoNode.execute.<locals>.<listcomp>  sW       
 
 
 -S%AQ\]]]]]]]]]_`a
 
 
r1   r   )	r   r	   r   rA   VIDU_START_END_VIDEOr   r   r   r   r   rG   r   r   rM   rQ   r\   rh   rm   r   r   s   `          r/   r   zViduStartEndToVideoNode.execute  s       	/{Is\`inoooo%!1
 
 

 
 
 
%y1
 
 
 
 
 
 
 
 
 %S*>HHHHHHHH}#?
#O#OOOOOOOPPPr1   Nr   r   r1   r/   r   r     s        F
 F
 [F
P QQ [Q ;	Q
 Q Q Q Q  Q 
Q Q Q [Q Q Qr1   r   c                   f    e Zd Zed             Zedededededededed	ej	        fd
            Z
dS )Vidu2TextToVideoNodec                 H   t          j        ddddt           j                            ddg          t           j                            dd	d
          t           j                            dddddt           j        j                  t           j                            dddddt           j        j        d	          t           j                            dg d          t           j                            dddgd	          t           j	                            dddd	          gt           j
                                        gt           j        j        t           j        j        t           j        j        gd	t          j        t          j        ddg          d !          "	  	        S )#Nr   zVidu2 Text-to-Video GenerationrE   rF   rG   viduq2rK   rM   TUA textual description for video generation, with a maximum length of 2000 characters.rO   rQ   rR   rS   
   rV   rW   rX   rY   rZ   r\   r   r]   rV   rW   rX   rY   rZ   r`   ra   rc   rd   3:44:3re   rh   720pri   rK   rl   background_musicFz7Whether to add background music to the generated video.rV   rL   rl   widgetsa(  
                (
                  $is1080 := widgets.resolution = "1080p";
                  $base := $is1080 ? 0.1 : 0.075;
                  $perSec := $is1080 ? 0.05 : 0.025;
                  {"type":"usd","usd": $base + $perSec * (widgets.duration - 1)}
                )
                
depends_onrv   rw   )r   r   r   r   r   r   r   sliderr   Booleanr   r   r   r   r   r   r   PriceBadgeDependsr   s    r/   r   z"Vidu2TextToVideoNode.define_schema  s   y*9);w
;;	"s    
 !#!1!8    "!#!1!8+/    ~7\7\7\]]|fg5FQUVV
  &!U!	 !  5 D !! 	.	+	#
 /\8RSSS
 
 
_:
 :
 :
 :	
r1   rG   rM   rQ   r\   ra   rh   r   r!   c                    K   t          |dd           t          | t          t          |||||||                     d {V }t	          j        t          |d         j                   d {V           S )NrS     
min_length
max_length)rG   rM   rQ   r\   ra   rh   bgmr   r   rA   r   r	   r   r   r   r   )	r   rG   rM   rQ   r\   ra   rh   r   r   s	            r/   r   zVidu2TextToVideoNode.execute(  s       	1>>>>$!)%$  
 
 
 
 
 
 
 
 }#?
#O#OOOOOOOPPPr1   N)r   r   r   r   r   r   r   boolr   r   r   r   r1   r/   r   r     s        ;
 ;
 [;
z QQ Q 	Q
 Q Q Q Q 
Q Q Q [Q Q Qr1   r   c                   p    e Zd Zed             Zededej        dededededed	e	j
        fd
            ZdS )Vidu2ImageToVideoNodec                 L   t          j        ddddt           j                            dg d          t           j                            dd	
          t           j                            dddd          t           j                            dddddt           j        j                  t           j                            dddddt           j        j	        d          t           j                            dddgd          t           j                            dg ddd           gt           j
                                        gt           j        j        t           j        j        t           j        j        gdt          j        t          j        g d!"          d#$          %	  	        S )&Nr   zVidu2 Image-to-Video GenerationrE   6Generate a video from an image and an optional prompt.rG   zviduq2-pro-fast
viduq2-providuq2-turbor   r   >An image to be used as the start frame of the generated video.r   rM   Tr   CAn optional text prompt for video generation (max 2000 characters).rP   rV   rL   rQ   rR   rS   r   r   r\   r   r]   r   rh   r   ri   r   rm   rn   /The movement amplitude of objects in the frame.rK   rL   rl   rG   rQ   rh   r   a.  
                (
                  $m := widgets.model;
                  $d := widgets.duration;
                  $is1080 := widgets.resolution = "1080p";
                  $contains($m, "pro-fast")
                    ? (
                        $base := $is1080 ? 0.08 : 0.04;
                        $perSec := $is1080 ? 0.02 : 0.01;
                        {"type":"usd","usd": $base + $perSec * ($d - 1)}
                      )
                    : $contains($m, "pro")
                      ? (
                          $base := $is1080 ? 0.275 : 0.075;
                          $perSec := $is1080 ? 0.075 : 0.05;
                          {"type":"usd","usd": $base + $perSec * ($d - 1)}
                        )
                      : $contains($m, "turbo")
                        ? (
                            $is1080
                              ? {"type":"usd","usd": 0.175 + 0.05 * ($d - 1)}
                              : (
                                  $d <= 1 ? {"type":"usd","usd": 0.04}
                                  : $d <= 2 ? {"type":"usd","usd": 0.05}
                                  : {"type":"usd","usd": 0.05 + 0.05 * ($d - 2)}
                                )
                          )
                        : {"type":"usd","usd": 0.04}
                )
                r   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   z#Vidu2ImageToVideoNode.define_schemaF  s   y+:)Pw0a0a0abb\    	"a	     !#!1!8    "!#!1!8+/     #W-!   
 (@@@M!	   E(T !! 	.	+	#
 /8[8[8[\\\     oX
 X
 X
 X	
r1   rG   r   rM   rQ   r\   rh   rm   r!   c                   K   t          |          dk    rt          d          t          |dd           t          |d           t	          | t
          t          ||||||t          | |dd           d {V 	                     d {V }t          j	        t          |d
         j                   d {V           S )NrS   r   r   r   r   r   r   r   rG   rM   rQ   r\   rh   rm   r   r   )r   r   r   r   rA   r   r	   r   r   r   r   r   )	r   rG   r   rM   rQ   r\   rh   rm   r   s	            r/   r   zVidu2ImageToVideoNode.execute  s       &&**?@@@#E66:::40000$!%#56 )	          
 
 
 
 
 
 
 
$ }#?
#O#OOOOOOOPPPr1   Nr   r   r1   r/   r   r   D  s        Y
 Y
 [Y
v  Q Q { Q 	 Q
  Q  Q  Q   Q 
 Q  Q  Q [ Q  Q  Qr1   r   c                       e Zd Zed             Zededej        j        dede	de
de
ded	ed
edej        fd            ZdS )Vidu2ReferenceVideoNodec                 P   t          j        ddddt           j                            ddg          t           j                            dt           j                            t           j                            d	          g d
d          d          t           j                            ddd          t           j                            dddd          t           j	                            dddddt           j
        j                  t           j	                            dddddt           j
        j        d          t           j                            dg d           t           j                            d!d"d#gd$          t           j                            d%g d&d'd(          g	t           j                                        gt           j        j        t           j        j        t           j        j        gdt          j        t          j        g d)*          d+,          -	  	        S ).Nr  z#Vidu2 Reference-to-Video GenerationrE   z=Generate a video from multiple reference images and a prompt.rG   r   r   subjectsreference_images)subject1subject2subject3subject4subject5subject6subject7rS   )namesrW   zFor each subject, provide up to 3 reference images (7 images total across all subjects). Reference them in prompts via @subject{subject_id}.)templaterL   rM   Tz_When enabled, the video will include generated speech and background music based on the prompt.rO   audioFzZWhen enabled video will contain generated speech and background music based on the prompt.r   rQ   rR   r   r   r\   r   r]   r   ra   )rc   rd   r   r   re   rh   r   ri   r   rm   rn   r   r   )r  rQ   rh   r   ay  
                (
                  $is1080 := widgets.resolution = "1080p";
                  $base := $is1080 ? 0.375 : 0.125;
                  $perSec := $is1080 ? 0.05 : 0.025;
                  $audioCost := widgets.audio = true ? 0.075 : 0;
                  {"type":"usd","usd": $base + $perSec * (widgets.duration - 1) + $audioCost}
                )
                r   rw   )r   r   r   r   AutogrowTemplateNamesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   z%Vidu2ReferenceVideoNode.define_schema  s)   y->)Ww
;;!![66'9::rrr 7  
J " 	 	 	"+     
  !x!	 !   !#!1!8    "!#!1!8+/    ~7\7\7\]]|fg5FQUVV(@@@M!	   W1f !! 	.	+	#
 /8[8[8[\\\  AL
 L
 L
 L	
r1   rG   r  rM   r  rQ   r\   ra   rh   rm   r!   c
                 |  K   t          |dd           d}
|D ]]}t          ||                   dk    rt          d          ||         D ]*}|
dz  }
t          |dd           t	          |d	d	
           +^|
dk    rt          d          g }|D ]G}|                    t          |t          | ||         ddd|            d {V                      Ht          ||||||||	|	  	        }t          | t          |           d {V }t          j        t          |d         j                   d {V           S )NrS   r   r   r      z*Maximum number of images per subject is 3.r   r   r   r   r   z4Too many reference images; the maximum allowed is 7.r   zUploading reference images for )r   r   
wait_label)idr   )	rG   rM   r  rQ   r\   ra   rh   rm   r  )r   r   r   r   r   appendr   r   r	   rA   r   r   r   r   r   )r   rG   r  rM   r  rQ   r\   ra   rh   rm   total_imagesiimsubjects_paramr   r   s                   r/   r   zVidu2ReferenceVideoNode.execute  s      	1>>>> 	M 	MA#HQK00144 !MNNNqk M M!+B???)"LLLLLM !STTT13 	 	A!! !: #$"-#HQ#H#H" " "      	 	 	    &%!1#

 

 

 %S*>HHHHHHHH}#?
#O#OOOOOOOPPPr1   N)r   r   r   r   r   r   r   r  Typer   r   r   r   r   r1   r/   r  r    s        M
 M
 [M
^ 1Q1Q +"1Q 	1Q
 1Q 1Q 1Q 1Q 1Q  1Q 
1Q 1Q 1Q [1Q 1Q 1Qr1   r  c                   ~    e Zd Zed             Zededej        dej        dedededed	ed
e	j
        fd            ZdS )Vidu2StartEndToVideoNodec                    t          j        ddddt           j                            dg d          t           j                            d          t           j                            d	          t           j                            d
dd          t           j                            dddddt           j        j                  t           j                            dddddt           j        j	        d          t           j                            dddgd          t           j                            dg ddd          gt           j
                                        gt           j        j        t           j        j        t           j        j        gdt          j        t          j        g d !          d"#          $	  	        S )%Nr!  z)Vidu2 Start/End Frame-to-Video GenerationrE   @Generate a video from a start frame, an end frame, and a prompt.rG   r   r   r   r   rM   T)Prompt description (max 2000 characters).rO   rQ   rR         rS   r   r\   r   r]   r   rh   r   ri   r   rm   rn   r   r   r   r   a  
                (
                  $m := widgets.model;
                  $d := widgets.duration;
                  $is1080 := widgets.resolution = "1080p";
                  $contains($m, "pro-fast")
                    ? (
                        $base := $is1080 ? 0.08 : 0.04;
                        $perSec := $is1080 ? 0.02 : 0.01;
                        {"type":"usd","usd": $base + $perSec * ($d - 1)}
                      )
                    : $contains($m, "pro")
                      ? (
                          $base := $is1080 ? 0.275 : 0.075;
                          $perSec := $is1080 ? 0.075 : 0.05;
                          {"type":"usd","usd": $base + $perSec * ($d - 1)}
                        )
                      : $contains($m, "turbo")
                        ? (
                            $is1080
                              ? {"type":"usd","usd": 0.175 + 0.05 * ($d - 1)}
                              : (
                                  $d <= 2 ? {"type":"usd","usd": 0.05}
                                  : {"type":"usd","usd": 0.05 + 0.05 * ($d - 2)}
                                )
                          )
                        : {"type":"usd","usd": 0.04}
                )
                r   rw   r  r   s    r/   r   z&Vidu2StartEndToVideoNode.define_schemaO  s   y.D)Zw0a0a0abb}--{++	"G    
 !#!1!8    "!#!1!8+/    |fg5FQUVV(@@@M!	   7!F !! 	.	+	#
 /8[8[8[\\\  aP
 P
 P
 P	
r1   rG   r   r   rM   rQ   r\   rh   rm   r!   c	                    K   t          |d           t          |          dk    rt          d          t          |          dk    rt          d          t          ||ddd	           t	          |||||| fd
||fD              d {V           }	t           t          |	           d {V }
t          j        t          |
d         j
                   d {V           S )Nr   r  rS   z2Only one input image is allowed for `first_frame`.z0Only one input image is allowed for `end_frame`.r   r   Fr   c                 R   K   g | ]!}t          |d d           d{V d         "S r   r   r   s     r/   r   z4Vidu2StartEndToVideoNode.execute.<locals>.<listcomp>  W          1eU`aaaaaaaaacde  r1   r  r   )r   r   r   r   r	   rA   r   r   r   r   r   r   s   `          r/   r   z Vidu2StartEndToVideoNode.execute  sA      	40000,,q00QRRR	**Q..OPPP.{Is\`inoooo%!1   )95        
 
 
 %S*>HHHHHHHH}#?
#O#OOOOOOOPPPr1   Nr   r   r1   r/   r!  r!  M  s        Q
 Q
 [Q
f QQ [Q ;	Q
 Q Q Q Q  Q 
Q Q Q [Q Q Qr1   r!  c                   |    e Zd Zed             Ze	 d
dedej        dede	dej
        dz  dej        fd	            ZdS )ViduExtendVideoNodec                 n   t          j        ddddt           j                            dt           j                            dt           j                            ddd	d
d	t           j        j        d          t           j                            dddgd          g          t           j                            dt           j                            ddd	d
d	t           j        j        d          t           j                            dddgd          g          gd          t           j	                            dd          t           j
                            dddd          t           j                            dd	ddd	t           j        j        d          t           j                            d d!          gt           j	                                        gt           j        j        t           j        j        t           j        j        gdt          j        t          j        g d"#          d$%          &	  	        S )'Nr+  zVidu Video ExtensionrE   z9Extend an existing video by generating additional frames.rG   r   rQ   r   rS   r   z*Duration of the extended video in seconds.rV   rW   rX   rY   rZ   rL   rh   r   ri   Resolution of the output video.rJ   r   z!Model to use for video extension.videozThe source video to extend.r   rM   Tr   zEAn optional text prompt for the extended video (max 2000 characters).r   r\   r   r]   r   r   )r[   rG   zmodel.durationzmodel.resolutionr   a2  
                (
                  $m := widgets.model;
                  $d := $lookup(widgets, "model.duration");
                  $res := $lookup(widgets, "model.resolution");
                  $contains($m, "pro")
                    ? (
                        $base := $lookup({"720p": 0.15, "1080p": 0.3}, $res);
                        $perSec := $lookup({"720p": 0.05, "1080p": 0.075}, $res);
                        {"type":"usd","usd": $base + $perSec * ($d - 1)}
                      )
                    : (
                        $base := $lookup({"720p": 0.075, "1080p": 0.2}, $res);
                        $perSec := $lookup({"720p": 0.025, "1080p": 0.05}, $res);
                        {"type":"usd","usd": $base + $perSec * ($d - 1)}
                      )
                )
                r   rw   )r   r   DynamicCombor   Optionr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   z!ViduExtendVideoNode.define_schema  sN   y)/)S%%..( "$.,-()())*131A1H,X !- !" !" !#$0-3W,=,M !/ !" !" & ..* "$.,-()())*131A1H,X !- !" !" !#$0-3W,=,M !/ !" !" )'P @U & + +X 9    	"c	     "!#!1!8+/    {T::AAF !! 	.	+	#
 /8g8g8ghhh  ae
 e
 e
 e	
r1   NrG   r/  rM   r\   r   r!   c                   K   t          |d           t          |dd           d }|;t          |dd           t          |dd	           t	          | |d
           d {V }t          | dt          |d         ||d         ||d         t          | |d           d {V |r|gnd                      d {V }t          j	        t          |d         j                   d {V           S )Nr   r  r   7   )min_durationmax_durationr   r   r   r   zUploading end frame)r  z/proxy/vidu/extendrG   rQ   rh   zUploading video)rG   rM   rQ   r\   rh   	video_urlr   r   )r   r   r   r   r   rA   r   r   r   r   r   r   )r   rG   r/  rM   r\   r   	image_urlr   s           r/   r   zViduExtendVideoNode.execute0  sQ      	40000ABGGGG	 '	66BBB%i33OOOO6sIRghhhhhhhhhI$ %Gnz* . 8ePa b b bbbbbbb&/9	{{T  
 
 
 
 
 
 
 
 }#?
#O#OOOOOOOPPPr1   r+   )r   r   r   r   r   dictr   r   r   r   r   r   r   r   r   r1   r/   r+  r+    s        f
 f
 [f
P  )-Q QQ {Q 	Q
 Q ;%Q 
Q Q Q [Q Q Qr1   r+  countc                 v   g }t          d| dz             D ]}|                    t          j                            d| ddd| d          t          j                            d| d	| d
          t          j                            d| ddddt          j        j        d| d          g           |S )z4Generate input widgets for a given number of frames.rS   rM   Tr   zText prompt for frame z transition.r   	end_imagezEnd frame image for segment z+. Aspect ratio must be between 1:4 and 4:1.r   rQ   r   r%  r   zDuration for segment z in seconds.r-  )	rangeextendr   r   r   r   r   r   r   )r:  r|   r  s      r/   _generate_frame_inputsr?  P  s    F1eai   
 
	 QLL"DQDDD	     #OOi1iii    "qNN!#!1!8CACCC   	
 	
 	
 	
. Mr1   c                   h    e Zd Zed             Zededej        dedede	de
j        fd            Zd	S )
ViduMultiFrameVideoNodec                 Z   t          j        ddddt           j                            dddg          t           j                            d	d
          t           j                            dddddt           j        j        d          t           j                            dddg          t           j                            dt           j        	                    dt          d                    t           j        	                    dt          d                    t           j        	                    dt          d                    t           j        	                    dt          d                    t           j        	                    dt          d                    t           j        	                    d t          d!                    t           j        	                    d"t          d#                    t           j        	                    d$t          d%                    gd&'          gt           j                                        gt           j        j        t           j        j        t           j        j        gdt          j        t          j        g d()          d*+          ,	  	        S )-NrA  z!Vidu Multi-Frame Video GenerationrE   z4Generate a video with multiple keyframe transitions.rG   r   r   r   start_imagezCThe starting frame image. Aspect ratio must be between 1:4 and 4:1.r   r\   rS   r   r]   Tr   rh   r   ri   frames2r%  3r  4r   5rR   6   7r   8r&  9	   z%Number of keyframe transitions (2-9).rJ   )rG   rh   rD  zframes.duration1zframes.duration2zframes.duration3zframes.duration4zframes.duration5zframes.duration6zframes.duration7zframes.duration8zframes.duration9r   a  
                (
                  $m := widgets.model;
                  $n := $number(widgets.frames);
                  $is1080 := widgets.resolution = "1080p";
                  $d1 := $lookup(widgets, "frames.duration1");
                  $d2 := $lookup(widgets, "frames.duration2");
                  $d3 := $n >= 3 ? $lookup(widgets, "frames.duration3") : 0;
                  $d4 := $n >= 4 ? $lookup(widgets, "frames.duration4") : 0;
                  $d5 := $n >= 5 ? $lookup(widgets, "frames.duration5") : 0;
                  $d6 := $n >= 6 ? $lookup(widgets, "frames.duration6") : 0;
                  $d7 := $n >= 7 ? $lookup(widgets, "frames.duration7") : 0;
                  $d8 := $n >= 8 ? $lookup(widgets, "frames.duration8") : 0;
                  $d9 := $n >= 9 ? $lookup(widgets, "frames.duration9") : 0;
                  $totalDuration := $d1 + $d2 + $d3 + $d4 + $d5 + $d6 + $d7 + $d8 + $d9;
                  $contains($m, "pro")
                    ? (
                        $base := $is1080 ? 0.3 : 0.15;
                        $perSec := $is1080 ? 0.075 : 0.05;
                        {"type":"usd","usd": $n * $base + $perSec * $totalDuration}
                      )
                    : (
                        $base := $is1080 ? 0.2 : 0.075;
                        $perSec := $is1080 ? 0.05 : 0.025;
                        {"type":"usd","usd": $n * $base + $perSec * $totalDuration}
                      )
                )
                r   rw   )r   r   r   r   r   r   r   r   r1  r2  r?  r   r   r   r   r   r   r   r   r   s    r/   r   z%ViduMultiFrameVideoNode.define_schemap  sJ   y-<)Nw~0NOO!a    "!#!1!8+/    |fg5FGG%%..s4J14M4MNN..s4J14M4MNN..s4J14M4MNN..s4J14M4MNN..s4J14M4MNN..s4J14M4MNN..s4J14M4MNN..s4J14M4MNN	 D &  !@ !! 	.	+	#
 /     #- - -[[
 [
 [
 [	
r1   rG   rC  r\   rh   rD  r!   c                   K   t          |dd           t          |d                   }g }t          d|dz             D ]6}t          |d|          dd           t          |d|          d           7t	          | |d	d
           d {V }	t          d|dz             D ]]}|                    t          |d|          t	          | |d|          d	d| d           d {V |d|                               ^t          | dt          ||||	|          d|z             d {V }
t          j
        t          |
d         j                   d {V           S )Nr   r   rD  rS   r<  rM   r   r  r   zUploading start image)r   r  zUploading end image()rQ   )rM   	key_imagerQ   z/proxy/vidu/multiframe)rG   r\   rh   rC  image_settingsr   r    r   )r   r   r=  r   r   r  r   rA   r   r   r   r   r   )r   rG   rC  r\   rh   rD  frame_countrR  r  start_image_urlr   s              r/   r   zViduMultiFrameVideoNode.execute  s"      	$K@@@&*++-/q+/** 	C 	CA'1(?PPPF<A<<0TBBBBB 8!.	!
 !
 !
 
 
 
 
 
 
 q+/** 	 	A!!!,1,,/$<1/"-#>!#>#>#>	% % %       $NqNN3	 	 	    %$)%+-   "K/
 
 
 
 
 
 
 
 
 }#?
#O#OOOOOOOPPPr1   N)r   r   r   r   r   r   r   r   r   r9  r   r   r   r   r1   r/   rA  rA  n  s        \
 \
 [\
| -Q-Q [-Q 	-Q
 -Q -Q 
-Q -Q -Q [-Q -Q -Qr1   rA  c            	       V    e Zd Zed             Zededededej	        fd            Z
dS )Vidu3TextToVideoNodec                    t          j        ddddt           j                            dt           j                            dt           j                            dg dd	
          t           j                            dddgd
          t           j                            dddddt           j        j        d          t           j	                            ddd          g          t           j                            dt           j                            dg dd	
          t           j                            dddgd
          t           j                            dddddt           j        j        d          t           j	                            ddd          g          gd
          t           j
                            ddd          t           j                            ddd d!dt           j        j        d"          gt           j                                        gt           j        j        t           j        j        t           j        j        gdt          j        t          j        g d#$          d%&          '	  	        S )(NrW  z Vidu Q3 Text-to-Video GenerationrE   z"Generate video from a text prompt.rG   
viduq3-prora   r   z%The aspect ratio of the output video.rJ   rh   r   ri   r.  rQ   rR   rS      (Duration of the output video in seconds.r-  r  FNWhen enabled, outputs video with sound (including dialogue and sound effects).rV   rL   viduq3-turbo"Model to use for video generation.rM   Tr   rO   r\   r   r]   r   r0  r   U  
                (
                  $res := $lookup(widgets, "model.resolution");
                  $d := $lookup(widgets, "model.duration");
                  $contains(widgets.model, "turbo")
                    ? (
                        $rate := $lookup({"720p": 0.06, "1080p": 0.08}, $res);
                        {"type":"usd","usd": $rate * $d}
                      )
                    : (
                        $rate := $lookup({"720p": 0.15, "1080p": 0.16}, $res);
                        {"type":"usd","usd": $rate * $d}
                      )
                )
                r   rw   )r   r   r1  r   r2  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   z"Vidu3TextToVideoNode.define_schema  s   y*;)<%%..( "$2,Q,Q,Q,S !/ !" !"
 !#$0-3W,=,M !/ !" !"
 !#$.,-()(*)*131A1H,V !- !" !" !#
 0 0$+,1-N !1 !" !") < ..* "$2,Q,Q,Q,S !/ !" !"
 !#$0-3W,=,M !/ !" !"
 !#$.,-()(*)*131A1H,V !- !" !" !#
 0 0$+,1-N !1 !" !") ?=| AA & A AD 	"s    
 "!#!1!8+/   QQf !! 	.	+	#
 /8g8g8ghhh  Ar
 r
 r
 r	
r1   rG   rM   r\   r!   c                 .  K   t          |dd           t          | t          t          |d         ||d         ||d         |d         |d         	          d
           d {V }t	          j        t          |d         j                   d {V           S )NrS   r   r   rG   rQ   ra   rh   r  )rG   rM   rQ   r\   ra   rh   r  i  rS  r   r   )r   rG   rM   r\   r   s        r/   r   zVidu3TextToVideoNode.executex  s       	1>>>>$Gnz*">2 .Gn   "
 
 
 
 
 
 
 
 
 }#?
#O#OOOOOOOPPPr1   N)r   r   r   r   r   r9  r   r   r   r   r   r   r1   r/   rW  rW     s        s
 s
 [s
j QQ Q 	Q
 
Q Q Q [Q Q Qr1   rW  c                   d    e Zd Zed             Zededej        dede	de
j        f
d            ZdS )	Vidu3ImageToVideoNodec                    t          j        ddddt           j                            dt           j                            dt           j                            dg dd	
          t           j                            dddddt           j        j        d          t           j	                            ddd          g          t           j                            dt           j                            dddgd	
          t           j                            dddddt           j        j        d          t           j	                            ddd          g          gd
          t           j
                            dd          t           j                            dddd           t           j                            d!dd"d#dt           j        j        d$          gt           j                                        gt           j        j        t           j        j        t           j        j        gdt          j        t          j        g d%&          d'(          )	  	        S )*Nrc  z!Vidu Q3 Image-to-Video GenerationrE   r   rG   rY  rh   )r   ri   2Kr.  rJ   rQ   rR   rS   rZ  r[  r-  r  Fr\  r]  r^  r   ri   r_  r   r   r   rM   Tr   r   r   r\   r   r]   r   r0  r   a`  
                (
                  $res := $lookup(widgets, "model.resolution");
                  $d := $lookup(widgets, "model.duration");
                  $contains(widgets.model, "turbo")
                    ? (
                        $rate := $lookup({"720p": 0.06, "1080p": 0.08}, $res);
                        {"type":"usd","usd": $rate * $d}
                      )
                    : (
                        $rate := $lookup({"720p": 0.15, "1080p": 0.16, "2k": 0.2}, $res);
                        {"type":"usd","usd": $rate * $d}
                      )
                )
                r   rw   r   r   r1  r   r2  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s    r/   r   z#Vidu3ImageToVideoNode.define_schema  s   y+<)P%%..( "$0,C,C,C,M !/ !" !"
 !#$.,-()(*)*131A1H,V !- !" !" !#
 0 0$+,1-N !1 !" !" 2 ..* "$0-3W,=,M !/ !" !"
 !#$.,-()(*)*131A1H,V !- !" !" !#
 0 0$+,1-N !1 !" !" 53h Am & 7 7p \    	"a	     "!#!1!8+/   GL\ !! 	.	+	#
 /8g8g8ghhh  wm
 m
 m
 m	
r1   rG   r   rM   r\   r!   c                 l  K   t          |dd           t          |d           t          | t          t	          |d         ||d         ||d         |d         t          | |           d {V g	          d
           d {V }t          j        t          |d         j	                   d {V           S )Nr   r   r   r  rG   rQ   rh   r  rG   rM   rQ   r\   rh   r  r   i  rS  r   )
r   r   rA   r   r	   r   r   r   r   r   )r   rG   r   rM   r\   r   s         r/   r   zVidu3ImageToVideoNode.execute  s       	$E66:::40000$Gnz* .Gn6sEBBBBBBBBC   "
 
 
 
 
 
 
 
 
 }#?
#O#OOOOOOOPPPr1   Nr   r   r   r   r   r9  r   r   r   r   r   r   r   r   r1   r/   rc  rc    s        n
 n
 [n
` QQ {Q 	Q
 Q 
Q Q Q [Q Q Qr1   rc  c                   r    e Zd Zed             Zededej        dej        dede	de
j        fd            Zd	S )
Vidu3StartEndToVideoNodec                    t          j        ddddt           j                            dt           j                            dt           j                            ddd	gd
          t           j                            dddddt           j        j        d          t           j	                            ddd          g          t           j                            dt           j                            ddd	gd
          t           j                            dddddt           j        j        d          t           j	                            ddd          g          gd          t           j
                            d          t           j
                            d          t           j                            ddd          t           j                            dddd dt           j        j        d!          gt           j                                        gt           j        j        t           j        j        t           j        j        gdt          j        t          j        g d"#          d$%          &	  	        S )'Nrk  z+Vidu Q3 Start/End Frame-to-Video GenerationrE   r#  rG   rY  rh   r   ri   r.  rJ   rQ   rR   rS   rZ  r[  r-  r  Fr\  r]  r^  r_  r   r   rM   Tr$  rO   r\   r   r]   r   r0  r   r`  r   rw   rf  r   s    r/   r   z&Vidu3StartEndToVideoNode.define_schema!  s   y.F)Z%%..( "$0-3W,=,M !/ !" !"
 !#$.,-()(*)*131A1H,V !- !" !" !#
 0 0$+,1-N !1 !" !" 2 ..* "$0-3W,=,M !/ !" !"
 !#$.,-()(*)*131A1H,V !- !" !" !#
 0 0$+,1-N !1 !" !" 53h Am & 7 7p }--{++	"G    
 "!#!1!8+/   AIV !! 	.	+	#
 /8g8g8ghhh  qj
 j
 j
 j	
r1   rG   r   r   rM   r\   r!   c                 r   K   t          |d           t          ||ddd           t          |d         ||d         ||d	         |d
          fd||fD              d {V           }t           t          |           d {V }t          j        t          |d         j                   d {V           S )Nr   r  r   r   Fr   rG   rQ   rh   r  c                 R   K   g | ]!}t          |d d           d{V d         "S r   r   r   s     r/   r   z4Vidu3StartEndToVideoNode.execute.<locals>.<listcomp>  r)  r1   rh  r   )	r   r   r	   rA   r   r   r   r   r   )r   rG   r   r   rM   r\   r   r   s   `       r/   r   z Vidu3StartEndToVideoNode.execute  s      	40000.{Is\`inoooo%.:&\*.   )95        
 
 
 %S*>HHHHHHHH}#?
#O#OOOOOOOPPPr1   Nri  r   r1   r/   rk  rk    s        k
 k
 [k
Z QQ [Q ;	Q
 Q Q 
Q Q Q [Q Q Qr1   rk  c                   L    e Zd Zedeeej                          fd            ZdS )ViduExtensionr!   c                    K   t           t          t          t          t          t
          t          t          t          t          t          t          t          gS r+   )rC   r   r   r   r   r   r  r!  r+  rA  rW  rc  rk  )selfs    r/   get_node_listzViduExtension.get_node_list  s9         "# !#$# !$
 	
r1   N)	r   r   r   r   listtyper   	ComfyNoders  r   r1   r/   rp  rp    sE        
T$r|*<%= 
 
 
 X
 
 
r1   rp  c                  "   K   t                      S r+   )rp  r   r1   r/   comfy_entrypointrx    s      ??r1   N)r   )8typing_extensionsr   comfy_api.latestr   r   r   comfy_api_nodes.apis.vidur   r   r	   r
   r   r   r   r   comfy_api_nodes.utilr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   ru  rv  r   r   rt  rA   rC   r   r   r   r   r   r  r!  r+  r?  rA  rW  rc  rk  rp  rx  r   r1   r/   <module>r}     s=   & & & & & & 6 6 6 6 6 6 6 6 6 6	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                               . - 4 4 =  !	 	bl	 !#<<?\\ 	
 
*   <_Q _Q _Q _Q _Q", _Q _Q _QDeQ eQ eQ eQ eQ2< eQ eQ eQPpQ pQ pQ pQ pQR\ pQ pQ pQfeQ eQ eQ eQ eQbl eQ eQ eQPYQ YQ YQ YQ YQ2< YQ YQ YQxQ Q Q Q QBL Q Q QDDQ DQ DQ DQ DQbl DQ DQ DQNuQ uQ uQ uQ uQr| uQ uQ uQpHQ HQ HQ HQ HQ", HQ HQ HQV# $    <OQ OQ OQ OQ OQbl OQ OQ OQdNQ NQ NQ NQ NQ2< NQ NQ NQbKQ KQ KQ KQ KQBL KQ KQ KQ\HQ HQ HQ HQ HQr| HQ HQ HQV
 
 
 
 
N 
 
 
(      r1   