
    OiC7                         U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZmZmZ d dlZd dlmZmZmZ d dlmZ d dlmZ d dlZd dlZdZdZ e j        d	d
          Zde ddZdZdZ  e j!        e d           h dZ"h dZ#dZ$dZ%dZ&dZ'dZ(i Z)ee*ee*ef         f         e+d<   de,fdZ-de*de,fdZ.de*de*fd Z/de*d!e*de*fd"Z0d#e,de1fd$Z2d%e*de*fd&Z3	 	 	 d7de1d)e1d*e1fd+Z4d, Z5d- Z6d. Z7d/ Z8d0ed1ed2e*d3e*fd4Z9d5e*fd6Z:dS )8    N)datetime	timedelta)OptionalDictAny)
UploadFileHTTPExceptionBackgroundTasks)Image)MP3z$17079ce3-e7b6-4e3e-8530-f720b5efba0dz$46889de3-7a9f-45bf-8310-af35019db8ccRUNCOMFY_BASE_URLz https://api.runcomfy.net/prod/v1zBearer zapplication/json)AuthorizationzContent-Type   temp_uploadsT)exist_ok>   	image/jpg	image/png
image/jpeg>   	audio/mp3	audio/ogg	audio/wav
audio/mpeg284125159270241jobssecondsc                 Z    t          |           dz  }t          |           dz  } | d| dS )N<   :02d)int)r   minutess     F/var/www/html/speakWrite/services/infinite_video_generation_service.pyseconds_to_mmssr'   J   s9    'llb G'llRG%%%%%%    	file_pathreturnc                 4   |                      d          r0	 t          |           }t          |j        j                  S #  Y nxY wdddddd| g}t          j        |dd	          }t          j        |j	                  }t          |d
         d                   S )N.mp3ffprobez-vquietz-print_formatjsonz-show_formatT)capture_outputtextformatduration)
endswithr   floatinfolength
subprocessrunr/   loadsstdout)r)   audiocmdresultdatas        r&   get_audio_durationr@   R   s    &!! 		NNE*+++	D 	C ^C4@@@F:fm$$Dh
+,,,s	   '? Apathc                 d   t          j        |           }|j        dk    r|                    d          }|                    d           t          j                    }|                    |dd           t          j	        |
                                                                          }d| S )NRGB)   rD   JPEG_   )r2   qualityzdata:image/jpeg;base64,)r   openmodeconvert	thumbnailioBytesIOsavebase64	b64encodegetvaluedecode)rA   imgbufferb64s       r&   encode_imagerV   l   s    
*T

C
x5kk%  MM,Z\\FHHVFBH///

6??,,
-
-
4
4
6
6C*S***r(   mimec                     t          | d          5 }t          j        |                                                                          }d d d            n# 1 swxY w Y   d| d| S )Nrbzdata:z;base64,)rH   rO   rP   readrR   )rA   rW   frU   s       r&   encode_audior\   ~   s    	dD		 2Qqvvxx((//112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 '4&&&&&s   9AAAr3   c                 L    t          dt          | t          z                      S )N   )maxr$   FPS)r3   s    r&   calculate_max_framesra      s    q#hn%%&&&r(   
audio_pathc                    	 t          j        | d           \  }}t          t          j        t           j                            |                              }t          j        ||          \  }}||dk             }t          |          r!t          t          j        |                    nd}|dk    r|dk    rdS |d	k     r|d
k     rdS dS #  Y dS xY w)N)sr)y)re   rd   r         g?happy   gQ?sadneutral)	librosaloadr5   npmeanfeaturermspiptracklen)rb   re   rd   energypitches_pitchs          r&   detect_emotionrx      s    ZD1112rww22Q2778899%b111
'A+&+.w<<@bgg&&'''S3;;6D==73;;6D==5yyys   B;C ?C C   r^   min_instancesmax_instancesc                 P   t            dt           }d||| di}	 t          j        |t          |d          }|j        dvrt          d|j        |j                   dS t          d|  d	           dS # t          $ r(}t          d
t          |                     Y d}~dS d}~ww xY w)zo
    Ensure deployment stays warm for X seconds after finishing requests.
    Safe to call multiple times.
    /deployments/autoscaling)rz   r{   keep_warm_duration_in_seconds   )headersr/   timeout)rg      z$Warning: could not update keep warm:z3Deployment autoscaling updated: keep_warm_duration=sz!Warning: keep warm update failed:N)
BASE_URLDEPLOYMENT_IDrequestspatchHEADERSstatus_codeprintr1   	Exceptionstr)r   rz   r{   urlpayloadresponsees          r&   set_keep_warm_durationr      s    
3
3M
3
3C 	**-4
 
G;>	
 
 
 z118&-! ! ! ! ! 1&-1 1 1    
  ; ; ;13q66:::::::::;s   AA3 A3 3
B%=B  B%c                    t          d           t           dt           d}t          |          }dt          dd| iit
          dd|iit          dd	t          |          d
it          dd|iit          dd| d| diiii}t          j        |t          |          }|j        dk    rt          |j                  |                                }	|	                    d          }
|
st          d          |
S )Nry   )r   r}   z
/inference	overridesinputsimager<   z0:00)
start_timeend_timevaluepositive_promptz, z%, ultra realistic, cinematic lighting)r   r/   rg   
status_urlz"RunComfy did not return status_url)r   r   r   ra   
NODE_IMAGE
NODE_AUDIONODE_AUDIO_CROPr'   NODE_FRAMESNODE_PROMPTr   postr   r   RuntimeErrorr1   r/   get)	image_uri	audio_urir3   emotionpromptr   
max_framesr   r   r?   r   s              r&   start_inferencer      sK   1%%%%
=
=M
=
=
=C%h//J 	Y Y "( / 9 9  Z %!SSWSSS7!
#GJ }S'@@@Hs""8=)))==??D,''J A?@@@r(   c                   K   d}t          |          D ]-}t          j        t          j        | t
                     d {V }|j        dk    rt          |j                  |	                                }|                    dd          }|                    d          }|t          |          |d<   nq|dk    rd|d<   ne|d	k    r+t          d
|                    dd          dz             |d<   n4|dv r	d|d<   |c S |dv r#t          |                    dd                    t          j        d           d {V  /t          d          )Ni  )r   rg   status progressqueuedg{Gz?runninggffffff?)	completed	succeeded      ?)failederrorr   zGeneration failed   zTimeout waiting for RunComfy)rangeasyncio	to_threadr   r   r   r   r   r1   r/   r5   minsleep)r   jobmax_attemptsattemptr   r?   r   r   s           r&   poll_with_progressr     s     L&& , , *L
 
 
 
 
 
 
 
 
 3&&x}---}}(B''88J''#HooC
OOx"C
OOy   "
D))D0 C
OO
 111!C
OKKK***"566   mA
5
6
66r(   c                   K   t           |          }	 d|d<   d|d<   t          |          }t          |          }t          |d          }t	          j        t          |||||           d {V }	t          |	|           d {V }
|
                    d          p|
                    d          }||d<   |st          d          t           d	t           d
| d}t	          j        t          j        |t          d           d {V }|                                 |                                }t!          |          }|s|                    d          }|st          d          d|d<   ||d<   d|d<   t#          j                    t'          d          z                                   |d<   n.# t*          $ r!}d|d<   t-          |          |d<   Y d }~nd }~ww xY w||fD ]5}t.          j                            |          rt/          j        |           6d S # ||fD ]5}t.          j                            |          rt/          j        |           6w xY w)N
processingr           r   r   
request_ididz/Could not retrieve request_id from final statusr}   
/requests/z/result   r   r   
result_urlzNo video URL found in resultr   	video_urlr      )hours
expires_atr   r   )r   r@   rV   r\   r   r   r   r   r   r   r   r   r   r   raise_for_statusr/   extract_videor   utcnowr   	isoformatr   r   osrA   existsremove)job_id
image_pathrb   r   r   r   r3   r   r   r   final_statusr   r   respresult_datar   r   rA   s                     r&   process_jobr   H  s     
v,C3 $HJ%j11 ,,	 \::	",
 
 
 
 
 
 
 

 1SAAAAAAAA!%%l33M|7G7G7M7M
&L 	RPQQQ [[}[[
[[[
&L	
 
 
 
 
 
 
 
 
 	iikk!+..	 	6#55I 	?=>>>#H$KJ%_..1D1D1DDOOQQL    H1vvG
  , 	  	 Dw~~d##  	$	  	 Z, 	  	 Dw~~d##  	$	 s0   FF- ,H -
G7GH GH <Ic                    |                      di           }|                                D ]A}dD ]<}|                     |g           }|D ]!}|                     d          }|r|c c c S "=B|                      d          S )Noutputs)gifsvideosr   r   )r   values)r>   r   nodekeyitemsitemr   s          r&   r   r     s    jjB''G    % 	 	CHHS"%%E  hhuoo JJJJJJJ	 ::l###r(   r   r<   r   r   c           	        K   | j         t          vrt          dd          |j         t          vrt          dd          t	          t          j                              }t           d| d}t           d| d}t          |d          5 }|	                    | 
                                 d {V            d d d            n# 1 swxY w Y   t          |d          5 }|	                    |
                                 d {V            d d d            n# 1 swxY w Y   d |dd	d d d
t          |<   t          j        t          |||||                     t          |         S )Ni  zInvalid image typezInvalid audio type/z.jpgr,   wbr   r   )r   r   r   r   r   r   )content_typeALLOWED_IMAGE_TYPESr	   ALLOWED_AUDIO_TYPESr   uuiduuid4TEMP_DIRrH   writerZ   r   r   create_taskr   )r   r<   r   r   r   r   rb   r[   s           r&   create_video_jobr     s      !444C!5666!444C!5666F++v+++J++v+++J	j$		 $1	ejjll""""""###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 
j$		 $1	ejjll""""""###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $  DL FJ
76BB   <s$   	.CC
C.DDDr   c           	        K   t                               |           }|st          dd          |                    d          }|s;| |d         |d         |                    d          |                    d          d dS t           d	t           d
| d}	 t          j        |t          d          }|                                 n+# t
          j        $ r}t          dd|           d }~ww xY w|	                                }|                    d|d                   |d<   |                    d|d                   |d<   |                    d|                    d                    |d<   |                    d|                    d                    |d<   | ||d         |d         |                    d          |                    d          |                    d          dS )Ni  zJob not foundr   r   r   r   r   )r   r   r   r   r   r   r}   r   z/statusr   r   i  zError fetching status: )r   detailr   )r   r   r   r   r   r   r   )
r   r   r	   r   r   r   r   r   RequestExceptionr/   )r   r   r   r   r   r   r?   s          r&   get_video_jobr     s      
((6

C 2C111 &&J 	
 (mJ--WWW%%
 
 	
 WW=WWJWWWJS|JDDD$ S S S4Qa4Q4QRRRRS 99;;D HHXs8}55CMhhz3z?;;C
O88GSWWW%5%566CLsww{/C/CDDC  h-
OWW[))!!ggl++  s   0C C0C++C0)ry   r   r^   );r   rL   rO   r/   r   r   r8   timer   r   typingr   r   r   r   fastapir   r	   r
   PILr   mutagen.mp3r   numpyrn   rl   r   TOKENgetenvr   r   r`   r   makedirsr   r   r   r   r   r   r   r   r   __annotations__r5   r'   r@   rV   r\   r$   ra   rx   r   r   r   r   r   r   r    r(   r&   <module>r      sV   					 				          ( ( ( ( ( ( ( ( & & & & & & & & & &  > > > > > > > > > >                  7.29(*LMM 'u&&& 
 	 Ht $ $ $ $       

 #%d3S#X $ $ $&U & & & &-# -% - - - -4+s +s + + + +$'s '# '# ' ' ' ''5 'S ' ' ' '
s s    > ,; ,;,;,; ,; ,; ,; ,;^9 9 9x27 27 27h5  5  5 n	$ 	$ 	$l&& & 	&
 & & & &R- - - - - - -r(   