From ef329399f1ed9fb4342ca1ba4492b70832584a8c Mon Sep 17 00:00:00 2001 From: Zac Date: Mon, 1 Jun 2026 00:56:35 +0000 Subject: [PATCH] feat: v2.2.3 plugin + duration fix - Add v2.2.3 to downloads (streaming write fix for large imports) - Fix duration bug: worker now overwrites with ffprobe result instead of preserving capture wall-clock estimate Co-Authored-By: Claude Sonnet 4.5 --- services/web-ui/public/data.jsx | 9 ++++++++- .../public/downloads/dragonflight-mam-2.2.3.ccx | Bin 0 -> 35590 bytes services/worker/src/workers/proxy.js | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 services/web-ui/public/downloads/dragonflight-mam-2.2.3.ccx diff --git a/services/web-ui/public/data.jsx b/services/web-ui/public/data.jsx index cd5be25..1888b14 100644 --- a/services/web-ui/public/data.jsx +++ b/services/web-ui/public/data.jsx @@ -28,12 +28,19 @@ window.ZAMPP_API_PREFIX = API; // single source of truth (#115) // The panel is now a UXP plugin (.ccx), replacing the legacy CEP/ZXP panel. // Each entry carries a `ccx` URL; the older `zxp`/`installer` fields are gone. window.PREMIERE_RELEASES = [ + { + version: '2.2.3', + ccx: '/downloads/dragonflight-mam-2.2.3.ccx', + installer: null, + notes: 'Fix: streaming write for large imports (no more truncated files). UXP plugin: one-click Export Timeline, library + conform + auto-relink, growing-file mount.', + latest: true, + }, { version: '2.2.2', ccx: '/downloads/dragonflight-mam-2.2.2.ccx', installer: null, notes: 'UXP plugin: one-click Export Timeline, library + conform + auto-relink, growing-file mount, runtime version chip. Replaces the legacy CEP/ZXP panel.', - latest: true, + latest: false, }, ]; window.PREMIERE_LATEST = window.PREMIERE_RELEASES.find(r => r.latest) || window.PREMIERE_RELEASES[0]; diff --git a/services/web-ui/public/downloads/dragonflight-mam-2.2.3.ccx b/services/web-ui/public/downloads/dragonflight-mam-2.2.3.ccx new file mode 100644 index 0000000000000000000000000000000000000000..8c3c54875d65883725d51a7705d07ef0d630bf94 GIT binary patch literal 35590 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 Y{Kxd~nPB0Sy(P|jF7kFAK4xY07xn9-*8l(j literal 0 HcmV?d00001 diff --git a/services/worker/src/workers/proxy.js b/services/worker/src/workers/proxy.js index de2711f..c5e51a9 100644 --- a/services/worker/src/workers/proxy.js +++ b/services/worker/src/workers/proxy.js @@ -200,6 +200,7 @@ export const proxyWorker = async (job) => { // Update asset record — store extracted metadata + proxy key // Use COALESCE so we never overwrite fields the capture service already set + // EXCEPT duration_ms: always trust ffprobe over capture's wall-clock estimate await job.updateProgress(90); await query( `UPDATE assets @@ -207,7 +208,7 @@ export const proxyWorker = async (job) => { fps = COALESCE($2, fps), codec = COALESCE($3, codec), resolution = COALESCE($4, resolution), - duration_ms = COALESCE($5, duration_ms), + duration_ms = $5, file_size = COALESCE($6, file_size), audio_metadata = COALESCE($8, audio_metadata), updated_at = NOW()