§
    	#Ëjø,  ã                  ó6  — d Z ddlmZ ddlZddlZddlZddlmZ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ZddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZ ddlm Z  ddl!m"Z"m#Z#  ej$        e%¦  «        Z&h d£Z'e G d„ d¦  «        ¦   «         Z( G d„ d¦  «        Z)dS )uI  
Feature Store and Cache Manager for VideoDetection.
Tá»± Ä‘á»™ng Ä‘á»“ng bá»™, trÃ­ch xuáº¥t vÃ  lÆ°u trá»¯ Ä‘áº·c trÆ°ng (V-JEPA 2 + NeuralFP) theo tá»«ng video
vÃ o thÆ° má»¥c con .features/ cá»§a Data/ vÃ  Target/.
Ä�áº£m báº£o khi má»Ÿ pháº§n má»�m thÃ¬ toÃ n bá»™ sá»‘ liá»‡u Ä‘Ã£ sáºµn sÃ ng, so sÃ¡nh tá»©c thÃ¬ (<0.1s).
é    )ÚannotationsN)ÚasdictÚ	dataclass)ÚPath)ÚAnyÚCallableÚDictÚListÚOptionalÚTupleé   )ÚNeuralFPExtractor)ÚDATA_DIRÚ
TARGET_DIRÚclean_temp_dir)ÚAudioChunkExtractor)ÚVideoClipExtractorÚget_video_metadata)ÚVJEPAExtractoré   )ÚProductQuantizer64Úbinarize_audio_fingerprint>	   ú.tsú.aviú.flvú.m4vú.mkvú.movú.mp4ú.wmvú.webmc                  óÈ   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   d
ed<   d
ed<   d
ed<   dZded<   dZded<   edd„¦   «         Zedd„¦   «         Zdd„Z	dS )ÚCachedVideoFeaturesÚstrÚvideo_idÚfilenameÚ
video_pathÚfloatÚduration_secÚintÚfile_size_bytesÚ
file_mtimez
np.ndarrayÚvisual_timesÚvisual_embsÚaudio_timesÚ	audio_fpsNzOptional[np.ndarray]Úvisual_codesÚ
audio_bitsÚreturnc                ó*   — t          | j        ¦  «        S ©N)Úlenr-   ©Úselfs    ú8C:\Projects\VideoDetection\src\indexing\feature_store.pyÚvisual_countz CachedVideoFeatures.visual_count-   s   € å�4Ô$Ñ%Ô%Ð%ó    c                ó*   — t          | j        ¦  «        S r5   )r6   r/   r7   s    r9   Úaudio_countzCachedVideoFeatures.audio_count1   s   € å�4Ô#Ñ$Ô$Ð$r;   úDict[str, Any]c           	     ó„   — | j         | j        | j        t          | j        d¦  «        | j        | j        | j        | j        dœS )Nr   )r%   r&   r'   r)   r+   r,   r:   r=   )	r%   r&   r'   Úroundr)   r+   r,   r:   r=   r7   s    r9   Úto_metadata_dictz$CachedVideoFeatures.to_metadata_dict5   sG   € àœØœØœ/Ý! $Ô"3°QÑ7Ô7Ø#Ô3Øœ/Ø Ô-ØÔ+ð	
ð 	
ð 		
r;   )r3   r*   )r3   r>   )
Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r1   r2   Úpropertyr:   r=   rA   © r;   r9   r#   r#      sù   € € € € € € à€M€M�MØ€M€M�MØ€O€O�OØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ)-€LÐ-Ð-Ð-Ñ-Ø'+€JÐ+Ð+Ð+Ñ+àð&ð &ð &ñ „Xð&ð ð%ð %ð %ñ „Xð%ð

ð 

ð 

ð 

ð 

ð 

r;   r#   c                  ór   — e Zd ZdZdd„Zedd„¦   «         Zed d„¦   «         Zd!d„Zd"d„Z		 d#d$d„Z
	 d#d%d„ZdS )&ÚFeatureStoreuU   
    Quáº£n lÃ½ kho cache Ä‘áº·c trÆ°ng Ä‘á»™c láº­p cho cáº£ Data/ vÃ  Target/.
    Úclip_extractorr   Úchunk_extractorr   Úvisual_extractorr   Úaudio_extractorr   r3   ÚNonec                ól   — || _         || _        || _        || _        t	          ddd¬¦  «        | _        d S )Ni   é@   é   )ÚdÚmÚnbits)rJ   rK   rL   rM   r   Ú	quantizer)r8   rJ   rK   rL   rM   s        r9   Ú__init__zFeatureStore.__init__G   s>   € ð -ˆÔØ.ˆÔØ 0ˆÔØ.ˆÔå+¨d°bÀÐBÑBÔBˆŒˆˆr;   Úbase_dirr   c                ó>   — | dz  }|                      dd¬¦  «         |S )Nz	.featuresT)ÚparentsÚexist_ok)Úmkdir)rW   Úfdirs     r9   Úget_features_dirzFeatureStore.get_features_dirU   s'   € à˜+Ñ%ˆØ�
Š
˜4¨$ˆ
Ñ/Ô/Ð/Øˆr;   r'   c                ó”   — t                                | j        ¦  «        }| j        › d| j                             d¦  «        › d�}||z  S )NÚ_ú.z.npz)rI   r]   ÚparentÚstemÚsuffixÚlstrip)r'   r\   Ú	safe_names      r9   Úget_cache_pathzFeatureStore.get_cache_path[   sL   € å×,Ò,¨ZÔ->Ñ?Ô?ˆà!”ÐLÐL¨Ô):×)AÒ)AÀ#Ñ)FÔ)FÐLÐLÐLˆ	Ø�iÑÐr;   Úboolc                óø  — |                       |¦  «        }|                     ¦   «         sdS 	 |                     ¦   «         }t          j        |d¬¦  «        5 }t          |                     dd¦  «        ¦  «        }t          |                     dd¦  «        ¦  «        }||j        k    r)t          ||j
        z
  ¦  «        dk     r	 d d d ¦  «         dS d d d ¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY wdS )	NFT©Úallow_pickler+   éÿÿÿÿr,   g      ð¿g      ð?)rf   ÚexistsÚstatÚnpÚloadr*   Úgetr(   Úst_sizeÚabsÚst_mtimeÚ	Exception)r8   r'   Úcache_prm   ÚdataÚcached_sizeÚcached_mtimes          r9   Úis_cached_and_validz FeatureStore.is_cached_and_validb   sX  € Ø×%Ò% jÑ1Ô1ˆØ�~Š~ÑÔð 	Ø�5ð
	Ø—?’?Ñ$Ô$ˆDå”˜¨tÐ4Ñ4Ô4ð  ¸Ý! $§(¢(Ð+<¸bÑ"AÔ"AÑBÔB�Ý$ T§X¢X¨l¸DÑ%AÔ%AÑBÔB�à $¤,Ò.Ð.µ3°|ÀdÄmÑ7SÑ3TÔ3TÐWZÒ3ZÐ3ZØð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  øøõ ð 	ð 	ð 	ØˆDð	øøøàˆus<   ­*C* ÁA.CÃC* ÃC* ÃC"Ã"C* Ã%C"Ã&C* Ã*
C7Ã6C7úOptional[CachedVideoFeatures]c                óz  — |                       |¦  «        }|                     ¦   «         sd S 	 t          j        |d¬¦  «        5 }|d         }|d         }|                     dd ¦  «        }|€-t          |¦  «        dk    r| j                             |¦  «        }|                     dd ¦  «        }|€"t          |¦  «        dk    rt          |¦  «        }t          t          |d         ¦  «        t          |d	         ¦  «        t          |d
         ¦  «        t          |d         ¦  «        t          |d         ¦  «        t          |d         ¦  «        |d         ||d         |||¬¦  «        cd d d ¦  «         S # 1 swxY w Y   d S # t          $ r+}t                               d|› d|› �¦  «         Y d }~d S d }~ww xY w)NTri   r.   r0   r1   r   r2   r%   r&   r'   r)   r+   r,   r-   r/   ©r%   r&   r'   r)   r+   r,   r-   r.   r/   r0   r1   r2   u   Lá»—i náº¡p cache tá»« z: )rf   rl   rn   ro   rp   r6   rU   Úencoder   r#   r$   r(   r*   rt   ÚloggerÚerror)	r8   r'   ru   rv   Úv_embsÚa_fpsÚv_codesÚa_bitsÚes	            r9   Úload_featureszFeatureStore.load_featurest   s  € Ø×%Ò% jÑ1Ô1ˆØ�~Š~ÑÔð 	Ø�4ð	Ý”˜¨tÐ4Ñ4Ô4ð ¸Ø˜mÔ,�Ø˜[Ô)�ð Ÿ(š( >°4Ñ8Ô8�Ø�?¥s¨6¡{¤{°Q¢ Ø"œn×3Ò3°FÑ;Ô;�GàŸš ,°Ñ5Ô5�Ø�>¥c¨%¡j¤j°1¢n nÝ7¸Ñ>Ô>�Få*Ý   jÔ!1Ñ2Ô2Ý   jÔ!1Ñ2Ô2Ý" 4¨Ô#5Ñ6Ô6Ý!& t¨NÔ';Ñ!<Ô!<Ý$'¨Ð->Ô(?Ñ$@Ô$@Ý$ T¨,Ô%7Ñ8Ô8Ø!% nÔ!5Ø &Ø $ ]Ô 3Ø#Ø!(Ø%ðñ ô ðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð øõ6 ð 	ð 	ð 	Ý�LŠLÐA°7ÐAÐA¸aÐAÐAÑBÔBÐBØ�4�4�4�4�4øøøøð	øøøs<   ­F ÁD(E8Å+F Å8E<Å<F Å?E<Æ F Æ
F:Æ F5Æ5F:NÚprogress_callbackú$Optional[Callable[[int, str], None]]r#   c                ó,  — |                      ¦   «         }t          |¦  «        }|r |dd|j        › �¦  «         g }g }| j                             |¦  «        D ]I\  }}| j                             |¦  «        }	|                     |¦  «         |                     |	¦  «         ŒJ|r |dd|j        › �¦  «         g }
g }| j         	                    |¦  «        D ]I\  }}| j
                             |¦  «        }|
                     |¦  «         |                     |¦  «         ŒJt          j        |t          j        ¬¦  «        }|r3t          j        |d¬¦  «                             t          j        ¦  «        n+t          j        d| j        j        ft          j        ¬¦  «        }t          j        |
t          j        ¬¦  «        }|r3t          j        |d¬¦  «                             t          j        ¦  «        n+t          j        d| j
        j        ft          j        ¬¦  «        }t'          |¦  «        dk    r| j                             |¦  «        n+t          j        d| j        j        ft          j        ¬¦  «        }t'          |¦  «        dk    rt1          |¦  «        nt          j        dt          j        ¬¦  «        }t3          |j        |j        t7          |¦  «        |j        |j        |j        ||||||¬	¦  «        }|                      |¦  «        }t          j         ||j!        |j"        |j#        |j        |j$        |j%        |j&        |j'        |j(        |j)        |j*        |j+        ¬	¦  «         tY          ¦   «          |r |d
d|j        › �¦  «         |S )ui   
        TrÃ­ch xuáº¥t Ä‘áº·c trÆ°ng V-JEPA 2 vÃ  NeuralFP rá»“i lÆ°u file .npz vÃ o .features/.
        é
   u   Ä�ang bÃ³c tÃ¡ch video clips: é2   u%   Ä�ang bÃ³c tÃ¡ch audio fingerprints: )Údtyper   )Úaxis)r   é   r|   éd   u   Ä�Ã£ lÆ°u cache Ä‘áº·c trÆ°ng: )-rm   r   ÚnamerJ   Úextract_clipsrL   ÚextractÚappendrK   Úextract_chunksrM   rn   ÚarrayÚfloat32ÚstackÚastypeÚemptyÚembedding_dimÚfingerprint_dimr6   rU   r}   rS   Úuint8r   r#   rb   r$   r)   rq   rs   rf   Úsavez_compressedr%   r&   r'   r+   r,   r-   r.   r/   r0   r1   r2   r   )r8   r'   r†   rm   ÚmetaÚ	vis_timesÚvis_embs_listÚt_secÚclipÚembÚ	aud_timesÚaud_fps_listÚchunkÚfpÚvisual_times_npÚvisual_embs_npÚaudio_times_npÚaudio_fps_npr1   r2   Úfeaturesru   s                         r9   Úprocess_and_cache_videoz$FeatureStore.process_and_cache_video™   s³  € ð �ŠÑ Ô ˆÝ! *Ñ-Ô-ˆàð 	VØÐ˜bÐ"TÀ:Ä?Ð"TÐ"TÑUÔUÐUð "$ˆ	Ø*,ˆØÔ.×<Ò<¸ZÑHÔHð 	&ð 	&‰KˆE�4ØÔ'×/Ò/°Ñ5Ô5ˆCØ×Ò˜UÑ#Ô#Ð#Ø× Ò  Ñ%Ô%Ð%Ð%àð 	]ØÐ˜bÐ"[È*Ì/Ð"[Ð"[Ñ\Ô\Ð\ð "$ˆ	Ø)+ˆØ Ô0×?Ò?À
ÑKÔKð 	$ð 	$‰LˆE�5ØÔ%×-Ò-¨eÑ4Ô4ˆBØ×Ò˜UÑ#Ô#Ð#Ø×Ò Ñ#Ô#Ð#Ð#õ œ( 9µB´JÐ?Ñ?Ô?ˆð ðV�BŒH�]¨Ð+Ñ+Ô+×2Ò2µ2´:Ñ>Ô>Ð>å”˜1˜dÔ3ÔAÐBÍ"Ì*ÐUÑUÔUð 	õ œ )µ2´:Ð>Ñ>Ô>ˆð ðW�BŒH�\¨Ð*Ñ*Ô*×1Ò1µ"´*Ñ=Ô=Ð=å”˜1˜dÔ2ÔBÐCÍ2Ì:ÐVÑVÔVð 	õ �>Ñ"Ô" QÒ&Ð&ð ŒN×!Ò! .Ñ1Ô1Ð1å”˜1˜dœnÔ.Ð/µr´xÐ@Ñ@Ô@ð 	õ �<Ñ Ô  1Ò$Ð$õ ' |Ñ4Ô4Ð4å”˜'­¬Ð2Ñ2Ô2ð 	õ 'Ø”_Ø”_Ý˜:‘”ØÔ*Ø œLØ”}Ø(Ø&Ø&Ø"Ø%Ø!ð
ñ 
ô 
ˆð  ×%Ò% jÑ1Ô1ˆÝ
ÔØØÔ&ØÔ&ØÔ*Ø!Ô.Ø$Ô4ØÔ*Ø!Ô.Ø Ô,Ø Ô,ØÔ(Ø!Ô.ØÔ*ð	
ñ 	
ô 	
ð 	
õ  	ÑÔÐàð 	XØÐ˜cÐ#VÀZÄ_Ð#VÐ#VÑWÔWÐWàˆr;   Ú	directoryú*Tuple[int, int, List[CachedVideoFeatures]]c           	     ó^  ‡‡
‡— d„ |                      ¦   «         D ¦   «         }d}d}g }t          |¦  «        Š‰dk    r‰r ‰dd|j        › d�¦  «         ddg fS t          |¦  «        D ]š\  Š
}dˆ
ˆˆfd
„}|                      |¦  «        rH|                      |¦  «        }	|	r1|                     |	¦  «         |dz  }‰r |dd|j        › �¦  «         Œj|                      ||¦  «        }	|                     |	¦  «         |dz  }Œ›‰r% ‰dd|j        › dt          |¦  «        › d�¦  «         |||fS )u7  
        QuÃ©t thÆ° má»¥c (Data/ hoáº·c Target/).
        Náº¿u cÃ³ video má»›i chÆ°a trÃ­ch xuáº¥t: tá»± Ä‘á»™ng trÃ­ch xuáº¥t vÃ  cache.
        Náº¿u Ä‘Ã£ cache: náº¡p nhanh tá»« Ä‘Ä©a.
        Tráº£ vá»�: (sá»‘ lÆ°á»£ng má»›i xá»­ lÃ½, sá»‘ lÆ°á»£ng dÃ¹ng cache cÅ©, danh sÃ¡ch táº¥t cáº£ features)
        c                óz   — g | ]8}|                      ¦   «         r"|j                             ¦   «         t          v ¯6|‘Œ9S rG   )Úis_filerc   ÚlowerÚSUPPORTED_EXTENSIONS)Ú.0Úfs     r9   ú
<listcomp>z/FeatureStore.sync_directory.<locals>.<listcomp>
  sJ   € ð 
ð 
ð 
ØØ�yŠy‰{Œ{ð
à œxŸ~š~Ñ/Ô/Õ3GÐGÐGð ØGÐGÐGr;   r   rŽ   u   ThÆ° má»¥c u   / hiá»‡n khÃ´ng cÃ³ video.Úpctr*   Úmsgr$   c           	     óp   •— ‰r2t          ‰dz  | z   ‰z  ¦  «        } ‰|d‰dz   › d‰› d|› �¦  «         d S d S )NrŽ   ú[r   ú/z] )r*   )r·   r¸   ÚoverallÚidxr†   Útotals      €€€r9   Úfile_cbz,FeatureStore.sync_directory.<locals>.file_cb  si   ø€ Ø$ð KÝ! C¨#¡I°Ñ#4¸Ñ"=Ñ>Ô>�GØ%Ð% gÐ/I°3°q±5Ð/IÐ/I¸5Ð/IÐ/IÀCÐ/IÐ/IÑJÔJÐJÐJÐJðKð Kr;   r   u   Ä�Ã£ náº¡p sáºµn tá»« cache: u   Ä�á»“ng bá»™ xong z/: z video.)r·   r*   r¸   r$   )Úiterdirr6   r�   Ú	enumeratery   r…   r’   r¬   )r8   r­   r†   Úvideo_filesÚnewly_processedÚ
from_cacheÚall_featuresÚv_pathr¿   Úfeatsr½   r¾   s     `       @@r9   Úsync_directoryzFeatureStore.sync_directoryÿ   sÍ  øøø€ ð
ð 
Ø ×(Ò(Ñ*Ô*ð
ñ 
ô 
ˆð
 ˆØˆ
Ø24ˆÝ�KÑ Ô ˆà�AŠ:ˆ:Ø ð aØ!Ð! #Ð'_°Y´^Ð'_Ð'_Ð'_Ñ`Ô`Ð`Ø�a˜�8ˆOå$ [Ñ1Ô1ð 	!ð 	!‰KˆC�ðKð Kð Kð Kð Kð Kð Kð Kð
 ×'Ò'¨Ñ/Ô/ð Ø×*Ò*¨6Ñ2Ô2�Øð Ø ×'Ò'¨Ñ.Ô.Ð.Ø !‘O�JØ(ð TØ˜ Ð%RÀVÄ[Ð%RÐ%RÑSÔSÐSØð ×0Ò0°¸ÑAÔAˆEØ×Ò Ñ&Ô&Ð&Ø˜qÑ ˆOˆOàð 	gØÐ˜cÐ#e¸	¼Ð#eÐ#eÍ3È|ÑK\ÔK\Ð#eÐ#eÐ#eÑfÔfÐfà 
¨LÐ8Ð8r;   )
rJ   r   rK   r   rL   r   rM   r   r3   rN   )rW   r   r3   r   )r'   r   r3   r   )r'   r   r3   rg   )r'   r   r3   rz   r5   )r'   r   r†   r‡   r3   r#   )r­   r   r†   r‡   r3   r®   )rB   rC   rD   Ú__doc__rV   Ústaticmethodr]   rf   ry   r…   r¬   rÈ   rG   r;   r9   rI   rI   B   så   € € € € € ðð ðCð Cð Cð Cð ðð ð ñ „\ðð
 ð ð  ð  ñ „\ð ðð ð ð ð$#ð #ð #ð #ðP CGðdð dð dð dð dðR CGð19ð 19ð 19ð 19ð 19ð 19ð 19r;   rI   )*rÉ   Ú
__future__r   ÚjsonÚloggingÚosÚdataclassesr   r   Úpathlibr   Útypingr   r   r	   r
   r   r   Únumpyrn   Úaudio.neuralfp_extractorr   Ú
core.pathsr   r   r   Úingestion.audio_loaderr   Úingestion.video_loaderr   r   Úvisual.vjepa_extractorr   rU   r   r   Ú	getLoggerrB   r~   r³   r#   rI   rG   r;   r9   ú<module>rÙ      s·  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =à Ð Ð Ð à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø KÐ KÐ KÐ KÐ KÐ KÐ KÐ KØ 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ Eà	ˆÔ	˜8Ñ	$Ô	$€à_Ð_Ð_Ð ð ð 
ð  
ð  
ð  
ð  
ñ  
ô  
ñ „ð 
ðFn9ð n9ð n9ð n9ð n9ñ n9ô n9ð n9ð n9ð n9r;   