Phase 2: services/premiere-plugin/js/CSInterface.js

This commit is contained in:
Zac Gaetano 2026-04-07 22:05:46 -04:00
parent bb92381a47
commit f0e3e90870

View file

@ -0,0 +1,210 @@
/**
* CSInterface.js - Simplified Adobe CEP Interface
*
* This is a minimal shim implementation of Adobe's CSInterface.js for the
* Wild Dragon MAM Premiere Pro plugin.
*
* In production, use the official CSInterface.js from Adobe's CEP-Resources:
* https://github.com/Adobe-CEP/CEP-Resources/blob/master/CEP_11.0/CSInterface.js
*
* This version includes the key methods needed for the MAM panel:
* - evalScript: Execute ExtendScript in Premiere Pro
* - getSystemPath: Get system paths for file operations
* - requestOpenExtension: Open another extension
*/
/**
* Adobe CEP SystemPath enum
* Used to get common system directories
*/
const SystemPath = {
USER_DATA: "user_data",
COMMON_FILES: "common_files",
MY_DOCUMENTS: "my_documents",
APPLICATION_DATA: "application_data",
TEMPORARY: "temporary"
};
/**
* CSInterface class - Main interface to communicate with Premiere Pro
*/
class CSInterface {
constructor() {
this.requestIdCount = 1;
this.requestMap = new Map();
this.extensionId = "com.wilddragon.mam.panel";
// Initialize event listener for messages from ExtendScript
if (window.__adobe_cep__ !== undefined) {
window.__adobe_cep__.addEventListener("edu.adobe.csxs.events.message", (event) => {
this._handleMessage(event);
});
}
}
/**
* Evaluates an ExtendScript in the context of the host application
* @param {string} script - The ExtendScript code to execute
* @param {function} callback - Callback function to receive the result
*/
evalScript(script, callback) {
if (window.__adobe_cep__ === undefined) {
console.error("Adobe CEP not available");
if (callback) callback("");
return;
}
const requestId = this.requestIdCount++;
if (callback) {
this.requestMap.set(requestId, callback);
}
try {
window.__adobe_cep__.evalScript(script, requestId);
} catch (error) {
console.error("Error evaluating script:", error);
if (callback) {
this.requestMap.delete(requestId);
callback("");
}
}
}
/**
* Gets a system path from the host application
* @param {string} pathType - Type of path from SystemPath enum
* @returns {string} The system path
*/
getSystemPath(pathType) {
const pathMap = {
[SystemPath.TEMPORARY]: this._getTempPath(),
[SystemPath.MY_DOCUMENTS]: this._getDocumentsPath(),
[SystemPath.APPLICATION_DATA]: this._getAppDataPath(),
[SystemPath.USER_DATA]: this._getUserDataPath(),
[SystemPath.COMMON_FILES]: this._getCommonFilesPath()
};
return pathMap[pathType] || "";
}
/**
* Requests to open another extension
* @param {string} extensionId - The extension ID to open
*/
requestOpenExtension(extensionId) {
if (window.__adobe_cep__ === undefined) {
console.error("Adobe CEP not available");
return;
}
try {
const event = new CSXSEvent("com.adobe.csxs.events.ApplicationActivate", "BROADCAST");
event.extensionId = extensionId;
window.__adobe_cep__.dispatchEvent(event);
} catch (error) {
console.error("Error opening extension:", error);
}
}
/**
* Gets the current extension ID
* @returns {string} The extension ID
*/
getExtensionId() {
return this.extensionId;
}
/**
* Adds an event listener for extension events
* @param {string} type - Event type
* @param {function} listener - Listener function
*/
addEventListener(type, listener) {
if (window.__adobe_cep__ !== undefined) {
window.__adobe_cep__.addEventListener(type, listener);
}
}
/**
* Dispatches an event
* @param {CSXSEvent} event - The event to dispatch
*/
dispatchEvent(event) {
if (window.__adobe_cep__ !== undefined) {
window.__adobe_cep__.dispatchEvent(event);
}
}
// Private helper methods for getting system paths
_getTempPath() {
if (navigator.platform.includes("Win")) {
return process.env.TEMP || "C:\\Users\\%USERNAME%\\AppData\\Local\\Temp";
} else {
return process.env.TMPDIR || "/tmp";
}
}
_getDocumentsPath() {
if (navigator.platform.includes("Win")) {
return process.env.USERPROFILE + "\\Documents";
} else {
return process.env.HOME + "/Documents";
}
}
_getAppDataPath() {
if (navigator.platform.includes("Win")) {
return process.env.APPDATA;
} else {
return process.env.HOME + "/Library/Application Support";
}
}
_getUserDataPath() {
if (navigator.platform.includes("Win")) {
return process.env.USERPROFILE + "\\AppData\\Roaming\\Adobe\\CEP\\extensions\\" + this.extensionId;
} else {
return process.env.HOME + "/Library/Application Support/Adobe/CEP/extensions/" + this.extensionId;
}
}
_getCommonFilesPath() {
if (navigator.platform.includes("Win")) {
return "C:\\Program Files\\Common Files";
} else {
return "/Library/Application Support";
}
}
_handleMessage(event) {
try {
const message = JSON.parse(event.data);
if (message.requestId !== undefined && this.requestMap.has(message.requestId)) {
const callback = this.requestMap.get(message.requestId);
this.requestMap.delete(message.requestId);
callback(message.result);
}
} catch (error) {
console.error("Error handling message:", error);
}
}
}
/**
* CSXSEvent - Simple event object for CEP communication
*/
class CSXSEvent {
constructor(type, scope = "APPLICATION") {
this.type = type;
this.scope = scope;
this.data = "";
}
}
// Initialize and export the CSInterface singleton
const csInterface = new CSInterface();
// Make it globally available
window.csInterface = csInterface;
window.SystemPath = SystemPath;
window.CSXSEvent = CSXSEvent;