
    3j|(                        S SK r S SKrS SKrS SKrS SKJr  S SKrS SKJr  S SK	J
r
JrJr  S SKJrJrJrJr  S SKJrJrJrJr  S SKJr  S SKJr  \R6                  " \5      r " S	 S
\
R<                  5      r " S S\
R<                  5      r S\!\
R<                     S\S\RD                  S\#4S jr$S\RJ                  S\&4S jr' " S S\5      r(S\(4S jr)g)    N)urljoin)override)IOComfyExtensionInput)ApiEndpointaudio_bytes_to_audio_inputupload_video_to_comfyapivalidate_string)default_base_urlget_comfy_api_headersget_node_idis_processing_interrupted)ProcessingInterrupted)PromptServerc            
           \ rS rSrSr\S\R                  4S j5       r\  SS\	R                  S\S\S\R                  4S jj5       rS	rg
)SoniloVideoToMusic   z2Generate music from video using Sonilo's AI model.returnc                    [         R                  " SSSS[         R                  R                  SSS9[         R                  R                  SS	S
SS9[         R
                  R                  SSSSS
SS9/[         R                  R                  5       /[         R                  R                  [         R                  R                  [         R                  R                  /S
[         R                  " SS9S9	$ )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_schema SoniloVideoToMusic.define_schema    s    yy(0+= ^   		"e	    *+/>  , XX__&'		..		++		##
 OG&
 &	
    r   r   r   c                 f  #    [        XSS9I S h  vN n[        R                  " 5       nUR                  SU5        UR	                  5       (       a   UR                  SUR	                  5       5        [        U [        SSS9U5      I S h  vN n[        R                  " [        U5      5      $  N N%7f)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   rE   formaudio_bytess          r>   executeSoniloVideoToMusic.executeJ   s      33CPP	!{I.<<>>NN8V\\^409&I
 

 }}7DEE Q

s"   B1B-A8B1	B/
$B1/B1 N)r   r   )__name__
__module____qualname____firstlineno____doc__classmethodr   r1   r?   r   r2   strintrO   rR   __static_attributes__rT   rA   r>   r   r      ss    <'
bii '
 '
R  	F{{F F 	F
 
F FrA   r   c            
           \ rS rSrSr\S\R                  4S j5       r\  SS\	S\
S\
S\R                  4S jj5       rS	rg
)SoniloTextToMusic^   :Generate music from a text prompt using Sonilo's AI model.r   c                    [         R                  " SSSS[         R                  R                  SSSSS	9[         R                  R                  S
SSSSS9[         R                  R                  SSSSSSS9/[         R
                  R                  5       /[         R                  R                  [         R                  R                  [         R                  R                  /S[         R                  " [         R                  " S
/S9SS9S9	$ )Nr_   zSonilo Text to Musicr   ra   r   r   Tz-Text prompt describing the music to generate.r   duration      rC   z/Target duration in seconds. Maximum: 6 minutes.)r   r#   r$   r   r   r   r    r!   r"   )widgetsz/{"type":"usd","usd": 0.0025 * widgets.duration})
depends_onr&   r'   )r   r1   r3   r   r4   r5   r6   r7   r8   r9   r:   r;   PriceBadgeDependsr<   s    r>   r?   SoniloTextToMusic.define_schemaa   s    yy'/+T		"K	    M   *+/>  0 XX__&'		..		++		##
 //EFI(
 (	
rA   r   rc   r   c                 "  #    [        USSSS9  [        R                  " 5       nUR                  SU5        UR                  S[	        U5      5        [        U [        SSS	9U5      I S h  vN n[        R                  " [        U5      5      $  N#7f)
NTre   i  )strip_whitespace
min_length
max_lengthr   rc   z/proxy/sonilo/t2m/generaterF   rG   )
r   rJ   rK   rL   r[   rN   r   r   rO   r	   )r=   r   rc   r   rP   rQ   s         r>   rR   SoniloTextToMusic.execute   s      	!PTU!x(z3x=109&I
 

 }}7DEE
s   A'B)B*$BrT   N)re   r   )rU   rV   rW   rX   rY   rZ   r   r1   r?   r[   r\   rO   rR   r]   rT   rA   r>   r_   r_   ^   so    D)
bii )
 )
V  	FF F 	F
 
F FrA   r_   r=   endpointrP   r   c                 	  #    [        [        5       R                  S5      S-   UR                  R	                  S5      5      n[        U 5      nUR                  UR                  5        [        U 5      n[        R                  " 5       nSn0 nSn	[        R                  " SSS9n
[        R                  " U
S9 ISh  vN n[        R                  R!                  SU5        UR#                  X2US	9 ISh  vN nUR$                  S
:  a.  ['        U5      I Sh  vN n[)        SUR$                   SU 35      e [+        5       (       a  [-        S5      eUR.                  R1                  5       I Sh  vN nU(       d  GO]UR3                  S5      R5                  5       nU(       d  Mn   [6        R8                  " U5      nURA                  S5      nUS:X  a5  URA                  SS5      nURA                  SS5      n[)        SU SU 35      eUS:X  a;  URA                  S5      nUb%  [        R                  R!                  SUS S3U5        GOUS;   ak  US:X  a  URA                  S/ 5      nU(       a  US   n	OURA                  S5      =(       d    U	n	U	(       a#  [        R                  R!                  S U	 3U5        GOUS!:X  Ga  URA                  S"S5      n[B        RD                  " US#   5      nUU;  a  / UU'   UU   RG                  U5        [        R                  " 5       nUU-
  S$:  a  [I        S% URK                  5        5       5      n[M        UU-
  5      nS&/nU	(       a  URG                  S'U	 35        URG                  S(U 35        URG                  S)U S35        [        R                  R!                  S*RO                  U5      U5        UnOUS+:X  a  OGM  SSS5      ISh  vN   SSS5      ISh  vN   U(       d  [)        S,5      e[        R                  R!                  S-U5        SU;   a  SO
[Q        U5      nS.RO                  UU   5      $  GN GNb GNB GN! [6        R:                   a    [<        R?                  S5         GMU  f = f N! , ISh  vN  (       d  f       N= f N! , ISh  vN  (       d  f       N= f7f)/z[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): zTask cancelledzutf-8z&Sonilo: skipping malformed NDJSON linetypeerrorcodeUNKNOWNmessagezUnknown errorzSonilo generation error (rc   duration_secz#Status: Generating
Video duration: z.1fs)titlestitler~   r   r   zStatus: Generating
Title: audio_chunkstream_indexru   g      ?c              3   8   #    U  H  n[        U5      v   M     g 7fN)len).0chunkss     r>   	<genexpr>'_stream_sonilo_music.<locals>.<genexpr>   s     *\E[63v;;E[s   zStatus: Receiving audiozTitle: zChunks received: zTime elapsed: 
completez"Sonilo API returned no audio data.zStatus: CompletedrA   ))r   r   rstriprH   lstripr   updaterv   r   time	monotonicrJ   ClientTimeoutClientSessionr   instancesend_progress_textpoststatus_extract_error_message	Exceptionr   r   contentreadlinedecoderM   jsonloadsJSONDecodeErrorloggerwarninggetbase64	b64decodeappendsumvaluesr\   joinr#   )r=   ro   rP   urlrv   r(   start_tslast_chunk_status_tsaudio_streamsr   rt   sessionrespmsgraw_linelineevtevt_typery   r{   r|   r~   
stream_idx
chunk_datanowtotal_chunkselapsedstatus_linesselected_streams                                r>   rN   rN      s/     "$++C0368L8LS8Q
RC#C(GNN8##$#G~~H,.ME##&EBG$$W55001A7K<<<@@D{{c!2488"4T[[MSE JKK,../0@AA!%!6!6!88w/557**T*C
 776?w&77695D!ggiAG#&?vS	$RSSz)#&77>#:L#/$--@@B<PSBTTUV# !448+!$2!6!$*1IE # 0 9E$--@@9%A# .!$!;J!'!1!1#f+!>J!646j1!*-44Z@..*C11S8'**\]EYEYE[*\'\"%cHn"5(A'B (//'%0AB$++.?~,NO$++nWIQ,GH$--@@<AXZab/2,+  A@ 65P <==,,-@'J-a3}3EO88M/233[ 6@8 9 ++ NN#KL' A@@@ 6555s   B9S;Q<S?5R.4Q5R.8RQAR/Q05R&Q<HRR.%R&R.*S5R,6ASR.RR)RRRRR.R)	RR)	%R.,S.S4R75SSr   c                 ,  #     U R                  5       I Sh  vN nUR                  S0 5      n[        U[        5      (       a  UR                  S[	        U5      5      $ [	        U5      $  NQ! [
         a    U R                  5       I Sh  vN  s $ f = f7f)zCExtract a human-readable error message from an HTTP error response.Ndetailr{   )r   r   
isinstancedictr[   r   text)r   
error_bodyr   s      r>   r   r     s{     !99;&
"-fd##::iV556{	 '
  !YY[   !sQ   BA+ A)AA+ B
A+ (B)A+ +BB	BBBBc                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)SoniloExtensioni  r   c                 "   #    [         [        /$ 7fr   )r   r_   )selfs    r>   get_node_listSoniloExtension.get_node_list  s     "$566s   rT   N)rU   rV   rW   rX   r   listrw   r   	ComfyNoder   r]   rT   rA   r>   r   r     s)    7T$r||*<%= 7 7rA   r   c                     #    [        5       $ 7fr   )r   rT   rA   r>   comfy_entrypointr     s     s   )*r   r   loggingr   urllib.parser   rJ   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   	getLoggerrU   r   r   r   r_   rw   rK   bytesrN   ClientResponser[   r   r   r   rT   rA   r>   <module>r      s           & 6 6   I 			8	$>F >FB?F ?FD_4	bll	_4_4 

_4 	_4D	!w'='= 	!# 	!7n 7 rA   