diff --git a/package-lock.json b/package-lock.json index da2f312..73a15b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,7 @@ "@tiptap/pm": "^2.12.0", "@tiptap/starter-kit": "^2.12.0", "@tiptap/suggestion": "^2.12.0", + "@types/fluent-ffmpeg": "^2.1.27", "@types/jsonwebtoken": "^9.0.9", "@types/leaflet": "^1.9.18", "@types/multer": "^1.4.12", @@ -45,6 +46,7 @@ "cloudinary": "^2.6.1", "dotenv": "^16.5.0", "exifr": "^7.1.3", + "fluent-ffmpeg": "^2.1.3", "giantbombing-api": "^1.0.4", "gray-matter": "^4.0.3", "ioredis": "^5.4.1", @@ -2872,6 +2874,14 @@ "@types/send": "*" } }, + "node_modules/@types/fluent-ffmpeg": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.27.tgz", + "integrity": "sha512-QiDWjihpUhriISNoBi2hJBRUUmoj/BMTYcfz+F+ZM9hHWBYABFAE6hjP/TbCZC0GWwlpa3FzvHH9RzFeRusZ7A==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/geojson": { "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", @@ -3513,6 +3523,11 @@ "node": ">=4" } }, + "node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5027,6 +5042,30 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz", + "integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "async": "^0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fluent-ffmpeg/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/foreground-child": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", diff --git a/package.json b/package.json index 23290bc..78b6d8c 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "@tiptap/pm": "^2.12.0", "@tiptap/starter-kit": "^2.12.0", "@tiptap/suggestion": "^2.12.0", + "@types/fluent-ffmpeg": "^2.1.27", "@types/jsonwebtoken": "^9.0.9", "@types/leaflet": "^1.9.18", "@types/multer": "^1.4.12", @@ -95,6 +96,7 @@ "cloudinary": "^2.6.1", "dotenv": "^16.5.0", "exifr": "^7.1.3", + "fluent-ffmpeg": "^2.1.3", "giantbombing-api": "^1.0.4", "gray-matter": "^4.0.3", "ioredis": "^5.4.1", diff --git a/prisma/migrations/20250823_add_video_metadata/migration.sql b/prisma/migrations/20250823_add_video_metadata/migration.sql new file mode 100644 index 0000000..2189c14 --- /dev/null +++ b/prisma/migrations/20250823_add_video_metadata/migration.sql @@ -0,0 +1,5 @@ +-- Add video metadata fields to Media table +ALTER TABLE "Media" ADD COLUMN IF NOT EXISTS "duration" DOUBLE PRECISION; +ALTER TABLE "Media" ADD COLUMN IF NOT EXISTS "videoCodec" VARCHAR(50); +ALTER TABLE "Media" ADD COLUMN IF NOT EXISTS "audioCodec" VARCHAR(50); +ALTER TABLE "Media" ADD COLUMN IF NOT EXISTS "bitrate" INTEGER; \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 1358443..1e52383 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -127,6 +127,10 @@ model Media { dominantColor String? @db.VarChar(7) colors Json? aspectRatio Float? + duration Float? // Video duration in seconds + videoCodec String? @db.VarChar(50) + audioCodec String? @db.VarChar(50) + bitrate Int? // Bitrate in bits per second albums AlbumMedia[] usage MediaUsage[] photos Photo[] diff --git a/src/lib/components/admin/FilePreviewList.svelte b/src/lib/components/admin/FilePreviewList.svelte index 2635325..1cc3715 100644 --- a/src/lib/components/admin/FilePreviewList.svelte +++ b/src/lib/components/admin/FilePreviewList.svelte @@ -1,5 +1,5 @@