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>
62 lines
2.4 KiB
HTML
62 lines
2.4 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<title>Dragonflight MAM</title>
|
|
<link rel="stylesheet" href="styles.css" />
|
|
</head>
|
|
<body>
|
|
<div id="root">
|
|
<!-- Connection bar (visible when disconnected) -->
|
|
<section id="connect-pane" class="pane">
|
|
<div class="brand">
|
|
<div class="brand-title">Dragonflight</div>
|
|
<div class="brand-tag">Wild Dragon Broadcast</div>
|
|
</div>
|
|
<label class="label" for="server-url">Server URL</label>
|
|
<input id="server-url" type="text" placeholder="https://dragonflight.live" />
|
|
<label class="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 muted"></div>
|
|
</section>
|
|
|
|
<!-- Connected: library + actions -->
|
|
<section id="library-pane" class="pane hidden">
|
|
<header class="connected-bar">
|
|
<span class="dot dot-ok"></span>
|
|
<span id="connected-host" class="connected-host"></span>
|
|
<button id="disconnect-btn" class="btn btn-link">Disconnect</button>
|
|
</header>
|
|
|
|
<div class="library-controls">
|
|
<input id="search-input" type="search" placeholder="Search assets…" />
|
|
<button id="refresh-btn" class="btn btn-icon" title="Refresh">↻</button>
|
|
</div>
|
|
|
|
<div id="asset-grid" class="asset-grid">
|
|
<div class="empty muted">Loading…</div>
|
|
</div>
|
|
|
|
<footer class="actions">
|
|
<div id="selected-info" class="selected-info muted">No asset selected</div>
|
|
<div class="action-row">
|
|
<button id="import-proxy-btn" class="btn btn-primary" disabled>Import Proxy</button>
|
|
<button id="import-hires-btn" class="btn btn-secondary" disabled>Hi-Res</button>
|
|
</div>
|
|
<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>
|
|
</footer>
|
|
</section>
|
|
</div>
|
|
|
|
<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/main.js"></script>
|
|
</body>
|
|
</html>
|