Ë
    q›Xj#  ã                  óX   — 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«      Z	y)é    )ÚannotationsN)ÚPathc                  ó|   — e Zd ZdZdddddddd	œZd
Zddd„Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zd„ Zdd„Z	ddd„Z
dd„Zy)Ú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Úhblurc                ó4   — t        d|«      | _        || _        y )Né   )ÚmaxÚmax_secondsÚenable_audio)Úselfr   r   s      ú8/var/www/html/content_generation/src/generators/video.pyÚ__init__zVideoDirector.__init__   s   € Ü˜r ;Ó/ˆÔØ(ˆÕó    Nc           
     óì  — |st        d«      ‚t        j                  d«      s,|j                  d«      }t        j                  |d   |«       |S |j
                  j                  dd¬«       |j
                  dz  }|j                  «       rt        j                  |d¬«       |j                  d¬	«       t        |«      }	|rt        |«      |	k(  r|}
n¾| j                  t        d
|	«      z  }g }
t        |	«      D ]k  }|dk(  r|
j                  t        d|dz  «      «       Œ'||	d
z
  k(  r|
j                  t        d|dz  «      «       ŒN|
j                  t        d|dz  «      «       Œm t        |
«      }|
D �cg c]  }|| j                  |z  z  ‘Œ }
}d}g }t        | j                   j#                  «       «      }t%        |«      D ]´  \  }}|r|t        |«      k  r||   nd xs ||t        |«      z     }|dk(  r|dz  dk(  rdnd}n(|dk(  r|dz  dk(  rdnd}n|dk(  rd}n|dk(  r	|dz  rdnd}|t        |«      k  r||   nd}|d|d›d�z  }| j'                  |||
|   ||||¬«       |j                  |«       Œ¶ |d z  }| j)                  |||
«       |d!z  }| j+                  || j                  dz   |¬"«       t-        | d#d$«      r| j/                  |||«       |S dd l}|j	                  ||«       |S c c}w )%NzNo frames for videoÚffmpegz.pngr   T)ÚparentsÚexist_okÚ_video_work)Úignore_errors)r%   é   g       @gffffffæ?ç      @g333333ë?g      @gffffffò?é   r   é   r   Úkineticr
   r   Ú	broadcastr   r   Ú Úclip_Ú02dz.mp4)ÚdurationÚfpsÚmotionÚcaptionÚ
beat_indexz
merged.mp4z	score.wav)r1   Ú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   ÚframesÚcaptionsÚout_pathÚmotion_styleÚmotionsÚ	durationsÚstillÚworkÚnÚpersÚbaseÚiÚtotalÚpr2   Ú
clip_pathsÚmotion_cycleÚframer3   r4   ÚclipÚmergedÚmusicÚ_shs                            r   ÚbuildzVideoDirector.build   sú  € ñ ÜÐ4Ó5Ð5Ü�|‰|˜HÔ%Ø×(Ñ(¨Ó0ˆEÜ�K‰K˜˜q™	 5Ô)ØˆLà�‰×Ñ d°TÐÔ:Ø�‰ Ñ.ˆØ�;‰;Œ=Ü�M‰M˜$¨dÕ3Ø�
‰
˜Dˆ
Ô!ä�‹KˆÙœ˜Y›¨1Ò,Ø‰Dà×#Ñ#¤c¨!¨Q£iÑ/ˆDàˆDÜ˜1–X�Ø˜’6Ø—K‘K¤ C¨°©Ó 4Õ5Ø˜!˜a™%’ZØ—K‘K¤ C¨°©Ó 5Õ6à—K‘K¤ C¨°©Ó 5Õ6ð ô ˜“IˆEÙ<@ÓA¹D°q�A˜×)Ñ)¨EÑ1Ó2¸DˆDÐAàˆØ!#ˆ
Ü˜DŸK™K×,Ñ,Ó.Ó/ˆÜ! &Ö)‰HˆAˆuÙ$+°´C¸³LÒ0@�g˜a’jÀdÒrÈ|Ð\]Ô`cÐdpÓ`qÑ\qÑOrˆFØ˜xÒ'Ø%&¨¡U¨a¢Z™°Z‘Ø Ò*Ø'(¨1¡u°¢z™°y‘Ø Ò+Ø#‘Ø Ò,Ø()¨Aª™°:�Ø%&¬¨X«Ò%6�h˜q’k¸BˆGØ˜E ! C ¨Ð-Ñ-ˆDØ×Ñ˜u d°T¸!±WÀ#ÈfÐ^eÐrsÐÔtØ×Ñ˜dÕ#ð *ð ˜Ñ$ˆØ×Ñ˜z¨6°4Ô8à�{Ñ"ˆØ×Ñ˜U¨T×-=Ñ-=ÀÑ-AÈÐÔVô �4˜¨Ô/Ø�O‰O˜F E¨8Ô4ð ˆó !Ø�H‰H�V˜XÔ&ØˆùòC Bs   Å5K1c               óþ  — t        dt        ||z  «      «      }| j                  j                  || j                  d   «      \  }	}
}|j	                  dd«      j	                  dd«      j	                  dd«      d d }d}|r|d	k(  rd
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"¬#«       y )$Nr(   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   ÚintrE   ÚgetÚreplaceÚstrÚ
subprocessÚrun)r   ÚimageÚoutr1   r2   r3   r4   r5   Úframes_nÚzÚxÚyÚsafeÚdrawÚalphaÚfontsizeÚvfÚcmds                     r   rH   zVideoDirector._animate_clipg   s:  € Ü�qœ#˜h¨™nÓ-Ó.ˆØ—+‘+—/‘/ &¨$¯+©+°iÑ*@ÓA‰ˆˆ1ˆaØ�‰˜s EÓ*×2Ñ2°3¸Ó;×CÑCÀCÈÓLÈSÈbÐQˆØˆÙà(¨Ašo‘F°5ˆEØ'¨1š_‘r°"ˆHàCÀEÀ7ð K#Ø#' &Ð(CÀHÀ:ð N)ð*ð ðà˜˜E !  E¨!¨¨D°°
Ð:KÈCÈ5ð QØ!˜Fð$ð 	ð �d˜G S¨$´°E³
Ø�2�tœS ›]¨D´#°c³(Ø˜	¤3 s£8ð
ˆô
 	�‰�s $°tÖ<r!   c                óÂ  — t        |«      dk(  rt        j                  |d   |«       y d}g }|D ]  }|j                  dt	        |«      g«       Œ  g }d}|d   |z
  }	t        j                  t        |«      dz  «      }
t        dt        |«      «      D ]~  }|t        |«      dz
  k  rd|› d�nd	}|
j                  | j                  «      }|j                  |› d
|› d|› d|› dt        d|	«      d›|› �
«       |}|t        |«      k  sŒt|	||   |z
  z  }	Œ€ dj                  |«      }ddg|¢d‘|‘d‘d	‘d‘d‘t	        |«      ‘}	 t        j                  |dd¬«       y # t        j                  $ rp |j                   dz  }|j#                  dj                  d„ |D «       «      d¬«       t        j                  ddddd d!dt	        |«      d"d#t	        |«      gdd¬«       Y y w xY w)$Nr(   r   gš™™™™™Ù?rl   z[0:v]é   z[vÚ]z[vout]Ú[z:v]xfade=transition=z
:duration=z:offset=gš™™™™™¹?z.3fÚ;r#   rj   z-filter_complexz-maprm   rn   Tro   zfallback.txtÚ
c              3  óD   K  — | ]  }d |j                  «       › d�–— Œ y­w)zfile 're   N)Úresolve)Ú.0Úcs     r   Ú	<genexpr>z2VideoDirector._crossfade_concat.<locals>.<genexpr>�   s    è ø€ Ð$LÁeÀ v¨a¯i©i«k¨]¸!Ô%<Áeùs   ‚ zutf-8)Úencodingz-fÚconcatz-safeÚ0z-cr;   )r@   r8   r;   Úextendru   ÚrandomÚRandomrA   ÚchoiceÚTRANSITIONSrB   r   Újoinrv   rw   ÚCalledProcessErrorr<   Ú
write_text)r   Úclipsry   rV   r   Úinputsr�   Úfilter_partsÚprevÚoffsetÚrngrX   Ú	out_labelÚ
transitionÚfiltrƒ   Úlsts                    r   rI   zVideoDirector._crossfade_concat‚   s  € Üˆu‹:˜Š?Ü�K‰K˜˜a™ #Ô&ØØˆØˆÛˆAØ�M‰M˜4¤ Q£˜.Õ)ð àˆØˆØ�a‘˜4‘ˆÜ�m‰mœC ›J¨™OÓ,ˆÜ�qœ#˜e›*Ö%ˆAØ%&¬¨U«°a©Ò%7˜"˜Q˜C˜q™	¸XˆIØŸ™ D×$4Ñ$4Ó5ˆJØ×ÑØ�&˜˜!˜Ð0°°¸JÀtÀfÈHÔUXÐY\Ð^dÓUeÐfiÐTjÐktÐjuÐvôð ˆDØ”3�t“9‹}Ø˜$˜q™' D™.Ñ(‘ð &ð �x‰x˜Ó%ˆØ˜Ðs ÐsÐ(9Ðs¸4ÐsÀÐsÈÐsÐS]ÐsÐ_hÐsÔjmÐnqÓjrÐsˆð		Ü�N‰N˜3 d¸4Ö@øÜ×,Ñ,ò 	Ø—*‘*˜~Ñ-ˆCØ�N‰N˜4Ÿ9™9Ñ$LÁeÓ$LÓLÐW^ˆNÔ_Ü�N‰NØ˜4  x°¸#¸tÄSÈÃXÈtÐU[Ô]`ÐadÓ]eÐfØØ#÷ð	ús   ÅE ÅB GÇGc                ó  — d}t        ||z  «      }|dk(  r	g d¢}d}d}n1|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 �]–  }
|
|z  }t        d|dz  «      t        d||z
  dz  «      z  }ddt	        t        j                  dt
        j                  z  |z  |z  «      «      z  z   }d}||z  dz  d	k  r/dt        j                  dt
        j                  z  dz  |z  «      z  }d}t        |«      D ]=  \  }}|t        j                  dt
        j                  z  |z  |z  «      d|dz   z  z  z  }Œ? |t        |«      z  }||t        j                  dt
        j                  z  dz  |z  «      z  t        j                  «       z  z  }|dz  |z  |z  ||z  z   }t        d t        d!t        |d!z  «      «      «      }|	t        |«      j                  dd"d#¬$«      z  }	�Œ™ t        j                  t        |«      d%«      5 }|j!                  d«       |j#                  d«       |j%                  |«       |j'                  t)        |	«      «       d&d&d&«       y&# 1 sw Y   y&xY w)'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§   r)   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ÍÌÌÌÌÌì?r(   é(   g{®GázÄ?i€ÿÿiÿ  ÚlittleT)ÚsignedÚwN)rr   Ú	bytearrayrA   ÚminÚabsÚmathÚsinÚpirG   r@   r“   r   Úto_bytesÚwaveÚopenru   ÚsetnchannelsÚsetsampwidthÚsetframerateÚwriteframesÚbytes)r   Úpathr1   r6   ÚraterU   ÚfreqsÚpulseÚnoiseÚsamplesrX   ÚtÚenvÚ	pulse_envÚclickÚvalÚjÚfÚsÚwfs                       r   rJ   zVideoDirector._generate_score¤   sd  € àˆÜ��x‘Ó ˆØ�HÒÚ'ˆEØˆEØ‰EØÐ3Ñ3Ú3ˆEØˆEØ‰EØ�kÒ!Ú#ˆEØˆEØ‰EØ�mÒ#Ú)ˆEØˆEØ‰Eâ1ˆEØˆEØˆEä“+ˆÜ�q—ˆAØ�D‘ˆAÜ�c˜1˜q™5“/¤C¨¨h¸©l¸cÑ-AÓ$BÑBˆCØ˜c¤C¬¯©°´T·W±W±¸uÑ1DÀqÑ1HÓ(IÓ$JÑJÑJˆIàˆEØ�E‘	˜SÑ  4Ò'ØœtŸx™x¨¬D¯G©G©°dÑ(:¸QÑ(>Ó?Ñ?�ØˆCÜ! %Ö(‘��1Ø”t—x‘x ¤D§G¡G¡¨a¡°!Ñ 3Ó4¸¸qÀ1¹u¹ÑFÑF‘ð )àœ˜E›
Ñ"ˆCØ�5œ4Ÿ8™8 A¬¯©¡K°"Ñ$4°qÑ$8Ó9Ñ9¼F¿M¹M»OÑKÑKˆCØ˜‘: Ñ# iÑ/°5¸3±;Ñ>ˆCÜ�FœC ¤s¨3°©;Ó'7Ó8Ó9ˆAØ”s˜1“v—‘ q¨(¸4�Ó@Ñ@ŠGð ô" �Y‰Y”s˜4“y #Ô&¨"Ø�O‰O˜AÔØ�O‰O˜AÔØ�O‰O˜DÔ!Ø�N‰Nœ5 ›>Ô*÷	 '×&Ñ&ús   ÈAI5É5I>c                óŠ   — dddt        |«      dt        |«      dddddd	d
t        |«      g}t        j                  |dd¬«       y )Nr#   rj   rl   z-c:vr;   z-c:aÚaacz	-shortestz	-movflagsz
+faststartTro   )ru   rv   rw   )r   ÚvideoÚaudiory   rƒ   s        r   rL   zVideoDirector._mux_audioÕ   sK   € à�dØ”#�e“*Ø”#�e“*Ø�FØ�EØØ˜Ü�‹Hð	
ˆô 	�‰�s $°tÖ<r!   )r*   F)r   rr   r   Úbool)Ú	cinematicNN)rM   ú
list[Path]rN   z	list[str]rO   r   rP   ru   rQ   zlist[str] | NonerR   zlist[float] | NoneÚreturnr   )rš   rÖ   ry   r   rV   zlist[float]r×   ÚNone)rÕ   )rÁ   r   r1   Úfloatr6   ru   r×   rØ   )rÒ   r   rÓ   r   ry   r   r×   rØ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rE   r–   r    rb   rH   rI   rJ   rL   © r!   r   r   r      s¤   „ ÙNð TØeØUØYØ^Ø[Ø[ñ€Fð o€Kô)ð (Ø$(Ø(,ðGàðGð ðGð ð	Gð
 ðGð "ðGð &ðGð 
óGòR=ó6 ôD/+ôb=r!   r   )
Ú
__future__r   r¶   r“   r8   rv   rº   Úpathlibr   r   rÞ   r!   r   Ú<module>rá      s&   ðÝ "ã Û Û Û Û Ý ÷U=ò U=r!   