From afd4118fdb6dd076d3b81fa25a1ae29ae747a740 Mon Sep 17 00:00:00 2001 From: xuejianwu <374601383@qq.com> Date: Thu, 30 Jul 2026 09:55:29 +0800 Subject: [PATCH] fix: match candidate previews to video ratio --- public/app.js | 16 ++++++++++++++++ public/index.html | 4 ++-- public/styles.css | 8 +++++--- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/public/app.js b/public/app.js index 4666c20..27942d0 100644 --- a/public/app.js +++ b/public/app.js @@ -224,6 +224,7 @@ el.videoForm.addEventListener("submit", async (event) => { createdAt: Date.now(), lastCheckedAt: null, progress: 5, + ratio: shot.ratio, }; shot.versions.push(version); state.activeGenerationShotId = shot.id; @@ -692,10 +693,16 @@ function renderVersionList() { card.className = `version-card${shot.selectedVersionId === version.id ? " selected" : ""}`; const preview = document.createElement("div"); preview.className = "version-preview"; + setVersionPreviewRatio(preview, version.ratio || shot.ratio); if (version.videoUrl) { const video = document.createElement("video"); video.src = version.videoUrl; video.controls = true; + video.playsInline = true; + video.preload = "metadata"; + video.addEventListener("loadedmetadata", () => { + if (video.videoWidth && video.videoHeight) setVersionPreviewRatio(preview, `${video.videoWidth}:${video.videoHeight}`); + }, { once: true }); preview.appendChild(video); } else preview.textContent = version.status === "running" ? "生成中" : version.status === "failed" ? "生成失败" : "暂无预览"; const details = document.createElement("div"); @@ -734,6 +741,15 @@ function renderVersionList() { }); } +function setVersionPreviewRatio(preview, ratio) { + const [width, height] = String(ratio || "16:9").split(":").map(Number); + const safeWidth = width > 0 ? width : 16; + const safeHeight = height > 0 ? height : 9; + preview.style.setProperty("--preview-ratio", `${safeWidth} / ${safeHeight}`); + preview.classList.toggle("portrait", safeHeight > safeWidth); + preview.classList.toggle("square", safeHeight === safeWidth); +} + function videoProxyUrl(taskId) { const base = API_BASE || location.origin; return `${base}/api/videos/${encodeURIComponent(taskId)}/video.mp4`; diff --git a/public/index.html b/public/index.html index 8028e5c..0c562d3 100644 --- a/public/index.html +++ b/public/index.html @@ -4,7 +4,7 @@ 营响力|AI 短剧数字人 Demo - +
@@ -283,6 +283,6 @@ - + diff --git a/public/styles.css b/public/styles.css index 9b013f6..2b6911a 100644 --- a/public/styles.css +++ b/public/styles.css @@ -239,9 +239,11 @@ hr { border: 0; border-top: 1px solid var(--line); margin: 26px 0 0; } .version-head h3 { margin: 5px 0 0; font-size: 16px; } .version-head > span { color: var(--muted); font-size: 11px; } .version-list, .assembly-list { display: grid; gap: 10px; margin-top: 12px; } -.version-card { display: grid; grid-template-columns: 116px minmax(0, 1fr) auto; gap: 12px; align-items: center; padding: 10px; border: 1px solid var(--line); border-radius: 12px; background: #fafbfe; } +.version-card { display: grid; grid-template-columns: max-content minmax(0, 1fr) auto; gap: 12px; align-items: center; padding: 10px; border: 1px solid var(--line); border-radius: 12px; background: #fafbfe; } .version-card.selected { border-color: var(--green); background: var(--green-soft); } -.version-preview { width: 116px; aspect-ratio: 16 / 9; border-radius: 8px; overflow: hidden; display: grid; place-items: center; background: #111827; color: #d6dceb; font-size: 10px; } +.version-preview { width: 150px; aspect-ratio: var(--preview-ratio, 16 / 9); border-radius: 8px; overflow: hidden; display: grid; place-items: center; background: #111827; color: #d6dceb; font-size: 10px; } +.version-preview.portrait { width: 84px; } +.version-preview.square { width: 108px; } .version-preview video { width: 100%; height: 100%; object-fit: contain; background: #111827; } .version-copy { min-width: 0; display: grid; gap: 4px; } .version-copy strong { font-size: 13px; } @@ -275,7 +277,7 @@ hr { border: 0; border-top: 1px solid var(--line); margin: 26px 0 0; } .shot-overview-head { align-items: flex-start; } .shot-overview-head > div { align-items: flex-start; flex-direction: column; gap: 3px; } .shot-overview-list .shot-card { flex-basis: 190px; } - .version-card { grid-template-columns: 90px minmax(0, 1fr); } + .version-card { grid-template-columns: max-content minmax(0, 1fr); } .version-actions { grid-column: 1 / -1; width: 100%; grid-template-columns: repeat(2, minmax(0, 1fr)); } .form-grid { grid-template-columns: 1fr; } .view-grid { grid-template-columns: 1fr; }