mirror of
https://github.com/Ladebeze66/llm_ticket3.git
synced 2025-12-13 17:27:18 +01:00
162 lines
5.3 KiB
Python
162 lines
5.3 KiB
Python
#!/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}") |