o
    i                     @   s   d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZmZmZmZmZmZ G dd deZG d	d
 d
eZG dd de	jZG dd de
ZdefddZdS )    )OptionalN)	BaseModelField)override)IOComfyExtension)ApiEndpointdownload_url_to_video_outputget_number_of_imagespoll_opsync_optensor_to_bytesioc                   @   sN   e Zd ZU edZeed< edZeed< edZeed< edZ	eed< dS )Sora2GenerationRequest.promptmodelsecondssizeN)
__name__
__module____qualname__r   r   str__annotations__r   r   r    r   r   8/mnt/c/Users/fbmor/ComfyUI/comfy_api_nodes/nodes_sora.pyr      s
   
 r   c                   @   sF   e Zd ZU edZeed< edZee	 ed< edZ
ee ed< dS )Sora2GenerationResponse.idNerrorstatus)r   r   r   r   r   r   r   r   r   dictr   r   r   r   r   r      s   
 r   c                   @   sN   e Zd Zedd Ze				ddeded	ed
ededeej	 fddZ
dS )OpenAIVideoSora2c                 C   s   t jddddt jjdddgddt jjd	d
dddt jjdg dddt jjdg dddt jjdd
dt jjdddddt jjd
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ddd 	S )!Nr   zOpenAI Sora - Videozapi node/video/Soraz"OpenAI video and audio generation.r   sora-2z
sora-2-pro)optionsdefaultr   T z8Guiding text; may be empty if an input image is present.)	multiliner"   tooltipr   )720x12801280x720	1024x1792	1792x1024r'   duration)         r,   image)optionalseedr   i   z`Seed to determine if node should re-run; actual results are nondeterministic regardless of seed.)r"   minmaxstepdisplay_modecontrol_after_generater/   r%   )r   r   r*   )widgetsaY  
                (
                  $m := widgets.model;
                  $size := widgets.size;
                  $dur := widgets.duration;
                  $isPro := $contains($m, "sora-2-pro");
                  $isSora2 := $contains($m, "sora-2");
                  $isProSize := ($size = "1024x1792" or $size = "1792x1024");
                  $perSec :=
                    $isPro ? ($isProSize ? 0.5 : 0.3) :
                    $isSora2 ? 0.1 :
                    ($isProSize ? 0.5 : 0.1);
                  {"type":"usd","usd": $round($perSec * $dur, 2)}
                )
                )
depends_onexpr)	node_iddisplay_namecategorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaComboInputStringImageIntNumberDisplaynumberVideoOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDependsclsr   r   r   define_schema    sl   
-zOpenAIVideoSora2.define_schemar'   r,   r   Nr   r   r   r*   r0   r.   c           
   
      s   |dkr|dvrt dd }|d ur&t|dkrt dddt|dfi}t| td	d
dt||t||d|tddI d H }|jrIt	|jd |dkrOdnd}	t
| td|j dtdd dtd|d  |	 dI d H  ttd|j d| dI d H S )Nr    )r&   r'   zHInvalid size for sora-2 model, only 720x1280 and 1280x720 are supported.r1   z,Currently only one input image is supported.input_referencez	image.pngz	image/pngz/proxy/openai/v1/videosPOST)pathmethod)r   r   r   r   zmultipart/form-data)endpointdatafilesresponse_modelcontent_typemessage   z/proxy/openai/v1/videos/)rX   c                 S   s   | j S N)r   )xr   r   r   <lambda>   s    z*OpenAIVideoSora2.execute.<locals>.<lambda>g       @-   r+   )poll_endpointr]   status_extractorpoll_intervalestimated_durationz/contentrS   )
ValueErrorr
   r   r   r   r   r   r   r   	Exceptionr   r   intr   
NodeOutputr	   )
rT   r   r   r   r*   r0   r.   files_inputinitial_responsemodel_time_multiplierr   r   r   executep   sF   

zOpenAIVideoSora2.execute)r'   r,   r   N)r   r   r   classmethodrU   r   rk   r   torchTensorrp   r   r   r   r   r      s*    
Or   c                   @   s(   e Zd Zedeeej  fddZdS )OpenAISoraExtensionreturnc                    s   t gS ra   )r   )selfr   r   r   get_node_list   s   z!OpenAISoraExtension.get_node_listN)	r   r   r   r   listtyper   	ComfyNoderw   r   r   r   r   rt      s    rt   ru   c                      s   t  S ra   )rt   r   r   r   r   comfy_entrypoint   s   r{   )typingr   rr   pydanticr   r   typing_extensionsr   comfy_api.latestr   r   comfy_api_nodes.utilr   r	   r
   r   r   r   r   r   rz   r   rt   r{   r   r   r   r   <module>   s     
 