diff --git a/server/src/repositories/metadata.repository.ts b/server/src/repositories/metadata.repository.ts index 3e9bec3d87..bf3a96f21f 100644 --- a/server/src/repositories/metadata.repository.ts +++ b/server/src/repositories/metadata.repository.ts @@ -63,6 +63,14 @@ export interface ImmichTags extends Omit { Name?: string; }[]; }; + + Device?: { + Manufacturer?: string; + ModelName?: string; + }; + + AndroidMake?: string; + AndroidModel?: string; } @Injectable() diff --git a/server/src/services/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts index 2164715f84..e505a88605 100644 --- a/server/src/services/metadata.service.spec.ts +++ b/server/src/services/metadata.service.spec.ts @@ -1081,6 +1081,7 @@ describe(MetadataService.name, () => { }), ); }); + it('should handle valid negative rating value', async () => { mocks.asset.getByIds.mockResolvedValue([assetStub.image]); mockReadTags({ Rating: -1 }); @@ -1193,6 +1194,23 @@ describe(MetadataService.name, () => { type: 'VIDEO', }); }); + + it.each([ + { Make: '1', Model: '2', Device: { Manufacturer: '3', ModelName: '4' }, AndroidMake: '4', AndroidModel: '5' }, + { Device: { Manufacturer: '1', ModelName: '2' }, AndroidMake: '3', AndroidModel: '4' }, + { AndroidMake: '1', AndroidModel: '2' }, + ])('should read camera make and model correct place %s', async (metaData) => { + mocks.asset.getByIds.mockResolvedValue([assetStub.image]); + mockReadTags(metaData); + + await sut.handleMetadataExtraction({ id: assetStub.image.id }); + expect(mocks.asset.upsertExif).toHaveBeenCalledWith( + expect.objectContaining({ + make: '1', + model: '2', + }), + ); + }); }); describe('handleQueueSidecar', () => { diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index 2f541409f4..4bf58a57fa 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -221,8 +221,8 @@ export class MetadataService extends BaseService { colorspace: exifTags.ColorSpace ?? null, // camera - make: exifTags.Make ?? null, - model: exifTags.Model ?? null, + make: exifTags.Make ?? exifTags?.Device?.Manufacturer ?? exifTags.AndroidMake ?? null, + model: exifTags.Model ?? exifTags?.Device?.ModelName ?? exifTags.AndroidModel ?? null, fps: validate(Number.parseFloat(exifTags.VideoFrameRate!)), iso: validate(exifTags.ISO) as number, exposureTime: exifTags.ExposureTime ?? null,