ClipShuttle
I shipped an open-source Adobe Premiere Pro CEP panel for Premiere 2020 to 2025 on macOS. It imports YouTube footage into the open project, codec-probes every file before import, and carries a fix for Premiere 2020’s Node 8 / CEP 9 runtime.

The problem
A photographer friend who shoots weddings asked for a way to get a clip into Premiere without touching a terminal. He’ll never read an error log, so I designed it backwards from that: one double-click installer, and every failure either handled or explained in plain English.
Constraints
- It runs inside Premiere’s own CEP runtime, which in Premiere 2020 is Node 8.6.
- Premiere can’t decode YouTube’s VP9 or AV1 streams, which is everything above 1080p.
- No terminal and no binaries in the repo: one double-click installer fetches the open-source tools.
- Downloading from YouTube can break its terms unless the content is yours, licensed, or shared with permission. The README says so up front.
How it is built
The panel is plain HTML and JavaScript with no build step. An ExtendScript host talks to Premiere, and a Node engine drives yt-dlp, ffmpeg and deno.
- Read the formatsyt-dlp lists only the qualities that video really offers.
- DownloadDeclarative format selectors, never pinned format ids.
- TranscodeIts own ffmpeg pass to H.264 when the source codec needs it.Fixed here
- Probe before import
h264+aac+ 8-bityuv420p, or it doesn’t reach Premiere. - Import into the binExtendScript places the clip in the open project’s selected bin.
Next
Premiere is moving to UXP, and a UXP plugin can’t drive yt-dlp or ffmpeg by itself. The route is a UXP Hybrid Plugin, which pairs the panel with a native library.
What broke, and the fix
In the step Transcode
Before the fix
--recode-video mp4 skipped mp4 to mp4, so AV1 inside .mp4 got through unconverted
After the fix
download to .mkv, transcode with its own ffmpeg, probe h264 + aac, no 10-bit, before import
Fixed and shipped in v1.0.0. 5dfc0cf, 2026
Other things that broke
- yt-dlp without a JavaScript runtime quietly loses formats and starts returning errors, so I bundle deno.
- Format ids pinned from one request fail on the next, so I use declarative selectors.
- Premiere 2020 embeds Node 8.6, where recursive
mkdirSyncfailed silently on every repeat download. I wrote a version that works there and a regression test for it.
Run it here
The probe gate from downloader.js, run on recorded ffmpeg -i output. Nothing is downloaded.
Running it needs JavaScript. Everything above reads without it.