addon
This commit is contained in:
131
backend/app/utils/image_config_loader.py
Executable file
131
backend/app/utils/image_config_loader.py
Executable 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()
|
||||
Reference in New Issue
Block a user