#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Module combinant l'extracteur d'images standard avec l'extracteur d'images HTML. Permet de récupérer toutes les images liées à un ticket, qu'elles soient directement attachées ou référencées dans le HTML des messages. """ import os import logging from typing import Dict, List, Any, Set from .html_image_extractor import extract_images_from_ticket def enhance_ticket_data_with_images(ticket_data: Dict[str, Any]) -> Dict[str, Any]: """ Récupère toutes les images associées à un ticket, en combinant l'extraction standard et l'extraction des images intégrées dans le HTML. Args: ticket_data: Données du ticket (avec la clé 'ticket_dir' contenant le chemin du répertoire) Returns: Données du ticket enrichies avec les chemins des images """ result = ticket_data.copy() # Vérifier que le répertoire du ticket est spécifié ticket_dir = ticket_data.get("ticket_dir") if not ticket_dir or not os.path.exists(ticket_dir): logging.error("Répertoire du ticket non spécifié ou introuvable") result["images"] = [] result["standard_images"] = [] result["embedded_images"] = [] result["images_count"] = 0 result["images_stats"] = {"total": 0, "standard": 0, "embedded": 0} return result # 1. Récupérer les images standard depuis les pièces jointes standard_images = get_standard_images(ticket_data) # 2. Récupérer les images intégrées dans le HTML try: embedded_images = extract_images_from_ticket(ticket_dir) except Exception as e: logging.error(f"Erreur lors de l'extraction des images HTML: {e}") embedded_images = [] # 3. Combiner les deux ensembles d'images et éliminer les doublons all_images = deduplicate_images(standard_images, embedded_images) # 4. Enrichir les données du ticket result["images"] = all_images result["standard_images"] = standard_images result["embedded_images"] = embedded_images result["images_count"] = len(all_images) result["images_stats"] = { "total": len(all_images), "standard": len(standard_images), "embedded": len(embedded_images) } return result def get_standard_images(ticket_data: Dict[str, Any]) -> List[str]: """ Récupère les images standard depuis les pièces jointes du ticket. Args: ticket_data: Données du ticket Returns: Liste des chemins des images standard """ image_paths = [] attachments = ticket_data.get("attachments", []) if not attachments: return [] for attachment in attachments: # Vérifier si la pièce jointe est une image mimetype = attachment.get("mimetype", "").lower() name = attachment.get("name", "").lower() # Vérifier si c'est une image par mimetype ou extension is_image = ( mimetype.startswith("image/") or any(name.endswith(ext) for ext in ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg']) ) if is_image: # Utiliser le chemin local s'il existe path = attachment.get("local_path") if path and os.path.exists(path): image_paths.append(path) return image_paths def deduplicate_images(standard_images: List[str], embedded_images: List[str]) -> List[str]: """ Combine deux listes d'images en éliminant les doublons. Args: standard_images: Liste des chemins d'images standard embedded_images: Liste des chemins d'images intégrées Returns: Liste combinée des chemins d'images sans doublons """ # Utiliser un ensemble pour éliminer les doublons unique_images = set(standard_images) # Ajouter les images intégrées qui ne sont pas déjà dans les images standard for img in embedded_images: unique_images.add(img) # Convertir en liste et vérifier que les chemins existent result = [img for img in unique_images if os.path.exists(img)] return result if __name__ == "__main__": # Test simple import sys if len(sys.argv) > 1: ticket_dir = sys.argv[1] else: ticket_dir = "./output/ticket_T0241/T0241_20250409_141018" if not os.path.exists(ticket_dir): print(f"Répertoire introuvable: {ticket_dir}") sys.exit(1) # Charger les pièces jointes attachments_path = os.path.join(ticket_dir, "attachments_info.json") attachments = [] if os.path.exists(attachments_path): import json with open(attachments_path, 'r', encoding='utf-8') as f: attachments = json.load(f) # Créer les données du ticket ticket_data = { "ticket_dir": ticket_dir, "attachments": attachments } # Enrichir avec les images result = enhance_ticket_data_with_images(ticket_data) # Afficher les résultats print(f"Images trouvées: {result['images_count']}") print(f" Images standard: {len(result['standard_images'])}") print(f" Images intégrées: {len(result['embedded_images'])}") if result["images"]: print("\nListe des images:") for i, img in enumerate(result["images"]): print(f" {i+1}. {img}")