From 8b786488d2db6eb19b1566216d52e00d87564eb2 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 11 Mar 2026 01:57:30 +1100 Subject: [PATCH 1/6] fix(server): extract make/model from Sony XAVC DeviceManufacturer and DeviceModelName tags --- server/src/services/metadata.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index f22d4682fa12b..6921dc54fb85c 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -289,8 +289,8 @@ export class MetadataService extends BaseService { colorspace: exifTags.ColorSpace === undefined ? null : String(exifTags.ColorSpace), // camera - make: exifTags.Make ?? exifTags.Device?.Manufacturer ?? exifTags.AndroidMake ?? null, - model: exifTags.Model ?? exifTags.Device?.ModelName ?? exifTags.AndroidModel ?? null, + make: exifTags.Make ?? exifTags.Device?.Manufacturer ?? exifTags.AndroidMake ?? exifTags.DeviceManufacturer ?? null, + model: exifTags.Model ?? exifTags.Device?.ModelName ?? exifTags.AndroidModel ?? exifTags.DeviceModelName ?? null, fps: validate(Number.parseFloat(exifTags.VideoFrameRate!)), iso: validate(exifTags.ISO) as number, exposureTime: exifTags.ExposureTime ?? null, From 29122e4902e67ce9e07ec2b8ea79de85830c1024 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 11 Mar 2026 10:44:26 +1100 Subject: [PATCH 2/6] Added tests for DeviceManufacturer and DeviceModelName --- server/src/services/metadata.service.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/services/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts index 92ec13bea5194..42f6bd931a0f9 100644 --- a/server/src/services/metadata.service.spec.ts +++ b/server/src/services/metadata.service.spec.ts @@ -1568,6 +1568,7 @@ describe(MetadataService.name, () => { expected: { make: '1', model: '2' }, }, { exif: { AndroidMake: '1', AndroidModel: '2' }, expected: { make: '1', model: '2' } }, + { exif: { DeviceManufacturer: '1', DeviceModelName: '2' }, expected: { make: '1', model: '2' } }, ])('should read camera make and model $exif -> $expected', async ({ exif, expected }) => { const asset = AssetFactory.create(); mocks.assetJob.getForMetadataExtraction.mockResolvedValue(asset); From cd0e151a9649f46fd4de0840a5c55eb8ebb059d3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 11 Mar 2026 10:50:52 +1100 Subject: [PATCH 3/6] Additional test to ensure standard make/model tags take priority over sony specific tags --- server/src/services/metadata.service.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/src/services/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts index 42f6bd931a0f9..2f07c65aafc12 100644 --- a/server/src/services/metadata.service.spec.ts +++ b/server/src/services/metadata.service.spec.ts @@ -1569,6 +1569,10 @@ describe(MetadataService.name, () => { }, { exif: { AndroidMake: '1', AndroidModel: '2' }, expected: { make: '1', model: '2' } }, { exif: { DeviceManufacturer: '1', DeviceModelName: '2' }, expected: { make: '1', model: '2' } }, + { + exif: { Make: '1', Model: '2', DeviceManufacturer: '3', DeviceModelName: '4' }, + expected: { make: '1', model: '2' }, + }, ])('should read camera make and model $exif -> $expected', async ({ exif, expected }) => { const asset = AssetFactory.create(); mocks.assetJob.getForMetadataExtraction.mockResolvedValue(asset); From 237e8095e2d34d39d9dfc110d8907fa386064468 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 11 Mar 2026 22:05:02 +1100 Subject: [PATCH 4/6] Update ImmichTags interface --- server/src/repositories/metadata.repository.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/src/repositories/metadata.repository.ts b/server/src/repositories/metadata.repository.ts index 3c36bf62db3f8..fc00d44b3fe38 100644 --- a/server/src/repositories/metadata.repository.ts +++ b/server/src/repositories/metadata.repository.ts @@ -72,6 +72,8 @@ export interface ImmichTags extends Omit { AndroidMake?: string; AndroidModel?: string; + DeviceManufacturer?: string; + DeviceModelName?: string; } @Injectable() From 41165323a93fc3f66a2ad3e8c4120925b2f11cc1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 12 Mar 2026 01:25:55 +1100 Subject: [PATCH 5/6] Explicitly return null rather than "" DeviceManufacturer/DeviceModelName --- server/src/services/metadata.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index 6921dc54fb85c..f6190983f4f51 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -289,8 +289,8 @@ export class MetadataService extends BaseService { colorspace: exifTags.ColorSpace === undefined ? null : String(exifTags.ColorSpace), // camera - make: exifTags.Make ?? exifTags.Device?.Manufacturer ?? exifTags.AndroidMake ?? exifTags.DeviceManufacturer ?? null, - model: exifTags.Model ?? exifTags.Device?.ModelName ?? exifTags.AndroidModel ?? exifTags.DeviceModelName ?? null, + make: exifTags.Make ?? exifTags.Device?.Manufacturer ?? exifTags.AndroidMake ?? (exifTags.DeviceManufacturer || null), + model: exifTags.Model ?? exifTags.Device?.ModelName ?? exifTags.AndroidModel ?? (exifTags.DeviceModelName || null), fps: validate(Number.parseFloat(exifTags.VideoFrameRate!)), iso: validate(exifTags.ISO) as number, exposureTime: exifTags.ExposureTime ?? null, From 41d63dd273f5223f4a3a3f22578b62a9adca3852 Mon Sep 17 00:00:00 2001 From: Daniel Dietzler Date: Wed, 11 Mar 2026 12:20:52 -0500 Subject: [PATCH 6/6] chore: fix formatting --- server/src/services/metadata.service.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index f6190983f4f51..4f2d7d4bd6c66 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -289,8 +289,10 @@ export class MetadataService extends BaseService { colorspace: exifTags.ColorSpace === undefined ? null : String(exifTags.ColorSpace), // camera - make: exifTags.Make ?? exifTags.Device?.Manufacturer ?? exifTags.AndroidMake ?? (exifTags.DeviceManufacturer || null), - model: exifTags.Model ?? exifTags.Device?.ModelName ?? exifTags.AndroidModel ?? (exifTags.DeviceModelName || null), + make: + exifTags.Make ?? exifTags.Device?.Manufacturer ?? exifTags.AndroidMake ?? (exifTags.DeviceManufacturer || null), + model: + exifTags.Model ?? exifTags.Device?.ModelName ?? exifTags.AndroidModel ?? (exifTags.DeviceModelName || null), fps: validate(Number.parseFloat(exifTags.VideoFrameRate!)), iso: validate(exifTags.ISO) as number, exposureTime: exifTags.ExposureTime ?? null,