""" Normalization-internal DTOs. These are intermediate objects used by the merger before being promoted to the cross-layer models in models/reports.py. """ from __future__ import annotations from dataclasses import dataclass, field from typing import Dict, List, Optional @dataclass class NormalizedBox: """One face box from one detector.""" x: int y: int w: int h: int confidence: float detector: str landmarks: Optional[dict] = None @dataclass class NormalizedMatch: """One recognition match against the gallery.""" query_face_index: int best_match: Optional[str] distance: float distances: Dict[str, float] recognizer: str @dataclass class NormalizedScrapeImage: url: str alt: str source_page: str scraper: str width: Optional[int] = None height: Optional[int] = None @dataclass class NormalizedReverseMatch: image_url: str source_page: str title: str snippet: str thumbnail: str provider: str @dataclass class NormalizedImageAnalysis: """One image-analysis result.""" provider: str quality_score: Optional[float] = None brightness: Optional[float] = None contrast: Optional[float] = None sharpness: Optional[float] = None noise_level: Optional[float] = None width: Optional[int] = None height: Optional[int] = None channels: Optional[int] = None color_profile: Optional[str] = None dominant_colors: List[str] = field(default_factory=list) aspects: dict = field(default_factory=dict) @dataclass class NormalizedMetadata: """One metadata-extraction result.""" provider: str format: Optional[str] = None exif: dict = field(default_factory=dict) xmp: dict = field(default_factory=dict) iptc: dict = field(default_factory=dict) gps: Optional[dict] = None camera_make: Optional[str] = None camera_model: Optional[str] = None software: Optional[str] = None capture_time: Optional[str] = None @dataclass class NormalizedForensics: """One forensics result.""" provider: str integrity_score: Optional[float] = None is_duplicate: Optional[bool] = None duplicate_of: Optional[str] = None similarity_score: Optional[float] = None manipulation_indicators: List[str] = field(default_factory=list) ela_score: Optional[float] = None noise_inconsistency: Optional[float] = None details: dict = field(default_factory=dict)