o
    q›Xj#  ã                   @  sR   d dl m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 G dd„ dƒZ	dS )é    )ÚannotationsN)ÚPathc                   @  sn   e Zd ZdZdddddddd	œZd
Zd7d8dd„Z			d9d:d"d#„Zd$d%„ Zd;d+d,„Z	d<d=d1d2„Z
d>d5d6„ZdS )?ÚVideoDirectoruD   Premium short-form reel builder â€” cinematic beats, not slideshows.)zmin(zoom+0.0018,1.4)úiw/2-(iw/zoom/2)úih/2-(ih/zoom/2))z%if(eq(on,1),1.4,max(zoom-0.0018,1.0))r   r   )ú1.28z!if(eq(on,1),iw*0.18,max(x-2.2,0))r   )r   z$if(eq(on,1),0,min(x+2.2,iw-iw/zoom))r   )zif(lte(on,10),1+0.045*on,1.35)r   r   )z1.22+0.0008*onziw/2-(iw/zoom/2)+8*sin(on/12)r   )z1.3z*iw/2-(iw/zoom/2)+if(lt(mod(on,12),2),15,0)r   )Úzoom_inÚzoom_outÚpan_leftÚ	pan_rightÚpunch_inÚparallaxÚglitch)ÚfadeÚwipeleftÚ	wiperightÚslideupÚ	slidedownÚ
circlecropÚpixelizeÚhbluré   FÚmax_secondsÚintÚenable_audioÚboolc                 C  s   t d|ƒ| _|| _d S )Né   )Úmaxr   r   )Úselfr   r   © r   úA/home/esfera/Documents/content_generation/src/generators/video.pyÚ__init__   s   
zVideoDirector.__init__Ú	cinematicNÚframesú
list[Path]Úcaptionsú	list[str]Úout_pathr   Úmotion_styleÚstrÚmotionsúlist[str] | NoneÚ	durationsúlist[float] | NoneÚreturnc              
     s’  |st dƒ‚t d¡s| d¡}t |d |¡ |S |jjddd� |jd }| ¡ r2tj|dd� |jdd	� t	|ƒ}	|rGt	|ƒ|	krG|}
nIˆ j
td
|	ƒ }g }
t|	ƒD ],}|dkrf|
 td|d ƒ¡ qU||	d
 krw|
 td|d ƒ¡ qU|
 td|d ƒ¡ qUt|
ƒ‰‡ ‡fdd„|
D ƒ}
d}g }tˆ j ¡ ƒ}t|ƒD ]s\}}|r¯|t	|ƒk r¯|| nd p¸||t	|ƒ  }|dkrÈ|d dkrÅdnd}n"|dkr×|d dkrÔdnd}n|dkrÞd}n|dkrê|d rèdnd}|t	|ƒk rô|| nd}|d|d›d � }ˆ j|||
| ||||d!� | |¡ qŸ|d" }ˆ  |||
¡ |d# }ˆ j|ˆ j
d |d$� tˆ d%d&ƒ�r=ˆ  |||¡ |S dd l}| ||¡ |S )'NzNo frames for videoÚffmpegz.pngr   T)ÚparentsÚexist_okÚ_video_work)Úignore_errors)r1   é   g       @gffffffæ?ç      @g333333ë?g      @gffffffò?c                   s   g | ]	}|ˆ j ˆ  ‘qS r   )r   )Ú.0Úp©r   Útotalr   r    Ú
<listcomp>D   s    z'VideoDirector.build.<locals>.<listcomp>r   r   é   r   Úkineticr   r   Ú	broadcastr   r
   Ú Úclip_Ú02dz.mp4)ÚdurationÚfpsÚmotionÚcaptionÚ
beat_indexz
merged.mp4z	score.wav)rA   Ústyler   F)ÚRuntimeErrorÚshutilÚwhichÚwith_suffixÚcopyÚparentÚmkdirÚexistsÚrmtreeÚlenr   r   ÚrangeÚappendÚsumÚlistÚMOTIONÚkeysÚ	enumerateÚ_animate_clipÚ_crossfade_concatÚ_generate_scoreÚgetattrÚ
_mux_audio)r   r#   r%   r'   r(   r*   r,   ÚstillÚworkÚnÚpersÚbaseÚirB   Ú
clip_pathsÚmotion_cycleÚframerC   rD   ÚclipÚmergedÚmusicÚ_shr   r8   r    Úbuild   sf   	


,þzVideoDirector.buildc                C  sþ   t dt|| ƒƒ}| j || jd ¡\}	}
}| dd¡ dd¡ dd¡d d… }d}|rH|d	kr2d
nd}|d	kr:dnd}d|› d|› d|› d�}d|	› d|
› d|› d|› d|› d|› �}dddddt|ƒd|dt|ƒdt|ƒd d!t|ƒg}tj|d"d"d#� d S )$Nr4   r   ú:z\:ú'r>   ú"éF   r   z0.65z0.5é*   é"   z1,drawbox=x=32:y=ih-200:w=iw-64:h=120:color=black@z:t=fill,drawtext=text='z':fontcolor=white:fontsize=z:x=(w-text_w)/2:y=h-165zOscale=1500:1500:force_original_aspect_ratio=increase,crop=1500:1500,zoompan=z='z':x='z':y='z':d=z:s=1080x1080:fps=z,format=yuv420pr/   ú-yz-loopÚ1ú-iz-vfz-tz-rú-pix_fmtÚyuv420pT©ÚcheckÚcapture_output)r   r   rU   ÚgetÚreplacer)   Ú
subprocessÚrun)r   ÚimageÚoutrA   rB   rC   rD   rE   Úframes_nÚzÚxÚyÚsafeÚdrawÚalphaÚfontsizeÚvfÚcmdr   r   r    rX   g   s@   $ÿÿÿþþþþþýÿ
ýzVideoDirector._animate_clipÚclipsr~   r`   úlist[float]ÚNonec                 C  s¶  t |ƒdkrt |d |¡ d S d}g }|D ]}| dt|ƒg¡ qg }d}|d | }	t t |ƒd ¡}
tdt |ƒƒD ]A}|t |ƒd k rLd|› d�nd	}|
 | j	¡}| 
|› d
|› d|› d|› dtd|	ƒd›|› �
¡ |}|t |ƒk r}|	|| | 7 }	q<d |¡}ddg|¢d‘|‘d‘d	‘d‘d‘t|ƒ‘}ztj|ddd� W d S  tjyÚ   |jd }|jd dd„ |D ƒ¡dd� tjdddd d!d"dt|ƒd#d$t|ƒgddd� Y d S w )%Nr4   r   gš™™™™™Ù?rs   z[0:v]é   z[vú]z[vout]ú[z:v]xfade=transition=z
:duration=z:offset=gš™™™™™¹?z.3fú;r/   rq   z-filter_complexz-maprt   ru   Trv   zfallback.txtÚ
c                 s  s    � | ]}d |  ¡ › d�V  qdS )zfile 'rl   N)Úresolve)r6   Úcr   r   r    Ú	<genexpr>�   s   € z2VideoDirector._crossfade_concat.<locals>.<genexpr>zutf-8)Úencodingz-fÚconcatz-safeÚ0z-crK   )rP   rH   rK   Úextendr)   ÚrandomÚRandomrQ   ÚchoiceÚTRANSITIONSrR   r   Újoinr{   r|   ÚCalledProcessErrorrL   Ú
write_text)r   r‰   r~   r`   r   Úinputsr’   Úfilter_partsÚprevÚoffsetÚrngrb   Ú	out_labelÚ
transitionÚfiltrˆ   Úlstr   r   r    rY   ‚   sD    *ÿ€
,
 ýýzVideoDirector._crossfade_concatÚpathrA   ÚfloatrF   c                 C  s6  d}t || ƒ}|dkrg d¢}d}d}n/|dv r"g d¢}d}d	}n"|d
kr/g d¢}d}d}n|dkr<g d¢}d}d}ng d¢}d}d}tƒ }	t|ƒD ]�}
|
| }td|d ƒtd|| d ƒ }ddtt dtj | | ¡ƒ  }d}|| d d	k r‹dt dtj d | ¡ }d}t|ƒD ]\}}|t dtj | | ¡d|d   7 }q‘|t	|ƒ }||t dtj d | ¡ t
 
¡  7 }|d | | ||  }td td!t |d! ƒƒƒ}|	t |ƒjdd"d#d$�7 }	qKt t|ƒd%¡�}| d¡ | d¡ | |¡ | t|	ƒ¡ W d&  ƒ d&S 1 �sw   Y  d&S )'z@Layered ambient bed + soft rhythmic pulses (royalty-free synth).iD¬  r   )éb   é“   éÜ   i7  g      @g{®Gáz¤?>   r<   Úproduct_reveal)gR¸…ëY`@ç     €h@g®GázZp@g®Gázšt@g      @g{®Gáz”?r=   )én   é¥   r¬   r5   g¸…ëQ¸Ž?Údata_motion)çÃõ(\�Zb@r¬   gÃõ(\�Zr@g      @gš™™™™™™?)g     €X@r²   r®   g®GázÞn@gš™™™™™@g;ßO�—n’?g      ð?é   g      à?r;   g        g¸…ëQ¸¾?i  gÍÌÌÌÌÌì?r4   é(   g{®GázÄ?i€ÿÿiÿ  ÚlittleT)ÚsignedÚwN)r   Ú	bytearrayrQ   ÚminÚabsÚmathÚsinÚpirW   rP   r˜   r   Úto_bytesÚwaveÚopenr)   ÚsetnchannelsÚsetsampwidthÚsetframerateÚwriteframesÚbytes)r   r¨   rA   rF   Úrater_   ÚfreqsÚpulseÚnoiseÚsamplesrb   ÚtÚenvÚ	pulse_envÚclickÚvalÚjÚfÚsÚwfr   r   r    rZ   ¤   sV    $*(


$üzVideoDirector._generate_scoreÚvideoÚaudioc                 C  s@   dddt |ƒdt |ƒdddddd	d
t |ƒg}tj|ddd� d S )Nr/   rq   rs   z-c:vrK   z-c:aÚaacz	-shortestz	-movflagsz
+faststartTrv   )r)   r{   r|   )r   rÔ   rÕ   r~   rˆ   r   r   r    r\   Õ   s   ø
zVideoDirector._mux_audio)r   F)r   r   r   r   )r"   NN)r#   r$   r%   r&   r'   r   r(   r)   r*   r+   r,   r-   r.   r   )r‰   r$   r~   r   r`   rŠ   r.   r‹   )r"   )r¨   r   rA   r©   rF   r)   r.   r‹   )rÔ   r   rÕ   r   r~   r   r.   r‹   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rU   r›   r!   rj   rX   rY   rZ   r\   r   r   r   r    r      s(    ù
	ùI
"1r   )
Ú
__future__r   r»   r˜   rH   r{   r¿   Úpathlibr   r   r   r   r   r    Ú<module>   s    