§
    GÇjZ  ã                   óª  — 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Zddl	Z	ddl
mZ ddlmZmZmZmZ ddlmZ ddlmZmZmZ ddlmZ ddlmZmZmZ dd	lmZ ddlZ e ed
¦  «        ¦  «         dZ dZ! ed¦  «        Z"e"dz  Z#e#dz  Z$e#dz  Z%e#dz  Z&e#dz  Z'e& (                    dd¬¦  «         e"dz  dz  dz  Z)e"dz  dz  dz  Z* ej+        ej,        d¬¦  «          ej-        d¦  «        Z. eddd¬¦  «        Z/e/ 0                    eg d ¢dd!gd!g¬"¦  «         d#e1fd$„Z2e%d%z  e%d&z  e%d'z  e%d(z  e%d)z  e%d*z  e%d+z  e%d,z  e%d-z  d.œ	Z3e$d/z  e$d0z  e$d1z  e$d2z  e$d3z  e$d4z  e$d5z  e$d6z  e$d7z  d.œ	Z4d8d9d:d;œd<d9d=d;œd>d9d?d;œd@d9dAd;œdBd9dCd;œdDd9dEd;œgdFd9dGd;œgdHd9dId;œgdJd9dKd;œgdLd9dMd;œgdNd9dOd;œgdPd9dQd;œgdRd9dSd;œgdTd9dUd;œgd.œ	Z5 G dV„ dWe¦  «        Z6 G dX„ dYe¦  «        Z7e/ 8                    dZ¦  «        e/ 8                    d[¦  «        e/ 8                    d\¦  «        d]„ ¦   «         ¦   «         ¦   «         Z9e/ 8                    d^¦  «        d_e:fd`„¦   «         Z;e/ 8                    da¦  «        d_e:fdb„¦   «         Z<dcdddedfœdgdgdhdfœdidjdkdfœdldmdndfœdodpdqdfœdrdsdtdfœduœZ=dvdwdxœdydzdxœd{d|dxœd}d~dxœdd€dxœd�d‚dxœdƒd„dxœdd…dxœdd†dxœd.œ	Z>d_e:d‡e:d#ee         fdˆ„Z?e/ 8                    d‰¦  «        dŠ„ ¦   «         Z@e/ 8                    d‹¦  «        d©d_e:d‡e:dŽe1d�e:d�ee:         f
d‘„¦   «         ZAe/ 8                    d’¦  «        d“„ ¦   «         ZB	 dªd•e:d–e:d—eCd˜eCd™e:d#e:fdš„ZDe/ E                    d›¦  «        dœe7fd�„¦   «         ZFdže:d_e:dŸe:d#e:fd „ZGe/ E                    d¡¦  «        dœe6fd¢„¦   «         ZHeId£k    r2e. J                    d¤e!› d¥e › d¦�¦  «          ejK        e/e!e d§¬¨¦  «         dS dS )«zú
Antigravity SDK Bridge Service (Port 8766) - Production Edition v2.1
Features:
- Live 2-way connection to YouTube Studio Extension
- AI Cinematic SEO Engine
- Automated 9:16 Shorts Generation via GPU NVENC (shorts_maker)
- Thumbnail & Video Serving
é    N)ÚPath)ÚDictÚAnyÚOptionalÚList)Úload_dotenv)ÚFastAPIÚHTTPExceptionÚBody)ÚCORSMiddleware)ÚFileResponseÚJSONResponseÚPlainTextResponse)Ú	BaseModelz1C:/Users/Admin/.gemini/antigravity/mem0_data/.envi>"  ú	127.0.0.1zC:/Projects/HistoricalÚcontentÚ	videos_4kÚ
thumbnailsÚshortsÚ	subtitlesT)ÚparentsÚexist_okÚvenvÚScriptsz
python.exez
ffmpeg.exez<%(asctime)s [%(levelname)s] [AntigravityBridge]: %(message)s)ÚlevelÚformatÚAntigravityBridgeúAntigravity Studio Bridge ProzhHigh-performance bridge connecting YouTube Studio Chrome Extension to Antigravity AI & GPU Shorts Engineú2.1.0)ÚtitleÚdescriptionÚversion)zhttps://studio.youtube.comzchrome-extension://*zhttp://localhost:8766zhttp://127.0.0.1:8766ú*r#   )Úallow_originsÚallow_credentialsÚallow_methodsÚallow_headersÚreturnc                  ó  — 	 t          j         t           j        t           j        ¦  «        5 } |                      d¦  «         |                      d¦  «        dk    cd d d ¦  «         S # 1 swxY w Y   d S # t
          $ r Y dS w xY w)Ngš™™™™™Ù?)r   i$  r   F)ÚsocketÚAF_INETÚSOCK_STREAMÚ
settimeoutÚ
connect_exÚ	Exception)Úss    ú4C:\Projects\Historical\antigravity_bridge_service.pyÚcheck_port_9222r2   K   sÊ   € ðÝŒ]�6œ>­6Ô+=Ñ>Ô>ð 	:À!Ø�LŠL˜ÑÔÐØ—<’<Ð 3Ñ4Ô4¸Ò9ð	:ð 	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øõ ð ð ð Øˆuˆuðøøøs4   ‚)A3 «.A&ÁA3 Á&A*Á*A3 Á-A*Á.A3 Á3
BÂ Bzfull_movie_thumb.jpgzep1_thumb.jpgzep2_thumb.jpgzep3_thumb.jpgzep4_thumb.jpgzep5_thumb.jpgzep6_thumb.jpgzep7_thumb.jpgzep8_thumb.jpg©	ÚfullÚ1Ú2Ú3Ú4Ú5Ú6Ú7Ú8z"Forgotten_Battles_1785_Full_4K.mp4z
ep1_4k.mp4z
ep2_4k.mp4z
ep3_4k.mp4z
ep4_4k.mp4z
ep5_4k.mp4z
ep6_4k.mp4z
ep7_4k.mp4z
ep8_4k.mp4g      ^@ç     €F@u)   When 300 Warships Burned in 1 Night! ðŸ”¥)ÚstartÚdurationr    g     Àr@u1   The Deadliest River Trap in History (1785) âš”ï¸�g     `ƒ@u*   50,000 Invaders Walked Into His Trap! ðŸ’¥g     €‹@u,   General Nguyen Hue's Masterstroke Ambush âš¡g     À’@u0   The Night the Mekong River Caught Fire! ðŸŒŠðŸ”¥g     p—@u.   Announced Surrender: 300 Ships Destroyed! ðŸ’€g     @Z@z-The Exiled Prince & The Fatal Alliance (1785)g     €V@z*50,000 Invaders: The Mekong Fleet Advancesg     €[@z(A Nation in Flames: The Fall of Gia Dinhg     @`@z*The Tiger Awakens: Nguyen Hue Strikes Backg     ÀW@z)The Deadliest River Trap at Rach Gam 1785g     À\@z'Night of Fire: The Fire Ships Unleashedg      Y@z.Total Annihilation: Blood and Ash on the Riverg      T@z'The Legacy of 1785: Sovereignty Securedc                   óx   — e Zd ZU eed<   dZee         ed<   dZee         ed<   dZee	ee
f                  ed<   dS )ÚGenerateRequestÚpromptr4   Úepisode_keyÚgeneralÚfieldNÚcontext)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__rC   r   rE   rF   r   r   © ó    r1   rA   rA   ‚   s`   € € € € € € Ø€K€K�KØ!'€K�˜#”Ð'Ð'Ñ'Ø$€Eˆ8�CŒ=Ð$Ð$Ñ$Ø(,€GˆX�d˜3 ˜8”nÔ%Ð,Ð,Ñ,Ð,Ð,rM   rA   c                   ón   — e Zd ZU dZeed<   dZee         ed<   dZ	eed<   dZ
eed<   dZee         ed	<   dS )
ÚShortsCreateRequestr4   rC   NÚ	start_secr=   Úduration_secÚblurÚlayoutÚcustom_title)rG   rH   rI   rC   rJ   rK   rP   r   ÚfloatrQ   rS   rT   rL   rM   r1   rO   rO   ˆ   sj   € € € € € € Ø€K�ÐÐÑØ!%€Iˆx˜ŒÐ%Ð%Ñ%Ø€L�%ÐÐÑØ€FˆCÐÐÑØ"&€L�(˜3”-Ð&Ð&Ñ&Ð&Ð&rM   rO   ú/z/healthz/api/statusc            
   ƒ   óP   K  — t          ¦   «         } dddt          ddg d¢| | rdndd	œ	S )
NÚonliner   r   zAntigravity Cinematic AI Enginezgemini-3.8-flash)z1-Click Auto-FillzShadow DOM PiercingzDirect Thumbnail InjectionzGPU Shorts Creator 9:16zOPEN (Remote Debugging Active)zCLOSED (Port 9222))	ÚstatusÚservicer"   ÚportÚengineÚactive_modelÚfeaturesÚtester_tunnel_9222Útester_tunnel_status)r2   ÚPORT)Úp9222s    r1   Ú
get_statusrc   �   sO   è è € õ ÑÔ€EàØ2ØÝØ3Ø*ØyÐyÐyØ#ØDIÐ cÐ @Ð @ÐOcð
ð 
ð 
rM   z/api/thumbnail/{episode_key}rC   c              ƒ   ón  K  — t          | ¦  «                             ¦   «                              dd¦  «        }t                               |¦  «        pt                               d¦  «        }|r|                     ¦   «         st          dd¬¦  «        ‚t          t          |¦  «        d|j        ¬¦  «        S )	NÚepÚ r4   é”  z Thumbnail file not found on disk©Ústatus_codeÚdetailz
image/jpeg©ÚpathÚ
media_typeÚfilename)	rJ   ÚlowerÚreplaceÚTHUMBNAIL_MAPÚgetÚexistsr
   r   Úname)rC   ÚkeyÚ
thumb_paths      r1   Úget_thumbnail_filerw       s¥   è è € å
ˆkÑ
Ô
×
 Ò
 Ñ
"Ô
"×
*Ò
*¨4°Ñ
4Ô
4€CÝ×"Ò" 3Ñ'Ô'ÐD­=×+<Ò+<¸VÑ+DÔ+D€JØð X˜Z×.Ò.Ñ0Ô0ð XÝ¨Ð4VÐWÑWÔWÐWå�S ™_œ_¸ÐPZÔP_Ð`Ñ`Ô`Ð`rM   z/api/files/{episode_key}c              ƒ   ó`  K  — t          | ¦  «                             ¦   «                              dd¦  «        }t                               |¦  «        }t
                               |¦  «        }d|rt          |¦  «        ndddœ}|rU|                     ¦   «         rAdt          |¦  «        t          |                     ¦   «         j	        dz  d¦  «        |j
        d	œ}d|rt          |¦  «        ndd
œ}|r8|                     ¦   «         r$dt          |¦  «        |j
        dt          › d|› �dœ}|||dœS )Nre   rf   Fr   )rs   rl   Úsize_mbTé   é   )rs   rl   ry   rn   )rs   rl   úhttp://127.0.0.1:z/api/thumbnail/)rs   rl   rn   Úurl)rC   ÚvideoÚ	thumbnail)rJ   ro   rp   Ú	VIDEO_MAPrr   rq   rs   ÚroundÚstatÚst_sizert   ra   )rC   ru   Ú
video_pathrv   Úv_infoÚt_infos         r1   Úget_file_infor‡   ©   sD  è è € å
ˆkÑ
Ô
×
 Ò
 Ñ
"Ô
"×
*Ò
*¨4°Ñ
4Ô
4€CÝ—’˜sÑ#Ô#€JÝ×"Ò" 3Ñ'Ô'€Jà¸*Ð'L¥s¨:¡¤ È"ÐYZÐ[Ð[€FØð 
�j×'Ò'Ñ)Ô)ð 
àÝ˜
‘O”OÝ˜ZŸ_š_Ñ.Ô.Ô6¸+ÑFÈÑJÔJØ"œð	
ð 
ˆð ¸*Ð'L¥s¨:¡¤ È"ÐMÐM€FØð 
�j×'Ò'Ñ)Ô)ð 
àÝ˜
‘O”OØ"œØA¥tÐAÐA¸CÐAÐAð	
ð 
ˆð ¨¸fÐEÐEÐErM   Ú
Vietnameseu   Tiáº¿ng Viá»‡tÚvi)rt   ÚnativeÚyt_codeÚEnglishÚenÚGermanÚDeutschÚdeÚFrenchu	   FranÃ§aisÚfrÚSpanishu   EspaÃ±olÚesÚJapaneseu	   æ—¥æœ¬èªžÚja)r‰   r�   r�   r’   r”   r–   Úc8Akru2j7okzFull Movie Omnibus (36 Mins 4K)©Úvideo_idr    zDT202N1I4-AzEpisode 1: Prince in ExileÚFKPhXdwFbIIzEpisode 2: 50,000 InvadersÚgZ40mP451RczEpisode 3: A Nation in Flamesrf   zEpisode 4: The Tiger AwakensÚlygtPzWC7Igz#Episode 5: The Deadliest River TrapÚUOaAm7zVOV4zEpisode 6: Night of FirezEpisode 7: The AnnihilationzEpisode 8: Lessons of WarÚ	lang_codec                 óD  — t          | ¦  «                             ¦   «                              dd¦  «                             ¦   «         }t          |¦  «                             ¦   «                              ¦   «         }|t          vrd S |dv rKt
          dz  d|› d�z  }|                     ¦   «         st          d|› d�z  }|                     ¦   «         r|nd S |d„ t          d	d
¦  «        D ¦   «         v r/t
          d|› �z  d|› d|› d�z  }|                     ¦   «         r|nd S d S )Nre   rf   )r4   Úomnibusr4   Úfull_z.srtÚForgotten_Battles_1785_Full_4K_c                 ó,   — g | ]}t          |¦  «        ‘ŒS rL   ©rJ   ©Ú.0Úis     r1   ú
<listcomp>z%get_subtitle_path.<locals>.<listcomp>è   s   € Ð+Ð+Ð+˜!�s�1‰vŒvÐ+Ð+Ð+rM   é   é	   Ú_)	rJ   ro   rp   ÚstripÚSUPPORTED_LANGUAGESÚSUBTITLES_DIRrs   ÚVIDEOS_4K_DIRÚrange)rC   rž   ru   ÚlangÚps        r1   Úget_subtitle_pathr³   Ü   s7  € Ý
ˆkÑ
Ô
×
 Ò
 Ñ
"Ô
"×
*Ò
*¨4°Ñ
4Ô
4×
:Ò
:Ñ
<Ô
<€CÝˆy‰>Œ>×ÒÑ!Ô!×'Ò'Ñ)Ô)€DØÕ&Ð&Ð&Øˆtà
Ð!Ð!Ð!Ý˜FÑ"Ð%7¨TÐ%7Ð%7Ð%7Ñ7ˆØ�xŠx‰zŒzð 	MÝÐ LÀ$Ð LÐ LÐ LÑLˆAØ—H’H‘J”JÐ(ˆqˆq DÐ(à
Ð+Ð+�u Q¨™{œ{Ð+Ñ+Ô+Ð+Ð+Ý˜J ˜J˜JÑ&Ð)>¨cÐ)>Ð)>°DÐ)>Ð)>Ð)>Ñ>ˆØ—H’H‘J”JÐ(ˆqˆq DÐ(àˆ4rM   z/api/subtitles/listc               ƒ   óz  K  — i } dgd„ t          dd¦  «        D ¦   «         z   }|D �]}t                               |dd|› �dœ¦  «        }i }t                               ¦   «         D ]¡\  }}t          ||¦  «        }|ru|                     ¦   «         rad|d	         |d
         |j        t          |¦  «        | 	                    ¦   «         j
        dt          › d|› d|› �dt          › d|› d|› d�dœ||<   ŒŒd|d	         |d
         dœ||<   Œ¢|d         |d         |d         rd|d         › d�nd|dœ| |<   �Œdt          | dœS )zNReturns a full catalog of all 6-language subtitles for EP1-EP8 and Full Movie.r4   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rL   r¤   r¥   s     r1   r¨   z"list_subtitles.<locals>.<listcomp>ò   s   € Ð3Ð3Ð3 !•s˜1‘v”vÐ3Ð3Ð3rM   r©   rª   rf   zEpisode r˜   Trt   rŠ   r|   z/api/subtitles/rV   z?download=true)rs   Ú	lang_nameÚlang_nativern   rl   Ú
size_bytesr}   Údownload_urlF)rs   r¶   r·   r    r™   z!https://studio.youtube.com/video/z/translations)r    r™   Útranslations_urlr   Úsuccess)rY   Úsupported_languagesÚepisodes)r°   ÚKNOWN_EPISODE_VIDEOSrr   r­   Úitemsr³   rs   rt   rJ   r‚   rƒ   ra   )ÚcatalogÚkeysru   Úep_infoÚep_subsr±   ÚinfoÚsub_ps           r1   Úlist_subtitlesrÆ   î   s»  è è € ð €GØˆ8Ð3Ð3¥u¨Q°¡{¤{Ð3Ñ3Ô3Ñ3€DØð 
ñ 
ˆÝ&×*Ò*¨3¸RÐJZÐUXÐJZÐJZÐ0[Ð0[Ñ\Ô\ˆØˆÝ-×3Ò3Ñ5Ô5ð 	ð 	‰JˆD�$Ý% c¨4Ñ0Ô0ˆEØð ˜Ÿš™œð à"Ø!% f¤Ø#'¨¤>Ø %¤
Ý ™JœJØ"'§*¢*¡,¤,Ô"6ØP­tÐPÐPÀCÐPÐPÈ$ÐPÐPØ$g½Ð$gÐ$gÈSÐ$gÐ$gÐSWÐ$gÐ$gÐ$gð	!ð 	!�˜‘�ð $Ø!% f¤Ø#'¨¤>ð!ð !�˜‘�ð ˜WÔ%Ø 
Ô+ØjqÐr|Ôj}ð  !FÐ fÀGÈJÔDWÐ fÐ fÐ fÐ fð  DFØ ð	
ð 
ˆ�‰‰ð Ý2Øðð ð rM   z(/api/subtitles/{episode_key}/{lang_code}FÚtextÚdownloadr   Úfmtc           
   ƒ   óÀ  K  — t          | |¦  «        }|r|                     ¦   «         st          dd| › d|› d�¬¦  «        ‚|r$t          t	          |¦  «        d|j        ¬¦  «        S |                     d¬	¦  «        }|p|}|d
k    rÈt          j        d| 	                    ¦   «         ¦  «        }g }	|D ]s}
d„ |
 
                    ¦   «         D ¦   «         }t          |¦  «        dk    r@|	                     |d         |d         d                     |dd…         ¦  «        dœ¦  «         Œtt          d| ||j        t          |	¦  «        |	dœ¬¦  «        S t          |d¬¦  «        S )z¢
    Serves the SRT subtitle file for the specified episode and language.
    Supports plain text SRT content, direct file download, or structured JSON cues.
    rg   z Subtitle not found for episode 'z' and language 'ú'rh   zapplication/x-subriprk   zutf-8)ÚencodingÚjsonz\n\s*\nc                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S rL   )r¬   )r¦   Úls     r1   r¨   z get_subtitle.<locals>.<listcomp>-  s-   € ÐDÐDÐD 1¸!¿'º'¹)¼)ÐD�Q—W’W‘Y”YÐDÐDÐDrM   é   r   r©   ú r{   N)ÚidÚtimingrÇ   r»   )rY   Úepisoder±   rn   Ú	cue_countÚcues)r   ztext/plain; charset=utf-8)r   rm   )r³   rs   r
   r   rJ   rt   Ú	read_textÚreÚsplitr¬   Ú
splitlinesÚlenÚappendÚjoinr   r   )rC   rž   rÈ   r   rÉ   Úsub_pathr   Ú
req_formatÚblocksrÖ   ÚbÚliness               r1   Úget_subtitlerã     sÅ  è è € õ ! ¨iÑ8Ô8€HØð B˜8Ÿ?š?Ñ,Ô,ð BÝ¨ð  5AÐWbð  5Að  5AÐt}ð  5Að  5Að  5Að  Bñ  Bô  Bð  	Bàð 
ÝÝ�X‘”Ø-Ø”]ð
ñ 
ô 
ð 	
ð × Ò ¨'Ð Ñ2Ô2€GØ�˜€Jà�VÒÐÝ”˜* g§m¢m¡o¤oÑ6Ô6ˆØˆØð 	ð 	ˆAØDÐD¨¯ª©¬ÐDÑDÔDˆEÝ�5‰zŒz˜QŠˆØ—’Ø œ(Ø# AœhØŸHšH U¨1¨2¨2¤YÑ/Ô/ðð ñ ô ð øõ
 ØØ"ØØ œÝ˜T™œØð%
ð %
ð ñ ô ð 	õ  WÐ9TÐUÑUÔUÐUrM   z/api/shorts/listc               ƒ   óÞ  K  — g } t          t                               d¦  «        ¦  «        D ]°}t          |                     ¦   «         j        dz  d¦  «        }d}|j                             ¦   «         }t          dd¦  «        D ]}d|› �|v rt          |¦  «        } nŒd}d	|v rd
}nd|v rd}|  
                    |j        t          |¦  «        |||dddœ¦  «         Œ±t          | ¦  «        | dœS )zAReturns all pre-rendered and newly cut Shorts in content/shorts/.z*.mp4rz   r{   r4   r©   rª   re   z@The Deadliest River Trap in History! (1785) #Shorts #History #4KÚshort_1uA   When 300 Warships Burned in One Night! ðŸ”¥ #Shorts #HistoryVaultÚshort_2uF   50,000 Invaders Walked Straight Into His Trap! âš”ï¸� #Shorts #Warfarez¨Watch the complete 36-minute 4K documentary omnibus here: https://youtu.be/c8Akru2j7ok

#Shorts #HistoryVault #NavalWarfare #RachGam1785 #MilitaryHistory #Documentary4Kza#Shorts, History Vault, Rach Gam 1785, ancient naval warfare, Tay Son, 4k shorts, military ambush)rn   rl   ry   rÔ   r    r!   Útags)Úcountr   )ÚsortedÚ
SHORTS_DIRÚglobr�   r‚   rƒ   Ústemro   r°   rJ   rÜ   rt   rÛ   )Úshorts_listÚfilery   Úep_tagÚ
name_lowerr§   r    s          r1   Úlist_available_shortsrñ   C  s5  è è € ð €KÝ•z—’ wÑ/Ô/Ñ0Ô0ð ð ˆÝ˜Ÿ	š	™œÔ+¨{Ñ;¸QÑ?Ô?ˆàˆØ”Y—_’_Ñ&Ô&ˆ
Ý�q˜!‘”ð 	ð 	ˆAØ�Aˆxˆx˜:Ð%Ð%Ý˜Q™œ�Ø�ð &ð TˆØ˜
Ð"Ð"ØXˆEˆEØ˜*Ð$Ð$Ø]ˆEà×ÒØœ	Ý˜‘I”IØØØðcð xð
ð 
ñ 	ô 	ð 	ð 	õ �[Ñ!Ô!Øðð ð rM   rR   Úinput_videoÚoutput_videorP   rQ   rS   c                 ó4  — t          |¦  «        }|j        dt          t          j        ¦   «         dz  ¦  «        › d�z  }d\  }}t	          t
          ¦  «        ddt	          |¦  «        dt	          |¦  «        dt	          | ¦  «        d	d
dd
t	          |¦  «        g}	t          j        |	dt          j        t          j        ¬¦  «         |dk    r	d|› d|› �}
nd|› d|› d|› d|› d|› d�}
t	          t
          ¦  «        ddt	          |¦  «        d|
d|dk    rdndddd	dddddd d!d"d#dd$d%d&t	          |¦  «        g}t          j        |dt          j        t          j        ¬¦  «         | 	                    ¦   «         r| 
                    d¬'¦  «         t	          |¦  «        S )(zMExecutes FFmpeg with GPU NVENC to render vertical 9:16 Short in ~2-3 seconds.Ú_tmp_iè  ú.mp4)i8  i€  z-yz-ssz-tz-iz-c:vÚcopyz-c:aT)ÚcheckÚstdoutÚstderrÚcropzcrop=ih*9/16:ih,scale=ú: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-maprR   z[v]z0:vz0:a?Ú
h264_nvencz-presetÚp5z-rc:vÚvbrz-cq:vÚ19z-b:vÚ0Úaacz-b:aÚ192k)Ú
missing_ok)r   ÚparentÚintÚtimerJ   Ú
FFMPEG_EXEÚ
subprocessÚrunÚDEVNULLrs   Úunlink)rò   ró   rP   rQ   rS   Úout_pathÚ	temp_clipÚw_targetÚh_targetÚcut_cmdÚ
filter_strÚ
render_cmds               r1   Úrun_nvenc_short_cutterr  i  så  € õ �LÑ!Ô!€HØ”Ð"E­#­d¬i©k¬k¸$Ñ.>Ñ*?Ô*?Ð"EÐ"EÐ"EÑE€IØ#Ñ€Hˆhõ 	�J‰Œ˜Ø�s�9‰~Œ~Ø�c�,ÑÔØ�c�+ÑÔØ�Ø�ÝˆI‰Œð€Gõ „N�7 $­zÔ/AÍ*ÔJ\Ð]Ñ]Ô]Ð]ð �ÒÐØC¨hÐCÐC¸ÐCÐCˆ
ˆ
ð2˜(ð 2ð 2 Xð 2ð 2Øð2ð 2Ø'ð2ð 2à"ð2ð 2ð 2ð 	õ 	�J‰Œ˜Ø�c�)‰nŒnØ˜:Ø˜ 6Ò)Ð)��¨uØ�Ø�Ø�4Ø�Ø�Ø�Ø�Ø�ÝˆH‰Œð€Jõ „N�: Tµ*Ô2DÍZÔM_Ð`Ñ`Ô`Ð`à×ÒÑÔð *Ø×Ò DÐÑ)Ô)Ð)åˆx‰=Œ=ÐrM   z/api/shorts/createÚreqc              ƒ   ór  K  — t          | j        ¦  «                             ¦   «                              dd¦  «        }t                               |¦  «        pt                               d¦  «        }|r|                     ¦   «         st          dd¬¦  «        ‚| j        }d}|€lt                               |t          d         ¦  «        }|t          t          j        ¦   «         ¦  «        t          |¦  «        z           }|d         }|d	         }t          t          | j        ¦  «        d
¦  «        }d|› dt          |¦  «        › dt          t          j        ¦   «         ¦  «        › d�}t           |z  }	t"                               d|j        › d|› d|› d| j        › �¦  «         t+          j        ¦   «         }
	 |
                     dt0          t          |¦  «        t          |	¦  «        ||| j        ¦  «        ƒ d{V —†}nP# t2          $ rC}t"                               d|› �¦  «         t          ddt          |¦  «        › �¬¦  «        ‚d}~ww xY wt7          t9          |¦  «                             ¦   «         j        dz  d¦  «        }| j        p|pd}|                      d¦  «        s|dz  }d}d}d|||||||ddd œ
S )!z‚
    Cuts a brand new 9:16 vertical Short from the specified source video
    using GPU NVIDIA NVENC acceleration in seconds.
    re   rf   r4   rg   zSource video not found on diskrh   Nr>   r    g     €M@Úshort_r«   Ús_rö   zCutting Short: Source=z, Start=zs, Dur=z
s, Layout=zError rendering short: iô  zShort rendering failed: rz   r{   u1   The 1785 Deadly Naval Trap! ðŸ”¥ #Shorts #Historyz#Shortsz #Shortsu  An intense clip from 'Untold Battles: The 1785 Mekong Naval War'.

ðŸ‘‰ WATCH FULL 36-MINUTE 4K DOCUMENTARY HERE: https://youtu.be/c8Akru2j7ok

Subscribe for weekly epic military history documentaries!

#Shorts #HistoryVault #NavalBattles #RachGam1785 #MilitaryHistory #Documentary4Kzv#Shorts, History Vault, Rach Gam 1785, ancient warfare, naval ambush, 4k shorts, military history, Nguyen Hue, Tay Sonr»   r—   úVThe Battle of Rach Gam (1785): The Complete 1785 Naval War | Full Documentary [4K UHD])
rY   Ú
short_pathrn   ry   rQ   r    r!   rç   Úrelated_video_idÚrelated_video_title)!rJ   rC   ro   rp   r€   rr   rs   r
   rP   ÚDEFAULT_DRAMA_TIMESTAMPSr  r  rÛ   ÚminrU   rQ   rê   ÚloggerrÄ   rt   rS   ÚasyncioÚget_event_loopÚrun_in_executorr  r/   Úerrorr�   r   r‚   rƒ   rT   Úendswith)r  ru   r„   rP   Úclimax_titleÚdrama_candidatesÚchosenrQ   Úout_filenamer  ÚloopÚ
final_pathÚery   Úfinal_titler!   rç   s                    r1   Úcreate_new_shortr-  ¢  sö  è è € õ ˆcŒoÑ
Ô
×
$Ò
$Ñ
&Ô
&×
.Ò
.¨t°RÑ
8Ô
8€CÝ—’˜sÑ#Ô#Ð<¥y§}¢}°VÑ'<Ô'<€JØð V˜Z×.Ò.Ñ0Ô0ð VÝ¨Ð4TÐUÑUÔUÐUð ”€IØ€LàÐÝ3×7Ò7¸Õ=UÐV\Ô=]Ñ^Ô^ÐØ!¥#¥d¤i¡k¤kÑ"2Ô"2µSÐ9IÑ5JÔ5JÑ"JÔKˆØ˜7”Oˆ	Ø˜g”ˆå•u˜SÔ-Ñ.Ô.°Ñ5Ô5€LØJ˜CÐJÐJ¥# i¡.¤.ÐJÐJµC½¼	¹¼Ñ4DÔ4DÐJÐJÐJ€LÝ˜LÑ(€Hå
‡K‚KÐx¨¬ÐxÐxÀ)ÐxÐxÐT`ÐxÐxÐloÔlvÐxÐxÑyÔyÐyõ Ô!Ñ#Ô#€DðYØ×/Ò/ØÝ"Ý�
‰OŒOÝ�‰MŒMØØØŒJñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆ
ˆ
øõ ð Yð Yð YÝ�ŠÐ2¨qÐ2Ð2Ñ3Ô3Ð3Ý¨Ð4WÍsÐSTÉvÌvÐ4WÐ4WÐXÑXÔXÐXøøøøðYøøøõ •D˜Ñ$Ô$×)Ò)Ñ+Ô+Ô3°{ÑCÀQÑGÔG€Gð Ô"Ðj lÐjÐ6j€KØ×Ò 	Ñ*Ô*ð "Ø�zÑ!ˆð	\ð ð D€Dð Ø Ø ØØ$ØØ"ØØ)Øwðð ð s   Æ6AG< Ç<
I	È>IÉI	rE   Úuser_promptc           
      óX  — ddddddddd	d
œ	}| dk    rz|                      ||d         ¦  «        }d|                     ¦   «         v sd|                     ¦   «         v rdS d|                     ¦   «         v sd|                     ¦   «         v rdS |S | dk    r	 dS | dk    rdS | dk    rdS d|› d�S )Nr  zMThe Exiled Prince & The Foreign Alliance (1785) | Forgotten Battles Ep 1 [4K]zR50,000 Invaders: The Siamese Fleet Invades the South | Forgotten Battles Ep 2 [4K]zMA Nation in Flames: The Fall of Gia Dinh (1784) | Forgotten Battles Ep 3 [4K]zPThe Tiger Awakens: General Nguyen Hue Strikes Back | Forgotten Battles Ep 4 [4K]zIThe Deadliest River Trap in Military History: Rach Gam (1785) | Ep 5 [4K]zLNight of Fire: The Fire Ships Unleashed (1785) | Forgotten Battles Ep 6 [4K]zJThe Annihilation: Blood and Ash on the River | Forgotten Battles Ep 7 [4K]zNThe Aftermath & Strategic Legacy of the 1785 War | Forgotten Battles Ep 8 [4K]r3   r    r4   u   ngáº¯nÚshortz1The Deadliest Naval Ambush in History (1785) [4K]u   ká»‹ch tÃ­nhÚdramaticz=When 300 Warships Burned in One Night: Rach Gam 1785 [4K UHD]rç   a  The Historical Vault, Rach Gam 1785, ancient warfare, naval battles, military history, Asian history, Tay Son rebellion, Nguyen Hue, Quang Trung, Siamese armada, fire ships ambush, complete series, epic history, documentary omnibus, 4k history documentary, Southeast Asian warfarer!   uG  The definitive 4K UHD documentary chronicle from 'The Historical Vault'.

Examine the strategic depth, naval deception, and geopolitical shockwaves of the 1785 campaign.

â�±ï¸� CHAPTER TIMESTAMPS & SOURCES:
00:00 - Introduction & The Geopolitical Balance
01:15 - Strategic Manuevers on the Mekong
02:45 - The Climax: Fire and Cannon
04:00 - Military Legacy & Analysis

ðŸ”” SUBSCRIBE to The Historical Vault for weekly 4K military documentaries:
https://www.youtube.com/@TheHistoricalVault?sub_confirmation=1

#HistoryVault #NavalWarfare #RachGam1785 #MilitaryHistory #Documentary4KÚcommentzpWhich military maneuver in this battle surprised you the most? Join the historical debate in the comments below!z/Antigravity Studio Engine: Processed query for ú.)rr   ro   )rE   rC   r.  Ú	ep_titlesÚ
base_titles        r1   Úgenerate_cinematic_seor6  î  s  € àhØ\ØaØ\Ø_ØXØ[ØYØ]ð
ð 
€Ið �ÒÐØ—]’] ;°	¸&Ô0AÑBÔBˆ
Ø�{×(Ò(Ñ*Ô*Ð*Ð*¨g¸×9JÒ9JÑ9LÔ9LÐ.LÐ.LØGÐGØ˜[×.Ò.Ñ0Ô0Ð0Ð0°JÀ+×BSÒBSÑBUÔBUÐ4UÐ4UØSÐSØÐà�‚€ðrð	
ð 	
ð �ÒÐð	Xð	
ð �	ÒÐð Bð  BàK¸[ÐKÐKÐKÐKrM   z/api/generatec           
   ƒ   ó
  ‡ ‡‡K  — t                                d‰ j        › d‰ j        › d‰ j        d d…         › �¦  «         d }d}	 ddlmŠm} t          j	         
                    d¦  «        } ||¬	¦  «        Šˆˆˆ fd
„}t          j         |¦   «         d¬¦  «        ƒ d {V —†}n=# t          $ r0}d}t          ‰ j        pd‰ j        pd‰ j        ¦  «        }Y d }~nd }~ww xY wd|‰ j        ‰ j        |                     ¦   «         dœS )NzGenerating field 'z' for Episode 'z'. Prompt: é2   zgoogle.antigravity.Agentr   )ÚAgentÚLocalAgentConfigÚGEMINI_API_KEY)Úapi_keyc            	   “   ó  •K  —  ‰‰¬¦  «        4 ƒd {V —†} |                       d‰j        › d‰j        › d‰j        › �¦  «        ƒ d {V —†}|                     ¦   «         ƒ d {V —†cd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S )N)ÚconfigzEYou are the Director of The Historical Vault YouTube channel. Field: z, Episode: z. Request: )ÚchatrE   rC   rB   rÇ   )ÚagentÚrespr9  Úcfgr  s     €€€r1   Ú_call_agentz&generate_with_sdk.<locals>._call_agent)  s_  øè è € Ø�u CÐ(Ñ(Ô(ð )ð )ð )ð )ð )ð )ð )¨EØ"ŸZšZð]Ø!œið]ð ]Ø47´Oð]ð ]ØPSÔPZð]ð ]ñô ð ð ð ð ð ð �ð "ŸYšY™[œ[Ð(Ð(Ð(Ð(Ð(Ð(ð)ð )ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð )ð )s   –AA6Á6
B ÂB g      @)Útimeoutz antigravity.cinematic.seo.enginerD   r4   r»   )rY   r\   rC   rE   Úoutput)r  rÄ   rE   rC   rB   Úgoogle.antigravityr9  r:  ÚosÚenvironrr   r   Úwait_forr/   r6  r¬   )	r  Úresult_textÚengine_namer:  r<  rC  Úerrr9  rB  s	   `      @@r1   Úgenerate_with_sdkrM    sq  øøøè è € å
‡K‚KÐl S¤YÐlÐl¸s¼ÐlÐlÐ[^Ô[eÐfiÐgiÐfiÔ[jÐlÐlÑmÔmÐmà€KØ,€KðlØ>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ý”*—.’.Ð!1Ñ2Ô2ˆØÐ wÐ/Ñ/Ô/ˆð	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)õ $Ô,¨[¨[©]¬]ÀCÐHÑHÔHÐHÐHÐHÐHÐHÐHˆˆøÝð lð lð lØ8ˆÝ,¨S¬YÐ-C¸)ÀSÄ_ÐE^ÐX^Ð`cÔ`jÑkÔkˆˆˆˆˆˆøøøøðløøøð
 ØØ”Ø”Ø×#Ò#Ñ%Ô%ðð ð s   ÁAB$ Â$
CÂ.&CÃCÚ__main__z6Starting Antigravity Studio Bridge Pro v2.1 on http://rü   z...rÄ   )Úhostr[   Ú	log_level)FrÇ   N)rR   )LÚ__doc__rG  ÚsysrØ   r  rÍ   r*   Úloggingr   r	  Úpathlibr   Útypingr   r   r   r   Údotenvr   Úfastapir	   r
   r   Úfastapi.middleware.corsr   Úfastapi.responsesr   r   r   Úpydanticr   Úuvicornra   ÚHOSTÚPROJECT_ROOTÚCONTENT_DIRr¯   ÚTHUMBNAILS_DIRrê   r®   ÚmkdirÚPYTHON_VENVr  ÚbasicConfigÚINFOÚ	getLoggerr  ÚappÚadd_middlewareÚboolr2   rq   r€   r  rA   rO   rr   rc   rJ   rw   r‡   r­   r¾   r³   rÆ   rã   rñ   rU   r  Úpostr-  r6  rM  rG   rÄ   r
  rL   rM   r1   ú<module>ri     sU  ððð ð 
€	€	€	Ø 
€
€
€
Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à Ð Ð Ð Ð Ð Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KØ Ð Ð Ð Ð Ð Ø €€€ð €ˆDˆDÐDÑEÔEÑ FÔ FÐ FØ€Ø€ð ˆtÐ,Ñ-Ô-€Ø˜YÑ&€Ø˜kÑ)€Ø˜|Ñ+€Ø˜8Ñ#€
Ø˜kÑ)€Ø 
× Ò ˜¨Ð Ñ -Ô -Ð -à˜VÑ# iÑ/°,Ñ>€Ø˜FÑ" YÑ.°Ñ=€
ð €Ô Ø
Œ,ØIðñ ô ð ð 
ˆÔ	Ð.Ñ	/Ô	/€ð €gØ
)ØzØðñ ô €ð × Ò Øðð ð ð Ø�%Ø�%ð ñ ô ð ð˜ð ð ð ð ð Ð3Ñ3Ø	˜/Ñ	)Ø	˜/Ñ	)Ø	˜/Ñ	)Ø	˜/Ñ	)Ø	˜/Ñ	)Ø	˜/Ñ	)Ø	˜/Ñ	)Ø	˜/Ñ	)ð
ð 
€ð Ð@Ñ@Ø	˜Ñ	%Ø	˜Ñ	%Ø	˜Ñ	%Ø	˜Ñ	%Ø	˜Ñ	%Ø	˜Ñ	%Ø	˜Ñ	%Ø	˜Ñ	%ð
ð 
€	ð  TÐ4_Ð`Ð`Ø TÐ4gÐhÐhØ TÐ4`ÐaÐaØ TÐ4bÐcÐcØ dÐ5gÐhÐhØ dÐ5eÐfÐfðð  tÐ6eÐ
fÐ
fÐ	gØ dÐ5aÐ
bÐ
bÐ	cØ tÐ6`Ð
aÐ
aÐ	bØ tÐ6bÐ
cÐ
cÐ	dØ dÐ5`Ð
aÐ
aÐ	bØ tÐ6_Ð
`Ð
`Ð	aØ tÐ6fÐ
gÐ
gÐ	hØ dÐ5^Ð
_Ð
_Ð	`ð!ð Ð ð(-ð -ð -ð -ð -�iñ -ô -ð -ð'ð 'ð 'ð 'ð '˜)ñ 'ô 'ð 'ð ‡‚ˆ�„Ø‡‚ˆÑÔØ‡‚ˆÑÔðð ñ Ôñ Ôñ „ðð ‡‚Ð	'Ñ(Ô(ða¨#ð að að añ )Ô(ðað ‡‚Ð	#Ñ$Ô$ðF Sð Fð Fð Fñ %Ô$ðFð<  Ð+;ÈÐ
MÐ
MØ¨	¸dÐ
CÐ
CØ y¸TÐ
BÐ
BØ {¸tÐ
DÐ
DØ¨
¸tÐ
DÐ
DØ¨ÀÐ
FÐ
Fðð Ð ð 'Ð1RÐSÐSØ#Ð.JÐ	KÐ	KØ#Ð.JÐ	KÐ	KØ#Ð.MÐ	NÐ	NØÐ#AÐ	BÐ	BØ#Ð.SÐ	TÐ	TØ#Ð.HÐ	IÐ	IØÐ#@Ð	AÐ	AØÐ#>Ð	?Ð	?ð
ð 
Ð ð 3ð °3ð ¸8ÀD¼>ð ð ð ð ð$ ‡‚Ð	ÑÔð$ð $ñ  Ôð$ðL ‡‚Ð	3Ñ4Ô4ð'Vð 'V Cð 'V°Cð 'VÀ4ð 'VÐY\ð 'VÐltÐuxÔlyð 'Vð 'Vð 'Vñ 5Ô4ð'VðZ ‡‚Ð	ÑÔð#ð #ñ Ôð#ðT ð7ð 7Øð7àð7ð ð7ð ð	7ð
 ð7ð 	ð7ð 7ð 7ð 7ðr ‡‚Ð
ÑÔðEÐ 3ð Eð Eð Eñ  ÔðEðV-L #ð -L°Cð -LÀcð -LÈcð -Lð -Lð -Lð -Lð^ ‡‚ˆ/ÑÔð ð ð ð ñ Ôðð@ ˆzÒÐØ
‡K‚KÐYÈÐYÐYÐPTÐYÐYÐYÑZÔZÐZØ€G„K�˜$ T°VÐ<Ñ<Ô<Ð<Ð<Ð<ð ÐrM   