
    +j*                        d dl Z d dlZd dlZd dlZd dlmZ d dlZ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 d dlmZmZmZmZ d dlmZ d dlmZ  ej        e          Z G d	 d
e
j                  Z G d de
j                  Z de!e
j                 dedej"        de#fdZ$dej%        de&fdZ' G d de          Z(de(fdZ)dS )    N)urljoin)override)IOComfyExtensionInput)ApiEndpointaudio_bytes_to_audio_inputupload_video_to_comfyapivalidate_string)default_base_urlget_auth_headerget_node_idis_processing_interrupted)ProcessingInterrupted)PromptServerc            
       z    e Zd ZdZedej        fd            Ze	 	 ddej	        de
dedej        fd	            Zd
S )SoniloVideoToMusicz2Generate music from video using Sonilo's AI model.returnc                    t          j        ddddt           j                            dd          t           j                            dd	d
d          t           j                            dd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Sonilo Video to Musicpartner/audio/SoniloziGenerate music from video content using Sonilo's AI model. Analyzes the video and creates matching music.videoz@Input video to generate music from. Maximum duration: 6 minutes.)tooltipprompt Tz~Optional text prompt to guide music generation. Leave empty for best quality - the model will fully analyze the video content.default	multiliner   seedr       aSeed for reproducibility. Currently ignored by the Sonilo service but kept for graph consistency.r   minmaxcontrol_after_generater   z8{"type":"usd","usd":0.009,"format":{"suffix":"/second"}})expr	node_iddisplay_namecategorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaVideor   StringIntAudioOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgeclss    </home/wildlama/comfy/ComfyUI/comfy_api_nodes/nodes_sonilo.pydefine_schemaz SoniloVideoToMusic.define_schema    s    y(0+= ^    	"e	     *+/>   , X__&&'	.	+	#
 O  G&
 &
 &
 &	
    r   r   r   r   r   c                   K   t          | |d           d {V }t          j                    }|                    d|           |                                r(|                    d|                                           t          | t          dd          |           d {V }t          j        t          |                    S )Nh  )max_duration	video_urlr   z/proxy/sonilo/v2m/generatePOSTpathmethod)
r
   aiohttpFormData	add_fieldstrip_stream_sonilo_musicr   r   
NodeOutputr	   )r<   r   r   r   rC   formaudio_bytess          r=   executezSoniloVideoToMusic.executeJ   s       33CPPPPPPPPP	!!{I...<<>> 	5NN8V\\^^44409&III
 
 
 
 
 
 
 

 }7DDEEEr?   N)r   r   )__name__
__module____qualname____doc__classmethodr   r0   r>   r   r1   strintrM   rP    r?   r=   r   r      s        <<'
bi '
 '
 '
 ['
R  	F F{F F 	F
 
F F F [F F Fr?   r   c            
       p    e Zd ZdZedej        fd            Ze	 	 d
dede	de	dej
        fd            Zd	S )SoniloTextToMusicz:Generate music from a text prompt using Sonilo's AI model.r   c                    t          j        ddddt           j                            dddd	          t           j                            d
dddd          t           j                            dddddd          gt           j                                        gt           j        j        t           j        j	        t           j        j
        gdt          j        t          j        d
g          d          	  	        S )NrZ   zSonilo Text to Musicr   zyGenerate music from a text prompt using Sonilo's AI model. Leave duration at 0 to let the model infer it from the prompt.r   r   Tz-Text prompt describing the music to generate.r   durationr   rA   zmTarget duration in seconds. Set to 0 to let the model infer the duration from the prompt. Maximum: 6 minutes.)r   r"   r#   r   r   r   r    r!   )widgetsz
                (
                  widgets.duration > 0
                    ? {"type":"usd","usd": 0.005 * widgets.duration}
                    : {"type":"usd","usd": 0.005, "format":{"suffix":"/second"}}
                )
                )
depends_onr%   r&   )r   r0   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   PriceBadgeDependsr;   s    r=   r>   zSoniloTextToMusic.define_schemaa   s   y'/+M 	"K	     N    *+/>   2 X__&&'	.	+	#
 /EEE	 	 	M0
 0
 0
 0	
r?   r   r   r\   r   c                 \  K   t          |dd           t          j                    }|                    d|           |dk    r#|                    dt	          |                     t          | t          dd	          |           d {V }t          j        t          |                    S )
NT   )strip_whitespace
min_lengthr   r   r\   z/proxy/sonilo/t2m/generaterD   rE   )
r   rH   rI   rJ   rV   rL   r   r   rM   r	   )r<   r   r\   r   rN   rO   s         r=   rP   zSoniloTextToMusic.execute   s       	!DDDD!!x(((a<<NN:s8}}55509&III
 
 
 
 
 
 
 

 }7DDEEEr?   N)r   r   )rQ   rR   rS   rT   rU   r   r0   r>   rV   rW   rM   rP   rX   r?   r=   rZ   rZ   ^   s        DD1
bi 1
 1
 1
 [1
f  	F FF F 	F
 
F F F [F F Fr?   rZ   r<   endpointrN   r   c                  
  K   t          t                                          d          dz   |j                            d                    }i }|                    t          |                      |                    |j                   t          |           }t          j
                    }d}i }d}	t          j        dd          }
t          j        |
          4 d{V }t          j                            d|           |                    |||	          4 d{V }|j        d
k    r/t'          |           d{V }t)          d|j         d|           	 t+                      rt-          d          |j                                         d{V }|sn|                    d                                          }|sk	 t7          j        |          }n/# t6          j        $ r t<                              d           Y w xY w|                     d          }|dk    rA|                     dd          }|                     dd          }t)          d| d|           |dk    r>|                     d          }|%t          j                            d|dd|           n|dv re|dk    r!|                     dg           }|r|d         }	n|                     d           p|	}	|	r#t          j                            d!|	 |           n?|d"k    r1|                     d#d          }tC          j"        |d$                   }||vrg ||<   ||         #                    |           t          j
                    }||z
  d%k    rtI          d& |%                                D                       }tM          ||z
            }d'g}|	r|#                    d(|	            |#                    d)|            |#                    d*| d           t          j                            d+'                    |          |           |}n|d,k    rn	 ddd          d{V  n# 1 d{V swxY w Y   ddd          d{V  n# 1 d{V swxY w Y   |st)          d-          t          j                            d.|           d|v rdntQ          |          }d/'                    ||                   S )0z[POST ``form`` to Sonilo, read the NDJSON stream, and return the first stream's audio bytes./g        Ng     @g     r@)total	sock_read)timeoutzStatus: Queued)dataheadersi  zSonilo API error (z): TzTask cancelledzutf-8z&Sonilo: skipping malformed NDJSON linetypeerrorcodeUNKNOWNmessagezUnknown errorzSonilo generation error (r\   duration_secz#Status: Generating
Video duration: z.1fs)titlestitlers   r   rt   zStatus: Generating
Title: audio_chunkstream_indexrj   g      ?c              3   4   K   | ]}t          |          V  d S N)len).0chunkss     r=   	<genexpr>z'_stream_sonilo_music.<locals>.<genexpr>   s(      *\*\63v;;*\*\*\*\*\*\r?   zStatus: Receiving audiozTitle: zChunks received: zTime elapsed: 
completez"Sonilo API returned no audio data.zStatus: Completedr?   ))r   r   rstriprF   lstripupdater   rk   r   time	monotonicrH   ClientTimeoutClientSessionr   instancesend_progress_textpoststatus_extract_error_message	Exceptionr   r   contentreadlinedecoderK   jsonloadsJSONDecodeErrorloggerwarninggetbase64	b64decodeappendsumvaluesrW   joinr"   )r<   rd   rN   urlrk   r'   start_tslast_chunk_status_tsaudio_streamsrt   ri   sessionrespmsgraw_linelineevtevt_typern   rp   rq   rs   
stream_idx
chunk_datanowtotal_chunkselapsedstatus_linesselected_streams                                r=   rL   rL      s      "$$++C00368L8LS8Q8Q
R
RC GNN?3''(((NN8#$$$#G~H,.ME#&EBBBG$W555 F F F F F F F001A7KKK<<$<@@ D	 D	 D	 D	 D	 D	 D	D{c!!2488888888 JT[ J JS J JKKK?,.. B/0@AAA!%!6!6!8!8888888 w//5577 *T**CC+   NN#KLLLH 776??w&&776955D!ggiAAG#$R$R$R$R$RSSSz))#&77>#:#:L#/$-@@V<VVVV#   !4448++!$2!6!6! .$*1IE # 0 0 9E $-@@A%AA#   ..!$!;!;J!'!1#f+!>!>J!6646j1!*-44Z@@@.**C11S88'**\*\]EYEYE[E[*\*\*\'\'\"%cHn"5"5(A'B  C(//0A%0A0ABBB$++,N,N,NOOO$++,GW,G,G,GHHH$-@@<AXAXZabbb/2,++? ?D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	 D	F F F F F F F F F F F F F F F F F F F F F F F F F F FP  ><===,,-@'JJJ--aa3}3E3EO88M/2333s\   $?R#B&Q+
GQ+)HQ+
HIQ+R+
Q5	5R8Q5	9R
RRr   c                 J  K   	 |                                   d{V }|                    di           }t          |t                    r#|                    dt	          |                    S t	          |          S # t
          $ r |                                  d{V cY S w xY w)zCExtract a human-readable error message from an HTTP error response.Ndetailrp   )r   r   
isinstancedictrV   r   text)r   
error_bodyr   s      r=   r   r     s      !99;;&&&&&&
"--fd## 	6::iV5556{{ ! ! !YY[[         !s   A'A; ,A; ;$B"!B"c                   L    e Zd Zedeeej                          fd            ZdS )SoniloExtensionr   c                 "   K   t           t          gS rx   )r   rZ   )selfs    r=   get_node_listzSoniloExtension.get_node_list  s      "$566r?   N)	rQ   rR   rS   r   listrl   r   	ComfyNoder   rX   r?   r=   r   r     sE        7T$r|*<%= 7 7 7 X7 7 7r?   r   c                  "   K   t                      S rx   )r   rX   r?   r=   comfy_entrypointr     s      r?   )*r   r   loggingr   urllib.parser   rH   typing_extensionsr   comfy_api.latestr   r   r   comfy_api_nodes.utilr   r	   r
   r   comfy_api_nodes.util._helpersr   r   r   r   &comfy_api_nodes.util.common_exceptionsr   serverr   	getLoggerrQ   r   r   r   rZ   rl   rI   bytesrL   ClientResponserV   r   r   r   rX   r?   r=   <module>r      sV                    & & & & & & 6 6 6 6 6 6 6 6 6 6                       I H H H H H      		8	$	$>F >F >F >F >F >F >F >FBHF HF HF HF HF HF HF HFV`4	bl	`4`4 
`4 	`4 `4 `4 `4F	!w'= 	!# 	! 	! 	! 	!7 7 7 7 7n 7 7 7      r?   