§
    ; Çj–  ã            	       ód  — 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mZ ddl	m
Z
mZmZmZmZ  ee¦  «                             ¦   «         j        j        Zedz  Zedz  Zedz  Zedz  Zed	z  Zed
z  Zedz  Z ee¦  «         ee¦  «         ee¦  «        fD ]&Zeej        vrej                             de¦  «         Œ'g d¢Zg d¢Zde
eef         fd„Z de
eef         fd„Z!defd„Z"dedeeeef                  fd„Z#dedee
eef                  fd„Z$d#dede%de&de%fd„Z'd$dede%d e&d!e&fd"„Z(dS )%zS
Test package initialization and shared test helpers for KieuStory E2E test suite.
é    N)ÚPath)ÚDictÚListÚOptionalÚTupleÚAnyÚ	FilmMakerÚ02_AI_PromptsÚ	04_AssetsÚ00_Project_BibleÚ05_Production_PipelineÚ
06_ExportsÚ
web_review)u   KIM TRá»ŒNGu   VÆ¯Æ NG QUANu   VÆ¯Æ NG Ã”NGu
   Tá»ª Háº¢Iu
   THÃšC SINHu
   THÃšC Ã”NGu   MÃƒ GIÃ�M SINHu
   Sá»ž KHANHu   Há»’ TÃ”N HIáº¾Nu	   Báº C BÃ€u   Báº C Háº NH)u   khÃ³cu	   rÆ¡i lá»‡u   rÆ¡i nÆ°á»›c máº¯tu   chÃ¢u sau   ngáº¥n lá»‡u   nÆ°á»›c máº¯tu   nÆ°á»›c máº¯t tuÃ´nu   khÃ³c ngáº¥tu   khÃ³c rá»‘ngu
   gÃ o khÃ³cu
   ná»©c ná»Ÿu   thÃºt thÃ­tu   rÆ°ng rÆ°ng giá»�t lá»‡Úreturnc                  ó¾   — t           dz  } |                      ¦   «         r>t          | dd¬¦  «        5 }t          j        |¦  «        cd d d ¦  «         S # 1 swxY w Y   i S )Nzmuse_ai_video_prompts.jsonÚrúutf-8©Úencoding©ÚPROMPTS_DIRÚexistsÚopenÚjsonÚload©Úprompts_pathÚfs     ú'C:\Projects\KieuStory\tests\__init__.pyÚload_muse_prompts_datar    )   ó�   € ÝÐ!=Ñ=€LØ×ÒÑÔð  Ý�, ¨gÐ6Ñ6Ô6ð 	 ¸!Ý”9˜Q‘<”<ð	 ð 	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 à€Ió   ±AÁAÁAc                  ó¾   — t           dz  } |                      ¦   «         r>t          | dd¬¦  «        5 }t          j        |¦  «        cd d d ¦  «         S # 1 swxY w Y   i S )Nzgemini_banana_prompts.jsonr   r   r   r   r   s     r   Úload_banana_prompts_datar$   1   r!   r"   c                  ón   — t           dz  } |                      ¦   «         r|                      d¬¦  «        S dS )Nz6TAP_01_XUAN_SAC_THE_NGUYEN_VA_GIONG_BAO_DOAN_TRUONG.mdr   r   Ú )ÚFILMMAKER_DIRr   Ú	read_text)Úpaths    r   Úread_ep01_screenplayr*   9   s6   € ÝÐSÑS€DØ‡{‚{�}„}ð 0Ø�~Š~ wˆ~Ñ/Ô/Ð/Øˆ2ó    Útextc                 óD  — g }t          j        d| ¦  «        }t          |¦  «        dk    rut          dt          |¦  «        d¦  «        D ]V}||                              ¦   «         }|dz   t          |¦  «        k     r||dz            nd}|                     ||f¦  «         ŒW|S )z4Splits screenplay into (scene_title, scene_content).u%   (#{3,4}\s*Cáº¢NH\s*\d+[^:\n]*:[^\n]*)é   é   r&   )ÚreÚsplitÚlenÚrangeÚstripÚappend)r,   ÚscenesÚpartsÚiÚheaderÚcontents         r   Úget_screenplay_scenesr;   @   s    € à€FåŒHÐ=¸tÑDÔD€EÝ
ˆ5�z„z�A‚~€~Ý�q�#˜e™*œ* aÑ(Ô(ð 	-ð 	-ˆAØ˜1”X—^’^Ñ%Ô%ˆFØ&'¨!¡e­c°%©j¬jÒ&8Ð&8�e˜A ™E”l�l¸bˆGØ�MŠM˜6 7Ð+Ñ,Ô,Ð,Ð,Ø€Mr+   Úscreenplay_textc           
      óP  ‡	‡
‡— g }|                       ¦   «         }d}t          |d¦  «        D �]x\  Š	}|                     ¦   «         Š
‰
sŒt          j        d‰
¦  «        }|ra|                     d¦  «                             ¦   «         Št          D ]
}|‰v r|} n)Œt          ˆfd„dD ¦   «         ¦  «        rd}n
d‰v sd‰v rd	}|t          v r<t          D ]4}|‰
 	                    ¦   «         v r| 
                    ‰	||‰
d
œ¦  «          nŒ5t          D ]–}|‰
v r�t          ˆ
fd„dD ¦   «         ¦  «        ot          ˆ
fd„dD ¦   «         ¦  «        }|rŒ?t          D ]O}|‰
 	                    ¦   «         v r7t          ˆ	fd„|D ¦   «         ¦  «        s| 
                    ‰	||‰
d
œ¦  «          nŒPŒ—�Œz|S )z¡
    Scans screenplay for male characters associated with crying action beats.
    Returns list of violations with character, line number, and text snippet.
    Nr.   u!   ^\*{0,2}([A-ZÃ€-á»¸\s]+)\*{0,2}:?c              3   ó    •K  — | ]}|‰v V — Œ	d S ©N© )Ú.0ÚfcÚpotential_speakers     €r   ú	<genexpr>z.find_male_crying_violations.<locals>.<genexpr>d   sA   øè è € ð  Gð  G°2�rÐ.Ð.ð  Gð  Gð  Gð  Gð  Gð  Gr+   )u   THÃšY KIá»€Uu
   THÃšY VÃ‚Nu   VÆ¯Æ NG BÃ€u   Ä�áº M TIÃŠNu   HOáº N THÆ¯ÚFEMALEu   NGÆ¯á»œI DáºªN CHUYá»†NzV.O.ÚNARRATOR)Úline_numÚ	characterÚkeywordr,   c              3   óD   •K  — | ]}|‰                      ¦   «         v V — Œd S r?   ©Úlower)rA   r   Ú
line_cleans     €r   rD   z.find_male_crying_violations.<locals>.<genexpr>z   sL   øè è € ð  &Qð  &QÀ! a¨:×+;Ò+;Ñ+=Ô+=Ð&=ð  &Qð  &Qð  &Qð  &Qð  &Qð  &Qr+   )u   thiáº¿u ná»¯u   nÃ ngu   cÃ´ gÃ¡iu   ngÆ°á»�i thiáº¿u ná»¯u   kiá»�uc              3   óD   •K  — | ]}|‰                      ¦   «         v V — Œd S r?   rK   )rA   ÚcrM   s     €r   rD   z.find_male_crying_violations.<locals>.<genexpr>z   sw   øè è € ð  Yð  Yð  vwð  Z[ð  _i÷  _oò  _oñ  _qô  _qð  Zqð  Yð  Yð  Yð  Yð  Yð  Yr+   )u   quá»³ trong nÆ°á»›c máº¯tu   máº¯t nÃ ngu   nÆ°á»›c máº¯t nÃ ngc              3   ó0   •K  — | ]}|d          ‰k    V — ŒdS )rG   Nr@   )rA   ÚvÚidxs     €r   rD   z.find_male_crying_violations.<locals>.<genexpr>   s,   øè è € Ð"LÐ"L¸A 1 Z¤=°CÒ#7Ð"LÐ"LÐ"LÐ"LÐ"LÐ"Lr+   )Ú
splitlinesÚ	enumerater4   r0   ÚmatchÚgroupÚMALE_CHARACTERSÚanyÚCRYING_KEYWORDSrL   r5   )r<   Ú
violationsÚlinesÚcurrent_speakerÚlineÚspeaker_matchÚmcÚkwÚis_female_tearsrR   rM   rC   s            @@@r   Úfind_male_crying_violationsrb   M   sÞ  øøø€ ð
 €JØ×&Ò&Ñ(Ô(€EØ€Oå˜u aÑ(Ô(ð 0"ñ 0"‰	ˆˆTØ—Z’Z‘\”\ˆ
Øð 	Øõ œÐ!EÀzÑRÔRˆØð 
	1Ø -× 3Ò 3°AÑ 6Ô 6× <Ò <Ñ >Ô >ÐÝ%ð 1ð 1�ØÐ*Ð*Ð*Ø&(�OØ�Eð +õ ð  Gð  Gð  Gð  Gð  :Fð  Gñ  Gô  Gñ  Gô  Gð 1Ø&.�O�OØ.Ð2CÐCÐCÀvÐQbÐGbÐGbØ&0�Oð �oÐ-Ð-å%ð ð �Ø˜×)Ò)Ñ+Ô+Ð+Ð+Ø×%Ò%Ø$'Ø%4Ø#%Ø *ð	'ð 'ñ ô ð ð �Eð ,õ "ð 	"ð 	"ˆBØ�ZÐÐå"%ð  &Qð  &Qð  &Qð  &Qð  HPð  &Qñ  &Qô  &Qñ  #Qô  #Qð  #õ  VYð  Yð  Yð  Yð  Yð  {~ð  Yñ  Yô  Yñ  Vô  V�Ø"ð ØÝ)ð 	"ð 	"�BØ˜Z×-Ò-Ñ/Ô/Ð/Ð/Ý"Ð"LÐ"LÐ"LÐ"LÀÐ"LÑ"LÔ"LÑLÔLð "Ø&×-Ò-Ø,/Ø-/Ø+-Ø(2ð	/ð /ñ ô ð ð "˜Eøøñ	"ð" Ðr+   ç       @é€»  ç     €{@r)   Úduration_secÚsample_rateÚfreqc           
      óB  — ddl }ddl}t          ||z  ¦  «        }d}d}||z  |z  dz  }	||z  dz  }
||
z  }d|z   }t          | d¦  «        5 }|                     d¦  «         |                     |                     d	|¦  «        ¦  «         |                     d
¦  «         |                     d¦  «         |                     |                     d	d¦  «        ¦  «         |                     |                     dd¦  «        ¦  «         |                     |                     d|¦  «        ¦  «         |                     |                     d	|¦  «        ¦  «         |                     |                     d	|	¦  «        ¦  «         |                     |                     d|
¦  «        ¦  «         |                     |                     d|¦  «        ¦  «         |                     d¦  «         |                     |                     d	|¦  «        ¦  «         t          |¦  «        D ]d}t          d|                     d|j        z  |z  ||z  z  ¦  «        z  ¦  «        }|                     d||¦  «        }|                     |¦  «         Œe	 ddd¦  «         dS # 1 swxY w Y   dS )zKGenerates a synthetic sine wave WAV file for testing without external deps.r   Nr/   é   é   é$   Úwbs   RIFFz<Is   WAVEs   fmt z<Hr.   s   datag    ÀÿÏ@rc   z<hh)	ÚstructÚmathÚintr   ÚwriteÚpackr3   ÚsinÚpi)r)   rf   rg   rh   rn   ro   Únum_samplesÚnum_channelsÚbits_per_sampleÚ	byte_rateÚblock_alignÚ	data_sizeÚ
chunk_sizer   r8   ÚvalÚpackeds                    r   Úcreate_synthetic_wavr~   ‹   s³  € à€M€M€MØ€K€K€Kå�l [Ñ0Ñ1Ô1€KØ€LØ€OØ˜lÑ*¨_Ñ<ÀÑA€IØ Ñ0°AÑ5€KØ˜kÑ)€IØ�i‘€Jå	ˆd�DÑ	Ô	ð ˜Qà	�Š�ÑÔÐØ	�Š�—’˜D *Ñ-Ô-Ñ.Ô.Ð.Ø	�Š�ÑÔÐà	�Š�ÑÔÐØ	�Š�—’˜D "Ñ%Ô%Ñ&Ô&Ð&Ø	�Š�—’˜D !Ñ$Ô$Ñ%Ô%Ð%Ø	�Š�—’˜D ,Ñ/Ô/Ñ0Ô0Ð0Ø	�Š�—’˜D +Ñ.Ô.Ñ/Ô/Ð/Ø	�Š�—’˜D )Ñ,Ô,Ñ-Ô-Ð-Ø	�Š�—’˜D +Ñ.Ô.Ñ/Ô/Ð/Ø	�Š�—’˜D /Ñ2Ô2Ñ3Ô3Ð3à	�Š�ÑÔÐØ	�Š�—’˜D )Ñ,Ô,Ñ-Ô-Ð-Ý�{Ñ#Ô#ð 	ð 	ˆAÝ�m d§h¢h¨s°T´W©}¸tÑ/CÀqÈ;ÁÑ/WÑ&XÔ&XÑXÑYÔYˆCØ—[’[ ¨¨SÑ1Ô1ˆFØ�GŠG�F‰OŒOˆOˆOð	ð#ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ÁH:JÊJÊJé   éÐ  ÚwidthÚheightc                 óÊ   — ddl m}  |¦   «         }|ddddd|› d|› d	|› �dddd
|› �dddt          |¦  «        dddddddd| g}t          j        |dd¬¦  «        }|j        dk    S )zGCreates a minimal valid MP4 video with an AAC audio track using FFmpeg.r   )Ú
get_ffmpegz-yz-fÚlavfiz-izcolor=c=black:s=Úxz:d=z.sine=frequency=440:sample_rate=48000:duration=z-c:vÚlibx264z-tz-pix_fmtÚyuv420pz-c:aÚaacz-b:aÚ192kz-arÚ48000T)Úcapture_outputr,   )Úaudio_continuity_enginer„   ÚstrÚ
subprocessÚrunÚ
returncode)r)   rf   r�   r‚   r„   ÚffmpegÚcmdÚress           r   Úcreate_synthetic_video_mp4r•   ¯   s©   € à2Ð2Ð2Ð2Ð2Ð2ØˆZ‰\Œ\€Fà�Øˆg�tÐQ°ÐQÐQ¸ÐQÐQÀ<ÐQÐQØˆg�tÐ\ÈlÐ\Ð\Ø�	˜4¥ \Ñ!2Ô!2°JÀ	Ø��v˜v u¨gØð€Cõ Œ.˜¨T¸Ð
=Ñ
=Ô
=€CØŒ>˜QÒÐr+   )rc   rd   re   )rc   r   r€   ))Ú__doc__ÚosÚsysr0   r   r�   ÚtempfileÚpathlibr   Útypingr   r   r   r   r   Ú__file__ÚresolveÚparentÚBASE_DIRr'   r   Ú
ASSETS_DIRÚ	BIBLE_DIRÚPIPELINE_DIRÚEXPORTS_DIRÚWEB_REVIEW_DIRrŽ   Úpr)   ÚinsertrW   rY   r    r$   r*   r;   rb   Úfloatrp   r~   r•   r@   r+   r   ú<module>r¨      sž  ððð ð 
€	€	€	Ø 
€
€
€
Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3àˆ4�‰>Œ>×!Ò!Ñ#Ô#Ô*Ô1€Ø˜;Ñ&€Ø˜Ñ(€Ø˜Ñ#€
ØÐ)Ñ)€	ØÐ2Ñ2€Ø˜Ñ%€Ø˜LÑ(€ð ˆ#ˆlÑ
Ô
˜S˜S Ñ0Ô0°#°#°h±-´-Ð	@ð ð €AØ�”ÐÐØŒ�Š˜˜1ÑÔÐøðð ð €ðð ð €ð  S¨# X¤ð ð ð ð ð $ s¨C x¤.ð ð ð ð ð˜cð ð ð ð ð
 ð 
¨¨U°3¸°8¬_Ô(=ð 
ð 
ð 
ð 
ð;°ð ;¸¸dÀ3ÈÀ8¼nÔ9Mð ;ð ;ð ;ð ;ð|!ð !˜sð !°%ð !ÈCð !Ð_dð !ð !ð !ð !ðHð  Sð ¸ð ÈCð Ð`cð ð ð ð ð ð r+   