From af5c2341e7cbb3587a275e9d7470670384379c6d Mon Sep 17 00:00:00 2001 From: Will Miao <13051207myq@gmail.com> Date: Sat, 22 Feb 2025 11:31:00 +0800 Subject: [PATCH] Enhance file handling in LoraScanner and file_utils: resolve symlinks and improve error logging --- services/lora_scanner.py | 2 +- utils/file_utils.py | 56 ++++++++++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/services/lora_scanner.py b/services/lora_scanner.py index 03ab4711..5f6b09c6 100644 --- a/services/lora_scanner.py +++ b/services/lora_scanner.py @@ -294,7 +294,7 @@ class LoraScanner: async def scan_single_lora(self, file_path: str) -> Optional[Dict]: """Scan a single LoRA file and return its metadata""" try: - if not os.path.exists(file_path): + if not os.path.exists(os.path.realpath(file_path)): return None # 获取基本文件信息 diff --git a/utils/file_utils.py b/utils/file_utils.py index 61811c3a..2aaa1ed2 100644 --- a/utils/file_utils.py +++ b/utils/file_utils.py @@ -1,3 +1,4 @@ +import logging import os import hashlib import json @@ -6,6 +7,8 @@ from typing import Dict, Optional from .lora_metadata import extract_lora_metadata from .models import LoraMetadata +logger = logging.getLogger(__name__) + async def calculate_sha256(file_path: str) -> str: """Calculate SHA256 hash of a file""" sha256_hash = hashlib.sha256() @@ -37,33 +40,46 @@ def normalize_path(path: str) -> str: """Normalize file path to use forward slashes""" return path.replace(os.sep, "/") if path else path -async def get_file_info(file_path: str) -> LoraMetadata: +async def get_file_info(file_path: str) -> Optional[LoraMetadata]: """Get basic file information as LoraMetadata object""" + # First check if file actually exists and resolve symlinks + try: + real_path = os.path.realpath(file_path) + if not os.path.exists(real_path): + return None + except Exception as e: + logger.error(f"Error checking file existence for {file_path}: {e}") + return None + base_name = os.path.splitext(os.path.basename(file_path))[0] dir_path = os.path.dirname(file_path) preview_url = _find_preview_file(base_name, dir_path) - metadata = LoraMetadata( - file_name=base_name, - model_name=base_name, - file_path=normalize_path(file_path), - size=os.path.getsize(file_path), - modified=os.path.getmtime(file_path), - sha256=await calculate_sha256(file_path), - base_model="Unknown", # Will be updated later - usage_tips="", - notes="", - from_civitai=True, - preview_url=normalize_path(preview_url), - ) + try: + metadata = LoraMetadata( + file_name=base_name, + model_name=base_name, + file_path=normalize_path(file_path), + size=os.path.getsize(real_path), + modified=os.path.getmtime(real_path), + sha256=await calculate_sha256(real_path), + base_model="Unknown", # Will be updated later + usage_tips="", + notes="", + from_civitai=True, + preview_url=normalize_path(preview_url), + ) - # create metadata file - base_model_info = await extract_lora_metadata(file_path) - metadata.base_model = base_model_info['base_model'] - await save_metadata(file_path, metadata) - - return metadata + # create metadata file + base_model_info = await extract_lora_metadata(real_path) + metadata.base_model = base_model_info['base_model'] + await save_metadata(file_path, metadata) + + return metadata + except Exception as e: + logger.error(f"Error getting file info for {file_path}: {e}") + return None async def save_metadata(file_path: str, metadata: LoraMetadata) -> None: """Save metadata to .metadata.json file"""