diff --git a/py/routes/checkpoints_routes.py b/py/routes/checkpoints_routes.py index af16f732..7b591a65 100644 --- a/py/routes/checkpoints_routes.py +++ b/py/routes/checkpoints_routes.py @@ -439,7 +439,6 @@ class CheckpointsRoutes: settings=settings, # Pass settings to template request=request # Pass the request object to the template ) - logger.debug(f"Checkpoints page loaded successfully with {len(cache.raw_data)} items") except Exception as cache_error: logger.error(f"Error loading checkpoints cache data: {cache_error}") # 如果获取缓存失败,也显示初始化页面 diff --git a/py/routes/lora_routes.py b/py/routes/lora_routes.py index 448c424f..a2c392fc 100644 --- a/py/routes/lora_routes.py +++ b/py/routes/lora_routes.py @@ -87,7 +87,6 @@ class LoraRoutes: settings=settings, # Pass settings to template request=request # Pass the request object to the template ) - logger.debug(f"Loras page loaded successfully with {len(cache.raw_data)} items") except Exception as cache_error: logger.error(f"Error loading cache data: {cache_error}") # 如果获取缓存失败,也显示初始化页面 @@ -143,7 +142,6 @@ class LoraRoutes: settings=settings, request=request # Pass the request object to the template ) - logger.debug(f"Recipes page loaded successfully with {len(cache.raw_data)} items") except Exception as cache_error: logger.error(f"Error loading recipe cache data: {cache_error}") # 如果获取缓存失败,也显示初始化页面 diff --git a/py/utils/file_utils.py b/py/utils/file_utils.py index 058469d6..1a9825a2 100644 --- a/py/utils/file_utils.py +++ b/py/utils/file_utils.py @@ -8,7 +8,8 @@ from typing import Dict, Optional, Type from .model_utils import determine_base_model from .lora_metadata import extract_lora_metadata, extract_checkpoint_metadata from .models import BaseModelMetadata, LoraMetadata, CheckpointMetadata -from .constants import PREVIEW_EXTENSIONS +from .constants import PREVIEW_EXTENSIONS, CARD_PREVIEW_WIDTH +from .exif_utils import ExifUtils logger = logging.getLogger(__name__) @@ -26,7 +27,38 @@ def find_preview_file(base_name: str, dir_path: str) -> str: for ext in PREVIEW_EXTENSIONS: full_pattern = os.path.join(dir_path, f"{base_name}{ext}") if os.path.exists(full_pattern): + # Check if this is an image and not already webp + if ext.lower().endswith(('.jpg', '.jpeg', '.png')) and not ext.lower().endswith('.webp'): + try: + # Optimize the image to webp format + webp_path = os.path.join(dir_path, f"{base_name}.webp") + + # Use ExifUtils to optimize the image + with open(full_pattern, 'rb') as f: + image_data = f.read() + + optimized_data, _ = ExifUtils.optimize_image( + image_data=image_data, + target_width=CARD_PREVIEW_WIDTH, + format='webp', + quality=85, + preserve_metadata=True + ) + + # Save the optimized webp file + with open(webp_path, 'wb') as f: + f.write(optimized_data) + + logger.debug(f"Optimized preview image from {full_pattern} to {webp_path}") + return webp_path.replace(os.sep, "/") + except Exception as e: + logger.error(f"Error optimizing preview image {full_pattern}: {e}") + # Fall back to original file if optimization fails + return full_pattern.replace(os.sep, "/") + + # Return the original path for webp images or non-image files return full_pattern.replace(os.sep, "/") + return "" def normalize_path(path: str) -> str: @@ -154,6 +186,7 @@ async def load_metadata(file_path: str, model_class: Type[BaseModelMetadata] = L data['file_path'] = normalize_path(file_path) needs_update = True + # TODO: optimize preview image to webp format if not already done preview_url = data.get('preview_url', '') if not preview_url or not os.path.exists(preview_url): base_name = os.path.splitext(os.path.basename(file_path))[0]