§
    ½*ËjL  ã                   óö  — 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ZddlZej        dk    rC	 ej                             d¬¦  «         ej                             d¬¦  «         n# e$ r Y nw xY w ee¦  «                             ¦   «         j        j        Zedz  Zed	z  Zed
z  Z ed¦  «        ZdZ dZ!dZ"de#fd„Z$de#de#fd„Z%de#de#fd„Z&de#fd„Z'de#de#fd„Z( G d„ d¦  «        Z)de#defd„Z*	 	 	 	 	 dBde#de#dee#         de+d e,d!e#d"ee)         dee+ee#         f         fd#„Z-e.d$k    �r+ ej/        d%¬&¦  «        Z0e0 1                    d'd(d)¬*¦  «         e0 1                    d+ddd,¬-¦  «         e0 1                    d.dd/¬0¦  «         e0 1                    d1dd2¬0¦  «         e0 1                    d3d(d4¬*¦  «         e0 1                    d5e,dd6¬7¦  «         e0 2                    ¦   «         Z3 e)¦   «         Z4e3j5        rŠ e6d8e4j7        › d9�¦  «         	 e4 8                    ¦   «         Z9ddl:Z: e6 e:j;        e9d:d¬;¦  «        ¦  «         n0# e$ r(Z< e6d<e<› �¦  «          ej=        d=¦  «         Y dZ<[<ndZ<[<ww xY w ej=        d¦  «         e3j>        rÔe3j?        Z@e3jA        ZBe@reBsd	 dd>lCmDZDmEZE  eD¦   «         ZFeF G                    e3j>        i ¦  «        ZHe@seH G                    d?¦  «        Z@eBs eEe3j>        eH¦  «        ZBn# e$ r Y nw xY we@s# e6d@e3j>        › �¦  «          ej=        d=¦  «          e-e3j>        e@eBe3jI        e3jJ        e4¬A¦  «        \  ZKZLeKs ej=        d=¦  «         dS dS dS dS )Cuî  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - MUSE2API CLIENT ENGINE
=============================================================================
Module tÃ­ch há»£p chÃ­nh thá»©c cho cá»•ng dá»‹ch vá»¥ Muse2API Gateway (FastAPI):
- Káº¿t ná»‘i trá»±c tiáº¿p Base URL: http://127.0.0.1:18610 (OpenAI API Compatible /v1)
- Tá»± Ä‘á»™ng náº¡p API Key tá»« c:\Projects\Muse2API\data\api_key hoáº·c biáº¿n mÃ´i trÆ°á»�ng
- Render video I2V / T2V báº¥t Ä‘á»“ng bá»™ (Async Task Pattern: POST /v1/videos -> Poll)
- Tá»± Ä‘á»™ng mÃ£ hÃ³a Start Frame sang Base64 Data URI (lossless PNG/JPEG)
- Ã�p dá»¥ng Audio Guard chuáº©n má»±c vÃ  kiá»ƒm duyá»‡t tá»« khÃ³a nháº¡y cáº£m
- Tá»± Ä‘á»™ng xÃ¡c Ä‘á»‹nh versioning (_v1, _v2...), táº£i file MP4, xá»­ lÃ½ reverse motion,
  tÃ­ch há»£p Ã¢m thanh chuyÃªn biá»‡t vÃ  trÃ­ch xuáº¥t Tail Frame cho Head-Tail Chaining.
=============================================================================
é    N)ÚPath)ÚOptionalÚTupleÚDictÚAnyÚwin32úutf-8©ÚencodingÚ	04_AssetsÚvideosÚ	keyframesz!c:\Projects\Muse2API\data\api_keyz$m2a--nqA-RT1mZ4AWalrdDVzSYkhI9Cksd8Ozhttp://127.0.0.1:18610uò    Quy táº¯c Ã¢m thanh: Tuyá»‡t Ä‘á»‘i KHÃ”NG sinh nháº¡c ná»�n (no music/BGM), khÃ´ng Ã¢m thanh Ä‘iá»‡n tá»­, khÃ´ng táº¡p Ã¢m rÃ¨ nhiá»…u. Chá»‰ sinh Ã¢m thanh mÃ´i trÆ°á»�ng tá»± nhiÃªn (foley, ambience) vÃ  thoáº¡i nhÃ¢n váº­t chÃ¢n thá»±c.Úreturnc                  óº   — t          t          j        ¦  «        j        dz  } |                      ¦   «         rt          | ¦  «        S t          j        d¦  «        rdS dS )u0   XÃ¡c Ä‘á»‹nh Ä‘Æ°á»�ng dáº«n nhá»‹ phÃ¢n FFmpeg.z
ffmpeg.exeÚffmpeg)r   ÚsysÚ
executableÚparentÚexistsÚstrÚshutilÚwhich)Úexes    ú?C:\Projects\KieuStory\05_Production_Pipeline\muse_api_client.pyÚ
get_ffmpegr   5   sP   € å
�sŒ~Ñ
Ô
Ô
%¨Ñ
4€CØ
‡z‚z�|„|ð Ý�3‰xŒxˆÝ„|�HÑÔð ØˆxØˆ8ó    Úpromptc                 ón   — | s| S g d¢}| }|D ]'\  }}t          j        |||t           j        ¬¦  «        }Œ(|S )uU   Thanh lá»�c tá»« khÃ³a nháº¡y cáº£m kÃ­ch hoáº¡t bá»™ lá»�c kiá»ƒm duyá»‡t Meta/Muse.))uV   \b(náº¥m má»“|má»“ máº£|nghÄ©a Ä‘á»‹a|má»™ Ä‘á»‹a|má»™ pháº§n|ngÃ´i má»™|ngÃ´i máº£)\bu"   gÃ² Ä‘áº¥t phá»§ cá»� Ãºa xÆ°a cÅ©)u-   \b(Ã¢m khÃ­|tá»­ khÃ­|Ã¢m khÃ­ náº·ng ná»�)\bu)   giÃ³ láº¡nh chiá»�u tÃ  se sáº¯t hoang vu)u8   \b(khÃ³c ngÆ°á»�i Ä‘á»�i xÆ°a|khÃ³c than báº¡c má»‡nh)\bu)   nghiÃªng mÃ¬nh tráº§m tÆ° Ä‘Æ°á»£m buá»“n)u0   \b(ráº£i vÃ ng mÃ£|tiá»�n vÃ ng mÃ£|vÃ ng mÃ£)\bu)   tháº¯p nÃ©n hÆ°Æ¡ng tráº§m pháº£ng pháº¥t)u9   \b(xÆ°Æ¡ng tÃ n|xÆ°Æ¡ng cá»‘t|xÃ¡c cháº¿t|cháº¿t chÃ³c)\bu   dáº¥u tÃ­ch xÆ°a cÅ©)u   \b(báº¡c má»‡nh)\bu   sá»‘ pháº­n long Ä‘ong)Úflags)ÚreÚsubÚ
IGNORECASE)r   ÚreplacementsÚcleanedÚpatternÚrepls        r   Úsanitize_promptr'   ?   s]   € àð Øˆðð ð €Lð €GØ%ð Fð F‰ˆ�Ý”&˜ $¨µr´}ÐEÑEÔEˆˆØ€Nr   c                 ó¢   — | st                                ¦   «         S t          | ¦  «        } d| vr d| vr|                      ¦   «         t           z   S | S )uK   Ä�áº£m báº£o prompt tuÃ¢n thá»§ chá»‰ thá»‹ Audio Guard cáº¥m nháº¡c ná»�n.u'   Tuyá»‡t Ä‘á»‘i KHÃ”NG sinh nháº¡c ná»�nzStrictly NO background music)ÚAUDIO_GUARD_CANONICALÚstripr'   Úrstrip)r   s    r   Úensure_audio_guardr,   Q   sY   € àð -Ý$×*Ò*Ñ,Ô,Ð,Ý˜VÑ$Ô$€FØ0¸Ð>Ð>ÐCaÐioÐCoÐCoØ�}Š}‰ŒÕ!6Ñ6Ð6Ø€Mr   c                  óZ  — t           j                             d¦  «        } | r(|                      ¦   «         r|                      ¦   «         S t                               ¦   «         rC	 t                               d¬¦  «                             ¦   «         }|r|S n# t          $ r Y nw xY wt          S )uX   Ä�á»�c API Key theo thá»© tá»± Æ°u tiÃªn: Env Var -> Local Key File -> Fallback Default.ÚMUSE_API_KEYr	   r
   )	ÚosÚenvironÚgetr*   ÚLOCAL_KEY_FILEr   Ú	read_textÚ	ExceptionÚDEFAULT_FALLBACK_KEY)Úenv_keyÚcontents     r   Úresolve_api_keyr8   [   s¯   € åŒj�nŠn˜^Ñ,Ô,€GØð �7—=’=‘?”?ð Ø�}Š}‰ŒÐå×ÒÑÔð ð	Ý$×.Ò.¸Ð.Ñ@Ô@×FÒFÑHÔHˆGØð Ø�ðøåð 	ð 	ð 	ØˆDð	øøøõ  Ðs   Á$0B Â
B#Â"B#Ú
image_pathc                 óÊ  — t          | ¦  «                             ¦   «         }|                     ¦   «         st          d| › �¦  «        ‚t	          j        t          |¦  «        ¦  «        \  }}|s4|j                             ¦   «         }|dv rd}n|dk    rd}n|dk    rd}nd}| 	                    ¦   «         }t          j        |¦  «                             d	¦  «        }d
|› d|› �S )u>   Chuyá»ƒn Ä‘á»•i tá»‡p áº£nh cá»¥c bá»™ thÃ nh Base64 Data URI.u   KhÃ´ng tÃ¬m tháº¥y file áº£nh: )z.jpgz.jpegz
image/jpegz.pngz	image/pngz.webpz
image/webpzapplication/octet-streamÚasciiúdata:z;base64,)r   ÚresolveÚis_fileÚFileNotFoundErrorÚ	mimetypesÚ
guess_typer   ÚsuffixÚlowerÚ
read_bytesÚbase64Ú	b64encodeÚdecode)r9   ÚpÚmimeÚ_ÚextÚ	raw_bytesÚb64_strs          r   Úencode_image_to_data_urirN   l   sï   € åˆZÑÔ× Ò Ñ"Ô"€AØ�9Š9‰;Œ;ð PÝÐ NÀ*Ð NÐ NÑOÔOÐOåÔ"¥3 q¡6¤6Ñ*Ô*�G€Dˆ!Øð 	.ØŒh�nŠnÑÔˆØÐ#Ð#Ð#ØˆDˆDØ�FŠ]ˆ]ØˆDˆDØ�GŠ^ˆ^ØˆDˆDà-ˆDà—’‘”€IÝÔ˜yÑ)Ô)×0Ò0°Ñ9Ô9€GØ*�4Ð*Ð* Ð*Ð*Ð*r   c                   óú   — e Zd ZdZd!dee         dee         fd„Zd"dedeee	f         fd	„Z
d#dedefd„Z	 	 	 	 	 d$dedee         dededededefd„Z	 	 	 d%dededededeee	f         f
d„Zd&dedededefd „ZdS )'ÚMuseApiClientu?   Client giao tiáº¿p trá»±c tiáº¿p vá»›i cá»•ng Muse2API Gateway.NÚbase_urlÚapi_keyc                 óÔ   — |p%t           j                             d¦  «        pt                               d¦  «        | _        |pt          ¦   «         | _        d| j        › �ddœ| _        d S )NÚMUSE_API_BASE_URLú/zBearer zapplication/json)ÚAuthorizationzContent-Type)	r/   r0   r1   ÚDEFAULT_BASE_URLr+   rQ   r8   rR   Úheaders)ÚselfrQ   rR   s      r   Ú__init__zMuseApiClient.__init__†   sf   € Ø!Ð\¥R¤Z§^¢^Ð4GÑ%HÔ%HÐ\ÕL\×dÒdÐehÑiÔiˆŒØÐ3¥/Ñ"3Ô"3ˆŒà5 t¤|Ð5Ð5Ø.ð
ð 
ˆŒˆˆr   ç      @Útimeoutr   c                 ó’   — | j         › d�}t          j        ||¬¦  «        }|                     ¦   «          |                     ¦   «         S )u^   Kiá»ƒm tra sá»©c khá»�e cá»•ng dá»‹ch vá»¥ vÃ  tráº¡ng thÃ¡i bá»ƒ tÃ i khoáº£n (Account Pool).z/readyz©r\   )rQ   Úrequestsr1   Úraise_for_statusÚjson)rY   r\   ÚurlÚresps       r   Úcheck_healthzMuseApiClient.check_healthŽ   sF   € à”Ð'Ð'Ð'ˆÝŒ|˜C¨Ð1Ñ1Ô1ˆØ×ÒÑÔÐØ�yŠy‰{Œ{Ðr   ç       @c                 ó˜   — 	 |                       |¬¦  «        }t          |                     dd¦  «        ¦  «        S # t          $ r Y dS w xY w)u<   Kiá»ƒm tra nhanh xem Muse2API cÃ³ Ä‘ang pháº£n há»“i khÃ´ng.r^   ÚreadyF)rd   Úboolr1   r4   )rY   r\   Údatas      r   Úis_availablezMuseApiClient.is_available•   s[   € ð	Ø×$Ò$¨WÐ$Ñ5Ô5ˆDÝ˜Ÿš ¨%Ñ0Ô0Ñ1Ô1Ð1øÝð 	ð 	ð 	Ø�5�5ð	øøøs   ‚8; »
A	ÁA	Úsoraú16:9é   ç      >@r   ÚimageÚmodelÚsizeÚdurationc                 ó|  — |t          |¦  «        ||dœ}|r-|                     d¦  «        r||d<   nt          |¦  «        |d<   | j        › d�}t	          j        || j        ||¬¦  «        }	|	                     ¦   «          |	                     ¦   «         }
|
 	                    d¦  «        }|st          d|
› �¦  «        ‚|S )u€   
        Gá»­i yÃªu cáº§u táº¡o video (Text-to-Video hoáº·c Image-to-Video).
        Tráº£ vá»� task_id (vd: vid_xxxx).
        )rp   r   rq   rr   )r<   zhttp://zhttps://ro   z
/v1/videos)rX   ra   r\   Úidu/   Muse2API khÃ´ng tráº£ vá»� task_id há»£p lá»‡: )r,   Ú
startswithrN   rQ   r_   ÚpostrX   r`   ra   r1   ÚRuntimeError)rY   r   ro   rp   rq   rr   r\   Úpayloadrb   rc   ri   Útask_ids               r   Úcreate_video_taskzMuseApiClient.create_video_task�   sæ   € ð Ý(¨Ñ0Ô0ØØ ð	
ð 
ˆð ð 	CØ×ÒÐ @ÑAÔAð CØ#(�˜Ñ Ð õ $<¸EÑ#BÔ#B�˜Ñ à”Ð*Ð*Ð*ˆÝŒ}˜S¨$¬,¸WÈgÐVÑVÔVˆØ×ÒÑÔÐØ�yŠy‰{Œ{ˆØ—(’(˜4‘.”.ˆØð 	YÝÐWÐQUÐWÐWÑXÔXÐXØˆr   ç     À’@ç      @Try   Úpoll_intervalÚverbosec           	      ó’  — | j         › d|› �}t          j        ¦   «         }d}t          j        ¦   «         |z
  |k     �rvt          j        |¦  «         	 t          j        || j        d¬¦  «        }|                     ¦   «          |                     ¦   «         }	n,# t          $ r}
|rt          d|
› d�¦  «         Y d}
~
Œ™d}
~
ww xY w|	                     d¦  «        }|	                     d	d
¦  «        }|r3||k    r-t          d|› d| 
                    ¦   «         › d|› d�¦  «         |}|dk    rB|	                     d¦  «        pi }|                     d¦  «        }|st          d|	› �¦  «        ‚|	S |dk    r'|	                     d¦  «        }t          d|› �¦  «        ‚t          j        ¦   «         |z
  |k     �°vt          d|› d|› d�¦  «        ‚)u    
        Láº·p theo dÃµi tiáº¿n Ä‘á»™ táº¡o video cho Ä‘áº¿n khi hoÃ n thÃ nh hoáº·c lá»—i.
        Tráº£ vá»� thÃ´ng tin káº¿t quáº£ chá»©a URL video.
        z/v1/videos/éÿÿÿÿg      .@)rX   r\   u8         [~] Táº¡m thá»�i máº¥t káº¿t ná»‘i tá»›i gateway (u   ), Ä‘ang thá»­ láº¡i...NÚstatusÚprogressr   z      [API Task u   ] Tráº¡ng thÃ¡i: ú (z%)Ú	succeededÚresultrb   u,   Task thÃ nh cÃ´ng nhÆ°ng thiáº¿u URL video: ÚfailedÚerroru(   Táº¡o video tháº¥t báº¡i tá»« Muse2API: u%   Háº¿t thá»�i gian chá»� táº¡o video (zs) cho task ú.)rQ   ÚtimeÚsleepr_   r1   rX   r`   ra   r4   ÚprintÚupperrw   ÚTimeoutError)rY   ry   r\   r}   r~   rb   ÚstartedÚlast_progressrc   ri   Úer�   r‚   r…   Ú	video_urlÚerrs                   r   Úpoll_video_taskzMuseApiClient.poll_video_taskÁ   s  € ð ”Ð4Ð4¨7Ð4Ð4ˆÝ”)‘+”+ˆØˆåŒi‰kŒk˜GÑ# gÒ-Ñ-ÝŒJ�}Ñ%Ô%Ð%ðÝ”| C°´ÀtÐLÑLÔL�Ø×%Ò%Ñ'Ô'Ð'Ø—y’y‘{”{��øÝð ð ð Øð qÝÐoÐUVÐoÐoÐoÑpÔpÐpØ����øøøøðøøøð
 —X’X˜hÑ'Ô'ˆFØ—x’x 
¨AÑ.Ô.ˆHàð )˜8 }Ò4Ð4ÝÐa¨ÐaÐaÀ6Ç<Â<Á>Ä>ÐaÐaÐU]ÐaÐaÐaÑbÔbÐbØ (�à˜Ò$Ð$ØŸš (Ñ+Ô+Ð1¨r�Ø"ŸJšJ uÑ-Ô-�	Ø ð ^Ý&Ð'\ÐVZÐ'\Ð'\Ñ]Ô]Ð]Ø�à˜Ò!Ð!Ø—h’h˜wÑ'Ô'�Ý"Ð#SÈcÐ#SÐ#SÑTÔTÐTõ7 Œi‰kŒk˜GÑ# gÒ-Ñ-õ: ÐbÀ7ÐbÐbÐX_ÐbÐbÐbÑcÔcÐcs   ÁAB Â
C Â!B;Â;C ç      ^@Ú	media_urlÚoutput_pathc                 óÂ  — |j                              dd¬¦  «         t          j        || j        d|¬¦  «        }|                     ¦   «          |                     |j        › d�¦  «        }t          |d¦  «        5 }| 	                    d¬¦  «        D ]}|r| 
                    |¦  «         Œ	 ddd¦  «         n# 1 swxY w Y   |                     ¦   «         rN|                     ¦   «         j        d	k    r1t          j        t!          |¦  «        t!          |¦  «        ¦  «         |S |                     ¦   «         r|                     ¦   «          t%          d
|› d�¦  «        ‚)u7   Táº£i video MP4 tá»« Muse2API vÃ  lÆ°u vÃ o á»• cá»©ng.T©ÚparentsÚexist_ok)rX   Ústreamr\   z.downloadingÚwbi   )Ú
chunk_sizeNéè  u   File táº£i vá»� tá»« u&    bá»‹ rá»—ng hoáº·c khÃ´ng há»£p lá»‡.)r   Úmkdirr_   r1   rX   r`   Ú	with_nameÚnameÚopenÚiter_contentÚwriter   ÚstatÚst_sizer   Úmover   Úunlinkrw   )rY   r•   r–   r\   rc   Ú	temp_fileÚfÚchunks           r   Údownload_mediazMuseApiClient.download_mediaï   s�  € àÔ× Ò ¨¸Ð Ñ=Ô=Ð=ÝŒ|˜I¨t¬|ÀDÐRYÐZÑZÔZˆØ×ÒÑÔÐà×)Ò)¨[Ô-=Ð*KÐ*KÐ*KÑLÔLˆ	Ý�)˜TÑ"Ô"ð 	# aØ×*Ò*°eÐ*Ñ<Ô<ð #ð #�Øð #Ø—G’G˜E‘N”N�Nøð#ð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð
 ×ÒÑÔð 	j )§.¢.Ñ"2Ô"2Ô":¸TÒ"AÐ"AÝŒK�˜I™œ­¨KÑ(8Ô(8Ñ9Ô9Ð9ØÐà×ÒÑ!Ô!ð #Ø× Ò Ñ"Ô"Ð"ÝÐh°yÐhÐhÐhÑiÔiÐis   Á;1B9Â9B=Ã B=)NN)r[   )re   )Nrk   rl   rm   rn   )r{   r|   T)r”   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   rZ   Úfloatr   r   rd   rh   rj   Úintrz   r“   r   r¬   © r   r   rP   rP   ƒ   sº  € € € € € ØIÐIð
ð 
 ¨#¤ð 
ÀÈÄð 
ð 
ð 
ð 
ðð  Eð °D¸¸c¸´Nð ð ð ð ðð  Eð °Dð ð ð ð ð  $ØØØØð"ð "àð"ð ˜Œ}ð"ð ð	"ð
 ð"ð ð"ð ð"ð 
ð"ð "ð "ð "ðN  Ø"Øð,dð ,dàð,dð ð,dð ð	,dð
 ð,dð 
ˆc�3ˆhŒð,dð ,dð ,dð ,dð\jð j¨ð j¸$ð jÈð jÐ[_ð jð jð jð jð jð jr   rP   Úshot_idc                 ó  — t                                dd¬¦  «         t          j        dt          j        | ¦  «        › d�t          j        ¦  «        }d}d}t                                | › d�¦  «        D ]U}|                     |j        ¦  «        }|r7| 	                    d¦  «        }|�t          |t          |¦  «        ¦  «        }ŒSd}ŒVt          |dz   |r|dk    rd
n|dz   ¦  «        }t           |dk    s|r| › d|› d�n| › d�z  S )uF   Tá»± Ä‘á»™ng xÃ¡c Ä‘á»‹nh tÃªn version tiáº¿p theo (_v1, _v2, _v3...).Tr˜   ú^z_10s(?:_v(\d+))?\.mp4$r   Fz	_10s*.mp4é   Né   Ú_10s_vz.mp4z_10s.mp4)Ú
VIDEOS_DIRrŸ   r    ÚcompileÚescaper"   ÚglobÚmatchr¡   ÚgroupÚmaxr²   )r´   r%   Ú	highest_vÚhas_unversionedrª   ÚmÚv_numÚnext_vs           r   Úget_next_video_pathrÆ     s  € å×Ò˜T¨DÐÑ1Ô1Ð1ÝŒjÐH�bœi¨Ñ0Ô0ÐHÐHÐHÍ"Ì-ÑXÔX€GØ€IØ€OÝ�_Š_ Ð2Ð2Ð2Ñ3Ô3ð 'ð 'ˆØ�MŠM˜!œ&Ñ!Ô!ˆØð 	'Ø—G’G˜A‘J”JˆEØÐ Ý 	­3¨u©:¬:Ñ6Ô6�	�	à"&�øÝ�˜Q‘ _Ð Z¸Àaº¸  ÈYÐYZÉ]Ñ[Ô[€FÝ¸IÈºM¸MÈ_¸M˜GÐ7Ð7¨6Ð7Ð7Ð7Ð7ÐfmÐcwÐcwÐcwÑxÐxr   Frm   rl   Úinput_frameÚreverse_motionrr   rq   Úclientc                 ó¶  — |€t          ¦   «         }t          d|j        › d|j        dd…         › d�¦  «         	 |                     d¬¦  «        }|                     di ¦  «        }t          d	|                     d
d¦  «        › d|                     dd¦  «        › d�¦  «         n*# t          $ r}	t          d|	› �¦  «         Y d}	~	dS d}	~	ww xY wt          | ¦  «        }
t          d|
j        › �¦  «         |rnt          |¦  «        }| 
                    ¦   «         r6t          d|j        › d|                     ¦   «         j        dz  › d�¦  «         nt          d|› d�¦  «         d}	 |                     ||d||¬¦  «        }t          d|› d�¦  «         n*# t          $ r}	t          d|	› �¦  «         Y d}	~	dS d}	~	ww xY w	 |                     |dd¬¦  «        }|d          d!         }t          d"|› d#�¦  «         n*# t          $ r}	t          d$|	› �¦  «         Y d}	~	dS d}	~	ww xY w	 |                     ||
¦  «         t          d%|
› �¦  «         n*# t          $ r}	t          d&|	› �¦  «         Y d}	~	dS d}	~	ww xY w|�r%t          d'¦  «         |
                     |
j        › d(�¦  «        }t%          ¦   «         }|d)d*t'          |
¦  «        d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:t'          |¦  «        g}t)          j        |d;d;¬<¦  «        }|j        dk    rp| 
                    ¦   «         r\|                     ¦   «         j        d=k    r?t/          j        t'          |¦  «        t'          |
¦  «        ¦  «         t          d>¦  «         n(| 
                    ¦   «         r|                     ¦   «          d}t4          d?z  t4          d@z  t4          dAz  fD ]A}| 
                    ¦   «         sŒdBD ]#}|| › |› �z  }| 
                    ¦   «         r|} nŒ$|r nŒB|�r6t          dC|j        › dD�¦  «         |
                     |
j        › dE�¦  «        }t%          ¦   «         }|d)d*t'          |
¦  «        d*t'          |¦  «        d/dFd5d6d7d8d9d:dGt'          |¦  «        g}t)          j        |d;d;¬<¦  «        }|j        dk    rp| 
                    ¦   «         r\|                     ¦   «         j        d=k    r?t/          j        t'          |¦  «        t'          |
¦  «        ¦  «         t          dH¦  «         n(| 
                    ¦   «         r|                     ¦   «          t          dI¦  «         t6          | z  }|                     d;d;¬J¦  «         |dKz  }t;          j        t'          |
¦  «        ¦  «        }t?          |                     t:          j         ¦  «        ¦  «        }| !                    t:          j"        tG          d|dLz
  ¦  «        ¦  «         | $                    ¦   «         \  }}| %                    ¦   «          |r7|�5t;          j&        t'          |¦  «        |¦  «         t          dM|› �¦  «         nZt          dN¦  «         t%          ¦   «         }|d)dOdPd*t'          |
¦  «        dQdRdSdTt'          |¦  «        g} t)          j        | d;¬U¦  «         t          dV|
j        › dW|j        › dX�¦  «         d;t'          |¦  «        fS )Yu  
    Quy trÃ¬nh render hoÃ n chá»‰nh cho 1 Shot thÃ´ng qua Muse2API Gateway:
    1. Kiá»ƒm tra káº¿t ná»‘i gateway
    2. Gá»­i tÃ¡c vá»¥ POST /v1/videos (kÃ¨m First-Frame Base64 náº¿u cÃ³)
    3. GiÃ¡m sÃ¡t polling Ä‘áº¿n khi hoÃ n táº¥t
    4. Táº£i video MP4 vá»� 04_Assets/videos/<shot_id>_10s_v<N>.mp4
    5. Ä�áº£o ngÆ°á»£c chuyá»ƒn Ä‘á»™ng FFmpeg (náº¿u reverse_motion=True)
    6. Muxing Ã¢m thanh chuyÃªn biá»‡t (náº¿u cÃ³ SFX / Voice)
    7. TrÃ­ch xuáº¥t Tail Frame (clean_frame_239.jpg) phá»¥c vá»¥ Head-Tail Chaining.
    Nu3         âš¡ [Muse2API] Báº¯t Ä‘áº§u gá»�i API tá»›i: z (Key: é   z***)...r[   r^   Úaccountsu"         âœ“ Gateway trá»±c tuyáº¿n: Ú	availabler   rU   Útotalu    tÃ i khoáº£n kháº£ dá»¥ng.u4         [!] Lá»—i káº¿t ná»‘i tá»›i Muse2API Gateway: )FNu&         ðŸŽ¯ Ä�Ã­ch xuáº¥t báº£n video: u         ðŸ–¼ï¸� Start Frame: rƒ   i   z KB)u-         âš ï¸� Start Frame khÃ´ng tá»“n táº¡i: u   , chuyá»ƒn sang Text-to-Video.rk   )r   ro   rp   rq   rr   u'         âœ“ Ä�Ã£ khá»Ÿi táº¡o tÃ¡c vá»¥: u   , báº¯t Ä‘áº§u theo dÃµi...u0         [!] KhÃ´ng thá»ƒ khá»Ÿi táº¡o task video: r{   r|   )r\   r}   r…   rb   u/         âœ“ Render hoÃ n táº¥t! Ä�ang táº£i tá»« ú...u1         [!] QuÃ¡ trÃ¬nh render video tháº¥t báº¡i: u*         âœ“ Ä�Ã£ táº£i vÃ  lÆ°u video vÃ o: u0         [!] KhÃ´ng thá»ƒ táº£i video káº¿t quáº£: uE         ðŸ”„ Ä�ang Ä‘áº£o ngÆ°á»£c chuyá»ƒn Ä‘á»™ng video qua FFmpeg...z_rev_temp.mp4z-yz-iz-vfÚreversez-afÚareversez-c:vÚlibx264z-crfÚ18z-presetÚslowz-c:aÚaacz-b:aÚ192kz-arÚ48000T)Úcapture_outputÚtextrž   u<         âœ“ Ä�Ã£ Ä‘áº£o ngÆ°á»£c video vÃ  audio thÃ nh cÃ´ng!Ú	audio_sfxÚaudio_voiceÚaudio)z.wavz.m4az.mp3z.aacu2         ðŸŽµ PhÃ¡t hiá»‡n Ã¢m thanh chuyÃªn biá»‡t: u!   . Ä�ang tÃ­ch há»£p vÃ o video...z_mux_temp.mp4Úcopyz	-shortestu7         âœ“ Ä�Ã£ gáº¯n Ã¢m thanh vÃ o video thÃ nh cÃ´ng!uC         ðŸ“¸ Ä�ang trÃ­ch xuáº¥t Tail Frame cho Head-Tail Chaining...r˜   zclean_frame_239.jpgr·   u)         âœ“ Ä�Ã£ trÃ­ch xuáº¥t Tail Frame: uW         âš ï¸� KhÃ´ng thá»ƒ trÃ­ch xuáº¥t tail frame báº±ng OpenCV, thá»­ dÃ¹ng FFmpeg...z-sseofz-0.1z-vframesÚ1z-q:vÚ2)rØ   u,   
[âœ“] HOÃ€N Táº¤T THÃ€NH CÃ”NG (Muse2API): z
 -> Tail: ú
)'rP   r‹   rQ   rR   rd   r1   r4   rÆ   r¡   r   r   r¥   r¦   rz   r“   r¬   r    Ústemr   r   Ú
subprocessÚrunÚ
returncoder   r§   r¨   Ú
ASSETS_DIRÚKEYFRAMES_DIRrŸ   Úcv2ÚVideoCapturer²   ÚCAP_PROP_FRAME_COUNTÚsetÚCAP_PROP_POS_FRAMESrÀ   ÚreadÚreleaseÚimwrite)!r´   r   rÇ   rÈ   rr   rq   rÉ   ÚhealthÚacc_infor�   Útarget_video_pathÚp_framery   Ú	task_datar‘   Útemp_reversedÚ
ffmpeg_binÚcmd_revÚres_revÚ
audio_candÚa_dirrK   ÚafÚ
temp_muxedÚcmd_muxÚres_muxÚshot_kf_dirÚtail_frame_pathÚcapÚtotal_framesÚretÚ
tail_frameÚcmd_tfs!                                    r   Úrender_shot_via_apir    sþ  € ð& €~Ý‘”ˆå	Ð
sÀÄÐ
sÐ
sÐX^ÔXfÐgiÐhiÐgiÔXjÐ
sÐ
sÐ
sÑtÔtÐtðØ×$Ò$¨SÐ$Ñ1Ô1ˆØ—:’:˜j¨"Ñ-Ô-ˆÝð  H°8·<²<ÀÈQÑ3OÔ3Oð  Hð  HÐRZ×R^ÒR^Ð_fÐhiÑRjÔRjð  Hð  Hð  Hñ  	Iô  	Ið  	Ið  	IøÝð ð ð ÝÐHÀQÐHÐHÑIÔIÐIØˆ{ˆ{ˆ{ˆ{ˆ{øøøøðøøøõ
 ,¨GÑ4Ô4ÐÝ	Ð
KÐ3DÔ3IÐ
KÐ
KÑLÔLÐLàð Ý�{Ñ#Ô#ˆØ�>Š>ÑÔð 	ÝÐd°´ÐdÐdÀÇÂÁÄÔ@VÐZ^Ñ@^ÐdÐdÐdÑeÔeÐeÐeåÐmÀ+ÐmÐmÐmÑnÔnÐnØˆKðØ×*Ò*ØØØØØð +ñ 
ô 
ˆõ 	Ð\¸Ð\Ð\Ð\Ñ]Ô]Ð]Ð]øÝð ð ð ÝÐDÀÐDÐDÑEÔEÐEØˆ{ˆ{ˆ{ˆ{ˆ{øøøøðøøøð
Ø×*Ò*¨7¸FÐRUÐ*ÑVÔVˆ	Ø˜hÔ'¨Ô.ˆ	ÝÐNÀ	ÐNÐNÐNÑOÔOÐOÐOøÝð ð ð ÝÐEÀ!ÐEÐEÑFÔFÐFØˆ{ˆ{ˆ{ˆ{ˆ{øøøøðøøøð
Ø×Ò˜iÐ):Ñ;Ô;Ð;ÝÐNÐ;LÐNÐNÑOÔOÐOÐOøÝð ð ð ÝÐDÀÐDÐDÑEÔEÐEØˆ{ˆ{ˆ{ˆ{ˆ{øøøøðøøøð
 ñ #ÝÐVÑWÔWÐWØ)×3Ò3Ð7HÔ7MÐ4\Ð4\Ð4\Ñ]Ô]ˆÝ‘\”\ˆ
à˜Ø•#Ð'Ñ(Ô(Ø�9Ø�:Ø�I˜v t¨Y¸Ø�E˜6 6¨5°'Ý�ÑÔð
ˆõ ”. ¸ÀDÐIÑIÔIˆØÔ Ò"Ð" }×';Ò';Ñ'=Ô'=Ð"À-×BTÒBTÑBVÔBVÔB^ÐaeÒBeÐBeÝŒK�˜MÑ*Ô*­CÐ0AÑ,BÔ,BÑCÔCÐCÝÐQÑRÔRÐRÐRØ×!Ò!Ñ#Ô#ð 	#Ø× Ò Ñ"Ô"Ð"ð €JÝ˜{Ñ*­J¸Ñ,FÍ
ÐU\ÑH\Ð]ð 	ð 	ˆØ�|Š|‰~Œ~ð 	ØØ3ð 	ð 	ˆCØ˜GÐ* SÐ*Ð*Ñ*ˆBØ�yŠy‰{Œ{ð Ø�
Ø�ðð ð 	ØˆEð	ð ñ  ÝÐuÀ:Ä?ÐuÐuÐuÑvÔvÐvØ&×0Ò0Ð4EÔ4JÐ1YÐ1YÐ1YÑZÔZˆ
Ý‘\”\ˆ
à˜Ø•#Ð'Ñ(Ô(Ø•#�j‘/”/Ø�FØ�E˜6 6¨5°'ØÝ�
‰OŒOð
ˆõ ”. ¸ÀDÐIÑIÔIˆØÔ Ò"Ð" z×'8Ò'8Ñ':Ô':Ð"¸z¿ºÑ?PÔ?PÔ?XÐ[_Ò?_Ð?_ÝŒK�˜J™œ­Ð->Ñ)?Ô)?Ñ@Ô@Ð@ÝÐLÑMÔMÐMÐMØ×ÒÑ Ô ð 	 Ø×ÒÑÔÐõ 
Ð
PÑQÔQÐQÝ 'Ñ)€KØ×Ò˜d¨TÐÑ2Ô2Ð2Ø!Ð$9Ñ9€Oå
Ô
�3Ð0Ñ1Ô1Ñ
2Ô
2€CÝ�s—w’w�sÔ7Ñ8Ô8Ñ9Ô9€LØ‡G‚G�CÔ#¥S¨¨L¸1Ñ,<Ñ%=Ô%=Ñ>Ô>Ð>Ø—h’h‘j”j�O€CˆØ‡K‚K�M„M€Mà
ð 4ˆzÐ%ÝŒ•C˜Ñ(Ô(¨*Ñ5Ô5Ð5ÝÐK¸/ÐKÐKÑLÔLÐLÐLåÐhÑiÔiÐiÝ‘\”\ˆ
à˜Ø�fØ•#Ð'Ñ(Ô(Ø˜Ø�CÝ�Ñ Ô ð
ˆõ 	Œ�v¨dÐ3Ñ3Ô3Ð3å	Ð
tÐ:KÔ:PÐ
tÐ
tÐ\kÔ\pÐ
tÐ
tÐ
tÑuÔuÐuØ•�_Ñ%Ô%Ð%Ð%s`   ºA*B% Â%
CÂ/CÃCÅ&-F Æ
F;ÆF6Æ6F;Æ?9G9 Ç9
H ÈHÈH È$(I É
I4ÉI/É/I4Ú__main__u5   Muse2API Client - Kiá»ƒm tra vÃ  render video qua API)Údescriptionz--healthÚ
store_trueu6   Kiá»ƒm tra tráº¡ng thÃ¡i gateway vÃ  pool tÃ i khoáº£n)ÚactionÚhelpz--shotu<   MÃ£ Ä‘á»‹nh danh shot cáº§n render (vd: ep01_scene02_shot04))ÚdestÚdefaultr
  z--promptu    Prompt mÃ´ táº£ chuyá»ƒn Ä‘á»™ng)r  r
  z--input-frameu   Ä�Æ°á»�ng dáº«n Start Framez	--reverseu   KÃ­ch hoáº¡t reverse motionz
--durationu   Thá»�i lÆ°á»£ng video (giÃ¢y))Útyper  r
  u'   Kiá»ƒm tra káº¿t ná»‘i tá»›i Muse2API: rÏ   r¸   )ÚindentÚensure_asciiu   Lá»—i: r·   )Úget_all_shotsÚresolve_start_frameÚmotion_promptu+   Lá»—i: KhÃ´ng tÃ¬m tháº¥y prompt cho shot: )r´   r   rÇ   rÈ   rr   rÉ   )NFrm   rl   N)Mr°   r/   r   r    r‰   rE   r@   Úargparserâ   r   Úpathlibr   Útypingr   r   r   r   rç   r_   ÚplatformÚstdoutÚreconfigureÚstderrr4   Ú__file__r=   r   ÚBASE_DIRrå   rº   ræ   r2   r5   rW   r)   r   r   r'   r,   r8   rN   rP   rÆ   rh   r²   r  r­   ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsrÉ   rï   r‹   rQ   rd   Úhra   Údumpsr�   Úexitr´   r   rH   rÇ   rª   Úproduction_orchestratorr  r  Úall_sr1   Ús_datarÐ   rr   ÚokÚtailr³   r   r   ú<module>r)     s6  ððð ð 
€	€	€	Ø 
€
€
€
Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à 
€
€
€
Ø €€€ð „<�7ÒÐðØŒ
×Ò¨ÐÑ0Ô0Ð0ØŒ
×Ò¨ÐÑ0Ô0Ð0Ð0øØð ð ð Øˆðøøøð ˆ4�‰>Œ>×!Ò!Ñ#Ô#Ô*Ô1€Ø˜Ñ#€
Ø˜(Ñ"€
Ø˜[Ñ(€à�Ð:Ñ;Ô;€Ø=Ð Ø+Ð ð MÐ ð�Cð ð ð ð ð˜Cð  Cð ð ð ð ð$˜sð  sð ð ð ð ð ˜ð  ð  ð  ð  ð"+¨ð +°ð +ð +ð +ð +ð.~jð ~jð ~jð ~jð ~jñ ~jô ~jð ~jðBy ð y¨ð yð yð yð yð* "&Ø ØØØ&*ð_&ð _&Øð_&àð_&ð ˜#”ð_&ð ð	_&ð
 ð_&ð ð_&ð �]Ô#ð_&ð ˆ4�˜#”ÐÔð_&ð _&ð _&ð _&ðD ˆzÒÑØ$ˆXÔ$Ð1hÐiÑiÔi€FØ
×Ò˜
¨<Ð>vÐÑwÔwÐwØ
×Ò˜ y¸$ð  FDÐñ  Eô  Eð  EØ
×Ò˜
¨DÐ7YÐÑZÔZÐZØ
×Ò˜°Ð<YÐÑZÔZÐZØ
×Ò˜¨LÐ?\ÐÑ]Ô]Ð]Ø
×Ò˜¨3¸Ð@_ÐÑ`Ô`Ð`Ø×ÒÑÔ€Dàˆ]‰_Œ_€Fà„{ð 	ØˆÐL¸¼ÐLÐLÐLÑMÔMÐMð	Ø×#Ò#Ñ%Ô%ˆAØˆKˆKˆKØˆE�*�$”*˜Q q°uÐ=Ñ=Ô=Ñ>Ô>Ð>Ð>øØð 	ð 	ð 	ØˆE�-˜A�-�-Ñ Ô Ð ØˆCŒH�Q‰KŒKˆKˆKˆKˆKˆKˆKøøøøð	øøøð 	ˆŒ�‰Œˆà„|ð ØŒKˆØÔˆØð 
	˜ð 
	ð	ØVÐVÐVÐVÐVÐVÐVÐVØ%˜™œ�ØŸš 4¤<°Ñ4Ô4�Øð 4ØŸ
š
 ?Ñ3Ô3�AØð BØ+Ð+¨D¬L¸&ÑAÔA�AøøØð ð ð Ø�ðøøøð ð 	ØˆEÐNÀÄÐNÐNÑOÔOÐOØˆCŒH�Q‰KŒKˆKà&Ð&Ø”LØØØœ<Ø”]Øð
ñ 
ô 
‰ˆˆDð ð 	ØˆCŒH�Q‰KŒKˆKˆKˆKðg Ðð.ð ð6	ð 	s=   Á6B ÂBÂBÈ'4I ÉJ	É!JÊJ	Ê6AL ÌLÌL