135 lines
3.7 KiB
Python
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()
|