diff --git a/src/backend/model/fileaccess/MetadataCreationDate.ts b/src/backend/model/fileaccess/MetadataCreationDate.ts index f4081c2f..b7caae84 100644 --- a/src/backend/model/fileaccess/MetadataCreationDate.ts +++ b/src/backend/model/fileaccess/MetadataCreationDate.ts @@ -1,34 +1,25 @@ -//The elements are [tagname1, tag-name1, description] +//The elements are [tagname1, tag-name1] //tagname1 is typically a full date time, but in some cases tagname1 and tagname2 together make up a full timestamp +//Interesting exiftool forums posts about some of these tags: +//exif.DateTimeOriginal, exif.CreateDate/exif.DateTimeDigitized and exif.ModifyDate: https://exiftool.org/forum/index.php?topic=13170.msg71174#msg71174 +//https://exiftool.org/forum/index.php?topic=15555.msg83536#msg83536 -const metadataTags: [string, string][] = [ - // Date tag Offset or time tag // Description - ["exif.DateTimeOriginal", "exif.OffsetTimeOriginal"], //"Date and time when the original image was taken - shutter close time" - ["exif.CreateDate", "exif.OffsetTime"], //"Date and time when the image was created"], - ["ifd0.ModifyDate", ""], //"Modificaton date from the idf0 section"], - ["ihdr.Creation Time", ""], //"PNG Creation Time"], - ["photoshop.DateCreated", ""], //"Date and time when the image was created"], - ["xmp:CreateDate", ""], //"Date and time when the image was created (XMP standard)"], - ["iptc.DateCreated", "iptc.TimeCreated"], //"Date and time when the image was created (IPTC standard)"], - ["exif.DateTimeDigitized", "exif.OffsetTimeDigitized"], //"Date and time when the image was digitized"], - ["xmp.MetadataDate", ""], //?????????? - ["TIFF.DateTime", ""], //"Date and time when the image was created (TIFF standard)"], - ["quicktime.CreationDate", ""], //"Date and time when the QuickTime movie was created"], - ["quicktime.CreateDate", ""], //"Date and time when the QuickTime movie was created in UTC"], - ["AVI.CreationTime", ""], //"Date and time when the AVI video was created"], - ["MP4.CreationTime", ""], //"Date and time when the MP4 video was created"], - ["MP4.ModifyDate", ""], //"Date and time when the MP4 video was last modified"], - ["WebP.VP8X/Time", ""], //"Date and time when the WebP image was created"], - ["heic.ContentCreateDate", ""], //"Date and time when the HEIC image content was created"], - ["heic.CreationDate", ""], //"Date and time when the HEIC image was created"], - ["cr2.DateTimeOriginal", ""], //"Date and time when the original Canon RAW image was taken"], - ["nef.DateTimeOriginal", ""], //"Date and time when the original Nikon RAW image was taken"], - ["dng.DateTimeOriginal", ""], //"Date and time when the original DNG image was taken"], - ["rw2.DateTimeOriginal", ""], //"Date and time when the original Panasonic RAW image was taken"], - ["arw.DateTimeOriginal", ""], //"Date and time when the original Sony Alpha RAW image was taken"], - ["cr3.DateTimeOriginal", ""], //"Date and time when the original Canon RAW image was taken"], - ["sr2.DateTimeOriginal", ""], //"Date and time when the original Sony RAW image was taken"], - ["orf.DateTimeOriginal", ""], //"Date and time when the original Olympus RAW image was taken"], - ["xmp:ModifyDate", ""], //"Date and time when the image was last modified (XMP standard)"] -]; \ No newline at end of file +const DateTags: [string, string][] = [ + // Date tag Offset or time tag //Description + ["exif.DateTimeOriginal", "exif.OffsetTimeOriginal"], //Date and time when the original image was taken - shutter close time + ["exif.CreateDate", "exif.OffsetTimeDigitized"], //Date and time when the image was created + ["exif.DateTimeDigitized", "exif.OffsetTimeDigitized"], //Same as exif.CreateDate but older and newer spec name + ["ifd0.ModifyDate", ""], //The date and time of image creation. In Exif standard, it is the date and time the file was changed. + ["ihdr.Creation Time", ""], //Time of original image creation for PNG files + ["photoshop.DateCreated", ""], //The date the intellectual content of the document was created. Used and set by LightRoom among others + ["xmp:CreateDate", ""], //Date and time when the image was created (XMP standard) + ["iptc.DateCreated", "iptc.TimeCreated"], //Designates the date and optionally the time the content of the image was created rather than the date of the creation of the digital representation + ["quicktime.CreationDate", ""], //Date and time when the QuickTime movie was created"], + ["quicktime.CreateDate", ""], //Date and time when the QuickTime movie was created in UTC"], + ["heic.ContentCreateDate", ""], //Date and time when the HEIC image content was created"], + ["heic.CreationDate", ""], //Date and time when the HEIC image was created"], + ["tiff.DateTime", ""], //Date and time of image creation. This property is stored in XMP as xmp:ModifyDate. + ["xmp:ModifyDate", "exif.OffsetTime"], //Date and time when the image was last modified (XMP standard)"] + ["xmp.MetadataDate", ""], //The date and time that any metadata for this resource was last changed. It should be the same as or more recent than xmp:ModifyDate. +]; diff --git a/src/backend/model/fileaccess/MetadataLoader.ts b/src/backend/model/fileaccess/MetadataLoader.ts index 576db791..6b54175d 100644 --- a/src/backend/model/fileaccess/MetadataLoader.ts +++ b/src/backend/model/fileaccess/MetadataLoader.ts @@ -15,6 +15,7 @@ import * as path from 'path'; import { Utils } from '../../../common/Utils'; import { FFmpegFactory } from '../FFmpegFactory'; import { ExtensionDecorator } from '../extension/ExtensionDecorator'; +import { DateTags } from './MetadataCreationDate'; const LOG_TAG = '[MetadataLoader]'; const ffmpeg = FFmpegFactory.get(); @@ -360,6 +361,33 @@ export class MetadataLoader { metadata.caption = exif.dc?.description?.value || Utils.asciiToUTF8(exif.iptc?.Caption) || metadata.caption || exif.ifd0?.ImageDescription || exif.exif?.UserComment?.value || exif.Iptc4xmpCore?.ExtDescrAccessibility?.value ||exif.acdsee?.notes; } + private static mapTimestampAndOffset2(metadata: PhotoMetadata, exif: any) { + function getValueFromPath(company: Company, path: string): any { + // Avoid using eval() due to security risks + return eval(`company.${path}`); + } + function getValueFromPath(company: Company, path: string): any { + const pathElements = path.split('.'); + let currentObject: any = company; + + for (const element of pathElements) { + const tmp = currentObject[element]; + if (tmp === undefined) { + // Handle case where path is invalid + return undefined; + } + currentObject = tmp; + } + + return currentObject; +} + for (const [main, extra] of DateTags) { + const pathelms[] = main.split["."]; + } + + + } + private static mapTimestampAndOffset(metadata: PhotoMetadata, exif: any) { metadata.creationDate = Utils.timestampToMS(exif?.photoshop?.DateCreated, null) || Utils.timestampToMS(exif?.xmp?.CreateDate, null) ||