
    S"i                        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 e j4                  d      Z e j4                  d      Z e j4                  d	d
      Z e e j4                  dd            Z e e j4                  dd            Z  e e j4                  dd            Z!dde iZ"dZ#dZ$dZ%dZ&dZ'h dZ(h dZ)dZ* e jV                  e*d       i Z,ee-ee-ef   f   e.d<   de-de/fd Z0de-d!e-de-fd"Z1d#e-fd$Z2d%e/fd&Z3d'e-fd(Z4d) Z5d* Z6d+ Z7d, Z8d-ed.ed/efd0Z9d1e-fd2Z:y)3    N)datetime	timedelta)OptionalDictAny)
UploadFileHTTPExceptionBackgroundTasks)Image)MP3RUNCOMFY_DEPLOYMENT_IDRUNCOMFY_TOKENRUNCOMFY_BASE_URLz https://api.runcomfy.net/prod/v1FPS25MAX_IMAGE_SIZE_MB10MAX_AUDIO_SIZE_MB50AuthorizationzBearer 284125159270241>   	image/jpg	image/png
image/jpeg>   	audio/mp3	audio/ogg	audio/wav
audio/mpegtemp_uploadsT)exist_okjobs	file_pathreturnc                    | j                  d      r"	 t        |       }|j                  j                  S dddddd| g}t	        j
                  |dd	      }t        j                  |j                        }t        |d
   d         S #  Y UxY w)N.mp3ffprobez-vquietz-print_formatjsonz-show_formatT)capture_outputtextformatduration)
endswithr   infolength
subprocessrunr,   loadsstdoutfloat)r&   audiocmdresultdatas        F/var/www/html/speakWrite/services/infinite_video_generation_service.pyget_audio_durationr>   7   s    &!		NE::$$$ dG_fni
XC^^C4@F::fmm$Dh
+,,	s    B B	mimec                     t        | d      5 }t        j                  |j                               j	                         }d d d        d| d S # 1 sw Y   xY w)Nrbzdata:z;base64,)openbase64	b64encodereaddecode)r&   r?   fb64s       r=   encode_filerI   H   sW    	i	 2!qvvx(//12 4&&&2 2s   2AA
image_pathc                 H   t        j                  |       }|j                  dk7  r|j                  d      }|j	                  d       t        j                         }|j                  |d       t        j                  |j                               j                         }d| S )NRGB)   rM   JPEG)r/   zdata:image/jpeg;base64,)r   rB   modeconvert	thumbnailioBytesIOsaverC   rD   getvaluerF   )rJ   imgbufferrH   s       r=   encode_imagerX   P   s~    
**Z
 C
xx5kk% MM,ZZ\FHHVFH#


6??,
-
4
4
6C$SE**    r0   c                 @    t        dt        | t        z        dz        S )N      )maxintr   )r0   s    r=   calculate_max_framesr_   b   s    q#hn%*++rY   
audio_pathc                 b   	 t        j                  | d       \  }}t        j                  ||      \  }}||dkD     }t        |      rt	        j
                  |      nd}t	        j
                  t         j                  j                  |            }|dkD  r|dkD  ry|d	k  r|d
k  ryy#  Y yxY w)N)sr)yrb   r      )rc      gQ?happy   gQ?sadneutral)librosaloadpiptracklennpmeanfeaturerms)r`   rc   rb   pitches_pitchenergys          r=   detect_emotionrv   g   s    ZD12%%b1
'A+&$'L c,,q,123;6D=3;6D=s   BB* 
B* *B.c                 `   t          dt         d}t        |      }dt        dd| iit        dd|iit
        dddt        |       d	it        dd
|iit        ddd| diiii}t        j                  ||t              }|j                          |j                         }|j                  d      S )Nz/deployments/z
/inference	overridesinputsimager9   z0:00z0:)
start_timeend_time
max_framespositive_promptzA person talking with z* facial expression, realistic high quality)r,   headers
status_url)BASE_URLDEPLOYMENT_IDr_   
NODE_IMAGENODE_AUDIO_RAWNODE_AUDIO_CROPr^   NODE_MAX_FRAMESNODE_PROMPTrequestspostHEADERSraise_for_statusr,   get)		image_uri	audio_urir0   emotionurlr}   payloadrespr<   s	            r=   start_inferencer      s    JmM?*
=C%h/J 	GY#78X';<hvRPST\P]K_(`ahz(BC%0	9cd
G2 ==7G<D99;D88L!!rY   c                     	 t        j                  | t              }|j                         }|j                  d      }|dk(  r|S |dk(  rt	        d      t        j                  d       i)N)r   status	completedfailedzGeneration failed   )r   r   r   r,   RuntimeErrortimesleep)r   r   r<   r   s       r=   pollr      s_    
||J8yy{(#[ KX233

1 rY   c                     | j                  di       }|j                         D ]4  }|j                  dg       }|D ]  }|j                  d      }|s|c c S  6 y )Noutputsgifsr   )r   values)r;   r   noder   gifr   s         r=   extract_videor      sa    jjB'G  	xx# 	C''%.C
			 rY   c                 (  K   t         |    }	 d|d<   t        |      }t        |      }t        |      }t	        |d      }t        ||||      }t        |      }	t        |	      }
d|d<   |
|d<   t        j                         t        d      z   |d<   t        j                  j                  |      rt        j                   |       t        j                  j                  |      rt        j                   |       y y # t        $ r}d	|d<   t        |      |d
<   Y d }~d }~ww xY w# t        j                  j                  |      rt        j                   |       t        j                  j                  |      rt        j                   |       w w xY ww)N
processingr   r"   r   	video_url   )hours
expires_atr   error)r%   r>   rv   rX   rI   r   r   r   r   utcnowr   	Exceptionstrospathexistsremove)job_idrJ   r`   jobr0   r   r   r   r   r;   r   es               r=   process_jobr      s?    
v,C$"$H%j1 , ,	
L9	$Y	8WM
j!!&)	#H$K$OO-	0CCL 77>>*%IIj!77>>*%IIj! &   H1vG	 77>>*%IIj!77>>*%IIj! &s=   
FBC; A*F;	D!DD$ D!!D$ $A+FFbackground_tasksrz   r9   c                 f  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 }|j                  |j                          d {          d d d        t        |d      5 }|j                  |j                          d {          d d d        |dd	t        |<   | j                  t        |||       |dd	S 7 u# 1 sw Y   pxY w7 G# 1 sw Y   BxY ww)
Ni  zInvalid imagezInvalid audio/z.jpgr)   wbqueued)r   r   )content_typeALLOWED_IMAGE_TYPESr	   ALLOWED_AUDIO_TYPESr   uuiduuid4TEMP_DIRrB   writerE   r%   add_taskr   )r   rz   r9   r   rJ   r`   rG   s          r=   create_video_jobr     s(     !44C11!44C11F:Qvhd+J:Qvhd+J	j$	 $1	ejjl"#$ 
j$	 $1	ejjl"#$ DL
 k6:zJ   #$ $ #$ $sZ   A>D1 DD
 D(D1<D%D#
D%$1D1DD D1#D%%D.*D1r   c                 T   K   t         j                  |       }|st        dd      |S w)Ni  zJob not found)r%   r   r	   )r   r   s     r=   get_video_jobr   )  s)     
((6
CC11Js   &();r   rR   rC   r,   r   asyncior4   r   r   r   typingr   r   r   r   fastapir   r	   r
   PILr   mutagen.mp3r   numpyrn   rj   getenvr   TOKENr   r^   r   r   r   r   r   r   r   r   r   r   r   r   makedirsr%   r   __annotations__r8   r>   rI   rX   r_   rv   r   r   r   r   r   r    rY   r=   <module>r      s   	 	       ( & &  > >     		23		"#299(*LM	)"))E4
 !			"5t<= 			"5t<= geW-
.
> K  Ht $ #%d3S#X $-# -% -"'3 'c 'c '+S +$,5 ,
s <%"P&,("^!%!! !H rY   