diff --git a/server/src/services/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts index 942817a213..7b7d154e58 100644 --- a/server/src/services/metadata.service.spec.ts +++ b/server/src/services/metadata.service.spec.ts @@ -1766,13 +1766,14 @@ describe(MetadataService.name, () => { const asset = factory.jobAssets.sidecarWrite(); const description = 'this is a description'; const gps = 12; - const date = '2023-11-22T04:56:12.196Z'; + const date = '2023-11-22T04:56:12.196-06:00'; mocks.assetJob.getLockedPropertiesForMetadataExtraction.mockResolvedValue([ 'description', 'latitude', 'longitude', 'dateTimeOriginal', + 'timeZone', ]); mocks.assetJob.getForSidecarWriteJob.mockResolvedValue(asset); await expect( @@ -1786,12 +1787,14 @@ describe(MetadataService.name, () => { ImageDescription: description, GPSLatitude: gps, GPSLongitude: gps, + TimeZone: '-06:00', }); expect(mocks.asset.unlockProperties).toHaveBeenCalledWith(asset.id, [ 'description', 'latitude', 'longitude', 'dateTimeOriginal', + 'timeZone', ]); }); }); diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index f74f9f4cec..cba10b6cd7 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -431,27 +431,33 @@ export class MetadataService extends BaseService { const { sidecarFile } = getAssetFiles(asset.files); const sidecarPath = sidecarFile?.path || `${asset.originalPath}.xmp`; - const { description, dateTimeOriginal, latitude, longitude, rating, tags } = _.pick( + const { description, dateTimeOriginal, latitude, longitude, rating, tags, timeZone } = _.pick( { description: asset.exifInfo.description, - dateTimeOriginal: asset.exifInfo.dateTimeOriginal, + dateTimeOriginal: asset.exifInfo.dateTimeOriginal as string | null, latitude: asset.exifInfo.latitude, longitude: asset.exifInfo.longitude, rating: asset.exifInfo.rating, tags: asset.exifInfo.tags, + timeZone: asset.exifInfo.timeZone, }, lockedProperties, ); + const tzOffset = timeZone ? DateTime.now().setZone(timeZone).toFormat('ZZ') : undefined; + const exif = _.omitBy( { Description: description, ImageDescription: description, - DateTimeOriginal: dateTimeOriginal ? String(dateTimeOriginal) : undefined, + DateTimeOriginal: dateTimeOriginal + ? DateTime.fromISO(dateTimeOriginal, { zone: 'UTC' }).setZone(tzOffset, { keepLocalTime: true }).toISO() + : undefined, GPSLatitude: latitude, GPSLongitude: longitude, Rating: rating, TagsList: tags?.length ? tags : undefined, + TimeZone: tzOffset, }, _.isUndefined, ); diff --git a/server/test/small.factory.ts b/server/test/small.factory.ts index 2d29386d67..6ce4ad1f59 100644 --- a/server/test/small.factory.ts +++ b/server/test/small.factory.ts @@ -361,6 +361,7 @@ const assetSidecarWriteFactory = () => { latitude: 12, longitude: 12, dateTimeOriginal: '2023-11-22T04:56:12.196Z', + timeZone: 'UTC-6', } as unknown as Exif, }; };