dragonflight/services/premiere-plugin-uxp
Claude 540d333758 feat(uxp): v2.2.1 — Export Timeline is now one-click push + render → asset
Contract: clicking Export Timeline does the whole pipeline with no
prompts. Behavior matches what the user actually expected from the
button label:

  1. readActiveSequence — pulls the Premiere timeline + clip map
  2. resolveExportProject — picks the target MAM project. First run
     uses the first project on the server and caches its id in
     localStorage (df.uxp.exportProjectId). Subsequent runs reuse
     the cache. If the cached project was deleted server-side we
     transparently re-pick.
  3. Timeline.startConform with sensible defaults:
       codec=prores_hq, quality=high, resolution=source, audio=broadcast
     This both pushes the sequence + clip rows AND queues a real
     conform job (the prior Push-to-MAM button never queued a job,
     which is why "no jobs spin up" happened earlier).
  4. pollConform every 2s, mapping job progress 20→95% on the
     panel progress bar.
  5. On completion, toast + Library.refresh() so the rendered hi-res
     asset shows up in the grid without needing to click around.

The Conform slide panel stays wired for Advanced → Export & Conform
so power users can still override the codec/preset for one-off jobs.
The Push-only slide panel that this replaces is now orphaned chrome
and will be removed in a later cleanup.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 13:28:51 -04:00
..
src feat(uxp): v2.2.1 — Export Timeline is now one-click push + render → asset 2026-05-28 13:28:51 -04:00
dragonflight-mam-2.1.0.ccx UXP v2.1.0 release artifact 2026-05-28 02:21:36 -04:00
dragonflight-mam-2.1.1.ccx UXP v2.1.1 release artifact 2026-05-28 02:25:30 -04:00
dragonflight-mam-2.1.2.ccx UXP v2.1.2 release artifact 2026-05-28 07:20:14 -04:00
dragonflight-mam-2.1.3.ccx UXP v2.1.3 release artifact 2026-05-28 07:50:52 -04:00
dragonflight-mam-2.1.4.ccx UXP v2.1.4 release artifact 2026-05-28 08:32:55 -04:00
dragonflight-mam-2.1.5.ccx UXP v2.1.5 release artifact 2026-05-28 09:07:15 -04:00
dragonflight-mam-2.1.5b.ccx UXP v2.1.5b: main.js relink handler await fix + artifact 2026-05-28 09:15:24 -04:00
dragonflight-mam-2.1.6.ccx release(uxp): v2.1.6 — fix thumbnail auth (bearer fetch + blob URL) 2026-05-28 09:53:34 -04:00
dragonflight-mam-2.1.7.ccx release(uxp): v2.1.7 — fix resource busy + export timeline robustness 2026-05-28 11:12:49 -04:00
index.html ui(uxp): v2.2.0 — density pass: drop details panel, tighter buttons, collapsible Advanced 2026-05-28 13:03:56 -04:00
manifest.json feat(uxp): v2.2.1 — Export Timeline is now one-click push + render → asset 2026-05-28 13:28:51 -04:00
README.md feat(premiere-plugin-uxp): v2.0.0 — UXP port replacing CEP for import 2026-05-28 00:19:28 -04:00
styles.css ui(uxp): v2.2.0 — density pass: drop details panel, tighter buttons, collapsible Advanced 2026-05-28 13:03:56 -04:00

Dragonflight MAM — Premiere Pro UXP panel (v2.0.0)

The successor to the CEP panel at services/premiere-plugin/.

Why this exists: Premiere Pro 26.0.x broke csInterface.evalScript's return-value callback — it no longer fires. That deadlocks any CEP panel that needs to call back into Premiere (importFiles, sequence access, etc). Adobe's path forward is UXP; this panel is the minimum viable port that restores the Import Proxy / Import Hi-Res workflow.

Scope (v2.0.0)

In:

  • Connect to a Dragonflight server (URL + Bearer token, persisted in localStorage)
  • Browse the asset library (search, refresh, grid with thumbnails)
  • Import Proxy — downloads the proxy MP4 and adds it to the active project
  • Import Hi-Res — downloads the original from S3 (presigned URL) and imports

Out (carried over from the CEP panel later, as v2.x):

  • Mount Live (SMB live preview)
  • Conform / Auto-Relink / Batch Trim
  • Timeline export
  • Settings tabs (Account, Tokens, S3) — use the web UI for now

Project layout

manifest.json     UXP manifest v5 (host=premierepro, minVersion=26.0.0)
index.html        Panel shell (vanilla HTML)
styles.css        Mirrors the web UI's dark design tokens
src/
  ui.js           DOM helpers, toast, progress, formatting
  api.js          Dragonflight HTTP client (Bearer auth, redirect handling)
  library.js      Asset grid render + selection
  import-flow.js  Download (streamed) + Premiere importFiles
  main.js         Bootstrap, event wiring
icons/            DarkIcon.png + LightIcon.png  (23x23, optional)
build/pack.mjs    Pack into .ccx for install

Build

Requires Node 18+.

cd services/premiere-plugin-uxp
node build/pack.mjs
# → build/dist/dragonflight-mam-2.0.0.ccx

(Uses system zip. On Windows hosts use Compress-Archive — error message shows the exact command.)

Install on Windows

Prerequisite: Premiere Pro Preferences > Plugins > Enable developer mode must be toggled on (one-time, per machine). This is required for any UXP plugin not distributed via Creative Cloud Marketplace.

& "C:\Program Files\Common Files\Adobe\Adobe Desktop Common\RemoteComponents\UPI\UnifiedPluginInstallerAgent\UnifiedPluginInstallerAgent.exe" /install "C:\path\to\dragonflight-mam-2.0.0.ccx"

That writes to %APPDATA%\Adobe\UXP\Plugins\External\net.wilddragon.dragonflight.uxp\ and registers the plugin with UPIA.

To uninstall:

& "...\UnifiedPluginInstallerAgent.exe" /remove net.wilddragon.dragonflight.uxp

Open the panel in Premiere via Window > Extensions > Dragonflight MAM.

Development loop (Adobe UXP Developer Tool)

For iterative dev without rebuilding+reinstalling:

  1. Install Adobe UXP Developer Tool ("UDT") from Creative Cloud.
  2. UDT → Add Plugin → point at this folder.
  3. Load → opens the panel in Premiere with hot-reload.

Known limits

  • Adobe strips Authorization headers on cross-origin redirects. import-flow.js uses redirect: 'manual' and drops the Bearer when hopping to a different host (e.g. when the server 302s us to the S3 endpoint).
  • Project.importFiles() returns a boolean, not the new ProjectItem. To locate the imported item, Import.locateImported(project, filename) does a rootItem.getItems() diff after import.
  • UXP's os.tmpdir() resolves to Windows %TEMP% which is cleared by Disk Cleanup. For long-lived downloads, persist explicitly elsewhere.