import argparse import sys import logging from pathlib import Path from .organizer import ImageThemeOrganizer from .web_generator import WebReportGenerator def setup_logging(verbose: bool): """ Configure la journalisation. """ level = logging.DEBUG if verbose else logging.INFO logging.basicConfig( level=level, format="%(asctime)s [%(levelname)s] %(name)s : %(message)s", handlers=[ logging.StreamHandler(sys.stdout) ] ) def main(): parser = argparse.ArgumentParser( description="Classement automatique de captures d'écran de tweets par thèmes à l'aide d'EasyOCR et d'Hugging Face." ) parser.add_argument( "-i", "--input-dir", type=str, default=None, help="Chemin vers le dossier contenant les captures d'écran à classer." ) parser.add_argument( "-o", "--output-dir", type=str, default=None, help="Dossier de destination (par défaut, utilise ./ok/)." ) parser.add_argument( "--db", type=str, default=str(Path(__file__).parent.parent / "captures/ok/tweets.csv"), help="Chemin vers le fichier base de données CSV (défaut: 'captures/ok/tweets.csv')." ) parser.add_argument( "--generate-report", action="store_true", help="Génère un rapport HTML à partir de la base de données CSV." ) parser.add_argument( "-m", "--model", type=str, default="MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7", help="Modèle Hugging Face Zero-Shot à utiliser." ) parser.add_argument( "-l", "--languages", type=str, default="fr,en", help="Langues pour EasyOCR, séparées par des virgules (défaut: 'fr,en')." ) parser.add_argument( "-t", "--threshold", type=float, default=0.35, help="Seuil de confiance de classification (0.0 à 1.0, défaut: 0.35)." ) parser.add_argument( "--copy", action="store_true", help="Copie les images au lieu de les déplacer." ) parser.add_argument( "--dry-run", action="store_true", help="Exécute une simulation sans modifier ni déplacer les fichiers." ) parser.add_argument( "-v", "--verbose", action="store_true", help="Active le mode verbeux pour afficher les logs de débogage." ) args = parser.parse_args() setup_logging(args.verbose) if args.generate_report: generator = WebReportGenerator(Path(args.db)) generator.generate() return # Normal processing path if not args.input_dir: print("Erreur : --input-dir est requis pour le traitement.", file=sys.stderr) sys.exit(1) input_path = Path(args.input_dir) if not input_path.exists(): print(f"Erreur : Le dossier d'entrée '{args.input_dir}' n'existe pas.", file=sys.stderr) sys.exit(1) languages_list = [lang.strip() for lang in args.languages.split(",") if lang.strip()] output_path = Path(args.output_dir) if args.output_dir else None # Instanciation de l'organisateur organizer = ImageThemeOrganizer( input_dir=input_path, output_dir=output_path, ocr_languages=languages_list, model_name=args.model, confidence_threshold=args.threshold, copy_only=args.copy, dry_run=args.dry_run, db_path=Path(args.db) ) try: organizer.run() except Exception as e: print(f"Une erreur critique est survenue : {e}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": main()