diff options
| author | Maze Winther <mazewinther@gmail.com> | 2025-07-22 12:36:17 +0200 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2025-07-22 12:36:17 +0200 |
| commit | 87a29963c3220e82f5d8512b178fd3d14e52ca63 (patch) | |
| tree | 1e301228891cd55c94735d0787ab69948eb1cb8e /apps/web/src/stores | |
| parent | a7c0b920516750af14e505a829ea4f7b6e4ae729 (diff) | |
| download | opencut-87a29963c3220e82f5d8512b178fd3d14e52ca63.tar.gz | |
Merge pull request [#366](https://github.com/mazeincoding/AppCut/issues/366)
Diffstat (limited to 'apps/web/src/stores')
| -rw-r--r-- | apps/web/src/stores/timeline-store.ts | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/apps/web/src/stores/timeline-store.ts b/apps/web/src/stores/timeline-store.ts index 81e135da..8a4abc6a 100644 --- a/apps/web/src/stores/timeline-store.ts +++ b/apps/web/src/stores/timeline-store.ts @@ -161,6 +161,7 @@ interface TimelineStore { // Computed values getTotalDuration: () => number; + getProjectThumbnail: (projectId: string) => Promise<string | null>; // History actions undo: () => void; @@ -1178,6 +1179,42 @@ export const useTimelineStore = create<TimelineStore>((set, get) => { return Math.max(...trackEndTimes, 0); }, + getProjectThumbnail: async (projectId) => { + try { + const tracks = await storageService.loadTimeline(projectId); + const mediaItems = await storageService.loadAllMediaItems(projectId); + + if (!tracks || !mediaItems.length) return null; + + const firstMediaElement = tracks + .flatMap((track) => track.elements) + .filter((element) => element.type === "media") + .sort((a, b) => a.startTime - b.startTime)[0]; + + if (!firstMediaElement) return null; + + const mediaItem = mediaItems.find( + (item) => item.id === firstMediaElement.mediaId + ); + if (!mediaItem) return null; + + if (mediaItem.type === "video" && mediaItem.file) { + const { generateVideoThumbnail } = await import( + "@/stores/media-store" + ); + const { thumbnailUrl } = await generateVideoThumbnail(mediaItem.file); + return thumbnailUrl; + } else if (mediaItem.type === "image" && mediaItem.url) { + return mediaItem.url; + } + + return null; + } catch (error) { + console.error("Failed to get project thumbnail:", error); + return null; + } + }, + redo: () => { const { redoStack } = get(); if (redoStack.length === 0) return; |
