From 97655382552bd8d9322674292968b7b9df7556ef Mon Sep 17 00:00:00 2001 From: timonrieger Date: Wed, 17 Dec 2025 13:53:09 +0100 Subject: [PATCH 1/2] feat: add support for MXF format in media handling * Updated supported formats documentation to include MXF. * Added MXF to valid video extensions in tests. * Registered MXF MIME type in mime-types utility. --- docs/docs/features/supported-formats.md | 1 + server/src/services/asset-media.service.spec.ts | 1 + server/src/utils/mime-types.spec.ts | 1 + server/src/utils/mime-types.ts | 1 + 4 files changed, 4 insertions(+) diff --git a/docs/docs/features/supported-formats.md b/docs/docs/features/supported-formats.md index 16f1ab0b6b..4c4ac6039a 100644 --- a/docs/docs/features/supported-formats.md +++ b/docs/docs/features/supported-formats.md @@ -38,6 +38,7 @@ For the full list, refer to the [Immich source code](https://github.com/immich-a | `MP2T` | `.mts` `.m2ts` `.m2t` | :white_check_mark: | | | `MP4` | `.mp4` `.insv` | :white_check_mark: | | | `MPEG` | `.mpg` `.mpe` `.mpeg` | :white_check_mark: | | +| `MXF` | `.mxf` | :white_check_mark: | | | `QUICKTIME` | `.mov` | :white_check_mark: | | | `WEBM` | `.webm` | :white_check_mark: | | | `WMV` | `.wmv` | :white_check_mark: | | diff --git a/server/src/services/asset-media.service.spec.ts b/server/src/services/asset-media.service.spec.ts index 95eb8b3c97..4d4816f529 100644 --- a/server/src/services/asset-media.service.spec.ts +++ b/server/src/services/asset-media.service.spec.ts @@ -107,6 +107,7 @@ const validVideos = [ '.mp4', '.mpg', '.mts', + '.mxf', '.vob', '.webm', '.wmv', diff --git a/server/src/utils/mime-types.spec.ts b/server/src/utils/mime-types.spec.ts index c09f3a381b..eb5dcc3421 100644 --- a/server/src/utils/mime-types.spec.ts +++ b/server/src/utils/mime-types.spec.ts @@ -76,6 +76,7 @@ describe('mimeTypes', () => { { mimetype: 'image/x-sony-sr2', extension: '.sr2' }, { mimetype: 'image/x-sony-srf', extension: '.srf' }, { mimetype: 'image/x3f', extension: '.x3f' }, + { mimetype: 'application/mxf', extension: '.mxf' }, { mimetype: 'video/3gpp', extension: '.3gp' }, { mimetype: 'video/3gpp', extension: '.3gpp' }, { mimetype: 'video/avi', extension: '.avi' }, diff --git a/server/src/utils/mime-types.ts b/server/src/utils/mime-types.ts index d15c1f078c..0512591fd3 100644 --- a/server/src/utils/mime-types.ts +++ b/server/src/utils/mime-types.ts @@ -94,6 +94,7 @@ const video: Record = { '.mpeg': ['video/mpeg'], '.mpg': ['video/mpeg'], '.mts': ['video/mp2t'], + '.mxf': ['application/mxf'], '.vob': ['video/mpeg'], '.webm': ['video/webm'], '.wmv': ['video/x-ms-wmv'], From 5316bcf588017219e67b39fc95e78ef0b0602232 Mon Sep 17 00:00:00 2001 From: timonrieger Date: Wed, 17 Dec 2025 14:46:10 +0100 Subject: [PATCH 2/2] fix: enhance MXF handling in mime-types utility * Updated video mime type validation to include 'application/mxf'. * Adjusted asset type determination to recognize MXF as a video container. --- server/src/utils/mime-types.spec.ts | 2 +- server/src/utils/mime-types.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/server/src/utils/mime-types.spec.ts b/server/src/utils/mime-types.spec.ts index eb5dcc3421..8415debf56 100644 --- a/server/src/utils/mime-types.spec.ts +++ b/server/src/utils/mime-types.spec.ts @@ -189,7 +189,7 @@ describe('mimeTypes', () => { it('should contain only video mime types', () => { const values = Object.values(mimeTypes.video).flat(); - expect(values).toEqual(values.filter((mimeType) => mimeType.startsWith('video/'))); + expect(values).toEqual(values.filter((mimeType) => mimeType.startsWith('video/') || mimeType === 'application/mxf')); }); for (const [extension, v] of Object.entries(mimeTypes.video)) { diff --git a/server/src/utils/mime-types.ts b/server/src/utils/mime-types.ts index 0512591fd3..6617f199f1 100644 --- a/server/src/utils/mime-types.ts +++ b/server/src/utils/mime-types.ts @@ -134,6 +134,14 @@ export const mimeTypes = { /** return an extension (including a leading `.`) for a mime-type */ toExtension, assetType: (filename: string) => { + // Check file extension first to handle cases like MXF (application/mxf) that are video containers + if (isType(filename, video)) { + return AssetType.Video; + } + if (isType(filename, image)) { + return AssetType.Image; + } + // Fallback to mime type check for any edge cases const contentType = lookup(filename); if (contentType.startsWith('image/')) { return AssetType.Image;