§
    ‰¤Äj^+  ã                   óV  — d 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	 ej
                             d¦  «        rC	 ej                             d¬¦  «         ej                             d¬¦  «         n# e$ r Y nw xY wdZg d¢Zd	ed
efd„ZdAdededefd„ZdBdededefd„ZdCdedededefd„Z	 	 	 	 dDdedededed ed!ed"ed#efd$„Z	 	 	 	 dEd&ed'ededed#ef
d(„Zed)k    �rC ej        d*¬+¦  «        Ze                     d,d-¬.¦  «         e                     d/d%d0¬1¦  «         e                     d2edd3¬4¦  «         e                     d5ed6d7¬4¦  «         e                     d8edd9¬4¦  «         e                     d:d;d<¬=¦  «         e                      ¦   «         Z!e!j"        �Z e	e!j#        ¦  «         e	e!j$        ¦  «        j%        › d>�z  Z& ee!j$         ee&¦  «        e!j"        e!j'        dde!j(        ¬?¦  «         dS  ee!j$        e!j#        e!j)        e!j'        e!j(        ¬@¦  «         dS dS )FzÑ
Automated AI 4K Shorts Generator for Historical Marketing
Extracts high-intensity, dramatic segments from documentary episodes,
converts to vertical 9:16 (1080x1920 / 2160x3840), and applies AI 4K Upscaling.
é    N)ÚPathÚwinúutf-8)Úencodingz.C:\Projects\Historical\venv\Scripts\ffmpeg.exe)'ÚwarÚbattleÚinvadeÚinvasionÚfleetÚarmyÚsoldierÚgeneralÚfireÚdestroyÚdisasterÚambushÚstrikeÚattackÚbloodÚkillÚdeadÚdeathÚdefeatÚvictoryÚtigerÚfuryÚtrapÚprinceu   quÃ¢nu   chiáº¿nu   thuyá»�nu   giáº·cu   Ä‘Ã¡nhu   chÃ©mu   giáº¿tu   phÃ¡ou   chÃ¡yu   há»�au   tÆ°á»›ngu   Ä‘áº¡i báº¡iu
   mai phá»¥cu	   tÃ n sÃ¡tu   xÃ¢m lÆ°á»£cÚtime_strÚreturnc                 óæ   — |                       dd¦  «        } |                      d¦  «        }t          |d         ¦  «        dz  t          |d         ¦  «        dz  z   t          |d         ¦  «        z   S )	Nú,ú.ú:r   i  é   é<   é   )ÚreplaceÚsplitÚfloat)r   Úpartss     ú&C:\Projects\Historical\shorts_maker.pyÚparse_srt_timer-   #   s`   € Ø×Ò  SÑ)Ô)€HØ�NŠN˜3ÑÔ€EÝ��q”‰?Œ?˜TÑ!¥E¨%°¬(¡O¤O°bÑ$8Ñ8½5ÀÀqÄ¹?¼?ÑJÐJó    ç      D@ç      $@Úsrt_pathÚtarget_durationÚstepc                 ó  — t           j                             | ¦  «        sg S t          | ddd¬¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   t          j        d|                     ¦   «         ¦  «        }g }|D ]ö}|                     ¦   «                              ¦   «         }t          |¦  «        dk    r»d|d         v r±|d                              d¦  «        }	t          |	d	                              ¦   «         ¦  «        }
t          |	d                              ¦   «         ¦  «        }d
                     |dd …         ¦  «                             ¦   «         }|                     |
||dœ¦  «         Œ÷|sg S |d         d         }g }d}||z   |k    rÓ||z   }d	}g }|D ]g}|d         |k    rY|d         |k    rM|d                              ¦   «         }|                     |d         ¦  «         t          D ]}||v r|dz  }Œ|dz  }Œh|                     t          |d¦  «        t          |d¦  «        ||d
                     |d d…         ¦  «        dœ¦  «         ||z  }||z   |k    °Ó|                     d„ d¬¦  «         |S )NÚrr   Úignore)r   Úerrorsz\n\s*\né   z-->r%   r   ú r'   )ÚstartÚendÚtextéÿÿÿÿr;   g        r:   r<   )r:   r;   ÚdurationÚscoreÚsample_textc                 ó   — | d         S )Nr?   © )Úxs    r,   ú<lambda>z$score_srt_segments.<locals>.<lambda>Z   s
   € ˜q œz€ r.   T)ÚkeyÚreverse)ÚosÚpathÚexistsÚopenÚreadÚrer)   ÚstripÚ
splitlinesÚlenr-   ÚjoinÚappendÚlowerÚINTENSITY_KEYWORDSÚroundÚsort)r1   r2   r3   ÚfÚcontentÚblocksÚ	subtitlesÚbÚlinesÚtimesr:   r;   r<   Úmax_timeÚwindowsÚ
curr_startÚcurr_endr?   Úwindow_textsÚsubÚtxtÚkws                         r,   Úscore_srt_segmentsre   (   sî  € ÝŒ7�>Š>˜(Ñ#Ô#ð Øˆ	å	ˆh˜ g°hÐ	?Ñ	?Ô	?ð À1Ø—&’&‘(”(ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ ŒX�j '§-¢-¡/¤/Ñ2Ô2€FØ€Iàð Ið IˆØ—’‘	”	×$Ò$Ñ&Ô&ˆÝˆu‰:Œ:˜Š?ˆ?˜u¨¨a¬Ð0Ð0Ø˜!”H—N’N 5Ñ)Ô)ˆEÝ" 5¨¤8§>¢>Ñ#3Ô#3Ñ4Ô4ˆEÝ   q¤§¢Ñ!1Ô!1Ñ2Ô2ˆCØ—8’8˜E ! " "œIÑ&Ô&×,Ò,Ñ.Ô.ˆDØ×Ò u°SÀ$ÐGÐGÑHÔHÐHøàð Øˆ	à˜Œ}˜UÔ#€HØ€GØ€Jà
�Ñ
&¨(Ò
2Ð
2Ø Ñ/ˆØˆØˆàð 	ð 	ˆCØ�5Œz˜ZÒ'Ð'¨C°¬L¸HÒ,DÐ,DØ˜&”k×'Ò'Ñ)Ô)�Ø×#Ò# C¨¤KÑ0Ô0Ð0Ý,ð #ð #�BØ˜S�y�yØ ™
˜øà˜‘
�øà�ŠÝ˜: qÑ)Ô)Ý˜ 1Ñ%Ô%Ø'ØØŸ8š8 L°°!°Ô$4Ñ5Ô5ð
ð 
ñ 	ô 	ð 	ð 	�dÑˆ
ð- �Ñ
&¨(Ò
2Ð
2ð0 ‡L‚LÐ)Ð)°4€LÑ8Ô8Ð8Ø€Ns   µAÁAÁAç      .@Ú
video_pathc                 ó†   — t           d| dddddg}t          j        |t          j        dd¬	¦  «        }d
|ddœd|ddœd|ddœgS )uZ   Fallback: PhÃ¡t hiá»‡n cÃ¡c Ä‘oáº¡n cÃ³ Ã¢m lÆ°á»£ng / tiáº¿t táº¥u cao nháº¥t qua FFmpeg.ú-iz-afzebur128=metadata=1z-fÚnullú-Tr6   )Ústderrr<   r7   rf   é
   )r:   r>   r?   g      N@é   g      ^@é   )Ú
FFMPEG_EXEÚ
subprocessÚrunÚPIPE)rg   r2   r3   ÚcmdÚress        r,   Údetect_audio_energyrv   ]   sn   € õ 	�D˜*ØÐ#Øˆf�cð€Cõ
 Œ.˜¥Z¤_¸4ÈÐ
QÑ
QÔ
Q€Cð  O¸bÐAÐAØ O¸aÐ@Ð@Ø _¸qÐAÐAðð r.   r'   Úcountr>   c                 óJ  ‡‡— g }|r�t           j                             |¦  «        rbt          |‰¬¦  «        }g }|D ]JŠt	          ˆˆfd„|D ¦   «         ¦  «        }|s|                     ‰¦  «         t          |¦  «        |k    r nŒK|}|st          | ‰¬¦  «        d |…         }|S )N)r2   c              3   ób   •K  — | ])}t          ‰d          |d          z
  ¦  «        ‰dz  k     V — Œ*dS )r:   gffffffæ?N)Úabs)Ú.0Úsr>   Úws     €€r,   ú	<genexpr>z$get_best_segments.<locals>.<genexpr>t   sB   øè è € Ð_Ð_ÐQR�S  7¤¨a°¬jÑ!8Ñ9Ô9¸XÈ¹^ÒLÐ_Ð_Ð_Ð_Ð_Ð_r.   )rG   rH   rI   re   ÚanyrQ   rO   rv   )	rg   r1   rw   r>   Úsegmentsr^   ÚselectedÚ
is_overlapr}   s	      `    @r,   Úget_best_segmentsrƒ   m   sÕ   øø€ Ø€HØð 
•B”G—N’N 8Ñ,Ô,ð 
Ý$ X¸xÐHÑHÔHˆØˆØð 	ð 	ˆAåÐ_Ð_Ð_Ð_Ð_ÐV^Ð_Ñ_Ô_Ñ_Ô_ˆJØð #Ø—’ Ñ"Ô"Ð"Ý�8‰}Œ} Ò%Ð%Ø�ð &àˆàð UÝ& zÀ8ÐLÑLÔLÈVÈeÈVÔTˆà€Or.   ÚblurÚ	1080x1920FÚinput_videoÚoutput_videoÚ	start_secÚduration_secÚlayoutÚ
resolutionÚbadge_titleÚupscalec                 óŒ  — t          |¦  «                             ¦   «         }|j                             dd¬¦  «         t	          t
          |                     d¦  «        ¦  «        \  }	}
|j        dt          t          j        ¦   «         ¦  «        › d�z  }t          d¦  «         t          d¦  «         t          dt          | ¦  «        j	        › �¦  «         t          d	|› d
||z   › d|› d�¦  «         t          d|› d|› d�¦  «         t          d¦  «         t          ddt          |¦  «        dt          |¦  «        d| ddddt          |¦  «        g}t          j        |dt          j        t          j        ¬¦  «         t          |¦  «        }d }|rzt          d¦  «         ddlm} |j        dt          t          j        ¦   «         ¦  «        › d�z  } |t          |¦  «        t          |¦  «        ddd¬ ¦  «         t          |¦  «        }t          d!|› d"�¦  «         |d#k    r	d$|	› d%|
› �}nd&|	› d%|
› d'|	› d%|
› d(|	› d)�}t          dd|d*|d+|d,k    rd-nd.d+d/dd0d1d2d3d4d5d6d7d8dd9d:d;t          |¦  «        g}t          j        |dt          j        t          j        ¬¦  «         |                     ¦   «         r|                     d¬<¦  «         |r*|                     ¦   «         r|                     d¬<¦  «         t'          |                     ¦   «         j        d=z  d>¦  «        }t          d?|› d@|› dA�¦  «         t          |¦  «        S )BNT©ÚparentsÚexist_okrC   Ú_temp_clip_ú.mp4z3
==================================================u(   Báº®T Ä�áº¦U Táº O SHORTS MARKETING 9:16u   Nguá»“n:     u   Ä�oáº¡n cáº¯t:  zs -> zs (zs)u   Ä�á»™ phÃ¢n giáº£i: z
 (Layout: ú)z2==================================================z-yz-ssz-tri   z-c:vÚcopyz-c:a)ÚcheckÚstdoutrl   uI   [AI] Ä�ang cháº¡y Real-ESRGAN NCNN Vulkan upscale 4K cho Ä‘oáº¡n Short...r   )Úupscale_videoÚ_temp_upscaled_é   zrealesrgan-x4plusÚ	3840x2160)r†   r‡   Ú	tile_sizeÚ
model_nameÚ
target_resu-   [Render] Ä�ang táº¡o khung hÃ¬nh dá»�c 9:16 (u   ) vá»›i NVIDIA NVENC...Úcropzcrop=ih*9/16:ih,scale=r$   z[0:v]scale=z+:force_original_aspect_ratio=increase,crop=z,boxblur=25:5[bg];[0:v]scale=z*:-1[fg];[bg][fg]overlay=(W-w)/2:(H-h)/2[v]z-filter_complexz-mapr„   z[v]z0:vz0:a?Ú
h264_nvencz-presetÚp6z-rc:vÚvbrz-cq:vÚ19z-b:vÚ0Úaacz-b:aÚ192k)Ú
missing_oki   r'   u!   THÃ€NH CÃ”NG! Ä�Ã£ táº¡o Shorts: z (z MB))r   ÚresolveÚparentÚmkdirÚmapÚintr)   ÚtimeÚprintÚnamerp   Ústrrq   rr   ÚDEVNULLÚvideo_upscalerr˜   rI   ÚunlinkrT   ÚstatÚst_size)r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   Úout_pathÚw_targetÚh_targetÚ	temp_clipÚcut_cmdÚsource_for_shortsÚupscaled_clipr˜   Ú
filter_strÚ
render_cmdÚsize_mbs                      r,   Úcreate_short_videorÀ   €   sÝ  € õ �LÑ!Ô!×)Ò)Ñ+Ô+€HØ„O×Ò $°ÐÑ6Ô6Ð6Ý�S *×"2Ò"2°3Ñ"7Ô"7Ñ8Ô8Ñ€Hˆhà”Ð"FµµD´I±K´KÑ0@Ô0@Ð"FÐ"FÐ"FÑF€Iå	Ð
AÑBÔBÐBÝ	Ð
5Ñ6Ô6Ð6Ý	Ð
2�$˜{Ñ+Ô+Ô0Ð
2Ð
2Ñ3Ô3Ð3Ý	Ð
Z˜YÐ
ZÐ
Z¨Y¸Ñ-EÐ
ZÐ
ZÈ,Ð
ZÐ
ZÐ
ZÑ[Ô[Ð[Ý	Ð
@ Ð
@Ð
@°vÐ
@Ð
@Ð
@ÑAÔAÐAÝ	Ð
?Ñ@Ô@Ð@õ 	�DØ�s�9‰~Œ~Ø�c�,ÑÔØˆkØ�Ø�ÝˆI‰Œð€Gõ „N�7 $­zÔ/AÍ*ÔJ\Ð]Ñ]Ô]Ð]å˜I™œÐð €MØð /ÝÐYÑZÔZÐZØ0Ð0Ð0Ð0Ð0Ð0Ø œÐ*R½CÅÄ	ÁÄÑ<LÔ<LÐ*RÐ*RÐ*RÑRˆØˆÝ˜I™œÝ˜]Ñ+Ô+ØØ*Ø"ð	
ñ 	
ô 	
ð 	
õ   Ñ.Ô.Ðõ 
Ð
]¸*Ð
]Ð
]Ð
]Ñ^Ô^Ð^Ø�ÒÐØC¨hÐCÐC¸ÐCÐCˆ
ˆ
ð2˜(ð 2ð 2 Xð 2ð 2Øð2ð 2Ø'ð2ð 2à"ð2ð 2ð 2ð 	õ 	�DØÐØ˜:Ø˜ 6Ò)Ð)��¨uØ�Ø�Ø�4Ø�Ø�Ø�Ø�Ø�ÝˆH‰Œð€Jõ  „N�: Tµ*Ô2DÍZÔM_Ð`Ñ`Ô`Ð`ð ×ÒÑÔð *Ø×Ò DÐÑ)Ô)Ð)Øð .˜×-Ò-Ñ/Ô/ð .Ø×Ò¨ÐÑ-Ô-Ð-å�H—M’M‘O”OÔ+¨{Ñ;¸QÑ?Ô?€GÝ	Ð
G¨hÐ
GÐ
G¸'Ð
GÐ
GÐ
GÑHÔHÐHÝˆx‰=Œ=Ðr.   úcontent/shortsÚepisode_pathÚ
output_dirc                 ó.  — t          | ¦  «                             ¦   «         }t          |¦  «                             ¦   «         }|                     dd¬¦  «         |j        |j        › d�z  |j        |j        › d�z  t          d¦  «        |j        z  |j        › d�z  g}d }|D ]'}	|	                     ¦   «         rt          |	¦  «        } nŒ(t          d|j        › �¦  «         |r%t          dt          |¦  «        j        › �¦  «         nt          d¦  «         t          t          |¦  «        |||¬	¦  «        }
g }t          |
d
¬¦  «        D ]É\  }}|j        › d|› d�}||z  }t          d|› d|d         › d|d         › d|                     dd¦  «        › d�	¦  «         d|v r!|d         rt          d|d         › d�¦  «         t          t          |¦  «        t          |¦  «        |d         |d         dd|¬¦  «        }|                     |¦  «         ŒÊ|S )NTr�   z_en.srtz.srtzcontent/subtitlesu   
PhÃ¢n tÃ­ch ká»‹ch tÃ­nh cho: u%   Sá»­ dá»¥ng phá»¥ Ä‘á»� phÃ¢n tÃ­ch: uY   KhÃ´ng tÃ¬m tháº¥y srt, sá»­ dá»¥ng thuáº­t toÃ¡n phÃ¢n tÃ­ch nÄƒng lÆ°á»£ng Ã¢m thanh...)r1   rw   r>   r%   )r:   Ú_short_r“   z
--- [Short #u   ] Báº¯t Ä‘áº§u lÃºc r:   u   s (Thá»�i lÆ°á»£ng: r>   u   s, Ä�iá»ƒm ká»‹ch tÃ­nh: r?   r   z) ---r@   u   Ná»™i dung thoáº¡i: "z..."r„   r…   ©r†   r‡   rˆ   r‰   rŠ   r‹   r�   )r   r¨   rª   r©   ÚstemrI   r°   r®   r¯   rƒ   Ú	enumerateÚgetrÀ   rQ   )rÂ   rÃ   rw   r>   r�   Úep_pathÚout_dirÚsrt_candidatesÚsrt_fileÚcandÚbest_segmentsÚ	generatedÚidxÚsegÚout_nameÚout_fileÚcreateds                    r,   Ú auto_generate_shorts_for_episoderÖ   Ü   sº  € õ �<Ñ Ô ×(Ò(Ñ*Ô*€GÝ�:ÑÔ×&Ò&Ñ(Ô(€GØ‡M‚M˜$¨€MÑ.Ô.Ð.ð 	Œ˜GœLÐ1Ð1Ð1Ñ1ØŒ˜GœLÐ.Ð.Ð.Ñ.ÝÐ Ñ!Ô! G¤LÑ0°g´lÐ3KÐ3KÐ3KÑKð€Nð
 €HØð ð ˆØ�;Š;‰=Œ=ð 	Ý˜4‘y”yˆHØˆEð	õ 
Ð
;¨W¬\Ð
;Ð
;Ñ<Ô<Ð<Øð kÝÐKµd¸8±n´nÔ6IÐKÐKÑLÔLÐLÐLåÐiÑjÔjÐjå%¥c¨'¡l¤l¸XÈUÐ]eÐfÑfÔf€MØ€Iå˜m°1Ð5Ñ5Ô5ð "ð "‰ˆˆSØ”lÐ4Ð4¨3Ð4Ð4Ð4ˆØ˜XÑ%ˆÝð  _˜sð  _ð  _¸¸G¼ð  _ð  _ÐZ]Ð^hÔZið  _ð  _ð  EH÷  ELò  ELð  MTð  VWñ  EXô  EXð  _ð  _ð  _ñ  	`ô  	`ð  	`Ø˜CÐÐ C¨Ô$6ÐÝÐD¨3¨}Ô+=ÐDÐDÐDÑEÔEÐEå$Ý˜G™œÝ˜X™œØ˜'”lØ˜ZœØØ"Øð
ñ 
ô 
ˆð 	×Ò˜Ñ!Ô!Ð!Ð!àÐr.   Ú__main__z+AI 4K Shorts Generator for Historical Video)ÚdescriptionÚinputuD   Ä�Æ°á»�ng dáº«n video táº­p phim Ä‘áº§u vÃ o (vd: downloads/ep1.mp4))Úhelpz	--out-diru5   ThÆ° má»¥c lÆ°u Shorts (máº·c Ä‘á»‹nh content/shorts))ÚdefaultrÚ   z--countu2   Sá»‘ lÆ°á»£ng Shorts cáº§n táº¡o (máº·c Ä‘á»‹nh 2))ÚtyperÛ   rÚ   z
--durationg     €A@u@   Thá»�i lÆ°á»£ng má»—i Short tÃ­nh theo giÃ¢y (máº·c Ä‘á»‹nh 35s)z--startu5   Cáº¯t thá»§ cÃ´ng tá»« giÃ¢y báº¯t Ä‘áº§u (náº¿u cÃ³)z	--upscaleÚ
store_trueu%   Báº­t AI 4K Upscale cho Ä‘oáº¡n Short)ÚactionrÚ   z_short_custom.mp4rÆ   )rÂ   rÃ   rw   r>   r�   )r/   r0   )r/   rf   )Nr'   r/   )r„   r…   NF)rÁ   r'   r/   F)*Ú__doc__rG   rL   ÚsysÚjsonr­   Úargparserq   Úpathlibr   ÚplatformÚ
startswithr—   Úreconfigurerl   Ú	Exceptionrp   rS   r°   r*   r-   re   rv   r¬   rƒ   ÚboolrÀ   rÖ   Ú__name__ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsr:   rË   rÙ   rÇ   rÔ   r>   r�   rw   rB   r.   r,   ú<module>rï      s8  ððð ð 
€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð ð „<×Ò˜5Ñ!Ô!ð ðØŒ
×Ò¨ÐÑ0Ô0Ð0ØŒ
×Ò¨ÐÑ0Ô0Ð0Ð0øØð ð ð Øˆðøøøð ?€
ðð ð Ð ðK˜Sð K Uð Kð Kð Kð Kð
3ð 3 ð 3°uð 3È5ð 3ð 3ð 3ð 3ðjð  Cð ¸%ð Èeð ð ð ð ð ð  #ð °ð ÀCð ÐW\ð ð ð ð ð0 Ø!ØØðZð ZØðZàðZð ðZð ð	Zð
 ðZð ðZð ðZð ðZð Zð Zð Zð| 'ØØØð2ð 2Øð2àð2ð ð2ð ð	2ð
 ð2ð 2ð 2ð 2ðh ˆzÒÑØ$ˆXÔ$Ð1^Ð_Ñ_Ô_€FØ
×Ò˜Ð&lÐÑmÔmÐmØ
×Ò˜Ð-=ÐD{ÐÑ|Ô|Ð|Ø
×Ò˜	¨°QÐ=qÐÑrÔrÐrØ
×Ò˜¨5¸$ð  FHÐñ  Iô  Ið  IØ
×Ò˜	¨°tÐByÐÑzÔzÐzØ
×Ò˜¨LÐ?fÐÑgÔgÐgà×ÒÑÔ€Dà„zÐØ�4˜œÑ%Ô%¨4¨4°´
Ñ+;Ô+;Ô+@Ð(SÐ(SÐ(SÑSˆØÐØœ
Ø˜˜X™œØ”jØœØØ"Ø”Lð	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	)Ð(ØœØ”|Ø”*Ø”]Ø”Lð	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð/ Ðs   Á 6A7 Á7A?Á>A?