# reporters.py from __future__ import annotations import csv import json from dataclasses import asdict from typing import List from datetime import datetime from core import ScanResult def export_json(results: List[ScanResult], out_path: str) -> None: payload = [] for r in results: d = asdict(r) payload.append(d) with open(out_path, "w", encoding="utf-8") as f: json.dump(payload, f, ensure_ascii=False, indent=2) def export_csv(results: List[ScanResult], out_path: str) -> None: fields = [ "path","file_type","size_bytes","sha256","context", "total_risk","level","author","last_modified_by","software", "created","modified","gps_lat","gps_lon","title","keywords" ] with open(out_path, "w", newline="", encoding="utf-8") as f: w = csv.DictWriter(f, fieldnames=fields) w.writeheader() for r in results: gps = r.metadata.get("gps") if isinstance(r.metadata.get("gps"), dict) else {} row = { "path": r.path, "file_type": r.file_type, "size_bytes": r.size_bytes, "sha256": r.sha256, "context": r.context, "total_risk": r.total_risk, "level": r.level, "author": r.metadata.get("author"), "last_modified_by": r.metadata.get("last_modified_by"), "software": r.metadata.get("software"), "created": r.metadata.get("created"), "modified": r.metadata.get("modified"), "gps_lat": gps.get("lat"), "gps_lon": gps.get("lon"), "title": r.metadata.get("title"), "keywords": r.metadata.get("keywords"), } w.writerow(row) def export_html(results: List[ScanResult], out_path: str) -> None: now = datetime.now().isoformat(sep=" ", timespec="seconds") rows = [] for r in results: gps = r.metadata.get("gps") if isinstance(r.metadata.get("gps"), dict) else {} rows.append(f"""
| Level | Score | Type | Path | Author/User | GPS Lat | GPS Lon | Software |
|---|