summaryrefslogtreecommitdiff
path: root/apps/web/src/services/storage/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/services/storage/service.ts')
-rw-r--r--apps/web/src/services/storage/service.ts86
1 files changed, 55 insertions, 31 deletions
diff --git a/apps/web/src/services/storage/service.ts b/apps/web/src/services/storage/service.ts
index 858198eb..e8fc26c0 100644
--- a/apps/web/src/services/storage/service.ts
+++ b/apps/web/src/services/storage/service.ts
@@ -22,12 +22,15 @@ import {
runStorageMigrations,
} from "@/services/storage/migrations";
import type { Bookmark, SceneTracks, TScene } from "@/timeline";
+import { roundMediaTime } from "@/wasm";
function normalizeBookmarks({ raw }: { raw: unknown }): Bookmark[] {
if (!Array.isArray(raw)) return [];
return raw
.map((item): Bookmark | null => {
- if (typeof item === "number") return { time: item };
+ if (typeof item === "number") {
+ return { time: roundMediaTime({ time: item }) };
+ }
const obj = item as Record<string, unknown>;
if (
typeof obj !== "object" ||
@@ -37,10 +40,12 @@ function normalizeBookmarks({ raw }: { raw: unknown }): Bookmark[] {
return null;
}
return {
- time: obj.time,
+ time: roundMediaTime({ time: obj.time }),
...(typeof obj.note === "string" && { note: obj.note }),
...(typeof obj.color === "string" && { color: obj.color }),
- ...(typeof obj.duration === "number" && { duration: obj.duration }),
+ ...(typeof obj.duration === "number" && {
+ duration: roundMediaTime({ time: obj.duration }),
+ }),
};
})
.filter((b): b is Bookmark => b !== null);
@@ -60,17 +65,17 @@ class StorageService {
version: 1,
};
- this.projectsAdapter = new IndexedDBAdapter<SerializedProject>(
- this.config.projectsDb,
- "projects",
- this.config.version,
- );
+ this.projectsAdapter = new IndexedDBAdapter<SerializedProject>({
+ dbName: this.config.projectsDb,
+ storeName: "projects",
+ version: this.config.version,
+ });
- this.savedSoundsAdapter = new IndexedDBAdapter<SavedSoundsData>(
- this.config.savedSoundsDb,
- "saved-sounds",
- this.config.version,
- );
+ this.savedSoundsAdapter = new IndexedDBAdapter<SavedSoundsData>({
+ dbName: this.config.savedSoundsDb,
+ storeName: "saved-sounds",
+ version: this.config.version,
+ });
}
private async ensureMigrations(): Promise<void> {
@@ -86,11 +91,11 @@ class StorageService {
}
private getProjectMediaAdapters({ projectId }: { projectId: string }) {
- const mediaMetadataAdapter = new IndexedDBAdapter<MediaAssetData>(
- `${this.config.mediaDb}-${projectId}`,
- "media-metadata",
- this.config.version,
- );
+ const mediaMetadataAdapter = new IndexedDBAdapter<MediaAssetData>({
+ dbName: `${this.config.mediaDb}-${projectId}`,
+ storeName: "media-metadata",
+ version: this.config.version,
+ });
const mediaAssetsAdapter = new OPFSAdapter(`media-files-${projectId}`);
@@ -156,7 +161,10 @@ class StorageService {
timelineViewState: project.timelineViewState,
};
- await this.projectsAdapter.set(project.metadata.id, serializedProject);
+ await this.projectsAdapter.set({
+ key: project.metadata.id,
+ value: serializedProject,
+ });
}
async loadProject({
@@ -198,9 +206,11 @@ class StorageService {
id: serializedProject.metadata.id,
name: serializedProject.metadata.name,
thumbnail: serializedProject.metadata.thumbnail,
- duration:
- serializedProject.metadata.duration ??
- getProjectDurationFromScenes({ scenes }),
+ duration: roundMediaTime({
+ time:
+ serializedProject.metadata.duration ??
+ getProjectDurationFromScenes({ scenes }),
+ }),
createdAt: new Date(serializedProject.metadata.createdAt),
updatedAt: new Date(serializedProject.metadata.updatedAt),
},
@@ -253,11 +263,13 @@ class StorageService {
id: serializedProject.metadata.id,
name: serializedProject.metadata.name,
thumbnail: serializedProject.metadata.thumbnail,
- duration:
- serializedProject.metadata.duration ??
- getProjectDurationFromScenes({
- scenes: (serializedProject.scenes ?? []) as unknown as TScene[],
- }),
+ duration: roundMediaTime({
+ time:
+ serializedProject.metadata.duration ??
+ getProjectDurationFromScenes({
+ scenes: (serializedProject.scenes ?? []) as unknown as TScene[],
+ }),
+ }),
createdAt: new Date(serializedProject.metadata.createdAt),
updatedAt: new Date(serializedProject.metadata.updatedAt),
});
@@ -296,8 +308,14 @@ class StorageService {
};
try {
- await mediaAssetsAdapter.set(mediaAsset.id, mediaAsset.file);
- await mediaMetadataAdapter.set(mediaAsset.id, metadata);
+ await mediaAssetsAdapter.set({
+ key: mediaAsset.id,
+ value: mediaAsset.file,
+ });
+ await mediaMetadataAdapter.set({
+ key: mediaAsset.id,
+ value: metadata,
+ });
} catch (error) {
try {
await mediaAssetsAdapter.remove(mediaAsset.id);
@@ -492,7 +510,10 @@ class StorageService {
lastModified: new Date().toISOString(),
};
- await this.savedSoundsAdapter.set("user-sounds", updatedData);
+ await this.savedSoundsAdapter.set({
+ key: "user-sounds",
+ value: updatedData,
+ });
} catch (error) {
console.error("Failed to save sound effect:", error);
throw error;
@@ -508,7 +529,10 @@ class StorageService {
lastModified: new Date().toISOString(),
};
- await this.savedSoundsAdapter.set("user-sounds", updatedData);
+ await this.savedSoundsAdapter.set({
+ key: "user-sounds",
+ value: updatedData,
+ });
} catch (error) {
console.error("Failed to remove saved sound:", error);
throw error;