feat: improve Civitai integration and download button resilience

This commit is contained in:
Dariusz L
2026-06-08 03:26:32 +02:00
parent 6e2f1b3101
commit 2709dddb22
5 changed files with 50 additions and 9 deletions
File diff suppressed because one or more lines are too long
+3 -2
View File
@@ -3753,10 +3753,11 @@
.mr-model-details-version-tab {
display: inline-grid;
gap: 2px;
min-width: 118px;
flex: 0 0 auto;
min-width: max-content;
max-width: 230px;
min-height: 38px;
padding: 6px 10px;
padding: 6px 11px;
border: 1px solid rgba(255,255,255,0.11);
border-radius: 6px;
background: rgba(255,255,255,0.06);
@@ -572,7 +572,7 @@ export const resolveDownloadMethods = {
);
}
if (downloadBtn) {
downloadBtn.textContent = '✓ Done';
this.restoreDownloadButtonReadyState(downloadBtn);
}
} catch (error) {
@@ -731,9 +731,7 @@ export const resolveDownloadMethods = {
progressDiv.innerHTML = this.renderStatusMessage('Download complete. Checking local matches...', 'success');
}
if (downloadBtn) {
downloadBtn.textContent = '✓ Done';
downloadBtn.classList.remove('mr-is-success-action');
downloadBtn.classList.add('mr-btn-primary');
this.restoreDownloadButtonReadyState(downloadBtn);
}
delete this.activeDownloads[downloadId];
this.updateDownloadAllButtonState();
@@ -800,6 +798,17 @@ export const resolveDownloadMethods = {
}
},
restoreDownloadButtonReadyState(downloadBtn) {
if (!downloadBtn) return;
downloadBtn.disabled = false;
downloadBtn.classList.remove('mr-is-success-action', 'mr-btn-primary');
if (downloadBtn.classList.contains('search-download-btn')) {
downloadBtn.innerHTML = getSvgIcon('download');
return;
}
downloadBtn.innerHTML = '<span class="mr-btn-icon">☁</span> Download';
},
/**
* Cancel an active download
*/
+5 -2
View File
@@ -1503,13 +1503,15 @@ export const searchPanelMethods = {
model_id: missing.download_source?.model_id || ids.modelId,
version_id: missing.download_source?.version_id || ids.versionId,
base_model: missing.civitai_info?.base_model || missing.download_source?.base_model,
tags: missing.civitai_info?.tags || missing.download_source?.tags || []
tags: missing.civitai_info?.tags || missing.download_source?.tags || [],
searchedAt: missing.download_source?.searchedAt || missing.download_source?.searched_at
};
},
applyCivitaiUrnResult(missing, civitai = {}) {
if (!missing || !civitai) return;
const ids = this.getUrnIds(missing);
const searchedAt = civitai.searchedAt || civitai.searched_at || new Date().toISOString();
missing.civitai_info = {
model_name: civitai.name,
version_name: civitai.version_name,
@@ -1531,7 +1533,8 @@ export const searchPanelMethods = {
version_id: civitai.version_id || ids.versionId,
model_url: civitai.url || `https://civitai.com/models/${ids.modelId}?modelVersionId=${ids.versionId}`,
base_model: civitai.base_model,
tags: civitai.tags || []
tags: civitai.tags || [],
searchedAt
};
},
+28
View File
@@ -28,6 +28,7 @@ export const modelInfoMethods = {
const hasLocalPath = Boolean(model?.path || model?.resolved_path);
this.setContextMenuItemVisible('showInfo', !isDownloadTableContext);
this.setContextMenuItemVisible('showMore', canShowMore);
this.setContextMenuItemVisible('civitai', !isDownloadTableContext);
this.setContextMenuItemVisible('openFolder', !isDownloadTableContext && hasLocalPath);
this.setContextMenuDividerVisible('source', !isDownloadTableContext || canShowMore);
this.setContextMenuDividerVisible('folder', !isDownloadTableContext && hasLocalPath);
@@ -144,6 +145,12 @@ export const modelInfoMethods = {
async openInCivitAI(model) {
if (!model) return;
const directUrl = this.getKnownCivitaiModelUrl(model);
if (directUrl) {
window.open(directUrl, '_blank');
return;
}
const name = model.name || model.original_path?.split(/[\/\\]/).pop() || '';
if (!name) return;
@@ -182,6 +189,27 @@ export const modelInfoMethods = {
}
},
getKnownCivitaiModelUrl(model = {}) {
const candidates = [
model.model_url,
model.workflow_model_url,
model.openUrl,
model.url
];
for (const url of candidates) {
const value = String(url || '');
if (/^https:\/\/(?:www\.)?civitai\.com\/models\/\d+/i.test(value)) {
return value;
}
}
const modelId = model.model_id || model.modelId;
const versionId = model.version_id || model.versionId;
if (modelId) {
return `https://civitai.com/models/${modelId}${versionId ? `?modelVersionId=${versionId}` : ''}`;
}
return '';
},
/**
* Show model info dialog (similar to rgthree's RgthreeLoraInfoDialog)
*/