186 lines
6.7 KiB
Python
186 lines
6.7 KiB
Python
<<<<<<< HEAD
|
|
import os
|
|
import shutil
|
|
from datetime import datetime
|
|
import google.generativeai as genai
|
|
import PIL.Image
|
|
|
|
# --------------------- CONFIGURATION ---------------------
|
|
# Utilisation de r"" pour les chemins Windows
|
|
photo_folder = r"C:\Users\Antoine\PycharmProjects\PHOTO\photo a organiser"
|
|
dossier_folder = r"C:\Users\Antoine\PycharmProjects\PHOTO\dossier"
|
|
|
|
# REMPLACER PAR VOTRE NOUVELLE CLÉ
|
|
genai.configure(api_key="AIzaSyDq2LmX_fwKGAwxGAtmBfX940vT2wDQzBU")
|
|
for m in genai.list_models():
|
|
if 'generateContent' in m.supported_generation_methods:
|
|
print(m.name)
|
|
model = genai.GenerativeModel('models/gemini-2.5-flash') # 1.5 est plus stable pour l'OCR
|
|
|
|
if not os.path.exists(dossier_folder):
|
|
os.makedirs(dossier_folder)
|
|
|
|
# --------------------- FONCTIONS ---------------------
|
|
def get_time_from_filename(filename):
|
|
try:
|
|
# Supposant un format : QuelqueChose_123045.jpg (HHMMSS)
|
|
base = os.path.splitext(filename)[0]
|
|
parts = base.split("_")
|
|
time_part = parts[1]
|
|
return datetime.strptime(time_part, "%H%M%S")
|
|
except Exception as e:
|
|
return None
|
|
|
|
def read_barcode(photo_path):
|
|
try:
|
|
# Utiliser 'with' permet de fermer l'image AUTOMATIQUEMENT après la lecture
|
|
with PIL.Image.open(photo_path) as img:
|
|
response = model.generate_content([
|
|
"Retourne uniquement le texte ou les chiffres du code-barre. "
|
|
"Si aucun code-barre n'est visible, répond 'inconnu'.",
|
|
img
|
|
])
|
|
return response.text.strip().replace(" ", "")
|
|
except Exception as e:
|
|
print(f"Erreur lors de la lecture : {e}")
|
|
return "erreur_lecture"
|
|
# --------------------- TRAITEMENT ---------------------
|
|
photos_raw = [f for f in os.listdir(photo_folder) if f.lower().endswith(".jpg")]
|
|
photo_times = []
|
|
|
|
for photo in photos_raw:
|
|
time_obj = get_time_from_filename(photo)
|
|
if time_obj:
|
|
photo_times.append((photo, time_obj))
|
|
|
|
photo_times.sort(key=lambda x: x[1])
|
|
|
|
groups = []
|
|
for photo, time_obj in photo_times:
|
|
full_path = os.path.join(photo_folder, photo)
|
|
|
|
if not groups:
|
|
barcode = read_barcode(full_path)
|
|
groups.append({"photos": [photo], "reference_time": time_obj, "barcode": barcode})
|
|
else:
|
|
current_group = groups[-1]
|
|
# Comparaison avec la dernière photo ajoutée pour plus de souplesse
|
|
difference = abs((time_obj - current_group["reference_time"]).total_seconds())
|
|
|
|
if difference <= 60:
|
|
current_group["photos"].append(photo)
|
|
else:
|
|
barcode = read_barcode(full_path)
|
|
groups.append({"photos": [photo], "reference_time": time_obj, "barcode": barcode})
|
|
|
|
# --------------------- DÉPLACEMENT ---------------------
|
|
for i, group in enumerate(groups, start=1):
|
|
barcode = group["barcode"]
|
|
# Nettoyage pour nom de dossier Windows valide
|
|
barcode_clean = "".join(c for c in barcode if c.isalnum() or c in "-_").strip()
|
|
|
|
# Format demandé : 1_CodeBarre
|
|
folder_name = f"{i}_{barcode_clean}" if barcode_clean else str(i)
|
|
group_folder = os.path.join(dossier_folder, folder_name)
|
|
|
|
os.makedirs(group_folder, exist_ok=True)
|
|
|
|
for photo in group["photos"]:
|
|
src = os.path.join(photo_folder, photo)
|
|
dst = os.path.join(group_folder, photo)
|
|
shutil.move(src, dst)
|
|
|
|
=======
|
|
import os
|
|
import shutil
|
|
from datetime import datetime
|
|
import google.generativeai as genai
|
|
import PIL.Image
|
|
|
|
# --------------------- CONFIGURATION ---------------------
|
|
# Utilisation de r"" pour les chemins Windows
|
|
photo_folder = r"C:\Users\Antoine\PycharmProjects\PHOTO\photo a organiser"
|
|
dossier_folder = r"C:\Users\Antoine\PycharmProjects\PHOTO\dossier"
|
|
|
|
# REMPLACER PAR VOTRE NOUVELLE CLÉ
|
|
genai.configure(api_key="AIzaSyDq2LmX_fwKGAwxGAtmBfX940vT2wDQzBU")
|
|
for m in genai.list_models():
|
|
if 'generateContent' in m.supported_generation_methods:
|
|
print(m.name)
|
|
model = genai.GenerativeModel('models/gemini-2.5-flash') # 1.5 est plus stable pour l'OCR
|
|
|
|
if not os.path.exists(dossier_folder):
|
|
os.makedirs(dossier_folder)
|
|
|
|
# --------------------- FONCTIONS ---------------------
|
|
def get_time_from_filename(filename):
|
|
try:
|
|
# Supposant un format : QuelqueChose_123045.jpg (HHMMSS)
|
|
base = os.path.splitext(filename)[0]
|
|
parts = base.split("_")
|
|
time_part = parts[1]
|
|
return datetime.strptime(time_part, "%H%M%S")
|
|
except Exception as e:
|
|
return None
|
|
|
|
def read_barcode(photo_path):
|
|
try:
|
|
# Utiliser 'with' permet de fermer l'image AUTOMATIQUEMENT après la lecture
|
|
with PIL.Image.open(photo_path) as img:
|
|
response = model.generate_content([
|
|
"Retourne uniquement le texte ou les chiffres du code-barre. "
|
|
"Si aucun code-barre n'est visible, répond 'inconnu'.",
|
|
img
|
|
])
|
|
return response.text.strip().replace(" ", "")
|
|
except Exception as e:
|
|
print(f"Erreur lors de la lecture : {e}")
|
|
return "erreur_lecture"
|
|
# --------------------- TRAITEMENT ---------------------
|
|
photos_raw = [f for f in os.listdir(photo_folder) if f.lower().endswith(".jpg")]
|
|
photo_times = []
|
|
|
|
for photo in photos_raw:
|
|
time_obj = get_time_from_filename(photo)
|
|
if time_obj:
|
|
photo_times.append((photo, time_obj))
|
|
|
|
photo_times.sort(key=lambda x: x[1])
|
|
|
|
groups = []
|
|
for photo, time_obj in photo_times:
|
|
full_path = os.path.join(photo_folder, photo)
|
|
|
|
if not groups:
|
|
barcode = read_barcode(full_path)
|
|
groups.append({"photos": [photo], "reference_time": time_obj, "barcode": barcode})
|
|
else:
|
|
current_group = groups[-1]
|
|
# Comparaison avec la dernière photo ajoutée pour plus de souplesse
|
|
difference = abs((time_obj - current_group["reference_time"]).total_seconds())
|
|
|
|
if difference <= 60:
|
|
current_group["photos"].append(photo)
|
|
else:
|
|
barcode = read_barcode(full_path)
|
|
groups.append({"photos": [photo], "reference_time": time_obj, "barcode": barcode})
|
|
|
|
# --------------------- DÉPLACEMENT ---------------------
|
|
for i, group in enumerate(groups, start=1):
|
|
barcode = group["barcode"]
|
|
# Nettoyage pour nom de dossier Windows valide
|
|
barcode_clean = "".join(c for c in barcode if c.isalnum() or c in "-_").strip()
|
|
|
|
# Format demandé : 1_CodeBarre
|
|
folder_name = f"{i}_{barcode_clean}" if barcode_clean else str(i)
|
|
group_folder = os.path.join(dossier_folder, folder_name)
|
|
|
|
os.makedirs(group_folder, exist_ok=True)
|
|
|
|
for photo in group["photos"]:
|
|
src = os.path.join(photo_folder, photo)
|
|
dst = os.path.join(group_folder, photo)
|
|
shutil.move(src, dst)
|
|
|
|
>>>>>>> fd17b0aa2007e272777fcf6570af9c6af1b2b0a3
|
|
print("\nRegroupement et déplacement terminés !") |