Work in progress Typescript SDK for the Shotstack API.
Render a video (trim start and end):
import Shotstack, { EditApiApiKeys } from './dist/index.js'; const apiKey = 'YOUR_API_KEY'; const basePath = 'https://api.shotstack.io/edit/v1'; const EditApi = new Shotstack.EditApi(basePath); EditApi.setApiKey(EditApiApiKeys.DeveloperKey, apiKey); const videoAsset = new Shotstack.VideoAsset(); videoAsset.src = 'https://s3-ap-southeast-2.amazonaws.com/shotstack-assets/footage/skater.hd.mp4'; videoAsset.trim = 3; const videoClip = new Shotstack.Clip(); videoClip.asset = videoAsset; videoClip.start = 0; videoClip.length = 8; const track = new Shotstack.Track(); track.clips = [videoClip]; const timeline = new Shotstack.Timeline(); timeline.tracks = [track]; const mux = new Shotstack.MuxDestination(); const output = new Shotstack.Output(); output.format = Shotstack.Output.FormatEnum.MP4; output.resolution = Shotstack.Output.ResolutionEnum.SD; output.destinations = [mux]; const edit = new Shotstack.Edit(); edit.timeline = timeline; edit.output = output; EditApi.postRender(edit).then((data) => { console.log(data.response.body); });
Check render status:
import Shotstack, { EditApiApiKeys } from './dist/index.js'; const apiKey = 'YOUR_API_KEY'; const basePath = 'https://api.shotstack.io/edit/v1'; const EditApi = new Shotstack.EditApi(basePath); EditApi.setApiKey(EditApiApiKeys.DeveloperKey, apiKey); const renderId = 'RENDER_ID'; // get this from the response of the postRender method EditApi.getRender(renderId, { data: false }).then((data) => { if (data.response.body.response.status === 'done') { console.log(data.response.body.response.url); } });
Ingest a video and create a rendition:
import Shotstack, { IngestApiApiKeys } from './dist/index.js'; const apiKey = 'YOUR_API_KEY'; const basePath = 'https://api.shotstack.io/ingest/v1'; const IngestApi = new Shotstack.IngestApi(basePath); IngestApi.setApiKey(IngestApiApiKeys.DeveloperKey, apiKey); const size = new Shotstack.Size(); size.width = 1280; size.height = 720; const rendition = new Shotstack.Rendition(); rendition.format = Shotstack.Rendition.FormatEnum.MP4; rendition.size = size; const outputs = new Shotstack.Outputs(); outputs.renditions = [rendition]; const source = new Shotstack.Source(); source.url = 'https://github.com/shotstack/test-media/raw/main/captioning/scott-ko.mp4'; source.outputs = outputs; IngestApi.postSource(source).then((data) => { console.log(data.response.body); });
Get source and rendition details:
import Shotstack, { IngestApiApiKeys } from './dist/index.js'; const apiKey = 'YOUR_API_KEY'; const basePath = 'https://api.shotstack.io/ingest/v1'; const IngestApi = new Shotstack.IngestApi(basePath); IngestApi.setApiKey(IngestApiApiKeys.DeveloperKey, apiKey); const sourceId = 'zzy89yhy-1w4y-xe41-t3v6-1gafvp0qmhvz'; IngestApi.getSource(sourceId).then((data) => { if (data.response.body.data.attributes.status === 'ready') { console.log('Source:', data.response.body.data.attributes.source); if (data.response.body.data.attributes.outputs.renditions[0].status === 'ready') { console.log('Rendition:', data.response.body.data.attributes.outputs.renditions[0].url); } } });
Generate an image using Shotstack text-to-image service
import Shotstack, { CreateApiApiKeys } from './dist/index.js'; const apiKey = 'YOUR_API_KEY'; const basePath = 'https://api.shotstack.io/create/v1'; const CreateApi = new Shotstack.CreateApi(basePath); CreateApi.setApiKey(CreateApiApiKeys.DeveloperKey, apiKey); const shotstackTextToImageOptions = new Shotstack.ShotstackTextToImageOptions(); shotstackTextToImageOptions.prompt = 'A detailed realistic photograph of Mars, showcasing its orange-red surface and dark outer space in the background with stars'; shotstackTextToImageOptions.width = 1024; shotstackTextToImageOptions.height = 1024; const shotstackTextToImage = new Shotstack.ShotstackGeneratedAsset(); shotstackTextToImage.options = shotstackTextToImageOptions; CreateApi.postGenerateAsset(shotstackTextToImage).then((data) => { console.log(data.response.body); });
Check generation status:
import Shotstack, { CreateApiApiKeys } from './dist/index.js'; const apiKey = 'YOUR_API_KEY'; const basePath = 'https://api.shotstack.io/create/v1'; const CreateApi = new Shotstack.CreateApi(basePath); CreateApi.setApiKey(CreateApiApiKeys.DeveloperKey, apiKey); const assetId = '01ht4-dtfsp-e6s59-ktryg-3w27mn'; CreateApi.getGeneratedAsset(assetId).then((data) => { if (data.response.body.data.attributes.status === 'done') { console.log(data.response.body.data.attributes.url); } });
Transfer a file to a destination (Pexels to AWS S3):
import Shotstack, { ServeApiApiKeys } from './dist/index.js'; const apiKey = 'YOUR_API_KEY'; const basePath = 'https://api.shotstack.io/serve/v1'; const ServeApi = new Shotstack.ServeApi(basePath); ServeApi.setApiKey(ServeApiApiKeys.DeveloperKey, apiKey); const s3DestinationOptions = new Shotstack.S3DestinationOptions(); s3DestinationOptions.region = 'ap-southeast-2'; s3DestinationOptions.bucket = 'my-bucket'; s3DestinationOptions.prefix = 'testing'; s3DestinationOptions.filename = 'photo'; s3DestinationOptions.acl = 'public-read'; const s3Destination = new Shotstack.S3Destination(); s3Destination.options = s3DestinationOptions; const transfer = new Shotstack.Transfer(); transfer.url = 'https://images.pexels.com/photos/1547813/pexels-photo-1547813.jpeg'; transfer.id = 'MY_ASSET_ID'; transfer.destinations = [s3Destination]; ServeApi.postServeAsset(transfer).then((data) => { console.log(data.response.body); });
Get asset details:
import Shotstack, { ServeApiApiKeys } from './dist/index.js'; const apiKey = 'YOUR_API_KEY'; const basePath = 'https://api.shotstack.io/serve/v1'; const ServeApi = new Shotstack.ServeApi(basePath); ServeApi.setApiKey(ServeApiApiKeys.DeveloperKey, apiKey); const assetId = 'MY_ASSET_ID'; // User created asset ID, render ID or source/rendition ID ServeApi.getAssetByRenderId(assetId).then((data) => { if (data.response.body.data[0].attributes.status === 'ready') { ServeApi.getAsset(data.response.body.data[0].attributes.id).then((data) => { console.log(data.response.body.data.attributes.url); }); } });