fix(videos): stop thumbnails reloading on every convert poll
Instead of full re-render every 10s, patch converting badges in-place. Only does a full renderFiles() when file count changes (conversion done) or on the final poll when all conversions finish. Co-authored-by: Copilot <[email protected]>
This commit is contained in:
@@ -210,10 +210,57 @@
|
|||||||
}
|
}
|
||||||
// Auto-refresh every 10s while conversions are running
|
// Auto-refresh every 10s while conversions are running
|
||||||
if (convertingCount > 0) {
|
if (convertingCount > 0) {
|
||||||
setTimeout(refreshFiles, 10000);
|
setTimeout(refreshConvertingOnly, 10000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lightweight refresh: only update converting badges in existing rows.
|
||||||
|
// Falls back to full render if file count changed.
|
||||||
|
function refreshConvertingOnly() {
|
||||||
|
return fetchJson("/api/local-videos")
|
||||||
|
.then(function (result) {
|
||||||
|
const files = result.files || [];
|
||||||
|
const existingRows = Array.from(body.querySelectorAll("tr[data-path]"));
|
||||||
|
// If file count changed (new import, conversion finished → file renamed), do full render
|
||||||
|
if (files.length !== existingRows.length) {
|
||||||
|
renderFiles(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let convertingCount = 0;
|
||||||
|
files.forEach(function (file) {
|
||||||
|
if (!file.converting) return;
|
||||||
|
convertingCount++;
|
||||||
|
const row = body.querySelector(`tr[data-path="${CSS.escape(file.path)}"]`);
|
||||||
|
if (!row) return;
|
||||||
|
// Update desktop badge
|
||||||
|
const badge = row.querySelector(".dash-col-upload .badge");
|
||||||
|
if (badge) {
|
||||||
|
const p = file.convert_progress;
|
||||||
|
const pct = p && p.pct > 0 ? ` ${p.pct}%` : '';
|
||||||
|
const elapsed = p ? ` ${Math.floor(p.elapsed_s / 60)}m${p.elapsed_s % 60}s` : '';
|
||||||
|
badge.innerHTML = `<i class="fas fa-spinner fa-spin me-1"></i>Converting${pct}${elapsed}`;
|
||||||
|
}
|
||||||
|
// Update mobile badge
|
||||||
|
const mobileBadge = row.querySelector(".dash-thumb-converting");
|
||||||
|
if (mobileBadge) {
|
||||||
|
const p = file.convert_progress;
|
||||||
|
const pct = p && p.pct > 0 ? ` ${p.pct}%` : '';
|
||||||
|
const elapsed = p ? `${Math.floor(p.elapsed_s / 60)}m${p.elapsed_s % 60}s` : '…';
|
||||||
|
mobileBadge.innerHTML = `<i class="fas fa-spinner fa-spin me-1"></i>${pct || elapsed}`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (convertingCount > 0) {
|
||||||
|
setTimeout(refreshConvertingOnly, 10000);
|
||||||
|
} else {
|
||||||
|
// All done — do one full render to show final state
|
||||||
|
renderFiles(result);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function () {
|
||||||
|
// silently ignore — don't disturb the UI during a background poll
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function refreshFiles() {
|
function refreshFiles() {
|
||||||
refreshButton.disabled = true;
|
refreshButton.disabled = true;
|
||||||
summary.textContent = "Loading...";
|
summary.textContent = "Loading...";
|
||||||
|
|||||||
Reference in New Issue
Block a user