|  |  |  | @ -28,22 +28,24 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.AviDirectory[] GetAviDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.AviDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.AviDirectory aviDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<MetadataExtractor.Formats.Avi.AviDirectory> aviDirectories = directories.OfType<MetadataExtractor.Formats.Avi.AviDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Avi.AviDirectory aviDirectory in aviDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Avi.AviDirectory a in aviDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (aviDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (a.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             DateTime? dateTimeOriginal; | 
		
	
		
			
				|  |  |  |  |             string? duration = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagDuration); | 
		
	
		
			
				|  |  |  |  |             string? height = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagHeight); | 
		
	
		
			
				|  |  |  |  |             string? width = aviDirectory.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagWidth); | 
		
	
		
			
				|  |  |  |  |             if (aviDirectory.TryGetDateTime(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |             string? duration = a.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagDuration); | 
		
	
		
			
				|  |  |  |  |             string? height = a.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagHeight); | 
		
	
		
			
				|  |  |  |  |             string? width = a.GetDescription(MetadataExtractor.Formats.Avi.AviDirectory.TagWidth); | 
		
	
		
			
				|  |  |  |  |             if (a.TryGetDateTime(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 dateTimeOriginal = checkDateTime; | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |                 dateTimeOriginal = GetDateTime(aviDirectory.GetString(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal)); | 
		
	
		
			
				|  |  |  |  |                 dateTimeOriginal = GetDateTime(a.GetString(MetadataExtractor.Formats.Avi.AviDirectory.TagDateTimeOriginal)); | 
		
	
		
			
				|  |  |  |  |             if (dateTimeOriginal is null && duration is null && height is null && width is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(dateTimeOriginal, duration, height, width)); | 
		
	
		
			
				|  |  |  |  |             aviDirectory = new(DateTimeOriginal: dateTimeOriginal, Duration: duration, Height: height, Width: width); | 
		
	
		
			
				|  |  |  |  |             results.Add(aviDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -51,72 +53,73 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.ExifDirectoryBase[] GetExifBaseDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.ExifDirectoryBase> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.ExifDirectoryBase exifDirectoryBase; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<ExifDirectoryBase> exifBaseDirectories = directories.OfType<ExifDirectoryBase>(); | 
		
	
		
			
				|  |  |  |  |         foreach (ExifDirectoryBase exifDirectoryBase in exifBaseDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (ExifDirectoryBase e in exifBaseDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (exifDirectoryBase.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (e.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             DateTime? dateTime; | 
		
	
		
			
				|  |  |  |  |             DateTime checkDateTime; | 
		
	
		
			
				|  |  |  |  |             DateTime? dateTimeOriginal; | 
		
	
		
			
				|  |  |  |  |             DateTime? dateTimeDigitized; | 
		
	
		
			
				|  |  |  |  |             string? aperture = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagAperture); | 
		
	
		
			
				|  |  |  |  |             string? applicationNotes = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagApplicationNotes); | 
		
	
		
			
				|  |  |  |  |             string? artist = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagArtist); | 
		
	
		
			
				|  |  |  |  |             string? bitsPerSample = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagBitsPerSample); | 
		
	
		
			
				|  |  |  |  |             string? bodySerialNumber = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagBodySerialNumber); | 
		
	
		
			
				|  |  |  |  |             string? cameraOwnerName = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagCameraOwnerName); | 
		
	
		
			
				|  |  |  |  |             string? compressedAverageBitsPerPixel = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagCompressedAverageBitsPerPixel); | 
		
	
		
			
				|  |  |  |  |             string? compression = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagCompression); | 
		
	
		
			
				|  |  |  |  |             string? copyright = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagCopyright); | 
		
	
		
			
				|  |  |  |  |             string? documentName = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagDocumentName); | 
		
	
		
			
				|  |  |  |  |             string? exifVersion = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagExifVersion); | 
		
	
		
			
				|  |  |  |  |             string? exposureTime = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagExposureTime); | 
		
	
		
			
				|  |  |  |  |             string? fileSource = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagFileSource); | 
		
	
		
			
				|  |  |  |  |             string? imageDescription = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageDescription); | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             int? imageHeightValue = imageHeight is null ? null : exifDirectoryBase.GetInt32(ExifDirectoryBase.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageNumber = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageNumber); | 
		
	
		
			
				|  |  |  |  |             string? imageUniqueId = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageUniqueId); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             int? imageWidthValue = imageWidth is null ? null : exifDirectoryBase.GetInt32(ExifDirectoryBase.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             string? isoSpeed = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagIsoSpeed); | 
		
	
		
			
				|  |  |  |  |             string? lensMake = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagLensMake); | 
		
	
		
			
				|  |  |  |  |             string? lensModel = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagLensModel); | 
		
	
		
			
				|  |  |  |  |             string? lensSerialNumber = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagLensSerialNumber); | 
		
	
		
			
				|  |  |  |  |             string? make = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagMake); | 
		
	
		
			
				|  |  |  |  |             string? makerNote = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagMakernote); | 
		
	
		
			
				|  |  |  |  |             string? model = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagModel); | 
		
	
		
			
				|  |  |  |  |             string? orientation = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagOrientation); | 
		
	
		
			
				|  |  |  |  |             int? orientationValue = orientation is null ? null : exifDirectoryBase.GetInt32(ExifDirectoryBase.TagOrientation); | 
		
	
		
			
				|  |  |  |  |             string? rating = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagRating); | 
		
	
		
			
				|  |  |  |  |             string? ratingPercent = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagRatingPercent); | 
		
	
		
			
				|  |  |  |  |             string? securityClassification = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagSecurityClassification); | 
		
	
		
			
				|  |  |  |  |             string? shutterSpeed = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagShutterSpeed); | 
		
	
		
			
				|  |  |  |  |             string? software = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagSoftware); | 
		
	
		
			
				|  |  |  |  |             string? timeZone = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagTimeZone); | 
		
	
		
			
				|  |  |  |  |             string? timeZoneDigitized = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagTimeZoneDigitized); | 
		
	
		
			
				|  |  |  |  |             string? timeZoneOriginal = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagTimeZoneOriginal); | 
		
	
		
			
				|  |  |  |  |             string? userComment = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagUserComment); | 
		
	
		
			
				|  |  |  |  |             string? winAuthor = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinAuthor); | 
		
	
		
			
				|  |  |  |  |             string? winComment = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinComment); | 
		
	
		
			
				|  |  |  |  |             string? winKeywords = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinKeywords); | 
		
	
		
			
				|  |  |  |  |             string? winSubject = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinSubject); | 
		
	
		
			
				|  |  |  |  |             string? winTitle = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagWinTitle); | 
		
	
		
			
				|  |  |  |  |             string? xResolution = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagXResolution); | 
		
	
		
			
				|  |  |  |  |             string? yResolution = exifDirectoryBase.GetDescription(ExifDirectoryBase.TagYResolution); | 
		
	
		
			
				|  |  |  |  |             if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTime, out checkDateTime)) | 
		
	
		
			
				|  |  |  |  |             string? aperture = e.GetDescription(ExifDirectoryBase.TagAperture); | 
		
	
		
			
				|  |  |  |  |             string? applicationNotes = e.GetDescription(ExifDirectoryBase.TagApplicationNotes); | 
		
	
		
			
				|  |  |  |  |             string? artist = e.GetDescription(ExifDirectoryBase.TagArtist); | 
		
	
		
			
				|  |  |  |  |             string? bitsPerSample = e.GetDescription(ExifDirectoryBase.TagBitsPerSample); | 
		
	
		
			
				|  |  |  |  |             string? bodySerialNumber = e.GetDescription(ExifDirectoryBase.TagBodySerialNumber); | 
		
	
		
			
				|  |  |  |  |             string? cameraOwnerName = e.GetDescription(ExifDirectoryBase.TagCameraOwnerName); | 
		
	
		
			
				|  |  |  |  |             string? compressedAverageBitsPerPixel = e.GetDescription(ExifDirectoryBase.TagCompressedAverageBitsPerPixel); | 
		
	
		
			
				|  |  |  |  |             string? compression = e.GetDescription(ExifDirectoryBase.TagCompression); | 
		
	
		
			
				|  |  |  |  |             string? copyright = e.GetDescription(ExifDirectoryBase.TagCopyright); | 
		
	
		
			
				|  |  |  |  |             string? documentName = e.GetDescription(ExifDirectoryBase.TagDocumentName); | 
		
	
		
			
				|  |  |  |  |             string? exifVersion = e.GetDescription(ExifDirectoryBase.TagExifVersion); | 
		
	
		
			
				|  |  |  |  |             string? exposureTime = e.GetDescription(ExifDirectoryBase.TagExposureTime); | 
		
	
		
			
				|  |  |  |  |             string? fileSource = e.GetDescription(ExifDirectoryBase.TagFileSource); | 
		
	
		
			
				|  |  |  |  |             string? imageDescription = e.GetDescription(ExifDirectoryBase.TagImageDescription); | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = e.GetDescription(ExifDirectoryBase.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             int? imageHeightValue = imageHeight is null ? null : e.GetInt32(ExifDirectoryBase.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageNumber = e.GetDescription(ExifDirectoryBase.TagImageNumber); | 
		
	
		
			
				|  |  |  |  |             string? imageUniqueId = e.GetDescription(ExifDirectoryBase.TagImageUniqueId); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = e.GetDescription(ExifDirectoryBase.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             int? imageWidthValue = imageWidth is null ? null : e.GetInt32(ExifDirectoryBase.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             string? isoSpeed = e.GetDescription(ExifDirectoryBase.TagIsoSpeed); | 
		
	
		
			
				|  |  |  |  |             string? lensMake = e.GetDescription(ExifDirectoryBase.TagLensMake); | 
		
	
		
			
				|  |  |  |  |             string? lensModel = e.GetDescription(ExifDirectoryBase.TagLensModel); | 
		
	
		
			
				|  |  |  |  |             string? lensSerialNumber = e.GetDescription(ExifDirectoryBase.TagLensSerialNumber); | 
		
	
		
			
				|  |  |  |  |             string? make = e.GetDescription(ExifDirectoryBase.TagMake); | 
		
	
		
			
				|  |  |  |  |             string? makerNote = e.GetDescription(ExifDirectoryBase.TagMakernote); | 
		
	
		
			
				|  |  |  |  |             string? model = e.GetDescription(ExifDirectoryBase.TagModel); | 
		
	
		
			
				|  |  |  |  |             string? orientation = e.GetDescription(ExifDirectoryBase.TagOrientation); | 
		
	
		
			
				|  |  |  |  |             int? orientationValue = orientation is null ? null : e.GetInt32(ExifDirectoryBase.TagOrientation); | 
		
	
		
			
				|  |  |  |  |             string? rating = e.GetDescription(ExifDirectoryBase.TagRating); | 
		
	
		
			
				|  |  |  |  |             string? ratingPercent = e.GetDescription(ExifDirectoryBase.TagRatingPercent); | 
		
	
		
			
				|  |  |  |  |             string? securityClassification = e.GetDescription(ExifDirectoryBase.TagSecurityClassification); | 
		
	
		
			
				|  |  |  |  |             string? shutterSpeed = e.GetDescription(ExifDirectoryBase.TagShutterSpeed); | 
		
	
		
			
				|  |  |  |  |             string? software = e.GetDescription(ExifDirectoryBase.TagSoftware); | 
		
	
		
			
				|  |  |  |  |             string? timeZone = e.GetDescription(ExifDirectoryBase.TagTimeZone); | 
		
	
		
			
				|  |  |  |  |             string? timeZoneDigitized = e.GetDescription(ExifDirectoryBase.TagTimeZoneDigitized); | 
		
	
		
			
				|  |  |  |  |             string? timeZoneOriginal = e.GetDescription(ExifDirectoryBase.TagTimeZoneOriginal); | 
		
	
		
			
				|  |  |  |  |             string? userComment = e.GetDescription(ExifDirectoryBase.TagUserComment); | 
		
	
		
			
				|  |  |  |  |             string? winAuthor = e.GetDescription(ExifDirectoryBase.TagWinAuthor); | 
		
	
		
			
				|  |  |  |  |             string? winComment = e.GetDescription(ExifDirectoryBase.TagWinComment); | 
		
	
		
			
				|  |  |  |  |             string? winKeywords = e.GetDescription(ExifDirectoryBase.TagWinKeywords); | 
		
	
		
			
				|  |  |  |  |             string? winSubject = e.GetDescription(ExifDirectoryBase.TagWinSubject); | 
		
	
		
			
				|  |  |  |  |             string? winTitle = e.GetDescription(ExifDirectoryBase.TagWinTitle); | 
		
	
		
			
				|  |  |  |  |             string? xResolution = e.GetDescription(ExifDirectoryBase.TagXResolution); | 
		
	
		
			
				|  |  |  |  |             string? yResolution = e.GetDescription(ExifDirectoryBase.TagYResolution); | 
		
	
		
			
				|  |  |  |  |             if (e.TryGetDateTime(ExifDirectoryBase.TagDateTime, out checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 dateTime = checkDateTime; | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |                 dateTime = GetDateTime(exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTime)); | 
		
	
		
			
				|  |  |  |  |             if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 dateTime = GetDateTime(e.GetString(ExifDirectoryBase.TagDateTime)); | 
		
	
		
			
				|  |  |  |  |             if (e.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 dateTimeOriginal = checkDateTime; | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |                 dateTimeOriginal = GetDateTime(exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeOriginal)); | 
		
	
		
			
				|  |  |  |  |             if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeDigitized, out checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 dateTimeOriginal = GetDateTime(e.GetString(ExifDirectoryBase.TagDateTimeOriginal)); | 
		
	
		
			
				|  |  |  |  |             if (e.TryGetDateTime(ExifDirectoryBase.TagDateTimeDigitized, out checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 dateTimeDigitized = checkDateTime; | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |                 dateTimeDigitized = GetDateTime(exifDirectoryBase.GetString(ExifDirectoryBase.TagDateTimeDigitized)); | 
		
	
		
			
				|  |  |  |  |                 dateTimeDigitized = GetDateTime(e.GetString(ExifDirectoryBase.TagDateTimeDigitized)); | 
		
	
		
			
				|  |  |  |  |             if (userComment is not null && userComment.Length > 255) | 
		
	
		
			
				|  |  |  |  |                 userComment = "..."; | 
		
	
		
			
				|  |  |  |  |             if (aperture is null | 
		
	
	
		
			
				
					
					|  |  |  | @ -166,54 +169,55 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |                 && xResolution is not null | 
		
	
		
			
				|  |  |  |  |                 && yResolution is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(Aperture: aperture, | 
		
	
		
			
				|  |  |  |  |                             ApplicationNotes: applicationNotes, | 
		
	
		
			
				|  |  |  |  |                             Artist: artist, | 
		
	
		
			
				|  |  |  |  |                             BitsPerSample: bitsPerSample, | 
		
	
		
			
				|  |  |  |  |                             BodySerialNumber: bodySerialNumber, | 
		
	
		
			
				|  |  |  |  |                             CameraOwnerName: cameraOwnerName, | 
		
	
		
			
				|  |  |  |  |                             CompressedAverageBitsPerPixel: compressedAverageBitsPerPixel, | 
		
	
		
			
				|  |  |  |  |                             Compression: compression, | 
		
	
		
			
				|  |  |  |  |                             Copyright: copyright, | 
		
	
		
			
				|  |  |  |  |                             DateTime: dateTime, | 
		
	
		
			
				|  |  |  |  |                             DateTimeDigitized: dateTimeDigitized, | 
		
	
		
			
				|  |  |  |  |                             DateTimeOriginal: dateTimeOriginal, | 
		
	
		
			
				|  |  |  |  |                             DocumentName: documentName, | 
		
	
		
			
				|  |  |  |  |                             ExifVersion: exifVersion, | 
		
	
		
			
				|  |  |  |  |                             ExposureTime: exposureTime, | 
		
	
		
			
				|  |  |  |  |                             FileSource: fileSource, | 
		
	
		
			
				|  |  |  |  |                             ImageDescription: imageDescription, | 
		
	
		
			
				|  |  |  |  |                             ImageHeight: imageHeight, | 
		
	
		
			
				|  |  |  |  |                             ImageHeightValue: imageHeightValue, | 
		
	
		
			
				|  |  |  |  |                             ImageNumber: imageNumber, | 
		
	
		
			
				|  |  |  |  |                             ImageUniqueId: imageUniqueId, | 
		
	
		
			
				|  |  |  |  |                             ImageWidth: imageWidth, | 
		
	
		
			
				|  |  |  |  |                             ImageWidthValue: imageWidthValue, | 
		
	
		
			
				|  |  |  |  |                             IsoSpeed: isoSpeed, | 
		
	
		
			
				|  |  |  |  |                             LensMake: lensMake, | 
		
	
		
			
				|  |  |  |  |                             LensModel: lensModel, | 
		
	
		
			
				|  |  |  |  |                             LensSerialNumber: lensSerialNumber, | 
		
	
		
			
				|  |  |  |  |                             Make: make, | 
		
	
		
			
				|  |  |  |  |                             MakerNote: makerNote, | 
		
	
		
			
				|  |  |  |  |                             Model: model, | 
		
	
		
			
				|  |  |  |  |                             Orientation: orientation, | 
		
	
		
			
				|  |  |  |  |                             OrientationValue: orientationValue, | 
		
	
		
			
				|  |  |  |  |                             Rating: rating, | 
		
	
		
			
				|  |  |  |  |                             RatingPercent: ratingPercent, | 
		
	
		
			
				|  |  |  |  |                             SecurityClassification: securityClassification, | 
		
	
		
			
				|  |  |  |  |                             ShutterSpeed: shutterSpeed, | 
		
	
		
			
				|  |  |  |  |                             Software: software, | 
		
	
		
			
				|  |  |  |  |                             TimeZone: timeZone, | 
		
	
		
			
				|  |  |  |  |                             TimeZoneDigitized: timeZoneDigitized, | 
		
	
		
			
				|  |  |  |  |                             TimeZoneOriginal: timeZoneOriginal, | 
		
	
		
			
				|  |  |  |  |                             UserComment: userComment, | 
		
	
		
			
				|  |  |  |  |                             WinAuthor: winAuthor, | 
		
	
		
			
				|  |  |  |  |                             WinComment: winComment, | 
		
	
		
			
				|  |  |  |  |                             WinKeywords: winKeywords, | 
		
	
		
			
				|  |  |  |  |                             WinSubject: winSubject, | 
		
	
		
			
				|  |  |  |  |                             WinTitle: winTitle, | 
		
	
		
			
				|  |  |  |  |                             XResolution: xResolution, | 
		
	
		
			
				|  |  |  |  |                             YResolution: yResolution)); | 
		
	
		
			
				|  |  |  |  |             exifDirectoryBase = new(Aperture: aperture, | 
		
	
		
			
				|  |  |  |  |                         ApplicationNotes: applicationNotes, | 
		
	
		
			
				|  |  |  |  |                         Artist: artist, | 
		
	
		
			
				|  |  |  |  |                         BitsPerSample: bitsPerSample, | 
		
	
		
			
				|  |  |  |  |                         BodySerialNumber: bodySerialNumber, | 
		
	
		
			
				|  |  |  |  |                         CameraOwnerName: cameraOwnerName, | 
		
	
		
			
				|  |  |  |  |                         CompressedAverageBitsPerPixel: compressedAverageBitsPerPixel, | 
		
	
		
			
				|  |  |  |  |                         Compression: compression, | 
		
	
		
			
				|  |  |  |  |                         Copyright: copyright, | 
		
	
		
			
				|  |  |  |  |                         DateTime: dateTime, | 
		
	
		
			
				|  |  |  |  |                         DateTimeDigitized: dateTimeDigitized, | 
		
	
		
			
				|  |  |  |  |                         DateTimeOriginal: dateTimeOriginal, | 
		
	
		
			
				|  |  |  |  |                         DocumentName: documentName, | 
		
	
		
			
				|  |  |  |  |                         ExifVersion: exifVersion, | 
		
	
		
			
				|  |  |  |  |                         ExposureTime: exposureTime, | 
		
	
		
			
				|  |  |  |  |                         FileSource: fileSource, | 
		
	
		
			
				|  |  |  |  |                         ImageDescription: imageDescription, | 
		
	
		
			
				|  |  |  |  |                         ImageHeight: imageHeight, | 
		
	
		
			
				|  |  |  |  |                         ImageHeightValue: imageHeightValue, | 
		
	
		
			
				|  |  |  |  |                         ImageNumber: imageNumber, | 
		
	
		
			
				|  |  |  |  |                         ImageUniqueId: imageUniqueId, | 
		
	
		
			
				|  |  |  |  |                         ImageWidth: imageWidth, | 
		
	
		
			
				|  |  |  |  |                         ImageWidthValue: imageWidthValue, | 
		
	
		
			
				|  |  |  |  |                         IsoSpeed: isoSpeed, | 
		
	
		
			
				|  |  |  |  |                         LensMake: lensMake, | 
		
	
		
			
				|  |  |  |  |                         LensModel: lensModel, | 
		
	
		
			
				|  |  |  |  |                         LensSerialNumber: lensSerialNumber, | 
		
	
		
			
				|  |  |  |  |                         Make: make, | 
		
	
		
			
				|  |  |  |  |                         MakerNote: makerNote, | 
		
	
		
			
				|  |  |  |  |                         Model: model, | 
		
	
		
			
				|  |  |  |  |                         Orientation: orientation, | 
		
	
		
			
				|  |  |  |  |                         OrientationValue: orientationValue, | 
		
	
		
			
				|  |  |  |  |                         Rating: rating, | 
		
	
		
			
				|  |  |  |  |                         RatingPercent: ratingPercent, | 
		
	
		
			
				|  |  |  |  |                         SecurityClassification: securityClassification, | 
		
	
		
			
				|  |  |  |  |                         ShutterSpeed: shutterSpeed, | 
		
	
		
			
				|  |  |  |  |                         Software: software, | 
		
	
		
			
				|  |  |  |  |                         TimeZone: timeZone, | 
		
	
		
			
				|  |  |  |  |                         TimeZoneDigitized: timeZoneDigitized, | 
		
	
		
			
				|  |  |  |  |                         TimeZoneOriginal: timeZoneOriginal, | 
		
	
		
			
				|  |  |  |  |                         UserComment: userComment, | 
		
	
		
			
				|  |  |  |  |                         WinAuthor: winAuthor, | 
		
	
		
			
				|  |  |  |  |                         WinComment: winComment, | 
		
	
		
			
				|  |  |  |  |                         WinKeywords: winKeywords, | 
		
	
		
			
				|  |  |  |  |                         WinSubject: winSubject, | 
		
	
		
			
				|  |  |  |  |                         WinTitle: winTitle, | 
		
	
		
			
				|  |  |  |  |                         XResolution: xResolution, | 
		
	
		
			
				|  |  |  |  |                         YResolution: yResolution); | 
		
	
		
			
				|  |  |  |  |             results.Add(exifDirectoryBase); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -221,23 +225,25 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.FileMetadataDirectory[] GetFileMetadataDirectories(string file, IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.FileMetadataDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.FileMetadataDirectory fileMetadataDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<MetadataExtractor.Formats.FileSystem.FileMetadataDirectory> fileMetadataDirectories = directories.OfType<MetadataExtractor.Formats.FileSystem.FileMetadataDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.FileSystem.FileMetadataDirectory fileMetadataDirectory in fileMetadataDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.FileSystem.FileMetadataDirectory f in fileMetadataDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (fileMetadataDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (f.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             DateTime? fileModifiedDate; | 
		
	
		
			
				|  |  |  |  |             string? fileName = fileMetadataDirectory.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileName); | 
		
	
		
			
				|  |  |  |  |             string? fileSize = fileMetadataDirectory.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileSize); | 
		
	
		
			
				|  |  |  |  |             if (fileMetadataDirectory.TryGetDateTime(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileModifiedDate, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |             string? fileName = f.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileName); | 
		
	
		
			
				|  |  |  |  |             string? fileSize = f.GetDescription(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileSize); | 
		
	
		
			
				|  |  |  |  |             if (f.TryGetDateTime(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileModifiedDate, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 fileModifiedDate = checkDateTime; | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |                 fileModifiedDate = GetDateTime(fileMetadataDirectory.GetString(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileModifiedDate)); | 
		
	
		
			
				|  |  |  |  |                 fileModifiedDate = GetDateTime(f.GetString(MetadataExtractor.Formats.FileSystem.FileMetadataDirectory.TagFileModifiedDate)); | 
		
	
		
			
				|  |  |  |  |             if (fileName is null || !file.EndsWith(fileName)) | 
		
	
		
			
				|  |  |  |  |                 throw new NotSupportedException($"!{file}.EndsWith({fileName})"); | 
		
	
		
			
				|  |  |  |  |             if (fileModifiedDate is null && fileName is null && fileSize is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(fileModifiedDate, fileName, fileSize)); | 
		
	
		
			
				|  |  |  |  |             fileMetadataDirectory = new(FileModifiedDate: fileModifiedDate, FileName: fileName, FileSize: fileSize); | 
		
	
		
			
				|  |  |  |  |             results.Add(fileMetadataDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -245,16 +251,18 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.GifHeaderDirectory[] GetGifHeaderDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.GifHeaderDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.GifHeaderDirectory gifHeaderDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<MetadataExtractor.Formats.Gif.GifHeaderDirectory> gifHeaderDirectories = directories.OfType<MetadataExtractor.Formats.Gif.GifHeaderDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Gif.GifHeaderDirectory gifHeaderDirectory in gifHeaderDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Gif.GifHeaderDirectory g in gifHeaderDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (gifHeaderDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (g.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = gifHeaderDirectory.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = gifHeaderDirectory.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = g.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = g.GetDescription(MetadataExtractor.Formats.Gif.GifHeaderDirectory.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             if (imageHeight is null && imageWidth is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(imageHeight, imageWidth)); | 
		
	
		
			
				|  |  |  |  |             gifHeaderDirectory = new(ImageHeight: imageHeight, ImageWidth: imageWidth); | 
		
	
		
			
				|  |  |  |  |             results.Add(gifHeaderDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -262,29 +270,31 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.GpsDirectory[] GetGpsDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.GpsDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.GpsDirectory gpsDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<GpsDirectory> gpsDirectories = directories.OfType<GpsDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (GpsDirectory gpsDirectory in gpsDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (GpsDirectory g in gpsDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (gpsDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (g.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             DateTime? timeStamp; | 
		
	
		
			
				|  |  |  |  |             string? altitude = gpsDirectory.GetDescription(GpsDirectory.TagAltitude); | 
		
	
		
			
				|  |  |  |  |             string? latitude = gpsDirectory.GetDescription(GpsDirectory.TagLatitude); | 
		
	
		
			
				|  |  |  |  |             string? latitudeRef = gpsDirectory.GetDescription(GpsDirectory.TagLatitudeRef); | 
		
	
		
			
				|  |  |  |  |             string? longitude = gpsDirectory.GetDescription(GpsDirectory.TagLongitude); | 
		
	
		
			
				|  |  |  |  |             string? longitudeRef = gpsDirectory.GetDescription(GpsDirectory.TagLongitudeRef); | 
		
	
		
			
				|  |  |  |  |             if (gpsDirectory.TryGetDateTime(GpsDirectory.TagTimeStamp, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |             string? altitude = g.GetDescription(GpsDirectory.TagAltitude); | 
		
	
		
			
				|  |  |  |  |             string? latitude = g.GetDescription(GpsDirectory.TagLatitude); | 
		
	
		
			
				|  |  |  |  |             string? latitudeRef = g.GetDescription(GpsDirectory.TagLatitudeRef); | 
		
	
		
			
				|  |  |  |  |             string? longitude = g.GetDescription(GpsDirectory.TagLongitude); | 
		
	
		
			
				|  |  |  |  |             string? longitudeRef = g.GetDescription(GpsDirectory.TagLongitudeRef); | 
		
	
		
			
				|  |  |  |  |             if (g.TryGetDateTime(GpsDirectory.TagTimeStamp, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 timeStamp = checkDateTime; | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |                 timeStamp = GetDateTime(gpsDirectory.GetString(GpsDirectory.TagTimeStamp)); | 
		
	
		
			
				|  |  |  |  |                 timeStamp = GetDateTime(g.GetString(GpsDirectory.TagTimeStamp)); | 
		
	
		
			
				|  |  |  |  |             if (altitude is null && latitude is null && latitudeRef is null && longitude is null && longitudeRef is null && timeStamp is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(altitude, | 
		
	
		
			
				|  |  |  |  |                             latitude, | 
		
	
		
			
				|  |  |  |  |                             latitudeRef, | 
		
	
		
			
				|  |  |  |  |                             longitude, | 
		
	
		
			
				|  |  |  |  |                             longitudeRef, | 
		
	
		
			
				|  |  |  |  |                             timeStamp)); | 
		
	
		
			
				|  |  |  |  |             gpsDirectory = new(Altitude: altitude, | 
		
	
		
			
				|  |  |  |  |                                Latitude: latitude, | 
		
	
		
			
				|  |  |  |  |                                LatitudeRef: latitudeRef, | 
		
	
		
			
				|  |  |  |  |                                Longitude: longitude, | 
		
	
		
			
				|  |  |  |  |                                LongitudeRef: longitudeRef, | 
		
	
		
			
				|  |  |  |  |                                TimeStamp: timeStamp); | 
		
	
		
			
				|  |  |  |  |             results.Add(gpsDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -292,16 +302,18 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.JpegDirectory[] GetJpegDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.JpegDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.JpegDirectory jpegDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<MetadataExtractor.Formats.Jpeg.JpegDirectory> jpegDirectories = directories.OfType<MetadataExtractor.Formats.Jpeg.JpegDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Jpeg.JpegDirectory jpegDirectory in jpegDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Jpeg.JpegDirectory j in jpegDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (jpegDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (j.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = jpegDirectory.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = jpegDirectory.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = j.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = j.GetDescription(MetadataExtractor.Formats.Jpeg.JpegDirectory.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             if (imageHeight is null && imageWidth is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(imageHeight, imageWidth)); | 
		
	
		
			
				|  |  |  |  |             jpegDirectory = new(ImageHeight: imageHeight, ImageWidth: imageWidth); | 
		
	
		
			
				|  |  |  |  |             results.Add(jpegDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -309,6 +321,7 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.MakernoteDirectory[] GetMakernoteDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.MakernoteDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.MakernoteDirectory makernoteDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<AppleMakernoteDirectory> appleMakernoteDirectories = directories.OfType<AppleMakernoteDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (AppleMakernoteDirectory appleMakernoteDirectory in appleMakernoteDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
	
		
			
				
					
					|  |  |  | @ -319,7 +332,8 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |             string? qualityAndFileFormat = null; | 
		
	
		
			
				|  |  |  |  |             if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat)); | 
		
	
		
			
				|  |  |  |  |             makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); | 
		
	
		
			
				|  |  |  |  |             results.Add(makernoteDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         IEnumerable<CanonMakernoteDirectory> canonMakernoteDirectories = directories.OfType<CanonMakernoteDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (CanonMakernoteDirectory canonMakernoteDirectory in canonMakernoteDirectories) | 
		
	
	
		
			
				
					
					|  |  |  | @ -331,7 +345,8 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |             string? qualityAndFileFormat = canonMakernoteDirectory.GetDescription(CanonMakernoteDirectory.CameraSettings.TagQuality); | 
		
	
		
			
				|  |  |  |  |             if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat)); | 
		
	
		
			
				|  |  |  |  |             makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); | 
		
	
		
			
				|  |  |  |  |             results.Add(makernoteDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         IEnumerable<NikonType2MakernoteDirectory> nikonType2MakernoteDirectories = directories.OfType<NikonType2MakernoteDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (NikonType2MakernoteDirectory nikonType2MakernoteDirectory in nikonType2MakernoteDirectories) | 
		
	
	
		
			
				
					
					|  |  |  | @ -343,7 +358,8 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |             string? qualityAndFileFormat = nikonType2MakernoteDirectory.GetDescription(NikonType2MakernoteDirectory.TagQualityAndFileFormat); | 
		
	
		
			
				|  |  |  |  |             if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat)); | 
		
	
		
			
				|  |  |  |  |             makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); | 
		
	
		
			
				|  |  |  |  |             results.Add(makernoteDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         IEnumerable<OlympusMakernoteDirectory> olympusMakernoteDirectories = directories.OfType<OlympusMakernoteDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (OlympusMakernoteDirectory olympusMakernoteDirectory in olympusMakernoteDirectories) | 
		
	
	
		
			
				
					
					|  |  |  | @ -355,7 +371,8 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |             string? qualityAndFileFormat = olympusMakernoteDirectory.GetDescription(OlympusMakernoteDirectory.TagJpegQuality); | 
		
	
		
			
				|  |  |  |  |             if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat)); | 
		
	
		
			
				|  |  |  |  |             makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); | 
		
	
		
			
				|  |  |  |  |             results.Add(makernoteDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         IEnumerable<PanasonicMakernoteDirectory> panasonicMakernoteDirectories = directories.OfType<PanasonicMakernoteDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (PanasonicMakernoteDirectory panasonicMakernoteDirectory in panasonicMakernoteDirectories) | 
		
	
	
		
			
				
					
					|  |  |  | @ -367,7 +384,8 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |             string? qualityAndFileFormat = panasonicMakernoteDirectory.GetDescription(PanasonicMakernoteDirectory.TagQualityMode); | 
		
	
		
			
				|  |  |  |  |             if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat)); | 
		
	
		
			
				|  |  |  |  |             makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); | 
		
	
		
			
				|  |  |  |  |             results.Add(makernoteDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         IEnumerable<SamsungType2MakernoteDirectory> samsungType2MakernoteDirectories = directories.OfType<SamsungType2MakernoteDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (SamsungType2MakernoteDirectory samsungType2MakernoteDirectory in samsungType2MakernoteDirectories) | 
		
	
	
		
			
				
					
					|  |  |  | @ -379,7 +397,8 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |             string? qualityAndFileFormat = null; | 
		
	
		
			
				|  |  |  |  |             if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat)); | 
		
	
		
			
				|  |  |  |  |             makernoteDirectory = new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat); | 
		
	
		
			
				|  |  |  |  |             results.Add(makernoteDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         IEnumerable<SonyType6MakernoteDirectory> sonyType6MakernoteDirectories = directories.OfType<SonyType6MakernoteDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (SonyType6MakernoteDirectory sonyType6MakernoteDirectory in sonyType6MakernoteDirectories) | 
		
	
	
		
			
				
					
					|  |  |  | @ -391,7 +410,8 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |             string? qualityAndFileFormat = null; | 
		
	
		
			
				|  |  |  |  |             if (cameraSerialNumber is null && firmwareVersion is null && qualityAndFileFormat is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(cameraSerialNumber, firmwareVersion, qualityAndFileFormat)); | 
		
	
		
			
				|  |  |  |  |             makernoteDirectory = new(CameraSerialNumber: cameraSerialNumber, FirmwareVersion: firmwareVersion, QualityAndFileFormat: qualityAndFileFormat); | 
		
	
		
			
				|  |  |  |  |             results.Add(makernoteDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -399,16 +419,18 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.PhotoshopDirectory[] GetPhotoshopDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.PhotoshopDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.PhotoshopDirectory photoshopDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<MetadataExtractor.Formats.Photoshop.PhotoshopDirectory> photoshopDirectories = directories.OfType<MetadataExtractor.Formats.Photoshop.PhotoshopDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Photoshop.PhotoshopDirectory photoshopDirectory in photoshopDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Photoshop.PhotoshopDirectory p in photoshopDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (photoshopDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (p.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             string? jpegQuality = photoshopDirectory.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagJpegQuality); | 
		
	
		
			
				|  |  |  |  |             string? url = photoshopDirectory.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagUrl); | 
		
	
		
			
				|  |  |  |  |             string? jpegQuality = p.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagJpegQuality); | 
		
	
		
			
				|  |  |  |  |             string? url = p.GetDescription(MetadataExtractor.Formats.Photoshop.PhotoshopDirectory.TagUrl); | 
		
	
		
			
				|  |  |  |  |             if (jpegQuality is null && url is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(jpegQuality, url)); | 
		
	
		
			
				|  |  |  |  |             photoshopDirectory = new(JpegQuality: jpegQuality, Url: url); | 
		
	
		
			
				|  |  |  |  |             results.Add(photoshopDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -416,17 +438,19 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.PngDirectory[] GetPngDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.PngDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.PngDirectory pngDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<MetadataExtractor.Formats.Png.PngDirectory> pngDirectories = directories.OfType<MetadataExtractor.Formats.Png.PngDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Png.PngDirectory pngDirectory in pngDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.Png.PngDirectory p in pngDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (pngDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (p.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             string? textualData = pngDirectory.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagTextualData); | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = p.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = p.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             string? textualData = p.GetDescription(MetadataExtractor.Formats.Png.PngDirectory.TagTextualData); | 
		
	
		
			
				|  |  |  |  |             if (imageHeight is null && imageWidth is null && textualData is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(imageHeight, imageWidth, textualData)); | 
		
	
		
			
				|  |  |  |  |             pngDirectory = new(ImageHeight: imageHeight, ImageWidth: imageWidth, TextualData: textualData); | 
		
	
		
			
				|  |  |  |  |             results.Add(pngDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -434,19 +458,21 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.QuickTimeMovieHeaderDirectory[] GetQuickTimeMovieHeaderDirectoryDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.QuickTimeMovieHeaderDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory> quickTimeMovieHeaderDirectories = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory in quickTimeMovieHeaderDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory q in quickTimeMovieHeaderDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (quickTimeMovieHeaderDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (q.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             DateTime? created; | 
		
	
		
			
				|  |  |  |  |             if (quickTimeMovieHeaderDirectory.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |             if (q.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 created = checkDateTime; | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |                 created = GetDateTime(quickTimeMovieHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated)); | 
		
	
		
			
				|  |  |  |  |                 created = GetDateTime(q.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeMovieHeaderDirectory.TagCreated)); | 
		
	
		
			
				|  |  |  |  |             if (created is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(created)); | 
		
	
		
			
				|  |  |  |  |             quickTimeMovieHeaderDirectory = new(Created: created); | 
		
	
		
			
				|  |  |  |  |             results.Add(quickTimeMovieHeaderDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -454,19 +480,21 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.QuickTimeTrackHeaderDirectory[] GetQuickTimeTrackHeaderDirectoryDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.QuickTimeTrackHeaderDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.QuickTimeTrackHeaderDirectory quickTimeTrackHeaderDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory> quickTimeTrackHeaderDirectories = directories.OfType<MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory quickTimeTrackHeaderDirectory in quickTimeTrackHeaderDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory q in quickTimeTrackHeaderDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (quickTimeTrackHeaderDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (q.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             DateTime? created; | 
		
	
		
			
				|  |  |  |  |             if (quickTimeTrackHeaderDirectory.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |             if (q.TryGetDateTime(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated, out DateTime checkDateTime)) | 
		
	
		
			
				|  |  |  |  |                 created = checkDateTime; | 
		
	
		
			
				|  |  |  |  |             else | 
		
	
		
			
				|  |  |  |  |                 created = GetDateTime(quickTimeTrackHeaderDirectory.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated)); | 
		
	
		
			
				|  |  |  |  |                 created = GetDateTime(q.GetString(MetadataExtractor.Formats.QuickTime.QuickTimeTrackHeaderDirectory.TagCreated)); | 
		
	
		
			
				|  |  |  |  |             if (created is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(created)); | 
		
	
		
			
				|  |  |  |  |             quickTimeTrackHeaderDirectory = new(Created: created); | 
		
	
		
			
				|  |  |  |  |             results.Add(quickTimeTrackHeaderDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | @ -474,16 +502,18 @@ internal abstract class Exif | 
		
	
		
			
				|  |  |  |  |     private static Shared.Models.WebPDirectory[] GetWebPDirectories(IReadOnlyList<MetadataExtractor.Directory> directories) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         List<Shared.Models.WebPDirectory> results = []; | 
		
	
		
			
				|  |  |  |  |         Shared.Models.WebPDirectory webPDirectory; | 
		
	
		
			
				|  |  |  |  |         IEnumerable<MetadataExtractor.Formats.WebP.WebPDirectory> webPDirectories = directories.OfType<MetadataExtractor.Formats.WebP.WebPDirectory>(); | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.WebP.WebPDirectory webPDirectory in webPDirectories) | 
		
	
		
			
				|  |  |  |  |         foreach (MetadataExtractor.Formats.WebP.WebPDirectory w in webPDirectories) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             if (webPDirectory.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |             if (w.Tags.Count == 0) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = webPDirectory.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = webPDirectory.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             string? imageHeight = w.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageHeight); | 
		
	
		
			
				|  |  |  |  |             string? imageWidth = w.GetDescription(MetadataExtractor.Formats.WebP.WebPDirectory.TagImageWidth); | 
		
	
		
			
				|  |  |  |  |             if (imageHeight is null && imageWidth is null) | 
		
	
		
			
				|  |  |  |  |                 continue; | 
		
	
		
			
				|  |  |  |  |             results.Add(new(imageHeight, imageWidth)); | 
		
	
		
			
				|  |  |  |  |             webPDirectory = new(ImageHeight: imageHeight, ImageWidth: imageWidth); | 
		
	
		
			
				|  |  |  |  |             results.Add(webPDirectory); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         return results.ToArray(); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					
					|  |  |  | 
 |