§
    56Ëjn\  ã                   ó`  — d Z ddlZddlmc m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 ddlZ ee¦  «                             ¦   «         j        j        Zedz  Zedz  dz  Zedz  Zedz  Z ee¦  «        ej        vr$ej                             d ee¦  «        ¦  «         dd	lmZm Z m!Z! ddl"Z#dd
l$m%Z%m&Z&m'Z' ddl(Z)	 	 	 	 	 	 d&dede*de+dede+de+de,defd„Z-dede.fd„Z/ G d„ d¦  «        Z0 G d„ d¦  «        Z1 G d „ d!¦  «        Z2 G d"„ d#¦  «        Z3 G d$„ d%¦  «        Z4dS )'uP  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - PRODUCTION PIPELINE TEST SUITE (M4)
=============================================================================
Module: tests/test_production_pipeline_m4.py
Milestone: M4 (Assembly, Exports & E2E Testing Strategy)
Standard: AGENTS.md, GEMINI.md, ORIGINAL_REQUEST.md Â§R3, PROJECT.md

Test Scope:
1. TestAudioPreservingConcat:
   - Concat across multiple shots preserves 100% AAC 48kHz stereo stream.
   - Video & audio track durations match, zero truncation or drift.
   - Mode A (boundary_smoothing 30ms micro-fade with curve=qsin) maintains zero timeline shrinkage.
2. TestEBUR128AudioMastering:
   - Two-pass loudnorm normalization achieves EBU R128 (-14.0 LUFS Â± 0.5, TP <= -1.0 dBTP).
   - master_scene_audio produces versioned masters with naming options (_master_audio_v* / _cinematic_master_v*).
   - resolve_audio_asset properly locates audio assets across standard directories.
3. TestSceneGatePreflightGating:
   - Pre-flight Scene Gate approval (score >= 0.8) proceeds to concat.
   - Scene Gate rejection (score < 0.8) halts master assembly and returns None.
4. TestMultiSceneFullEpisodeAssembly:
   - Stitches all 10 Scenes (ep01_scene01..ep01_scene10) into ep01_full_feature_master_v1.mp4.
   - Preserves sequential ordering and valid container structure.
   - resolve_scene_master respects priority (_master_audio_v* > _cinematic_master_v* > _master_v*).
   - assemble_episode_master dry-run and check modes operate accurately.
5. TestNegativeScenariosAndFaultTolerance:
   - Aborts on missing scene in 10-scene sequence.
   - Graceful fallback for silent video (-an) via aevalsrc=0 without crash.
   - Aborts cleanly when shots are missing for a scene.
=============================================================================
é    N)ÚPath)ÚpatchÚ	MagicMockÚ05_Production_PipelineÚ	04_AssetsÚvideosÚ
06_Exports)ÚAudioContinuityEngineÚ
get_ffmpegÚget_ffprobe)ÚVideoCriticVerdictÚSceneEvaluationÚShotEvaluationç      ð?é¸  Úblacké@  éð   TÚoutput_pathÚdurationÚfreqÚcolorÚwidthÚheightÚ	has_audioÚreturnc                 ó¦  — t          ¦   «         }| j                             dd¬¦  «         |ddddd|› d|› d	|› d
|› �g}|r0|                     dddd|› d|› �ddddddddddddddddg¦  «         n|                     g d¢¦  «         |                     dt	          |¦  «        t	          | ¦  «        g¦  «         t          j        |dd¬¦  «         | S )uI   Táº¡o video synthetic nháº¹ (320x240, h264+aac 48k stereo) trong < 200ms.T)ÚparentsÚexist_okú-yz-fÚlavfiú-izcolor=c=z:s=Úxz:d=zsine=frequency=z:sample_rate=48000:duration=ú-mapz0:vz1:aú-c:vÚlibx264ú-pix_fmtÚyuv420pú-c:aÚaacú-b:aÚ192kú-arÚ48000z-acÚ2)z-anr%   r&   r'   r(   z-t)Úcapture_outputÚcheck)r   ÚparentÚmkdirÚextendÚstrÚ
subprocessÚrun)	r   r   r   r   r   r   r   ÚffmpegÚcmds	            ú:C:\Projects\KieuStory\tests\test_production_pipeline_m4.pyÚcreate_synthetic_clipr;   >   s4  € õ ‰\Œ\€FØÔ×Ò T°DÐÑ9Ô9Ð9à�Øˆg�tÐO¨ÐOÐO°%ÐOÐO¸&ÐOÐOÀXÐOÐOð€Cð ð 
Ø�
Š
Ø�'˜4Ð!_°4Ð!_Ð!_ÐU]Ð!_Ð!_Ø�E˜6 5Ø�I˜z¨9Ø�E˜6 6¨5°'¸5À#ð	
ñ 	ô 	ð 	ð 	ð 	�
Š
ð 
ð 
ð 
ñ 	ô 	ð 	ð ‡J‚J�•c˜(‘m”m¥S¨Ñ%5Ô%5Ð6Ñ7Ô7Ð7Ý„N�3 t°4Ð8Ñ8Ô8Ð8ØÐó    Ú
media_pathc                 ó¤  — t          ¦   «         }|ddddddt          | ¦  «        g}t          j        |ddd¬¦  «        }t	          j        |j        ¦  «        }|                     d	g ¦  «        }|                     d
i ¦  «        }t          d„ |D ¦   «         d¦  «        }t          d„ |D ¦   «         d¦  «        }t          |                     dd¦  «        ¦  «        |du|r|                     d¦  «        nd|r7t          |                     d|                     dd¦  «        ¦  «        ¦  «        nd|du|r|                     d¦  «        nd|r#t          |                     dd¦  «        ¦  «        nd|r#t          |                     dd¦  «        ¦  «        nd|r7t          |                     d|                     dd¦  «        ¦  «        ¦  «        nddœ	S )u:   TrÃ­ch xuáº¥t chi tiáº¿t metadata audio/video qua ffprobe.z-vÚerrorz-show_entrieszJstream=codec_type,codec_name,sample_rate,channels,duration:format=durationz-ofÚjsonT)r0   Útextr1   ÚstreamsÚformatc              3   óL   K  — | ]}|                      d ¦  «        dk    ¯|V — Œ dS )Ú
codec_typeÚvideoN©Úget©Ú.0Úss     r:   ú	<genexpr>z#probe_media_file.<locals>.<genexpr>k   ó8   è è € ÐJÐJ˜1¨1¯5ª5°Ñ+>Ô+>À'Ò+IÐ+I�QÐ+IÐ+IÐ+IÐ+IÐJÐJr<   Nc              3   óL   K  — | ]}|                      d ¦  «        dk    ¯|V — Œ dS )rE   ÚaudioNrG   rI   s     r:   rL   z#probe_media_file.<locals>.<genexpr>l   rM   r<   r   g        Ú
codec_nameÚsample_rater   Úchannels)	Úformat_durationÚ	has_videoÚvideo_codecÚvideo_durationr   Úaudio_codecrQ   rR   Úaudio_duration)r   r5   r6   r7   r@   ÚloadsÚstdoutrH   ÚnextÚfloatÚint)	r=   Úffprober9   ÚresÚdatarB   ÚfmtÚv_streamÚa_streams	            r:   Úprobe_media_filerd   ^   sÏ  € å‰mŒm€Gà��wØÐeØˆv•s˜:‘”ð€Cõ
 Œ.˜¨T¸ÀDÐ
IÑ
IÔ
I€CÝŒ:�c”jÑ!Ô!€DØ�hŠh�y "Ñ%Ô%€GØ
�(Š(�8˜RÑ
 Ô
 €CåÐJÐJ ÐJÑJÔJÈDÑQÔQ€HÝÐJÐJ ÐJÑJÔJÈDÑQÔQ€Hõ ! §¢¨°SÑ!9Ô!9Ñ:Ô:Ø TÐ)Ø5=ÐG�x—|’| LÑ1Ô1Ð1À4ØW_Ðh�% §¢¨Z¸¿ºÀÈSÑ9QÔ9QÑ RÔ RÑSÔSÐSÐehØ TÐ)Ø5=ÐG�x—|’| LÑ1Ô1Ð1À4Ø>FÐM•s˜8Ÿ<š<¨°qÑ9Ô9Ñ:Ô:Ð:ÈAØ8@ÐG•C˜Ÿš Z°Ñ3Ô3Ñ4Ô4Ð4ÀaØW_Ðh�% §¢¨Z¸¿ºÀÈSÑ9QÔ9QÑ RÔ RÑSÔSÐSÐehð
ð 
ð 
r<   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestAudioPreservingConcatuN   Kiá»ƒm thá»­ ghÃ©p ná»‘i filter_complex concat báº£o toÃ n 100% Ã¢m thanh AAC.c                 óF  ‡— ˆfd„t          d¦  «        D ¦   «         }‰dz  }t          ¦   «         }g }g }t          |¦  «        D ]E\  }}|                     dt	          |¦  «        g¦  «         |                     d|› d|› d�¦  «         ŒFd                     |¦  «        › d	t          |¦  «        › d
�}	|dg|¢d‘|	‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d‘t	          |¦  «        ‘}
t          j	        |
dd¬¦  «        }|j
        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd |iz  }t#          t          j        |¦  «        ¦  «        ‚d!x}x}}|j        } |¦   «         }|s‹d"d#t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd#t          j        |¦  «        t          j        |¦  «        d$œz  }t#          t          j        |¦  «        ¦  «        ‚d!x}}t)          |¦  «        }|d%         }d}||u }|slt          j        d&|fd'||f¦  «        t          j        |¦  «        t          j        |¦  «        d(œz  }d)d*|iz  }t#          t          j        |¦  «        ¦  «        ‚d!x}x}}|d+         }d,}||k    }|slt          j        d|fd-||f¦  «        t          j        |¦  «        t          j        |¦  «        d(œz  }d)d*|iz  }t#          t          j        |¦  «        ¦  «        ‚d!x}x}}|d.         }d}||u }|slt          j        d&|fd'||f¦  «        t          j        |¦  «        t          j        |¦  «        d(œz  }d)d*|iz  }t#          t          j        |¦  «        ¦  «        ‚d!x}x}}|d/         }d}||k    }|slt          j        d|fd-||f¦  «        t          j        |¦  «        t          j        |¦  «        d(œz  }d)d*|iz  }t#          t          j        |¦  «        ¦  «        ‚d!x}x}}|d0         }d1}||k    }|slt          j        d|fd-||f¦  «        t          j        |¦  «        t          j        |¦  «        d(œz  }d)d*|iz  }t#          t          j        |¦  «        ¦  «        ‚d!x}x}}|d2         }d3}||k    }|slt          j        d|fd-||f¦  «        t          j        |¦  «        t          j        |¦  «        d(œz  }d)d*|iz  }t#          t          j        |¦  «        ¦  «        ‚d!x}x}}|d4         }d5}||z
  }t+          |¦  «        }d6}||k     }|sÚt          j        d7|fd8||f¦  «        d9t          j        ¦   «         v st          j        t*          ¦  «        rt          j        t*          ¦  «        nd9t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d:œz  }d;d<|iz  }t#          t          j        |¦  «        ¦  «        ‚d!x}x}x}x}x}}|d=         }|d>         }||z
  }t+          |¦  «        }d?}||k     }|sÚt          j        d7|fd8||f¦  «        d9t          j        ¦   «         v st          j        t*          ¦  «        rt          j        t*          ¦  «        nd9t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d:œz  }d;d<|iz  }t#          t          j        |¦  «        ¦  «        ‚d!x}x}x}x}x}}d!S )@uV   XÃ¡c nháº­n ghÃ©p ná»‘i N shot sinh ra master cÃ³ Ä‘áº§y Ä‘á»§ audio AAC stereo 48kHz.c           	      óN   •— g | ]!}t          ‰d |› d�z  dd|dz   z  ¬¦  «        ‘Œ"S )Úshot_ú.mp4ç      à?i�  é   ©r   r   ©r;   ©rJ   ÚiÚtmp_paths     €r:   ú
<listcomp>z_TestAudioPreservingConcat.test_01_filter_complex_concat_preserves_aac_audio.<locals>.<listcomp>„   sR   ø€ ð 
ð 
ð 
àõ " (¨_°Q¨_¨_¨_Ñ"<ÀsÐQTÐXYÐ\]ÑX]ÑQ^Ð_Ñ_Ô_ð
ð 
ð 
r<   é   zscene_master.mp4r"   ú[ú:v:0][ú:a:0]Ú ú	concat=n=ú:v=1:a=1[v][a]r    ú-filter_complexr$   ú[v]ú[a]r%   r&   r)   r*   r+   r,   r-   r.   T©r0   rA   r   ©ú==©z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sr_   ©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7NúAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Ú
out_master©r‚   rƒ   Úpy4rT   ©Úis©z%(py1)s is %(py4)s©Úpy1rŠ   úassert %(py6)sÚpy6rU   Úh264©z%(py1)s == %(py4)sr   rW   rQ   é€»  rR   é   rS   g      ø?ç333333Ã?©ú<©z<%(py7)s
{%(py7)s = %(py0)s((%(py2)s - %(py4)s))
} < %(py10)sÚabs©r‚   rƒ   rŠ   r†   Úpy10úassert %(py12)sÚpy12rX   rV   çš™™™™™¹?)Úranger   Ú	enumerater4   r5   ÚappendÚjoinÚlenr6   r7   Ú
returncodeÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚexistsrd   rš   )Úselfrq   Úclipsrˆ   r8   ÚinputsÚfilter_partsrp   ÚcÚconcat_filterr9   r_   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8Ú@py_format5ÚmetaÚ@py_assert0Ú@py_assert2Ú@py_format7Ú@py_assert5Ú@py_assert6Ú@py_assert9Ú@py_assert8Ú@py_format11Ú@py_format13s    `                          r:   Ú1test_01_filter_complex_concat_preserves_aac_audiozKTestAudioPreservingConcat.test_01_filter_complex_concat_preserves_aac_audio‚   s 	  ø€ ð
ð 
ð 
ð 
å˜1‘X”Xð
ñ 
ô 
ˆð Ð 2Ñ2ˆ
å‘”ˆØˆØˆÝ˜eÑ$Ô$ð 	7ð 	7‰DˆAˆqØ�MŠM˜4¥ Q¡¤˜.Ñ)Ô)Ð)Ø×ÒÐ 5 AÐ 5Ð 5¨QÐ 5Ð 5Ð 5Ñ6Ô6Ð6Ð6ØŸ7š7 <Ñ0Ô0ÐUÐU½3¸u¹:¼:ÐUÐUÐUˆð �Dð
Ø!ð
àð
à,ð
ð ð
ð ð
ð "ð
ð $)ð
ð ð	
ð ð	
ð  &ð	
ð (-ð	
ð /5ð	
ð 7=ð	
ð ?Dð	
ð FMð	
õ
 �
‰OŒOð
ˆõ Œn˜S°¸DÐAÑAÔAˆØŒ~Ð" Ð"ˆ~ Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ~ Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Ð"Õ"Ô"ˆ~Ñ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ØÔ Ð"Ð Ð Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Ð"Õ"Ô"Ð Ñ"Ô"Õ"Ô"Ð"Ñ"Ô"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"å 
Ñ+Ô+ˆØ�KÔ Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�MÔ"Ð, fÐ,Ð" fÒ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð" fÐ,Ñ,Ô,Õ,Ô,Ð"Ñ,Ô,Õ,Ô, fÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø�KÔ Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�MÔ"Ð+ eÐ+Ð" eÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�MÔ"Ð+ eÐ+Ð" eÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�JÔÐ$ 1Ð$Ð 1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð 1Ð$Ñ$Ô$Õ$Ô$ÐÑ$Ô$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ØÐ)Ô*Ð8¨SÐ8Ð*¨SÑ0Ð8�sÐ0Ñ1Ô1Ð8°DÐ8Ð1°DÒ8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð1°DÐ8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8�sÑ8Ô8Ð8Õ8Ô8�sÑ8Ô8Ð8Ð8Õ8Ô8Ð*Ñ8Ô8Õ8Ô8¨SÑ8Ô8Õ8Ô8Ð1Ñ8Ô8Õ8Ô8°DÑ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÐ(Ô)ÐI¨DÐ1AÔ,BÐIÐ)Ð,BÑBÐI�sÐBÑCÔCÐIÀcÐIÐCÀcÒIÐIÐIÐIÕIÔIÐIÐIÐIÐIÐCÀcÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI�sÑIÔIÐIÕIÔI�sÑIÔIÐIÐIÕIÔIÐ)ÑIÔIÕIÔIÐ,BÑIÔIÕIÔIÐCÑIÔIÕIÔIÀcÑIÔIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIr<   c                 ó‚  ‡— ˆfd„t          d¦  «        D ¦   «         }‰dz  }t          ¦   «         }|                     d„ |D ¦   «         t          |¦  «        ddd¬¦  «        }d}||u }|s—t	          j        d	|fd
||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}|j        } |¦   «         }
|
s‹ddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |
¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}
t          |¦  «        }|d         }d}
||
u }|slt	          j        d	|fd||
f¦  «        t	          j	        |¦  «        t	          j	        |
¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}
|d         }d}
||
k    }|slt	          j        d|fd||
f¦  «        t	          j	        |¦  «        t	          j	        |
¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}
|d         }d}
||
k    }|slt	          j        d|fd||
f¦  «        t	          j	        |¦  «        t	          j	        |
¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}
dS )uZ   XÃ¡c nháº­n AudioContinuityEngine.stitch_with_audio_crossfade xuáº¥t file cÃ³ AAC chuáº©n.c           	      óN   •— g | ]!}t          ‰d |› d�z  dd|dz  z   ¬¦  «        ‘Œ"S )Úshot_cross_rj   çš™™™™™é?iô  éd   rm   rn   ro   s     €r:   rr   zhTestAudioPreservingConcat.test_01_stitch_with_audio_crossfade_preserves_audio_stream.<locals>.<listcomp>©   sV   ø€ ð 
ð 
ð 
àõ " (Ð-B¸1Ð-BÐ-BÐ-BÑ"BÈSÐWZÐ]^ÐadÑ]dÑWdÐeÑeÔeð
ð 
ð 
r<   r•   zcrossfade_master.mp4c                 ó,   — g | ]}t          |¦  «        ‘ŒS © ©r5   ©rJ   r³   s     r:   rr   zhTestAudioPreservingConcat.test_01_stitch_with_audio_crossfade_preserves_audio_stream.<locals>.<listcomp>±   ó   € Ð#Ð#Ð#˜�S�‰VŒVÐ#Ð#Ð#r<   çš™™™™™É?TÚ
acrossfade©Úcrossfade_durÚnormalize_lufsÚmoder‹   ©z%(py0)s is %(py3)sÚok©r‚   Úpy3úassert %(py5)sr„   Nr‡   rˆ   r‰   r   r�   rŽ   r�   r‘   rW   r*   r~   r“   rQ   r”   )r    r
   Ústitch_with_audio_crossfader5   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   rd   )r¯   rq   r°   rˆ   Úenginer×   r½   rµ   Ú@py_format4r¸   r·   rº   r»   r¼   r¾   s    `             r:   Ú:test_01_stitch_with_audio_crossfade_preserves_audio_streamzTTestAudioPreservingConcat.test_01_stitch_with_audio_crossfade_preserves_audio_stream§   s  ø€ ð
ð 
ð 
ð 
å˜1‘X”Xð
ñ 
ô 
ˆð Ð 6Ñ6ˆ
å&Ñ(Ô(ˆØ×/Ò/Ø#Ð#˜UÐ#Ñ#Ô#Ý�
‰OŒOØØØð 0ñ 
ô 
ˆð Ðˆr�TˆzÐÐÐÕÔÐÐÐÐˆr�TÐÑÔÐÕÔÑÔÐÐÕÔˆrÑÔÐÕÔˆrÑÔÐÐÕÔ�TÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ Ð"Ð Ð Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Ð"Õ"Ô"Ð Ñ"Ô"Õ"Ô"Ð"Ñ"Ô"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"å 
Ñ+Ô+ˆØ�KÔ Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�MÔ"Ð+ eÐ+Ð" eÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�MÔ"Ð+ eÐ+Ð" eÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r<   c                 ó¦  ‡— ˆfd„t          d¦  «        D ¦   «         }‰dz  }t          ¦   «         }|                     d„ |D ¦   «         t          |¦  «        ddd¬¦  «        }d	}||u }|s—t	          j        d
|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}|j        } |¦   «         }
|
s‹ddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |
¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}
t          |¦  «        }|d         }d}
||
z
  }t          |¦  «        }d}||k     }|sÚt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        t	          j	        |
¦  «        t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}
x}x}x}}|d         }d}
||
z
  }t          |¦  «        }d}||k     }|sÚt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        t	          j	        |
¦  «        t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}
x}x}x}}dS )uf   XÃ¡c nháº­n Mode A (boundary_smoothing) giá»¯ nguyÃªn 100% thá»�i lÆ°á»£ng tá»•ng, zero duration loss.c           	      óN   •— g | ]!}t          ‰d |› d�z  dd|dz  z   ¬¦  «        ‘Œ"S )Úshot_smooth_rj   g333333ã?i^  éP   rm   rn   ro   s     €r:   rr   zZTestAudioPreservingConcat.test_01_mode_a_boundary_smoothing_zero_drift.<locals>.<listcomp>Â   sV   ø€ ð 
ð 
ð 
àõ " (Ð-C¸AÐ-CÐ-CÐ-CÑ"CÈcÐX[Ð^_ÐbdÑ^dÑXdÐeÑeÔeð
ð 
ð 
r<   rs   zsmooth_master.mp4c                 ó,   — g | ]}t          |¦  «        ‘ŒS rÌ   rÍ   rÎ   s     r:   rr   zZTestAudioPreservingConcat.test_01_mode_a_boundary_smoothing_zero_drift.<locals>.<listcomp>Ê   rÏ   r<   rÐ   FÚboundary_smoothingrÒ   Tr‹   rÖ   r×   rØ   rÚ   r„   Nr‡   rˆ   r‰   rS   gÍÌÌÌÌÌü?r–   r—   r™   rš   r›   r�   rž   rX   )r    r
   rÛ   r5   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   rd   rš   )r¯   rq   r°   rˆ   rÜ   r×   r½   rµ   rÝ   r¸   r·   rº   r»   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   s    `                 r:   Ú,test_01_mode_a_boundary_smoothing_zero_driftzFTestAudioPreservingConcat.test_01_mode_a_boundary_smoothing_zero_drift¿   sj  ø€ ð
ð 
ð 
ð 
å˜1‘X”Xð
ñ 
ô 
ˆð Ð 3Ñ3ˆ
å&Ñ(Ô(ˆØ×/Ò/Ø#Ð#˜UÐ#Ñ#Ô#Ý�
‰OŒOØØ Ø%ð 0ñ 
ô 
ˆð Ðˆr�TˆzÐÐÐÕÔÐÐÐÐˆr�TÐÑÔÐÕÔÑÔÐÐÕÔˆrÑÔÐÕÔˆrÑÔÐÐÕÔ�TÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ Ð"Ð Ð Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Ð"Õ"Ô"Ð Ñ"Ô"Õ"Ô"Ð"Ñ"Ô"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"å 
Ñ+Ô+ˆàÐ)Ô*Ð8¨SÐ8Ð*¨SÑ0Ð8�sÐ0Ñ1Ô1Ð8°DÐ8Ð1°DÒ8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð1°DÐ8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8�sÑ8Ô8Ð8Õ8Ô8�sÑ8Ô8Ð8Ð8Õ8Ô8Ð*Ñ8Ô8Õ8Ô8¨SÑ8Ô8Õ8Ô8Ð1Ñ8Ô8Õ8Ô8°DÑ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÐ(Ô)Ð7¨CÐ7Ð)¨CÑ/Ð7�sÐ/Ñ0Ô0Ð7°4Ð7Ð0°4Ò7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð0°4Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7�sÑ7Ô7Ð7Õ7Ô7�sÑ7Ô7Ð7Ð7Õ7Ô7Ð)Ñ7Ô7Õ7Ô7¨CÑ7Ô7Õ7Ô7Ð0Ñ7Ô7Õ7Ô7°4Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7r<   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rÅ   rÞ   rå   rÌ   r<   r:   rf   rf      sK   € € € € € ØXÐXð#Jð #Jð #JðJ,ð ,ð ,ð08ð 8ð 8ð 8ð 8r<   rf   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestEBUR128AudioMasteringuI   Kiá»ƒm thá»­ chuáº©n hÃ³a Ã¢m lÆ°á»£ng EBU R128 (-14 LUFS, TP -1.0 dBTP).c                 ó4  — t          |dz  dd¬¦  «        }|dz  }t          ¦   «         }|                     t          |¦  «        t          |¦  «        ddd¬	¦  «        }d}||u }|s—t	          j        d
|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}|j        } |¦   «         }
|
s‹ddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |
¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}
|                     t          |¦  «        dd¬¦  «        }d}||u}|s—t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}|j        }d}
d} ||
|¦  «        }| }|s±ddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |
¦  «        t	          j	        |¦  «        t	          j	        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}
x}x}}t          |                     dd¦  «        ¦  «        }t          |                     dd¦  «        ¦  «        }d }| }||z
  }t!          |¦  «        }d!}||k    }|�st	          j        d"|fd#||f¦  «        d$t          j        ¦   «         v st	          j        t           ¦  «        rt	          j	        t           ¦  «        nd$dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |¦  «        d%œz  }t	          j        d&|› d'�¦  «        d(z   d)|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}d*}| }||k    }|s°t	          j        d"|fd+||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }t	          j        d,|› d-�¦  «        d.z   d/|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}dS )0uK   XÃ¡c nháº­n Two-Pass Linear Normalization Ä‘áº¡t chuáº©n -14.0 LUFS Â± 0.5.zloud_input.mp4g      @r   rm   znormalized_output.mp4g      ,Àg      ð¿T)Útarget_lufsÚ	target_tpÚtwo_passr‹   rÖ   r×   rØ   rÚ   r„   Nr‡   Úout_clipr‰   )rí   rî   ©úis not©z%(py0)s is not %(py3)sÚmeasÚ	is_silentFzRassert not %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s, %(py6)s)
})r‚   rƒ   rŠ   r‘   Úpy8Úinput_ig     ÀXÀÚinput_tpg     ÀX@g      ,@rk   )ú<=)z>%(py7)s
{%(py7)s = %(py0)s((%(py1)s - -%(py3)s))
} <= %(py10)srš   )r‚   r�   rÙ   r†   rœ   u'   Integrated Loudness lá»‡ch quÃ¡ má»©c: z LUFSz
>assert %(py12)srž   r   )z%(py0)s <= -%(py3)su   True Peak vÆ°á»£t ngÆ°á»¡ng: z dBTPú
>assert %(py6)sr‘   )r;   r
   Únormalize_loudnessr5   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   Úmeasure_loudnessrH   r\   rš   Ú_format_assertmsg)r¯   rq   Úin_cliprð   rÜ   r×   r½   rµ   rÝ   r¸   r·   rº   rô   r¿   Ú@py_assert7rÁ   Ú@py_format10r÷   rø   r¶   rÀ   rÂ   rÃ   rÄ   r¾   s                            r:   Ú3test_02_normalize_loudness_achieves_ebu_r128_targetzMTestEBUR128AudioMastering.test_02_normalize_loudness_achieves_ebu_r128_targetà   s6  € å'¨Ð3CÑ(CÈcÐX[Ð\Ñ\Ô\ˆØÐ5Ñ5ˆå&Ñ(Ô(ˆØ×&Ò&¥s¨7¡|¤|µS¸±]´]ÐPUÐaeÐptÐ&ÑuÔuˆØÐˆr�TˆzÐÐÐÕÔÐÐÐÐˆr�TÐÑÔÐÕÔÑÔÐÐÕÔˆrÑÔÐÕÔˆrÑÔÐÐÕÔ�TÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØŒÐ ˆˆÑ Ô Ð Ð Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆxÑ Ô Ð Õ Ô ˆxÑ Ô Ð Ð Õ Ô ˆÑ Ô Õ Ô Ð Ñ Ô Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð à×&Ò&¥s¨8¡}¤}À%ÐSWÐ&ÑXÔXˆØÐˆt˜4ÐÐÐÐÕÔÐÐÐÐˆt˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆtÑÔÐÕÔˆtÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ”8Ð/˜KÐ/¨Ð/�8�8˜K¨Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/�4Ñ/Ô/Ð/Õ/Ô/�4Ñ/Ô/Ð/Ð/Õ/Ô/�8Ñ/Ô/Õ/Ô/˜KÑ/Ô/Õ/Ô/¨Ñ/Ô/Õ/Ô/Ð/Ñ/Ô/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/å˜Ÿš ¨EÑ2Ô2Ñ3Ô3ˆÝ˜Ÿš *¨dÑ3Ô3Ñ4Ô4ˆà#Ðf˜t˜eÐf�7˜eÑ$Ðf�sÐ$Ñ%Ô%Ðf¨ÐfÐ%¨Ò,ÐfÐfÑfÕfÔfÐfÐfÐfÐfÐ%¨ÐfÑfÔfÐfÕfÔfÑfÔfÐfÐfÕfÔf�sÑfÔfÐfÕfÔf�sÑfÔfÐfÐfÐfÕfÔfÑfÔfÐfÐfÕfÔf�7ÑfÔfÐfÕfÔf�7ÑfÔfÐfÐfÕfÔf˜tÑfÔfÕfÔfÐ%ÑfÔfÕfÔf¨ÑfÔfÐfÐfÑfÐfÕfÔfÐ.fÐX_Ð.fÐ.fÐ.fÑfÔfÐfÑfÐfÐfÐfÑfÐfÕfÕfÔfÐfÑfÔfÑfÔfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfØÐP˜C˜4ÐPˆx˜4ÒÐPÐPÐPÕPÔPÐPÐPÐPÐPˆx˜4ÐPÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔPˆxÑPÔPÐPÕPÔPˆxÑPÔPÐPÐPÕPÔP˜CÑPÔPÐPÐPÑPÐPÕPÔPÐ!PÀÐ!PÐ!PÐ!PÑPÔPÐPÑPÐPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPÐPÐPÐPÐPr<   c           	      óÖ  — d}|dz  }|dz  }|                      d¬¦  «         |                      d¬¦  «         ||› d�z  }t          |d¬¦  «         t          d	|¦  «        5  t          d
|¦  «        5  t          j        |d¬¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}||› d�z  }|j        } |¦   «         }|s‹ddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}}t          j        |d¬¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}||› d�z  }|j        } |¦   «         }|s‹ddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}}ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uN   XÃ¡c nháº­n master_scene_audio xuáº¥t Ä‘Ãºng file vÃ  Ã¡p dá»¥ng naming_style.Úep01_test_scener   ÚexportsT©r   ú_master_v1.mp4r   ©r   ú"production_orchestrator.VIDEOS_DIRú#production_orchestrator.EXPORTS_DIRÚmaster_audio)Únaming_styler‹   rÖ   ÚsuccessrØ   rÚ   r„   Nú_master_audio_v1.mp4r‡   Úexpected_outr‰   Úcinematic_masterÚsuccess2ú_cinematic_master_v1.mp4Úexpected_cinematic)r3   r;   r   ÚpoÚmaster_scene_audior¦   r§   r¨   r©   rª   r«   r¬   r­   r®   )r¯   rq   Ú
test_sceneÚmock_videos_dirÚmock_exports_dirÚmock_raw_masterr  r½   rµ   rÝ   r¸   r  r·   rº   r  r  s                   r:   Ú1test_02_master_scene_audio_exports_versioned_filezKTestEBUR128AudioMastering.test_02_master_scene_audio_exports_versioned_fileô   s  € à&ˆ
Ø" XÑ-ˆØ# iÑ/ÐØ×Ò dÐÑ+Ô+Ð+Ø×Ò tÐÑ,Ô,Ð,à)¨zÐ,IÐ,IÐ,IÑIˆÝ˜o¸Ð<Ñ<Ô<Ð<åÐ7¸ÑIÔIð 	/ð 	/ÝÐ8Ð:JÑKÔKð	/ð 	/õ Ô+¨JÀ^ÐTÑTÔTˆGØ"Ð"�7˜d�?Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"�7˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�7Ñ"Ô"Ð"Õ"Ô"�7Ñ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ø+°Ð.QÐ.QÐ.QÑQˆLØÔ&Ð(Ð&Ð&Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�<Ñ(Ô(Ð(Õ(Ô(�<Ñ(Ô(Ð(Ð(Õ(Ô(Ð&Ñ(Ô(Õ(Ô(Ð(Ñ(Ô(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(õ Ô,¨ZÐFXÐYÑYÔYˆHØ#Ð#�8˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#�8˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�8Ñ#Ô#Ð#Õ#Ô#�8Ñ#Ô#Ð#Ð#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ø!1°zÐ4[Ð4[Ð4[Ñ![ÐØ%Ô,Ð.Ð,Ð,Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.Ð%Ñ.Ô.Ð.Õ.Ô.Ð%Ñ.Ô.Ð.Ð.Õ.Ô.Ð,Ñ.Ô.Õ.Ô.Ð.Ñ.Ô.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/s7   Á"MÁ3KMÌ:MÍM
	Í
MÍM
	ÍMÍM"Í%M"c                 óÖ	  — |dz  }|                      d¦  «         t          j        t          |¦  «        ¦  «        }|j        } |¦   «         }||k    }|sèt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}t          j        }d
} ||¦  «        }d
}	||	u }
|
sÚt          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndt          j
        |¦  «        t          j
        |¦  «        t          j
        |¦  «        t          j
        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}x}x}
}	t          j        }d} ||¦  «        }d
}	||	u }
|
sÚt          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndt          j
        |¦  «        t          j
        |¦  «        t          j
        |¦  «        t          j
        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}x}x}
}	t          dz  dz  }|                     ¦   «         �rzt          j        d¦  «        }d
}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}d
S d
S )uU   XÃ¡c nháº­n resolve_audio_asset tÃ¬m tháº¥y file trÃªn cÃ¡c thÆ° má»¥c audio chuáº©n.zmy_test_bgm.m4aÚdummyr~   )zF%(py0)s == %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.resolve
}()
}ÚresolvedÚdummy_audio©r‚   rƒ   rŠ   r‘   úassert %(py8)srö   Nr‹   )zY%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.resolve_audio_asset
}(%(py4)s)
} is %(py9)sr  )r‚   rƒ   rŠ   r‘   Úpy9zassert %(py11)sÚpy11rw   rO   zscene01_bgm.m4arñ   ró   r_   rØ   rÚ   r„   )z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)sr�   r…   r†   )Ú
write_textr  Úresolve_audio_assetr5   Úresolver¦   r§   r¨   r©   rª   r«   r¬   r­   Ú
ASSETS_DIRr®   Úname)r¯   rq   r  r  r·   r¿   rµ   r¾   Ú@py_format9rÂ   rÿ   r   Ú@py_format12Úrepo_bgmr_   r½   rÝ   r¸   r¶   r¹   s                       r:   Ú&test_02_resolve_audio_asset_resolutionz@TestEBUR128AudioMastering.test_02_resolve_audio_asset_resolution  sŠ  € àÐ!2Ñ2ˆØ×Ò˜wÑ'Ô'Ð'õ Ô)­#¨kÑ*:Ô*:Ñ;Ô;ˆØ&Ô.Ð0Ð.Ð.Ñ0Ô0Ð0ˆxÐ0Ò0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0ˆxÐ0Ð0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0ˆxÑ0Ô0Ð0Õ0Ô0ˆxÑ0Ô0Ð0Ð0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0˜;Ñ0Ô0Ð0Õ0Ô0˜;Ñ0Ô0Ð0Ð0Õ0Ô0Ð.Ñ0Ô0Õ0Ô0Ð0Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0õ Ô%Ð3 dÐ3Ð%Ð% dÑ+Ô+Ð3¨tÐ3Ð+¨tÐ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð+¨tÐ3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3�rÑ3Ô3Ð3Õ3Ô3�rÑ3Ô3Ð3Ð3Õ3Ô3Ð%Ñ3Ô3Õ3Ô3 dÑ3Ô3Õ3Ô3Ð+Ñ3Ô3Õ3Ô3¨tÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ÝÔ%Ð1 bÐ1Ð%Ð% bÑ)Ô)Ð1¨TÐ1Ð)¨TÐ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð)¨TÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�rÑ1Ô1Ð1Õ1Ô1�rÑ1Ô1Ð1Ð1Õ1Ô1Ð%Ñ1Ô1Õ1Ô1 bÑ1Ô1Õ1Ô1Ð)Ñ1Ô1Õ1Ô1¨TÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1õ  Ñ'Ð*;Ñ;ˆØ�?Š?ÑÔñ 	1ÝÔ(Ð):Ñ;Ô;ˆCØ"Ð"�3˜d�?Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"�3˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�3Ñ"Ô"Ð"Õ"Ô"�3Ñ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ø”8Ð0Ð0Ð0�8Ð0Ò0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0�8Ð0Ð0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0�3Ñ0Ô0Ð0Õ0Ô0�3Ñ0Ô0Ð0Ð0Õ0Ô0�8Ñ0Ô0Õ0Ô0Ð0Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ð	1ð 	1r<   N)ræ   rç   rè   ré   r  r  r*  rÌ   r<   r:   rë   rë   Ý   sJ   € € € € € ØSÐSðQð Qð Qð(/ð /ð /ð21ð 1ð 1ð 1ð 1r<   rë   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestSceneGatePreflightGatinguZ   Kiá»ƒm thá»­ cá»•ng kiá»ƒm duyá»‡t Táº§ng 2 (Scene Gate) trÆ°á»›c khi xuáº¥t Scene Master.c           	      óP  — t          dddt          dd¬¦  «        d¬¦  «        }t          d|¬	¦  «        5  t          j        d
ddg¦  «        }|j        }d}||u }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}ddd¦  «         dS # 1 swxY w Y   dS )uR   Khi Scene Gate phÃª duyá»‡t (score >= 0.8), quy trÃ¬nh concat Ä‘Æ°á»£c thá»±c thi.gq=
×£pí?TÚAPPROVEgffffffî?©Újunction_smoothnessÚscorez"Junctions smooth, eyelines aligned©Úoverall_scoreÚapprovedÚsuggested_actionÚ
scene_evalÚcritique_notesú+production_orchestrator.evaluate_scene_gate©Úreturn_valueÚep01_scene01ú	shot1.mp4ú	shot2.mp4r‹   ©z0%(py2)s
{%(py2)s = %(py0)s.approved
} is %(py5)sÚverdictr�   r…   r†   NrÉ   )ú>=)z5%(py2)s
{%(py2)s = %(py0)s.overall_score
} >= %(py5)sr~   ©z8%(py2)s
{%(py2)s = %(py0)s.suggested_action
} == %(py5)s©r   r   r   r  Úevaluate_scene_gater4  r¦   r§   r¨   r©   rª   r«   r¬   r­   r3  r5  )r¯   Úapproved_verdictr?  rµ   r¶   r·   r¸   r¹   s           r:   Ú)test_03_scene_gate_approved_allows_concatzFTestSceneGatePreflightGating.test_03_scene_gate_approved_allows_concat)  sh  € å-ØØØ&Ý&¸4ÀtÐLÑLÔLØ?ð
ñ 
ô 
Ðõ Ð@ÐO_Ð`Ñ`Ô`ð 	9ð 	9ÝÔ,¨^¸kÈ;Ð=WÑXÔXˆGØÔ#Ð+ tÐ+Ð# tÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð# tÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�7Ñ+Ô+Ð+Õ+Ô+�7Ñ+Ô+Ð+Ð+Õ+Ô+Ð#Ñ+Ô+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔ(Ð/¨CÐ/Ð(¨CÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð(¨CÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/�7Ñ/Ô/Ð/Õ/Ô/�7Ñ/Ô/Ð/Ð/Õ/Ô/Ð(Ñ/Ô/Õ/Ô/¨CÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØÔ+Ð8¨yÐ8Ð+¨yÒ8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð+¨yÐ8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8�7Ñ8Ô8Ð8Õ8Ô8�7Ñ8Ô8Ð8Ð8Õ8Ô8Ð+Ñ8Ô8Õ8Ô8¨yÑ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ð		9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ó   µIJÊJÊ"Jc           	      óP  — t          dddt          dd¬¦  «        d¬¦  «        }t          d|¬	¦  «        5  t          j        d
ddg¦  «        }|j        }d}||u }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k     }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}ddd¦  «         dS # 1 swxY w Y   dS )ud   Khi Scene Gate tá»« chá»‘i (score < 0.8), quy trÃ¬nh concat bá»‹ cháº·n Ä‘á»©ng vÃ  tráº£ vá»� None.g×£p=
×ã?FÚRETAKE_SHOTrk   r/  z0Severe 180-degree axis jump at shot 2 transitionr2  r8  r9  r;  r<  r=  r‹   r>  r?  r�   r…   r†   NrÉ   r—   )z4%(py2)s
{%(py2)s = %(py0)s.overall_score
} < %(py5)sr~   rA  rB  )r¯   Úrejected_verdictr?  rµ   r¶   r·   r¸   r¹   s           r:   Ú(test_03_scene_gate_rejected_halts_concatzETestSceneGatePreflightGating.test_03_scene_gate_rejected_halts_concat8  sh  € å-ØØØ*Ý&¸3ÀdÐKÑKÔKØMð
ñ 
ô 
Ðõ Ð@ÐO_Ð`Ñ`Ô`ð 	=ð 	=ÝÔ,¨^¸kÈ;Ð=WÑXÔXˆGØÔ#Ð, uÐ,Ð# uÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð# uÐ,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�7Ñ,Ô,Ð,Õ,Ô,�7Ñ,Ô,Ð,Ð,Õ,Ô,Ð#Ñ,Ô,Õ,Ô, uÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÔ(Ð.¨3Ð.Ð(¨3Ò.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð(¨3Ð.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.�7Ñ.Ô.Ð.Õ.Ô.�7Ñ.Ô.Ð.Ð.Õ.Ô.Ð(Ñ.Ô.Õ.Ô.¨3Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØÔ+Ð<¨}Ð<Ð+¨}Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð+¨}Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<�7Ñ<Ô<Ð<Õ<Ô<�7Ñ<Ô<Ð<Ð<Õ<Ô<Ð+Ñ<Ô<Õ<Ô<¨}Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ð		=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð 	=ð 	=rF  N)ræ   rç   rè   ré   rE  rJ  rÌ   r<   r:   r,  r,  &  s8   € € € € € ØdÐdð9ð 9ð 9ð=ð =ð =ð =ð =r<   r,  c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )Ú!TestMultiSceneFullEpisodeAssemblyuR   Kiá»ƒm thá»­ ghÃ©p ná»‘i hoÃ n chá»‰nh 10 PhÃ¢n cáº£nh thÃ nh Ep01 Feature Master.c                 óž  — g }t          dd¦  «        D ]I}d|d›�}||› d�z  }t          |dd|dz  z   |d	z  d
k    rdnd¬¦  «         |                     |¦  «         ŒJ|dz  }t          ¦   «         }g }g }	t	          |¦  «        D ]E\  }}
|                     dt          |
¦  «        g¦  «         |	                     d|› d|› d�¦  «         ŒFd                     |	¦  «        › dt          |¦  «        › d�}|dg|¢d‘|‘d‘d‘d‘d‘d‘d‘d‘d‘d‘d ‘d!‘d"‘d#‘d$‘t          |¦  «        ‘}t          j
        |d%d%¬&¦  «        }|j        }d
}||k    }|sªt          j        d'|fd(||f¦  «        d)t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd)t          j        |¦  «        t          j        |¦  «        d*œz  }d+d,|iz  }t%          t          j        |¦  «        ¦  «        ‚d-x}x}}|j        } |¦   «         }|s‹d.d/t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd/t          j        |¦  «        t          j        |¦  «        d0œz  }t%          t          j        |¦  «        ¦  «        ‚d-x}}t+          |¦  «        }|d1         }d%}||u }|slt          j        d2|fd3||f¦  «        t          j        |¦  «        t          j        |¦  «        d4œz  }d5d6|iz  }t%          t          j        |¦  «        ¦  «        ‚d-x}x}}|d7         }d%}||u }|slt          j        d2|fd3||f¦  «        t          j        |¦  «        t          j        |¦  «        d4œz  }d5d6|iz  }t%          t          j        |¦  «        ¦  «        ‚d-x}x}}|d8         }d }||k    }|slt          j        d'|fd9||f¦  «        t          j        |¦  «        t          j        |¦  «        d4œz  }d5d6|iz  }t%          t          j        |¦  «        ¦  «        ‚d-x}x}}|d:         }d;}||k    }|slt          j        d'|fd9||f¦  «        t          j        |¦  «        t          j        |¦  «        d4œz  }d5d6|iz  }t%          t          j        |¦  «        ¦  «        ‚d-x}x}}|d<         }d	}||k    }|slt          j        d'|fd9||f¦  «        t          j        |¦  «        t          j        |¦  «        d4œz  }d5d6|iz  }t%          t          j        |¦  «        ¦  «        ‚d-x}x}}|d=         }d>}||z
  }t-          |¦  «        }d?}||k     }|sÚt          j        d@|fdA||f¦  «        dBt          j        ¦   «         v st          j        t,          ¦  «        rt          j        t,          ¦  «        ndBt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dCœz  }dDdE|iz  }t%          t          j        |¦  «        ¦  «        ‚d-x}x}x}x}x}}d-S )FuR   Táº¡o 10 synthetic scene masters vÃ  ghÃ©p thÃ nh ep01_full_feature_master_v1.mp4.rl   é   Ú
ep01_sceneÚ02dr  rÐ   i,  é(   r•   r   Úbluer   )r   r   r   zep01_full_feature_master_v1.mp4r"   rt   ru   rv   rw   rx   ry   r    rz   r$   r{   r|   r%   r&   z-crfÚ18r)   r*   r+   r,   r-   r.   Tr}   r~   r€   r_   r�   r…   r†   Nr‡   Úout_feature_masterr‰   rT   r‹   r�   rŽ   r�   r‘   r   rW   r“   rQ   r”   rR   rS   g       @g      Ð?r—   r™   rš   r›   r�   rž   )r    r;   r¢   r   r¡   r4   r5   r£   r¤   r6   r7   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   rd   rš   )r¯   rq   Úscene_filesrp   Úsc_idÚsc_pathrT  r8   r±   r²   Úscr´   r9   r_   rµ   r¶   r·   r¸   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   s                                 r:   Ú)test_04_assemble_10_scenes_feature_masterzKTestMultiSceneFullEpisodeAssembly.test_04_assemble_10_scenes_feature_masterO  s7  € àˆÝ�q˜"‘”ð 	(ð 	(ˆAØ( Ð(Ð(Ð(ˆEØ EÐ!?Ð!?Ð!?Ñ?ˆGÝ! '°C¸cÀAÈÁF¹lÐ\]Ð`aÑ\aÐefÒ\fÐ\fÐRXÐRXÐlsÐtÑtÔtÐtØ×Ò˜wÑ'Ô'Ð'Ð'à%Ð(IÑIÐõ ‘”ˆØˆØˆÝ˜{Ñ+Ô+ð 	7ð 	7‰EˆAˆrØ�MŠM˜4¥ R¡¤˜/Ñ*Ô*Ð*Ø×ÒÐ 5 AÐ 5Ð 5¨QÐ 5Ð 5Ð 5Ñ6Ô6Ð6Ð6ØŸ7š7 <Ñ0Ô0Ð[Ð[½3¸{Ñ;KÔ;KÐ[Ð[Ð[ˆð �Dð
Ø!ð
àð
à,ð
ð ð
ð ð
ð "ð
ð $)ð
ð ð	
ð ð	
ð  &ð	
ð (,ð	
ð
 ð
ð
 ð
ð
 "ð
ð
 $*ð
ð
 ,1ð
ð
 3:ð
õ Ð"Ñ#Ô#ð
ˆõ Œn˜S°¸DÐAÑAÔAˆØŒ~Ð" Ð"ˆ~ Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ~ Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Ð"Õ"Ô"ˆ~Ñ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ø!Ô(Ð*Ð(Ð(Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*Ð!Ñ*Ô*Ð*Õ*Ô*Ð!Ñ*Ô*Ð*Ð*Õ*Ô*Ð(Ñ*Ô*Õ*Ô*Ð*Ñ*Ô*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*åÐ 2Ñ3Ô3ˆØ�KÔ Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�KÔ Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�MÔ"Ð+ eÐ+Ð" eÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�MÔ"Ð+ eÐ+Ð" eÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�JÔÐ$ 1Ð$Ð 1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð 1Ð$Ñ$Ô$Õ$Ô$ÐÑ$Ô$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$àÐ)Ô*Ð8¨SÐ8Ð*¨SÑ0Ð8�sÐ0Ñ1Ô1Ð8°DÐ8Ð1°DÒ8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð1°DÐ8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8�sÑ8Ô8Ð8Õ8Ô8�sÑ8Ô8Ð8Ð8Õ8Ô8Ð*Ñ8Ô8Õ8Ô8¨SÑ8Ô8Õ8Ô8Ð1Ñ8Ô8Õ8Ô8°DÑ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8r<   c                 óò  — d„ t          dd¦  «        D ¦   «         }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|D �]Ç}|› d�}|› d�}	|j
        }
d} |
|¦  «        }|sžddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}
x}}|	j
        }
d} |
|¦  «        }|sžddt	          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}
x}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d}||	v }|s—t          j        d|fd||	f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}�ŒÉdS )uP   Kiá»ƒm tra quy chuáº©n Ä‘áº·t tÃªn vÃ  Ä‘Æ°á»�ng dáº«n cho 10 scenes cá»§a Ep01.c                 ó   — g | ]}d |d›�‘Œ	S )rO  rP  rÌ   )rJ   rp   s     r:   rr   zjTestMultiSceneFullEpisodeAssembly.test_04_export_naming_and_path_hierarchy_conformance.<locals>.<listcomp>z  s$   € ÐDÐDÐD°!Ð- aÐ-Ð-Ð-ÐDÐDÐDr<   rl   rN  é
   r~   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr¤   Útarget_scenes)r‚   r�   rÙ   r‘   r  rö   Nr  r  rO  zLassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}Úraw_master_namer  Úaudio_master_nameÚ
_master_v1©Úin)z%(py1)s in %(py3)s)r�   rÙ   rÚ   r„   Ú_master_audio_v1)r    r¤   r¦   r§   r¨   r©   rª   r«   r¬   r­   Ú
startswith)r¯   r]  r½   r¿   r¶   r¾   r'  rX  r^  r_  rµ   r·   r¼   rÝ   r¸   s                  r:   Ú4test_04_export_naming_and_path_hierarchy_conformancezVTestMultiSceneFullEpisodeAssembly.test_04_export_naming_and_path_hierarchy_conformancex  s‘  € àDÐDµu¸QÀ±|´|ÐDÑDÔDˆÝ�=Ñ!Ô!Ð' RÐ'Ð! RÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð! RÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�sÑ'Ô'Ð'Õ'Ô'�sÑ'Ô'Ð'Ð'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�=Ñ'Ô'Ð'Õ'Ô'�=Ñ'Ô'Ð'Ð'Õ'Ô'Ð!Ñ'Ô'Õ'Ô' RÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'àð 	;ñ 	;ˆBØ!#Ð3Ð3Ð3ˆOØ#%Ð ;Ð ;Ð ;ÐØ"Ô-Ð;¨lÐ;Ð-Ð-¨lÑ;Ô;Ð;Ð;Ð;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;�?Ñ;Ô;Ð;Õ;Ô;�?Ñ;Ô;Ð;Ð;Õ;Ô;Ð-Ñ;Ô;Õ;Ô;¨lÑ;Ô;Õ;Ô;Ð;Ñ;Ô;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ø$Ô/Ð=°Ð=Ð/Ð/°Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=Ð$Ñ=Ô=Ð=Õ=Ô=Ð$Ñ=Ô=Ð=Ð=Õ=Ô=Ð/Ñ=Ô=Õ=Ô=°Ñ=Ô=Õ=Ô=Ð=Ñ=Ô=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ØÐ2�< ?Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2�< ?Ð2Ñ2Ô2Õ2Ô2�<Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2 ?Ñ2Ô2Ð2Õ2Ô2 ?Ñ2Ô2Ð2Ð2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ø%Ð:Ð%Ð):Ð:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð%Ð):Ð:Ñ:Ô:Õ:Ô:Ð%Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:Ð):Ñ:Ô:Ð:Õ:Ô:Ð):Ñ:Ô:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ñ:ð	;ð 	;r<   c           	      ó>  — |dz  }|dz  }|                      d¬¦  «         |                      d¬¦  «         d}||› d�z  }||› d�z  }||› d�z  }t          |d	¬
¦  «         t          |d	¬
¦  «         t          |d	¬
¦  «         t          d|¦  «        5  t          d|¦  «        5  t          j        |¦  «        }||k    }	|	sÂt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d}	|                     ¦   «          t          j        |¦  «        }||k    }	|	sÂt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d}	|                     ¦   «          t          j        |¦  «        }||k    }	|	sÂt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d}	ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )ua   XÃ¡c nháº­n resolve_scene_master Æ°u tiÃªn: _master_audio_v* > _cinematic_master_v* > _master_v*.r  r   Tr  Úep01_scene02r  r  r  rÐ   r  r	  r  r~   )z%(py0)s == %(py2)sr_   Úf_aud)r‚   rƒ   zassert %(py4)srŠ   NÚres2Úf_cinÚres3Úf_reg)r3   r;   r   r  Úresolve_scene_masterr¦   r§   r¨   r©   rª   r«   r¬   r­   Úunlink)r¯   rq   Úmock_exportsÚmock_videosrX  rl  rj  rh  r_   rµ   Ú@py_format3rº   ri  rk  s                 r:   Ú+test_04_resolve_scene_master_prioritizationzMTestMultiSceneFullEpisodeAssembly.test_04_resolve_scene_master_prioritization…  sŒ  € à )Ñ+ˆØ Ñ)ˆØ×Ò 4ÐÑ(Ô(Ð(Ø×Ò $ÐÑ'Ô'Ð'àˆØ Ð3Ð3Ð3Ñ3ˆØ "Ð>Ð>Ð>Ñ>ˆØ "Ð:Ð:Ð:Ñ:ˆå˜e¨cÐ2Ñ2Ô2Ð2Ý˜e¨cÐ2Ñ2Ô2Ð2Ý˜e¨cÐ2Ñ2Ô2Ð2åÐ8¸,ÑGÔGð 	!ð 	!ÝÐ7¸ÑEÔEð	!ð 	!õ Ô)¨"Ñ-Ô-ˆCØ˜%’<ÐÐÐÕÔÐÐÐÐ�3˜%ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔ˜%ÑÔÐÕÔ˜%ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐð �LŠL‰NŒNˆNÝÔ*¨2Ñ.Ô.ˆDØ˜5’=Ð Ð Ð Õ Ô Ð Ð Ð Ð �4˜5Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �4Ñ Ô Ð Õ Ô �4Ñ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˜5Ñ Ô Ð Õ Ô ˜5Ñ Ô Ð Ð Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð ð �LŠL‰NŒNˆNÝÔ*¨2Ñ.Ô.ˆDØ˜5’=Ð Ð Ð Õ Ô Ð Ð Ð Ð �4˜5Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �4Ñ Ô Ð Õ Ô �4Ñ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˜5Ñ Ô Ð Õ Ô ˜5Ñ Ô Ð Ð Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!s7   ÂNÂ%K	M:Í.NÍ:M>	Í>NÎM>	ÎNÎNÎNc           	      óv  — |dz  }|dz  }|                      d¬¦  «         |                      d¬¦  «         t          d|¦  «        5  t          d|¦  «        5  t          j        dd¬¦  «        }d	}||u}|s—t	          j        d
|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}}d}	|j        }
|	|
v }|sªt	          j        d|fd|	|
f¦  «        t	          j	        |	¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |
¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}	x}}
t          j        dd¬¦  «        }d	}||u }|s—t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}}d	d	d	¦  «         n# 1 swxY w Y   d	d	d	¦  «         d	S # 1 swxY w Y   d	S )uF   XÃ¡c nháº­n assemble_episode_master há»— trá»£ dry_run vÃ  check_only.r  r   Tr  r	  r  Úep01)Ú
episode_idÚdry_runNrñ   ró   r_   rØ   rÚ   r„   Úep01_full_feature_masterra  )z,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.name
})r�   rÙ   r„   r…   r†   )ru  Ú
check_onlyr‹   rÖ   Ú	res_check)r3   r   r  Úassemble_episode_masterr¦   r§   r¨   r©   rª   r«   r¬   r­   r&  )r¯   rq   ro  rp  r_   r½   rµ   rÝ   r¸   r¼   r¶   r¹   ry  s                r:   Ú1test_04_assemble_episode_master_dry_run_and_checkzSTestMultiSceneFullEpisodeAssembly.test_04_assemble_episode_master_dry_run_and_check¥  s±  € à )Ñ+ˆØ Ñ)ˆØ×Ò 4ÐÑ(Ô(Ð(Ø×Ò $ÐÑ'Ô'Ð'åÐ8¸,ÑGÔGð 		%ð 		%ÝÐ7¸ÑEÔEð		%ð 		%õ Ô,¸ÈÐMÑMÔMˆCØ"Ð"�3˜d�?Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"�3˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�3Ñ"Ô"Ð"Õ"Ô"�3Ñ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ø-Ð9°´Ð9Ð-°Ð9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9Ð-°Ð9Ñ9Ô9Õ9Ô9Ð-Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9°Ñ9Ô9Ð9Õ9Ô9°Ñ9Ô9Ð9Ð9Õ9Ô9°Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9õ Ô2¸fÐQUÐVÑVÔVˆIØ $Ð$�9 Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$�9 Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�9Ñ$Ô$Ð$Õ$Ô$�9Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$ð		%ð 		%ð 		%ñ 		%ô 		%ð 		%ð 		%ð 		%ð 		%ð 		%ð 		%øøøð 		%ð 		%ð 		%ð 		%ð 		%ð 		%ð 		%ñ 		%ô 		%ð 		%ð 		%ð 		%ð 		%ð 		%ð 		%ð 		%øøøð 		%ð 		%ð 		%ð 		%ð 		%ð 		%s7   ÁJ.ÁH2JÊ
J.ÊJ	ÊJ.ÊJ	ÊJ.Ê.J2Ê5J2N)ræ   rç   rè   ré   rY  re  rr  r{  rÌ   r<   r:   rL  rL  L  sX   € € € € € Ø\Ð\ð'9ð '9ð '9ðR;ð ;ð ;ð!ð !ð !ð@%ð %ð %ð %ð %r<   rL  c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )Ú&TestNegativeScenariosAndFaultToleranceu\   Kiá»ƒm thá»­ cÃ¡c tÃ¬nh huá»‘ng ngoáº¡i lá»‡, thiáº¿u file, file cÃ¢m vÃ  tá»± phá»¥c há»“i.c           	      ó  — |dz  }|dz  }|                      d¬¦  «         |                      d¬¦  «         t          dd¦  «        D ]&}|dk    rŒ	d|d	›�}t          ||› d
�z  d¬¦  «         Œ't          d|¦  «        5  t          d|¦  «        5  t	          j        d¬¦  «        }d}||u }|s¬t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }	t          j        d¦  «        dz   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uh   Khi thiáº¿u 1 cáº£nh trong chuá»—i 10 cáº£nh, assembler tá»« chá»‘i xuáº¥t xÆ°á»Ÿng vÃ  tráº£ vá»� None.r  r   Tr  rl   rN  é   rO  rP  r  rÐ   r  r	  r  rt  )ru  Nr‹   rÖ   r_   rØ   u4   Pháº£i abort vÃ  tráº£ vá»� None khi thiáº¿u cáº£nh!ú
>assert %(py5)sr„   )r3   r    r;   r   r  rz  r¦   r§   r¨   r©   rª   r«   rý   r¬   r­   )r¯   rq   ro  rp  rp   rX  r_   r½   rµ   rÝ   r¸   s              r:   Ú%test_05_missing_scene_aborts_assemblyzLTestNegativeScenariosAndFaultTolerance.test_05_missing_scene_aborts_assembly¿  s†  € à )Ñ+ˆØ Ñ)ˆØ×Ò 4ÐÑ(Ô(Ð(Ø×Ò $ÐÑ'Ô'Ð'õ �q˜"‘”ð 	\ð 	\ˆAØ�AŠvˆvØØ%˜aÐ%Ð%Ð%ˆBÝ! ,°BÐ1LÐ1LÐ1LÑ"LÐWZÐ[Ñ[Ô[Ð[Ð[åÐ8¸,ÑGÔGð 	Wð 	WÝÐ7¸ÑEÔEð	Wð 	WåÔ,¸Ð?Ñ?Ô?ˆCØÐV�3˜$�;ÐVÐVÐVÕVÔVÐVÐVÐVÐV�3˜$ÐVÑVÔVÐVÕVÔVÑVÔVÐVÐVÕVÔV�3ÑVÔVÐVÕVÔV�3ÑVÔVÐVÐVÕVÔV˜$ÑVÔVÐVÐVÑVÐVÕVÔVÐ VÑVÔVÐVÑVÐVÐVÐVÑVÐVÕVÕVÔVÐVÑVÔVÑVÔVÐVÐVÐVÐVÐVð	Wð 	Wð 	Wñ 	Wô 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wøøøð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wñ 	Wô 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wøøøð 	Wð 	Wð 	Wð 	Wð 	Wð 	Ws7   Á>FÂCE)ÅFÅ)E-	Å-FÅ0E-	Å1FÆFÆFc                 óÂ  — t          |dz  ddd¬¦  «        }t          |dz  dd¬¦  «        }|d	z  }t          ¦   «         }|                     t          |¦  «        t          |¦  «        gt          |¦  «        d
d¬¦  «        }d}||u }|s—t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }	dd|	iz  }
t          t	          j        |
¦  «        ¦  «        ‚dx}}|j        } |¦   «         }|s‹ddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}t          |¦  «        }|d         }d}||u }|slt	          j        d|fd||f¦  «        t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt	          j        d|fd||f¦  «        t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}|d          }d!}||k    }|slt	          j        d|fd||f¦  «        t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}dS )"uh   Shot bá»‹ cÃ¢m (-an) tá»± Ä‘á»™ng Ä‘Æ°á»£c chÃ¨n silence fallback (aevalsrc=0) khÃ´ng lÃ m crash FFmpeg.zwith_audio.mp4rk   r   T©r   r   r   z
silent.mp4F©r   r   zfallback_master.mp4rŸ   rä   )rÓ   rÕ   r‹   rÖ   r×   rØ   rÚ   r„   Nr‡   rˆ   r‰   r   r�   rŽ   r�   r‘   rW   r*   r~   r“   rQ   r”   )r;   r
   rÛ   r5   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   rd   )r¯   rq   Úclip_with_audioÚclip_silentrˆ   rÜ   r×   r½   rµ   rÝ   r¸   r·   rº   r»   r¼   r¾   s                   r:   Ú%test_05_missing_audio_stream_fallbackzLTestNegativeScenariosAndFaultTolerance.test_05_missing_audio_stream_fallbackÒ  s  € å/°Ð;KÑ0KÐVYÐ`cÐosÐtÑtÔtˆÝ+¨H°|Ñ,CÈcÐ]bÐcÑcÔcˆØÐ 5Ñ5ˆ
å&Ñ(Ô(ˆØ×/Ò/Ý�Ñ!Ô!¥3 {Ñ#3Ô#3Ð4Ý�
‰OŒOØØ%ð	 0ñ 
ô 
ˆð Ðˆr�TˆzÐÐÐÕÔÐÐÐÐˆr�TÐÑÔÐÕÔÑÔÐÐÕÔˆrÑÔÐÕÔˆrÑÔÐÐÕÔ�TÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ Ð"Ð Ð Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Ð"Õ"Ô"Ð Ñ"Ô"Õ"Ô"Ð"Ñ"Ô"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"å 
Ñ+Ô+ˆØ�KÔ Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�MÔ"Ð+ eÐ+Ð" eÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�MÔ"Ð+ eÐ+Ð" eÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r<   c           	      ó   — t          ddi fg¬¦  «        5  t          dd¬¦  «        5  t          j        d¦  «        }d}||u }|s—t          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )u\   Khi thiáº¿u video cho shot trong scene, concat_scene_shots dá»«ng láº¡i vÃ  tráº£ vá»� None.ú+production_orchestrator.get_shots_for_sceneÚep01_scene99_shot01r9  ú+production_orchestrator.find_rendered_videoNÚep01_scene99r‹   rÖ   ÚresultrØ   rÚ   r„   )r   r  Úconcat_scene_shotsr¦   r§   r¨   r©   rª   r«   r¬   r­   )r¯   rq   r�  r½   rµ   rÝ   r¸   s          r:   Ú.test_05_concat_scene_shots_missing_shot_abortszUTestNegativeScenariosAndFaultTolerance.test_05_concat_scene_shots_missing_shot_abortsç  s¾  € åÐ@ÐQfÐhjÐPkÐOlÐmÑmÔmð 	"ð 	"ÝÐ@ÈtÐTÑTÔTð	"ð 	"åÔ*¨>Ñ:Ô:ˆFØ!Ð!�6˜T�>Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!�6˜TÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�6Ñ!Ô!Ð!Õ!Ô!�6Ñ!Ô!Ð!Ð!Õ!Ô!˜TÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s5   •D§B8C+ÃDÃ+C/	Ã/DÃ2C/	Ã3DÄDÄ
Dc           	      ó¤	  ‡— t          |dz  ddd¬¦  «        }t          |dz  dd¬¦  «        }|d	z  }d
i fdi fg}||dœŠt          d|¬¦  «        5  t          dˆfd„¬¦  «        5  t          j        t          dd¬¦  «        5  t	          j        dt          |¦  «        d¬¦  «        }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   d}||u}|s¬t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }	t          j        d¦  «        dz   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}|j        } |¦   «         }|s¤t          j        d|› d�¦  «        dz   d t          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd t          j        |¦  «        t          j        |¦  «        d!œz  }t          t          j        |¦  «        ¦  «        ‚dx}}t#          |¦  «        }|d"         }d}||u }|s�t          j        d#|fd$||f¦  «        t          j        |¦  «        t          j        |¦  «        d%œz  }t          j        d&¦  «        d'z   d(|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d)         }d*}||k    }|s�t          j        d+|fd,||f¦  «        t          j        |¦  «        t          j        |¦  «        d%œz  }t          j        d-¦  «        d'z   d(|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d.         }d/}||k    }|s�t          j        d+|fd,||f¦  «        t          j        |¦  «        t          j        |¦  «        d%œz  }t          j        d0¦  «        d'z   d(|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d1         }d2}||k    }|s�t          j        d+|fd,||f¦  «        t          j        |¦  «        t          j        |¦  «        d%œz  }t          j        d3¦  «        d'z   d(|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )4u–   XÃ¡c nháº­n Fallback Concat trong production_orchestrator hoáº¡t Ä‘á»™ng chÃ­nh xÃ¡c khi gáº·p clip cÃ¢m (-an) vÃ  AudioContinuityEngine tháº¥t báº¡i.zshot_01.mp4rk   r   Trƒ  zshot_02.mp4Fr„  zfallback_scene_master.mp4Úep01_test_shot01Úep01_test_shot02)r‘  r’  r‰  r9  r‹  c                 ó.   •— ‰                      | ¦  «        S )NrG   )ÚsidÚshot_maps    €r:   ú<lambda>zoTestNegativeScenariosAndFaultTolerance.test_05_fallback_concat_with_silent_clip_without_crash.<locals>.<lambda>û  s   ø€ ÐZb×ZfÒZfÐgjÑZkÔZk€ r<   )Úside_effectrÛ   r  )r   Úenable_criticNrñ   ró   r�  rØ   uD   Fallback concat khÃ´ng Ä‘Æ°á»£c tráº£ vá»� None khi ghÃ©p clip cÃ¢m!r€  r„   zOutput file u(    pháº£i tá»“n táº¡i sau fallback concat!zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Ú
out_targetr‰   r   r‹   r�   rŽ   uB   Output pháº£i cÃ³ stream audio (nhá»� fallback silence injection)!rú   r‘   rW   r*   r~   r“   u   Codec audio pháº£i lÃ  aac!rR   r•   u'   Audio layout pháº£i lÃ  stereo 2 kÃªnh!rQ   r”   u   Sample rate pháº£i lÃ  48kHz!)r;   r   Úobjectr
   r  rŽ  r5   r¦   r§   r¨   r©   rª   r«   rý   r¬   r­   r®   rd   )r¯   rq   Úc1Úc2r™  Ú
mock_shotsr�  r½   rµ   rÝ   r¸   r·   rº   r»   r¼   r¾   r•  s                   @r:   Ú6test_05_fallback_concat_with_silent_clip_without_crashz]TestNegativeScenariosAndFaultTolerance.test_05_fallback_concat_with_silent_clip_without_crashî  s«  ø€ å" 8¨mÑ#;ÀcÐPSÐ_cÐdÑdÔdˆÝ" 8¨mÑ#;ÀcÐUZÐ[Ñ[Ô[ˆØÐ ;Ñ;ˆ
à)¨2Ð.Ð1CÀRÐ0HÐIˆ
à "Ø "ð
ð 
ˆõ
 Ð@ÈzÐZÑZÔZð 	pð 	pÝÐ@ÐNkÐNkÐNkÐNkÐlÑlÔlð	pð 	påŒ\Õ/Ð1NÐ]bÐcÑcÔcð	pð 	põ Ô*Ð+<Í#ÈjÉ/Ì/ÐinÐoÑoÔoˆFð	pð 	pð 	pñ 	pô 	pð 	pð 	pð 	pð 	pð 	pð 	pøøøð 	pð 	pð 	pð 	pð 	pð 	pð 	pñ 	pô 	pð 	pð 	pð 	pð 	pð 	pð 	pøøøð 	pð 	pð 	pð 	pð 	pð 	pð 	pñ 	pô 	pð 	pð 	pð 	pð 	pð 	pð 	pøøøð 	pð 	pð 	pð 	pð
 "Ðiˆv˜TÐ!ÐiÐiÐiÕiÔiÐiÐiÐiÐiˆv˜TÐiÑiÔiÐiÕiÔiÑiÔiÐiÐiÕiÔiˆvÑiÔiÐiÕiÔiˆvÑiÔiÐiÐiÕiÔi˜TÑiÔiÐiÐiÑiÐiÕiÔiÐ#iÑiÔiÐiÑiÐiÐiÐiÑiÐiÕiÕiÔiÐiÑiÔiÑiÔiÐiÐiÐiÐiÐiØÔ ÐgÐ Ð Ñ"Ô"ÐgÐ"ÐgÕgÔgÐ$g°:Ð$gÐ$gÐ$gÑgÔgÐgÑgÐgÕgÔgÑgÔgÐgÐgÕgÔgˆzÑgÔgÐgÕgÔgˆzÑgÔgÐgÐgÕgÔgÐ ÑgÔgÕgÔgÐ"ÑgÔgÐgÐgÑgÐgÕgÕgÔgÐgÑgÔgÑgÔgÐgÐgÐgÐgÐgå 
Ñ+Ô+ˆØ�KÔ Ðn DÐnÐ  DÐ(ÐnÐnÐnÕnÔnÐnÐnÐnÐnÐ  DÐnÑnÔnÕnÔnÐ ÑnÔnÕnÔn DÑnÔnÐnÐnÑnÐnÕnÔnÐ*nÑnÔnÐnÑnÐnÐnÐnÑnÐnÕnÕnÔnÐnÑnÔnÑnÔnÐnÐnÐnÐnÐnÐnÐnØ�MÔ"ÐJ eÐJÐ" eÒ+ÐJÐJÐJÕJÔJÐJÐJÐJÐJÐ" eÐJÑJÔJÕJÔJÐ"ÑJÔJÕJÔJ eÑJÔJÐJÐJÑJÐJÕJÔJÐ-JÑJÔJÐJÑJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJØ�JÔÐO 1ÐOÐ 1Ò$ÐOÐOÐOÕOÔOÐOÐOÐOÐOÐ 1ÐOÑOÔOÕOÔOÐÑOÔOÕOÔO 1ÑOÔOÐOÐOÑOÐOÕOÔOÐ&OÑOÔOÐOÑOÐOÐOÐOÑOÐOÕOÕOÔOÐOÑOÔOÑOÔOÐOÐOÐOÐOÐOÐOÐOØ�MÔ"ÐL eÐLÐ" eÒ+ÐLÐLÐLÕLÔLÐLÐLÐLÐLÐ" eÐLÑLÔLÕLÔLÐ"ÑLÔLÕLÔL eÑLÔLÐLÐLÑLÐLÕLÔLÐ-LÑLÔLÐLÑLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLÐLÐLÐLÐLsZ   ÁC!Á%C
Â%B3Â'C
Â3B7Â7C
Â:B7Â;C
Â>C!Ã
C	ÃC!ÃC	ÃC!Ã!C%Ã(C%N)ræ   rç   rè   ré   r�  r‡  r�  rž  rÌ   r<   r:   r}  r}  ¼  s^   € € € € € ØfÐfðWð Wð Wð&,ð ,ð ,ð*"ð "ð "ðMð Mð Mð Mð Mr<   r}  )r   r   r   r   r   T)5ré   Úbuiltinsr¨   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter¦   ÚosÚsysÚrer@   Úshutilr6   Úpathlibr   Úunittest.mockr   r   ÚpytestÚ__file__r$  r2   ÚPROJECT_ROOTÚPIPELINE_DIRÚ
VIDEOS_DIRÚEXPORTS_DIRr%  r5   ÚpathÚinsertÚaudio_continuity_enginer
   r   r   Úproduction_orchestratorr  Úantigravity_critic_gater   r   r   Úassemble_ep01_featureÚ	assemblerr\   r]   Úboolr;   Údictrd   rf   rë   r,  rL  r}  rÌ   r<   r:   ú<module>r¸     s  ððð ð@ € € € € € € € € € € € € €	€	€	€	Ø 
€
€
€
Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø €€€àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€ØÐ6Ñ6€Ø˜KÑ'¨(Ñ2€
Ø˜\Ñ)€Ø˜KÑ'€
à€3€|ÑÔ˜CœHÐ$Ð$Ø„H‡O‚O�A�s�s˜<Ñ(Ô(Ñ)Ô)Ð)à RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ $Ð $Ð $Ð $Ø WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ )Ð )Ð )Ð )ð ØØØØØðð Øðàðð ðð ð	ð
 ðð ðð ðð 
ðð ð ð ð@ ð ¨$ð ð ð ð ðBW8ð W8ð W8ð W8ð W8ñ W8ô W8ð W8ð|B1ð B1ð B1ð B1ð B1ñ B1ô B1ð B1ðR=ð =ð =ð =ð =ñ =ô =ð =ðLi%ð i%ð i%ð i%ð i%ñ i%ô i%ð i%ð`JMð JMð JMð JMð JMñ JMô JMð JMð JMð JMr<   