This commit is contained in:
Will Miao
2025-01-29 06:06:48 +08:00
parent 6aea23523c
commit b7f6c4fbf8
4 changed files with 57 additions and 18 deletions

View File

@@ -62,11 +62,11 @@ class LorasEndpoint:
file_path = os.path.join(root, filename)
# Try to load existing metadata first
metadata = await load_metadata(file_path)
metadata = await load_metadata(file_path, self.loras_root)
if metadata is None:
# Only get file info and extract metadata if no existing metadata
metadata = await get_file_info(file_path)
metadata = await get_file_info(file_path, self.loras_root)
base_model_info = await extract_lora_metadata(file_path)
metadata.base_model = base_model_info['base_model']
await save_metadata(file_path, metadata)
@@ -101,7 +101,7 @@ class LorasEndpoint:
try:
scan_start = time.time()
data = await self.scan_loras()
print(f"Scanned {len(data)} loras in {time.time()-scan_start:.2f}s")
print(f"Lora Manager: Scanned {len(data)} loras in {time.time()-scan_start:.2f}s")
# Format the data for the template
formatted_loras = [self.format_lora(l) for l in data]
@@ -297,15 +297,17 @@ class LorasEndpoint:
local_metadata['base_model'] = civitai_metadata.get('baseModel')
# 4. 下载预览图
first_preview = next((img for img in civitai_metadata.get('images', [])), None)
if first_preview:
preview_extension = '.mp4' if first_preview['type'] == 'video' else os.path.splitext(first_preview['url'])[-1] # Get the file extension
preview_filename = os.path.splitext(os.path.basename(data['file_path']))[0] + preview_extension
preview_path = os.path.join(os.path.dirname(data['file_path']), preview_filename)
await client.download_preview_image(first_preview['url'], preview_path)
# 存储相对路径,使用正斜杠格式
local_metadata['preview_url'] = os.path.relpath(preview_path, self.loras_root).replace(os.sep, '/')
# Check if existing preview is valid
if not local_metadata.get('preview_url') or not os.path.join(self.loras_root, local_metadata['preview_url'].replace('/', os.sep)):
first_preview = next((img for img in civitai_metadata.get('images', [])), None)
if first_preview:
preview_extension = '.mp4' if first_preview['type'] == 'video' else os.path.splitext(first_preview['url'])[-1] # Get the file extension
preview_filename = os.path.splitext(os.path.basename(data['file_path']))[0] + '.preview' + preview_extension
preview_path = os.path.join(os.path.dirname(data['file_path']), preview_filename)
await client.download_preview_image(first_preview['url'], preview_path)
# 存储相对路径,使用正斜杠格式
local_metadata['preview_url'] = os.path.relpath(preview_path, self.loras_root).replace(os.sep, '/')
# 5. 保存更新后的元数据
with open(metadata_path, 'w', encoding='utf-8') as f:

View File

@@ -3,6 +3,7 @@ name = "comfyui-lora-manager"
description = "LoRA Manager for ComfyUI - An extension for managing LoRA models with previews and metadata integration."
version = "0.5.1"
license = {file = "LICENSE"}
dependencies = ["aiohttp", "jinja2", "safetensors"]
[project.urls]
Repository = "https://github.com/willmiao/ComfyUI-Lora-Manager"

3
requirements.txt Normal file
View File

@@ -0,0 +1,3 @@
aiohttp
jinja2
safetensors

View File

@@ -12,18 +12,42 @@ async def calculate_sha256(file_path: str) -> str:
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
async def get_file_info(file_path: str) -> LoraMetadata:
def _find_preview_file(base_name: str, dir_path: str, lora_root: str) -> str:
"""Find preview file for given base name in directory"""
preview_patterns = [
f"{base_name}.preview.png",
f"{base_name}.preview.jpg",
f"{base_name}.preview.jpeg",
f"{base_name}.preview.mp4",
f"{base_name}.png",
f"{base_name}.jpg",
f"{base_name}.jpeg",
f"{base_name}.mp4"
]
for pattern in preview_patterns:
full_pattern = os.path.join(dir_path, pattern)
if os.path.exists(full_pattern):
return os.path.relpath(full_pattern, lora_root).replace("\\", "/")
return ""
async def get_file_info(file_path: str, loras_root: str) -> LoraMetadata:
"""Get basic file information as LoraMetadata object"""
base_name = os.path.splitext(os.path.basename(file_path))[0]
dir_path = os.path.dirname(file_path)
preview_path = _find_preview_file(base_name, dir_path, loras_root)
return LoraMetadata(
file_name=os.path.splitext(os.path.basename(file_path))[0],
model_name=os.path.splitext(os.path.basename(file_path))[0],
file_name=base_name,
model_name=base_name,
file_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
from_civitai=True,
preview_url="",
preview_url=preview_path,
)
async def save_metadata(file_path: str, metadata: LoraMetadata) -> None:
@@ -35,13 +59,22 @@ async def save_metadata(file_path: str, metadata: LoraMetadata) -> None:
except Exception as e:
print(f"Error saving metadata to {metadata_path}: {str(e)}")
async def load_metadata(file_path: str) -> Optional[LoraMetadata]:
async def load_metadata(file_path: str, loras_root: str) -> Optional[LoraMetadata]:
"""Load metadata from .metadata.json file"""
metadata_path = f"{os.path.splitext(file_path)[0]}.metadata.json"
try:
if os.path.exists(metadata_path):
with open(metadata_path, 'r', encoding='utf-8') as f:
data = json.load(f)
preview_url = data.get('preview_url', '')
preview_path = os.path.join(loras_root, preview_url) if preview_url else ''
if not preview_url or not os.path.exists(preview_path):
base_name = os.path.splitext(os.path.basename(file_path))[0]
dir_path = os.path.dirname(file_path)
data['preview_url'] = _find_preview_file(base_name, dir_path, loras_root)
if data['preview_url']:
with open(metadata_path, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
return LoraMetadata.from_dict(data)
except Exception as e:
print(f"Error loading metadata from {metadata_path}: {str(e)}")
@@ -51,4 +84,4 @@ async def update_civitai_metadata(file_path: str, civitai_data: Dict) -> None:
"""Update metadata file with Civitai data"""
metadata = await load_metadata(file_path)
metadata['civitai'] = civitai_data
await save_metadata(file_path, metadata)
await save_metadata(file_path, metadata)