UNPKG

@tsavo/creatify-api-ts

Version:

TypeScript client for the Creatify AI API

157 lines (143 loc) 5.82 kB
import { CreatifyApiOptions } from '../types'; import { LipsyncV2 } from '../types'; import { ICreatifyApiClient } from '../types/api-client'; import { apiClientFactory } from '../client-factory'; /** * Client for interacting with the Creatify Lipsync v2 API * @see https://creatify.mintlify.app/api-reference/lipsyncs_v2 */ export class LipsyncV2Api { private client: ICreatifyApiClient; /** * Create a new LipsyncV2Api instance * @param options API client options * @param clientFactory Optional factory for creating API clients (useful for testing) */ constructor(options: CreatifyApiOptions, clientFactory = apiClientFactory) { this.client = clientFactory.createClient(options); } /** * Create a lipsync v2 video with multiple AI avatars speaking * @param params Parameters for the lipsync v2 video generation * @returns Promise resolving to the lipsync v2 task response * @see https://creatify.mintlify.app/api-reference/lipsyncs_v2/post-apilipsyncs */ async createLipsyncV2(params: LipsyncV2.LipsyncV2Params): Promise<LipsyncV2.LipsyncV2Response> { try { return await this.client.post<LipsyncV2.LipsyncV2Response>('/api/lipsyncs_v2/', params); } catch (error) { console.error('Error creating lipsync v2:', error); throw error; } } /** * Get the status and result of a lipsync v2 task * @param id ID of the lipsync v2 task * @returns Promise resolving to the lipsync v2 task status and result * @see https://creatify.mintlify.app/api-reference/lipsyncs_v2/get-apilipsyncs- */ async getLipsyncV2(id: string): Promise<LipsyncV2.LipsyncV2ResultResponse> { try { return await this.client.get<LipsyncV2.LipsyncV2ResultResponse>(`/api/lipsyncs_v2/${id}/`); } catch (error) { console.error(`Error fetching lipsync v2 result for ID ${id}:`, error); // Return a default response to prevent crashes return { id, status: 'error', error_message: error instanceof Error ? error.message : 'An error occurred with the API request', success: false, created_at: new Date().toISOString(), updated_at: new Date().toISOString(), } as LipsyncV2.LipsyncV2ResultResponse; } } /** * Get all lipsync v2 tasks * @returns Promise resolving to an array of lipsync v2 tasks * @see https://creatify.mintlify.app/api-reference/lipsyncs_v2/get-apilipsyncs */ async getLipsyncsV2(): Promise<LipsyncV2.LipsyncV2ResultResponse[]> { try { const results = await this.client.get<LipsyncV2.LipsyncV2ResultResponse[]>('/api/lipsyncs_v2/'); return Array.isArray(results) ? results : []; } catch (error) { console.error('Error fetching lipsync v2 tasks:', error); return []; } } /** * Generate a preview of a lipsync v2 video * @param id ID of the lipsync v2 task * @returns Promise resolving to the lipsync v2 task response * @see https://creatify.mintlify.app/api-reference/lipsyncs_v2/post-apilipsyncs-preview */ async generateLipsyncV2Preview(id: string): Promise<LipsyncV2.LipsyncV2Response> { return this.client.post<LipsyncV2.LipsyncV2Response>(`/api/lipsyncs_v2/${id}/preview/`, {}); } /** * Render a lipsync v2 video * @param id ID of the lipsync v2 task * @returns Promise resolving to the lipsync v2 task response * @see https://creatify.mintlify.app/api-reference/lipsyncs_v2/post-apilipsyncs-render */ async renderLipsyncV2(id: string): Promise<LipsyncV2.LipsyncV2Response> { return this.client.post<LipsyncV2.LipsyncV2Response>(`/api/lipsyncs_v2/${id}/render/`, {}); } /** * Create a lipsync v2 video and wait for it to complete * @param params Parameters for the lipsync v2 video generation * @param pollInterval How often to check status in ms (default 2000) * @param maxAttempts Maximum number of polling attempts (default 30) * @returns Promise resolving to the completed lipsync v2 task */ async createAndWaitForLipsyncV2( params: LipsyncV2.LipsyncV2Params, pollInterval: number = 2000, maxAttempts: number = 30 ): Promise<LipsyncV2.LipsyncV2ResultResponse> { try { // Create the lipsync v2 task const response = await this.createLipsyncV2(params); // Poll for completion let attempts = 0; let result = await this.getLipsyncV2(response.id); while (attempts < maxAttempts && result.status !== 'done' && result.status !== 'error') { // Wait for the specified interval await new Promise(resolve => setTimeout(resolve, pollInterval)); // Check the status again result = await this.getLipsyncV2(response.id); attempts++; } // Check if we reached max attempts without completion if (attempts >= maxAttempts && result.status !== 'done' && result.status !== 'error') { const error = new Error( `Lipsync v2 task ${response.id} did not complete within the timeout period` ); // Create a result with error status return { id: response.id, status: 'error', error_message: error instanceof Error ? error.message : 'Unknown error', success: false, created_at: result.created_at || new Date().toISOString(), updated_at: new Date().toISOString(), }; } return result; } catch (error) { // Handle any unexpected errors console.error('Error in createAndWaitForLipsyncV2:', error); return { id: 'error', status: 'error', error_message: error instanceof Error ? error.message : 'Unknown error', success: false, created_at: new Date().toISOString(), updated_at: new Date().toISOString(), }; } } }