Files
classement-image-cyberharce…/tweet_classifier/cli.py
T
2026-06-28 20:21:40 +02:00

135 lines
3.7 KiB
Python

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()