d
This commit is contained in:
parent
ec1bcc62eb
commit
5e1e7e2947
|
|
@ -1,135 +0,0 @@
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
from datetime import datetime
|
|
||||||
import google.generativeai as genai
|
|
||||||
import PIL.Image
|
|
||||||
import time
|
|
||||||
|
|
||||||
# --------------------- CONFIGURATION lol ---------------------
|
|
||||||
photo_folder = r"C:\Users\Antoine\PycharmProjects\PHOTO\photo a organiser"
|
|
||||||
dossier_folder = r"C:\Users\Antoine\PycharmProjects\PHOTO\dossier"
|
|
||||||
|
|
||||||
genai.configure(api_key="AIzaSyDq2LmX_fwKGAwxGAtmBfX940vT2wDQzBU")
|
|
||||||
model = genai.GenerativeModel('models/gemini-2.5-flash')
|
|
||||||
|
|
||||||
if not os.path.exists(dossier_folder):
|
|
||||||
os.makedirs(dossier_folder)
|
|
||||||
|
|
||||||
# --------------------- FONCTIONS ---------------------
|
|
||||||
def get_time_from_filename(filename):
|
|
||||||
try:
|
|
||||||
base = os.path.splitext(filename)[0]
|
|
||||||
parts = base.split("_")
|
|
||||||
time_part = parts[-1]
|
|
||||||
return datetime.strptime(time_part, "%H%M%S")
|
|
||||||
except Exception:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def analyze_group_photos(group_paths):
|
|
||||||
"""
|
|
||||||
Envoie les images et demande de lier les valeurs aux noms de fichiers.
|
|
||||||
"""
|
|
||||||
prompt = (
|
|
||||||
"Analyze these images one by one. For each image, if you see a 6-character Barcode "
|
|
||||||
"or a 5-character LCLC, identify it.\n"
|
|
||||||
"Return the results in this exact format for each relevant file:\n"
|
|
||||||
"FILENAME: [filename], TYPE: [BARCODE or LCLC], VALUE: [value]\n"
|
|
||||||
"If a file has nothing, don't list it."
|
|
||||||
)
|
|
||||||
|
|
||||||
content = [prompt]
|
|
||||||
|
|
||||||
# On ouvre les images (avec gestion de fermeture automatique)
|
|
||||||
images_to_close = []
|
|
||||||
for path in group_paths:
|
|
||||||
img = PIL.Image.open(path)
|
|
||||||
content.append(f"Filename: {os.path.basename(path)}")
|
|
||||||
content.append(img)
|
|
||||||
images_to_close.append(img)
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Note: Utilisez 'gemini-1.5-flash' car 2.5 n'existe pas encore
|
|
||||||
response = model.generate_content(content)
|
|
||||||
res_text = response.text
|
|
||||||
print(f"--- Gemini Analysis ---\n{res_text}\n-----------------------")
|
|
||||||
|
|
||||||
# Fermeture des images pour libérer les fichiers
|
|
||||||
for i in images_to_close: i.close()
|
|
||||||
|
|
||||||
return res_text
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error calling Gemini: {e}")
|
|
||||||
return ""
|
|
||||||
|
|
||||||
# --------------------- TRAITEMENT ---------------------
|
|
||||||
photos_raw = [f for f in os.listdir(photo_folder) if f.lower().endswith((".jpg", ".jpeg", ".png"))]
|
|
||||||
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:
|
|
||||||
if not groups:
|
|
||||||
groups.append({"photos": [photo], "reference_time": time_obj})
|
|
||||||
else:
|
|
||||||
current_group = groups[-1]
|
|
||||||
difference = abs((time_obj - current_group["reference_time"]).total_seconds())
|
|
||||||
if difference <= 60:
|
|
||||||
current_group["photos"].append(photo)
|
|
||||||
current_group["reference_time"] = time_obj
|
|
||||||
else:
|
|
||||||
groups.append({"photos": [photo], "reference_time": time_obj})
|
|
||||||
|
|
||||||
# --------------------- ANALYSE ET RENOMMAGE ---------------------
|
|
||||||
for i, group in enumerate(groups, start=1):
|
|
||||||
print(f"Analyzing Group {i}...")
|
|
||||||
group_paths = [os.path.join(photo_folder, p) for p in group["photos"]]
|
|
||||||
analysis_result = analyze_group_photos(group_paths)
|
|
||||||
|
|
||||||
group_folder_path = os.path.join(dossier_folder, str(i))
|
|
||||||
os.makedirs(group_folder_path, exist_ok=True)
|
|
||||||
|
|
||||||
# Créer un dictionnaire pour mapper Filename -> NouveauNom
|
|
||||||
# Exemple: {"IMG_123.jpg": "ABC123.jpg"}
|
|
||||||
filename_mapping = {}
|
|
||||||
|
|
||||||
# Parsing de la réponse de Gemini
|
|
||||||
for line in analysis_result.splitlines():
|
|
||||||
if "FILENAME:" in line and "VALUE:" in line:
|
|
||||||
try:
|
|
||||||
fname = line.split("FILENAME:")[1].split(",")[0].strip()
|
|
||||||
vtype = line.split("TYPE:")[1].split(",")[0].strip()
|
|
||||||
val = line.split("VALUE:")[1].strip()
|
|
||||||
|
|
||||||
# On vérifie la validité des données
|
|
||||||
if (vtype == "BARCODE" and len(val) == 6) or (vtype == "LCLC" and len(val) == 5):
|
|
||||||
filename_mapping[fname] = val
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
|
|
||||||
for photo_name in group["photos"]:
|
|
||||||
src_path = os.path.join(photo_folder, photo_name)
|
|
||||||
extension = os.path.splitext(photo_name)[1]
|
|
||||||
|
|
||||||
# On vérifie si Gemini a trouvé une valeur spécifique pour CE fichier
|
|
||||||
if photo_name in filename_mapping:
|
|
||||||
new_name = f"{filename_mapping[photo_name]}{extension}"
|
|
||||||
else:
|
|
||||||
# Sinon on garde le nom original
|
|
||||||
new_name = photo_name
|
|
||||||
|
|
||||||
dst_path = os.path.join(group_folder_path, new_name)
|
|
||||||
|
|
||||||
# Gestion des doublons (si deux photos ont le même code)
|
|
||||||
counter = 1
|
|
||||||
base_name = os.path.splitext(new_name)[0]
|
|
||||||
while os.path.exists(dst_path):
|
|
||||||
dst_path = os.path.join(group_folder_path, f"{base_name}_{counter}{extension}")
|
|
||||||
counter += 1
|
|
||||||
|
|
||||||
shutil.move(src_path, dst_path)
|
|
||||||
Loading…
Reference in New Issue
Block a user