mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-25 15:15:44 -03:00
Implement preview version tracking for LoRA cards
This commit is contained in:
@@ -163,23 +163,28 @@ export async function replacePreview(filePath) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
const newPreviewPath = `${data.preview_url}?t=${new Date().getTime()}`;
|
|
||||||
|
|
||||||
|
// 更新预览版本
|
||||||
|
state.previewVersions.set(filePath, Date.now());
|
||||||
|
|
||||||
|
// 更新卡片显示
|
||||||
const card = document.querySelector(`.lora-card[data-filepath="${filePath}"]`);
|
const card = document.querySelector(`.lora-card[data-filepath="${filePath}"]`);
|
||||||
const previewContainer = card.querySelector('.card-preview');
|
const previewContainer = card.querySelector('.card-preview');
|
||||||
const oldPreview = previewContainer.querySelector('img, video');
|
const oldPreview = previewContainer.querySelector('img, video');
|
||||||
|
|
||||||
|
const previewUrl = `${data.preview_url}?t=${state.previewVersions.get(filePath)}`;
|
||||||
|
|
||||||
if (file.type.startsWith('video/')) {
|
if (file.type.startsWith('video/')) {
|
||||||
const video = document.createElement('video');
|
const video = document.createElement('video');
|
||||||
video.controls = true;
|
video.controls = true;
|
||||||
video.autoplay = true;
|
video.autoplay = true;
|
||||||
video.muted = true;
|
video.muted = true;
|
||||||
video.loop = true;
|
video.loop = true;
|
||||||
video.src = newPreviewPath;
|
video.src = previewUrl;
|
||||||
oldPreview.replaceWith(video);
|
oldPreview.replaceWith(video);
|
||||||
} else {
|
} else {
|
||||||
const img = document.createElement('img');
|
const img = document.createElement('img');
|
||||||
img.src = newPreviewPath;
|
img.src = previewUrl;
|
||||||
oldPreview.replaceWith(img);
|
oldPreview.replaceWith(img);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { showToast } from '../utils/uiHelpers.js';
|
import { showToast } from '../utils/uiHelpers.js';
|
||||||
import { modalManager } from '../managers/ModalManager.js';
|
import { modalManager } from '../managers/ModalManager.js';
|
||||||
|
import { state } from '../state/index.js';
|
||||||
|
|
||||||
export function createLoraCard(lora) {
|
export function createLoraCard(lora) {
|
||||||
const card = document.createElement('div');
|
const card = document.createElement('div');
|
||||||
@@ -13,16 +14,17 @@ export function createLoraCard(lora) {
|
|||||||
card.dataset.from_civitai = lora.from_civitai;
|
card.dataset.from_civitai = lora.from_civitai;
|
||||||
card.dataset.meta = JSON.stringify(lora.civitai || {});
|
card.dataset.meta = JSON.stringify(lora.civitai || {});
|
||||||
|
|
||||||
// Add timestamp to preview URL to prevent caching
|
const version = state.previewVersions.get(lora.file_path);
|
||||||
const previewUrl = lora.preview_url ? `${lora.preview_url}?t=${Date.now()}` : '/loras_static/images/no-preview.png';
|
const previewUrl = lora.preview_url || '/loras_static/images/no-preview.png';
|
||||||
|
const versionedPreviewUrl = version ? `${previewUrl}?t=${version}` : previewUrl;
|
||||||
|
|
||||||
card.innerHTML = `
|
card.innerHTML = `
|
||||||
<div class="card-preview">
|
<div class="card-preview">
|
||||||
${previewUrl.endsWith('.mp4') ?
|
${previewUrl.endsWith('.mp4') ?
|
||||||
`<video controls autoplay muted loop>
|
`<video controls autoplay muted loop>
|
||||||
<source src="${previewUrl}" type="video/mp4">
|
<source src="${versionedPreviewUrl}" type="video/mp4">
|
||||||
</video>` :
|
</video>` :
|
||||||
`<img src="${previewUrl}" alt="${lora.model_name}">`
|
`<img src="${versionedPreviewUrl}" alt="${lora.model_name}">`
|
||||||
}
|
}
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<span class="base-model-label" title="${lora.base_model}">
|
<span class="base-model-label" title="${lora.base_model}">
|
||||||
@@ -76,20 +78,6 @@ export function createLoraCard(lora) {
|
|||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function updatePreviewInCard(filePath, file, previewUrl) {
|
|
||||||
const card = document.querySelector(`.lora-card[data-filepath="${filePath}"]`);
|
|
||||||
const previewContainer = card?.querySelector('.card-preview');
|
|
||||||
const oldPreview = previewContainer?.querySelector('img, video');
|
|
||||||
|
|
||||||
if (oldPreview) {
|
|
||||||
const newPreviewUrl = `${previewUrl}?t=${Date.now()}`;
|
|
||||||
const newPreview = file.type.startsWith('video/')
|
|
||||||
? createVideoPreview(newPreviewUrl)
|
|
||||||
: createImagePreview(newPreviewUrl);
|
|
||||||
oldPreview.replaceWith(newPreview);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function showLoraModal(lora) {
|
export function showLoraModal(lora) {
|
||||||
const escapedWords = lora.trainedWords?.length ?
|
const escapedWords = lora.trainedWords?.length ?
|
||||||
lora.trainedWords.map(word => word.replace(/'/g, '\\\'')) : [];
|
lora.trainedWords.map(word => word.replace(/'/g, '\\\'')) : [];
|
||||||
@@ -195,16 +183,3 @@ export function initializeLoraCards() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function createVideoPreview(url) {
|
|
||||||
const video = document.createElement('video');
|
|
||||||
video.controls = video.autoplay = video.muted = video.loop = true;
|
|
||||||
video.src = url;
|
|
||||||
return video;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createImagePreview(url) {
|
|
||||||
const img = document.createElement('img');
|
|
||||||
img.src = url;
|
|
||||||
return img;
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,7 @@ import { debounce } from './utils/debounce.js';
|
|||||||
import { LoadingManager } from './managers/LoadingManager.js';
|
import { LoadingManager } from './managers/LoadingManager.js';
|
||||||
import { modalManager } from './managers/ModalManager.js';
|
import { modalManager } from './managers/ModalManager.js';
|
||||||
import { state } from './state/index.js';
|
import { state } from './state/index.js';
|
||||||
import { createLoraCard, updatePreviewInCard, showLoraModal, initializeLoraCards } from './components/LoraCard.js';
|
import { showLoraModal, initializeLoraCards } from './components/LoraCard.js';
|
||||||
import { loadMoreLoras, fetchCivitai, deleteModel, replacePreview, resetAndReload, refreshLoras } from './api/loraApi.js';
|
import { loadMoreLoras, fetchCivitai, deleteModel, replacePreview, resetAndReload, refreshLoras } from './api/loraApi.js';
|
||||||
import { showToast, lazyLoadImages, restoreFolderFilter, initTheme, toggleTheme, toggleFolder, copyTriggerWord } from './utils/uiHelpers.js';
|
import { showToast, lazyLoadImages, restoreFolderFilter, initTheme, toggleTheme, toggleFolder, copyTriggerWord } from './utils/uiHelpers.js';
|
||||||
import { initializeInfiniteScroll } from './utils/infiniteScroll.js';
|
import { initializeInfiniteScroll } from './utils/infiniteScroll.js';
|
||||||
|
|||||||
@@ -5,5 +5,6 @@ export const state = {
|
|||||||
sortBy: 'name',
|
sortBy: 'name',
|
||||||
activeFolder: null,
|
activeFolder: null,
|
||||||
loadingManager: null,
|
loadingManager: null,
|
||||||
observer: null
|
observer: null,
|
||||||
|
previewVersions: new Map()
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user