From e2aa29b5dc87959d7c5429cc422496d772aedea2 Mon Sep 17 00:00:00 2001 From: dazzatronus Date: Fri, 5 Jun 2026 21:34:32 +1000 Subject: [PATCH] fix(deps): bump @shotstack/schemas to 1.13.0; handle optional asset src --- package.json | 2 +- src/components/canvas/players/audio-player.ts | 7 +++++-- src/components/canvas/players/image-player.ts | 1 + src/components/canvas/players/video-player.ts | 1 + .../timeline/media-thumbnail-renderer.ts | 14 ++++++++++++++ 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 3cddac0f..5ce01e5e 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "vite-plugin-dts": "^4.5.4" }, "dependencies": { - "@shotstack/schemas": "1.11.0", + "@shotstack/schemas": "1.13.0", "@shotstack/shotstack-canvas": "^2.9.0", "howler": "^2.2.4", "mediabunny": "^1.11.2", diff --git a/src/components/canvas/players/audio-player.ts b/src/components/canvas/players/audio-player.ts index 1ff7672a..d710caf2 100644 --- a/src/components/canvas/players/audio-player.ts +++ b/src/components/canvas/players/audio-player.ts @@ -30,6 +30,7 @@ export class AudioPlayer extends Player { const audioClipConfiguration = this.clipConfiguration.asset as AudioAsset; const identifier = audioClipConfiguration.src; + if (!identifier) return; const loadOptions: pixi.UnresolvedAsset = { src: identifier, parser: AudioLoadParser.Name }; const audioResource = await this.edit.assetLoader.load(identifier, loadOptions); @@ -123,8 +124,10 @@ export class AudioPlayer extends Player { this.syncTimer = 0; const audioAsset = this.clipConfiguration.asset as AudioAsset; - const loadOptions: pixi.UnresolvedAsset = { src: audioAsset.src, parser: AudioLoadParser.Name }; - const audioResource = await this.edit.assetLoader.load(audioAsset.src, loadOptions); + const { src } = audioAsset; + if (!src) return; + const loadOptions: pixi.UnresolvedAsset = { src, parser: AudioLoadParser.Name }; + const audioResource = await this.edit.assetLoader.load(src, loadOptions); if (!(audioResource instanceof howler.Howl)) { throw new Error(`Invalid audio source '${audioAsset.src}'.`); diff --git a/src/components/canvas/players/image-player.ts b/src/components/canvas/players/image-player.ts index c937ee53..f472ee56 100644 --- a/src/components/canvas/players/image-player.ts +++ b/src/components/canvas/players/image-player.ts @@ -86,6 +86,7 @@ export class ImagePlayer extends Player { private async loadTexture(): Promise { const imageAsset = this.clipConfiguration.asset as ImageAsset; const { src } = imageAsset; + if (!src) return; const corsUrl = `${src}${src.includes("?") ? "&" : "?"}x-cors=1`; const loadOptions: pixi.UnresolvedAsset = { src: corsUrl, crossorigin: "anonymous", data: {} }; diff --git a/src/components/canvas/players/video-player.ts b/src/components/canvas/players/video-player.ts index 6c64f8a2..f8406b35 100644 --- a/src/components/canvas/players/video-player.ts +++ b/src/components/canvas/players/video-player.ts @@ -168,6 +168,7 @@ export class VideoPlayer extends Player { private async loadVideo(): Promise { const videoAsset = this.clipConfiguration.asset as VideoAsset; const { src } = videoAsset; + if (!src) return; if (src.endsWith(".mov")) { throw new Error(`Video source '${src}' is not supported. .mov files cannot be played in the browser. Please convert to .webm or .mp4 first.`); diff --git a/src/components/timeline/media-thumbnail-renderer.ts b/src/components/timeline/media-thumbnail-renderer.ts index 3a8487d7..ef3a43a4 100644 --- a/src/components/timeline/media-thumbnail-renderer.ts +++ b/src/components/timeline/media-thumbnail-renderer.ts @@ -126,6 +126,13 @@ export class MediaThumbnailRenderer implements ClipRenderer { const state: ThumbnailState = { loading: true, thumbnails: [], thumbnailWidth: 0, failed: false }; this.clipStates.set(clipKey, state); + if (!asset.src) { + state.loading = false; + state.failed = true; + this.onRendered(); + return; + } + try { const result = await this.generator.generateThumbnail(asset.src, asset.trim ?? 0); @@ -155,6 +162,13 @@ export class MediaThumbnailRenderer implements ClipRenderer { const state: ThumbnailState = { loading: true, thumbnails: [], thumbnailWidth: 0, failed: false }; this.clipStates.set(clipKey, state); + if (!asset.src) { + state.loading = false; + state.failed = true; + this.onRendered(); + return; + } + try { const result = await this.loadImageThumbnail(asset.src);