diff options
| author | Maze Winther <mazewinther@gmail.com> | 2025-06-22 19:28:03 +0200 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2025-06-22 19:28:03 +0200 |
| commit | 6ee16f9df8aeabfef0ca533f9f5b13daab3a3758 (patch) | |
| tree | 75a9db32a8c4e4a60c54e35c914444b00d1a76d9 /apps/web/src/lib/media-processing.ts | |
| parent | e22aa6620c5cdf97c71947e96e894313ac3e895e (diff) | |
| download | opencut-6ee16f9df8aeabfef0ca533f9f5b13daab3a3758.tar.gz | |
feat: so much stuff
Diffstat (limited to 'apps/web/src/lib/media-processing.ts')
| -rw-r--r-- | apps/web/src/lib/media-processing.ts | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/apps/web/src/lib/media-processing.ts b/apps/web/src/lib/media-processing.ts new file mode 100644 index 00000000..c51dde55 --- /dev/null +++ b/apps/web/src/lib/media-processing.ts @@ -0,0 +1,67 @@ +import { toast } from "sonner";
+import {
+ getFileType,
+ generateVideoThumbnail,
+ getMediaDuration,
+ getImageAspectRatio,
+ type MediaItem,
+} from "@/stores/media-store";
+
+export interface ProcessedMediaItem extends Omit<MediaItem, "id"> {}
+
+export async function processMediaFiles(
+ files: FileList | File[]
+): Promise<ProcessedMediaItem[]> {
+ const fileArray = Array.from(files);
+ const processedItems: ProcessedMediaItem[] = [];
+
+ for (const file of fileArray) {
+ const fileType = getFileType(file);
+
+ if (!fileType) {
+ toast.error(`Unsupported file type: ${file.name}`);
+ continue;
+ }
+
+ const url = URL.createObjectURL(file);
+ let thumbnailUrl: string | undefined;
+ let duration: number | undefined;
+ let aspectRatio: number = 16 / 9; // Default fallback
+
+ try {
+ if (fileType === "image") {
+ // Get image aspect ratio
+ aspectRatio = await getImageAspectRatio(file);
+ } else if (fileType === "video") {
+ // Generate thumbnail and get aspect ratio for videos
+ const videoResult = await generateVideoThumbnail(file);
+ thumbnailUrl = videoResult.thumbnailUrl;
+ aspectRatio = videoResult.aspectRatio;
+ } else if (fileType === "audio") {
+ // For audio, use a square aspect ratio
+ aspectRatio = 1;
+ }
+
+ // Get duration for videos and audio
+ if (fileType === "video" || fileType === "audio") {
+ duration = await getMediaDuration(file);
+ }
+
+ processedItems.push({
+ name: file.name,
+ type: fileType,
+ file,
+ url,
+ thumbnailUrl,
+ duration,
+ aspectRatio,
+ });
+ } catch (error) {
+ console.error("Error processing file:", file.name, error);
+ toast.error(`Failed to process ${file.name}`);
+ URL.revokeObjectURL(url); // Clean up on error
+ }
+ }
+
+ return processedItems;
+}
|
