§
    &#Ëj@:  ã                  óä   — 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m	Z	 ddl
mZmZmZmZmZ ddlZddlmZ dd	lmZ  ej        e¦  «        Zed
z  Zddd„Zdd„Zdd„Z G d„ d¦  «        ZdS )u?  
SQLite Database Engine for VideoDetection.
LÆ°u trá»¯ toÃ n diá»‡n thÃ´ng tin video, vector Ä‘áº·c trÆ°ng V-JEPA 2 / NeuralFP vÃ  lá»‹ch sá»­ Ä‘á»‘i soÃ¡t
vÃ o 1 file database duy nháº¥t: Data/videodetection.db
Ä�áº£m báº£o 100% Portable (sá»­ dá»¥ng thÆ° viá»‡n sqlite3 chuáº©n cÃ³ sáºµn trong Python, Zero-Install).
é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚOptionalÚTupleé   )ÚDATA_DIRé   )ÚCachedVideoFeatureszvideodetection.dbé    Ú	file_pathr   Ú	max_bytesÚintÚreturnÚstrc                óD  — t          j        ¦   «         }	 |                      ¦   «         j        }t	          | d¦  «        5 }||dz  k    r(|                     |                     ¦   «         ¦  «         nv|                     |                     |¦  «        ¦  «         |                     t          d||z
  ¦  «        ¦  «         |                     |                     |¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   | 	                    ¦   «         S # t          $ r Y dS w xY w)uk   TÃ­nh hash MD5 nhanh báº±ng cÃ¡ch Ä‘á»�c 2MB Ä‘áº§u + Ä‘uÃ´i file (trÃ¡nh Ä‘á»�c cáº£ file video hÃ ng GB).Úrbr
   r   NÚ )ÚhashlibÚmd5ÚstatÚst_sizeÚopenÚupdateÚreadÚseekÚmaxÚ	hexdigestÚ	Exception)r   r   ÚhasherÚsizeÚfs        ú4C:\Projects\VideoDetection\src\indexing\sqlite_db.pyÚcompute_file_hashr&      sE  € åŒ[‰]Œ]€FðØ�~Š~ÑÔÔ'ˆÝ�)˜TÑ"Ô"ð 	1 aØ�y 1‘}Ò$Ð$Ø—’˜aŸfšf™hœhÑ'Ô'Ð'Ð'à—’˜aŸfšf YÑ/Ô/Ñ0Ô0Ð0Ø—’•s˜1˜d YÑ.Ñ/Ô/Ñ0Ô0Ð0Ø—’˜aŸfšf YÑ/Ô/Ñ0Ô0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð ×ÒÑ!Ô!Ð!øÝð ð ð Øˆrˆrðøøøs5   •)D ¾B(C2Ã&D Ã2C6Ã6D Ã9C6Ã:D Ä
DÄDÚarrú
np.ndarrayÚbytesc                óœ   — | �| j         dk    rdS t          j        ¦   «         }t          j        || d¬¦  «         |                     ¦   «         S )u5   NÃ©n máº£ng numpy thÃ nh bytes lÆ°u vÃ o SQLite BLOB.Nr   ó    F©Úallow_pickle)r#   ÚioÚBytesIOÚnpÚsaveÚgetvalue)r'   Úbuffers     r%   Úarray_to_blobr4   ,   sH   € à
€{�c”h !’m�mØˆsÝŒZ‰\Œ\€FÝ„GˆF�C eÐ,Ñ,Ô,Ð,Ø�?Š?ÑÔÐr+   Úblobc                óš   — | s t          j        dt           j        ¬¦  «        S t          j        | ¦  «        }t          j        |d¬¦  «        S )u:   Giáº£i nÃ©n bytes tá»« SQLite BLOB vá»� láº¡i numpy array.r   )ÚdtypeFr,   )r0   ÚemptyÚfloat32r.   r/   Úload)r5   r3   s     r%   Úblob_to_arrayr;   5   sE   € àð -ÝŒx˜¥¤Ð,Ñ,Ô,Ð,ÝŒZ˜ÑÔ€FÝŒ7�6¨Ð.Ñ.Ô.Ð.r+   c                  ór   — e Zd ZdZefd%d„Zd&d„Zd'd	„Zd(d„Zd)d„Z	d*d„Z
d+d„Zd,d-d„Zd.d„Zd/d0d"„Zd1d$„ZdS )2ÚVideoDatabaseuY   
    Quáº£n lÃ½ cÆ¡ sá»Ÿ dá»¯ liá»‡u SQLite cá»¥c bá»™ táº¡i Data/videodetection.db.
    Údb_pathr   r   ÚNonec                ó~   — || _         | j         j                             dd¬¦  «         |                      ¦   «          d S )NT)ÚparentsÚexist_ok)r>   ÚparentÚmkdirÚ_init_schema)Úselfr>   s     r%   Ú__init__zVideoDatabase.__init__B   s?   € ØˆŒØŒÔ×!Ò!¨$¸Ð!Ñ>Ô>Ð>Ø×ÒÑÔÐÐÐr+   úsqlite3.Connectionc                óÌ   — t          j        t          | j        ¦  «        d¬¦  «        }t           j        |_        |                     d¦  «         |                     d¦  «         |S )Ng      .@)ÚtimeoutzPRAGMA journal_mode=WAL;zPRAGMA synchronous=NORMAL;)Úsqlite3Úconnectr   r>   ÚRowÚrow_factoryÚexecute©rF   Úconns     r%   Ú_get_connectionzVideoDatabase._get_connectionG   sU   € ÝŒ�s 4¤<Ñ0Ô0¸$Ð?Ñ?Ô?ˆÝ"œ;ˆÔà�ŠÐ/Ñ0Ô0Ð0Ø�ŠÐ1Ñ2Ô2Ð2Øˆr+   c                óŠ   — |                       ¦   «         5 }|                     d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )u8   Khá»Ÿi táº¡o cáº¥u trÃºc báº£ng náº¿u chÆ°a tá»“n táº¡i.um
  
            -- Báº£ng quáº£n lÃ½ danh má»¥c video theo tÃªn file
            CREATE TABLE IF NOT EXISTS videos (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                video_name TEXT UNIQUE NOT NULL,      -- TÃªn file video (vd: goc_01.mp4)
                video_id TEXT UNIQUE NOT NULL,        -- Stem khÃ´ng kÃ¨m Ä‘uÃ´i file
                file_path TEXT NOT NULL,
                category TEXT NOT NULL,               -- 'reference' (kho Data/) hoáº·c 'target'
                duration_sec REAL NOT NULL,
                file_size INTEGER NOT NULL,
                file_mtime REAL NOT NULL,
                file_hash TEXT,
                visual_clips_count INTEGER DEFAULT 0,
                audio_chunks_count INTEGER DEFAULT 0,
                status TEXT DEFAULT 'indexed',
                created_at TEXT NOT NULL,
                updated_at TEXT NOT NULL
            );

            -- Báº£ng lÆ°u trá»¯ vector Ä‘áº·c trÆ°ng dáº¡ng BLOB nhá»‹ phÃ¢n nÃ©n PQ64 & Hamming
            CREATE TABLE IF NOT EXISTS video_features (
                video_id TEXT PRIMARY KEY,
                visual_times BLOB,
                visual_embs BLOB,                     -- Matrix [N_vis, 1024]
                audio_times BLOB,
                audio_fps BLOB,                       -- Matrix [N_aud, 128]
                visual_codes BLOB,                    -- Matrix PQ64 [N_vis, 64] uint8
                audio_bits BLOB,                      -- Matrix Hamming [N_aud, 16] uint8
                visual_dim INTEGER DEFAULT 1024,
                audio_dim INTEGER DEFAULT 128,
                updated_at TEXT NOT NULL,
                FOREIGN KEY (video_id) REFERENCES videos(video_id) ON DELETE CASCADE
            );

            -- Báº£ng lÆ°u lá»‹ch sá»­ cÃ¡c láº§n Ä‘á»‘i soÃ¡t trÃ¹ng láº·p
            CREATE TABLE IF NOT EXISTS comparison_history (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                target_video_name TEXT NOT NULL,
                reference_video_name TEXT NOT NULL,
                target_start_sec REAL NOT NULL,
                target_end_sec REAL NOT NULL,
                ref_start_sec REAL NOT NULL,
                ref_end_sec REAL NOT NULL,
                duration_sec REAL NOT NULL,
                confidence_score REAL NOT NULL,
                match_type TEXT NOT NULL,
                scanned_at TEXT NOT NULL
            );

            CREATE INDEX IF NOT EXISTS idx_videos_category ON videos(category);
            CREATE INDEX IF NOT EXISTS idx_videos_name ON videos(video_name);
            CREATE INDEX IF NOT EXISTS idx_history_target ON comparison_history(target_video_name);
            N)rR   ÚexecutescriptrP   s     r%   rE   zVideoDatabase._init_schemaO   s’   € à×!Ò!Ñ#Ô#ð 5	 tØ×Òð 4 ñ 4ô 4ð 4ð5	ð 5	ð 5	ñ 5	ô 5	ð 5	ð 5	ð 5	ð 5	ð 5	ð 5	ð 5	øøøð 5	ð 5	ð 5	ð 5	ð 5	ð 5	s   •8¸<¿<Ú
video_pathÚboolc                ó�  — |j         }	 |                     ¦   «         }|                      ¦   «         5 }|                     d|f¦  «                             ¦   «         }|€	 ddd¦  «         dS |d         |j        k    o t          |d         |j        z
  ¦  «        dk     	 cddd¦  «         S # 1 swxY w Y   dS # t          $ r Y dS w xY w)uV   Kiá»ƒm tra video trong database Ä‘Ã£ Ä‘Æ°á»£c index vÃ  cÃ³ cÃ¹ng mtime / size khÃ´ng.z=SELECT file_size, file_mtime FROM videos WHERE video_name = ?NFÚ	file_sizeÚ
file_mtimeg      ð?)	Únamer   rR   rO   Úfetchoner   ÚabsÚst_mtimer!   )rF   rU   Ú
video_namer   rQ   Úrows         r%   Úis_video_up_to_datez!VideoDatabase.is_video_up_to_dateˆ   sG  € à”_ˆ
ð	Ø—?’?Ñ$Ô$ˆDØ×%Ò%Ñ'Ô'ð ¨4Ø—l’lØSØ�Mñô ÷ ’(‘*”*ð ð
 �;Ø ðð ð ñ ô ð ð ð ð ˜Ô$¨¬Ò4ð EÝ˜C Ô-°´Ñ=Ñ>Ô>ÀÒDððð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð øõ ð 	ð 	ð 	Ø�5�5ð	øøøs@   ‰(B7 ±-B*ÁB7 Á+2B*ÂB7 Â*B.Â.B7 Â1B.Â2B7 Â7
CÃCÚcategoryr   Úfeaturesr   c                ó
  — t           j                              ¦   «                              d¦  «        }|                     ¦   «         }t	          |¦  «        }t          |j        ¦  «        }t          |j        ¦  «        }t          |j        ¦  «        }	t          |j	        ¦  «        }
|j
        �t          |j
        ¦  «        nd}|j        �t          |j        ¦  «        nd}|                      ¦   «         5 }|                     d|j        |j        t!          |¦  «        ||j        |j        |j        ||j        |j        ||f¦  «         |                     d|j        |||	|
||dd|f
¦  «         ddd¦  «         dS # 1 swxY w Y   dS )uo   
        LÆ°u hoáº·c cáº­p nháº­t video cÃ¹ng cÃ¡c vector Ä‘áº·c trÆ°ng vÃ o database theo tÃªn video.
        ú%Y-%m-%d %H:%M:%SNr+   aº  
                INSERT INTO videos (
                    video_name, video_id, file_path, category, duration_sec,
                    file_size, file_mtime, file_hash, visual_clips_count,
                    audio_chunks_count, status, created_at, updated_at
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'indexed', ?, ?)
                ON CONFLICT(video_name) DO UPDATE SET
                    file_path = excluded.file_path,
                    category = excluded.category,
                    duration_sec = excluded.duration_sec,
                    file_size = excluded.file_size,
                    file_mtime = excluded.file_mtime,
                    file_hash = excluded.file_hash,
                    visual_clips_count = excluded.visual_clips_count,
                    audio_chunks_count = excluded.audio_chunks_count,
                    status = 'indexed',
                    updated_at = excluded.updated_at
                aÎ  
                INSERT INTO video_features (
                    video_id, visual_times, visual_embs, audio_times, audio_fps,
                    visual_codes, audio_bits, visual_dim, audio_dim, updated_at
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                ON CONFLICT(video_id) DO UPDATE SET
                    visual_times = excluded.visual_times,
                    visual_embs = excluded.visual_embs,
                    audio_times = excluded.audio_times,
                    audio_fps = excluded.audio_fps,
                    visual_codes = excluded.visual_codes,
                    audio_bits = excluded.audio_bits,
                    updated_at = excluded.updated_at
                i   é€   )ÚdatetimeÚnowÚstrftimer   r&   r4   Úvisual_timesÚvisual_embsÚaudio_timesÚ	audio_fpsÚvisual_codesÚ
audio_bitsrR   rO   rZ   Úvideo_idr   Úduration_secr   r]   Úvisual_countÚaudio_count)rF   rU   ra   rb   Únow_strr   Ú	file_hashÚvis_times_blobÚvis_embs_blobÚaud_times_blobÚaud_fps_blobÚvis_codes_blobÚaud_bits_blobrQ   s                 r%   Úupsert_videozVideoDatabase.upsert_video�   sê  € õ Ô#×'Ò'Ñ)Ô)×2Ò2Ð3FÑGÔGˆØ�ŠÑ Ô ˆÝ% jÑ1Ô1ˆ	å& xÔ'<Ñ=Ô=ˆÝ% hÔ&:Ñ;Ô;ˆÝ& xÔ';Ñ<Ô<ˆÝ$ XÔ%7Ñ8Ô8ˆØAIÔAVÐAb� xÔ'<Ñ=Ô=Ð=ÐhkˆØ>FÔ>QÐ>]� hÔ&9Ñ:Ô:Ð:Ðcfˆà×!Ò!Ñ#Ô#ð A	 tà�LŠLðð& ”OØÔ%Ý˜
‘O”OØØÔ)Ø”LØ”MØØÔ)ØÔ(ØØðñ'!ô !ð !ðH �LŠLðð Ô%Ø"Ø!Ø"Ø Ø"Ø!ØØØðñô ð ðMA	ð A	ð A	ñ A	ô A	ð A	ð A	ð A	ð A	ð A	ð A	ð A	øøøð A	ð A	ð A	ð A	ð A	ð A	s   Ã3A8E8Å8E<Å?E<ro   úOptional[CachedVideoFeatures]c                ó,  — |                       ¦   «         5 }|                     d|f¦  «                             ¦   «         }|s	 ddd¦  «         dS |                     d|f¦  «                             ¦   «         }|s	 ddd¦  «         dS d|                     ¦   «         v r|d         rt	          |d         ¦  «        nd}d|                     ¦   «         v r|d         rt	          |d         ¦  «        nd}t          |d         |d         |d         |d	         |d
         |d         t	          |d         ¦  «        t	          |d         ¦  «        t	          |d         ¦  «        t	          |d         ¦  «        ||¬¦  «        cddd¦  «         S # 1 swxY w Y   dS )u?   Ä�á»�c vector Ä‘áº·c trÆ°ng trá»±c tiáº¿p tá»« Database SQLite.z'SELECT * FROM videos WHERE video_id = ?Nz/SELECT * FROM video_features WHERE video_id = ?rm   rn   ro   r^   r   rp   rX   rY   ri   rj   rk   rl   )ro   ÚfilenamerU   rp   Úfile_size_bytesrY   ri   rj   rk   rl   rm   rn   )rR   rO   r[   Úkeysr;   r   )rF   ro   rQ   Úrow_metaÚrow_featÚ	vis_codesÚaud_bitss          r%   Úget_features_by_idz VideoDatabase.get_features_by_idô   s?  € à×!Ò!Ñ#Ô#ð 	 tØ—|’|Ø9¸H¸;ñô çŠh‰jŒjð ð ð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð —|’|ØAÀHÀ;ñô çŠh‰jŒjð ð ð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð DRÐU]×UbÒUbÑUdÔUdÐCdÐCdÐiqð  sAô  jBÐCd� h¨~Ô&>Ñ?Ô?Ð?ð  HLˆIØ@LÐPX×P]ÒP]ÑP_ÔP_Ð@_Ð@_ÐdlÐmyÔdzÐ@_•} X¨lÔ%;Ñ<Ô<Ð<ð  AEˆHå&Ø! *Ô-Ø! ,Ô/Ø# KÔ0Ø% nÔ5Ø (¨Ô 5Ø# LÔ1Ý*¨8°NÔ+CÑDÔDÝ)¨(°=Ô*AÑBÔBÝ)¨(°=Ô*AÑBÔBÝ'¨°Ô(=Ñ>Ô>Ø&Ø#ðñ ô ð!	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   •-F	Á,F	ÂC4F	Æ	FÆFr^   c                ó  — |                       ¦   «         5 }|                     d|f¦  «                             ¦   «         }|s	 ddd¦  «         dS |                      |d         ¦  «        cddd¦  «         S # 1 swxY w Y   dS )u.   Truy váº¥n Ä‘áº·c trÆ°ng theo tÃªn file video.z0SELECT video_id FROM videos WHERE video_name = ?Nro   )rR   rO   r[   r…   )rF   r^   rQ   r_   s       r%   Úget_features_by_namez"VideoDatabase.get_features_by_name  sç   € à×!Ò!Ñ#Ô#ð 	< tØ—,’,ØBÀZÀMñô çŠh‰jŒjð ð ð Øð	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð ×*Ò*¨3¨z¬?Ñ;Ô;ð	<ð 	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<øøøð 	<ð 	<ð 	<ð 	<ð 	<ð 	<s   •-A6ÁA6Á6A:Á=A:NúOptional[str]úList[Dict[str, Any]]c                óì   — d}d}|r|dz  }|f}|dz  }|                       ¦   «         5 }|                     ||¦  «                             ¦   «         }d„ |D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )u<   Láº¥y danh sÃ¡ch thÃ´ng tin táº¥t cáº£ video trong database.zSELECT * FROM videos© z WHERE category = ?z ORDER BY updated_at DESCc                ó,   — g | ]}t          |¦  «        ‘ŒS r‹   ©Údict©Ú.0Úrs     r%   ú
<listcomp>z0VideoDatabase.get_all_videos.<locals>.<listcomp>*  ó   € Ð*Ð*Ð* •D˜‘G”GÐ*Ð*Ð*r+   N©rR   rO   Úfetchall)rF   ra   ÚqueryÚparamsrQ   Úrowss         r%   Úget_all_videoszVideoDatabase.get_all_videos  sÔ   € à&ˆØ"$ˆØð 	!ØÐ*Ñ*ˆEØ�[ˆFØÐ,Ñ,ˆà×!Ò!Ñ#Ô#ð 	+ tØ—<’<  vÑ.Ô.×7Ò7Ñ9Ô9ˆDØ*Ð* TÐ*Ñ*Ô*ð	+ð 	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	+ð 	+s   ¨4A)Á)A-Á0A-Útarget_nameÚmatchesú	List[Any]c                ó  ‡‡— |sdS t           j                              ¦   «                              d¦  «        Š|                      ¦   «         5 }ˆˆfd„|D ¦   «         }|                     d|¦  «         ddd¦  «         dS # 1 swxY w Y   dS )uP   Ghi nháº­n lá»‹ch sá»­ cÃ¡c Ä‘oáº¡n trÃ¹ng láº·p vÃ o báº£ng comparison_history.Nrd   c                ó  •— g | ]„}‰|j         t          |j        ¦  «        t          |j        ¦  «        t          |j        ¦  «        t          |j        ¦  «        t          |j        ¦  «        t          |j        ¦  «        |j        ‰f
‘Œ…S r‹   )	Úreference_video_idÚfloatÚtarget_start_secÚtarget_end_secÚref_start_secÚref_end_secrp   Úconfidence_scoreÚ
match_type)r�   Úmrs   rš   s     €€r%   r’   z3VideoDatabase.log_match_history.<locals>.<listcomp>2  s�   ø€ ð ð ð ð ð  ØÔ(Ý˜!Ô,Ñ-Ô-Ý˜!Ô*Ñ+Ô+Ý˜!œ/Ñ*Ô*Ý˜!œ-Ñ(Ô(Ý˜!œ.Ñ)Ô)Ý˜!Ô,Ñ-Ô-Ø”LØððð ð r+   aT  
                INSERT INTO comparison_history (
                    target_video_name, reference_video_name, target_start_sec,
                    target_end_sec, ref_start_sec, ref_end_sec, duration_sec,
                    confidence_score, match_type, scanned_at
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                )rf   rg   rh   rR   Úexecutemany)rF   rš   r›   rQ   Úrecordsrs   s    `   @r%   Úlog_match_historyzVideoDatabase.log_match_history,  sú   øø€ àð 	ØˆFÝÔ#×'Ò'Ñ)Ô)×2Ò2Ð3FÑGÔGˆØ×!Ò!Ñ#Ô#ð 	 tðð ð ð ð ð !ðñ ô ˆGð ×Òðð ñ	ô 	ð 	ð!	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   Á&A?Á?BÂBé2   Úlimitr   c                óÈ   — |                       ¦   «         5 }|                     d|f¦  «                             ¦   «         }d„ |D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )u,   Láº¥y lá»‹ch sá»­ Ä‘á»‘i soÃ¡t gáº§n nháº¥t.z9SELECT * FROM comparison_history ORDER BY id DESC LIMIT ?c                ó,   — g | ]}t          |¦  «        ‘ŒS r‹   r�   r�   s     r%   r’   z8VideoDatabase.get_comparison_history.<locals>.<listcomp>S  r“   r+   Nr”   )rF   r¬   rQ   r˜   s       r%   Úget_comparison_historyz$VideoDatabase.get_comparison_historyL  s±   € à×!Ò!Ñ#Ô#ð 	+ tØ—<’<ØKØ�ñô ÷ Šh‰jŒjð ð +Ð* TÐ*Ñ*Ô*ð	+ð 	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	+ð 	+s   •5AÁAÁAúDict[str, Any]c                ó4  — |                       ¦   «         5 }|                     d¦  «                             ¦   «         d         }|                     d¦  «                             ¦   «         d         }|                     d¦  «                             ¦   «         d         }| j                             ¦   «         r| j                             ¦   «         j        nd}t          | j        ¦  «        t          |dz  d¦  «        |||dœcddd¦  «         S # 1 swxY w Y   dS )	uD   Thá»‘ng kÃª tá»•ng quan cÆ¡ sá»Ÿ dá»¯ liá»‡u Data/videodetection.db.z8SELECT COUNT(*) FROM videos WHERE category = 'reference'r   z5SELECT COUNT(*) FROM videos WHERE category = 'target'z'SELECT COUNT(*) FROM comparison_historyi   r
   )Údb_fileÚ
db_size_mbÚtotal_reference_videosÚtotal_target_videosÚtotal_match_historyN)	rR   rO   r[   r>   Úexistsr   r   r   Úround)rF   rQ   Ú	ref_countÚtarget_countÚhistory_countÚdb_size_bytess         r%   Úget_database_statsz VideoDatabase.get_database_statsU  sD  € à×!Ò!Ñ#Ô#ð 	 tØŸšÐ%_Ñ`Ô`×iÒiÑkÔkÐlmÔnˆIØŸ<š<Ð(_Ñ`Ô`×iÒiÑkÔkÐlmÔnˆLØ ŸLšLÐ)RÑSÔS×\Ò\Ñ^Ô^Ð_`ÔaˆMØ;?¼<×;NÒ;NÑ;PÔ;PÐW˜DœL×-Ò-Ñ/Ô/Ô7Ð7ÐVWˆMõ ˜tœ|Ñ,Ô,Ý# M°[Ñ$AÀ1ÑEÔEØ*3Ø'3Ø'4ðð ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   •C+DÄDÄD)r>   r   r   r?   )r   rH   )r   r?   )rU   r   r   rV   )rU   r   ra   r   rb   r   r   r?   )ro   r   r   r|   )r^   r   r   r|   )N)ra   rˆ   r   r‰   )rš   r   r›   rœ   r   r?   )r«   )r¬   r   r   r‰   )r   r°   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚDEFAULT_DB_PATHrG   rR   rE   r`   r{   r…   r‡   r™   rª   r¯   r½   r‹   r+   r%   r=   r=   =   s  € € € € € ðð ð (7ð ð ð ð ð ð
ð ð ð ð7ð 7ð 7ð 7ðrð ð ð ð*Uð Uð Uð Uðnð ð ð ðB<ð <ð <ð <ð+ð +ð +ð +ð +ðð ð ð ð@+ð +ð +ð +ð +ðð ð ð ð ð r+   r=   )r   )r   r   r   r   r   r   )r'   r(   r   r)   )r5   r)   r   r(   )rÁ   Ú
__future__r   rf   r   r.   ÚloggingrK   Úpathlibr   Útypingr   r   r   r   r	   Únumpyr0   Ú
core.pathsr   Úfeature_storer   Ú	getLoggerr¾   ÚloggerrÂ   r&   r4   r;   r=   r‹   r+   r%   ú<module>rÌ      sV  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à Ð Ð Ð à !Ð !Ð !Ð !Ð !Ð !Ø .Ð .Ð .Ð .Ð .Ð .à	ˆÔ	˜8Ñ	$Ô	$€àÐ0Ñ0€ðð ð ð ð ð"ð ð ð ð/ð /ð /ð /ðfð fð fð fð fñ fô fð fð fð fr+   