This commit is contained in:
Gilles Soulier
2026-01-05 16:08:01 +01:00
parent dcba044cd6
commit c67befc549
2215 changed files with 26743 additions and 329 deletions

View File

@@ -0,0 +1,131 @@
"""
Image compression configuration loader
Loads compression levels from YAML configuration file
"""
import yaml
from pathlib import Path
from typing import Dict, Any, Optional
class ImageCompressionConfig:
"""Manages image compression configuration from YAML file"""
def __init__(self, config_path: Optional[str] = None):
"""
Initialize configuration loader
Args:
config_path: Path to YAML config file (optional)
"""
if config_path is None:
# Default path: config/image_compression.yaml (from project root)
# Path from backend/app/utils/ -> up 3 levels to project root
config_path = Path(__file__).parent.parent.parent.parent / "config" / "image_compression.yaml"
self.config_path = Path(config_path)
self.config = self._load_config()
def _load_config(self) -> Dict[str, Any]:
"""Load configuration from YAML file"""
if not self.config_path.exists():
print(f"Warning: Image compression config not found at {self.config_path}")
print("Using default configuration")
return self._get_default_config()
try:
with open(self.config_path, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)
return config
except Exception as e:
print(f"Error loading image compression config: {e}")
print("Using default configuration")
return self._get_default_config()
def _get_default_config(self) -> Dict[str, Any]:
"""Get default configuration if YAML file not found"""
return {
"default_level": "medium",
"levels": {
"medium": {
"enabled": True,
"quality": 85,
"max_width": 1920,
"max_height": 1080,
"thumbnail_size": 48,
"thumbnail_quality": 75,
"thumbnail_format": "webp",
"description": "Qualité moyenne - Usage général"
}
},
"supported_formats": ["jpg", "jpeg", "png", "webp", "gif", "bmp"],
"max_upload_size": 52428800,
"auto_convert_to_webp": True,
"keep_original": False,
"compressed_prefix": "compressed_",
"thumbnail_prefix": "thumb_"
}
def get_level(self, level_name: Optional[str] = None) -> Dict[str, Any]:
"""
Get compression settings for a specific level
Args:
level_name: Name of compression level (high, medium, low, minimal)
If None, uses default level
Returns:
Dictionary with compression settings
"""
if level_name is None:
level_name = self.config.get("default_level", "medium")
levels = self.config.get("levels", {})
if level_name not in levels:
print(f"Warning: Level '{level_name}' not found, using default")
level_name = self.config.get("default_level", "medium")
return levels.get(level_name, levels.get("medium", {}))
def get_all_levels(self) -> Dict[str, Dict[str, Any]]:
"""Get all available compression levels"""
return self.config.get("levels", {})
def get_default_level_name(self) -> str:
"""Get name of default compression level"""
return self.config.get("default_level", "medium")
def is_format_supported(self, format: str) -> bool:
"""Check if image format is supported for input"""
supported = self.config.get("supported_input_formats", ["jpg", "jpeg", "png", "webp"])
return format.lower() in supported
def get_output_format(self) -> str:
"""Get output format for resized images"""
return self.config.get("output_format", "png")
def get_folders(self) -> Dict[str, str]:
"""Get folder structure configuration"""
return self.config.get("folders", {
"original": "original",
"thumbnail": "thumbnail"
})
def get_max_upload_size(self) -> int:
"""Get maximum upload size in bytes"""
return self.config.get("max_upload_size", 52428800)
def should_keep_original(self) -> bool:
"""Check if original file should be kept"""
return self.config.get("keep_original", True)
def get_compressed_prefix(self) -> str:
"""Get prefix for compressed files"""
return self.config.get("compressed_prefix", "")
def get_thumbnail_prefix(self) -> str:
"""Get prefix for thumbnail files"""
return self.config.get("thumbnail_prefix", "thumb_")
# Global instance
image_compression_config = ImageCompressionConfig()