feat(premiere-plugin-uxp): v2.0.0 — UXP port replacing CEP for import
CEP `csInterface.evalScript` callback is broken in Premiere Pro 26.0.x —
nothing called from the panel ever returns, so importFiles deadlocks. Adobe's
path forward is UXP. This is the minimum viable port that restores the
Import Proxy / Import Hi-Res workflow.
Scope (v2.0.0):
- Connect to a Dragonflight server (URL + Bearer token; persisted)
- Asset library (search, refresh, grid with thumbnails)
- Import Proxy via streamed download → Project.importFiles
- Import Hi-Res via presigned S3 URL → Project.importFiles
Layout:
manifest.json UXP v5, host=premierepro, minVersion=26.0.0
index.html Panel shell
styles.css Mirrors web UI dark tokens
src/ui.js DOM helpers, toast, progress, formatting
src/api.js HTTP client (Bearer; manual redirect-follow drops auth
when hopping to a different host per UXP security policy)
src/library.js Asset grid render + selection
src/import-flow.js Streaming download (fs.createWriteStream) +
premierepro.Project.importFiles into rootBin
src/main.js Bootstrap, event wiring
build/pack.mjs Packs into .ccx; installs via UnifiedPluginInstallerAgent
Coexists with services/premiere-plugin/ (CEP) — keeps the CEP panel for any
features that still work there while running v2.0.0 for import. Future v2.x
will add live preview, conform, timeline export, settings.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 00:19:28 -04:00
|
|
|
|
<!doctype html>
|
|
|
|
|
|
<html lang="en">
|
|
|
|
|
|
<head>
|
|
|
|
|
|
<meta charset="utf-8" />
|
|
|
|
|
|
<title>Dragonflight MAM</title>
|
|
|
|
|
|
<link rel="stylesheet" href="styles.css" />
|
|
|
|
|
|
</head>
|
|
|
|
|
|
<body>
|
2026-05-28 00:56:15 -04:00
|
|
|
|
<div id="root">
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── Connect Pane ─────────────────────────────────────────────── -->
|
2026-05-28 17:57:26 -04:00
|
|
|
|
<section id="connect-pane" class="pane pane-connect">
|
2026-05-28 00:56:15 -04:00
|
|
|
|
<div class="brand">
|
|
|
|
|
|
<div class="brand-icon">
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="28" height="28" viewBox="0 0 24 24"><path fill="currentColor" d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/></svg>
|
feat(premiere-plugin-uxp): v2.0.0 — UXP port replacing CEP for import
CEP `csInterface.evalScript` callback is broken in Premiere Pro 26.0.x —
nothing called from the panel ever returns, so importFiles deadlocks. Adobe's
path forward is UXP. This is the minimum viable port that restores the
Import Proxy / Import Hi-Res workflow.
Scope (v2.0.0):
- Connect to a Dragonflight server (URL + Bearer token; persisted)
- Asset library (search, refresh, grid with thumbnails)
- Import Proxy via streamed download → Project.importFiles
- Import Hi-Res via presigned S3 URL → Project.importFiles
Layout:
manifest.json UXP v5, host=premierepro, minVersion=26.0.0
index.html Panel shell
styles.css Mirrors web UI dark tokens
src/ui.js DOM helpers, toast, progress, formatting
src/api.js HTTP client (Bearer; manual redirect-follow drops auth
when hopping to a different host per UXP security policy)
src/library.js Asset grid render + selection
src/import-flow.js Streaming download (fs.createWriteStream) +
premierepro.Project.importFiles into rootBin
src/main.js Bootstrap, event wiring
build/pack.mjs Packs into .ccx; installs via UnifiedPluginInstallerAgent
Coexists with services/premiere-plugin/ (CEP) — keeps the CEP panel for any
features that still work there while running v2.0.0 for import. Future v2.x
will add live preview, conform, timeline export, settings.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 00:19:28 -04:00
|
|
|
|
</div>
|
2026-05-28 00:56:15 -04:00
|
|
|
|
<div class="brand-title">Dragonflight</div>
|
|
|
|
|
|
<div class="brand-tag">Wild Dragon Broadcast</div>
|
2026-05-28 12:00:50 -04:00
|
|
|
|
<div class="brand-version" id="brand-version"></div>
|
2026-05-28 00:56:15 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
<label class="field-label" for="server-url">Server URL</label>
|
|
|
|
|
|
<input id="server-url" type="text" placeholder="https://dragonflight.live" />
|
|
|
|
|
|
<label class="field-label" for="api-token">API Token</label>
|
|
|
|
|
|
<input id="api-token" type="password" placeholder="Bearer token from web UI" autocomplete="off" />
|
|
|
|
|
|
<button id="connect-btn" class="btn btn-primary" disabled>Connect</button>
|
|
|
|
|
|
<div id="connect-status" class="status-msg muted"></div>
|
|
|
|
|
|
</section>
|
|
|
|
|
|
|
2026-05-28 17:57:26 -04:00
|
|
|
|
<!-- ── Library Pane (app-shell: statusbar · rail · main · dock) ──── -->
|
2026-05-28 00:56:15 -04:00
|
|
|
|
<section id="library-pane" class="pane hidden">
|
2026-05-28 17:57:26 -04:00
|
|
|
|
<div class="app">
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Connection collapsed to a status line: dot + host + version + ⋯ -->
|
|
|
|
|
|
<header class="statusbar">
|
|
|
|
|
|
<span class="signal-dot"></span>
|
|
|
|
|
|
<span id="connected-host" class="connected-host"></span>
|
|
|
|
|
|
<span id="panel-version" class="panel-version" title="Plugin version"></span>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
<div id="menu-btn" role="button" tabindex="0" class="iconbtn iconbtn--sm" data-tip="More" data-tip-pos="down-left" aria-label="More">
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="15" height="15" viewBox="0 0 24 24"><path fill="currentColor" d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
<div id="status-menu" class="menu hidden" role="menu">
|
|
|
|
|
|
<button id="disconnect-btn" class="menu-item" role="menuitem">Disconnect</button>
|
2026-05-28 13:03:56 -04:00
|
|
|
|
</div>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="workspace">
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Vertical icon rail: views on top, global actions below -->
|
|
|
|
|
|
<nav class="rail">
|
2026-05-28 22:55:45 -04:00
|
|
|
|
<div id="tab-library" role="button" tabindex="0" class="rail-btn active" data-tip="Library" data-tip-pos="right">
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="18" height="18" viewBox="0 0 24 24"><rect x="3" y="3" width="7.5" height="7.5" rx="1.5" fill="currentColor"/><rect x="13.5" y="3" width="7.5" height="7.5" rx="1.5" fill="currentColor"/><rect x="3" y="13.5" width="7.5" height="7.5" rx="1.5" fill="currentColor"/><rect x="13.5" y="13.5" width="7.5" height="7.5" rx="1.5" fill="currentColor"/></svg>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
<div id="tab-growing" role="button" tabindex="0" class="rail-btn" data-tip="Growing" data-tip-pos="right">
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="18" height="18" viewBox="0 0 24 24"><path fill="currentColor" d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/></svg>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
<span id="growing-count" class="rail-count" style="display:none">0</span>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
|
|
|
|
|
|
<span class="rail-spacer"></span>
|
|
|
|
|
|
|
2026-05-28 23:48:30 -04:00
|
|
|
|
<div id="export-timeline-btn" role="button" tabindex="0" class="rail-btn rail-btn--accent" data-tip="Export" data-tip-pos="right">
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="18" height="18" viewBox="0 0 24 24"><path fill="currentColor" d="M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z"/></svg>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
<div id="refresh-btn" role="button" tabindex="0" class="rail-btn" data-tip="Refresh" data-tip-pos="right">
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="18" height="18" viewBox="0 0 24 24"><path fill="currentColor" d="M17.65 6.35A7.96 7.96 0 0 0 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08A5.99 5.99 0 0 1 12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/></svg>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
</nav>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Main column -->
|
|
|
|
|
|
<div class="main">
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Search + project filter -->
|
|
|
|
|
|
<div class="toolbar">
|
|
|
|
|
|
<label class="search">
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="13" height="13" viewBox="0 0 24 24"><path fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 0 0 1.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.5 6.5 0 0 0-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 0 0 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></svg>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
<input id="search-input" type="search" placeholder="Search assets" />
|
|
|
|
|
|
</label>
|
|
|
|
|
|
<select id="project-filter" class="filter-select" title="Filter by project">
|
|
|
|
|
|
<option value="all">All Projects</option>
|
|
|
|
|
|
</select>
|
2026-05-28 23:05:52 -04:00
|
|
|
|
<div id="view-toggle-btn" role="button" tabindex="0" class="iconbtn iconbtn--sm" data-tip="Grid view" data-tip-pos="down-left" aria-label="Toggle layout">
|
|
|
|
|
|
<svg width="15" height="15" viewBox="0 0 24 24"><path fill="currentColor" d="M4 11h5V5H4v6zm0 7h5v-6H4v6zm6 0h5v-6h-5v6zm6 0h5v-6h-5v6zm-6-7h5V5h-5v6zm6-6v6h5V5h-5z"/></svg>
|
|
|
|
|
|
</div>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Active sequence info bar -->
|
|
|
|
|
|
<div id="seq-info-bar" class="seq-info-bar hidden">
|
|
|
|
|
|
<span class="chip chip-ok">SEQ</span>
|
|
|
|
|
|
<span id="seq-info-name" class="seq-info-name"></span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Asset grid (library tab) -->
|
|
|
|
|
|
<div id="library-container" class="grid-container">
|
|
|
|
|
|
<div id="asset-grid" class="asset-grid">
|
|
|
|
|
|
<div class="empty muted">Loading…</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Growing grid -->
|
|
|
|
|
|
<div id="growing-container" class="grid-container hidden">
|
|
|
|
|
|
<div id="growing-grid" class="asset-grid">
|
|
|
|
|
|
<div class="empty muted">No growing files</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Details panel retired (v2.2.0) — card meta carries name/codec/duration. -->
|
|
|
|
|
|
<div id="details-panel" class="hidden"></div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Progress + toast sit just above the action dock -->
|
|
|
|
|
|
<div id="progress-row" class="progress-row hidden">
|
|
|
|
|
|
<div class="progress-bar"><div id="progress-fill"></div></div>
|
|
|
|
|
|
<div id="progress-label" class="progress-label">…</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div id="toast" class="toast hidden"></div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Contextual action dock: text buttons replaced by icon buttons
|
|
|
|
|
|
with hover labels. Per-asset actions left, batch actions right. -->
|
|
|
|
|
|
<footer class="dock">
|
2026-05-28 22:55:45 -04:00
|
|
|
|
<div id="import-proxy-btn" role="button" tabindex="0" class="iconbtn iconbtn--primary" data-tip="Import Proxy" data-tip-pos="up" disabled>
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></svg>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
<div id="import-hires-btn" role="button" tabindex="0" class="iconbtn" data-tip="Import Hi-Res" data-tip-pos="up" disabled>
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M11.99 18.54l-7.37-5.73L3 14.07l9 7 9-7-1.63-1.27-7.38 5.74zM12 16l7.36-5.73L21 9l-9-7-9 7 1.63 1.27L12 16z"/></svg>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
<div id="mount-live-btn" role="button" tabindex="0" class="iconbtn" data-tip="Mount Live" data-tip-pos="up" disabled>
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M14 12c0 1.11-.89 2-2 2s-2-.89-2-2 .89-2 2-2 2 .89 2 2zm-2-6c-3.31 0-6 2.69-6 6 0 2.22 1.21 4.15 3 5.19l1-1.74A3.98 3.98 0 0 1 8 12c0-2.21 1.79-4 4-4s4 1.79 4 4c0 1.48-.81 2.75-2 3.45l1 1.74c1.79-1.04 3-2.97 3-5.19 0-3.31-2.69-6-6-6zm0-4C7.58 2 4 5.58 4 10c0 2.96 1.61 5.53 4 6.92l1-1.73C7.21 14.07 6 12.18 6 10c0-3.31 2.69-6 6-6s6 2.69 6 6c0 2.18-1.21 4.07-3 5.19l1 1.73c2.39-1.39 4-3.96 4-6.92 0-4.42-3.58-8-8-8z"/></svg>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
<div id="relink-btn" role="button" tabindex="0" class="iconbtn" data-tip="Relink Hi-Res" data-tip-pos="up" disabled>
|
2026-05-28 20:44:50 -04:00
|
|
|
|
<svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
|
|
|
|
|
|
<span class="dock-sep"></span>
|
|
|
|
|
|
|
2026-05-28 23:48:30 -04:00
|
|
|
|
<div id="upload-mam-btn" role="button" tabindex="0" class="iconbtn" data-tip="Upload to MAM" data-tip-pos="up-left">
|
|
|
|
|
|
<svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M19.35 10.04A7.49 7.49 0 0 0 12 4C9.11 4 6.6 5.64 5.35 8.04A5.994 5.994 0 0 0 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"/></svg>
|
2026-05-28 22:55:45 -04:00
|
|
|
|
</div>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
</footer>
|
|
|
|
|
|
|
|
|
|
|
|
</div><!-- /main -->
|
|
|
|
|
|
</div><!-- /workspace -->
|
|
|
|
|
|
</div><!-- /app -->
|
2026-05-28 00:56:15 -04:00
|
|
|
|
</section>
|
feat(premiere-plugin-uxp): v2.0.0 — UXP port replacing CEP for import
CEP `csInterface.evalScript` callback is broken in Premiere Pro 26.0.x —
nothing called from the panel ever returns, so importFiles deadlocks. Adobe's
path forward is UXP. This is the minimum viable port that restores the
Import Proxy / Import Hi-Res workflow.
Scope (v2.0.0):
- Connect to a Dragonflight server (URL + Bearer token; persisted)
- Asset library (search, refresh, grid with thumbnails)
- Import Proxy via streamed download → Project.importFiles
- Import Hi-Res via presigned S3 URL → Project.importFiles
Layout:
manifest.json UXP v5, host=premierepro, minVersion=26.0.0
index.html Panel shell
styles.css Mirrors web UI dark tokens
src/ui.js DOM helpers, toast, progress, formatting
src/api.js HTTP client (Bearer; manual redirect-follow drops auth
when hopping to a different host per UXP security policy)
src/library.js Asset grid render + selection
src/import-flow.js Streaming download (fs.createWriteStream) +
premierepro.Project.importFiles into rootBin
src/main.js Bootstrap, event wiring
build/pack.mjs Packs into .ccx; installs via UnifiedPluginInstallerAgent
Coexists with services/premiere-plugin/ (CEP) — keeps the CEP panel for any
features that still work there while running v2.0.0 for import. Future v2.x
will add live preview, conform, timeline export, settings.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 00:19:28 -04:00
|
|
|
|
|
2026-05-28 23:57:54 -04:00
|
|
|
|
<!-- Full-panel Export screen -->
|
|
|
|
|
|
<div id="export-screen" class="screen hidden">
|
|
|
|
|
|
<div class="screen-header">
|
|
|
|
|
|
<span class="screen-title">Export</span>
|
|
|
|
|
|
<button id="export-screen-close" class="btn btn-icon">✕</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="screen-body">
|
|
|
|
|
|
<div id="opt-conform" role="button" tabindex="0" class="export-option">
|
|
|
|
|
|
<div class="eo-icon">
|
|
|
|
|
|
<svg width="22" height="22" viewBox="0 0 24 24"><path fill="currentColor" d="M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z"/></svg>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="eo-text">
|
|
|
|
|
|
<div class="eo-title">Conform Timeline → MAM</div>
|
|
|
|
|
|
<div class="eo-desc">Render the sequence to a chosen codec and push it to the MAM</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<span class="eo-arrow">›</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div id="opt-local-export" role="button" tabindex="0" class="export-option">
|
|
|
|
|
|
<div class="eo-icon">
|
|
|
|
|
|
<svg width="22" height="22" viewBox="0 0 24 24"><path fill="currentColor" d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></svg>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="eo-text">
|
|
|
|
|
|
<div class="eo-title">Local Export</div>
|
|
|
|
|
|
<div class="eo-desc">Trim the hi-res sources on the MAM, download and relink them in Premiere</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<span class="eo-arrow">›</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-05-28 23:48:30 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── (retired) Push Timeline Slide Panel — kept hidden/unused ──── -->
|
2026-05-28 00:56:15 -04:00
|
|
|
|
<div id="export-overlay" class="slide-overlay hidden"></div>
|
|
|
|
|
|
<div id="export-panel" class="slide-panel hidden">
|
|
|
|
|
|
<div class="slide-header">
|
|
|
|
|
|
<span class="slide-title">Push Timeline to MAM</span>
|
|
|
|
|
|
<button id="export-close-btn" class="btn btn-icon">✕</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="slide-body">
|
|
|
|
|
|
<label class="field-label">Sequence name</label>
|
|
|
|
|
|
<input id="export-seq-name" type="text" placeholder="Sequence 1" />
|
|
|
|
|
|
<label class="field-label">Target project</label>
|
|
|
|
|
|
<select id="export-proj-select"><option value="">— Select project —</option></select>
|
|
|
|
|
|
<div id="export-clip-info" class="clip-info"></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="slide-footer">
|
|
|
|
|
|
<button id="export-cancel-btn" class="btn btn-secondary">Cancel</button>
|
|
|
|
|
|
<button id="export-confirm-btn" class="btn btn-primary">Push to MAM</button>
|
|
|
|
|
|
</div>
|
feat(premiere-plugin-uxp): v2.0.0 — UXP port replacing CEP for import
CEP `csInterface.evalScript` callback is broken in Premiere Pro 26.0.x —
nothing called from the panel ever returns, so importFiles deadlocks. Adobe's
path forward is UXP. This is the minimum viable port that restores the
Import Proxy / Import Hi-Res workflow.
Scope (v2.0.0):
- Connect to a Dragonflight server (URL + Bearer token; persisted)
- Asset library (search, refresh, grid with thumbnails)
- Import Proxy via streamed download → Project.importFiles
- Import Hi-Res via presigned S3 URL → Project.importFiles
Layout:
manifest.json UXP v5, host=premierepro, minVersion=26.0.0
index.html Panel shell
styles.css Mirrors web UI dark tokens
src/ui.js DOM helpers, toast, progress, formatting
src/api.js HTTP client (Bearer; manual redirect-follow drops auth
when hopping to a different host per UXP security policy)
src/library.js Asset grid render + selection
src/import-flow.js Streaming download (fs.createWriteStream) +
premierepro.Project.importFiles into rootBin
src/main.js Bootstrap, event wiring
build/pack.mjs Packs into .ccx; installs via UnifiedPluginInstallerAgent
Coexists with services/premiere-plugin/ (CEP) — keeps the CEP panel for any
features that still work there while running v2.0.0 for import. Future v2.x
will add live preview, conform, timeline export, settings.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 00:19:28 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-05-28 00:56:15 -04:00
|
|
|
|
<!-- ── Export & Conform Slide Panel ─────────────────────────────── -->
|
|
|
|
|
|
<div id="conform-overlay" class="slide-overlay hidden"></div>
|
|
|
|
|
|
<div id="conform-panel" class="slide-panel hidden">
|
|
|
|
|
|
<div class="slide-header">
|
|
|
|
|
|
<span class="slide-title">Export & Conform</span>
|
|
|
|
|
|
<button id="conform-close-btn" class="btn btn-icon">✕</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="slide-body">
|
2026-05-28 02:24:58 -04:00
|
|
|
|
<label class="field-label">Target project</label>
|
|
|
|
|
|
<select id="conform-proj-select"><option value="">— Select project —</option></select>
|
2026-05-28 23:13:15 -04:00
|
|
|
|
<label class="field-label">Format</label>
|
|
|
|
|
|
<div id="preset-cards" class="preset-list">
|
|
|
|
|
|
<div class="preset-card selected" data-preset="broadcast"><span class="pc-title">Broadcast</span><span class="pc-desc">ProRes 422 HQ · 1080p</span></div>
|
|
|
|
|
|
<div class="preset-card" data-preset="web"><span class="pc-title">Web</span><span class="pc-desc">H.264 · 1080p · AAC</span></div>
|
|
|
|
|
|
<div class="preset-card" data-preset="archive"><span class="pc-title">Archive</span><span class="pc-desc">ProRes 4444 · UHD</span></div>
|
|
|
|
|
|
<div class="preset-card" data-preset="custom"><span class="pc-title">Custom</span><span class="pc-desc">Manual settings</span></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div id="conform-custom" class="custom-fields hidden">
|
|
|
|
|
|
<label class="field-label">Codec</label>
|
|
|
|
|
|
<select id="conform-codec">
|
|
|
|
|
|
<option value="prores_hq">ProRes 422 HQ</option>
|
|
|
|
|
|
<option value="prores_4444">ProRes 4444</option>
|
|
|
|
|
|
<option value="h264">H.264</option>
|
|
|
|
|
|
<option value="h265">H.265 / HEVC</option>
|
|
|
|
|
|
<option value="dnxhr_hq">DNxHR HQ</option>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
<label class="field-label">Quality</label>
|
|
|
|
|
|
<select id="conform-quality">
|
|
|
|
|
|
<option value="high">High</option>
|
|
|
|
|
|
<option value="medium" selected>Medium</option>
|
|
|
|
|
|
<option value="low">Low</option>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
<label class="field-label">Resolution</label>
|
|
|
|
|
|
<select id="conform-resolution">
|
|
|
|
|
|
<option value="uhd">UHD (3840×2160)</option>
|
|
|
|
|
|
<option value="1080p" selected>Full HD (1920×1080)</option>
|
|
|
|
|
|
<option value="720p">HD (1280×720)</option>
|
|
|
|
|
|
<option value="source">Source</option>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
<label class="field-label">Audio</label>
|
|
|
|
|
|
<select id="conform-audio">
|
|
|
|
|
|
<option value="broadcast">Broadcast (48kHz PCM)</option>
|
|
|
|
|
|
<option value="web">Web (AAC 320k)</option>
|
|
|
|
|
|
<option value="archive">Archive (96kHz PCM)</option>
|
|
|
|
|
|
</select>
|
2026-05-28 00:56:15 -04:00
|
|
|
|
</div>
|
|
|
|
|
|
<div id="conform-clip-info" class="clip-info"></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="slide-footer">
|
|
|
|
|
|
<button id="conform-cancel-btn" class="btn btn-secondary">Cancel</button>
|
|
|
|
|
|
<button id="conform-start-btn" class="btn btn-primary" disabled>Start Conform</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── Fetch & Relink Slide Panel ───────────────────────────────── -->
|
|
|
|
|
|
<div id="relink-overlay" class="slide-overlay hidden"></div>
|
|
|
|
|
|
<div id="relink-panel" class="slide-panel hidden">
|
|
|
|
|
|
<div class="slide-header">
|
|
|
|
|
|
<span class="slide-title">Fetch & Relink Hi-Res</span>
|
|
|
|
|
|
<button id="relink-close-btn" class="btn btn-icon">✕</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="slide-body">
|
|
|
|
|
|
<div class="field-label" style="margin-bottom:6px">Select clips to upgrade to hi-res:</div>
|
|
|
|
|
|
<div id="clip-list" class="clip-list"></div>
|
|
|
|
|
|
<div id="relink-summary" class="relink-summary hidden"></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="slide-footer">
|
|
|
|
|
|
<button id="relink-cancel-btn" class="btn btn-secondary">Cancel</button>
|
|
|
|
|
|
<button id="relink-start-btn" class="btn btn-primary" disabled>Start Relink</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
</div><!-- /#root -->
|
|
|
|
|
|
|
|
|
|
|
|
<script src="src/ui.js"></script>
|
|
|
|
|
|
<script src="src/api.js"></script>
|
|
|
|
|
|
<script src="src/library.js"></script>
|
|
|
|
|
|
<script src="src/import-flow.js"></script>
|
|
|
|
|
|
<script src="src/timeline.js"></script>
|
2026-05-28 17:57:26 -04:00
|
|
|
|
<script src="src/tooltip.js"></script>
|
2026-05-28 00:56:15 -04:00
|
|
|
|
<script src="src/main.js"></script>
|
feat(premiere-plugin-uxp): v2.0.0 — UXP port replacing CEP for import
CEP `csInterface.evalScript` callback is broken in Premiere Pro 26.0.x —
nothing called from the panel ever returns, so importFiles deadlocks. Adobe's
path forward is UXP. This is the minimum viable port that restores the
Import Proxy / Import Hi-Res workflow.
Scope (v2.0.0):
- Connect to a Dragonflight server (URL + Bearer token; persisted)
- Asset library (search, refresh, grid with thumbnails)
- Import Proxy via streamed download → Project.importFiles
- Import Hi-Res via presigned S3 URL → Project.importFiles
Layout:
manifest.json UXP v5, host=premierepro, minVersion=26.0.0
index.html Panel shell
styles.css Mirrors web UI dark tokens
src/ui.js DOM helpers, toast, progress, formatting
src/api.js HTTP client (Bearer; manual redirect-follow drops auth
when hopping to a different host per UXP security policy)
src/library.js Asset grid render + selection
src/import-flow.js Streaming download (fs.createWriteStream) +
premierepro.Project.importFiles into rootBin
src/main.js Bootstrap, event wiring
build/pack.mjs Packs into .ccx; installs via UnifiedPluginInstallerAgent
Coexists with services/premiere-plugin/ (CEP) — keeps the CEP panel for any
features that still work there while running v2.0.0 for import. Future v2.x
will add live preview, conform, timeline export, settings.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 00:19:28 -04:00
|
|
|
|
</body>
|
|
|
|
|
|
</html>
|