From 9b9573093fbbe407382d68529b076c4fc9da62d0 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Tue, 3 Jan 2023 18:59:02 -0700 Subject: [PATCH] GetModel --- Instance/DlibDotNet.cs | 24 +++++------ Instance/Models/_F_Random.cs | 2 + Map/Map.csproj | 1 + Map/Models/MapLogic.cs | 40 ++++++++++++++----- .../Models/Stateless/Methods/IMetadata.cs | 5 +++ Metadata/Models/Stateless/Methods/Metadata.cs | 21 +++++++--- 6 files changed, 66 insertions(+), 27 deletions(-) diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 1bac4f3..694a78c 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -287,7 +287,7 @@ public partial class DlibDotNet private void FullParallelForWork( A_Property propertyLogic, - Dictionary>> idToMappedFaceFilesWithCollection, + Dictionary>> idToLocationContainers, string outputResolution, string bResultsFullGroupDirectory, string cResultsFullGroupDirectory, @@ -380,7 +380,7 @@ public partial class DlibDotNet if (item.Property?.Id is null) collection = null; else - _ = idToMappedFaceFilesWithCollection.TryGetValue(item.Property.Id.Value, out collection); + _ = idToLocationContainers.TryGetValue(item.Property.Id.Value, out collection); if (!fileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection)) mappingFromPhotoPrismCollection = null; faces = _Faces.GetFaces(outputResolution, dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionToResize, collection, mappingFromPhotoPrismCollection); @@ -415,7 +415,7 @@ public partial class DlibDotNet private int FullParallelWork(int maxDegreeOfParallelism, A_Property propertyLogic, - Dictionary>> idToMappedFaceFilesWithCollection, + Dictionary>> idToLocationContainers, string outputResolution, string bResultsFullGroupDirectory, string cResultsFullGroupDirectory, @@ -459,7 +459,7 @@ public partial class DlibDotNet try { FullParallelForWork(propertyLogic, - idToMappedFaceFilesWithCollection, + idToLocationContainers, outputResolution, bResultsFullGroupDirectory, cResultsFullGroupDirectory, @@ -646,7 +646,7 @@ public partial class DlibDotNet _Metadata.SetAngleBracketCollection(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, container.SourceDirectory); } - private void FullDoWork(string argZero, string propertyRoot, long ticks, A_Property propertyLogic, int t, Container[] containers, string eDistanceContentDirectory, Dictionary> fileNameToCollection, Dictionary>> idToMappedFaceFilesWithCollection) + private void FullDoWork(string argZero, string propertyRoot, long ticks, A_Property propertyLogic, int t, Container[] containers, string eDistanceContentDirectory, Dictionary> fileNameToCollection, Dictionary>> idToLocationContainers) { if (_Log is null) throw new NullReferenceException(nameof(_Log)); @@ -702,7 +702,7 @@ public partial class DlibDotNet exceptionCount = FullParallelWork( maxDegreeOfParallelism, propertyLogic, - idToMappedFaceFilesWithCollection, + idToLocationContainers, outputResolution, bResultsFullGroupDirectory, cResultsFullGroupDirectory, @@ -1189,10 +1189,10 @@ public partial class DlibDotNet return results; } - private static void LookForAbandoned(Dictionary>> idToMappedFaceFilesWithCollection, List distinctFilteredIds) + private static void LookForAbandoned(Dictionary>> idToLocationContainers, List distinctFilteredIds) { List renameCollection = new(); - foreach (KeyValuePair>> idToCollection in idToMappedFaceFilesWithCollection) + foreach (KeyValuePair>> idToCollection in idToLocationContainers) { if (distinctFilteredIds.Contains(idToCollection.Key)) continue; @@ -1279,15 +1279,15 @@ public partial class DlibDotNet MapLogic? mapLogic = _Configuration.DistanceMoveUnableToMatch ? null : new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory, mapLogicSupport); personKeyToIds = mapLogic is null ? new() : mapLogic.GetPersonKeyToIds(); fileNameToCollection = !Directory.Exists(fPhotoPrismSingletonDirectory) ? fileNameToCollection = new() : F_PhotoPrism.GetFileNameToCollection(fPhotoPrismSingletonDirectory); - Dictionary>> idToMappedFaceFilesWithCollection = GetDictionary(ticks, a2PeopleContentDirectory, eDistanceContentDirectory); - FullDoWork(argZero, propertyRoot, ticks, propertyLogic, t, containers, eDistanceContentDirectory, fileNameToCollection, idToMappedFaceFilesWithCollection); + Dictionary>> idToLocationContainers = GetDictionary(ticks, a2PeopleContentDirectory, eDistanceContentDirectory); + FullDoWork(argZero, propertyRoot, ticks, propertyLogic, t, containers, eDistanceContentDirectory, fileNameToCollection, idToLocationContainers); _Distance.Clear(); mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory, mapLogicSupport); SetMapping(fileNameToCollection, argZero, containers); if (!personKeyToIds.Any()) personKeyToIds = mapLogic.GetPersonKeyToIds(); (List distinctFilteredIds, List distinctFilteredFaces) = GetFilteredDistinct(argZero, containers); - LookForAbandoned(idToMappedFaceFilesWithCollection, distinctFilteredIds); + LookForAbandoned(idToLocationContainers, distinctFilteredIds); Mapping[] mappingCollection = MapLogicSupport.GetSelectedMappingCollection(distinctFilteredFaces); int totalNotMapped = mapLogic.UpdateMappingFromPerson(mappingCollection); if (a2PeopleContentDirectory is not null && false) @@ -1297,7 +1297,7 @@ public partial class DlibDotNet if (_PropertyRootExistedBefore || container is not null) break; if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) - mapLogic.SaveShortcutsForOutputResolutions(a2PeopleContentDirectory, personKeyToIds, mappingCollection, totalNotMapped); + mapLogic.SaveShortcutsForOutputResolutions(a2PeopleContentDirectory, personKeyToIds, idToLocationContainers, mappingCollection, totalNotMapped); if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution)) mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, _PersonContainers, a2PeopleContentDirectory, personKeyToIds, mappingCollection, totalNotMapped); (aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); diff --git a/Instance/Models/_F_Random.cs b/Instance/Models/_F_Random.cs index 47795cf..bbfd818 100644 --- a/Instance/Models/_F_Random.cs +++ b/Instance/Models/_F_Random.cs @@ -58,6 +58,8 @@ internal class F_Random continue; if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys)) continue; + if (Shared.Models.Stateless.Methods.IPersonBirthday.IsCounterPersonBirthday(mapping.MappingFromPerson.PersonBirthday)) + continue; if (!personKeys.Contains(mapping.MappingFromPerson.PersonBirthday.Value.Ticks)) continue; personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; diff --git a/Map/Map.csproj b/Map/Map.csproj index 5812419..ff71492 100644 --- a/Map/Map.csproj +++ b/Map/Map.csproj @@ -43,5 +43,6 @@ + \ No newline at end of file diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 2d418d1..09e6bad 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -148,8 +148,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any()) continue; personBirthday = personContainer.Birthdays[zero]; - if (IPersonBirthday.IsCounterPersonBirthday(personBirthday)) - continue; personKey = personBirthday.Value.Ticks; if (!results.TryGetValue(personKey, out collection)) { @@ -1082,37 +1080,57 @@ public class MapLogic : Shared.Models.Methods.IMapLogic SaveContainers(totalNotMapped, null, saveContainers); } - public void SaveShortcutsForOutputResolutions(string a2PeopleContentDirectory, Dictionary> personKeyToIds, Mapping[] mappingCollection, int totalNotMapped) + public void SaveShortcutsForOutputResolutions(string a2PeopleContentDirectory, Dictionary> personKeyToIds, Dictionary>> idToLocationContainers, Mapping[] mappingCollection, int totalNotMapped) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); + string? model; long personKey; string fileName; string directory; string hiddenFile; - string personDirectory; List? personKeys; string personKeyFormatted; WindowsShortcut windowsShortcut; + IReadOnlyList directories; List collection = new(); + List>? locationContainers; Dictionary> idToPersonKeys = Stateless.Methods.IMapLogic.GetIdToPersonKeys(personKeyToIds); foreach (Mapping mapping in mappingCollection) { if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null || mapping.MappingFromPerson is null) continue; + if (!idToLocationContainers.TryGetValue(mapping.MappingFromItem.Id, out locationContainers) || !locationContainers.Any()) + directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mapping.MappingFromItem.ResizedFileHolder.FullName); + else + { + directories = locationContainers.First().Directories; + model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories); + if (model is null) + directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mapping.MappingFromItem.ResizedFileHolder.FullName); + } + model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories); + if (!string.IsNullOrEmpty(model) && !string.IsNullOrEmpty(model.Trim())) + { + directory = Path.Combine(a2PeopleContentDirectory, "Model Shortcuts", model, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); + fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); + collection.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); + } if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys)) continue; personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; if (!personKeys.Contains(mapping.MappingFromPerson.PersonBirthday.Value.Ticks)) continue; personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday); - directory = Path.Combine(a2PeopleContentDirectory, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", personKeyFormatted); - personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName[..1], Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); - fileName = Path.Combine(personDirectory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk"); - collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); + directory = Path.Combine(a2PeopleContentDirectory, "Person Key Shortcuts", personKeyFormatted, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); + fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); + collection.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); + directory = Path.Combine(a2PeopleContentDirectory, "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); + fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); + collection.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); } - string[] directories = (from l in collection select l.Directory).Distinct().ToArray(); - foreach (string d in directories) + string[] distinctDirectories = (from l in collection select l.Directory).Distinct().ToArray(); + foreach (string d in distinctDirectories) { if (string.IsNullOrEmpty(d)) continue; @@ -1122,6 +1140,8 @@ public class MapLogic : Shared.Models.Methods.IMapLogic foreach (SaveShortcutsForOutputResolutions s in collection) { hiddenFile = $"{s.FileName}.lvs"; + if (File.Exists(hiddenFile)) + continue; File.WriteAllLines(hiddenFile, new string[] { s.FullName, s.Description }); File.SetAttributes(hiddenFile, FileAttributes.Hidden); File.SetLastWriteTime(hiddenFile, s.DateTime); diff --git a/Metadata/Models/Stateless/Methods/IMetadata.cs b/Metadata/Models/Stateless/Methods/IMetadata.cs index 97baa99..eb4926b 100644 --- a/Metadata/Models/Stateless/Methods/IMetadata.cs +++ b/Metadata/Models/Stateless/Methods/IMetadata.cs @@ -8,6 +8,11 @@ public interface IMetadata static DateTime GetMinimumDateTime(DateTime?[] dateTimes, int year, IReadOnlyList directories) => Metadata.GetMinimumDateTime(dateTimes, year, directories); + string? TestStatic_GetModel(IReadOnlyList directories) => + GetModel(directories); + static string? GetModel(IReadOnlyList directories) => + Metadata.GetModel(directories); + string? TestStatic_GetFaceEncoding(IReadOnlyList directories) => GetFaceEncoding(directories); static string? GetFaceEncoding(IReadOnlyList directories) => diff --git a/Metadata/Models/Stateless/Methods/Metadata.cs b/Metadata/Models/Stateless/Methods/Metadata.cs index 7d44b2c..1e8b15f 100644 --- a/Metadata/Models/Stateless/Methods/Metadata.cs +++ b/Metadata/Models/Stateless/Methods/Metadata.cs @@ -58,14 +58,14 @@ internal class Metadata DateTime result; DateTime dateTime; List results = (from l in dateTimes where l is not null select l.Value).ToList(); - ExifSubIfdDirectory? exifSubIfdDirectory = directories.OfType().FirstOrDefault(); - if (exifSubIfdDirectory is not null) + ExifDirectoryBase? exifDirectoryBase = directories.OfType().FirstOrDefault(); + if (exifDirectoryBase is not null) { - if (exifSubIfdDirectory.TryGetDateTime(ExifDirectoryBase.TagDateTime, out dateTime)) + if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTime, out dateTime)) results.Add(dateTime); - if (exifSubIfdDirectory.TryGetDateTime(ExifDirectoryBase.TagDateTimeDigitized, out dateTime)) + if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeDigitized, out dateTime)) results.Add(dateTime); - if (exifSubIfdDirectory.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out dateTime)) + if (exifDirectoryBase.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out dateTime)) results.Add(dateTime); } AviDirectory? aviDirectory = directories.OfType().FirstOrDefault(); @@ -94,6 +94,17 @@ internal class Metadata return result; } + internal static string? GetModel(IReadOnlyList directories) + { + string? result; + ExifDirectoryBase? exifDirectoryBase = directories.OfType().FirstOrDefault(); + if (exifDirectoryBase is null) + result = null; + else + result = exifDirectoryBase.GetString(ExifDirectoryBase.TagModel); + return result; + } + internal static int GetOrientation(List> metadataCollection) { int result;