ems-editor
Version:
EMS Video Editor SDK - Universal JavaScript SDK for external video editor integration
310 lines (309 loc) • 8.94 kB
TypeScript
/**
* EMS Editor SDK - Simple and Reliable
* Handles communication between external apps and iframe editor
*/
import type { RenderOptions, MAMUploadCallbacks, StartRenderWithMAMUploadResult, MAMUploadTracker, LoadWorkspaceOptions, LoadWorkspaceResult, WorkspaceLoadingCallbacks, QuickRenderOptions, QuickRenderResult, RenderResult } from './types';
export interface EMSEditorConfig {
serverUrl: string;
sessionId?: string;
}
export interface WebSocketMessage {
type: string;
payload: any;
sessionId?: string;
}
export interface AssetInfo {
id: string | number;
name: string;
type: 'video' | 'audio' | 'image';
fileUrl: string;
proxyUrl?: string;
width?: number;
height?: number;
duration?: number;
mamAssetId?: string | number;
}
export interface ImportFromAssetsResult {
success: boolean;
templateId: string;
workspaceId: string;
templateName: string;
tracksCount: number;
elementsCount: number;
timestamp: string;
error?: string;
}
export interface GenerateTemplateOptions {
name?: string;
description?: string;
width?: number;
height?: number;
fps?: number;
backgroundColor?: string;
layout?: 'sequential' | 'parallel' | 'custom';
assetPlacement?: 'auto' | 'manual';
customPosition?: {
[assetId: string]: {
startFrame: number;
endFrame?: number;
};
};
enableTransitions?: boolean;
transitionDuration?: number;
audioMixing?: 'separate' | 'mixed' | 'background';
trackNaming?: 'auto' | 'asset-based' | 'type-based';
}
export declare class EMSEditor {
private config;
private ws;
private sessionId;
private connected;
private ready;
private eventListeners;
private iframe;
private templateIsDirty;
constructor(config: EMSEditorConfig);
private connect;
private registerSession;
private handleMessage;
/**
* Set iframe reference for the editor
*/
setIframe(iframe: HTMLIFrameElement): void;
/**
* Login to MAM system
*/
loginToMAM(mamConfig: any): Promise<void>;
/**
* Logout from MAM system
*/
logoutFromMAM(): Promise<void>;
/**
* Set theme (light or dark)
*/
setTheme(theme: 'light' | 'dark'): Promise<void>;
/**
* Update theme with preset theme ID or custom theme object
*/
updateTheme(themeId?: string, customTheme?: any): Promise<void>;
/**
* Customize theme with primary, secondary, background colors
*/
customizeTheme(themeConfig: {
primary?: string;
secondary?: string;
background?: string;
accent?: string;
}): Promise<void>;
/**
* Generate color palette from base color
*/
private generateColorPalette;
/**
* Adjust color lightness
*/
private adjustColor;
/**
* Import template
*/
importTemplate(templateData: any): Promise<ImportFromAssetsResult>;
/**
* Import template from assets array - Auto-generates template with video/audio track separation
*/
importFromAssets(assets: AssetInfo[], options?: {
name?: string;
description?: string;
width?: number;
height?: number;
fps?: number;
backgroundColor?: string;
}): Promise<ImportFromAssetsResult>;
/**
* Generate a template from assets without importing it
* Returns the template object for further customization or use
*/
generateTemplate(assets: AssetInfo[], options?: GenerateTemplateOptions): any;
/**
* Generate quick template with minimal configuration
* Simplified API for basic use cases
*/
generateQuickTemplate(assets: AssetInfo[], name?: string): any;
/**
* Generate template from single asset with text overlay
*/
generateSingleAssetTemplate(asset: AssetInfo, options?: {
name?: string;
overlayText?: string;
textStyle?: any;
duration?: number;
}): any;
/**
* Generate tracks from assets with proper video/audio separation
*/
private generateTracksFromAssets;
/**
* Find existing track or create new one
*/
private findOrCreateTrack;
/**
* Create video element with linking
*/
private createVideoElement;
/**
* Create audio element with linking
*/
private createAudioElement;
/**
* Create audio-only element
*/
private createAudioOnlyElement;
/**
* Create image element
*/
private createImageElement;
/**
* Calculate transform for asset positioning
*/
private calculateTransform;
/**
* Generate UUID
*/
private generateUUID;
/**
* Generate element ID
*/
private generateElementId;
/**
* Start render process
*/
startRender(renderOptions: RenderOptions): Promise<void>;
/**
* Clear all workspaces/tabs in the editor
*/
clearWorkspaces(): Promise<void>;
/**
* Create a new workspace
*/
createWorkspace(options?: {
name?: string;
description?: string;
width?: number;
height?: number;
fps?: number;
duration?: number;
quality?: 'low' | 'medium' | 'high';
settings?: Record<string, any>;
}): Promise<{
workspaceId: string;
success: boolean;
}>;
/**
* Get list of all open workspaces in the editor
*/
getWorkspacesList(): Promise<any[]>;
/**
* Rename a workspace by its ID
*/
renameWorkspace(workspaceId: string, newName: string): Promise<{
success: boolean;
workspaceId: string;
newName: string;
}>;
/**
* Add a template to an existing workspace
*/
addTemplateToWorkspace(workspaceId: string, template: any, mergeMode?: 'append' | 'replace'): Promise<{
success: boolean;
workspaceId: string;
templateId: string;
mergeMode: string;
}>;
/**
* Load workspace from server by workspace ID
*/
loadWorkspaceFromServer(options: LoadWorkspaceOptions, callbacks?: WorkspaceLoadingCallbacks): Promise<LoadWorkspaceResult>;
/**
* MAM Upload Event Handlers
*/
/**
* Track MAM upload progress for a specific job
*/
trackMAMUpload(jobId: string, callbacks?: MAMUploadCallbacks): MAMUploadTracker;
/**
* Start render with MAM upload tracking
*/
startRenderWithMAMUpload(renderOptions: RenderOptions, mamUploadCallbacks?: MAMUploadCallbacks): Promise<StartRenderWithMAMUploadResult>;
/**
* Quick render current workspace with minimal options
* Uses current workspace template with optional overrides
*/
quickRender(options?: QuickRenderOptions): Promise<QuickRenderResult>;
/**
* Get render job result and status by job ID
*/
getRenderResult(jobId: string): Promise<RenderResult>;
/**
* Wait for render job to complete with polling
* Polls the job status until completion or failure
*/
waitForRenderComplete(jobId: string, options?: {
onProgress?: (result: RenderResult) => void;
pollInterval?: number;
timeout?: number;
}): Promise<RenderResult>;
/**
* Get user-friendly status message for render job status
*/
private getStatusMessage;
isConnected(): boolean;
isReady(): boolean;
isDirty(): boolean;
getSessionId(): string;
on(event: string, listener: Function): void;
off(event: string, listener: Function): void;
once(event: string, listener: Function): void;
private emit;
private sendMessage;
/**
* Generate advanced tracks from assets with enhanced options
*/
private generateAdvancedTracksFromAssets;
/**
* Find existing track or create new advanced one
*/
private findOrCreateAdvancedTrack;
/**
* Create advanced video element
*/
private createAdvancedVideoElement;
/**
* Create advanced audio element
*/
private createAdvancedAudioElement;
/**
* Create advanced audio-only element
*/
private createAdvancedAudioOnlyElement;
/**
* Create advanced image element
*/
private createAdvancedImageElement;
/**
* Generate asset library from assets
*/
private generateAssetLibrary;
/**
* Generate transitions between assets
*/
private generateTransitions;
/**
* Generate tags based on assets
*/
private generateTags;
/**
* Disconnect and cleanup
*/
destroy(): void;
}
export type { RenderOptions, MAMUploadCallbacks, StartRenderWithMAMUploadResult, MAMUploadTracker, MAMUploadEventResult, MAMUploadCompleteResult, MAMUploadStage, LoadWorkspaceOptions, LoadWorkspaceResult, WorkspaceLoadingCallbacks, WorkspaceLoadingProgress } from './types';
export default EMSEditor;