diff options
| author | Maze Winther <mazewinther@gmail.com> | 2026-03-31 23:24:33 +0200 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2026-03-31 23:24:33 +0200 |
| commit | 608dc1a62fdb133e218f45796cf936bdfb27c7ae (patch) | |
| tree | 605132265bab1f345b0edfee8bdadfcaf8e973db /apps/web/src/services/storage/migrations/transformers | |
| parent | cc150c7cfb859dfc38372210ec5bcc8bd196bbc4 (diff) | |
| parent | f1d5932c54178c4f8eac61d3d3e0e4a30101780f (diff) | |
| download | opencut-608dc1a62fdb133e218f45796cf936bdfb27c7ae.tar.gz | |
Merge branch 'feature/separate-audio'
Diffstat (limited to 'apps/web/src/services/storage/migrations/transformers')
| -rw-r--r-- | apps/web/src/services/storage/migrations/transformers/v19-to-v20.ts | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/apps/web/src/services/storage/migrations/transformers/v19-to-v20.ts b/apps/web/src/services/storage/migrations/transformers/v19-to-v20.ts new file mode 100644 index 00000000..f72812a4 --- /dev/null +++ b/apps/web/src/services/storage/migrations/transformers/v19-to-v20.ts @@ -0,0 +1,87 @@ +import type { MigrationResult, ProjectRecord } from "./types"; +import { getProjectId, isRecord } from "./utils"; + +export function transformProjectV19ToV20({ + project, +}: { + project: ProjectRecord; +}): MigrationResult<ProjectRecord> { + if (!getProjectId({ project })) { + return { project, skipped: true, reason: "no project id" }; + } + + if (typeof project.version === "number" && project.version >= 20) { + return { project, skipped: true, reason: "already v20" }; + } + + return { + project: { + ...migrateVideoSourceAudioState({ project }), + version: 20, + }, + skipped: false, + }; +} + +function migrateVideoSourceAudioState({ + project, +}: { + project: ProjectRecord; +}): ProjectRecord { + if (!Array.isArray(project.scenes)) { + return project; + } + + return { + ...project, + scenes: project.scenes.map((scene) => migrateScene({ scene })), + }; +} + +function migrateScene({ + scene, +}: { + scene: unknown; +}): unknown { + if (!isRecord(scene) || !Array.isArray(scene.tracks)) { + return scene; + } + + return { + ...scene, + tracks: scene.tracks.map((track) => migrateTrack({ track })), + }; +} + +function migrateTrack({ + track, +}: { + track: unknown; +}): unknown { + if (!isRecord(track) || !Array.isArray(track.elements)) { + return track; + } + + return { + ...track, + elements: track.elements.map((element) => migrateElement({ element })), + }; +} + +function migrateElement({ + element, +}: { + element: unknown; +}): unknown { + if (!isRecord(element) || element.type !== "video") { + return element; + } + + return { + ...element, + isSourceAudioEnabled: + typeof element.isSourceAudioEnabled === "boolean" + ? element.isSourceAudioEnabled + : true, + }; +} |
