§
    cnËjrÀ  ã                  ó<  — d Z ddl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	Z	ddl
mZ ddlmZmZmZ ddlZddlmZ ddlmZ dd	lmZmZmZmZmZmZ dd
lmZmZ ddlm Z  ddl!m"Z"  ej#        e$¦  «        Z% G d„ d¦  «        Z&dd„Z'e$dk    r e'¦   «          dS dS )uq  
Modern Windows 10/11 Fluent Desktop GUI for VideoDetection.
Há»— trá»£ quy trÃ¬nh tá»± Ä‘á»™ng Ä‘á»“ng bá»™ (Auto-Sync Data & Target) vÃ  Ä‘a ká»‹ch báº£n so sÃ¡nh:
- 1 Video Target vs ToÃ n bá»™ kho Data/
- 1 Video Target vs 1 vÃ i video tham chiáº¿u Ä‘Æ°á»£c tÃ­ch chá»�n
Sá»‘ liá»‡u Ä‘áº·c trÆ°ng (V-JEPA 2 + NeuralFP) Ä‘Æ°á»£c náº¡p sáºµn tá»©c thÃ¬ khi má»Ÿ app.
é    )ÚannotationsN)ÚPath)Ú
filedialogÚ
messageboxÚttké   )ÚMatchSegment)ÚCONFIG)ÚAPP_ROOTÚDATA_DIRÚ
TARGET_DIRÚTEMP_DIRÚclean_temp_dirÚget_ffmpeg_path)ÚCachedVideoFeaturesÚSUPPORTED_EXTENSIONS)ÚDEFAULT_SECTION_1H)ÚVideoDetectionPipelinec                  óî   — e Zd Zd.d„Zd/d„Zd/d„Zd/d„Zd/d	„Zd/d
„Zd0d„Z	d1d„Z
d/d„Zd/d„Zd/d„Zd/d„Zd2d„Zd/d„Zd/d„Zd/d„Zd/d„Zd/d„Zd/d„Zd/d „Zd/d!„Zd/d"„Zd/d#„Zd/d$„Zd3d&„Zd4d)„Zd/d*„Zd5d,„Zd-S )6ÚVideoDetectionGUIÚrootútk.TkÚreturnÚNonec                ó  — || _         | j                              d¦  «         | j                              d¦  «         | j                              dd¦  «         ddddd	d
ddddddddddœ| _        | j                              | j        d         ¬¦  «         d | _        d| _        g | _        g | _	        d | _
        i | _        g | _        |                      ¦   «          |                      ¦   «          |                      ¦   «          d S )Nu\   VideoDetection Studio - Nháº­n Diá»‡n TrÃ¹ng Láº·p Video Báº£n Quyá»�n (V-JEPA 2 & NeuralFP)Ú1180x760iü  i€  z#202020z#2b2b2bz#353535z#1a1a1az#0078d4z#106ebez#005a9eú#ffffffz#ccccccz#888888z#3d3d3dz#e81123z#107c41z#d83b01z#284b63)Úbg_baseÚbg_cardÚbg_card_hoverÚbg_inputÚaccentÚaccent_hoverÚaccent_pressedÚtext_primaryÚtext_secondaryÚ
text_mutedÚborderÚdangerÚsuccessÚwarningÚ	highlightr   ©ÚbgF)r   ÚtitleÚgeometryÚminsizeÚcolorsÚ	configureÚpipelineÚis_processingÚcached_targetsÚcached_referencesÚselected_target_videoÚref_check_varsÚlast_comparison_resultsÚ_setup_stylesÚ	_build_uiÚ_initialize_pipeline_and_sync)Úselfr   s     ú1C:\Projects\VideoDetection\src\gui\desktop_app.pyÚ__init__zVideoDetectionGUI.__init__    s   € ØˆŒ	ØŒ	�ŠÐvÑwÔwÐwØŒ	×Ò˜:Ñ&Ô&Ð&ØŒ	×Ò˜$ Ñ$Ô$Ð$ð !Ø Ø&Ø!ØØ%Ø'Ø%Ø'Ø#ØØØ Ø Ø"ð
ð 
ˆŒð$ 	Œ	×Ò˜tœ{¨9Ô5ÐÑ6Ô6Ð6à7;ˆŒØ"ˆÔð :<ˆÔØ<>ˆÔØAEˆÔ"ð 9;ˆÔà;=ˆÔ$à×ÒÑÔÐØ�ŠÑÔÐØ×*Ò*Ñ,Ô,Ð,Ð,Ð,ó    c           	     óæ  — t          j        ¦   «         }|                     d¦  «         |                     d| j        d         d¬¦  «         |                     d| j        d         | j        d         d	d
gdd¬¦  «         |                     dd| j        d         fd| j        d         fgddg¬¦  «         |                     d| j        d         | j        d         | j        d         ddd¬¦  «         |                     dd| j        d         ddddg¬¦  «         |                     dd| j        d         fgdg¬¦  «         |                     d | j        d         | j        d         dd¬!¦  «         d S )"NÚclamÚ	TNotebookr   r   )Ú
backgroundÚborderwidthzTNotebook.Tabr   r&   é   é	   ©úSegoe UIé
   Úbold)rE   Ú
foregroundÚpaddingÚfontrF   Úselectedr"   Úactiver    )rP   r   )rQ   r   )rE   rM   ÚTreeviewr%   ©rJ   rH   é   )rE   rM   ÚfieldbackgroundrO   Ú	rowheightrF   zTreeview.Headingz#181818©rJ   rH   rL   Úflaté   é   )rE   rM   rO   ÚreliefrN   úHorizontal.TProgressbar)rE   ÚtroughcolorrF   Ú	thickness)r   ÚStyleÚ	theme_user3   r2   Úmap)r>   Ústyles     r?   r;   zVideoDetectionGUI._setup_stylesL   sÕ  € Ý”	‘”ˆØ�Š˜ÑÔÐð 	�ŠØØ”{ 9Ô-Øð 	ñ 	
ô 	
ð 	
ð
 	�ŠØØ”{ 9Ô-Ø”{Ð#3Ô4Ø˜�GØ)Øð 	ñ 	
ô 	
ð 	
ð 	�	Š	ØØ# T¤[°Ô%:Ð;¸hÈÌÐTcÔHdÐ=eÐfØ/Ð1FÐGð 	ñ 	
ô 	
ð 	
ð 	�ŠØØ”{ 9Ô-Ø”{ >Ô2Ø œK¨	Ô2Ø ØØð 	ñ 	
ô 	
ð 	
ð 	�ŠØØ Ø”{ >Ô2Ø(ØØ˜�Fð 	ñ 	
ô 	
ð 	
ð 	�	Š	ØØ# T¤[°Ô%:Ð;Ð<Ø/Ð0ð 	ñ 	
ô 	
ð 	
ð 	�ŠØ%Ø”{ 8Ô,Øœ IÔ.ØØð 	ñ 	
ô 	
ð 	
ð 	
ð 	
rA   c                óð  — t          j        | j        | j        d         d¬¦  «        }|                     ddd¬¦  «         t          j        |dd	| j        d         | j        d
         ¬¦  «        }|                     d¬¦  «         t          j        |dd| j        d         | j        d         ¬¦  «        }|                     dd¬¦  «         t          j        |dd| j        d         | j        d
         | j        d         dddd| j        d¬¦  «        | _        | j                             dd¬¦  «         t          j        |d dd!d"dd#¬$¦  «        | _	        | j	                             d¬¦  «         t          j        | j        ¦  «        | _        | j                             d%d&dd'¬(¦  «         t          j        | j        | j        d         ¬)¦  «        | _        t          j        | j        | j        d         ¬)¦  «        | _        t          j        | j        | j        d         ¬)¦  «        | _        t          j        | j        | j        d         ¬)¦  «        | _        | j                             | j        d*¬+¦  «         | j                             | j        d,¬+¦  «         | j                             | j        d-¬+¦  «         | j                             | j        d.¬+¦  «         |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          t          j        | j        | j        d/         d0¬¦  «        }|                     dd1¬2¦  «         t          j        |d3d4¬5¦  «        | _        | j                             dd6¬2¦  «         t          j        || j        d/         ¬)¦  «        }|                     dd7d¬¦  «         t          j        |d8d| j        d/         | j        d         ¬¦  «        | _        | j                             d¬¦  «         t          j        |d9d| j        d/         | j        d:         ¬¦  «        | _        | j                             d¬¦  «         d S );Nr   é<   ©r.   ÚheightÚxrG   )é   é   ©ÚfillÚpadxÚpadyzVideoDetection Studio)rJ   é   rL   r%   ©ÚtextrO   r.   ÚfgÚleft©ÚsideuN    |  Ä�á»‘i SoÃ¡t Báº£n Quyá»�n Video Ä�a PhÆ°Æ¡ng Thá»©c (V-JEPA 2 & NeuralFP)rS   r&   ©é   r   )rt   rm   u%   ðŸ”„ QuÃ©t & Ä�á»“ng Bá»™ Video Má»›irW   r    r"   r   r   rh   rZ   Úhand2©rp   rO   r.   rq   ÚactivebackgroundÚactiveforegroundÚbdrl   rm   ÚcommandÚcursorÚright©rK   r   ©rt   rl   u&   Ä�ang náº¡p mÃ´ hÃ¬nh & dá»¯ liá»‡u...z#3a3a3az#ffffaarv   )rp   rO   r.   rq   rl   rm   ÚbothT©r   ri   )rk   Úexpandrl   rm   r-   u+     ðŸŽ¯ Trung TÃ¢m Ä�á»‘i SoÃ¡t & So SÃ¡nh  ©rp   u     ðŸ“¥ Táº£i Video YouTube  u(     ðŸ“� Quáº£n LÃ½ File Data/ & Target/  u$     âš™ï¸� Cáº¥u HÃ¬nh & Tiá»‡n Ã�ch  r   é(   Úbottom)rk   rt   r\   Údeterminate)rb   ÚmodeÚtopé   u"   Ä�ang chuáº©n bá»‹ há»‡ thá»‘ng...z#Kho Data: 0 video | Target: 0 videor'   )ÚtkÚFramer   r2   ÚpackÚLabelÚButtonÚon_force_syncÚbtn_sync_nowÚbadge_statusr   ÚNotebookÚnotebookÚtab_compareÚtab_downloadÚ
tab_manageÚtab_settingsÚaddÚ_build_compare_tabÚ_build_download_tabÚ_build_manage_tabÚ_build_settings_tabÚProgressbarÚprogress_barÚ
status_lblÚstats_summary_lbl)r>   ÚheaderÚ	lbl_titleÚlbl_subÚbottom_frameÚstatus_inners         r?   r<   zVideoDetectionGUI._build_ui…   s\  € å”˜$œ)¨¬°IÔ(>ÀrÐJÑJÔJˆØ�Š˜ 2¨GˆÑ4Ô4Ð4å”HØØ(Ø)ØŒ{˜9Ô%ØŒ{˜>Ô*ð
ñ 
ô 
ˆ	ð 	�Š˜FˆÑ#Ô#Ð#å”(ØØaØ ØŒ{˜9Ô%ØŒ{Ð+Ô,ð
ñ 
ô 
ˆð 	�Š˜& vˆÑ.Ô.Ð.õ œIØØ8Ø(ØŒ{˜?Ô+ØŒ{˜>Ô*Ø!œ[¨Ô2Ø&ØØØØÔ&Øð
ñ 
ô 
ˆÔð 	Ô×Ò G°'ÐÑ:Ô:Ð:åœHØØ9Ø(ØØØØð
ñ 
ô 
ˆÔð 	Ô×Ò GÐÑ,Ô,Ð,õ œ T¤YÑ/Ô/ˆŒØŒ×Ò ¨t¸"À6ÐÑJÔJÐJåœ8 D¤M°d´kÀ)Ô6LÐMÑMÔMˆÔÝœH T¤]°t´{À9Ô7MÐNÑNÔNˆÔÝœ( 4¤=°T´[ÀÔ5KÐLÑLÔLˆŒÝœH T¤]°t´{À9Ô7MÐNÑNÔNˆÔàŒ×Ò˜$Ô*Ð1^ÐÑ_Ô_Ð_ØŒ×Ò˜$Ô+Ð2PÐÑQÔQÐQØŒ×Ò˜$œ/Ð0ZÐÑ[Ô[Ð[ØŒ×Ò˜$Ô+Ð2XÐÑYÔYÐYà×ÒÑ!Ô!Ð!Ø× Ò Ñ"Ô"Ð"Ø×ÒÑ Ô Ð Ø× Ò Ñ"Ô"Ð"õ ”x ¤	¨d¬k¸)Ô.DÈRÐPÑPÔPˆØ×Ò˜s¨ÐÑ2Ô2Ð2åœOØØ+Øð
ñ 
ô 
ˆÔð
 	Ô×Ò C¨eÐÑ4Ô4Ð4å”x °´¸YÔ1GÐHÑHÔHˆØ×Ò˜s¨°!ÐÑ4Ô4Ð4åœ(ØØ5Ø ØŒ{˜9Ô%ØŒ{Ð+Ô,ð
ñ 
ô 
ˆŒð 	Œ×Ò &ÐÑ)Ô)Ð)å!#¤ØØ6Ø ØŒ{˜9Ô%ØŒ{˜<Ô(ð"
ñ "
ô "
ˆÔð 	Ô×#Ò#¨Ð#Ñ1Ô1Ð1Ð1Ð1rA   c                ól  ‡ — t          j        ‰ j        d‰ j        d         dd¬¦  «        }|                     dd¬¦  «         t          j        |‰ j        d         d	¬
¦  «        }t          j        |‰ j        d         ¬¦  «        }|                     |¦  «         |                     |¦  «         |                     dd¬¦  «         |                     dd¬¦  «         |                     dd¬¦  «         t          j        |‰ j        d         dd¬¦  «        }| 	                    ddddd¬¦  «         t          j        |‰ j        d         ¬¦  «        }|                     dd¬¦  «         t          j
        |dd‰ j        d         ‰ j        d         ¬¦  «                             d¬¦  «         t          j
        |dd‰ j        d         ‰ j        d          ¬¦  «        ‰ _        ‰ j                             dd!¬"¦  «         t          j        |‰ j        d         ¬¦  «        }|                     dd¬¦  «         t          j        |d#d$d%¬&¦  «        ‰ _        ‰ j                             d'd(¬)¦  «         ‰ j                             d*d+¬)¦  «         ‰ j                             d,d-¬)¦  «         ‰ j                             d'd.d/¬0¦  «         ‰ j                             d*d1d2¬0¦  «         ‰ j                             d,d3d2¬0¦  «         t          j        |d‰ j        j        ¬4¦  «        }‰ j                             |j        ¬5¦  «         ‰ j                             ddd¬6¦  «         |                     d7d8¬9¦  «         ‰ j                             d:‰ j        ¦  «         t          j        |‰ j        d         dd¬¦  «        }| 	                    dddd!d¬¦  «         t          j        |‰ j        d         ¬¦  «        }	|	                     dd¬¦  «         t          j
        |	d;d‰ j        d         ‰ j        d         ¬¦  «                             d¬¦  «         t          j        d<¬=¦  «        ‰ _        t          j        |‰ j        d         ¬¦  «        }
|
                     dd¬¦  «         t          j        |
d>‰ j        d<d?‰ j        d         ‰ j        d         ‰ j        d@         ‰ j        d         dA‰ j        ¬B¦  «        ‰ _        ‰ j                             d¬¦  «         t          j        |
dC‰ j        dDd‰ j        d         ‰ j        dE         ‰ j        d@         ‰ j        d         dA‰ j        ¬B¦  «        ‰ _        ‰ j                             ddF¬"¦  «         t          j        |‰ j        d         ¬¦  «        ‰ _        ‰ j                             ddG¬¦  «         t          j        ‰ j        dHdI‰ j        dJ         ‰ j        dE         ddKdL‰ j        dM¬N¦
  «
                             ddO¬"¦  «         t          j        ‰ j        dPdI‰ j        dJ         ‰ j        dE         ddKdL‰ j         dM¬N¦
  «
                             d¬¦  «         t          j        |‰ j        d@         ddQ¬R¦  «        }|                     dddS¬T¦  «         t          j!        |‰ j        d@         d¬U¦  «        ‰ _"        t          j        |d‰ j"        j        ¬4¦  «        }t          j        ‰ j"        ‰ j        d@         ¬¦  «        ‰ _#        ‰ j#                             dVˆ fdW„¦  «         ‰ j"         $                    dX‰ j#        dY¬Z¦  «         ‰ j"                             |j        ¬5¦  «         ‰ j"                             ddd¬6¦  «         |                     d7d8¬9¦  «         t          j        |‰ j        d         ¬¦  «        }|                     d¬[¦  «         t          j        |d\d‰ j        d]         dA‰ j        d^         dAdd_dK‰ j%        dM¬`¦  «        ‰ _&        ‰ j&                             d7¬¦  «         t          j        |‰ j        d         dd¬¦  «        }|                     ddd!¬T¦  «         t          j        |‰ j        d         ¬¦  «        }|                     dd¬¦  «         t          j
        |dad‰ j        d         ‰ j        d         ¬¦  «                             d¬¦  «         t          j
        |dbd‰ j        d         ‰ j        d          ¬¦  «        ‰ _'        ‰ j'                             ddc¬"¦  «         t          j        |ddd‰ j        dJ         ‰ j        dE         ddd‰ j(        dM¬N¦
  «
        ‰ _)        ‰ j)                             d7¬¦  «         t          j        |‰ j        d         ¬¦  «        }|                     dd¬¦  «         de}t          j        ||d$d%¬&¦  «        ‰ _*        ‰ j*                             dfdg¬)¦  «         ‰ j*                             dhdi¬)¦  «         ‰ j*                             djdk¬)¦  «         ‰ j*                             dldm¬)¦  «         ‰ j*                             d*d+¬)¦  «         ‰ j*                             dndo¬)¦  «         ‰ j*                             dpdq¬)¦  «         ‰ j*                             d,dr¬)¦  «         ‰ j*                             dfd.d/¬0¦  «         ‰ j*                             dhdsd/¬0¦  «         ‰ j*                             djdtd2¬0¦  «         ‰ j*                             dldtd2¬0¦  «         ‰ j*                             d*dud2¬0¦  «         ‰ j*                             dnd3d2¬0¦  «         ‰ j*                             dpdvd2¬0¦  «         ‰ j*                             d,dwd2¬0¦  «         t          j        |d‰ j*        j        ¬4¦  «        }‰ j*                             |j        ¬5¦  «         ‰ j*                             ddd¬6¦  «         |                     d7d8¬9¦  «         d S )xNÚverticalr   r   rv   )Úorientr.   r{   Ú	sashwidthr�   T©rk   rƒ   i@  re   r-   ©Úweighté   rY   r   rh   rK   ©r.   rl   rm   Únsew©r   rY   )ÚrowÚcolumnÚstickyrl   rm   rg   ©rk   rm   u$   1. Chá»�n Video Má»¥c TiÃªu (Target)rI   r%   ro   rr   rs   z	(0 video)rS   r'   )rY   r   r€   )ÚnameÚdurationÚstatusÚheadingsÚbrowse)ÚcolumnsÚshowÚ
selectmoder¶   u   TÃªn File Targetr„   r·   u   Thá»�i LÆ°á»£ngr¸   u   Tráº¡ng ThÃ¡iéÜ   Úw)ÚwidthÚanchoréK   Úcenteré_   )r©   r|   )Úyscrollcommand)rt   rk   rƒ   r~   Úy)rt   rk   z<<TreeviewSelect>>u1   2. Chá»�n Ä�á»‘i TÆ°á»£ng Tham Chiáº¿u (Kho Data)Úall©Úvalueu3   So sÃ¡nh vá»›i TOÃ€N Bá»˜ kho Data/ (KhuyÃªn dÃ¹ng)rW   r!   r   )
rp   ÚvariablerÉ   rO   r.   rq   Úselectcolorry   rz   r|   u=   Chá»‰ so sÃ¡nh vá»›i cÃ¡c video Ä‘Æ°á»£c chá»�n bÃªn dÆ°á»›i:rP   r&   )rŠ   r   )r   rv   u   âœ“ Chá»�n Táº¥t Cáº£©rJ   ri   r    ri   é   rw   ©	rp   rO   r.   rq   r{   rl   rm   r|   r}   )r   rZ   u   âœ— Bá»� Chá»�n Háº¿tÚsolid)r.   r{   r[   )r   ri   ©rk   rƒ   rm   )r.   Úhighlightthicknessz<Configure>c                ój   •— ‰j                              ‰j                              d¦  «        ¬¦  «        S )NrÇ   )Úscrollregion)Ú
ref_canvasr3   Úbbox©Úer>   s    €r?   ú<lambda>z6VideoDetectionGUI._build_compare_tab.<locals>.<lambda>ˆ  s+   ø€ �d”o×/Ò/¸T¼_×=QÒ=QÐRWÑ=XÔ=XÐ/ÑYÔY€ rA   )r   r   Únw)ÚwindowrÁ   )rk   u1   âš¡ Báº®T Ä�áº¦U Ä�á»�I SOÃ�T (Tá»¨C THÃŒ < 0.1s)r"   r#   rn   rx   u/   3. Báº£ng Káº¿t Quáº£ Ä�á»‘i SoÃ¡t TrÃ¹ng Láº·pu   (ChÆ°a thá»±c hiá»‡n so sÃ¡nh)r   u   ðŸ’¾ Xuáº¥t BÃ¡o CÃ¡o JSON)Útarget_videoÚ	ref_videoÚtarget_rangeÚ	ref_ranger·   Ú
confidenceÚ
match_typer¸   rÛ   u   Video Má»¥c TiÃªurÜ   u   Video Gá»‘c TrÃ¹ng Khá»›prÝ   u   Khoáº£ng TargetrÞ   u   Khoáº£ng Gá»‘crß   u   Ä�á»™ TrÃ¹ngrà   u   Dáº¡ng Nháº­n Diá»‡nu   Cáº£nh BÃ¡oéÈ   éx   éU   é‚   éd   )+r‹   ÚPanedWindowr•   r2   r�   rŒ   r™   ÚcolumnconfigureÚrowconfigureÚgridrŽ   Úlbl_target_countr   rR   Útree_targetsÚheadingr³   Ú	ScrollbarÚyviewr3   ÚsetÚbindÚ_on_target_selectedÚ	StringVarÚcompare_mode_varÚRadiobuttonÚ_on_compare_mode_changedÚ	radio_allÚradio_selectedÚref_list_controlsr�   Ú_select_all_refsÚ_deselect_all_refsÚCanvasrÔ   Úref_checklist_innerÚcreate_windowÚon_run_instant_comparisonÚbtn_run_compareÚlbl_match_summaryÚon_export_comparison_resultsÚbtn_export_resÚtree_matches)r>   Úpaned_verticalÚtop_selection_frameÚbottom_results_frameÚ
col_targetÚheader_targetÚtarget_tree_boxÚtarget_scrollÚcol_refÚ
header_refÚ	radio_boxÚref_canvas_boxÚ
ref_scrollÚ
action_barÚbottom_cardÚ
header_resÚtable_containerÚcolsÚ
res_scrolls   `                  r?   rš   z$VideoDetectionGUI._build_compare_tabì   sa  ø€ åœ¨Ô(8ÀÐPTÔP[Ð\eÔPfÐklÐxyÐzÑzÔzˆØ×Ò °ÐÑ5Ô5Ð5å œh ~¸$¼+ÀiÔ:PÐY\Ð]Ñ]Ô]ÐÝ!œx¨¸4¼;ÀyÔ;QÐRÑRÔRÐà×ÒÐ.Ñ/Ô/Ð/Ø×ÒÐ/Ñ0Ô0Ð0ð 	×+Ò+¨A°aÐ+Ñ8Ô8Ð8Ø×+Ò+¨A°aÐ+Ñ8Ô8Ð8Ø×(Ò(¨°1Ð(Ñ5Ô5Ð5õ ”XÐ1°d´kÀ)Ô6LÐSUÐ\^Ð_Ñ_Ô_ˆ
Ø�Š˜A a°¸VÈ!ˆÑLÔLÐLåœ °´¸IÔ0FÐGÑGÔGˆØ×Ò ¨&ÐÑ1Ô1Ð1å
ŒØØ7Ø)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�Fˆ$Ñ
Ô
Ð
å "¤ØØØ ØŒ{˜9Ô%ØŒ{˜<Ô(ð!
ñ !
ô !
ˆÔð 	Ô×"Ò"¨°VÐ"Ñ<Ô<Ð<õ œ( :°$´+¸iÔ2HÐIÑIÔIˆØ×Ò &°ÐÑ6Ô6Ð6åœLØØ2ØØð	
ñ 
ô 
ˆÔð 	Ô×!Ò! &Ð/AÐ!ÑBÔBÐBØÔ×!Ò! *Ð3DÐ!ÑEÔEÐEØÔ×!Ò! (°Ð!ÑAÔAÐAàÔ× Ò  ¨s¸3Ð Ñ?Ô?Ð?ØÔ× Ò  °2¸hÐ ÑGÔGÐGØÔ× Ò  °¸HÐ ÑEÔEÐEåœ o¸jÐRVÔRcÔRiÐjÑjÔjˆØÔ×#Ò#°=Ô3DÐ#ÑEÔEÐEØÔ×Ò F°ÀÐÑEÔEÐEØ×Ò ¨cÐÑ2Ô2Ð2àÔ×ÒÐ3°TÔ5MÑNÔNÐNõ ”(Ð.°4´;¸yÔ3IÐPRÐY[Ð\Ñ\Ô\ˆØ�Š˜ 1¨V¸&ÀqˆÑIÔIÐIå”X˜g¨$¬+°iÔ*@ÐAÑAÔAˆ
Ø�Š˜S vˆÑ.Ô.Ð.å
ŒØØDØ)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�Fˆ$Ñ
Ô
Ð
õ !#¤°5Ð 9Ñ 9Ô 9ˆÔå”H˜W¨¬°YÔ)?Ð@Ñ@Ô@ˆ	Ø�Š˜C fˆÑ-Ô-Ð-åœØØFØÔ*ØØ(ØŒ{˜9Ô%ØŒ{˜>Ô*Øœ JÔ/Ø!œ[¨Ô3Ø&ØÔ1ð
ñ 
ô 
ˆŒð 	Œ×Ò ÐÑ(Ô(Ð(å œnØØPØÔ*ØØ ØŒ{˜9Ô%ØŒ{Ð+Ô,Øœ JÔ/Ø!œ[¨Ô3Ø&ØÔ1ð
ñ 
ô 
ˆÔð 	Ô× Ò  f°7Ð Ñ;Ô;Ð;õ "$¤¨'°d´kÀ)Ô6LÐ!MÑ!MÔ!MˆÔØÔ×#Ò#¨°6Ð#Ñ:Ô:Ð:å
Œ	ØÔ"Ø(Ø ØŒ{˜?Ô+ØŒ{Ð+Ô,ØØØØÔ)Øð	
ñ 	
ô 	
÷ Š$�F ˆ$Ñ
(Ô
(Ð
(å
Œ	ØÔ"Ø(Ø ØŒ{˜?Ô+ØŒ{Ð+Ô,ØØØØÔ+Øð	
ñ 	
ô 	
÷ Š$�Fˆ$Ñ
Ô
Ð
õ œ '¨d¬k¸*Ô.EÈ!ÐT[Ð\Ñ\Ô\ˆØ×Ò °¸6ÐÑBÔBÐBåœ) N°t´{À:Ô7NÐcdÐeÑeÔeˆŒÝ”] >¸*ÈdÌoÔNcÐdÑdÔdˆ
Ý#%¤8¨D¬OÀÄÈJÔ@WÐ#XÑ#XÔ#XˆÔ àÔ ×%Ò%ØØYÐYÐYÐYñ	
ô 	
ð 	
ð 	Œ×%Ò% f°TÔ5MÐVZÐ%Ñ[Ô[Ð[ØŒ×!Ò!°´Ð!Ñ@Ô@Ð@àŒ×Ò &¨v¸dÐÑCÔCÐCØ�Š˜W¨3ˆÑ/Ô/Ð/õ ”X˜g¨$¬+°iÔ*@ÐAÑAÔAˆ
Ø�Š˜SˆÑ!Ô!Ð!å!œyØØDØ)ØŒ{˜8Ô$ØØ!œ[¨Ô8Ø&ØØØØÔ2Øð 
ñ  
ô  
ˆÔð 	Ô×!Ò! wÐ!Ñ/Ô/Ð/õ ”hÐ3¸¼ÀIÔ8NÐUWÐ^`ÐaÑaÔaˆØ×Ò˜f¨T¸ÐÑ?Ô?Ð?å”X˜k¨d¬k¸)Ô.DÐEÑEÔEˆ
Ø�Š˜S vˆÑ.Ô.Ð.å
ŒØØBØ)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�Fˆ$Ñ
Ô
Ð
å!#¤ØØ1Ø ØŒ{˜9Ô%ØŒ{˜<Ô(ð"
ñ "
ô "
ˆÔð 	Ô×#Ò#¨°gÐ#Ñ>Ô>Ð>å œiØØ-Ø ØŒ{˜?Ô+ØŒ{Ð+Ô,ØØØØÔ5Øð
ñ 
ô 
ˆÔð 	Ô× Ò  gÐ Ñ.Ô.Ð.õ œ( ;°4´;¸yÔ3IÐJÑJÔJˆØ×Ò &°ÐÑ6Ô6Ð6ð	
ˆõ  œL¨À$ÈZÐdlÐmÑmÔmˆÔàÔ×!Ò! .Ð7JÐ!ÑKÔKÐKØÔ×!Ò! +Ð4OÐ!ÑPÔPÐPØÔ×!Ò! .Ð7HÐ!ÑIÔIÐIØÔ×!Ò! +Ð4DÐ!ÑEÔEÐEØÔ×!Ò! *Ð3DÐ!ÑEÔEÐEØÔ×!Ò! ,°^Ð!ÑDÔDÐDØÔ×!Ò! ,Ð5KÐ!ÑLÔLÐLØÔ×!Ò! (°Ð!Ñ?Ô?Ð?àÔ× Ò  °sÀ3Ð ÑGÔGÐGØÔ× Ò  °CÀÐ ÑDÔDÐDØÔ× Ò  °sÀ8Ð ÑLÔLÐLØÔ× Ò  °CÀÐ ÑIÔIÐIØÔ× Ò  °2¸hÐ ÑGÔGÐGØÔ× Ò  °RÀÐ ÑIÔIÐIØÔ× Ò  °SÀÐ ÑJÔJÐJØÔ× Ò  °¸XÐ ÑFÔFÐFå”] ?¸:ÈtÔO`ÔOfÐgÑgÔgˆ
ØÔ×#Ò#°:´>Ð#ÑBÔBÐBØÔ×Ò F°ÀÐÑEÔEÐEØ�Š˜W¨3ˆÑ/Ô/Ð/Ð/Ð/rA   c                ó˜  ‡ ‡— t          j        ‰ j        ‰ j        d         dd¬¦  «        }|                     dd¬¦  «         t          j        |‰ j        d         d	d
¬¦  «        }|                     dd¬¦  «         t          j        |dd‰ j        d         ‰ j        d         ¬¦  «                             d¬¦  «         t          j        |ddd‰ j        d         ‰ j        d         ¬¦  «                             dd¬¦  «         t          j        |dd‰ j        d         ‰ j        d         ¬¦  «                             d¬¦  «         t          j        |‰ j        d         ¬¦  «        }|                     dd¬¦  «         t          j        |d‰ j        d         ‰ j        d         d d!d"¬#¦  «        ‰ _        ‰ j                             dddd$d%¬&¦  «         t          j        |d'd(‰ j        d)         ‰ j        d         ‰ j        d*         d d+dd$‰ j	        d,¬-¦  «        }|                     d.¬/¦  «         t          j        |d0d‰ j        d         ‰ j        d         ¬¦  «                             d¬¦  «         t          j        |‰ j        d         ¬¦  «        }|                     dd1¬¦  «         t          j        |d‰ j        d         ‰ j        d         d d!d"¬#¦  «        ‰ _
        ‰ j
                             dddd$d%¬&¦  «         ‰ j
                             d+d2¦  «         t          j        |‰ j        d         ¬¦  «        }|                     dd3¬¦  «         d\ˆ fd6„Št          j        |d7d8‰ j        d)         ‰ j        d         d+d9d:ˆfd;„d,¬<¦
  «
                             dd=¬>¦  «         t          j        |d?d8‰ j        d)         ‰ j        d         d+d9d:ˆfd@„d,¬<¦
  «
                             dd=¬>¦  «         t          j        |dAd8‰ j        d)         ‰ j        d         d+d9d:ˆfdB„d,¬<¦
  «
                             dd=¬>¦  «         t          j        |dCd8‰ j        d)         ‰ j        d         d+d9d:ˆfdD„d,¬<¦
  «
                             d¬/¦  «         t          j        |dEd‰ j        d         ‰ j        d         ¬¦  «                             d¬¦  «         t          j        dF¬G¦  «        ‰ _        t          j        |‰ j        d         ¬¦  «        }|                     ddH¬¦  «         t          j        |dI‰ j        dFd(‰ j        d         ‰ j        d         ‰ j        d         ‰ j        d         d ¬J¦
  «
                             d¬/¦  «         t          j        |dK‰ j        dLd‰ j        d         ‰ j        d         ‰ j        d         ‰ j        d         d ¬J¦
  «
                             ddM¬>¦  «         t          j        d¬G¦  «        ‰ _        t          j        |dN‰ j        d‰ j        d         ‰ j        d         ‰ j        d         ‰ j        d         d ¬O¦	  «	                             ddP¬¦  «         t          j        |dQd‰ j        d*         d ‰ j        dR         d d+d	d9‰ j        d,¬-¦  «        ‰ _        ‰ j                             dd3¬¦  «         t          j        |dSd(‰ j        d         ‰ j        d         ¬¦  «                             d¬¦  «         t          j        |dT‰ j        d         dUdVd!d"dWdX¬Y¦	  «	        ‰ _        ‰ j                             dddZ¬[¦  «         d S )]Nr   rG   rh   r¯   r�   Tr«   r   é   rn   u@   ðŸ“¥ Táº£i Video Hoáº·c PhÃ¢n Ä�oáº¡n Chá»‰ Ä�á»‹nh Tá»« YouTube)rJ   rh   rL   r%   ro   r¿   ©rÁ   uð   Há»— trá»£ Video ID (11 kÃ½ tá»±), Link Ä‘áº§y Ä‘á»§, Link rÃºt gá»�n youtu.be, Shorts, Embed, Live.
Chá»‰ táº£i Ä‘Ãºng phÃ¢n Ä‘oáº¡n dá»¯ liá»‡u cáº§n thiáº¿t (Range Request), khÃ´ng tá»‘n bÄƒng thÃ´ng vÃ  thá»�i gian táº£i cáº£ file dÃ i.rS   rr   r&   ©rp   rO   Újustifyr.   rq   )rÍ   é   ©rÁ   rm   u;   1. Nháº­p Link Video YouTube hoáº·c Video ID (11 kÃ½ tá»±):rI   r-   rg   ©rZ   rh   rµ   )rJ   rK   r!   r   r®   rÏ   )rO   r.   rq   Úinsertbackgroundr{   r[   rZ   r‚   )rt   rk   rƒ   Úipadyrl   u   ðŸ“‹ DÃ¡n ClipboardrW   r    r"   r   rw   rx   r~   rs   uO   2. PhÃ¢n Ä‘oáº¡n thá»�i gian cáº§n táº£i (Máº·c Ä‘á»‹nh: 1 Giá»� Ä‘áº§u tiÃªn):)rZ   rv   ú00:00:00 - 01:00:00)r   rh   ÚvalÚstrc                óˆ   •— ‰j                              dt          j        ¦  «         ‰j                              d| ¦  «         d S ©Nr   )Úentry_yt_sectionÚdeleter‹   ÚENDÚinsert)r!  r>   s    €r?   Úset_secz6VideoDetectionGUI._build_download_tab.<locals>.set_secN  s=   ø€ ØÔ!×(Ò(¨­B¬FÑ3Ô3Ð3ØÔ!×(Ò(¨¨CÑ0Ô0Ð0Ð0Ð0rA   u%   â�±ï¸� 1 Giá»� Ä�áº§u (Máº·c Ä‘á»‹nh)rÌ   ri   rÍ   c                 ó   •—  ‰ d¦  «        S )Nr   © ©r)  s   €r?   rØ   z7VideoDetectionGUI._build_download_tab.<locals>.<lambda>[  ó   ø€ ˜G˜GÐ$9Ñ:Ô:€ rA   rÎ   r±   r€   u   â�±ï¸� 30 PhÃºt Ä�áº§uc                 ó   •—  ‰ d¦  «        S )Nz00:00:00 - 00:30:00r+  r,  s   €r?   rØ   z7VideoDetectionGUI._build_download_tab.<locals>.<lambda>h  r-  rA   u   â�±ï¸� 15 PhÃºt Ä�áº§uc                 ó   •—  ‰ d¦  «        S )Nz00:00:00 - 00:15:00r+  r,  s   €r?   rØ   z7VideoDetectionGUI._build_download_tab.<locals>.<lambda>u  r-  rA   u   ðŸŽ¬ ToÃ n Bá»™ Videoc                 ó   •—  ‰ d¦  «        S )NrÇ   r+  r,  s   €r?   rØ   z7VideoDetectionGUI._build_download_tab.<locals>.<lambda>‚  s   ø€ ˜G˜G E™NœN€ rA   u   3. LÆ°u video vÃ o thÆ° má»¥c:ÚtargetrÈ   )rv   rh   uM   ðŸŽ¯ ThÆ° má»¥c Target/ (Video cáº§n kiá»ƒm tra Ä‘á»‘i soÃ¡t - Máº·c Ä‘á»‹nh))	rp   rÊ   rÉ   rO   r.   rq   rË   ry   rz   uL   ðŸ“� ThÆ° má»¥c Data/ (Kho video gá»‘c báº£n quyá»�n cá»§a chá»§ sá»Ÿ há»¯u)Údata)r  r   u]   âœ… Tá»± Ä‘á»™ng trÃ­ch xuáº¥t Ä‘áº·c trÆ°ng AI (V-JEPA 2 & NeuralFP) ngay sau khi táº£i xong)rp   rÊ   rO   r.   rq   rË   ry   rz   )r   r  u$   âš¡ Báº®T Ä�áº¦U Táº¢I VIDEO YOUTUBEr#   u-   Nháº­t KÃ½ Tiáº¿n Ä�á»™ Táº£i & Ä�á»“ng Bá»™:rY   z#a8d5e5)ÚConsolasrH   ÚdisabledÚword)rf   r.   rq   rO   r{   r[   ÚstateÚwrapru   rÐ   )r!  r"  )r‹   rŒ   r–   r2   r�   rŽ   ÚEntryÚentry_yt_urlr�   Ú_on_paste_yt_clipboardr%  r(  rò   Úyt_dest_varrô   Ú
BooleanVarÚyt_auto_sync_varÚCheckbuttonÚon_start_yt_downloadÚbtn_yt_downloadÚTextÚ
txt_yt_log)	r>   ÚouterÚcardÚurl_input_boxÚ	btn_pasteÚsection_boxÚ
preset_boxÚdest_boxr)  s	   `       @r?   r›   z%VideoDetectionGUI._build_download_tabò  sü  øø€ Ý”˜Ô*¨t¬{¸9Ô/EÈBÐUWÐXÑXÔXˆØ�
Š
˜ tˆ
Ñ,Ô,Ð,åŒx˜ $¤+¨iÔ"8¸rÈÐKÑKÔKˆØ�	Š	�v dˆ	Ñ+Ô+Ð+õ 	ŒØØSØ)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�cˆ$Ñ
Ô
Ð
å
ŒØð EØ ØØŒ{˜9Ô%ØŒ{Ð+Ô,ð	
ñ 	
ô 	
÷ Š$�c ˆ$Ñ
(Ô
(Ð
(õ 	ŒØØNØ)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�cˆ$Ñ
Ô
Ð
åœ ¨$¬+°iÔ*@ÐAÑAÔAˆØ×Ò ¨'ÐÑ2Ô2Ð2åœHØØ!ØŒ{˜:Ô&ØŒ{˜>Ô*Ø&ØØð
ñ 
ô 
ˆÔð 	Ô×Ò F°¸TÈÐQWÐÑXÔXÐXå”IØØ&Ø(ØŒ{˜?Ô+ØŒ{˜>Ô*Ø!œ[¨Ô2Ø&ØØØØÔ/Øð
ñ 
ô 
ˆ	ð 	�Š˜GˆÑ$Ô$Ð$õ 	ŒØØbØ)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�cˆ$Ñ
Ô
Ð
å”h˜t¨¬°IÔ(>Ð?Ñ?Ô?ˆØ×Ò˜c¨ÐÑ/Ô/Ð/å "¤ØØ!ØŒ{˜:Ô&ØŒ{˜>Ô*Ø&ØØð!
ñ !
ô !
ˆÔð 	Ô×"Ò"¨°SÀÈQÐU[Ð"Ñ\Ô\Ð\ØÔ×$Ò$ QÐ(=Ñ>Ô>Ð>õ ”X˜d t¤{°9Ô'=Ð>Ñ>Ô>ˆ
Ø�Š˜S wˆÑ/Ô/Ð/ð	1ð 	1ð 	1ð 	1ð 	1ð 	1õ 	Œ	ØØ8Ø ØŒ{˜?Ô+ØŒ{Ð+Ô,ØØØØ:Ð:Ð:Ð:Øð	
ñ 	
ô 	
÷ Š$�F ˆ$Ñ
(Ô
(Ð
(å
Œ	ØØ)Ø ØŒ{˜?Ô+ØŒ{Ð+Ô,ØØØØ:Ð:Ð:Ð:Øð	
ñ 	
ô 	
÷ Š$�F ˆ$Ñ
(Ô
(Ð
(å
Œ	ØØ)Ø ØŒ{˜?Ô+ØŒ{Ð+Ô,ØØØØ:Ð:Ð:Ð:Øð	
ñ 	
ô 	
÷ Š$�F ˆ$Ñ
(Ô
(Ð
(å
Œ	ØØ(Ø ØŒ{˜?Ô+ØŒ{Ð+Ô,ØØØØ*Ð*Ð*Ð*Øð	
ñ 	
ô 	
÷ Š$�Fˆ$Ñ
Ô
Ð
õ 	ŒØØ1Ø)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�cˆ$Ñ
Ô
Ð
åœ<¨hÐ7Ñ7Ô7ˆÔå”8˜D T¤[°Ô%;Ð<Ñ<Ô<ˆØ�Š˜3 WˆÑ-Ô-Ð-å
ŒØØ`ØÔ%ØØ(ØŒ{˜9Ô%ØŒ{˜>Ô*Øœ JÔ/Ø!œ[¨Ô3Ø&ð	
ñ 	
ô 	
÷ Š$�Fˆ$Ñ
Ô
Ð
å
ŒØØ_ØÔ%ØØ ØŒ{˜9Ô%ØŒ{Ð+Ô,Øœ JÔ/Ø!œ[¨Ô3Ø&ð	
ñ 	
ô 	
÷ Š$�F ˆ$Ñ
)Ô
)Ð
)õ !#¤°DÐ 9Ñ 9Ô 9ˆÔÝ
ŒØØpØÔ*Ø ØŒ{˜9Ô%ØŒ{˜>Ô*Øœ JÔ/Ø!œ[¨Ô3Ø&ð
	
ñ 
	
ô 
	
÷ Š$�c ˆ$Ñ
(Ô
(Ð
(õ  "œyØØ7Ø)ØŒ{˜8Ô$ØØ!œ[¨Ô8Ø&ØØØØÔ-Øð 
ñ  
ô  
ˆÔð 	Ô×!Ò!¨°7Ð!Ñ;Ô;Ð;õ 	ŒØØ@Ø(ØŒ{˜9Ô%ØŒ{Ð+Ô,ð	
ñ 	
ô 	
÷ Š$�cˆ$Ñ
Ô
Ð
åœ'ØØØŒ{˜:Ô&ØØ ØØØØð

ñ 

ô 

ˆŒð 	Œ×Ò &°¸FÐÑCÔCÐCÐCÐCrA   c                ó  — 	 | j                              ¦   «                              ¦   «         }|rB| j                             dt
          j        ¦  «         | j                             d|¦  «         d S d S # t          $ r Y d S w xY wr$  )	r   Úclipboard_getÚstripr9  r&  r‹   r'  r(  Ú	Exception)r>   Úclipboard_texts     r?   r:  z(VideoDetectionGUI._on_paste_yt_clipboardã  s–   € ð	Ø!œY×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>ˆNØð <ØÔ!×(Ò(¨­B¬FÑ3Ô3Ð3ØÔ!×(Ò(¨¨NÑ;Ô;Ð;Ð;Ð;ð<ð <øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   ‚A-A3 Á3
BÂ Brp   r"  c                ó
  — | j                              d¬¦  «         | j                              t          j        |dz   ¦  «         | j                              t          j        ¦  «         | j                              d¬¦  «         d S )NÚnormal©r6  ú
r4  )rB  r3   r(  r‹   r'  Úsee)r>   rp   s     r?   Ú_append_yt_logz VideoDetectionGUI._append_yt_logì  sp   € ØŒ×!Ò!¨Ð!Ñ1Ô1Ð1ØŒ×Ò�rœv t¨d¡{Ñ3Ô3Ð3ØŒ×Ò�BœFÑ#Ô#Ð#ØŒ×!Ò!¨
Ð!Ñ3Ô3Ð3Ð3Ð3rA   Údestc                óª   — | j                              |¦  «         | j                             | j        ¦  «         | j                             ¦   «          d S ©N)r;  rï   r”   Úselectr–   r9  Ú	focus_set)r>   rU  s     r?   Ú_navigate_to_downloadz'VideoDetectionGUI._navigate_to_downloadò  sM   € ØÔ×Ò˜TÑ"Ô"Ð"ØŒ×Ò˜TÔ.Ñ/Ô/Ð/ØÔ×#Ò#Ñ%Ô%Ð%Ð%Ð%rA   c                ón  ‡ ‡‡‡‡— ‰ j         s‰ j        sd S ‰ j                             ¦   «                              ¦   «         Š‰st          j        dd¦  «         d S ‰ j                             ¦   «                              ¦   «         Š‰ j                             ¦   «         Š‰ j	                             ¦   «         Š‰ j
                             d¬¦  «         ‰ j
                             dt          j        ¦  «         ‰ j
                             d¬¦  «         ‰                      d‰› �¦  «         ‰                      d‰r‰nd	› �¦  «         ‰                      d
‰                     ¦   «         › d�¦  «         ‰                      d‰rdnd› �¦  «         ˆˆˆˆˆ fd„}ˆˆˆ fd„}‰                      ||d¬¦  «         d S )Nu   Thiáº¿u thÃ´ng tinuB   Vui lÃ²ng nháº­p Link video YouTube hoáº·c ID video (11 kÃ½ tá»±).rP  rQ  z1.0r4  u+   [*] Báº¯t Ä‘áº§u táº£i video tá»« YouTube: u       PhÃ¢n Ä‘oáº¡n  : u   1 giá»� Ä‘áº§u (máº·c Ä‘á»‹nh)u       ThÆ° má»¥c lÆ°u: ú/u       Tá»± Ä‘á»™ng AI : u   CÃ³u   KhÃ´ngc                óV   •‡ — dˆ ˆfd„}‰j                              ‰‰‰‰|¬¦  «        }|S )NÚpctÚintÚmsgr"  c                ód   •‡ ‡—  ‰‰ ‰¦  «         ‰j                              dˆˆ ˆfd„¦  «         d S )Nr   c                 ó:   •— ‰                      d‰› d‰ › �¦  «        S )Nú[z%] )rT  ©r`  r^  r>   s   €€€r?   rØ   zVVideoDetectionGUI.on_start_yt_download.<locals>.task.<locals>.log_cb.<locals>.<lambda>  s&   ø€ ¨4×+>Ò+>Ð?PÀ3Ð?PÐ?PÈ3Ð?PÐ?PÑ+QÔ+Q€ rA   ©r   Úafter)r^  r`  Úcbr>   s   ``€€r?   Úlog_cbzDVideoDetectionGUI.on_start_yt_download.<locals>.task.<locals>.log_cb  s@   øøø€ Ø��3˜‘”�Ø”	—’ Ð#QÐ#QÐ#QÐ#QÐ#QÐ#QÑRÔRÐRÐRÐRrA   )Ú	url_or_idÚsectionrU  Ú	auto_syncÚprogress_callback©r^  r_  r`  r"  )r4   Údownload_youtube_video)rg  rh  Úresrk  Údest_choiceÚraw_sectionÚraw_urlr>   s   `  €€€€€r?   Útaskz4VideoDetectionGUI.on_start_yt_download.<locals>.task  sb   øø€ ðSð Sð Sð Sð Sð Sð Sð ”-×6Ò6Ø!Ø#Ø Ø#Ø"(ð 7ñ ô ˆCð ˆJrA   c                óF  •— | j         rÞ| j        r×‰                     d| j        j        › �¦  «         ‰                     d| j        › �¦  «         ‰j                             ¦   «         ‰_        ‰j                             ¦   «         ‰_        ‰ 	                    ¦   «          ‰dk    rdnd}t          j        dd|› d| j        › d	| j        j        › d
| j        › d‰rdnd› �
¦  «         d S ‰                     d| j        › �¦  «         t          j        dd| j        › �¦  «         d S )Nu,   [HOÃ€N Táº¤T] Ä�Ã£ táº£i thÃ nh cÃ´ng file: u               Ä�Æ°á»�ng dáº«n: r1  zTarget/zData/u   Táº£i video thÃ nh cÃ´ngu+   Ä�Ã£ táº£i thÃ nh cÃ´ng video YouTube vÃ o u   !

â€¢ TiÃªu Ä‘á»�: u   
â€¢ File: u   
â€¢ ThÆ° má»¥c: rR  uA   â€¢ Ä�Ã£ trÃ­ch xuáº¥t Ä‘áº·c trÆ°ng AI sáºµn sÃ ng Ä‘á»‘i soÃ¡t!Ú u   [THáº¤T Báº I] Lá»—i: u   Lá»—i táº£i videou"   KhÃ´ng thá»ƒ táº£i video YouTube:
)r*   Ú	file_pathrT  r¶   r4   Úget_cached_referencesr7   Úget_cached_targetsr6   Úrefresh_all_viewsr   Úshowinfor/   Údest_dirÚerror_messageÚ	showerror)ro  Útarget_tab_textrk  rp  r>   s     €€€r?   Ú
on_successz:VideoDetectionGUI.on_start_yt_download.<locals>.on_success  s‚  ø€ ØŒ{ð u˜sœ}ð uØ×#Ò#Ð$gÐSVÔS`ÔSeÐ$gÐ$gÑhÔhÐhØ×#Ò#Ð$SÀCÄMÐ$SÐ$SÑTÔTÐTà)-¬×)LÒ)LÑ)NÔ)N�Ô&Ø&*¤m×&FÒ&FÑ&HÔ&H�Ô#Ø×&Ò&Ñ(Ô(Ð(à/:¸hÒ/FÐ/F ) )ÈG�ÝÔ#Ø.ðrÀ/ð rð rØ(+¬	ðrð rà!$¤Ô!3ðrð rð (+¤|ðrð rð _hÐoÐZÐZÐmoð	rð rñô ð ð ð ð ×#Ò#Ð$P¸SÔ=NÐ$PÐ$PÑQÔQÐQÝÔ$Ð%8Ð:sÐ`cÔ`qÐ:sÐ:sÑtÔtÐtÐtÐtrA   u   Táº£i video YouTube©Ú	task_funcr  r/   )r5   r4   r9  ÚgetrL  r   Úshowwarningr%  r;  r=  rB  r3   r&  r‹   r'  rT  ÚupperÚ	_run_task)r>   rs  r  rk  rp  rq  rr  s   `  @@@@r?   r?  z&VideoDetectionGUI.on_start_yt_download÷  s  øøøøø€ ØÔð 	 T¤]ð 	ØˆFàÔ#×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1ˆØð 	ÝÔ"Ð#7Ð9}Ñ~Ô~Ð~ØˆFàÔ+×/Ò/Ñ1Ô1×7Ò7Ñ9Ô9ˆØÔ&×*Ò*Ñ,Ô,ˆØÔ)×-Ò-Ñ/Ô/ˆ	àŒ×!Ò!¨Ð!Ñ1Ô1Ð1ØŒ×Ò˜u¥b¤fÑ-Ô-Ð-ØŒ×!Ò!¨
Ð!Ñ3Ô3Ð3à×ÒÐSÈ'ÐSÐSÑTÔTÐTØ×ÒÐvÀ;Ð4t°K°KÐTtÐvÐvÑwÔwÐwØ×ÒÐJ°K×4EÒ4EÑ4GÔ4GÐJÐJÐJÑKÔKÐKØ×ÒÐW¸iÐ5U°U°UÈXÐWÐWÑXÔXÐXð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð	uð 	uð 	uð 	uð 	uð 	uð 	uð, 	�ŠØØ!Ø(ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
rA   c                ó`  ‡ — t          j        ‰ j        ‰ j        d         dd¬¦  «        }|                     dd¬¦  «         |                     dd¬	¦  «         |                     dd¬	¦  «         |                     dd¬	¦  «         t          j        |‰ j        d
         dd¬¦  «        }|                     dddd¬¦  «         t          j        |dd‰ j        d
         ‰ j        d         ¬¦  «                             d¬¦  «         t          j        |ddd‰ j        d
         ‰ j        d         ¬¦  «                             dd¬¦  «         t          j        |‰ j        d
         ¬¦  «        }|                     dd¬¦  «         t          j	        |dd ‰ j        d!         d"dd#d$d%„ d&¬'¦
  «
                             dd¬(¦  «         t          j	        |d)d ‰ j        d*         ‰ j        d         ‰ j        d!         d"dd#d$ˆ fd+„d&¬,¦  «                             dd¬(¦  «         t          j        |‰ j        d
         dd¬¦  «        }|                     dddd-¬¦  «         t          j        |d.d‰ j        d
         ‰ j        d         ¬¦  «                             d¬¦  «         t          j        |d/dd‰ j        d
         ‰ j        d         ¬¦  «                             dd¬¦  «         t          j        |‰ j        d
         ¬¦  «        }|                     dd¬¦  «         t          j	        |d0d ‰ j        d!         d"dd#d$d1„ d&¬'¦
  «
                             dd¬(¦  «         t          j	        |d2d ‰ j        d*         ‰ j        d         ‰ j        d!         d"dd#d$ˆ fd3„d&¬,¦  «                             dd¬(¦  «         d S )4Nr   rŠ   r¯   r�   Tr«   r   r®   r¬   r   r°   r‚   )r²   r³   r´   rl   u-   ðŸ“� Kho Video Gá»‘c Chá»§ Sá»Ÿ Há»¯u (Data/)©rJ   é   rL   r%   ro   r¿   r  u®   NgÆ°á»�i dÃ¹ng chá»‰ cáº§n copy/paste video gá»‘c vÃ o thÆ° má»¥c Data/.
Pháº§n má»�m sáº½ tá»± Ä‘á»™ng phÃ¡t hiá»‡n, trÃ­ch xuáº¥t V-JEPA 2 & NeuralFP vÃ  lÆ°u vÄ©nh viá»…n.rS   rr   r&   r  r  r  r-   rg   ©r   rK   rµ   u   ðŸ“‚ Má»Ÿ ThÆ° Má»¥c Data/rW   r"   r   rh   rY   c                 óN   — t          j        t          t          ¦  «        ¦  «        S rW  )ÚosÚ	startfiler"  r   r+  rA   r?   rØ   z5VideoDetectionGUI._build_manage_tab.<locals>.<lambda>b  s   € �BœL­­X©¬Ñ7Ô7€ rA   rw   rÎ   r€   u   ðŸ“¥ Táº£i YouTube VÃ o Data/r    c                 ó.   •— ‰                       d¦  «        S )Nr2  ©rZ  ©r>   s   €r?   rØ   z5VideoDetectionGUI._build_manage_tab.<locals>.<lambda>q  s   ø€ ˜D×6Ò6°vÑ>Ô>€ rA   rx   )ri   r   u+   ðŸŽ¯ ThÆ° Má»¥c Video Má»¥c TiÃªu (Target/)u³   NgÆ°á»�i dÃ¹ng copy/paste video cáº§n kiá»ƒm tra vi pháº¡m vÃ o thÆ° má»¥c Target/.
Ä�áº·c trÆ°ng sáº½ Ä‘Æ°á»£c tÃ­nh toÃ¡n sáºµn Ä‘á»ƒ Ä‘á»‘i soÃ¡t ngay láº­p tá»©c khi má»Ÿ app.u   ðŸ“‚ Má»Ÿ ThÆ° Má»¥c Target/c                 óN   — t          j        t          t          ¦  «        ¦  «        S rW  )r‹  rŒ  r"  r   r+  rA   r?   rØ   z5VideoDetectionGUI._build_manage_tab.<locals>.<lambda>–  s   € �BœL­­Z©¬Ñ9Ô9€ rA   u   ðŸ“¥ Táº£i YouTube VÃ o Target/c                 ó.   •— ‰                       d¦  «        S )Nr1  rŽ  r�  s   €r?   rØ   z5VideoDetectionGUI._build_manage_tab.<locals>.<lambda>¥  s   ø€ ˜D×6Ò6°xÑ@Ô@€ rA   )
r‹   rŒ   r—   r2   r�   rç   rè   ré   rŽ   r�   )r>   Úmanage_frameÚ	card_dataÚbtn_box_dataÚcard_targetÚbtn_box_targets   `     r?   rœ   z#VideoDetectionGUI._build_manage_tab8  s  ø€ Ý”x ¤°D´KÀ	Ô4JÐQSÐZ\Ð]Ñ]Ô]ˆØ×Ò˜v¨dÐÑ3Ô3Ð3ð 	×$Ò$ Q¨qÐ$Ñ1Ô1Ð1Ø×$Ò$ Q¨qÐ$Ñ1Ô1Ð1Ø×!Ò! !¨AÐ!Ñ.Ô.Ð.õ ”H˜\¨d¬k¸)Ô.DÈ2ÐTVÐWÑWÔWˆ	Ø�Š˜1 Q¨v¸FˆÑCÔCÐCå
ŒØØ@Ø)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�cˆ$Ñ
Ô
Ð
å
ŒØð CØ ØØŒ{˜9Ô%ØŒ{Ð+Ô,ð	
ñ 	
ô 	
÷ Š$�c ˆ$Ñ
(Ô
(Ð
(å”x 	¨d¬k¸)Ô.DÐEÑEÔEˆØ×Ò˜s¨ÐÑ1Ô1Ð1å
Œ	ØØ-Ø(ØŒ{˜8Ô$ØØØØØ7Ð7Øð	
ñ 	
ô 	
÷ Š$�F ˆ$Ñ
(Ô
(Ð
(å
Œ	ØØ0Ø(ØŒ{˜?Ô+ØŒ{˜>Ô*Ø!œ[¨Ô2Ø&ØØØØ>Ð>Ð>Ð>Øð	
ñ 	
ô 	
÷ Š$�F ˆ$Ñ
(Ô
(Ð
(õ ”h˜|°´¸IÔ0FÈRÐVXÐYÑYÔYˆØ×Ò˜Q q°¸fÐÑEÔEÐEå
ŒØØ>Ø)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�cˆ$Ñ
Ô
Ð
å
ŒØð HØ ØØŒ{˜9Ô%ØŒ{Ð+Ô,ð	
ñ 	
ô 	
÷ Š$�c ˆ$Ñ
(Ô
(Ð
(åœ +°$´+¸iÔ2HÐIÑIÔIˆØ×Ò ¨7ÐÑ3Ô3Ð3å
Œ	ØØ/Ø(ØŒ{˜8Ô$ØØØØØ9Ð9Øð	
ñ 	
ô 	
÷ Š$�F ˆ$Ñ
(Ô
(Ð
(å
Œ	ØØ2Ø(ØŒ{˜?Ô+ØŒ{˜>Ô*Ø!œ[¨Ô2Ø&ØØØØ@Ð@Ð@Ð@Øð	
ñ 	
ô 	
÷ Š$�F ˆ$Ñ
(Ô
(Ð
(Ð
(Ð
(rA   c                ó6  — t          j        | j        | j        d         dd¬¦  «        }|                     ddd¬¦  «         t          j        |dd	| j        d         | j        d
         ¬¦  «                             dd¬¦  «         dt          › d�}t          j        ||dd| j        d         | j        d         ¬¦  «                             dd¬¦  «         t          j        |dd| j        d         dddd| j        d¬¦
  «
        }|                     d¬¦  «         d S )Nr   r  r¯   r�   TrK   rÐ   u'   ThÃ´ng Tin CÃ´ng Nghá»‡ & Pháº§n Cá»©ngr‡  r%   ro   r¿   r‰  r  ue  â€¢ AI Thá»‹ GiÃ¡c: V-JEPA 2 (Meta AI Spatio-Temporal, 1024-d, Chá»‘ng Láº­t/Crop/Watermark)
â€¢ AI Ã‚m Thanh: NeuralFP (Neural Audio Fingerprinting, 128-d, Chá»‘ng Nhiá»…u/NÃ©n)
â€¢ Pháº§n cá»©ng má»¥c tiÃªu: NVIDIA GeForce RTX 5060 16GB (Adaptive FP16/BF16)
â€¢ CÆ¡ cháº¿ lÆ°u trá»¯: Incremental Feature Store (.npz cache per video)
â€¢ ThÆ° má»¥c Temp/: rR  rS   rr   r&   r  )r   rŠ   u'   ðŸ§¹ Dá»�n Dáº¹p File Táº¡m Trong Temp/r+   r   r   r  rY   rw   rÎ   r  )	r‹   rŒ   r˜   r2   r�   rŽ   r   r�   Úon_clean_temp)r>   ÚpanelÚinfoÚ	btn_cleans       r?   r�   z%VideoDetectionGUI._build_settings_tabª  sI  € Ý”˜Ô*¨t¬{¸9Ô/EÈBÐUWÐXÑXÔXˆØ�
Š
˜ t°"ˆ
Ñ5Ô5Ð5å
ŒØØ:Ø)ØŒ{˜9Ô%ØŒ{˜>Ô*ð	
ñ 	
ô 	
÷ Š$�c ˆ$Ñ
(Ô
(Ð
(ð2õ &.ð	2ð 2ð 2ð 	õ 	ŒØØØ ØØŒ{˜9Ô%ØŒ{Ð+Ô,ð	
ñ 	
ô 	
÷ Š$�c ˆ$Ñ
(Ô
(Ð
(å”IØØ:Ø ØŒ{˜9Ô%ØØØØØÔ&Øð
ñ 
ô 
ˆ	ð 	�Š˜cˆÑ"Ô"Ð"Ð"Ð"rA   c                ób   ‡ — ˆ fd„}t          j        |d¬¦  «                             ¦   «          d S )Nc                 óJ  •‡‡‡‡— t          ¦   «         ‰_        dˆfd„}  | dd¦  «         ‰j                             | ¦  «        \  ŠŠ} | dd	¦  «         ‰j                             | ¦  «        \  ŠŠ}|‰_        |‰_        ‰j                             d
ˆˆˆˆˆfd„¦  «         d S )Nr^  r_  r`  r"  c                óL   •‡ ‡— ‰j                              dˆˆ ˆfd„¦  «         d S )Nr   c                 ó0   •— ‰                      ‰‰ ¦  «        S rW  ©Ú_update_progressrd  s   €€€r?   rØ   zfVideoDetectionGUI._initialize_pipeline_and_sync.<locals>.worker.<locals>.progress_cb.<locals>.<lambda>Ü  s   ø€ ¨4×+@Ò+@ÀÀcÑ+JÔ+J€ rA   re  ©r^  r`  r>   s   ``€r?   Úprogress_cbzTVideoDetectionGUI._initialize_pipeline_and_sync.<locals>.worker.<locals>.progress_cbÛ  s1   øøø€ Ø”	—’ Ð#JÐ#JÐ#JÐ#JÐ#JÐ#JÑKÔKÐKÐKÐKrA   rŠ   u:   Ä�ang kiá»ƒm tra vÃ  Ä‘á»“ng bá»™ kho video gá»‘c Data/...rd   u7   Ä�ang kiá»ƒm tra vÃ  Ä‘á»“ng bá»™ thÆ° má»¥c Target/...r   c                 ó4   •— ‰                      ‰‰ ‰‰¦  «        S rW  )Ú_on_startup_sync_complete)Ú
cache_dataÚ	cache_tgtÚnew_dataÚnew_tgtr>   s   €€€€€r?   rØ   zQVideoDetectionGUI._initialize_pipeline_and_sync.<locals>.worker.<locals>.<lambda>ç  s   ø€  t×'EÒ'EÀhÐPZÐ\cÐenÑ'oÔ'o€ rA   rm  )r   r4   Úsync_data_repositoryÚsync_target_repositoryr7   r6   r   rf  )r£  ÚrefsÚtgtsr¦  r§  r¨  r©  r>   s      @@@@€r?   Úworkerz?VideoDetectionGUI._initialize_pipeline_and_sync.<locals>.workerÖ  sÚ   øøøøø€ å2Ñ4Ô4ˆDŒMðLð Lð Lð Lð Lð Lð ˆK˜ÐXÑYÔYÐYØ)-¬×)KÒ)KÈKÑ)XÔ)XÑ&ˆH�j $àˆK˜ÐUÑVÔVÐVØ'+¤}×'KÒ'KÈKÑ'XÔ'XÑ$ˆG�Y à%)ˆDÔ"Ø"&ˆDÔàŒI�OŠO˜AÐoÐoÐoÐoÐoÐoÐoÐoÑpÔpÐpÐpÐprA   T©r1  Údaemon)Ú	threadingÚThreadÚstart)r>   r®  s   ` r?   r=   z/VideoDetectionGUI._initialize_pipeline_and_syncÕ  sK   ø€ ð	qð 	qð 	qð 	qð 	qõ& 	Ô ¨tÐ4Ñ4Ô4×:Ò:Ñ<Ô<Ð<Ð<Ð<rA   r¨  r_  r¦  r©  r§  c                óâ   — | j                              d| j        d         d¬¦  «         | j                             d|› d|› d|› d|› d�	¬	¦  «         d
| j        d<   |                      ¦   «          d S )Nu$   Sáºµn sÃ ng (Sá»‘ liá»‡u Ä‘Ã£ náº¡p)r*   r   )rp   r.   rq   u    HoÃ n táº¥t Ä‘á»“ng bá»™: Data (u    sáºµn cÃ³, u    má»›i) | Target (u    má»›i)r„   rå   rÉ   )r’   r3   r2   r    rŸ   ry  )r>   r¨  r¦  r©  r§  s        r?   r¥  z+VideoDetectionGUI._on_startup_sync_completeë  sÀ   € ØÔ×#Ò#Ð)OÐTXÔT_Ð`iÔTjÐoxÐ#ÑyÔyÐyØŒ×!Ò!ð  (fÈ*ð  (fð  (fÐbjð  (fð  (fð  Hð  (fð  (fð  V]ð  (fð  (fð  (fÐ!ñ  	gô  	gð  	gØ%(ˆÔ˜'Ñ"Ø×ÒÑ Ô Ð Ð Ð rA   c                óh   ‡ — ‰ j         s‰ j        sd S ‰                      ˆ fd„‰ j        d¬¦  «         d S )Nc                ól   •— ‰j                              | ¦  «        ‰j                              | ¦  «        fS rW  )r4   rª  r«  )rg  r>   s    €r?   rØ   z1VideoDetectionGUI.on_force_sync.<locals>.<lambda>ö  s0   ø€ Ø”×2Ò2°2Ñ6Ô6Ø”×4Ò4°RÑ8Ô8ð"€ rA   u(   Ä�á»“ng bá»™ kho video Data/ vÃ  Target/r€  )r5   r4   r…  Ú_on_force_sync_successr�  s   `r?   r�   zVideoDetectionGUI.on_force_syncñ  s`   ø€ ØÔð 	 T¤]ð 	ØˆFà�Šðð ð ð ð Ô2Ø<ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
rA   c                óÐ   — | j                              ¦   «         | _        | j                              ¦   «         | _        |                      ¦   «          t          j        dd¦  «         d S )Nu   Ä�á»“ng bá»™ hoÃ n táº¥tuA   Ä�Ã£ cáº­p nháº­t toÃ n bá»™ video má»›i trong Data/ vÃ  Target/!)r4   rw  r7   rx  r6   ry  r   rz  )r>   ro  s     r?   r·  z(VideoDetectionGUI._on_force_sync_successþ  s[   € Ø!%¤×!DÒ!DÑ!FÔ!FˆÔØ"œm×>Ò>Ñ@Ô@ˆÔØ×ÒÑ Ô Ð ÝÔÐ6Ð8{Ñ|Ô|Ð|Ð|Ð|rA   c                ó
  — | j                              ¦   «         D ]}| j                              |¦  «         Œ| j                             dt          | j        ¦  «        › d�¬¦  «         | j        D ]Y}t          t          |j	        ¦  «        d¦  «        \  }}| j          
                    dd|j        |j        |d›d|d›�d	f¬
¦  «         ŒZ| j        r<| j                              | j        d         j        ¦  «         | j        d         | _        | j                             ¦   «         D ]}|                     ¦   «          Œ| j                             ¦   «          | j        D ]Ì}t+          j        d¬¦  «        }|| j        |j        <   t          t          |j	        ¦  «        d¦  «        \  }}|j        › d|d›d|d›d|j        › d�}t+          j        | j        ||d| j        d         | j        d         | j        d         | j        d         dd¬¦
  «
        }	|	                     ddd¬¦  «         ŒÍ| j                             dt          | j        ¦  «        › dt          | j        ¦  «        › d�¬¦  «         |                      ¦   «          d S )Nú(z video)r„   rd   ru  ÚendÚ02dú:u   Ä�Ã£ cÃ³ sá»‘ liá»‡u)ÚiidÚvaluesr   TrÈ   ú (ú - z clips)rS   r!   r%   r   r   r¿   )	rp   rÊ   rO   r.   rq   rË   ry   rz   rÁ   rg   rY   r   rj   z
Kho Data: z video | Target: z video)rë   Úget_childrenr&  rê   r3   Úlenr6   Údivmodr_  Úduration_secr(  Úvideo_idÚfilenameÚselection_setr8   rü   Úwinfo_childrenÚdestroyr9   Úclearr7   r‹   r<  Úvisual_countr>  r2   r�   r¡   rõ   )
r>   ÚitemÚtgtÚmÚsÚwidgetÚrefÚvarÚchk_textÚchks
             r?   ry  z#VideoDetectionGUI.refresh_all_views  sÍ  € àÔ%×2Ò2Ñ4Ô4ð 	+ð 	+ˆDØÔ×$Ò$ TÑ*Ô*Ð*Ð*àÔ×'Ò'Ð-Rµ°TÔ5HÑ1IÔ1IÐ-RÐ-RÐ-RÐ'ÑSÔSÐSàÔ&ð 	ð 	ˆCÝ�#˜cÔ.Ñ/Ô/°Ñ4Ô4‰DˆAˆqØÔ×$Ò$ØØØ”LØœ¨Ð&8Ð&8Ð&8°Ð&8Ð&8Ð&8Ð:PÐQð	 %ñ ô ð ð ð Ôð 	@ØÔ×+Ò+¨DÔ,?ÀÔ,BÔ,KÑLÔLÐLØ)-Ô)<¸QÔ)?ˆDÔ&ð Ô.×=Ò=Ñ?Ô?ð 	ð 	ˆFØ�NŠNÑÔÐÐàÔ×!Ò!Ñ#Ô#Ð#àÔ)ð 	/ð 	/ˆCÝ”- dÐ+Ñ+Ô+ˆCØ03ˆDÔ ¤Ñ-å�#˜cÔ.Ñ/Ô/°Ñ4Ô4‰DˆAˆqØœ,ÐUÐU¨!ÐUÐUÐU°!ÐUÐUÐU¸CÔ<LÐUÐUÐUˆHå”.ØÔ(ØØØ$Ø”;˜zÔ*Ø”;˜~Ô.Ø œK¨	Ô2Ø!%¤¨ZÔ!8Ø!*Øðñ ô ˆCð �HŠH˜# A¨AˆHÑ.Ô.Ð.Ð.àÔ×(Ò(Øl�c $Ô"8Ñ9Ô9ÐlÐlÍCÐPTÔPcÑLdÔLdÐlÐlÐlð 	)ñ 	
ô 	
ð 	
ð 	×%Ò%Ñ'Ô'Ð'Ð'Ð'rA   c                óè   — | j                              ¦   «         }|sd S |d         }| j        D ]D}|j        |k    r7|| _        | j                             d|j        › d|j        d›d�¬¦  «          d S ŒEd S )Nr   u   Ä�Ã£ chá»�n Target: rÀ  ú.1fzs)r„   )	rë   Ú	selectionr6   rÆ  r8   r    r3   rÇ  rÅ  )r>   ÚeventÚselected_idsÚvid_idrÎ  s        r?   rñ   z%VideoDetectionGUI._on_target_selected:  sŸ   € ØÔ(×2Ò2Ñ4Ô4ˆØð 	ØˆFØ˜a”ˆØÔ&ð 	ð 	ˆCØŒ|˜vÒ%Ð%Ø-0�Ô*Ø”×)Ò)Ð/nÀcÄlÐ/nÐ/nÐVYÔVfÐ/nÐ/nÐ/nÐ/nÐ)ÑoÔoÐoØ��ð &ð	ð 	rA   c                óØ  — | j                              ¦   «         }|dk    rf| j                             ¦   «         D ]}|                     d¬¦  «         Œ| j                             ¦   «         D ]}|                     d¬¦  «         Œd S | j                             ¦   «         D ]}|                     d¬¦  «         Œ| j                             ¦   «         D ]}|                     d¬¦  «         Œd S )NrÇ   r4  rQ  rP  )ró   r‚  rø   rÉ  r3   rü   )r>   rˆ   Úchilds      r?   rõ   z*VideoDetectionGUI._on_compare_mode_changedE  s	  € ØÔ$×(Ò(Ñ*Ô*ˆØ�5Š=ˆ=àÔ/×>Ò>Ñ@Ô@ð 2ð 2�Ø—’ j�Ñ1Ô1Ð1Ð1ØÔ1×@Ò@ÑBÔBð 2ð 2�Ø—’ j�Ñ1Ô1Ð1Ð1ð2ð 2ð Ô/×>Ò>Ñ@Ô@ð 0ð 0�Ø—’ h�Ñ/Ô/Ð/Ð/ØÔ1×@Ò@ÑBÔBð 0ð 0�Ø—’ h�Ñ/Ô/Ð/Ð/ð0ð 0rA   c                óh   — | j                              ¦   «         D ]}|                     d¦  «         Œd S )NT©r9   r¿  rï   ©r>   rÓ  s     r?   rù   z"VideoDetectionGUI._select_all_refsS  s;   € ØÔ&×-Ò-Ñ/Ô/ð 	ð 	ˆCØ�GŠG�D‰MŒMˆMˆMð	ð 	rA   c                óh   — | j                              ¦   «         D ]}|                     d¦  «         Œd S )NFrß  rà  s     r?   rú   z$VideoDetectionGUI._deselect_all_refsW  s;   € ØÔ&×-Ò-Ñ/Ô/ð 	ð 	ˆCØ�GŠG�E‰NŒNˆNˆNð	ð 	rA   c                óÄ  ‡ ‡‡— ‰ j         s‰ j        sd S ‰ j        st          j        dd¦  «         d S ‰ j        st          j        dd¦  «         d S ‰ j                             ¦   «         }d Š|dk    r<d„ ‰ j         	                    ¦   «         D ¦   «         Š‰st          j        dd¦  «         d S ‰ j        Šˆˆ ˆfd	„}‰  
                    |‰ j        d
‰j        › �¬¦  «         d S )Nu   ChÆ°a chá»�n TargetuH   Vui lÃ²ng chá»�n 1 video má»¥c tiÃªu trong danh sÃ¡ch Target bÃªn trÃ¡i.u   Kho Data rá»—ngu4   ChÆ°a cÃ³ video nÃ o trong kho Data/ Ä‘á»ƒ so sÃ¡nh.rP   c                ó@   — g | ]\  }}|                      ¦   «         ¯|‘ŒS r+  )r‚  )Ú.0rÛ  rÓ  s      r?   ú
<listcomp>z?VideoDetectionGUI.on_run_instant_comparison.<locals>.<listcomp>l  s.   € ÐcÐcÐc©;¨6°3ÐY\×Y`ÒY`ÑYbÔYbÐc ÐcÐcÐcrA   u   ChÆ°a chá»�n video tham chiáº¿uuF   Vui lÃ²ng tÃ­ch chá»�n Ã­t nháº¥t 1 video tham chiáº¿u Ä‘á»ƒ so sÃ¡nh.c                ó¼   •— t          j        ¦   «         }‰j                             t	          ‰j        ¦  «        ‰| ¬¦  «        }t          j        ¦   «         |z
  }||fS )N)Útarget_video_pathÚselected_reference_idsrl  )ÚtimeÚperf_counterr4   Úcompare_target_with_referencesr   Ú
video_path)rg  Ústart_tÚmatchesÚelapsedÚselected_ref_idsr>   Útarget_vs       €€€r?   rs  z9VideoDetectionGUI.on_run_instant_comparison.<locals>.tasks  sb   ø€ ÝÔ'Ñ)Ô)ˆGØ”m×BÒBÝ"& xÔ':Ñ";Ô";Ø'7Ø"$ð Cñ ô ˆGõ
 Ô'Ñ)Ô)¨GÑ3ˆGØ˜GÐ#Ð#rA   u   Ä�á»‘i soÃ¡t r€  )r5   r4   r8   r   rƒ  r7   ró   r‚  r9   Úitemsr…  Ú_on_comparison_finishedrÇ  )r>   rˆ   rs  rð  rñ  s   `  @@r?   rþ   z+VideoDetectionGUI.on_run_instant_comparison\  sT  øøø€ ØÔð 	 T¤]ð 	ØˆFàÔ)ð 	ÝÔ"Ð#8ð  ;Eñ  Fô  Fð  FØˆFàÔ%ð 	ÝÔ"Ð#4Ð6lÑmÔmÐmØˆFàÔ$×(Ò(Ñ*Ô*ˆØ-1Ðà�:ÒÐØcÐc¸$Ô:M×:SÒ:SÑ:UÔ:UÐcÑcÔcÐØ#ð ÝÔ&Ð'Hð  KSñ  Tô  Tð  TØ�àÔ-ˆð	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	�ŠØØÔ3Ø5 (Ô"3Ð5Ð5ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
rA   c                ó(  — |\  }}|| _         | j                             ¦   «         D ]}| j                             |¦  «         Œ| j        r| j        j        nd}|ss| j                             d|dz  d›d�| j        d         ¬¦  «         | j         	                    dd	|d
ddddddf¬¦  «         t          j        dd|dz  d›d�¦  «         d S | j                             dt          |¦  «        › d|dz  d›d�| j        d         ¬¦  «         |D ]Ó}|j        dz  d›d�}|j        d›d�}ddddœ                     |j        |j        ¦  «        }	| j         	                    dd	||j        |                     |j        ¦  «        › d|                     |j        ¦  «        › �|                     |j        ¦  «        › d|                     |j        ¦  «        › �|||	df¬¦  «         ŒÔt          j        ddt          |¦  «        › d|› d|dz  d›d �¦  «         d S )!NÚTargetuJ   AN TOÃ€N: KhÃ´ng phÃ¡t hiá»‡n Ä‘oáº¡n trÃ¹ng láº·p (Thá»�i gian so sÃ¡nh: iè  r×  zms)r*   )rp   rq   ru  r»  u   KhÃ´ng cÃ³ trÃ¹ng khá»›pú-u   AN TOÃ€N)r¿  u   Káº¿t quáº£ Ä‘á»‘i soÃ¡tuM   KhÃ´ng tÃ¬m tháº¥y Ä‘oáº¡n video nÃ o bá»‹ sao chÃ©p.
(Thá»�i gian so sÃ¡nh: u   PHÃ�T HIá»†N: u$    Ä‘oáº¡n trÃ¹ng láº·p (Thá»�i gian: r)   rå   ú%rÐ  u   HÃ¬nh áº£nh & Ã‚m thanhu   Chá»‰ HÃ¬nh áº£nhu   Chá»‰ Ã‚m thanh)Ú
multimodalÚvisual_onlyÚ
audio_onlyrÁ  u   TRÃ™NG Láº¶Pu(   PhÃ¡t hiá»‡n trÃ¹ng láº·p báº£n quyá»�n!u   PhÃ¡t hiá»‡n u    Ä‘oáº¡n trÃ¹ng láº·p giá»¯a 'uN   ' vÃ  kho video cá»§a chá»§ sá»Ÿ há»¯u!
Thá»�i gian tÃ­nh toÃ¡n Ä‘á»‘i soÃ¡t: Úms)r:   r  rÂ  r&  r8   rÇ  r   r3   r2   r(  r   rz  rÃ  Úconfidence_scorerÅ  r‚  rà   Úreference_video_idÚ_format_timeÚtarget_start_secÚtarget_end_secÚref_start_secÚref_end_secrƒ  )
r>   Úresultrî  rï  rÍ  Útarget_namerÏ  Úconf_strÚdur_strÚ
type_labels
             r?   ró  z)VideoDetectionGUI._on_comparison_finishedƒ  sï  € Ø!Ñˆ�Ø'.ˆÔ$ð Ô%×2Ò2Ñ4Ô4ð 	+ð 	+ˆDØÔ×$Ò$ TÑ*Ô*Ð*Ð*à=AÔ=WÐe�dÔ0Ô9Ð9Ð]eˆàð 	ØÔ"×,Ò,ØwÐbiÐjnÑbnÐwÐwÐwÐwØ”;˜yÔ)ð -ñ ô ð ð Ô×$Ò$ØØØ#Ð%?ÀÀcÈ3ÐPSÐUXÐZdÐeð %ñ ô ð õ
 ÔØ*ØvÐahÐimÑamÐvÐvÐvÐvñô ð ð ˆFàÔ×(Ò(Øi¥# g¡,¤,ÐiÐiÐT[Ð\`ÑT`ÐiÐiÐiÐiØŒ{˜8Ô$ð 	)ñ 	
ô 	
ð 	
ð
 ð 	ð 	ˆAØÔ,¨sÑ2Ð9Ð9Ð9Ð9ˆHØœÐ.Ð.Ð.Ð.ˆGà7Ø2Ø/ðð ÷ Šc�!”, ¤Ñ-Ô-ð	 ð Ô×$Ò$ØØàØÔ(Ø—~’~ aÔ&8Ñ9Ô9Ð`Ð`¸a¿nºnÈQÔM]Ñ>^Ô>^Ð`Ð`Ø—~’~ a¤oÑ6Ô6ÐZÐZ¸1¿>º>È!Ì-Ñ;XÔ;XÐZÐZØØØØ"ð	ð %ñ ô ð ð õ 	ÔØ6ðJ�C ™LœLð Jð JÈð Jð JØ5<¸T±\ÐIðJð Jð Jñ	
ô 	
ð 	
ð 	
ð 	
rA   c                ó¦  — | j         st          j        dd¦  «         d S t          j        ddgd¬¦  «        }|sd S | j        r| j        j        nd}|t          | j         ¦  «        d„ | j         D ¦   «         d	œ}t          |d
d¬¦  «        5 }t          j
        ||dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        dd|› �¦  «         d S )Nu   ThÃ´ng bÃ¡ou5   ChÆ°a cÃ³ káº¿t quáº£ Ä‘á»‘i soÃ¡t nÃ o Ä‘á»ƒ xuáº¥t.z.json)z	JSON Filez*.jsonzket_qua_doi_soat.json)ÚdefaultextensionÚ	filetypesÚinitialfiler1  c                ó6   — g | ]}|                      ¦   «         ‘ŒS r+  )Úto_dict)rä  rÏ  s     r?   rå  zBVideoDetectionGUI.on_export_comparison_results.<locals>.<listcomp>Ñ  s    € ÐJÐJÐJ¨˜Ÿ	š	™œÐJÐJÐJrA   )rÛ   Útotal_matchesrî  r¿   zutf-8)Úencodingr   F)ÚindentÚensure_asciiu   ThÃ nh cÃ´ngu   Ä�Ã£ xuáº¥t bÃ¡o cÃ¡o ra file:
)r:   r   rz  r   Úasksaveasfilenamer8   rÇ  rÃ  ÚopenÚjsonÚdump)r>   Úsave_pr  r2  Úfs        r?   r  z.VideoDetectionGUI.on_export_comparison_resultsÀ  sH  € ØÔ+ð 	ÝÔ Ð/fÑgÔgÐgØˆFåÔ-Ø$Ø.Ð/Ø/ð
ñ 
ô 
ˆð
 ð 	ØˆFà=AÔ=WÐe�dÔ0Ô9Ð9Ð]eˆà'Ý  Ô!=Ñ>Ô>ØJÐJ¨TÔ-IÐJÑJÔJð
ð 
ˆõ �&˜#¨Ð0Ñ0Ô0ð 	=°AÝŒI�d˜A a°eÐ<Ñ<Ô<Ð<ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=õ 	Ô˜NÐ,WÈvÐ,WÐ,WÑXÔXÐXÐXÐXs   Â	B.Â.B2Â5B2c                óT   — t          ¦   «         }t          j        dd|› d�¦  «         d S )Nu   Dá»�n dáº¹p Tempu   Ä�Ã£ dá»�n dáº¹p u#    file táº¡m trong thÆ° má»¥c Temp/.)r   r   rz  )r>   Úcounts     r?   r˜  zVideoDetectionGUI.on_clean_tempÙ  s3   € ÝÑ Ô ˆÝÔÐ.Ð0nÀEÐ0nÐ0nÐ0nÑoÔoÐoÐoÐorA   r/   c                óÊ   ‡ ‡‡— d‰ _         d‰ j        d<   ‰ j                             d|› d�¬¦  «         ˆˆ ˆfd„}t	          j        |d¬¦  «                             ¦   «          d S )	NTr   rÉ   u   Ä�ang xá»­ lÃ½: z...r„   c                 ó  •‡‡— 	 dˆfd„}  ‰| ¦  «        Š‰j                              dˆˆˆfd„¦  «         d S # t          $ rIŠt                               d‰› �d	¬
¦  «         ‰j                              dˆˆfd„¦  «         Y d Š‹d S d Š‹ww xY w)Nr^  r_  r`  r"  c                óL   •‡ ‡— ‰j                              dˆˆ ˆfd„¦  «         d S )Nr   c                 ó0   •— ‰                      ‰‰ ¦  «        S rW  r   rd  s   €€€r?   rØ   zPVideoDetectionGUI._run_task.<locals>.worker.<locals>.update_cb.<locals>.<lambda>å  s   ø€ ¨t×/DÒ/DÀSÈ#Ñ/NÔ/N€ rA   re  r¢  s   ``€r?   Ú	update_cbz>VideoDetectionGUI._run_task.<locals>.worker.<locals>.update_cbä  s1   øøø€ Ø”I—O’O AÐ'NÐ'NÐ'NÐ'NÐ'NÐ'NÑOÔOÐOÐOÐOrA   r   c                 ó0   •— ‰                      ‰ ‰¦  «        S rW  )Ú_on_task_done)r  r  r>   s   €€€r?   rØ   z=VideoDetectionGUI._run_task.<locals>.worker.<locals>.<lambda>è  s   ø€ ¨4×+=Ò+=¸jÈ&Ñ+QÔ+Q€ rA   u   Lá»—i task: T)Úexc_infoc                 óH   •— ‰                      t          ‰ ¦  «        ¦  «        S rW  )Ú_on_task_errorr"  rÖ   s   €€r?   rØ   z=VideoDetectionGUI._run_task.<locals>.worker.<locals>.<lambda>ë  s   ø€ ¨4×+>Ò+>½sÀ1¹v¼vÑ+FÔ+F€ rA   rm  )r   rf  rM  ÚloggerÚerror)r  r×   r  r  r>   r�  s    @@€€€r?   r®  z+VideoDetectionGUI._run_task.<locals>.workerâ  sã   øøø€ ðHðPð Pð Pð Pð Pð Pð #˜ 9Ñ-Ô-�Ø”	—’ Ð#QÐ#QÐ#QÐ#QÐ#QÐ#QÑRÔRÐRÐRÐRøÝð Hð Hð HÝ—’Ð/¨AÐ/Ð/¸$�Ñ?Ô?Ð?Ø”	—’ Ð#FÐ#FÐ#FÐ#FÐ#FÑGÔGÐGÐGÐGÐGÐGÐGÐGøøøøðHøøøs   …18 ¸
BÁ>BÂBr¯  )r5   rŸ   r    r3   r±  r²  r³  )r>   r�  r  r/   r®  s   ```  r?   r…  zVideoDetectionGUI._run_taskÝ  s“   øøø€ Ø!ˆÔØ%&ˆÔ˜'Ñ"ØŒ×!Ò!Ð'D¸%Ð'DÐ'DÐ'DÐ!ÑEÔEÐEð		Hð 		Hð 		Hð 		Hð 		Hð 		Hð 		Hõ 	Ô ¨tÐ4Ñ4Ô4×:Ò:Ñ<Ô<Ð<Ð<Ð<rA   r^  r`  c                óP   — || j         d<   | j                             |¬¦  «         d S )NrÉ   r„   )rŸ   r    r3   )r>   r^  r`  s      r?   r¡  z"VideoDetectionGUI._update_progressï  s.   € Ø%(ˆÔ˜'Ñ"ØŒ×!Ò! sÐ!Ñ+Ô+Ð+Ð+Ð+rA   c                ó|   — d| _         d| j        d<   | j                             d¬¦  «         |r ||¦  «         d S d S )NFrå   rÉ   u   Sáºµn sÃ ng.r„   )r5   rŸ   r    r3   )r>   r  r  s      r?   r   zVideoDetectionGUI._on_task_doneó  sX   € Ø"ˆÔØ%(ˆÔ˜'Ñ"ØŒ×!Ò! ~Ð!Ñ6Ô6Ð6Øð 	ØˆJ�vÑÔÐÐÐð	ð 	rA   Úerrc                óŽ   — d| _         d| j        d<   | j                             d¬¦  «         t	          j        dd|› �¦  «         d S )NFr   rÉ   u*   Lá»—i xáº£y ra trong quÃ¡ trÃ¬nh xá»­ lÃ½.r„   u   Lá»—iu   Lá»—i xáº£y ra:
)r5   rŸ   r    r3   r   r}  )r>   r(  s     r?   r#  z VideoDetectionGUI._on_task_errorú  sS   € Ø"ˆÔØ%&ˆÔ˜'Ñ"ØŒ×!Ò!Ð'SÐ!ÑTÔTÐTÝÔ˜WÐ&?¸#Ð&?Ð&?Ñ@Ô@Ð@Ð@Ð@rA   N)r   r   r   r   ©r   r   )rp   r"  r   r   )rU  r"  r   r   )
r¨  r_  r¦  r_  r©  r_  r§  r_  r   r   )r/   r"  r   r   )r^  r_  r`  r"  r   r   )r(  r"  r   r   )Ú__name__Ú
__module__Ú__qualname__r@   r;   r<   rš   r›   r:  rT  rZ  r?  rœ   r�   r=   r¥  r�   r·  ry  rñ   rõ   rù   rú   rþ   ró  r  r˜  r…  r¡  r   r#  r+  rA   r?   r   r      su  € € € € € ð*-ð *-ð *-ð *-ðX7
ð 7
ð 7
ð 7
ðrd2ð d2ð d2ð d2ðNC0ð C0ð C0ð C0ðLoDð oDð oDð oDðbð ð ð ð4ð 4ð 4ð 4ð&ð &ð &ð &ð
>
ð >
ð >
ð >
ðBo)ð o)ð o)ð o)ðd(#ð (#ð (#ð (#ðV=ð =ð =ð =ð,!ð !ð !ð !ð
ð 
ð 
ð 
ð}ð }ð }ð }ð4(ð 4(ð 4(ð 4(ðl	ð 	ð 	ð 	ð0ð 0ð 0ð 0ðð ð ð ðð ð ð ð
%
ð %
ð %
ð %
ðN;
ð ;
ð ;
ð ;
ðzYð Yð Yð Yð2pð pð pð pð=ð =ð =ð =ð$,ð ,ð ,ð ,ðð ð ð ðAð Að Að Að Að ArA   r   r   r   c                 ór   — t          j        ¦   «         } t          | ¦  «        }|                      ¦   «          d S rW  )r‹   ÚTkr   Úmainloop)r   Úapps     r?   Ú
launch_guir2    s+   € ÝŒ5‰7Œ7€DÝ
˜DÑ
!Ô
!€CØ‡M‚M�O„O€O€O€OrA   Ú__main__r*  )(Ú__doc__Ú
__future__r   r  Úloggingr‹  Ú
subprocessÚsysr±  ré  Úpathlibr   Útkinterr   r   r   r‹   Úalignment.matcherr	   Úcore.configr
   Ú
core.pathsr   r   r   r   r   r   Úindexing.feature_storer   r   Úingestion.youtube_downloaderr   r4   r   Ú	getLoggerr+  r$  r   r2  r+  rA   r?   ú<module>rA     s·  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø Ð Ð Ð à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø  Ð  Ð  Ð  Ð  Ð  Ø bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bØ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ =Ð =Ð =Ð =Ð =Ð =Ø -Ð -Ð -Ð -Ð -Ð -à	ˆÔ	˜8Ñ	$Ô	$€ð_Að _Að _Að _Að _Añ _Aô _Að _AðD'ð ð ð ð ˆzÒÐØ€J�L„L€L€L€Lð ÐrA   