diff --git a/Compare/appsettings.Development.json b/Compare/appsettings.Development.json index 0a88493..43b661b 100644 --- a/Compare/appsettings.Development.json +++ b/Compare/appsettings.Development.json @@ -89,10 +89,32 @@ "PropertiesChangedForProperty": false, "RootDirectory": "C:/Tmp/Phares/Compare/Images-dd514b88", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", + ".nef", + ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "PropertyContentCollectionFiles": [ "/Images-ec5a909 - Results/A) Property/2022-12-30/[()]/637869381676042455.json", @@ -117,7 +139,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ], "VerifyToSeason": [ ". 2000", diff --git a/Compare/appsettings.json b/Compare/appsettings.json index bddb6d5..be1ffdc 100644 --- a/Compare/appsettings.json +++ b/Compare/appsettings.json @@ -90,12 +90,32 @@ "/zzz Phares Slides/Slides 2015-06-10/Magazine 01" ], "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "PropertyContentCollectionFiles": [ "/Images-ec5a909 - Results/A) Property/2022-12-30/[()]/637869381676042455.json", @@ -120,7 +140,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ], "VerifyToSeason": [ ". 2000", diff --git a/Copy-Distinct/appsettings.json b/Copy-Distinct/appsettings.json index c8ca0f8..243e329 100644 --- a/Copy-Distinct/appsettings.json +++ b/Copy-Distinct/appsettings.json @@ -71,12 +71,32 @@ "ResultSingleton": "{}", "RootDirectory": "D:/Images", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "ValidImageFormatExtensions": [ ".bmp", @@ -92,7 +112,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ] } } diff --git a/Date-Group/appsettings.json b/Date-Group/appsettings.json index 4629be4..bfd94d0 100644 --- a/Date-Group/appsettings.json +++ b/Date-Group/appsettings.json @@ -70,12 +70,32 @@ "ResultSingleton": "{}", "RootDirectory": "C:/Tmp/phares/Pictures", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "PropertyContentCollectionFiles": [], "ValidImageFormatExtensions": [ @@ -92,7 +112,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ], "VerifyToSeason": [ ". 2000", diff --git a/Delete-By-Distinct/appsettings.json b/Delete-By-Distinct/appsettings.json index c0bf764..80b016d 100644 --- a/Delete-By-Distinct/appsettings.json +++ b/Delete-By-Distinct/appsettings.json @@ -72,12 +72,32 @@ "ResultSingleton": "{}", "RootDirectory": "C:/Tmp/Phares/Compare/Images-dd514b88", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "ValidImageFormatExtensions": [ ".bmp", @@ -93,7 +113,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ] } } diff --git a/Delete-By-Relative/appsettings.json b/Delete-By-Relative/appsettings.json index a9a0ba6..91633a8 100644 --- a/Delete-By-Relative/appsettings.json +++ b/Delete-By-Relative/appsettings.json @@ -67,12 +67,32 @@ "ResultSingleton": "{}", "RootDirectory": "C:/Tmp/Phares/Compare/Images-dd514b88", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "ValidImageFormatExtensions": [ ".bmp", @@ -88,7 +108,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ] } } diff --git a/Distance/Models/_E_Distance.cs b/Distance/Models/_E_Distance.cs index 82233c1..33559a9 100644 --- a/Distance/Models/_E_Distance.cs +++ b/Distance/Models/_E_Distance.cs @@ -229,7 +229,7 @@ public partial class E_Distance : IDistance throw new NullReferenceException(nameof(locationContainer.ExifDirectory)); continue; } - json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(locationContainer.ExifDirectory); + json = Metadata.Models.Stateless.Methods.IMetadata.GetRawFaceEncoding(locationContainer.ExifDirectory); if (json is null) { if (_DistanceMoveUnableToMatch) @@ -338,7 +338,6 @@ public partial class E_Distance : IDistance public static ReadOnlyDictionary> GetMappedWithEncoding(ReadOnlyDictionary> mapped) { Dictionary> results = []; - string? json; LocationContainer? locationContainer; Shared.Models.FaceEncoding? faceEncoding; FaceRecognitionDotNet.FaceEncoding? encoding; @@ -348,8 +347,7 @@ public partial class E_Distance : IDistance keyValuePairs = []; foreach (KeyValuePair keyValue in keyValuePair.Value) { - json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(keyValue.Value.ExifDirectory); - faceEncoding = json is null ? null : JsonSerializer.Deserialize(json); + faceEncoding = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(keyValue.Value.ExifDirectory); if (faceEncoding is null) continue; encoding = FaceRecognition.LoadFaceEncoding(faceEncoding.RawEncoding); @@ -364,7 +362,6 @@ public partial class E_Distance : IDistance public static List GetPreFilterLocationContainer(int maxDegreeOfParallelism, Configuration configuration, string focusDirectory, string focusModel, int? skipPersonWithMoreThen, long ticks, MapLogic mapLogic, long[] jLinkResolvedPersonKeys, ReadOnlyDictionary> mapped, List available) { List results = []; - string? json; string? model; bool? canReMap; bool? isFocusPerson; @@ -403,8 +400,7 @@ public partial class E_Distance : IDistance if (!locationContainer.FilePath.DirectoryFullPath.Contains(focusDirectory)) continue; } - json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(locationContainer.ExifDirectory); - faceEncoding = json is null ? null : JsonSerializer.Deserialize(json); + faceEncoding = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(locationContainer.ExifDirectory); if (faceEncoding is null) continue; encoding = FaceRecognition.LoadFaceEncoding(faceEncoding.RawEncoding); @@ -678,16 +674,12 @@ public partial class E_Distance : IDistance ReadOnlyCollection IDistance.GetRelationContainers(IDistanceLimits distanceLimits, int faceDistancePermyriad, int locationContainerDistanceTake, float locationContainerDistanceTolerance, ReadOnlyCollection locationContainers) { ReadOnlyCollection result; - string? json; List records = []; Shared.Models.FaceEncoding? modelsFaceEncoding; FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding; foreach (LocationContainer locationContainer in locationContainers) { - json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(locationContainer.ExifDirectory); - if (json is null) - continue; - modelsFaceEncoding = JsonSerializer.Deserialize(json); + modelsFaceEncoding = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(locationContainer.ExifDirectory); if (modelsFaceEncoding is null) throw new NotSupportedException(); faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding); diff --git a/Duplicate-Search/appsettings.json b/Duplicate-Search/appsettings.json index e5b1778..4a12e84 100644 --- a/Duplicate-Search/appsettings.json +++ b/Duplicate-Search/appsettings.json @@ -68,12 +68,32 @@ "ResultSingleton": "{}", "RootDirectory": "C:/Tmp/Phares/Compare/Images-dd514b88", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "ValidImageFormatExtensions": [ ".bmp", @@ -89,7 +109,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ] } } diff --git a/Face/Models/_D_Face.cs b/Face/Models/_D_Face.cs index 232e5cf..bbeec19 100644 --- a/Face/Models/_D_Face.cs +++ b/Face/Models/_D_Face.cs @@ -475,7 +475,7 @@ public class D_Face : IFaceD dFace.ReSaveFace(exifDirectory, filePath, face, mappedFile: false); continue; } - location = Shared.Models.Stateless.Methods.ILocation.GetLocation(face.Location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, source.Height, source.Width, collection.Count); + location = Shared.Models.Stateless.Methods.ILocation.GetLocation(face.Location, source.Height, source.Width, collection.Count); if (location is null) continue; width = location.Right - location.Left; @@ -506,7 +506,7 @@ public class D_Face : IFaceD } if (File.Exists(fileName)) File.Delete(fileName); - location = Shared.Models.Stateless.Methods.ILocation.GetLocation(_FaceDistanceHiddenImageFactor, face.Location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, source.Height, source.Width, collection.Count); + location = Shared.Models.Stateless.Methods.ILocation.GetLocation(_FaceDistanceHiddenImageFactor, face.Location, source.Height, source.Width, collection.Count); if (location is null) continue; width = location.Right - location.Left; diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index bfc4fa5..fe2a3e4 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -31,6 +31,8 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable ReadOnlyCollection> FilePathsCollection, ReadOnlyDictionary? SplatNineIdentifiers); + public int? CurrentTick => + _ProgressBar?.CurrentTick; public long Ticks { get; init; } private readonly D_Face _Faces; @@ -1314,7 +1316,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable } } if (items.Count > 0) - throw new Exception($"{items.Count} item(s) of {count} item(s) are not setup!"); + throw new Exception($"{items.Count} item(s) of {count} item(s) are not setup!{Environment.NewLine}{string.Join(Environment.NewLine, items.Select(l => l.FilePath.FileNameFirstSegment))}"); } private Record GetFilesCollectionThenCopyOrMove(IDlibDotNet dlibDotNet, B_Metadata metadata, string fileSearchFilter, string directorySearchFilter, string bResultsFullGroupDirectory, string outputResolution) diff --git a/Map/Models/Stateless/FaceFileLogic.cs b/Map/Models/Stateless/FaceFileLogic.cs index 28a2f00..5c8bac1 100644 --- a/Map/Models/Stateless/FaceFileLogic.cs +++ b/Map/Models/Stateless/FaceFileLogic.cs @@ -64,20 +64,19 @@ internal abstract class FaceFileLogic exifDirectory = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(mappedFile.FilePath); RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName; - LocationContainer locationContainer = new(dateOnly, - exifDirectory, - mappedFile.DirectoryNumber, - personDisplayDirectoryName, - null, - null, - mappedFile.FilePath, - fromDistanceContent, - id.Value, - null, - null, - mappedFile.PersonKey, - rectangle, - wholePercentages.Value); + LocationContainer locationContainer = new(CreationDateOnly: dateOnly, + ExifDirectory: exifDirectory, + DirectoryNumber: mappedFile.DirectoryNumber, + DisplayDirectoryName: personDisplayDirectoryName, + Encoding: null, + FaceFile: null, + FilePath: mappedFile.FilePath, + FromDistanceContent: fromDistanceContent, + Id: id.Value, + LengthPermyriad: null, + LengthSource: null, + PersonKey: mappedFile.PersonKey, + WholePercentages: wholePercentages.Value); lock (locationContainers) locationContainers.Add(locationContainer); } @@ -167,23 +166,19 @@ internal abstract class FaceFileLogic MoveUnableToMatch(filePath); return; } - RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); - if (rectangle is null) - return; - LocationContainer locationContainer = new(dateOnly, - exifDirectory, - null, - null, - null, - faceFile, - filePath, - fromDistanceContent, - filePath.Id.Value, - null, - null, - null, - rectangle, - wholePercentages.Value); + LocationContainer locationContainer = new(CreationDateOnly: dateOnly, + ExifDirectory: exifDirectory, + DirectoryNumber: null, + DisplayDirectoryName: null, + Encoding: null, + FaceFile: faceFile, + FilePath: filePath, + FromDistanceContent: fromDistanceContent, + Id: filePath.Id.Value, + LengthPermyriad: null, + LengthSource: null, + PersonKey: null, + WholePercentages: wholePercentages.Value); lock (locationContainers) locationContainers.Add(locationContainer); } diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index af68af6..5161e53 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -1152,22 +1152,20 @@ internal abstract class MapLogic exifDirectory = null; else exifDirectory = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(mappedFile.FilePath); - RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName; - LocationContainer locationContainer = new(dateOnly, - exifDirectory, - mappedFile.DirectoryNumber, - personDisplayDirectoryName, - null, - null, - mappedFile.FilePath, - fromDistanceContent, - id.Value, - null, - null, - mappedFile.PersonKey, - rectangle, - wholePercentages.Value); + LocationContainer locationContainer = new(CreationDateOnly: dateOnly, + ExifDirectory: exifDirectory, + DirectoryNumber: mappedFile.DirectoryNumber, + DisplayDirectoryName: personDisplayDirectoryName, + Encoding: null, + FaceFile: null, + FilePath: mappedFile.FilePath, + FromDistanceContent: fromDistanceContent, + Id: id.Value, + LengthPermyriad: null, + LengthSource: null, + PersonKey: mappedFile.PersonKey, + WholePercentages: wholePercentages.Value); lock (locationContainers) locationContainers.Add(locationContainer); } @@ -1192,12 +1190,18 @@ internal abstract class MapLogic if (item.WholePercentages == locationContainer.WholePercentages) continue; itemPercentagesRectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, item.WholePercentages); - if (itemPercentagesRectangle is null || locationContainer.Rectangle is null) + if (itemPercentagesRectangle is null) percent = null; else { - itemPercentagesArea = itemPercentagesRectangle.Value.Width * itemPercentagesRectangle.Value.Height; - percent = ILocation.GetIntersectPercent(itemPercentagesRectangle.Value, itemPercentagesArea, locationContainer.Rectangle.Value); + RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, item.WholePercentages); + if (rectangle is null) + percent = null; + else + { + itemPercentagesArea = itemPercentagesRectangle.Value.Width * itemPercentagesRectangle.Value.Height; + percent = ILocation.GetIntersectPercent(itemPercentagesRectangle.Value, itemPercentagesArea, rectangle.Value); + } } delete.Add(item.FilePath); delete.Add(locationContainer.FilePath); diff --git a/Metadata-Query/appsettings.json b/Metadata-Query/appsettings.json index 086a176..2651c3e 100644 --- a/Metadata-Query/appsettings.json +++ b/Metadata-Query/appsettings.json @@ -68,12 +68,32 @@ "ResultSingleton": "{}", "RootDirectory": "D:/Images", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "ValidImageFormatExtensions": [ ".bmp", @@ -89,7 +109,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ] } } diff --git a/Metadata/Models/Stateless/Exif.cs b/Metadata/Models/Stateless/Exif.cs index 1851114..8e40144 100644 --- a/Metadata/Models/Stateless/Exif.cs +++ b/Metadata/Models/Stateless/Exif.cs @@ -28,22 +28,24 @@ internal abstract class Exif private static Shared.Models.AviDirectory[] GetAviDirectories(IReadOnlyList directories) { List results = []; + Shared.Models.AviDirectory aviDirectory; IEnumerable aviDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.ExifDirectoryBase exifDirectoryBase; IEnumerable exifBaseDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.FileMetadataDirectory fileMetadataDirectory; IEnumerable fileMetadataDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.GifHeaderDirectory gifHeaderDirectory; IEnumerable gifHeaderDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.GpsDirectory gpsDirectory; IEnumerable gpsDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.JpegDirectory jpegDirectory; IEnumerable jpegDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.MakernoteDirectory makernoteDirectory; IEnumerable appleMakernoteDirectories = directories.OfType(); 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 canonMakernoteDirectories = directories.OfType(); 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 nikonType2MakernoteDirectories = directories.OfType(); 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 olympusMakernoteDirectories = directories.OfType(); 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 panasonicMakernoteDirectories = directories.OfType(); 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 samsungType2MakernoteDirectories = directories.OfType(); 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 sonyType6MakernoteDirectories = directories.OfType(); 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 directories) { List results = []; + Shared.Models.PhotoshopDirectory photoshopDirectory; IEnumerable photoshopDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.PngDirectory pngDirectory; IEnumerable pngDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory; IEnumerable quickTimeMovieHeaderDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.QuickTimeTrackHeaderDirectory quickTimeTrackHeaderDirectory; IEnumerable quickTimeTrackHeaderDirectories = directories.OfType(); - 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 directories) { List results = []; + Shared.Models.WebPDirectory webPDirectory; IEnumerable webPDirectories = directories.OfType(); - 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(); } diff --git a/Metadata/Models/Stateless/Face.cs b/Metadata/Models/Stateless/Face.cs index 8cb08b1..c967ef1 100644 --- a/Metadata/Models/Stateless/Face.cs +++ b/Metadata/Models/Stateless/Face.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using View_by_Distance.Shared.Models; namespace View_by_Distance.Metadata.Models.Stateless.Methods; @@ -5,6 +6,14 @@ namespace View_by_Distance.Metadata.Models.Stateless.Methods; internal static class Face { + internal static FaceEncoding? GetFaceEncoding(ExifDirectory? exifDirectory) + { + FaceEncoding? result; + string? json = GetFaceEncoding(exifDirectory?.PngDirectories); + result = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize(json, FaceEncodingGenerationContext.Default.FaceEncoding); + return result; + } + internal static string? GetFaceEncoding(PngDirectory[]? pngDirectories) { string? result = null; @@ -22,6 +31,14 @@ internal static class Face return result; } + internal static FaceFile? GetFaceFile(ExifDirectory? exifDirectory) + { + FaceFile? result; + string? json = GetOutputResolution(exifDirectory?.PngDirectories); + result = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize(json, FaceFileGenerationContext.Default.FaceFile); + return result; + } + internal static string? GetOutputResolution(PngDirectory[]? pngDirectories) { string? result = null; diff --git a/Metadata/Models/Stateless/Methods/IMetadata.cs b/Metadata/Models/Stateless/Methods/IMetadata.cs index 0ae7b22..4a9c1b0 100644 --- a/Metadata/Models/Stateless/Methods/IMetadata.cs +++ b/Metadata/Models/Stateless/Methods/IMetadata.cs @@ -14,44 +14,46 @@ public interface IMetadata Meters } - ExifDirectory TestStatic_GetExifDirectory(FilePath filePath) => - GetExifDirectory(filePath); - static ExifDirectory GetExifDirectory(FilePath filePath) => + public static ExifDirectory GetExifDirectory(FilePath filePath) => Exif.GetExifDirectory(filePath); - string? TestStatic_GetOutputResolution(ExifDirectory? exifDirectory) => - GetOutputResolution(exifDirectory); - static string? GetOutputResolution(ExifDirectory? exifDirectory) => - Face.GetOutputResolution(exifDirectory?.PngDirectories); + public static FaceFile? GetFaceFile(ExifDirectory? exifDirectory) => + Face.GetFaceFile(exifDirectory); - string? TestStatic_GetFaceEncoding(ExifDirectory? exifDirectory) => - GetFaceEncoding(exifDirectory); - static string? GetFaceEncoding(ExifDirectory? exifDirectory) => - Face.GetFaceEncoding(exifDirectory?.PngDirectories); - - GeoLocation? TestStatic_GeoLocation(ExifDirectory? exifDirectory) => - GeoLocation(exifDirectory); - static GeoLocation? GeoLocation(ExifDirectory? exifDirectory) => + public static GeoLocation? GeoLocation(ExifDirectory? exifDirectory) => GPS.GeoLocation(exifDirectory?.GpsDirectories); - double? TestStatic_GetDistance(double originLatitude, double originLongitude, double destinationLatitude, double destinationLongitude, int decimalPlaces = 1, DistanceUnit distanceUnit = DistanceUnit.Miles) => - GetDistance(originLatitude, originLongitude, destinationLatitude, destinationLongitude, decimalPlaces, distanceUnit); - static double? GetDistance(double originLatitude, double originLongitude, double destinationLatitude, double destinationLongitude, int decimalPlaces = 1, DistanceUnit distanceUnit = DistanceUnit.Miles) => + public static string? GetOutputResolution(ExifDirectory? exifDirectory) => + Face.GetOutputResolution(exifDirectory?.PngDirectories); + + public static string? GetRawFaceEncoding(ExifDirectory? exifDirectory) => + Face.GetFaceEncoding(exifDirectory?.PngDirectories); + + public static FaceEncoding? GetFaceEncoding(ExifDirectory? exifDirectory) => + Face.GetFaceEncoding(exifDirectory); + + public static double? GetDistance(double originLatitude, double originLongitude, double destinationLatitude, double destinationLongitude, int decimalPlaces = 1, DistanceUnit distanceUnit = DistanceUnit.Miles) => GPS.GetDistance(originLatitude, originLongitude, destinationLatitude, destinationLongitude, decimalPlaces, distanceUnit); - // string? TestStatic_GetFaceEncoding(IReadOnlyList directories) => - // GetFaceEncoding(directories); - // static string? GetFaceEncoding(IReadOnlyList directories) => - // Metadata.GetFaceEncoding(directories); + internal ExifDirectory TestStatic_GetExifDirectory(FilePath filePath) => + GetExifDirectory(filePath); - // string? TestStatic_GetOutputResolution(IReadOnlyList directories) => - // GetOutputResolution(directories); - // static string? GetOutputResolution(IReadOnlyList directories) => - // Metadata.GetOutputResolution(directories); + internal GeoLocation? TestStatic_GeoLocation(ExifDirectory? exifDirectory) => + GeoLocation(exifDirectory); - // Dictionary TestStatic_GetMetadataCollection(FileInfo fileInfo, List> subFileTuples, List parseExceptions) => - // GetMetadataCollection(fileInfo, subFileTuples, parseExceptions); - // static Dictionary GetMetadataCollection(FileInfo fileInfo, List> subFileTuples, List parseExceptions) => - // Metadata.GetMetadataCollection(fileInfo, subFileTuples, parseExceptions); + internal string? TestStatic_GetRawFaceEncoding(ExifDirectory? exifDirectory) => + GetRawFaceEncoding(exifDirectory); + + internal string? TestStatic_GetOutputResolution(ExifDirectory? exifDirectory) => + GetOutputResolution(exifDirectory); + + internal static FaceFile? TestStatic_GetFaceFile(ExifDirectory? exifDirectory) => + GetFaceFile(exifDirectory); + + internal FaceEncoding? TestStatic_GetFaceEncoding(ExifDirectory? exifDirectory) => + GetFaceEncoding(exifDirectory); + + internal double? TestStatic_GetDistance(double originLatitude, double originLongitude, double destinationLatitude, double destinationLongitude, int decimalPlaces = 1, DistanceUnit distanceUnit = DistanceUnit.Miles) => + GetDistance(originLatitude, originLongitude, destinationLatitude, destinationLongitude, decimalPlaces, distanceUnit); } \ No newline at end of file diff --git a/Mirror-Length/appsettings.json b/Mirror-Length/appsettings.json index 086a176..2651c3e 100644 --- a/Mirror-Length/appsettings.json +++ b/Mirror-Length/appsettings.json @@ -68,12 +68,32 @@ "ResultSingleton": "{}", "RootDirectory": "D:/Images", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "ValidImageFormatExtensions": [ ".bmp", @@ -89,7 +109,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ] } } diff --git a/Offset-Date-Time-Original/appsettings.json b/Offset-Date-Time-Original/appsettings.json index e733c41..a582db7 100644 --- a/Offset-Date-Time-Original/appsettings.json +++ b/Offset-Date-Time-Original/appsettings.json @@ -67,12 +67,32 @@ "ResultSingleton": "{}", "RootDirectory": "D:/Images", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "ValidImageFormatExtensions": [ ".bmp", @@ -88,7 +108,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ] } } diff --git a/PrepareForOld/appsettings.Development.json b/PrepareForOld/appsettings.Development.json index a709607..436bc23 100644 --- a/PrepareForOld/appsettings.Development.json +++ b/PrepareForOld/appsettings.Development.json @@ -60,12 +60,32 @@ "PropertiesChangedForProperty": false, "RootDirectory": "C:/Tmp/Phares/Pictures", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "PropertyContentCollectionFiles": [], "Spelling": [ @@ -108,7 +128,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ], "VerifyToSeason": [ ". 2000", diff --git a/Rename/.vscode/appsettings.example.json b/Rename/.vscode/appsettings.example.json index d3fe436..9d50c13 100644 --- a/Rename/.vscode/appsettings.example.json +++ b/Rename/.vscode/appsettings.example.json @@ -82,12 +82,32 @@ "xxxRootDirectory": "D:/1-Images-A/Images-dd514b88/Facebook/2023.3 Facebook", "RootDirectory": "D:/7-Question/California", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "ValidImageFormatExtensions": [ ".bmp", @@ -103,7 +123,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ] } }, diff --git a/Set-Created-Date/appsettings.json b/Set-Created-Date/appsettings.json index bafa145..a6fbde1 100644 --- a/Set-Created-Date/appsettings.json +++ b/Set-Created-Date/appsettings.json @@ -69,12 +69,32 @@ "ResultSingleton": "{}", "RootDirectory": "D:/Images", "IgnoreExtensions": [ + ".ffs_db", + ".FFS_DB", ".gif", ".GIF", + ".html", + ".HTML", + ".ico", + ".ICO", + ".json", + ".JSON", + ".lnk", + ".LNK", + ".lsv", + ".LSV", ".nef", ".NEF", ".pdf", - ".PDF" + ".PDF", + ".ts", + ".TS", + ".txt", + ".TXT", + ".webp", + ".WEBP", + ".xmp", + ".XMP" ], "ValidImageFormatExtensions": [ ".bmp", @@ -90,7 +110,9 @@ ".tiff", ".TIFF", ".tif", - ".TIF" + ".TIF", + ".webp", + ".WEBP" ] } } diff --git a/Shared/Models/Location.cs b/Shared/Models/Location.cs index bff202c..bfe6ac1 100644 --- a/Shared/Models/Location.cs +++ b/Shared/Models/Location.cs @@ -23,7 +23,7 @@ public class Location : Properties.ILocation, IEquatable _ = Stateless.Methods.Location.Check(bottom, left, right, top, zCount: 1, throwException: true); } - public Location(double confidence, int height, Location location, int locationDigits, int locationFactor, int width, int zCount) : + public Location(double confidence, int height, Location location, int width, int zCount) : this( location.Bottom, confidence, @@ -32,7 +32,7 @@ public class Location : Properties.ILocation, IEquatable location.Top) => Stateless.Methods.Location.Check(Bottom, height, Left, Right, Top, width, zCount, throwException: true); - public Location(int bottom, double confidence, int height, int left, int locationDigits, int locationFactor, int right, int top, int width, int zCount) : + public Location(int bottom, double confidence, int height, int left, int right, int top, int width, int zCount) : this( bottom, confidence, @@ -41,7 +41,7 @@ public class Location : Properties.ILocation, IEquatable top) => Stateless.Methods.Location.Check(Bottom, height, Left, Right, Top, width, zCount, throwException: true); - public Location(int height, Location location, int locationDigits, int locationFactor, int width, int zCount) : + public Location(int height, Location location, int width, int zCount) : this( location.Bottom, location.Confidence, @@ -50,7 +50,7 @@ public class Location : Properties.ILocation, IEquatable location.Top) => Stateless.Methods.Location.Check(Bottom, height, Left, Right, Top, width, zCount, throwException: true); - public Location(double confidence, int factor, int height, Location location, int locationDigits, int locationFactor, int width, int zCount) + public Location(double confidence, int factor, int height, Location location, int width, int zCount) { int x = (location.Right - location.Left) / factor; int y = (location.Bottom - location.Top) / factor; diff --git a/Shared/Models/LocationContainer.cs b/Shared/Models/LocationContainer.cs index 8918861..7dfef97 100644 --- a/Shared/Models/LocationContainer.cs +++ b/Shared/Models/LocationContainer.cs @@ -1,5 +1,3 @@ -using System.Drawing; - namespace View_by_Distance.Shared.Models; public record LocationContainer(DateOnly CreationDateOnly, @@ -14,47 +12,44 @@ public record LocationContainer(DateOnly CreationDateOnly, int? LengthPermyriad, FilePath? LengthSource, long? PersonKey, - RectangleF? Rectangle, int WholePercentages) { public static LocationContainer Get(LocationContainer locationContainer, object? encoding, bool keepExifDirectory) { LocationContainer result; - result = new(locationContainer.CreationDateOnly, - keepExifDirectory ? locationContainer.ExifDirectory : null, - locationContainer.DirectoryNumber, - locationContainer.DisplayDirectoryName, - encoding, - locationContainer.FaceFile, - locationContainer.FilePath, - locationContainer.FromDistanceContent, - locationContainer.Id, - locationContainer.LengthPermyriad, - locationContainer.LengthSource, - locationContainer.PersonKey, - locationContainer.Rectangle, - locationContainer.WholePercentages); + result = new(CreationDateOnly: locationContainer.CreationDateOnly, + ExifDirectory: keepExifDirectory ? locationContainer.ExifDirectory : null, + DirectoryNumber: locationContainer.DirectoryNumber, + DisplayDirectoryName: locationContainer.DisplayDirectoryName, + Encoding: encoding, + FaceFile: locationContainer.FaceFile, + FilePath: locationContainer.FilePath, + FromDistanceContent: locationContainer.FromDistanceContent, + Id: locationContainer.Id, + LengthPermyriad: locationContainer.LengthPermyriad, + LengthSource: locationContainer.LengthSource, + PersonKey: locationContainer.PersonKey, + WholePercentages: locationContainer.WholePercentages); return result; } public static LocationContainer Get(LocationContainer source, LocationContainer locationContainer, int lengthPermyriad, bool keepExifDirectory, bool keepEncoding) { LocationContainer result; - result = new(locationContainer.CreationDateOnly, - keepExifDirectory ? locationContainer.ExifDirectory : null, - locationContainer.DirectoryNumber, - locationContainer.DisplayDirectoryName, - keepEncoding ? locationContainer.Encoding : null, - locationContainer.FaceFile, - locationContainer.FilePath, - locationContainer.FromDistanceContent, - locationContainer.Id, - lengthPermyriad, - source.FilePath, - locationContainer.PersonKey, - locationContainer.Rectangle, - locationContainer.WholePercentages); + result = new(CreationDateOnly: locationContainer.CreationDateOnly, + ExifDirectory: keepExifDirectory ? locationContainer.ExifDirectory : null, + DirectoryNumber: locationContainer.DirectoryNumber, + DisplayDirectoryName: locationContainer.DisplayDirectoryName, + Encoding: keepEncoding ? locationContainer.Encoding : null, + FaceFile: locationContainer.FaceFile, + FilePath: locationContainer.FilePath, + FromDistanceContent: locationContainer.FromDistanceContent, + Id: locationContainer.Id, + LengthPermyriad: lengthPermyriad, + LengthSource: source.FilePath, + PersonKey: locationContainer.PersonKey, + WholePercentages: locationContainer.WholePercentages); return result; } diff --git a/Shared/Models/Stateless/Methods/IDlibDotNet.cs b/Shared/Models/Stateless/Methods/IDlibDotNet.cs index a1fe46c..0b869b2 100644 --- a/Shared/Models/Stateless/Methods/IDlibDotNet.cs +++ b/Shared/Models/Stateless/Methods/IDlibDotNet.cs @@ -5,6 +5,7 @@ public interface IDlibDotNet void Tick(); long Ticks { get; } + int? CurrentTick { get; } (string, string) GetResultsFullGroupDirectories(); void ConstructProgressBar(int maxTicks, string message); (string, string, string, string) GetResultsFullGroupDirectories(string outputResolution); diff --git a/Shared/Models/Stateless/Methods/ILocation.cs b/Shared/Models/Stateless/Methods/ILocation.cs index 8c27447..14d562c 100644 --- a/Shared/Models/Stateless/Methods/ILocation.cs +++ b/Shared/Models/Stateless/Methods/ILocation.cs @@ -55,15 +55,15 @@ public interface ILocation static string GetLeftPadded(int locationDigits, int value) => GetLeftPadded(locationDigits, value.ToString()); - Models.Location? TestStatic_GetLocation(Models.Location? location, int locationDigits, int locationFactor, int height, int width, int zCount) => - GetLocation(location, locationDigits, locationFactor, height, width, zCount); - static Models.Location? GetLocation(Models.Location? location, int locationDigits, int locationFactor, int height, int width, int zCount) => - location is null ? null : new(location.Confidence, height, location, locationDigits, locationFactor, width, zCount); + Models.Location? TestStatic_GetLocation(Models.Location? location, int height, int width, int zCount) => + GetLocation(location, height, width, zCount); + static Models.Location? GetLocation(Models.Location? location, int height, int width, int zCount) => + location is null ? null : new(location.Confidence, height, location, width, zCount); - Models.Location? TestStatic_GetLocation(int factor, Models.Location? location, int locationDigits, int locationFactor, int height, int width, int zCount) => - GetLocation(factor, location, locationDigits, locationFactor, height, width, zCount); - static Models.Location? GetLocation(int factor, Models.Location? location, int locationDigits, int locationFactor, int height, int width, int zCount) => - location is null ? null : new(location.Confidence, factor, height, location, locationDigits, locationFactor, width, zCount); + Models.Location? TestStatic_GetLocation(int factor, Models.Location? location, int height, int width, int zCount) => + GetLocation(factor, location, height, width, zCount); + static Models.Location? GetLocation(int factor, Models.Location? location, int height, int width, int zCount) => + location is null ? null : new(location.Confidence, factor, height, location, width, zCount); (decimal?, decimal?, decimal?, decimal?) TestStatic_GetHeightLeftTopWidth(int bottom, int height, int left, int right, int top, int width) => GetHeightLeftTopWidth(bottom, height, left, right, top, width); @@ -107,8 +107,6 @@ public interface ILocation detectionConfidence, height, Math.Max(rectangle.Left, 0), - Stateless.ILocation.Digits, - Stateless.ILocation.Factor, Math.Min(rectangle.Right, width), Math.Max(rectangle.Top, 0), width, diff --git a/Shared/Models/Stateless/Methods/Id.cs b/Shared/Models/Stateless/Methods/Id.cs index 3c75879..5729bec 100644 --- a/Shared/Models/Stateless/Methods/Id.cs +++ b/Shared/Models/Stateless/Methods/Id.cs @@ -1,4 +1,5 @@ using System.Text; +using View_by_Distance.Shared.Models.Properties; namespace View_by_Distance.Shared.Models.Stateless.Methods; @@ -27,7 +28,20 @@ internal abstract class Id internal static byte GetHasIgnoreKeyword(FilePath filePath) => (byte)(filePath.Id > -1 ? 8 : 2); - internal static int GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId) + internal static byte GetHasDateTimeOriginal(IPropertyConfiguration propertyConfiguration, FilePath filePath) => + (byte)(IsIgnoreOrValidVideoFormatExtension(propertyConfiguration, filePath) ? filePath.Id > -1 ? 6 : 4 : filePath.Id > -1 ? 9 : 1); + + private static bool IsIgnoreOrValidVideoFormatExtension(IPropertyConfiguration propertyConfiguration, FilePath filePath) => + IsIgnoreOrValidVideoFormatExtension(propertyConfiguration, filePath.ExtensionLowered); + + private static bool IsIgnoreOrValidVideoFormatExtension(IPropertyConfiguration propertyConfiguration, string extensionLowered) => + propertyConfiguration.IgnoreExtensions.Contains(extensionLowered) + || propertyConfiguration.ValidVideoFormatExtensions.Contains(extensionLowered); + + internal static byte GetMissingDateTimeOriginal(IPropertyConfiguration propertyConfiguration, FilePath filePath) => + (byte)(IsIgnoreOrValidVideoFormatExtension(propertyConfiguration, filePath) ? filePath.Id > -1 ? 5 : 0 : filePath.Id > -1 ? 7 : 3); + + internal static int GetId(IPropertyConfiguration propertyConfiguration, string intelligentId) { int result; StringBuilder results = new(); @@ -44,13 +58,7 @@ internal abstract class Id return result; } - internal static byte GetHasDateTimeOriginal(Properties.IPropertyConfiguration propertyConfiguration, FilePath filePath) => - (byte)(propertyConfiguration.IgnoreExtensions.Contains(filePath.ExtensionLowered) || propertyConfiguration.ValidVideoFormatExtensions.Contains(filePath.ExtensionLowered) ? filePath.Id > -1 ? 6 : 4 : filePath.Id > -1 ? 9 : 1); - - internal static byte GetMissingDateTimeOriginal(Properties.IPropertyConfiguration propertyConfiguration, FilePath filePath) => - (byte)(propertyConfiguration.IgnoreExtensions.Contains(filePath.ExtensionLowered) || propertyConfiguration.ValidVideoFormatExtensions.Contains(filePath.ExtensionLowered) ? filePath.Id > -1 ? 5 : 0 : filePath.Id > -1 ? 7 : 3); - - internal static bool NameWithoutExtensionIsIdFormat(Properties.IPropertyConfiguration propertyConfiguration, string fileNameWithoutExtension) + internal static bool NameWithoutExtensionIsIdFormat(IPropertyConfiguration propertyConfiguration, string fileNameWithoutExtension) { bool result; if (fileNameWithoutExtension.Length < 5 || fileNameWithoutExtension.Length > propertyConfiguration.IntMinValueLength) @@ -63,7 +71,7 @@ internal abstract class Id return result; } - internal static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, string extensionLowered, bool? hasIgnoreKeyword, bool? hasDateTimeOriginal) + internal static string GetIntelligentId(IPropertyConfiguration propertyConfiguration, long id, string extensionLowered, bool? hasIgnoreKeyword, bool? hasDateTimeOriginal) { string result; StringBuilder stringBuilder = new(); @@ -79,18 +87,18 @@ internal abstract class Id } else if (id > -1) { - if (!propertyConfiguration.ValidVideoFormatExtensions.Contains(extensionLowered)) - key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 8 : hasDateTimeOriginal.Value ? 9 : 7; - else + if (IsIgnoreOrValidVideoFormatExtension(propertyConfiguration, extensionLowered)) key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? throw new NotImplementedException() : hasDateTimeOriginal.Value ? 6 : 5; + else + key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 8 : hasDateTimeOriginal.Value ? 9 : 7; value = id.ToString().PadLeft(propertyConfiguration.IntMinValueLength, '0'); } else { - if (!propertyConfiguration.ValidVideoFormatExtensions.Contains(extensionLowered)) - key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 2 : hasDateTimeOriginal.Value ? 1 : 3; - else + if (IsIgnoreOrValidVideoFormatExtension(propertyConfiguration, extensionLowered)) key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? throw new NotImplementedException() : hasDateTimeOriginal.Value ? 4 : 0; + else + key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 2 : hasDateTimeOriginal.Value ? 1 : 3; value = id.ToString()[1..].PadLeft(propertyConfiguration.IntMinValueLength, '0'); } for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength - 1; i > -1; i--) @@ -101,7 +109,7 @@ internal abstract class Id return result; } - internal static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int id, string extensionLowered, bool? hasIgnoreKeyword, bool? hasDateTimeOriginal, int? index) + internal static string GetPaddedId(IPropertyConfiguration propertyConfiguration, int id, string extensionLowered, bool? hasIgnoreKeyword, bool? hasDateTimeOriginal, int? index) { string result; if (propertyConfiguration.Offset < 0) diff --git a/Shared/Models/Stateless/Methods/Location.cs b/Shared/Models/Stateless/Methods/Location.cs index 2ee5801..b52f0d2 100644 --- a/Shared/Models/Stateless/Methods/Location.cs +++ b/Shared/Models/Stateless/Methods/Location.cs @@ -136,7 +136,10 @@ internal abstract class Location result = null; else { - if (!int.TryParse(segments[1], out int xWholePercent) || !int.TryParse(segments[2], out int yWholePercent) || !int.TryParse(segments[3], out int wWholePercent) || !int.TryParse(segments[4], out int hWholePercent)) + if (!int.TryParse(segments[1], out int xWholePercent) + || !int.TryParse(segments[2], out int yWholePercent) + || !int.TryParse(segments[3], out int wWholePercent) + || !int.TryParse(segments[4], out int hWholePercent)) result = null; else { diff --git a/Shared/Models/Stateless/Methods/XDirectory.cs b/Shared/Models/Stateless/Methods/XDirectory.cs index 580ac0f..92519e5 100644 --- a/Shared/Models/Stateless/Methods/XDirectory.cs +++ b/Shared/Models/Stateless/Methods/XDirectory.cs @@ -1,4 +1,5 @@ using System.Collections.ObjectModel; +using System.Diagnostics; namespace View_by_Distance.Shared.Models.Stateless.Methods; @@ -384,7 +385,12 @@ internal abstract partial class XDirectory else { if (filePath.Id is null) - throw new NullReferenceException(nameof(filePath.Id)); + { + if (Debugger.IsAttached) + continue; + else + throw new NullReferenceException(nameof(filePath.Id)); + } intelligentId = IId.GetIntelligentId(propertyConfiguration, filePath.Id.Value, filePath.ExtensionLowered, filePath.HasIgnoreKeyword, filePath.HasDateTimeOriginal); if (!isOffsetDeterministicHashCode) checkFile = Path.Combine(directory, $"{intelligentId}{filePath.ExtensionLowered}"); diff --git a/Tests/UnitTestCalculations.cs b/Tests/UnitTestCalculations.cs index 53d0212..9735f47 100644 --- a/Tests/UnitTestCalculations.cs +++ b/Tests/UnitTestCalculations.cs @@ -162,8 +162,8 @@ public partial class UnitTestCalculations width = 100; height = 100; Location location = new(bottom, confidence, left, right, top); - _ = new Location(confidence, height, location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, width, 1); - _ = new Location(bottom, confidence, height, left, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, right, top, width, 1); + _ = new Location(confidence, height, location, width, 1); + _ = new Location(bottom, confidence, height, left, right, top, width, 1); NonThrowTryCatch(); } @@ -188,7 +188,7 @@ public partial class UnitTestCalculations bottom = 50; width = 100; height = 100; - location = new(bottom, confidence, height, left, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, right, top, width, 1); + location = new(bottom, confidence, height, left, right, top, width, 1); areaPermyriad = IMapping.GetAreaPermyriad(faceAreaPermyriad, height, location, width); Assert.IsTrue(areaPermyriad == 2500); left = 0; @@ -197,7 +197,7 @@ public partial class UnitTestCalculations bottom = 25; width = 100; height = 100; - location = new(bottom, confidence, height, left, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, right, top, width, 1); + location = new(bottom, confidence, height, left, right, top, width, 1); OutputResolution outputResolution = new(height, 0, width); areaPermyriad = IMapping.GetAreaPermyriad(faceAreaPermyriad, location, outputResolution); Assert.IsTrue(areaPermyriad == 625);