summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/commands/media/add-media-asset.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-03-27 00:55:15 +0100
committerMaze Winther <mazewinther@gmail.com>2026-03-29 15:56:48 +0200
commit4d127a038bf768eded68aae3cfa5c1b12241bdac (patch)
tree16bbb801caf6770546cff4fdb37b6408ec9ead98 /apps/web/src/lib/commands/media/add-media-asset.ts
parent82817cb50cb0487350573d6129130aec705f924b (diff)
downloadopencut-4d127a038bf768eded68aae3cfa5c1b12241bdac.tar.gz
chore: normalize line endings
Diffstat (limited to 'apps/web/src/lib/commands/media/add-media-asset.ts')
-rw-r--r--apps/web/src/lib/commands/media/add-media-asset.ts34
1 files changed, 34 insertions, 0 deletions
diff --git a/apps/web/src/lib/commands/media/add-media-asset.ts b/apps/web/src/lib/commands/media/add-media-asset.ts
index a3dec0e6..86fa3e35 100644
--- a/apps/web/src/lib/commands/media/add-media-asset.ts
+++ b/apps/web/src/lib/commands/media/add-media-asset.ts
@@ -5,11 +5,15 @@ import type { MediaAsset } from "@/lib/media/types";
import { generateUUID } from "@/utils/id";
import { storageService } from "@/services/storage/service";
import { hasMediaId } from "@/lib/timeline/element-utils";
+import { getHighestImportedVideoFps } from "@/lib/project/fps";
+import { UpdateProjectSettingsCommand } from "@/lib/commands/project";
export class AddMediaAssetCommand extends Command {
private assetId: string;
private savedAssets: MediaAsset[] | null = null;
private createdAsset: MediaAsset | null = null;
+ private previousProjectFps: number | null = null;
+ private appliedProjectFps: number | null = null;
constructor(
private projectId: string,
@@ -31,6 +35,10 @@ export class AddMediaAssetCommand extends Command {
editor.media.setAssets({
assets: [...this.savedAssets, this.createdAsset],
});
+ this.previousProjectFps = editor.project.getActiveOrNull()?.settings.fps ?? null;
+ this.appliedProjectFps = editor.project.ratchetFpsForImportedMedia({
+ importedAssets: [this.createdAsset],
+ });
storageService
.saveMediaAsset({
@@ -64,6 +72,8 @@ export class AddMediaAssetCommand extends Command {
editor.timeline.deleteElements({ elements: orphanedElements });
}
+ this.restoreProjectFpsAfterFailedSave({ editor });
+
if (storageService.isQuotaExceededError({ error })) {
toast.error("Not enough browser storage", {
description: error instanceof Error ? error.message : undefined,
@@ -90,4 +100,28 @@ export class AddMediaAssetCommand extends Command {
getAssetId(): string {
return this.assetId;
}
+
+ private restoreProjectFpsAfterFailedSave({
+ editor,
+ }: {
+ editor: EditorCore;
+ }): void {
+ if (this.previousProjectFps === null || this.appliedProjectFps === null) return;
+
+ const activeProject = editor.project.getActiveOrNull();
+ if (!activeProject) return;
+ if (activeProject.settings.fps !== this.appliedProjectFps) return;
+
+ const highestRemainingVideoFps = getHighestImportedVideoFps({
+ mediaAssets: editor.media.getAssets(),
+ });
+ if (
+ highestRemainingVideoFps !== null &&
+ highestRemainingVideoFps >= this.appliedProjectFps
+ ) {
+ return;
+ }
+
+ new UpdateProjectSettingsCommand({ fps: this.previousProjectFps }).execute();
+ }
}