UXP v2.1.3: main.js — fix inline relink handler (sync getActiveProject, no require inline)
This commit is contained in:
parent
a25e4b6071
commit
9765fd91f7
1 changed files with 22 additions and 49 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
// Dragonflight UXP Panel — main.js v2.1.1
|
// Dragonflight UXP Panel — main.js v2.1.3
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
if (window.__df_uxp_started) return;
|
if (window.__df_uxp_started) return;
|
||||||
|
|
@ -144,7 +144,7 @@
|
||||||
} finally { Library._syncActions(); }
|
} finally { Library._syncActions(); }
|
||||||
});
|
});
|
||||||
|
|
||||||
// ── Relink single asset ──
|
// ── Relink single asset (proxy → hi-res) ──
|
||||||
$('relink-btn').addEventListener('click', async () => {
|
$('relink-btn').addEventListener('click', async () => {
|
||||||
const a = Library.selectedAsset();
|
const a = Library.selectedAsset();
|
||||||
if (!a) return;
|
if (!a) return;
|
||||||
|
|
@ -164,8 +164,9 @@
|
||||||
UI.showProgress(UI.formatBytes(received) + '…', pct);
|
UI.showProgress(UI.formatBytes(received) + '…', pct);
|
||||||
});
|
});
|
||||||
UI.showProgress('Relinking…', 85);
|
UI.showProgress('Relinking…', 85);
|
||||||
|
// Timeline._relinkInProject uses ppro() internally (sync getActiveProject)
|
||||||
const P = require('premierepro');
|
const P = require('premierepro');
|
||||||
const proj = await P.Project.getActiveProject();
|
const proj = P.Project.getActiveProject(); // sync — no await
|
||||||
if (!proj) throw new Error('No active project');
|
if (!proj) throw new Error('No active project');
|
||||||
await Timeline._relinkInProject(proj, entry.livePath, dest);
|
await Timeline._relinkInProject(proj, entry.livePath, dest);
|
||||||
Library.recordImport(dest, { assetId: a.id, displayName: a.display_name || a.filename });
|
Library.recordImport(dest, { assetId: a.id, displayName: a.display_name || a.filename });
|
||||||
|
|
@ -195,7 +196,6 @@
|
||||||
catch (e) { UI.hideProgress(); UI.toast('Timeline read failed: ' + e.message, 'error'); return; }
|
catch (e) { UI.hideProgress(); UI.toast('Timeline read failed: ' + e.message, 'error'); return; }
|
||||||
if (!_seqCache.clips.length) { UI.hideProgress(); UI.toast('No clips in active sequence', 'error'); return; }
|
if (!_seqCache.clips.length) { UI.hideProgress(); UI.toast('No clips in active sequence', 'error'); return; }
|
||||||
UI.hideProgress();
|
UI.hideProgress();
|
||||||
|
|
||||||
const resolved = Library.resolveClipsToAssets(_seqCache.clips);
|
const resolved = Library.resolveClipsToAssets(_seqCache.clips);
|
||||||
const matched = resolved.filter(c => c.asset_id).length;
|
const matched = resolved.filter(c => c.asset_id).length;
|
||||||
$('export-seq-name').value = _seqCache.sequenceName || 'Sequence 1';
|
$('export-seq-name').value = _seqCache.sequenceName || 'Sequence 1';
|
||||||
|
|
@ -207,7 +207,6 @@
|
||||||
$('export-close-btn').addEventListener('click', () => UI.closeSlide('export-overlay', 'export-panel'));
|
$('export-close-btn').addEventListener('click', () => UI.closeSlide('export-overlay', 'export-panel'));
|
||||||
$('export-cancel-btn').addEventListener('click', () => UI.closeSlide('export-overlay', 'export-panel'));
|
$('export-cancel-btn').addEventListener('click', () => UI.closeSlide('export-overlay', 'export-panel'));
|
||||||
$('export-overlay').addEventListener('click', () => UI.closeSlide('export-overlay', 'export-panel'));
|
$('export-overlay').addEventListener('click', () => UI.closeSlide('export-overlay', 'export-panel'));
|
||||||
|
|
||||||
$('export-confirm-btn').addEventListener('click', async () => {
|
$('export-confirm-btn').addEventListener('click', async () => {
|
||||||
if (!_seqCache) return;
|
if (!_seqCache) return;
|
||||||
const seqName = ($('export-seq-name').value || '').trim() || 'Sequence 1';
|
const seqName = ($('export-seq-name').value || '').trim() || 'Sequence 1';
|
||||||
|
|
@ -234,7 +233,6 @@
|
||||||
const matched = resolved.filter(c => c.asset_id).length;
|
const matched = resolved.filter(c => c.asset_id).length;
|
||||||
$('conform-clip-info').textContent = matched + ' of ' + _seqCache.clips.length + ' clip(s) matched';
|
$('conform-clip-info').textContent = matched + ' of ' + _seqCache.clips.length + ' clip(s) matched';
|
||||||
$('conform-start-btn').disabled = matched === 0;
|
$('conform-start-btn').disabled = matched === 0;
|
||||||
// Sync conform project select from loaded projects
|
|
||||||
const conformProj = $('conform-proj-select');
|
const conformProj = $('conform-proj-select');
|
||||||
if (conformProj) {
|
if (conformProj) {
|
||||||
conformProj.innerHTML = '<option value="">— Select project —</option>';
|
conformProj.innerHTML = '<option value="">— Select project —</option>';
|
||||||
|
|
@ -251,26 +249,22 @@
|
||||||
$('conform-close-btn').addEventListener('click', () => UI.closeSlide('conform-overlay', 'conform-panel'));
|
$('conform-close-btn').addEventListener('click', () => UI.closeSlide('conform-overlay', 'conform-panel'));
|
||||||
$('conform-cancel-btn').addEventListener('click', () => UI.closeSlide('conform-overlay', 'conform-panel'));
|
$('conform-cancel-btn').addEventListener('click', () => UI.closeSlide('conform-overlay', 'conform-panel'));
|
||||||
$('conform-overlay').addEventListener('click', () => UI.closeSlide('conform-overlay', 'conform-panel'));
|
$('conform-overlay').addEventListener('click', () => UI.closeSlide('conform-overlay', 'conform-panel'));
|
||||||
|
|
||||||
$('preset-cards').addEventListener('click', e => {
|
$('preset-cards').addEventListener('click', e => {
|
||||||
const card = e.target.closest('.preset-card');
|
const card = e.target.closest('.preset-card');
|
||||||
if (!card) return;
|
if (!card) return;
|
||||||
document.querySelectorAll('.preset-card').forEach(c => c.classList.remove('selected'));
|
document.querySelectorAll('.preset-card').forEach(c => c.classList.remove('selected'));
|
||||||
card.classList.add('selected');
|
card.classList.add('selected');
|
||||||
const presets = {
|
const presets = {
|
||||||
broadcast: { codec:'prores_hq', quality:'high', resolution:'1080p', audio:'broadcast' },
|
broadcast: { codec:'prores_hq', quality:'high', resolution:'1080p', audio:'broadcast' },
|
||||||
web: { codec:'h264', quality:'medium', resolution:'1080p', audio:'web' },
|
web: { codec:'h264', quality:'medium', resolution:'1080p', audio:'web' },
|
||||||
archive: { codec:'prores_4444', quality:'high', resolution:'uhd', audio:'archive' },
|
archive: { codec:'prores_4444', quality:'high', resolution:'uhd', audio:'archive' },
|
||||||
};
|
};
|
||||||
const p = presets[card.dataset.preset];
|
const p = presets[card.dataset.preset];
|
||||||
if (p) {
|
if (p) {
|
||||||
$('conform-codec').value = p.codec;
|
$('conform-codec').value = p.codec; $('conform-quality').value = p.quality;
|
||||||
$('conform-quality').value = p.quality;
|
$('conform-resolution').value = p.resolution; $('conform-audio').value = p.audio;
|
||||||
$('conform-resolution').value = p.resolution;
|
|
||||||
$('conform-audio').value = p.audio;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('conform-start-btn').addEventListener('click', async () => {
|
$('conform-start-btn').addEventListener('click', async () => {
|
||||||
if (!_seqCache) return;
|
if (!_seqCache) return;
|
||||||
const conformProj = $('conform-proj-select');
|
const conformProj = $('conform-proj-select');
|
||||||
|
|
@ -280,21 +274,15 @@
|
||||||
UI.showProgress('Starting conform job…', 15);
|
UI.showProgress('Starting conform job…', 15);
|
||||||
try {
|
try {
|
||||||
const jobId = await Timeline.startConform(projectId, _seqCache.sequenceName, _seqCache, {
|
const jobId = await Timeline.startConform(projectId, _seqCache.sequenceName, _seqCache, {
|
||||||
codec: $('conform-codec').value,
|
codec: $('conform-codec').value, quality: $('conform-quality').value,
|
||||||
quality: $('conform-quality').value,
|
resolution: $('conform-resolution').value, audio: $('conform-audio').value,
|
||||||
resolution: $('conform-resolution').value,
|
|
||||||
audio: $('conform-audio').value,
|
|
||||||
});
|
});
|
||||||
Timeline.pollConform(jobId,
|
Timeline.pollConform(jobId,
|
||||||
(pct, status) => UI.showProgress('Conform: ' + status + ' (' + pct + '%)…', 15 + pct * 0.8),
|
(pct, status) => UI.showProgress('Conform: ' + status + ' (' + pct + '%)…', 15 + pct * 0.8),
|
||||||
job => {
|
job => {
|
||||||
UI.hideProgress();
|
UI.hideProgress();
|
||||||
if (job.status === 'completed') {
|
if (job.status === 'completed') { UI.toast('Conform complete', 'ok'); Library.refresh(Library.state.searchQuery); }
|
||||||
UI.toast('Conform complete', 'ok');
|
else { UI.toast('Conform failed: ' + (job.error || 'unknown'), 'error'); }
|
||||||
Library.refresh(Library.state.searchQuery);
|
|
||||||
} else {
|
|
||||||
UI.toast('Conform failed: ' + (job.error || 'unknown'), 'error');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
} catch (e) { UI.hideProgress(); UI.toast('Conform failed: ' + e.message, 'error'); }
|
} catch (e) { UI.hideProgress(); UI.toast('Conform failed: ' + e.message, 'error'); }
|
||||||
|
|
@ -309,15 +297,12 @@
|
||||||
try { _seqCache = await Timeline.readActiveSequence(); }
|
try { _seqCache = await Timeline.readActiveSequence(); }
|
||||||
catch (e) { UI.hideProgress(); UI.toast('Timeline read failed: ' + e.message, 'error'); return; }
|
catch (e) { UI.hideProgress(); UI.toast('Timeline read failed: ' + e.message, 'error'); return; }
|
||||||
UI.hideProgress();
|
UI.hideProgress();
|
||||||
|
|
||||||
const resolved = Library.resolveClipsToAssets(_seqCache.clips);
|
const resolved = Library.resolveClipsToAssets(_seqCache.clips);
|
||||||
_relinkClips = resolved;
|
_relinkClips = resolved;
|
||||||
|
|
||||||
const list = $('clip-list');
|
const list = $('clip-list');
|
||||||
list.innerHTML = '';
|
list.innerHTML = '';
|
||||||
$('relink-summary').classList.add('hidden');
|
$('relink-summary').classList.add('hidden');
|
||||||
$('relink-start-btn').disabled = true;
|
$('relink-start-btn').disabled = true;
|
||||||
|
|
||||||
if (!resolved.length) {
|
if (!resolved.length) {
|
||||||
list.innerHTML = '<div class="empty muted">No clips in active sequence</div>';
|
list.innerHTML = '<div class="empty muted">No clips in active sequence</div>';
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -330,8 +315,7 @@
|
||||||
cb.disabled = !matched; cb.checked = matched;
|
cb.disabled = !matched; cb.checked = matched;
|
||||||
cb.addEventListener('change', _syncRelinkStart);
|
cb.addEventListener('change', _syncRelinkStart);
|
||||||
const lbl = document.createElement('label');
|
const lbl = document.createElement('label');
|
||||||
lbl.htmlFor = 'rclip-' + i;
|
lbl.htmlFor = 'rclip-' + i; lbl.className = 'clip-item-name';
|
||||||
lbl.className = 'clip-item-name';
|
|
||||||
lbl.textContent = clip.fileName || 'clip';
|
lbl.textContent = clip.fileName || 'clip';
|
||||||
const st = document.createElement('span');
|
const st = document.createElement('span');
|
||||||
st.className = 'clip-item-status';
|
st.className = 'clip-item-status';
|
||||||
|
|
@ -340,26 +324,23 @@
|
||||||
list.appendChild(row);
|
list.appendChild(row);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
UI.openSlide('relink-overlay', 'relink-panel');
|
UI.openSlide('relink-overlay', 'relink-panel');
|
||||||
_syncRelinkStart();
|
_syncRelinkStart();
|
||||||
}
|
}
|
||||||
|
|
||||||
function _syncRelinkStart() {
|
function _syncRelinkStart() {
|
||||||
const any = !!document.querySelector('#clip-list input[type="checkbox"]:checked');
|
$('relink-start-btn').disabled = !document.querySelector('#clip-list input[type="checkbox"]:checked');
|
||||||
$('relink-start-btn').disabled = !any;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function wireRelinkPanel() {
|
function wireRelinkPanel() {
|
||||||
$('relink-close-btn').addEventListener('click', () => UI.closeSlide('relink-overlay', 'relink-panel'));
|
$('relink-close-btn').addEventListener('click', () => UI.closeSlide('relink-overlay', 'relink-panel'));
|
||||||
$('relink-cancel-btn').addEventListener('click', () => UI.closeSlide('relink-overlay', 'relink-panel'));
|
$('relink-cancel-btn').addEventListener('click', () => UI.closeSlide('relink-overlay', 'relink-panel'));
|
||||||
$('relink-overlay').addEventListener('click', () => UI.closeSlide('relink-overlay', 'relink-panel'));
|
$('relink-overlay').addEventListener('click', () => UI.closeSlide('relink-overlay', 'relink-panel'));
|
||||||
|
|
||||||
$('relink-start-btn').addEventListener('click', async () => {
|
$('relink-start-btn').addEventListener('click', async () => {
|
||||||
const checked = document.querySelectorAll('#clip-list input[type="checkbox"]:checked');
|
const checked = document.querySelectorAll('#clip-list input[type="checkbox"]:checked');
|
||||||
const selected = [];
|
const selected = [];
|
||||||
checked.forEach(cb => {
|
checked.forEach(cb => {
|
||||||
const i = parseInt(cb.id.replace('rclip-',''), 10);
|
const i = parseInt(cb.id.replace('rclip-', ''), 10);
|
||||||
if (_relinkClips[i] && _relinkClips[i].asset_id) selected.push(_relinkClips[i]);
|
if (_relinkClips[i] && _relinkClips[i].asset_id) selected.push(_relinkClips[i]);
|
||||||
});
|
});
|
||||||
if (!selected.length) return;
|
if (!selected.length) return;
|
||||||
|
|
@ -368,25 +349,17 @@
|
||||||
try {
|
try {
|
||||||
const res = await Timeline.batchRelink(selected);
|
const res = await Timeline.batchRelink(selected);
|
||||||
UI.hideProgress();
|
UI.hideProgress();
|
||||||
const msg = res.succeeded + ' clip(s) relinked' + (res.failed ? ', ' + res.failed + ' failed' : '');
|
UI.toast(res.succeeded + ' relinked' + (res.failed ? ', ' + res.failed + ' failed' : ''), res.failed ? 'error' : 'ok');
|
||||||
UI.toast(msg, res.failed ? 'error' : 'ok');
|
|
||||||
} catch (e) { UI.hideProgress(); UI.toast('Batch relink failed: ' + e.message, 'error'); }
|
} catch (e) { UI.hideProgress(); UI.toast('Batch relink failed: ' + e.message, 'error'); }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Init ──────────────────────────────────────────────────────────
|
// ── Init ──────────────────────────────────────────────────────────
|
||||||
function init() {
|
function init() {
|
||||||
wireConnectPane();
|
wireConnectPane(); wireLibraryPane();
|
||||||
wireLibraryPane();
|
wireExportPanel(); wireConformPanel(); wireRelinkPanel();
|
||||||
wireExportPanel();
|
if (API.state.serverUrl && API.state.apiToken) tryConnect(API.state.serverUrl, API.state.apiToken);
|
||||||
wireConformPanel();
|
else UI.showPane('connect');
|
||||||
wireRelinkPanel();
|
|
||||||
|
|
||||||
if (API.state.serverUrl && API.state.apiToken) {
|
|
||||||
tryConnect(API.state.serverUrl, API.state.apiToken);
|
|
||||||
} else {
|
|
||||||
UI.showPane('connect');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
|
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue