diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 0705373..eacef44 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -256,7 +256,6 @@ public partial class DlibDotNet configuration.PersonBirthdayFirstYear, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), - configuration.PersonCharactersCopyCount, configuration.RangeDaysDeltaTolerance, configuration.RangeDistanceTolerance, configuration.SaveSortingWithoutPerson, @@ -802,8 +801,12 @@ public partial class DlibDotNet List filteredItems = GetItems(argZero, containers); mapLogic.SaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, dFacesContentDirectory, filteredItems, mappingCollection); } - if (_Configuration.PersonCharactersCopyCount > 0 && !string.IsNullOrEmpty(_Configuration.PersonCharacters)) - mapLogic.CopyAtLeastOneMappedFiles(dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection); + if (!string.IsNullOrEmpty(_Configuration.PersonCharacters)) + { + if (_Configuration.PersonCharactersCopyCount > 0) + mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersCopyCount, dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection); + mapLogic.SavePersonKeyToCount(dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection); + } mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedRectangleToMapping); if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution)) mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, personKeyToIds, mappingCollection, idToNormalizedRectangleToMapping, totalNotMapped); diff --git a/Map/Models/Configuration.cs b/Map/Models/Configuration.cs index f79a838..da085be 100644 --- a/Map/Models/Configuration.cs +++ b/Map/Models/Configuration.cs @@ -15,7 +15,6 @@ public class Configuration public int PersonBirthdayFirstYear { init; get; } public string PersonBirthdayFormat { init; get; } public char[] PersonCharacters { init; get; } - public int PersonCharactersCopyCount { init; get; } public int RangeDaysDeltaTolerance { init; get; } public double RangeDistanceTolerance { init; get; } public bool SaveSortingWithoutPerson { init; get; } @@ -30,7 +29,6 @@ public class Configuration int personBirthdayFirstYear, string personBirthdayFormat, char[] personCharacters, - int personCharactersCopyCount, int[] rangeDaysDeltaTolerance, float[] rangeDistanceTolerance, bool saveSortingWithoutPerson, @@ -54,7 +52,6 @@ public class Configuration SaveSortingWithoutPerson = saveSortingWithoutPerson; SortingMinimumToUseSigma = sortingMinimumToUseSigma; RangeDaysDeltaTolerance = rangeDaysDeltaTolerance[1]; - PersonCharactersCopyCount = personCharactersCopyCount; FacePartsFileNameExtension = facePartsFileNameExtension; FacesHiddenFileNameExtension = facesHiddenFileNameExtension; } diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 9db48d6..747ff71 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -800,7 +800,80 @@ public class MapLogic : Shared.Models.Methods.IMapLogic } } - public void CopyAtLeastOneMappedFiles(string dFacesContentDirectory, string a2PeopleSingletonDirectory, Mapping[] mappingCollection) + private List GetDirectories(string a2PeopleSingletonDirectory, Mapping[] mappingCollection) + { + if (_Configuration is null) + throw new NullReferenceException(nameof(_Configuration)); + List results = new(); + long personKey; + string directory; + string? directoryName; + PersonContainer? personContainer; + Dictionary personKeyToCount = new(); + for (int i = 1; i < 3; i++) + { + foreach (Mapping mapping in mappingCollection) + { + if (mapping.MappingFromLocation is null || mapping.MappingFromPerson is null) + continue; + if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting) + continue; + if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB)) + throw new NotSupportedException(); + if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName)) + throw new NotSupportedException(); + personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; + if (mapping.MappingFromItem.ResizedFileHolder.DirectoryName is null || !mapping.MappingFromItem.ResizedFileHolder.Exists) + continue; + directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath); + if (directoryName is null) + throw new NotSupportedException(); + if (!_PersonKeyToPersonContainer.TryGetValue(personKey, out personContainer)) + continue; + if (personContainer.Char is null || !_Configuration.PersonCharacters.Contains(personContainer.Char.Value)) + continue; + if (i == 1) + { + if (!personKeyToCount.ContainsKey(personKey)) + personKeyToCount.Add(personKey, 0); + personKeyToCount[personKey]++; + } + else if (i == 2) + { + directory = Path.Combine(a2PeopleSingletonDirectory, personContainer.Char.Value.ToString(), personContainer.DisplayDirectoryName, personKeyToCount[personKey].ToString("0000")); + if (results.Contains(directory)) + continue; + results.Add(directory); + } + else + throw new NotSupportedException(); + } + } + return results; + } + + public void SavePersonKeyToCount(string dFacesContentDirectory, string a2PeopleSingletonDirectory, Mapping[] mappingCollection) + { + List directories = GetDirectories(a2PeopleSingletonDirectory, mappingCollection); + string directoryName; + string? personNameDirectory; + DateTime dateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).AddDays(1); + foreach (string directory in directories) + { + if (Directory.Exists(directory)) + continue; + _ = Directory.CreateDirectory(directory); + directoryName = Path.GetFileName(directory); + personNameDirectory = Path.GetDirectoryName(directory); + if (string.IsNullOrEmpty(personNameDirectory)) + continue; + if (!int.TryParse(directoryName, out int count)) + continue; + Directory.SetLastWriteTime(personNameDirectory, dateTime.AddMinutes(count)); + } + } + + public void CopyAtLeastOneMappedFiles(int personCharactersCopyCount, string dFacesContentDirectory, string a2PeopleSingletonDirectory, Mapping[] mappingCollection) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); @@ -836,7 +909,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; if (!personKeyToCount.ContainsKey(personKey)) personKeyToCount.Add(personKey, 0); - if (personKeyToCount[personKey] > _Configuration.PersonCharactersCopyCount) + if (personKeyToCount[personKey] > personCharactersCopyCount) continue; if (!_PersonKeyToPersonContainer.TryGetValue(personKey, out personContainer)) continue; diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index 1a91454..343dddc 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -184,6 +184,7 @@ internal abstract class MapLogic List<(string, string[], string)> results = new(); int? id; string[] files; + string fileName; const int zero = 0; string[] yearDirectories; int? normalizedRectangle; @@ -191,6 +192,7 @@ internal abstract class MapLogic string ticksDirectoryName; string? personFirstInitial; bool isReservedDirectoryName; + List distinct = new(); string[] personKeyDirectories; string[] personNameDirectories; string[] personNameLinkDirectories; @@ -265,6 +267,14 @@ internal abstract class MapLogic (id, normalizedRectangle) = IMapping.GetConverted(configuration.FacesFileNameExtension, file); if (id is null || normalizedRectangle is null) continue; + fileName = Path.GetFileName(file); + if (distinct.Contains(fileName)) + { + if (!File.Exists($"{file}.dup")) + File.Move(file, $"{file}.dup"); + continue; + } + distinct.Add(fileName); results.Add(new(personKeyFormatted, personDisplayDirectoryNames, file)); } personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); diff --git a/Shared/Models/Stateless/Methods/PersonContainer.cs b/Shared/Models/Stateless/Methods/PersonContainer.cs index f26b718..40f4793 100644 --- a/Shared/Models/Stateless/Methods/PersonContainer.cs +++ b/Shared/Models/Stateless/Methods/PersonContainer.cs @@ -13,6 +13,7 @@ internal abstract class PersonContainer List distinct = new(); string fileNameWithoutExtension; string personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory); + results.AddRange(Directory.GetFiles(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly)); string[] directories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string directory in directories) {