§
    N ÇjÜ1  ã                   ór  — 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mZ ddlm	Z	m
Z
mZmZ ej                             d¦  «        r(	 ej                             d¬¦  «         n# e$ r Y nw xY w ee¦  «                             ¦   «         j        ZdZed	z  d
z  Zed	z  dz  Zedz  Ze                     dd¬¦  «         dZdZdddddddddœddddddd d!dœd"d#dd$d%d&d'd(dœd)d*d+d,d-dd.d/dœd0d1d2d3d4dd5d6dœd7dd8d9d:d&d;d<dœd=dd>d?d@d&d;dAdœdBdCdDdEdFddGdHdœdIdJdKdLdMdNdOdPdœdQœ	ZdRedSedTefdU„Z 	 	 dtdXedYedZed[e!d\e"d]e"fd^„Z#	 dud_ed`edaefdb„Z$e%dck    rêddl&Z& e&j'        dd¬e¦  «        Z(e( )                    dfedgg dh¢di¬j¦  «         e( *                    ¦   «         Z+e+j,        dkk    r e!e -                    ¦   «         ¦  «        ne+j,        gZ.e.D ]tZ/e/dlk    redmz  Z0nee/› dn�z  Z0e0 1                    ¦   «         s edoe/› dp�¦  «        Z0 e2dqe/ 3                    ¦   «         › dre0› ds�¦  «          e$ ee0¦  «        e/¦  «         ŒsdS dS )va  
shorts_hook_and_thumbnail_generator.py
High-Retention 3s Hooks & Vertical 9:16 Cover Generator for YouTube Shorts.

Features:
1. Standardized 3s Psychological Hooks Catalog (Paradox, Military Blunder, Secret Tactic).
2. Vertical 9:16 Shorts Cover Generator (1080x1920) respecting YouTube Shorts Safe Zones.
3. First-Frame Cover Stitching: Prepend cover card into frame 0.0 -> 0.75s so YouTube
   automatically picks it as the default thumbnail.
4. Kinetic On-Screen Text Overlay for 0.0s -> 3.5s with NVIDIA NVENC GPU acceleration.
é    N)ÚPath)ÚImageÚ	ImageDrawÚ	ImageFontÚImageFilterÚwinzutf-8)Úencodingz.C:\Projects\Historical\venv\Scripts\ffmpeg.exeÚcontentÚ	videos_4kÚshortsÚ
thumbnailsT)ÚparentsÚexist_okzC:\Windows\Fonts\impact.ttfzC:\Windows\Fonts\arialbd.ttfz0How Did an Exiled Prince Defeat 50,000 Invaders?zAN EXILED PRINCEzZERO WARSHIPSzHOW DID HE SURVIVE?g     €F@g      E@zThe Impossible Paradoxu   1785 NAVAL WAR â€¢ EPISODE 1)ÚtitleÚ
hook_line1Ú
hook_line2Ú
hook_line3Ú	start_secÚduration_secÚcategoryÚ	sub_badgez,300 Siamese Warships Invade the Mekong Deltaz50,000 INVADERSz300 WARSHIPSzAN EMPIRE IN FLAMESg     €Q@g      C@zThe Overwhelming Threatu   1785 NAVAL WAR â€¢ EPISODE 2z/How 50,000 Invaders Burned the Southern CapitalzA CAPITAL IN ASHESzCOULD ANYONE SURVIVE?g      N@g      D@zThe Fall of an Empireu   1785 NAVAL WAR â€¢ EPISODE 3z)The Counterattack That Changed EverythingzA GENIUS GENERALzA DEADLY GAMBITzTHE COUNTERATTACKg     ÀR@zThe Tactical Geniusu   1785 NAVAL WAR â€¢ EPISODE 4z+The Deadliest River Ambush in Asian HistoryzTHEY SAILED INTOzA 20-KM TRAPz	NO ESCAPEg     À\@zThe Military Masterstrokeu   RACH GAM 1785 â€¢ DEADLY AMBUSHz.Night of Fire: 300 Warships Destroyed in HoursÚVANISHEDzIN JUST ONE NIGHTg     @P@zCatastrophic Disasteru   NIGHT OF FIRE â€¢ FIRE BOATSz-How 50,000 Soldiers Were Wiped Out in One DayzFEWER THAN 2,000 SURVIVEDzTOTAL ANNIHILATIONg      I@u   1785 NAVAL WAR â€¢ EPISODE 7z+Why This Empire Never Dared to Invade AgainzTHEY FEARED THEMzLIKE TIGERSzLESSONS OF WARg      T@zEnduring Legacyu   1785 NAVAL WAR â€¢ EPISODE 8z1The Battle of Rach Gam 1785 (Full 4K Documentary)zTHE GREATEST NAVAL AMBUSHzYOU NEVER HEARD OFzRACH GAM 1785g     ˜’@g      H@zEpic Historical Mysteryu    THE HISTORICAL VAULT â€¢ 4K FULL)	Úep1Úep2Úep3Úep4Úep5Úep6Úep7Úep8ÚfullÚ
video_pathÚtimestamp_secÚout_frame_pathc                 óœ   — t           ddt          |¦  «        d| dddd|g}t          j        |dt          j        t          j        ¬	¦  «         |S )
z2Extracts a pristine frame at a specific timestamp.ú-yú-ssú-iz-vframesÚ1z-q:vÚ2T)ÚcheckÚstdoutÚstderr)Ú
FFMPEG_EXEÚstrÚ
subprocessÚrunÚDEVNULL)r"   r#   r$   Úcmds       ú=C:\Projects\Historical\shorts_hook_and_thumbnail_generator.pyÚextract_framer5   ƒ   sV   € õ 	�DØ�s�=Ñ!Ô!ØˆjØ�CØ�Øð€Cõ „N�3˜d­:Ô+=ÅjÔFXÐYÑYÔYÐYØÐó    é8  é€  Úbg_frame_pathÚoutput_pathr   Ú
hook_linesÚwidthÚheightc           	      ód  — t          j        | ¦  «                             d¦  «        }|                     ||ft           j        j        ¦  «        }|                     t          j        d¬¦  «        ¦  «        }||j	        z  }|}	t          |j        |z  ¦  «        }
|                     |	|
ft           j        j        ¦  «        }||
z
  dz  }t          j        d||f¦  «        }|                     |d¦  «         |                     |d|f¦  «         t          j        d||fd¦  «        }t          j        |¦  «        }t#          dt          |dz  ¦  «        ¦  «        D ]>}t          d	d
||dz  z  z
  z  ¦  «        }|                     d|f||fgddd|f¬¦  «         Œ?t#          t          |dz  ¦  «        |¦  «        D ]C}||dz  z
  |dz  z  }t          d|z  ¦  «        }|                     d|f||fgddd|f¬¦  «         ŒDt          j        ||¦  «        }t          j        |¦  «        }t)          j        t,          d¦  «        }|                     ¦   «         }|                     |¦  «        }|d         |d         z
  }|d         |d         z
  }||z
  dz  }d}d\  }}|                     ||z
  ||z
  ||z   |z   ||z   |z   gdddd¬¦  «         |                     ||dz
  f||d¬¦  «         d}t)          j        t6          |¦  «        }d}g d¢} t9          |¦  «        D ]×\  }!}"| |!t;          | ¦  «        z           }#|                     |"¦  «        }$|$d         |$d         z
  }%|$d         |$d         z
  }&||%z
  dz  }'dD ]4}(dD ]/})|(dk    s|)dk    r!|                     |'|(z   ||)z   f|"|d¬¦  «         Œ0Œ5|                     |'dz   |dz   f|"|d¬¦  «         |                     |'|f|"||#¬¦  «         ||&dz   z  }ŒØ|                     d ¦  «        }*|*                     |d!d"¬#¦  «         t?          d$|› �¦  «         |S )%a  
    Renders a vertical 9:16 Shorts thumbnail cover respecting YouTube UI Safe Zones.
    Upper 35%: Visual Hook text (High contrast, Drop shadow).
    Middle 30%: Focal action character/ships.
    Lower 35%: Clean zone (no critical text, reserved for YouTube mobile UI).
    ÚRGBAé   )Úradiusé   )r   r   r   )r   r   r   r   gáz®GáÚ?éÜ   g      ð?)Úfillg      è?g      Ð?é´   é$   é   é   é–   )é   é   )é   rL   r@   éæ   ©éÿ   é×   r   rO   )rA   rD   Úoutliner<   )ÚfontrD   éP   rO   ))rO   rO   rO   rO   rN   )rO   éK   rT   rO   )éüÿÿÿéþÿÿÿr   rB   é   )r   r   r   rO   é   )r   r   r   éÈ   é   ÚRGBÚJPEGé_   )Úqualityu&   âœ“ Ä�Ã£ táº¡o Thumbnail Shorts 9:16: ) r   ÚopenÚconvertÚresizeÚ
ResamplingÚBILINEARÚfilterr   ÚGaussianBlurr<   Úintr=   ÚLANCZOSÚnewÚpaster   ÚDrawÚrangeÚlineÚalpha_compositer   ÚtruetypeÚFONT_ARIAL_BOLDÚupperÚgetbboxÚrounded_rectangleÚtextÚFONT_IMPACTÚ	enumerateÚlenÚsaveÚprint)+r9   r:   r   r;   r<   r=   ÚbaseÚbgÚfg_ratioÚfg_wÚfg_hÚfgÚfg_yÚcanvasÚgradientÚg_drawÚyÚalphaÚprogressÚdrawÚ
badge_fontÚ
badge_textÚb_bboxÚb_wÚb_hÚbadge_xÚbadge_yÚpad_xÚpad_yÚhook_font_sizeÚ	hook_fontÚcurr_yÚcolorsÚirl   Ú
line_colorÚbboxÚlwÚlhÚlxÚoff_xÚoff_yÚout_rgbs+                                              r4   Úcreate_shorts_thumbnailr�   �   sÇ  € õ Œ:�mÑ$Ô$×,Ò,¨VÑ4Ô4€Dð 
�Š�e˜V�_¥eÔ&6Ô&?Ñ	@Ô	@€BØ	�Š•;Ô+°2Ð6Ñ6Ô6Ñ	7Ô	7€Bð �t”zÑ!€HØ€DÝˆtŒ{˜XÑ%Ñ&Ô&€DØ	�Š�d˜D�\¥5Ô#3Ô#;Ñ	<Ô	<€Bà�T‰M˜aÑ€DÝŒY�v  v˜Ñ/Ô/€FØ
‡L‚L��VÑÔÐØ
‡L‚L��a˜�YÑÔÐõ Œy˜ %¨ °,Ñ?Ô?€HÝŒ^˜HÑ%Ô%€FÝ�1•c˜& 4™-Ñ(Ô(Ñ)Ô)ð Að AˆÝ�C˜3 ! v°¡}Ñ"5Ñ6Ñ7Ñ8Ô8ˆØ�Š�a˜�V˜e Q˜ZÐ(°°1°a¸Ð/?ˆÑ@Ô@Ð@Ð@õ •3�v ‘}Ñ%Ô% vÑ.Ô.ð Að AˆØ˜ ™Ñ%¨&°4©-Ñ8ˆÝ�C˜(‘NÑ#Ô#ˆØ�Š�a˜�V˜e Q˜ZÐ(°°1°a¸Ð/?ˆÑ@Ô@Ð@Ð@åÔ" 6¨8Ñ4Ô4€FÝŒ>˜&Ñ!Ô!€Dõ Ô#¥O°RÑ8Ô8€JØ—’Ñ"Ô"€JØ×Ò 
Ñ+Ô+€FØ
�Œ)�f˜Q”iÑ
€CØ
�Œ)�f˜Q”iÑ
€Cà�s‰{˜qÑ €GØ€GØ�L€Eˆ5ð 	×ÒØ	�5‰˜' E™/¨7°S©=¸5Ñ+@À'ÈCÁ-ÐRWÑBWÐXØØØ"Øð ñ ô ð ð 	‡I‚Iˆw˜ !™Ð$ j°zÐHZ€IÑ[Ô[Ð[ð €NÝÔ"¥;°Ñ?Ô?€Ià€Fðð ð €Fõ ˜ZÑ(Ô(ð ð ‰ˆˆ4Ø˜A¥ F¡¤™OÔ,ˆ
Ø× Ò  Ñ&Ô&ˆØ�!ŒW�t˜A”wÑˆØ�!ŒW�t˜A”wÑˆØ�b‰j˜QÑˆð 'ð 	gð 	gˆEØ*ð gð g�Ø˜A’:�: ¨!¢ Ø—I’I˜r E™z¨6°E©>Ð:¸DÀyÐWe�IÑfÔfÐføðgð
 	�	Š	�2˜‘6˜6 A™:Ð&¨°9À>ˆ	ÑRÔRÐRà�	Š	�2�v�, ¨9¸:ˆ	ÑFÔFÐFà�"�r‘'Ñˆˆð �nŠn˜UÑ#Ô#€GØ‡L‚L�˜f¨b€LÑ1Ô1Ð1Ý	Ð
@°;Ð
@Ð
@ÑAÔAÐAØÐr6   Úvideo_sourceÚep_keyÚoutput_videoc                 óÀ  — t                                |¦  «        }|st          d|› �¦  «        ‚|d         }|d         }|d         |d         |d         g}|s-t          t          d|                     ¦   «         › d�z  ¦  «        }t          t          d	|› d
�z  ¦  «        }t          t          d|› d�z  ¦  «        }t          | |dz   |¦  «         t          |||d         |¬¦  «         t          j
                             |¦  «        rt          j        |¦  «         t          d¦  «         |d         › d|d         › �}	d|	› d�}
g t          ‘d‘d‘t          |¦  «        ‘d‘t          |¦  «        ‘d‘| ‘d‘|
‘d‘d‘d‘d‘d‘d‘d‘d‘d ‘d!‘d"‘d#‘d$‘d%‘d&‘d'‘d(‘d)‘d*‘d+‘|‘}t          j        |d,¬-¦  «         t          d.|› �¦  «         t          d/|› �¦  «         ||fS )0a  
    Renders an end-to-end Viral 9:16 Short:
    - Extracts dramatic segment.
    - Generates and bakes 9:16 Cover Frame into the first 0.75s (First-Frame Stitching).
    - Burns in kinetic Hook text in the video during 0.0s -> 3.5s.
    - Encodes with GPU NVENC (VBR CQ 19).
    u   KhÃ´ng cÃ³ hook database cho r   r   r   r   r   ÚShort_z_HighRetention.mp4Útemp_frame_z.jpgÚcover_z	_9x16.jpgg       @r   )r9   r:   r   r;   u8   
[Shorts Pipeline] Render video 9:16 báº±ng GPU NVENC...z - z¬[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,boxblur=25:5[bg];[0:v]scale=1080:-1[fg];[bg][fg]overlay=(W-w)/2:(H-h)/2[base];[base]drawtext=text='z¼':fontfile='C\:/Windows/Fonts/impact.ttf':fontsize=64:fontcolor=yellow:bordercolor=black:borderw=4:box=1:boxcolor=black@0.65:boxborderw=18:x=(w-text_w)/2:y=280:enable='between(t,0,3.5)'[v]r&   r'   z-tr(   z-filter_complexz-mapz[v]z0:a?z-c:vÚ
h264_nvencz-presetÚp6z-rc:vÚvbrz-cq:vÚ19z-bfÚ0z-avoid_negative_tsÚ	make_zeroz-c:aÚaacz-b:aÚ192kT)r+   u+   ðŸŽ‰ XUáº¤T Báº¢N THÃ€NH CÃ”NG SHORT 9:16: u'      áº¢nh bÃ¬a Thumbnail 9:16 Ä‘i kÃ¨m: )ÚSHORTS_HOOKS_CATALOGÚgetÚ
ValueErrorr/   Ú
SHORTS_DIRrp   ÚSHORTS_THUMBS_DIRr5   r�   ÚosÚpathÚexistsÚremoverx   r.   r0   r1   )rž   rŸ   r    Ú	hook_datar   Údur_secÚlinesÚ
temp_frameÚcover_thumb_pathÚhook_bannerÚfilter_complexr3   s               r4   Úbuild_high_retention_shortr½   ú   s  € õ %×(Ò(¨Ñ0Ô0€IØð CÝÐA¸ÐAÐAÑBÔBÐBà˜+Ô&€IØ˜Ô'€GØ�|Ô$ i°Ô&=¸yÈÔ?VÐW€Eàð UÝ�:Ð(S°·²±´Ð(SÐ(SÐ(SÑSÑTÔTˆõ Õ&Ð)C°vÐ)CÐ)CÐ)CÑCÑDÔD€JÝÕ,Ð/I¸Ð/IÐ/IÐ/IÑIÑJÔJÐÝ�, 	¨C¡°Ñ<Ô<Ð<õ Ø Ø$Ø˜KÔ(Øð	ñ ô ð õ 
„w‡~‚~�jÑ!Ô!ð Ý
Œ	�*ÑÔÐõ 
Ð
FÑGÔGÐGð
 ˜|Ô,ÐJÐJ°¸<Ô1HÐJÐJ€Kð	(ð
 !,ð	(ð 	(ð 	(ð ðÝðØðàðå�9‰~Œ~ðð 	ðõ �'‰lŒlðð 	ð	ð ð	ð
 	ðð
 *ðð 	ðð ðð 	ðð ðð 	ðð ðð 	ðð ðð 	ðð ðð 	ðð ðð 	ðð ðð 	ðð *ðð 	ðð ðð 	ðð ðð  	ð!€Cõ$ „N�3˜dÐ#Ñ#Ô#Ð#Ý	Ð
F¸Ð
FÐ
FÑGÔGÐGÝ	Ð
FÐ4DÐ
FÐ
FÑGÔGÐGØÐ)Ð)Ð)r6   Ú__main__z6High-Retention 3s Hooks & Vertical Thumbnail Generator)Údescriptionz--epr   )
r   r   r   r   r   r   r   r    r!   Úallz1Episode key to generate viral short for, or 'all')ÚtypeÚdefaultÚchoicesÚhelprÀ   r!   z"Forgotten_Battles_1785_Full_4K.mp4z_4k.mp4z
downloads/z.mp4u*   
Báº¯t Ä‘áº§u táº¡o Short & Thumbnail cho u    tá»« z...)r7   r8   )N)4Ú__doc__r²   ÚsysÚjsonÚtimer0   Úpathlibr   ÚPILr   r   r   r   ÚplatformÚ
startswithr,   ÚreconfigureÚ	ExceptionÚ__file__ÚresolveÚparentÚPROJECT_DIRr.   ÚVIDEOS_4K_DIRr°   r±   Úmkdirrt   ro   r­   r/   Úfloatr5   Úlistrf   r�   r½   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsÚepÚkeysÚtargetsÚep_kÚsrcr´   rx   rp   © r6   r4   ú<module>rä      sÕ  ðð
ð 
ð 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à„<×Ò˜5Ñ!Ô!ð ðØŒ
×Ò¨ÐÑ0Ô0Ð0Ð0øØð ð ð Øˆðøøøð ˆd�8‰nŒn×$Ò$Ñ&Ô&Ô-€Ø>€
Ø˜iÑ'¨+Ñ5€Ø˜9Ñ$ xÑ/€
Ø Ñ-Ð Ø × Ò  ¨tÐ Ñ 4Ô 4Ð 4à,€Ø1€ð
 DØ(Ø%Ø+ØØØ,Ø3ð	ð 	ð @Ø'Ø$Ø+ØØØ-Ø3ð	ð 	ð CØ*Ø'Ø-ØØØ+Ø3ð	ð 	ð =Ø(Ø'Ø)ØØØ)Ø3ð	ð 	ð ?Ø(Ø$Ø!ØØØ/Ø6ð	ð 	ð BØ$Ø Ø)ØØØ+Ø3ð	ð 	ð AØ'Ø1Ø*ØØØ+Ø3ð	ð 	ð ?Ø(Ø#Ø&ØØØ%Ø3ð	ð 	ð EØ1Ø*Ø%ØØØ-Ø7ð	ð 	ðc[ð [Ð ðz˜cð °%ð Èð ð ð ð ð$ Øðhð hØðhàðhð ðhð ð	hð
 ðhð ðhð hð hð hðZ ðO*ð O*ØðO*àðO*ð ðO*ð O*ð O*ð O*ðb ˆzÒÐØ€O€O€OØ$ˆXÔ$Ð1iÐjÑjÔj€FØ
×Ò˜ S°%ð  BIð  BIð  BIØPð ñ Rô Rð Rà×ÒÑÔ€Dà37´7¸eÒ3CÐ3CˆdˆdÐ'×,Ò,Ñ.Ô.Ñ/Ô/Ð/È$Ì'È€Gàð 
3ð 
3ˆØ�6Š>ˆ>ØÐ"FÑFˆCˆCà TÐ"2Ð"2Ð"2Ñ2ˆCà�zŠz‰|Œ|ð 	0Ø�$Ð. DÐ.Ð.Ð.Ñ/Ô/ˆCàˆÐX¸D¿JºJ¹L¼LÐXÐXÐPSÐXÐXÐXÑYÔYÐYØ"Ð" 3 3 s¡8¤8¨TÑ2Ô2Ð2Ð2ð' Ðð
3ð 
3s   ÁA  Á A(Á'A(