diff --git a/app/stub.py b/app/stub.py index eea0713..4c43286 100644 --- a/app/stub.py +++ b/app/stub.py @@ -6,6 +6,7 @@ from PIL import Image import io import os import uuid +import hashlib client = pymongo.MongoClient(MONGODB_URL, username=MONGODB_USERNAME, password=MONGODB_PASSWORD) db = client[MONGODB_DATABASE] @@ -22,11 +23,29 @@ def create_test_image(color='red', size=(100, 100)): img_byte_arr.seek(0) return img_byte_arr -def save_image(image_data, filename): - filepath = os.path.join(IMAGES_DIR, filename) - with open(filepath, 'wb') as f: - f.write(image_data.getvalue()) - return filepath +def process_image(file_path: str) -> tuple[str, str]: + """Traite et optimise l'image""" + with Image.open(file_path) as img: + # Convertir en RGB si nécessaire + if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info): + bg = Image.new('RGB', img.size, (255, 255, 255)) + bg.paste(img, mask=img.split()[-1]) + img = bg + elif img.mode != 'RGB': + img = img.convert('RGB') + + # Redimensionner si nécessaire pour le Full HD (1920x1080) + if img.size[0] > 1920 or img.size[1] > 1080: + img.thumbnail((1920, 1080), Image.Resampling.LANCZOS) + + # Sauvegarder avec compression + img.save(file_path, 'JPEG', quality=85, optimize=True) + + # Calculer le hash du fichier optimisé + with open(file_path, 'rb') as f: + file_hash = hashlib.sha256(f.read()).hexdigest() + + return file_hash, 'jpg' def populate_data(): users_collection = db["users"] @@ -83,47 +102,75 @@ def populate_data(): image_x = create_test_image(color='green') image_y = create_test_image(color='yellow') - # Sauvegarder les images dans le système de fichiers - image_a_path = save_image(image_a, f"{uuid.uuid4()}.jpg") - image_b_path = save_image(image_b, f"{uuid.uuid4()}.jpg") - image_x_path = save_image(image_x, f"{uuid.uuid4()}.jpg") - image_y_path = save_image(image_y, f"{uuid.uuid4()}.jpg") + # Sauvegarder temporairement les images + temp_paths = [] + for img, name in [(image_a, 'a'), (image_b, 'b'), (image_x, 'x'), (image_y, 'y')]: + temp_path = os.path.join(IMAGES_DIR, f"temp_{name}.jpg") + with open(temp_path, 'wb') as f: + f.write(img.getvalue()) + temp_paths.append(temp_path) + + # Traiter les images et obtenir leurs hashes + image_hashes = [] + for temp_path in temp_paths: + file_hash, extension = process_image(temp_path) + final_path = os.path.join(IMAGES_DIR, f"{file_hash}.{extension}") + + # Si l'image n'existe pas déjà physiquement, la déplacer + if not os.path.exists(final_path): + os.rename(temp_path, final_path) + else: + os.remove(temp_path) + + image_hashes.append(file_hash) # Insérer les métadonnées des images dans la base de données avec leur pin_id image_a_id = images_collection.insert_one({ - "path": image_a_path, - "content_type": "image/jpeg", - "exif_date": datetime.now(), - "caption": "Tour Eiffel", - "user_id": str(user1_id), - "pin_id": str(pin_a.inserted_id) + "pin_id": pin_a.inserted_id, + "image_hash": image_hashes[0], + "metadata": { + "created_at": datetime.now().isoformat(), + "original_filename": "test_a.jpg", + "mime_type": "image/jpeg", + "size": len(image_a.getvalue()) + }, + "caption": "Tour Eiffel" }).inserted_id image_b_id = images_collection.insert_one({ - "path": image_b_path, - "content_type": "image/jpeg", - "exif_date": datetime.now(), - "caption": "Mont St Michel", - "user_id": str(user1_id), - "pin_id": str(pin_b.inserted_id) + "pin_id": pin_b.inserted_id, + "image_hash": image_hashes[1], + "metadata": { + "created_at": datetime.now().isoformat(), + "original_filename": "test_b.jpg", + "mime_type": "image/jpeg", + "size": len(image_b.getvalue()) + }, + "caption": "Mont St Michel" }).inserted_id image_x_id = images_collection.insert_one({ - "path": image_x_path, - "content_type": "image/jpeg", - "exif_date": datetime.now(), - "caption": "Eiffel Tower", - "user_id": str(user2_id), - "pin_id": str(pin_x.inserted_id) + "pin_id": pin_x.inserted_id, + "image_hash": image_hashes[2], + "metadata": { + "created_at": datetime.now().isoformat(), + "original_filename": "test_x.jpg", + "mime_type": "image/jpeg", + "size": len(image_x.getvalue()) + }, + "caption": "Eiffel Tower" }).inserted_id image_y_id = images_collection.insert_one({ - "path": image_y_path, - "content_type": "image/jpeg", - "exif_date": datetime.now(), - "caption": "Mont Saint Michel", - "user_id": str(user2_id), - "pin_id": str(pin_y.inserted_id) + "pin_id": pin_y.inserted_id, + "image_hash": image_hashes[3], + "metadata": { + "created_at": datetime.now().isoformat(), + "original_filename": "test_y.jpg", + "mime_type": "image/jpeg", + "size": len(image_y.getvalue()) + }, + "caption": "Mont Saint Michel" }).inserted_id # Mettre à jour les pins avec les IDs des images