import { BinaryField, Tags } from 'exiftool-vendored'; export const IMetadataRepository = 'IMetadataRepository'; export interface ExifDuration { Value: number; Scale?: number; } type StringOrNumber = string | number; type TagsWithWrongTypes = | 'FocalLength' | 'Duration' | 'Description' | 'ImageDescription' | 'RegionInfo' | 'TagsList' | 'Keywords' | 'HierarchicalSubject' | 'ISO'; export interface ImmichTags extends Omit { ContentIdentifier?: string; MotionPhoto?: number; MotionPhotoVersion?: number; MotionPhotoPresentationTimestampUs?: number; MediaGroupUUID?: string; ImagePixelDepth?: string; FocalLength?: number; Duration?: number | string | ExifDuration; EmbeddedVideoType?: string; EmbeddedVideoFile?: BinaryField; MotionPhotoVideo?: BinaryField; TagsList?: StringOrNumber[]; HierarchicalSubject?: StringOrNumber[]; Keywords?: StringOrNumber | StringOrNumber[]; ISO?: number | number[]; // Type is wrong, can also be number. Description?: StringOrNumber; ImageDescription?: StringOrNumber; // Extended properties for image regions, such as faces RegionInfo?: { AppliedToDimensions: { W: number; H: number; Unit: string; }; RegionList: { Area: { // (X,Y) // center of the rectangle X: number; Y: number; W: number; H: number; Unit: string; }; Rotation?: number; Type?: string; Name?: string; }[]; }; } export interface IMetadataRepository { teardown(): Promise; readTags(path: string): Promise; writeTags(path: string, tags: Partial): Promise; extractBinaryTag(tagName: string, path: string): Promise; }