mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-21 21:22:11 -03:00
feat: Update API routes for LoRA management and enhance folder handling
This commit is contained in:
@@ -55,6 +55,7 @@ class BaseModelRoutes(ABC):
|
|||||||
app.router.add_get(f'/api/{prefix}/base-models', self.get_base_models)
|
app.router.add_get(f'/api/{prefix}/base-models', self.get_base_models)
|
||||||
app.router.add_get(f'/api/{prefix}/scan', self.scan_models)
|
app.router.add_get(f'/api/{prefix}/scan', self.scan_models)
|
||||||
app.router.add_get(f'/api/{prefix}/roots', self.get_model_roots)
|
app.router.add_get(f'/api/{prefix}/roots', self.get_model_roots)
|
||||||
|
app.router.add_get(f'/api/{prefix}/folders', self.get_folders)
|
||||||
app.router.add_get(f'/api/{prefix}/find-duplicates', self.find_duplicate_models)
|
app.router.add_get(f'/api/{prefix}/find-duplicates', self.find_duplicate_models)
|
||||||
app.router.add_get(f'/api/{prefix}/find-filename-conflicts', self.find_filename_conflicts)
|
app.router.add_get(f'/api/{prefix}/find-filename-conflicts', self.find_filename_conflicts)
|
||||||
|
|
||||||
@@ -66,7 +67,7 @@ class BaseModelRoutes(ABC):
|
|||||||
|
|
||||||
# CivitAI integration routes
|
# CivitAI integration routes
|
||||||
app.router.add_post(f'/api/{prefix}/fetch-all-civitai', self.fetch_all_civitai)
|
app.router.add_post(f'/api/{prefix}/fetch-all-civitai', self.fetch_all_civitai)
|
||||||
app.router.add_get(f'/api/civitai/versions/{{model_id}}', self.get_civitai_versions)
|
# app.router.add_get(f'/api/civitai/versions/{{model_id}}', self.get_civitai_versions)
|
||||||
|
|
||||||
# Add generic page route
|
# Add generic page route
|
||||||
app.router.add_get(f'/{prefix}', self.handle_models_page)
|
app.router.add_get(f'/{prefix}', self.handle_models_page)
|
||||||
@@ -328,6 +329,20 @@ class BaseModelRoutes(ABC):
|
|||||||
"success": False,
|
"success": False,
|
||||||
"error": str(e)
|
"error": str(e)
|
||||||
}, status=500)
|
}, status=500)
|
||||||
|
|
||||||
|
async def get_folders(self, request: web.Request) -> web.Response:
|
||||||
|
"""Get all folders in the cache"""
|
||||||
|
try:
|
||||||
|
cache = await self.service.scanner.get_cached_data()
|
||||||
|
return web.json_response({
|
||||||
|
'folders': cache.folders
|
||||||
|
})
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error getting folders: {e}")
|
||||||
|
return web.json_response({
|
||||||
|
'success': False,
|
||||||
|
'error': str(e)
|
||||||
|
}, status=500)
|
||||||
|
|
||||||
async def find_duplicate_models(self, request: web.Request) -> web.Response:
|
async def find_duplicate_models(self, request: web.Request) -> web.Response:
|
||||||
"""Find models with duplicate SHA256 hashes"""
|
"""Find models with duplicate SHA256 hashes"""
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class CheckpointRoutes(BaseModelRoutes):
|
|||||||
def setup_specific_routes(self, app: web.Application, prefix: str):
|
def setup_specific_routes(self, app: web.Application, prefix: str):
|
||||||
"""Setup Checkpoint-specific routes"""
|
"""Setup Checkpoint-specific routes"""
|
||||||
# Checkpoint-specific CivitAI integration
|
# Checkpoint-specific CivitAI integration
|
||||||
app.router.add_get(f'/api/civitai/versions/{{model_id}}', self.get_civitai_versions_checkpoint)
|
app.router.add_get(f'/api/{prefix}/civitai/versions/{{model_id}}', self.get_civitai_versions_checkpoint)
|
||||||
|
|
||||||
# Checkpoint info by name
|
# Checkpoint info by name
|
||||||
app.router.add_get(f'/api/{prefix}/info/{{name}}', self.get_checkpoint_info)
|
app.router.add_get(f'/api/{prefix}/info/{{name}}', self.get_checkpoint_info)
|
||||||
|
|||||||
@@ -48,15 +48,13 @@ class LoraRoutes(BaseModelRoutes):
|
|||||||
app.router.add_get(f'/api/lora-preview-url', self.get_lora_preview_url)
|
app.router.add_get(f'/api/lora-preview-url', self.get_lora_preview_url)
|
||||||
app.router.add_get(f'/api/lora-civitai-url', self.get_lora_civitai_url)
|
app.router.add_get(f'/api/lora-civitai-url', self.get_lora_civitai_url)
|
||||||
app.router.add_get(f'/api/lora-model-description', self.get_lora_model_description)
|
app.router.add_get(f'/api/lora-model-description', self.get_lora_model_description)
|
||||||
app.router.add_get(f'/api/folders', self.get_folders)
|
|
||||||
app.router.add_get(f'/api/lora-roots', self.get_lora_roots)
|
|
||||||
|
|
||||||
# LoRA-specific management routes
|
# LoRA-specific management routes
|
||||||
app.router.add_post(f'/api/move_model', self.move_model)
|
app.router.add_post(f'/api/move_model', self.move_model)
|
||||||
app.router.add_post(f'/api/move_models_bulk', self.move_models_bulk)
|
app.router.add_post(f'/api/move_models_bulk', self.move_models_bulk)
|
||||||
|
|
||||||
# CivitAI integration with LoRA-specific validation
|
# CivitAI integration with LoRA-specific validation
|
||||||
app.router.add_get(f'/api/civitai/versions/{{model_id}}', self.get_civitai_versions_lora)
|
app.router.add_get(f'/api/{prefix}/civitai/versions/{{model_id}}', self.get_civitai_versions_lora)
|
||||||
app.router.add_get(f'/api/civitai/model/version/{{modelVersionId}}', self.get_civitai_model_by_version)
|
app.router.add_get(f'/api/civitai/model/version/{{modelVersionId}}', self.get_civitai_model_by_version)
|
||||||
app.router.add_get(f'/api/civitai/model/hash/{{hash}}', self.get_civitai_model_by_hash)
|
app.router.add_get(f'/api/civitai/model/hash/{{hash}}', self.get_civitai_model_by_hash)
|
||||||
|
|
||||||
@@ -201,33 +199,6 @@ class LoraRoutes(BaseModelRoutes):
|
|||||||
'error': str(e)
|
'error': str(e)
|
||||||
}, status=500)
|
}, status=500)
|
||||||
|
|
||||||
async def get_folders(self, request: web.Request) -> web.Response:
|
|
||||||
"""Get all folders in the cache"""
|
|
||||||
try:
|
|
||||||
cache = await self.service.scanner.get_cached_data()
|
|
||||||
return web.json_response({
|
|
||||||
'folders': cache.folders
|
|
||||||
})
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error getting folders: {e}")
|
|
||||||
return web.json_response({
|
|
||||||
'success': False,
|
|
||||||
'error': str(e)
|
|
||||||
}, status=500)
|
|
||||||
|
|
||||||
async def get_lora_roots(self, request: web.Request) -> web.Response:
|
|
||||||
"""Get all configured LoRA root directories"""
|
|
||||||
try:
|
|
||||||
return web.json_response({
|
|
||||||
'roots': self.service.get_model_roots()
|
|
||||||
})
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error getting LoRA roots: {e}")
|
|
||||||
return web.json_response({
|
|
||||||
'success': False,
|
|
||||||
'error': str(e)
|
|
||||||
}, status=500)
|
|
||||||
|
|
||||||
# Override get_models to add LoRA-specific response data
|
# Override get_models to add LoRA-specific response data
|
||||||
async def get_models(self, request: web.Request) -> web.Response:
|
async def get_models(self, request: web.Request) -> web.Response:
|
||||||
"""Get paginated LoRA data with LoRA-specific fields"""
|
"""Get paginated LoRA data with LoRA-specific fields"""
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ export class DownloadManager {
|
|||||||
throw new Error('Invalid Civitai URL format');
|
throw new Error('Invalid Civitai URL format');
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await fetch(`/api/civitai/versions/${this.modelId}`);
|
const response = await fetch(`/api/loras/civitai/versions/${this.modelId}`);
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
const errorData = await response.json().catch(() => ({}));
|
const errorData = await response.json().catch(() => ({}));
|
||||||
if (errorData && errorData.error && errorData.error.includes('Model type mismatch')) {
|
if (errorData && errorData.error && errorData.error.includes('Model type mismatch')) {
|
||||||
@@ -254,7 +254,7 @@ export class DownloadManager {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Fetch LoRA roots
|
// Fetch LoRA roots
|
||||||
const rootsResponse = await fetch('/api/lora-roots');
|
const rootsResponse = await fetch('/api/loras/roots');
|
||||||
if (!rootsResponse.ok) {
|
if (!rootsResponse.ok) {
|
||||||
throw new Error('Failed to fetch LoRA roots');
|
throw new Error('Failed to fetch LoRA roots');
|
||||||
}
|
}
|
||||||
@@ -272,7 +272,7 @@ export class DownloadManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fetch folders dynamically
|
// Fetch folders dynamically
|
||||||
const foldersResponse = await fetch('/api/folders');
|
const foldersResponse = await fetch('/api/loras/folders');
|
||||||
if (!foldersResponse.ok) {
|
if (!foldersResponse.ok) {
|
||||||
throw new Error('Failed to fetch folders');
|
throw new Error('Failed to fetch folders');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ class MoveManager {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Fetch LoRA roots
|
// Fetch LoRA roots
|
||||||
const rootsResponse = await fetch('/api/lora-roots');
|
const rootsResponse = await fetch('/api/loras/roots');
|
||||||
if (!rootsResponse.ok) {
|
if (!rootsResponse.ok) {
|
||||||
throw new Error('Failed to fetch LoRA roots');
|
throw new Error('Failed to fetch LoRA roots');
|
||||||
}
|
}
|
||||||
@@ -96,7 +96,7 @@ class MoveManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fetch folders dynamically
|
// Fetch folders dynamically
|
||||||
const foldersResponse = await fetch('/api/folders');
|
const foldersResponse = await fetch('/api/loras/folders');
|
||||||
if (!foldersResponse.ok) {
|
if (!foldersResponse.ok) {
|
||||||
throw new Error('Failed to fetch folders');
|
throw new Error('Failed to fetch folders');
|
||||||
}
|
}
|
||||||
@@ -190,7 +190,7 @@ class MoveManager {
|
|||||||
|
|
||||||
// Refresh folder tags after successful move
|
// Refresh folder tags after successful move
|
||||||
try {
|
try {
|
||||||
const foldersResponse = await fetch('/api/folders');
|
const foldersResponse = await fetch('/api/loras/folders');
|
||||||
if (foldersResponse.ok) {
|
if (foldersResponse.ok) {
|
||||||
const foldersData = await foldersResponse.json();
|
const foldersData = await foldersResponse.json();
|
||||||
updateFolderTags(foldersData.folders);
|
updateFolderTags(foldersData.folders);
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ export class SettingsManager {
|
|||||||
if (!defaultLoraRootSelect) return;
|
if (!defaultLoraRootSelect) return;
|
||||||
|
|
||||||
// Fetch lora roots
|
// Fetch lora roots
|
||||||
const response = await fetch('/api/lora-roots');
|
const response = await fetch('/api/loras/roots');
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error('Failed to fetch LoRA roots');
|
throw new Error('Failed to fetch LoRA roots');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ export class FolderBrowser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fetch LoRA roots
|
// Fetch LoRA roots
|
||||||
const rootsResponse = await fetch('/api/lora-roots');
|
const rootsResponse = await fetch('/api/loras/roots');
|
||||||
if (!rootsResponse.ok) {
|
if (!rootsResponse.ok) {
|
||||||
throw new Error(`Failed to fetch LoRA roots: ${rootsResponse.status}`);
|
throw new Error(`Failed to fetch LoRA roots: ${rootsResponse.status}`);
|
||||||
}
|
}
|
||||||
@@ -119,7 +119,7 @@ export class FolderBrowser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fetch folders
|
// Fetch folders
|
||||||
const foldersResponse = await fetch('/api/folders');
|
const foldersResponse = await fetch('/api/loras/folders');
|
||||||
if (!foldersResponse.ok) {
|
if (!foldersResponse.ok) {
|
||||||
throw new Error(`Failed to fetch folders: ${foldersResponse.status}`);
|
throw new Error(`Failed to fetch folders: ${foldersResponse.status}`);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user