102 lines
3.3 KiB
Python
Executable File
102 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Backfill face recognition scan results for existing files
|
|
|
|
This script looks at existing downloads and infers face recognition results:
|
|
- status='completed' and file in final destination = matched
|
|
- status='review' and file in review queue = no match
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from modules.unified_database import UnifiedDatabase
|
|
from pathlib import Path
|
|
|
|
def backfill_face_recognition():
|
|
"""Backfill face recognition results from existing downloads"""
|
|
|
|
db = UnifiedDatabase()
|
|
|
|
print("🔄 Backfilling face recognition scan results...")
|
|
print("=" * 70)
|
|
|
|
with db.get_connection() as conn:
|
|
cursor = conn.cursor()
|
|
|
|
# Get all downloads with file paths
|
|
cursor.execute('''
|
|
SELECT id, filename, file_path, status
|
|
FROM downloads
|
|
WHERE file_path IS NOT NULL AND file_path != ''
|
|
''')
|
|
|
|
downloads = cursor.fetchall()
|
|
|
|
matched_count = 0
|
|
no_match_count = 0
|
|
skipped_count = 0
|
|
|
|
for download in downloads:
|
|
download_id = download['id']
|
|
filename = download['filename']
|
|
file_path = download['file_path']
|
|
status = download['status']
|
|
|
|
# Check if already scanned
|
|
cursor.execute('''
|
|
SELECT id FROM face_recognition_scans
|
|
WHERE file_path = ?
|
|
''', (file_path,))
|
|
|
|
if cursor.fetchone():
|
|
skipped_count += 1
|
|
continue
|
|
|
|
# Determine if file is image/video
|
|
path = Path(file_path)
|
|
ext = path.suffix.lower()
|
|
image_exts = {'.jpg', '.jpeg', '.png', '.gif', '.heic', '.heif'}
|
|
video_exts = {'.mp4', '.mov', '.webm', '.avi', '.mkv', '.flv', '.m4v'}
|
|
|
|
if ext not in (image_exts | video_exts):
|
|
continue # Skip non-media files
|
|
|
|
# Infer face recognition result from status
|
|
if status == 'review':
|
|
# File in review = no match
|
|
has_match = False
|
|
matched_person = None
|
|
confidence = 0.0 # No match = 0% confidence
|
|
no_match_count += 1
|
|
elif status == 'completed' and '/review' not in file_path:
|
|
# File in final destination = matched (assume Eva Longoria for now)
|
|
has_match = True
|
|
matched_person = 'Eva Longoria'
|
|
confidence = 1.0 # Backfill assumes 100% for approved files
|
|
matched_count += 1
|
|
else:
|
|
continue # Skip uncertain cases
|
|
|
|
# Insert retroactive scan result
|
|
cursor.execute('''
|
|
INSERT INTO face_recognition_scans
|
|
(download_id, file_path, has_match, matched_person, confidence, face_count, scan_type)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
''', (download_id, file_path, has_match, matched_person, confidence, 0, 'backfill'))
|
|
|
|
conn.commit()
|
|
|
|
print()
|
|
print("✅ Backfill complete!")
|
|
print(f" Matched: {matched_count}")
|
|
print(f" No match: {no_match_count}")
|
|
print(f" Skipped (already scanned): {skipped_count}")
|
|
print("=" * 70)
|
|
|
|
db.close()
|
|
|
|
if __name__ == "__main__":
|
|
backfill_face_recognition()
|