CopyAtLeastOneMappedFiles
This commit is contained in:
parent
3278256315
commit
681b2fdf3c
@ -278,21 +278,20 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shared.Models.Methods.IMapLogicSupport.SavePossiblyNewPersonContainers(IPropertyConfiguration propertyConfiguration, string personBirthdayFormat, string facesFileNameExtension, string? a2PeopleSingletonDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
void Shared.Models.Methods.IMapLogicSupport.SavePossiblyNewPersonContainers(IPropertyConfiguration propertyConfiguration, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension, string? a2PeopleSingletonDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
||||||
{
|
{
|
||||||
char @char;
|
|
||||||
string json;
|
string json;
|
||||||
string[] files;
|
string[] files;
|
||||||
string checkFile;
|
string checkFile;
|
||||||
string[] segments;
|
string[] segments;
|
||||||
const int zero = 0;
|
const int zero = 0;
|
||||||
|
char personCharacter;
|
||||||
string personKeyFormatted;
|
string personKeyFormatted;
|
||||||
string personDisplayDirectory;
|
string personDisplayDirectory;
|
||||||
PersonBirthday personBirthday;
|
PersonBirthday personBirthday;
|
||||||
string personDisplayDirectoryName;
|
string personDisplayDirectoryName;
|
||||||
string checkPersonDisplayDirectory;
|
string checkPersonDisplayDirectory;
|
||||||
string checkPersonKeyFormattedDirectory;
|
string checkPersonKeyFormattedDirectory;
|
||||||
char[] chars = Shared.Models.Stateless.Methods.IAge.GetChars();
|
|
||||||
JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true };
|
JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true };
|
||||||
foreach ((string[] personDisplayDirectoryNames, PersonContainer personContainer) in possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
foreach ((string[] personDisplayDirectoryNames, PersonContainer personContainer) in possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
||||||
{
|
{
|
||||||
@ -302,12 +301,12 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
|||||||
personDisplayDirectoryName = personDisplayDirectoryNames[^1];
|
personDisplayDirectoryName = personDisplayDirectoryNames[^1];
|
||||||
personDisplayDirectory = Path.Combine(personDisplayDirectoryNames);
|
personDisplayDirectory = Path.Combine(personDisplayDirectoryNames);
|
||||||
personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthdayFormat, personBirthday);
|
personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthdayFormat, personBirthday);
|
||||||
segments = personDisplayDirectoryName.Split(chars);
|
segments = personDisplayDirectoryName.Split(personCharacters);
|
||||||
if (segments.Length != 2)
|
if (segments.Length != 2)
|
||||||
@char = '_';
|
personCharacter = '_';
|
||||||
else
|
else
|
||||||
@char = personDisplayDirectoryName[segments[zero].Length];
|
personCharacter = personDisplayDirectoryName[segments[zero].Length];
|
||||||
checkPersonDisplayDirectory = Path.Combine(a2PeopleSingletonDirectory, @char.ToString(), personDisplayDirectoryName);
|
checkPersonDisplayDirectory = Path.Combine(a2PeopleSingletonDirectory, personCharacter.ToString(), personDisplayDirectoryName);
|
||||||
checkPersonKeyFormattedDirectory = Path.Combine(checkPersonDisplayDirectory, personKeyFormatted);
|
checkPersonKeyFormattedDirectory = Path.Combine(checkPersonDisplayDirectory, personKeyFormatted);
|
||||||
if (Directory.Exists(checkPersonKeyFormattedDirectory))
|
if (Directory.Exists(checkPersonKeyFormattedDirectory))
|
||||||
continue;
|
continue;
|
||||||
|
@ -122,7 +122,7 @@ public partial class DlibDotNet
|
|||||||
if (rootResultsDirectory is null)
|
if (rootResultsDirectory is null)
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory);
|
Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory);
|
||||||
_PersonContainers = Shared.Models.Stateless.Methods.IPersonContainer.GetPersonContainers(storage, configuration.PersonBirthdayFormat, _Faces.FileNameExtension);
|
_PersonContainers = Shared.Models.Stateless.Methods.IPersonContainer.GetPersonContainers(storage, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), _Faces.FileNameExtension);
|
||||||
}
|
}
|
||||||
if (!isSilent && configuration.TestDistanceResults)
|
if (!isSilent && configuration.TestDistanceResults)
|
||||||
{
|
{
|
||||||
@ -272,6 +272,7 @@ public partial class DlibDotNet
|
|||||||
configuration.MappingDefaultName,
|
configuration.MappingDefaultName,
|
||||||
configuration.PersonBirthdayFirstYear,
|
configuration.PersonBirthdayFirstYear,
|
||||||
configuration.PersonBirthdayFormat,
|
configuration.PersonBirthdayFormat,
|
||||||
|
configuration.PersonCharacters,
|
||||||
configuration.RangeDaysDeltaTolerance,
|
configuration.RangeDaysDeltaTolerance,
|
||||||
configuration.RangeDistanceTolerance,
|
configuration.RangeDistanceTolerance,
|
||||||
configuration.SortingMaximumPerKey,
|
configuration.SortingMaximumPerKey,
|
||||||
@ -873,6 +874,8 @@ public partial class DlibDotNet
|
|||||||
List<Item> filteredItems = GetItems(argZero, containers);
|
List<Item> filteredItems = GetItems(argZero, containers);
|
||||||
mapLogic.SaveShortcutsForOutputResolutions(filteredItems, mappingCollection, personKeyToCount);
|
mapLogic.SaveShortcutsForOutputResolutions(filteredItems, mappingCollection, personKeyToCount);
|
||||||
}
|
}
|
||||||
|
if (_Configuration.PersonCharactersToCopyTo.Length == 1)
|
||||||
|
mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersToCopyTo[0], dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection);
|
||||||
Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping = MapLogicSupport.GetIdToNormalizedRectangleToFace(mappingCollection);
|
Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping = MapLogicSupport.GetIdToNormalizedRectangleToFace(mappingCollection);
|
||||||
mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedRectangleToMapping);
|
mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedRectangleToMapping);
|
||||||
if (_Configuration.SaveNotMappedForOutputResolutions.Contains(outputResolution))
|
if (_Configuration.SaveNotMappedForOutputResolutions.Contains(outputResolution))
|
||||||
|
@ -49,6 +49,8 @@ public class Configuration
|
|||||||
[Display(Name = "Override For Resize Images"), Required] public bool? OverrideForResizeImages { get; set; }
|
[Display(Name = "Override For Resize Images"), Required] public bool? OverrideForResizeImages { get; set; }
|
||||||
[Display(Name = "Person Birthday First Year"), Required] public int? PersonBirthdayFirstYear { get; set; }
|
[Display(Name = "Person Birthday First Year"), Required] public int? PersonBirthdayFirstYear { get; set; }
|
||||||
[Display(Name = "Person Birthday Format"), Required] public string PersonBirthdayFormat { get; set; }
|
[Display(Name = "Person Birthday Format"), Required] public string PersonBirthdayFormat { get; set; }
|
||||||
|
[Display(Name = "Person Characters"), Required] public string PersonCharacters { get; set; }
|
||||||
|
[Display(Name = "Person Characters To Copy To"), Required] public string PersonCharactersToCopyTo { get; set; }
|
||||||
[Display(Name = "PersonKey Format"), Required] public string PersonKeyFormat { get; set; }
|
[Display(Name = "PersonKey Format"), Required] public string PersonKeyFormat { get; set; }
|
||||||
[Display(Name = "Predictor Model Name"), Required] public string PredictorModelName { get; set; }
|
[Display(Name = "Predictor Model Name"), Required] public string PredictorModelName { get; set; }
|
||||||
[Display(Name = "Properties Changed For Distance"), Required] public bool? PropertiesChangedForDistance { get; set; }
|
[Display(Name = "Properties Changed For Distance"), Required] public bool? PropertiesChangedForDistance { get; set; }
|
||||||
@ -156,6 +158,10 @@ public class Configuration
|
|||||||
throw new NullReferenceException(nameof(configuration.PersonBirthdayFirstYear));
|
throw new NullReferenceException(nameof(configuration.PersonBirthdayFirstYear));
|
||||||
if (configuration.PersonBirthdayFormat is null)
|
if (configuration.PersonBirthdayFormat is null)
|
||||||
throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat));
|
throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat));
|
||||||
|
if (configuration.PersonCharacters is null)
|
||||||
|
throw new NullReferenceException(nameof(configuration.PersonCharacters));
|
||||||
|
if (configuration.PersonCharactersToCopyTo is null)
|
||||||
|
throw new NullReferenceException(nameof(configuration.PersonCharactersToCopyTo));
|
||||||
if (configuration.PersonKeyFormat is null)
|
if (configuration.PersonKeyFormat is null)
|
||||||
throw new NullReferenceException(nameof(configuration.PersonKeyFormat));
|
throw new NullReferenceException(nameof(configuration.PersonKeyFormat));
|
||||||
if (configuration.PropertiesChangedForDistance is null)
|
if (configuration.PropertiesChangedForDistance is null)
|
||||||
@ -240,6 +246,8 @@ public class Configuration
|
|||||||
configuration.OverrideForResizeImages.Value,
|
configuration.OverrideForResizeImages.Value,
|
||||||
configuration.PersonBirthdayFirstYear.Value,
|
configuration.PersonBirthdayFirstYear.Value,
|
||||||
configuration.PersonBirthdayFormat,
|
configuration.PersonBirthdayFormat,
|
||||||
|
configuration.PersonCharacters,
|
||||||
|
configuration.PersonCharactersToCopyTo,
|
||||||
configuration.PersonKeyFormat,
|
configuration.PersonKeyFormat,
|
||||||
configuration.PredictorModelName,
|
configuration.PredictorModelName,
|
||||||
configuration.PropertiesChangedForDistance.Value,
|
configuration.PropertiesChangedForDistance.Value,
|
||||||
|
@ -46,6 +46,8 @@ public class Configuration
|
|||||||
public bool OverrideForResizeImages { init; get; }
|
public bool OverrideForResizeImages { init; get; }
|
||||||
public int PersonBirthdayFirstYear { init; get; }
|
public int PersonBirthdayFirstYear { init; get; }
|
||||||
public string PersonBirthdayFormat { init; get; }
|
public string PersonBirthdayFormat { init; get; }
|
||||||
|
public string PersonCharacters { init; get; }
|
||||||
|
public string PersonCharactersToCopyTo { init; get; }
|
||||||
public string PersonKeyFormat { init; get; }
|
public string PersonKeyFormat { init; get; }
|
||||||
public string PredictorModelName { init; get; }
|
public string PredictorModelName { init; get; }
|
||||||
public bool PropertiesChangedForDistance { init; get; }
|
public bool PropertiesChangedForDistance { init; get; }
|
||||||
@ -112,6 +114,8 @@ public class Configuration
|
|||||||
bool overrideForResizeImages,
|
bool overrideForResizeImages,
|
||||||
int personBirthdayFirstYear,
|
int personBirthdayFirstYear,
|
||||||
string personBirthdayFormat,
|
string personBirthdayFormat,
|
||||||
|
string personCharacters,
|
||||||
|
string personCharactersToCopyTo,
|
||||||
string personKeyFormat,
|
string personKeyFormat,
|
||||||
string predictorModelName,
|
string predictorModelName,
|
||||||
bool propertiesChangedForDistance,
|
bool propertiesChangedForDistance,
|
||||||
@ -177,6 +181,8 @@ public class Configuration
|
|||||||
OverrideForResizeImages = overrideForResizeImages;
|
OverrideForResizeImages = overrideForResizeImages;
|
||||||
PersonBirthdayFirstYear = personBirthdayFirstYear;
|
PersonBirthdayFirstYear = personBirthdayFirstYear;
|
||||||
PersonBirthdayFormat = personBirthdayFormat;
|
PersonBirthdayFormat = personBirthdayFormat;
|
||||||
|
PersonCharacters = personCharacters;
|
||||||
|
PersonCharactersToCopyTo = personCharactersToCopyTo;
|
||||||
PersonKeyFormat = personKeyFormat;
|
PersonKeyFormat = personKeyFormat;
|
||||||
PredictorModelName = predictorModelName;
|
PredictorModelName = predictorModelName;
|
||||||
PropertiesChangedForDistance = propertiesChangedForDistance;
|
PropertiesChangedForDistance = propertiesChangedForDistance;
|
||||||
|
@ -94,7 +94,7 @@ public class G2_Identify : Shared.Models.Properties.IIdentify, IIdentify
|
|||||||
if (rootResultsDirectory is null)
|
if (rootResultsDirectory is null)
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory);
|
Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory);
|
||||||
PersonContainer[] personContainers = Shared.Models.Stateless.Methods.IPersonContainer.GetPersonContainers(storage, _Configuration.PersonBirthdayFormat, facesFileNameExtension);
|
PersonContainer[] personContainers = Shared.Models.Stateless.Methods.IPersonContainer.GetPersonContainers(storage, _Configuration.PersonBirthdayFormat, _Configuration.PersonCharacters.ToArray(), facesFileNameExtension);
|
||||||
string[] peopleBirthDates = (from l in personContainers select Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, l.Person.Birthday)).ToArray();
|
string[] peopleBirthDates = (from l in personContainers select Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, l.Person.Birthday)).ToArray();
|
||||||
Dictionary<string, string[]> sourceKeyValuePairs = JsonSerializer.Deserialize<Dictionary<string, string[]>>(json);
|
Dictionary<string, string[]> sourceKeyValuePairs = JsonSerializer.Deserialize<Dictionary<string, string[]>>(json);
|
||||||
foreach (KeyValuePair<string, string[]> keyValuePair in sourceKeyValuePairs)
|
foreach (KeyValuePair<string, string[]> keyValuePair in sourceKeyValuePairs)
|
||||||
|
@ -10,8 +10,17 @@
|
|||||||
},
|
},
|
||||||
"Windows": {
|
"Windows": {
|
||||||
"Configuration": {
|
"Configuration": {
|
||||||
"DistanceRenameToMatch": false,
|
"DistanceRenameToMatch": true,
|
||||||
"DistanceMoveUnableToMatch": false,
|
"DistanceMoveUnableToMatch": true,
|
||||||
|
"PersonCharacters": "!#]^_`~+",
|
||||||
|
"xPersonCharactersToCopyTo": "!",
|
||||||
|
"xxPersonCharactersToCopyTo": "#",
|
||||||
|
"xxxPersonCharactersToCopyTo": "]",
|
||||||
|
"xxxxPersonCharactersToCopyTo": "^",
|
||||||
|
"xxxxxPersonCharactersToCopyTo": "_",
|
||||||
|
"xxxxxxPersonCharactersToCopyTo": "`",
|
||||||
|
"xxxxxxxPersonCharactersToCopyTo": "~",
|
||||||
|
"xxxxxxxxPersonCharactersToCopyTo": "+",
|
||||||
"xRootDirectory": "D:/Tmp/phares/Pictures",
|
"xRootDirectory": "D:/Tmp/phares/Pictures",
|
||||||
"xxRootDirectory": "D:/Tmp/Phares/Compare/Not-Copy-Copy-37c7b67",
|
"xxRootDirectory": "D:/Tmp/Phares/Compare/Not-Copy-Copy-37c7b67",
|
||||||
"xxxRootDirectory": "D:/Tmp/Phares/Compare/Corrupt",
|
"xxxRootDirectory": "D:/Tmp/Phares/Compare/Corrupt",
|
||||||
|
@ -87,6 +87,8 @@
|
|||||||
"Pattern": "[^ABCDEFGHIJKLMNOPQRSTUVWXYZbcdfghjklmnpqrstvwxyz0-9]",
|
"Pattern": "[^ABCDEFGHIJKLMNOPQRSTUVWXYZbcdfghjklmnpqrstvwxyz0-9]",
|
||||||
"PersonBirthdayFirstYear": 1500,
|
"PersonBirthdayFirstYear": 1500,
|
||||||
"PersonBirthdayFormat": "yyyy-MM-dd_HH",
|
"PersonBirthdayFormat": "yyyy-MM-dd_HH",
|
||||||
|
"PersonCharacters": "!#]^_`~+",
|
||||||
|
"PersonCharactersToCopyTo": "~",
|
||||||
"PersonKeyFormat": "yyyy-MM-dd_HH",
|
"PersonKeyFormat": "yyyy-MM-dd_HH",
|
||||||
"PopulatePropertyId": true,
|
"PopulatePropertyId": true,
|
||||||
"PredictorModelName": "Large",
|
"PredictorModelName": "Large",
|
||||||
|
@ -12,6 +12,7 @@ public class Configuration
|
|||||||
public string FacesFileNameExtension { init; get; }
|
public string FacesFileNameExtension { init; get; }
|
||||||
public string FacesHiddenFileNameExtension { init; get; }
|
public string FacesHiddenFileNameExtension { init; get; }
|
||||||
public string MappingDefaultName { init; get; }
|
public string MappingDefaultName { init; get; }
|
||||||
|
public string PersonCharacters { init; get; }
|
||||||
public int PersonBirthdayFirstYear { init; get; }
|
public int PersonBirthdayFirstYear { init; get; }
|
||||||
public string PersonBirthdayFormat { init; get; }
|
public string PersonBirthdayFormat { init; get; }
|
||||||
public int RangeDaysDeltaTolerance { init; get; }
|
public int RangeDaysDeltaTolerance { init; get; }
|
||||||
@ -25,6 +26,7 @@ public class Configuration
|
|||||||
string mappingDefaultName,
|
string mappingDefaultName,
|
||||||
int personBirthdayFirstYear,
|
int personBirthdayFirstYear,
|
||||||
string personBirthdayFormat,
|
string personBirthdayFormat,
|
||||||
|
string personCharacters,
|
||||||
int[] rangeDaysDeltaTolerance,
|
int[] rangeDaysDeltaTolerance,
|
||||||
double[] rangeDistanceTolerance,
|
double[] rangeDistanceTolerance,
|
||||||
int sortingMaximumPerKey,
|
int sortingMaximumPerKey,
|
||||||
@ -33,6 +35,7 @@ public class Configuration
|
|||||||
string facesHiddenFileNameExtension,
|
string facesHiddenFileNameExtension,
|
||||||
string facePartsFileNameExtension)
|
string facePartsFileNameExtension)
|
||||||
{
|
{
|
||||||
|
PersonCharacters = personCharacters;
|
||||||
MappingDefaultName = mappingDefaultName;
|
MappingDefaultName = mappingDefaultName;
|
||||||
PersonBirthdayFormat = personBirthdayFormat;
|
PersonBirthdayFormat = personBirthdayFormat;
|
||||||
SortingMaximumPerKey = sortingMaximumPerKey;
|
SortingMaximumPerKey = sortingMaximumPerKey;
|
||||||
|
@ -687,11 +687,11 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
string mappingSegmentB;
|
string mappingSegmentB;
|
||||||
string personDirectory;
|
string personDirectory;
|
||||||
string? facesDirectory;
|
string? facesDirectory;
|
||||||
|
int? normalizedRectangle;
|
||||||
string personKeyFormatted;
|
string personKeyFormatted;
|
||||||
string personDisplayFileName;
|
string personDisplayFileName;
|
||||||
PersonBirthday personBirthday;
|
PersonBirthday personBirthday;
|
||||||
string? personDisplayDirectory;
|
string? personDisplayDirectory;
|
||||||
int? normalizedRectangle;
|
|
||||||
WindowsShortcut windowsShortcut;
|
WindowsShortcut windowsShortcut;
|
||||||
Dictionary<int, Mapping>? normalizedRectangleToMapping;
|
Dictionary<int, Mapping>? normalizedRectangleToMapping;
|
||||||
string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy);
|
string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy);
|
||||||
@ -731,7 +731,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
if (string.IsNullOrEmpty(directoryName))
|
if (string.IsNullOrEmpty(directoryName))
|
||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
shortcutFile = Path.Combine(personDisplayDirectory, $"{personDisplayFileName}.lnk");
|
shortcutFile = Path.Combine(personDisplayDirectory, $"{personDisplayFileName}.lnk");
|
||||||
facesDirectory = GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); // Path.Combine($"{dFacesContentDirectory}{directoryName}", mapping.MappingFromItem.ImageFileHolder.NameWithoutExtension);
|
facesDirectory = GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem);
|
||||||
if (facesDirectory is null)
|
if (facesDirectory is null)
|
||||||
continue;
|
continue;
|
||||||
faceFileName = $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}";
|
faceFileName = $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}";
|
||||||
@ -768,6 +768,61 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void CopyAtLeastOneMappedFiles(char personCharactersToCopyTo, string dFacesContentDirectory, string a2PeopleSingletonDirectory, Mapping[] mappingCollection)
|
||||||
|
{
|
||||||
|
if (_Configuration is null)
|
||||||
|
throw new NullReferenceException(nameof(_Configuration));
|
||||||
|
long personKey;
|
||||||
|
string fileName;
|
||||||
|
string faceFile;
|
||||||
|
string directory;
|
||||||
|
string faceFileName;
|
||||||
|
string? directoryName;
|
||||||
|
string? facesDirectory;
|
||||||
|
PersonContainer? personContainer;
|
||||||
|
Dictionary<long, int> personKeyToCount = new();
|
||||||
|
foreach (Mapping mapping in mappingCollection)
|
||||||
|
{
|
||||||
|
directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath);
|
||||||
|
if (directoryName is null)
|
||||||
|
throw new NotSupportedException();
|
||||||
|
if (mapping.MappingFromItem.ResizedFileHolder.DirectoryName is null || !mapping.MappingFromItem.ResizedFileHolder.Exists)
|
||||||
|
continue;
|
||||||
|
if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting || mapping.MappingFromPerson?.ApproximateYears is null)
|
||||||
|
continue;
|
||||||
|
if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB))
|
||||||
|
throw new NotSupportedException();
|
||||||
|
if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName))
|
||||||
|
throw new NotSupportedException();
|
||||||
|
facesDirectory = GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem);
|
||||||
|
if (facesDirectory is null)
|
||||||
|
continue;
|
||||||
|
faceFileName = $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}";
|
||||||
|
faceFile = Path.Combine(facesDirectory, faceFileName);
|
||||||
|
personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks;
|
||||||
|
if (!personKeyToCount.ContainsKey(personKey))
|
||||||
|
personKeyToCount.Add(personKey, 0);
|
||||||
|
if (personKeyToCount[personKey] > 1)
|
||||||
|
continue;
|
||||||
|
if (!_PersonKeyToPersonContainer.TryGetValue(personKey, out personContainer))
|
||||||
|
continue;
|
||||||
|
if (personContainer.Char is null || personContainer.Char != personCharactersToCopyTo)
|
||||||
|
continue;
|
||||||
|
if (personContainer.DisplayDirectoryAllFiles.Any(l => l.EndsWith(faceFileName)))
|
||||||
|
continue;
|
||||||
|
if (!File.Exists(faceFile))
|
||||||
|
continue;
|
||||||
|
directory = Path.Combine(a2PeopleSingletonDirectory, personCharactersToCopyTo.ToString(), personContainer.DisplayDirectoryName);
|
||||||
|
if (!Directory.Exists(directory))
|
||||||
|
continue;
|
||||||
|
fileName = Path.Combine(directory, faceFileName);
|
||||||
|
if (File.Exists(fileName))
|
||||||
|
continue;
|
||||||
|
personKeyToCount[personKey] += 1;
|
||||||
|
File.Copy(faceFile, fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SaveNotMappedTicks()
|
public void SaveNotMappedTicks()
|
||||||
{
|
{
|
||||||
if (_Configuration is null)
|
if (_Configuration is null)
|
||||||
@ -1000,18 +1055,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach (Mapping mapping in mappingCollection)
|
foreach (Mapping mapping in mappingCollection)
|
||||||
{
|
|
||||||
if (mapping.MappingFromItem.ResizedFileHolder.DirectoryName is null || !mapping.MappingFromItem.ResizedFileHolder.Exists)
|
|
||||||
continue;
|
|
||||||
if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting || mapping.MappingFromPerson?.ApproximateYears is null)
|
|
||||||
continue;
|
|
||||||
if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB))
|
|
||||||
throw new NotSupportedException();
|
|
||||||
if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName))
|
|
||||||
throw new NotSupportedException();
|
|
||||||
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday);
|
|
||||||
}
|
|
||||||
foreach (Mapping mapping in mappingCollection)
|
|
||||||
{
|
{
|
||||||
directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath);
|
directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath);
|
||||||
if (directoryName is null)
|
if (directoryName is null)
|
||||||
@ -1119,7 +1162,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
if (normalizedRectangles is not null && normalizedRectangles.Contains(mapping.MappingFromLocation.NormalizedRectangle))
|
if (normalizedRectangles is not null && normalizedRectangles.Contains(mapping.MappingFromLocation.NormalizedRectangle))
|
||||||
continue;
|
continue;
|
||||||
directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath);
|
directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath);
|
||||||
facesDirectory = GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); // Path.Combine($"{dFacesContentDirectory}{directoryName}", mapping.MappingFromItem.ImageFileHolder.NameWithoutExtension);
|
facesDirectory = GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem);
|
||||||
if (facesDirectory is null)
|
if (facesDirectory is null)
|
||||||
continue;
|
continue;
|
||||||
faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"));
|
faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"));
|
||||||
|
@ -28,7 +28,7 @@ internal abstract class MapLogic
|
|||||||
if (personKeys.Contains(personKey))
|
if (personKeys.Contains(personKey))
|
||||||
continue;
|
continue;
|
||||||
personBirthday = IPersonBirthday.GetPersonBirthday(personKey);
|
personBirthday = IPersonBirthday.GetPersonBirthday(personKey);
|
||||||
person = IPerson.GetPerson(configuration.MappingDefaultName, personKey, personBirthday);
|
person = IPerson.GetPerson(configuration.PersonCharacters.ToArray(), configuration.MappingDefaultName, personKey, personBirthday);
|
||||||
personContainer = new(approximateYears, person, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey);
|
personContainer = new(approximateYears, person, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey);
|
||||||
results.Add(personContainer);
|
results.Add(personContainer);
|
||||||
}
|
}
|
||||||
@ -211,7 +211,7 @@ internal abstract class MapLogic
|
|||||||
{
|
{
|
||||||
List<string> results = new();
|
List<string> results = new();
|
||||||
List<(long? PersonKey, string Line)> lines = new();
|
List<(long? PersonKey, string Line)> lines = new();
|
||||||
_ = GetDistinctCollection(configuration, personContainers, new());
|
_ = GetDistinctCollection(configuration, personContainers, new(), new());
|
||||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||||
string[] ticksDirectories;
|
string[] ticksDirectories;
|
||||||
if (string.IsNullOrEmpty(eDistanceContentDirectory))
|
if (string.IsNullOrEmpty(eDistanceContentDirectory))
|
||||||
@ -251,16 +251,15 @@ internal abstract class MapLogic
|
|||||||
return results.ToArray();
|
return results.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SetKeyValuePairs(Configuration configuration, List<PersonContainer> personContainers, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> incorrectIdThenNormalizedRectangleToPersonContainers)
|
private static void SetKeyValuePairs(Configuration configuration, List<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> incorrectIdThenNormalizedRectangleToPersonContainers)
|
||||||
{
|
{
|
||||||
PersonBirthday? personBirthday;
|
PersonBirthday? personBirthday;
|
||||||
PersonContainer[] distinctPersonContainers;
|
PersonContainer[] distinctPersonContainers;
|
||||||
Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer = new();
|
List<(long, PersonContainer)> collection = GetDistinctCollection(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer);
|
||||||
Dictionary<int, Dictionary<int, List<PersonContainer>>> idThenNormalizedRectangleToPersonContainerCollection = new();
|
|
||||||
Dictionary<int, Dictionary<int, List<PersonContainer>>> incorrectIdThenNormalizedRectangleToPersonContainerCollection = new();
|
|
||||||
List<(long, PersonContainer)> collection = GetDistinctCollection(configuration, personContainers, personKeyFormattedToPersonContainer);
|
|
||||||
foreach ((long personKey, PersonContainer personContainer) in collection)
|
foreach ((long personKey, PersonContainer personContainer) in collection)
|
||||||
personKeyToPersonContainer.Add(personKey, personContainer);
|
personKeyToPersonContainer.Add(personKey, personContainer);
|
||||||
|
Dictionary<int, Dictionary<int, List<PersonContainer>>> idThenNormalizedRectangleToPersonContainerCollection = new();
|
||||||
|
Dictionary<int, Dictionary<int, List<PersonContainer>>> incorrectIdThenNormalizedRectangleToPersonContainerCollection = new();
|
||||||
if (personKeyFormattedIdThenNormalizedRectangleCollection.Any())
|
if (personKeyFormattedIdThenNormalizedRectangleCollection.Any())
|
||||||
{
|
{
|
||||||
string personDisplayDirectory;
|
string personDisplayDirectory;
|
||||||
@ -276,7 +275,7 @@ internal abstract class MapLogic
|
|||||||
personDisplayDirectory = Path.Combine(personDisplayDirectoryNames);
|
personDisplayDirectory = Path.Combine(personDisplayDirectoryNames);
|
||||||
if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted))
|
if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted))
|
||||||
{
|
{
|
||||||
personContainer = new(personBirthday, personDisplayDirectoryName);
|
personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName);
|
||||||
personKeyFormattedToPersonContainer.Add(personKeyFormatted, personContainer);
|
personKeyFormattedToPersonContainer.Add(personKeyFormatted, personContainer);
|
||||||
}
|
}
|
||||||
if (personDisplayDirectoryName.Length != 1 && personDisplayDirectoryName != configuration.MappingDefaultName && !personDisplayDirectoryTo.ContainsKey(personDisplayDirectory))
|
if (personDisplayDirectoryName.Length != 1 && personDisplayDirectoryName != configuration.MappingDefaultName && !personDisplayDirectoryTo.ContainsKey(personDisplayDirectory))
|
||||||
@ -311,7 +310,7 @@ internal abstract class MapLogic
|
|||||||
incorrectIdThenNormalizedRectangleToPersonContainerCollection.Add(id, new());
|
incorrectIdThenNormalizedRectangleToPersonContainerCollection.Add(id, new());
|
||||||
if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted))
|
if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted))
|
||||||
{
|
{
|
||||||
personContainer = new(personBirthday, configuration.MappingDefaultName);
|
personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, configuration.MappingDefaultName);
|
||||||
personKeyFormattedToPersonContainer.Add(personKeyFormatted, personContainer);
|
personKeyFormattedToPersonContainer.Add(personKeyFormatted, personContainer);
|
||||||
}
|
}
|
||||||
if (!incorrectIdThenNormalizedRectangleToPersonContainerCollection[id].ContainsKey(normalizedRectangle))
|
if (!incorrectIdThenNormalizedRectangleToPersonContainerCollection[id].ContainsKey(normalizedRectangle))
|
||||||
@ -330,12 +329,11 @@ internal abstract class MapLogic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<(long, PersonContainer)> GetDistinctCollection(Configuration configuration, IEnumerable<PersonContainer> personContainers, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer)
|
private static List<(long, PersonContainer)> GetDistinctCollection(Configuration configuration, IEnumerable<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer)
|
||||||
{
|
{
|
||||||
List<(long, PersonContainer)> results = new();
|
List<(long, PersonContainer)> results = new();
|
||||||
const int zero = 0;
|
const int zero = 0;
|
||||||
string newestPersonKeyFormatted;
|
string newestPersonKeyFormatted;
|
||||||
Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection = new();
|
|
||||||
foreach (PersonContainer personContainer in personContainers)
|
foreach (PersonContainer personContainer in personContainers)
|
||||||
{
|
{
|
||||||
if (personContainer.Key is null)
|
if (personContainer.Key is null)
|
||||||
@ -547,7 +545,7 @@ internal abstract class MapLogic
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SetPersonKeyToPersonContainer(Configuration configuration, List<PersonContainer> personContainers, long[] personKeyCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer)
|
private static void SetPersonKeyToPersonContainer(Configuration configuration, List<PersonContainer> personContainers, long[] personKeyCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection)
|
||||||
{
|
{
|
||||||
string? displayDirectoryName;
|
string? displayDirectoryName;
|
||||||
foreach (PersonContainer personContainer in personContainers)
|
foreach (PersonContainer personContainer in personContainers)
|
||||||
@ -561,16 +559,20 @@ internal abstract class MapLogic
|
|||||||
}
|
}
|
||||||
if (personKeyCollection.Any())
|
if (personKeyCollection.Any())
|
||||||
{
|
{
|
||||||
|
const int zero = 0;
|
||||||
int? approximateYears = null;
|
int? approximateYears = null;
|
||||||
PersonBirthday? personBirthday;
|
PersonBirthday? personBirthday;
|
||||||
PersonContainer? personContainer;
|
PersonContainer personContainer;
|
||||||
displayDirectoryName = configuration.MappingDefaultName;
|
displayDirectoryName = configuration.MappingDefaultName;
|
||||||
foreach (long personKey in personKeyCollection)
|
foreach (long personKey in personKeyCollection)
|
||||||
{
|
{
|
||||||
if (personKeyToPersonContainer.ContainsKey(personKey))
|
if (personKeyToPersonContainer.ContainsKey(personKey))
|
||||||
continue;
|
continue;
|
||||||
personBirthday = IPersonBirthday.GetPersonBirthday(personKey);
|
personBirthday = IPersonBirthday.GetPersonBirthday(personKey);
|
||||||
|
if (!personKeyToPersonContainerCollection.ContainsKey(personKey))
|
||||||
personContainer = new(approximateYears, personBirthday, displayDirectoryName, personKey);
|
personContainer = new(approximateYears, personBirthday, displayDirectoryName, personKey);
|
||||||
|
else
|
||||||
|
personContainer = new(approximateYears, personBirthday, personKeyToPersonContainerCollection[personKey][zero].Char, displayDirectoryName, personKey);
|
||||||
personKeyToPersonContainer.Add(personKey, personContainer);
|
personKeyToPersonContainer.Add(personKey, personContainer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -586,9 +588,11 @@ internal abstract class MapLogic
|
|||||||
List<long?> nullablePersonKeyCollection = new();
|
List<long?> nullablePersonKeyCollection = new();
|
||||||
List<string> personKeyFormattedCollection = new();
|
List<string> personKeyFormattedCollection = new();
|
||||||
Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted = new();
|
Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted = new();
|
||||||
List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new();
|
Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer = new();
|
||||||
List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection = new();
|
Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection = new();
|
||||||
List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection = new();
|
List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection = new();
|
||||||
|
List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection = new();
|
||||||
|
List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new();
|
||||||
Dictionary<int, Dictionary<int, PersonContainer[]>> incorrectIdThenNormalizedRectangleToPersonContainers = new();
|
Dictionary<int, Dictionary<int, PersonContainer[]>> incorrectIdThenNormalizedRectangleToPersonContainers = new();
|
||||||
SetPersonCollections(configuration, personContainers, personKeys, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, skipCollection);
|
SetPersonCollections(configuration, personContainers, personKeys, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, skipCollection);
|
||||||
personContainers.AddRange(GetNonSpecificPeopleCollection(configuration, ticks, personKeys));
|
personContainers.AddRange(GetNonSpecificPeopleCollection(configuration, ticks, personKeys));
|
||||||
@ -597,7 +601,7 @@ internal abstract class MapLogic
|
|||||||
message = $") {ticksDirectories.Length:000} compile from and clean ticks Director(ies) - B - {totalSeconds} total second(s)";
|
message = $") {ticksDirectories.Length:000} compile from and clean ticks Director(ies) - B - {totalSeconds} total second(s)";
|
||||||
List<(string, string[], string)> collection = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedCollection, ticksDirectories, message);
|
List<(string, string[], string)> collection = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedCollection, ticksDirectories, message);
|
||||||
(int unableToMatchCount, int duplicateCount) = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenNormalizedRectangleCollection, incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, collection);
|
(int unableToMatchCount, int duplicateCount) = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenNormalizedRectangleCollection, incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, collection);
|
||||||
SetKeyValuePairs(configuration, personContainers, personKeyFormattedIdThenNormalizedRectangleCollection, incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, personKeyToPersonContainer, idThenNormalizedRectangleToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, incorrectIdThenNormalizedRectangleToPersonContainers);
|
SetKeyValuePairs(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer, personKeyFormattedIdThenNormalizedRectangleCollection, incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, personKeyToPersonContainer, idThenNormalizedRectangleToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, incorrectIdThenNormalizedRectangleToPersonContainers);
|
||||||
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||||
message = $") {collection.Count:000} message from ticks Director(ies) - D - {duplicateCount} Duplicate Count {unableToMatchCount} Unable To Match Count / {collection.Count} Collection - {totalSeconds} total second(s)";
|
message = $") {collection.Count:000} message from ticks Director(ies) - D - {duplicateCount} Duplicate Count {unableToMatchCount} Unable To Match Count / {collection.Count} Collection - {totalSeconds} total second(s)";
|
||||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||||
@ -611,11 +615,11 @@ internal abstract class MapLogic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
long[] personKeyCollection = (from l in nullablePersonKeyCollection where l is not null select l.Value).Distinct().ToArray();
|
long[] personKeyCollection = (from l in nullablePersonKeyCollection where l is not null select l.Value).Distinct().ToArray();
|
||||||
SetPersonKeyToPersonContainer(configuration, personContainers, personKeyCollection, personKeyToPersonContainer);
|
SetPersonKeyToPersonContainer(configuration, personContainers, personKeyCollection, personKeyToPersonContainer, personKeyToPersonContainerCollection);
|
||||||
notMappedPersonContainers.AddRange(GetNotMappedPersonContainers(configuration, personContainers, personKeys, personKeyCollection));
|
notMappedPersonContainers.AddRange(GetNotMappedPersonContainers(configuration, personContainers, personKeys, personKeyCollection));
|
||||||
AppendToSkipCollection(skipCollection, idThenNormalizedRectangleToPersonContainers, incorrectIdThenNormalizedRectangleToPersonContainers);
|
AppendToSkipCollection(skipCollection, idThenNormalizedRectangleToPersonContainers, incorrectIdThenNormalizedRectangleToPersonContainers);
|
||||||
if (possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Any())
|
if (possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Any())
|
||||||
mapLogicSupport.SavePossiblyNewPersonContainers(propertyConfiguration, configuration.PersonBirthdayFormat, configuration.FacesFileNameExtension, a2PeopleContentDirectory, personKeyToPersonContainer, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
|
mapLogicSupport.SavePossiblyNewPersonContainers(propertyConfiguration, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), configuration.FacesFileNameExtension, a2PeopleContentDirectory, personKeyToPersonContainer, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string GetMappingSegmentB(long ticks, PersonBirthday personBirthday, int? approximateYears, long minimumDateTimeTicks, bool? isWrongYear)
|
private static string GetMappingSegmentB(long ticks, PersonBirthday personBirthday, int? approximateYears, long minimumDateTimeTicks, bool? isWrongYear)
|
||||||
|
@ -4,6 +4,6 @@ public interface IMapLogicSupport
|
|||||||
{
|
{
|
||||||
|
|
||||||
string GetCounts();
|
string GetCounts();
|
||||||
void SavePossiblyNewPersonContainers(Properties.IPropertyConfiguration propertyConfiguration, string personBirthdayFormat, string facesFileNameExtension, string? a2PeopleContentDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
|
void SavePossiblyNewPersonContainers(Properties.IPropertyConfiguration propertyConfiguration, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension, string? a2PeopleContentDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
|
||||||
|
|
||||||
}
|
}
|
@ -12,11 +12,13 @@ public class PersonContainer : Properties.IPersonContainer
|
|||||||
public string[] DisplayDirectoryAllFiles { init; get; }
|
public string[] DisplayDirectoryAllFiles { init; get; }
|
||||||
public string DisplayDirectoryName { init; get; }
|
public string DisplayDirectoryName { init; get; }
|
||||||
public long? Key { init; get; }
|
public long? Key { init; get; }
|
||||||
|
public char? Char { init; get; }
|
||||||
|
|
||||||
[JsonConstructor]
|
[JsonConstructor]
|
||||||
public PersonContainer(int? approximateYears, Person? person, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key)
|
public PersonContainer(int? approximateYears, char? @char, Person? person, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key)
|
||||||
{
|
{
|
||||||
ApproximateYears = approximateYears;
|
ApproximateYears = approximateYears;
|
||||||
|
Char = @char;
|
||||||
Person = person;
|
Person = person;
|
||||||
Birthdays = birthdays;
|
Birthdays = birthdays;
|
||||||
DisplayDirectoryAllFiles = displayDirectoryAllFiles;
|
DisplayDirectoryAllFiles = displayDirectoryAllFiles;
|
||||||
@ -24,16 +26,24 @@ public class PersonContainer : Properties.IPersonContainer
|
|||||||
Key = key;
|
Key = key;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PersonContainer(int? approximateYears, string[] displayDirectoryAllFiles, string displayDirectoryName) :
|
public PersonContainer(char[] personCharacters, PersonBirthday birthday, string displayDirectoryName) :
|
||||||
this(approximateYears, null, null, displayDirectoryAllFiles, displayDirectoryName, null)
|
this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), null, Stateless.Methods.IPerson.GetPerson(personCharacters, displayDirectoryName, birthday.Value.Ticks, birthday), new PersonBirthday[] { birthday }, Array.Empty<string>(), displayDirectoryName, birthday.Value.Ticks)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) :
|
public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) :
|
||||||
this(approximateYears, null, new PersonBirthday[] { birthdays }, Array.Empty<string>(), displayDirectoryName, key)
|
this(approximateYears, null, null, new PersonBirthday[] { birthdays }, Array.Empty<string>(), displayDirectoryName, key)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public PersonContainer(PersonBirthday birthday, string displayDirectoryName) :
|
public PersonContainer(int? approximateYears, PersonBirthday birthdays, char? @char, string displayDirectoryName, long key) :
|
||||||
this(Stateless.Methods.IAge.GetApproximateYears(displayDirectoryName), Stateless.Methods.IPerson.GetPerson(displayDirectoryName, birthday.Value.Ticks, birthday), new PersonBirthday[] { birthday }, Array.Empty<string>(), displayDirectoryName, birthday.Value.Ticks)
|
this(approximateYears, @char, null, new PersonBirthday[] { birthdays }, Array.Empty<string>(), displayDirectoryName, key)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public PersonContainer(int? approximateYears, char @char, string[] displayDirectoryAllFiles, string displayDirectoryName) :
|
||||||
|
this(approximateYears, @char, null, null, displayDirectoryAllFiles, displayDirectoryName, null)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public PersonContainer(int? approximateYears, Person? person, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key) :
|
||||||
|
this(approximateYears, null, person, birthdays, displayDirectoryAllFiles, displayDirectoryName, key)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
@ -31,11 +31,11 @@ internal abstract class Age
|
|||||||
return (years, result);
|
return (years, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static int? GetApproximateYears(string personDisplayDirectoryName, char[] chars)
|
internal static int? GetApproximateYears(char[] personCharacters, string personDisplayDirectoryName)
|
||||||
{
|
{
|
||||||
int? result;
|
int? result;
|
||||||
const int zero = 0;
|
const int zero = 0;
|
||||||
string[] segments = personDisplayDirectoryName.Split(chars);
|
string[] segments = personDisplayDirectoryName.Split(personCharacters);
|
||||||
if (segments.Length == 1 || !int.TryParse(segments[1].Split('-')[zero], out int years))
|
if (segments.Length == 1 || !int.TryParse(segments[1].Split('-')[zero], out int years))
|
||||||
result = null;
|
result = null;
|
||||||
else
|
else
|
||||||
|
@ -18,19 +18,9 @@ public interface IAge
|
|||||||
static (int, TimeSpan) GetAge(DateTime minuend, DateTime subtrahend) =>
|
static (int, TimeSpan) GetAge(DateTime minuend, DateTime subtrahend) =>
|
||||||
Age.GetAge(minuend, subtrahend);
|
Age.GetAge(minuend, subtrahend);
|
||||||
|
|
||||||
char[] TestStatic_GetChars() =>
|
int? TestStatic_GetApproximateYears(char[] personCharacters, string personDisplayDirectoryName) =>
|
||||||
GetChars();
|
GetApproximateYears(personCharacters, personDisplayDirectoryName);
|
||||||
static char[] GetChars() =>
|
static int? GetApproximateYears(char[] personCharacters, string personDisplayDirectoryName) =>
|
||||||
new char[] { '!', '#', ']', '^', '_', '`', '~', '+' };
|
Age.GetApproximateYears(personCharacters, personDisplayDirectoryName);
|
||||||
|
|
||||||
int? TestStatic_GetApproximateYears(string personDisplayDirectoryName, char[] chars) =>
|
|
||||||
GetApproximateYears(personDisplayDirectoryName, chars);
|
|
||||||
static int? GetApproximateYears(string personDisplayDirectoryName, char[] chars) =>
|
|
||||||
Age.GetApproximateYears(personDisplayDirectoryName, chars);
|
|
||||||
|
|
||||||
int? TestStatic_GetApproximateYears(string personDisplayDirectoryName) =>
|
|
||||||
GetApproximateYears(personDisplayDirectoryName);
|
|
||||||
static int? GetApproximateYears(string personDisplayDirectoryName) =>
|
|
||||||
GetApproximateYears(personDisplayDirectoryName, GetChars());
|
|
||||||
|
|
||||||
}
|
}
|
@ -10,10 +10,10 @@ public interface IPerson
|
|||||||
static string GetFileFullName(Properties.IStorage storage, string personBirthdayFormat, Models.Person person) =>
|
static string GetFileFullName(Properties.IStorage storage, string personBirthdayFormat, Models.Person person) =>
|
||||||
IPersonBirthday.GetFileFullName(storage, personBirthdayFormat, person.Birthday);
|
IPersonBirthday.GetFileFullName(storage, personBirthdayFormat, person.Birthday);
|
||||||
|
|
||||||
Models.Person TestStatic_GetPerson(string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) =>
|
Models.Person TestStatic_GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) =>
|
||||||
GetPerson(personDisplayDirectoryName, personKey, personBirthday);
|
GetPerson(personCharacters, personDisplayDirectoryName, personKey, personBirthday);
|
||||||
static Models.Person GetPerson(string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) =>
|
static Models.Person GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) =>
|
||||||
Person.GetPerson(personKey, personBirthday, personDisplayDirectoryName.Split(IAge.GetChars()));
|
Person.GetPerson(personKey, personBirthday, personDisplayDirectoryName.Split(personCharacters));
|
||||||
|
|
||||||
Models.Person TestStatic_GetPerson(long personKey, string[] segments) =>
|
Models.Person TestStatic_GetPerson(long personKey, string[] segments) =>
|
||||||
GetPerson(personKey, segments);
|
GetPerson(personKey, segments);
|
||||||
|
@ -5,10 +5,10 @@ public interface IPersonContainer
|
|||||||
|
|
||||||
// ...
|
// ...
|
||||||
|
|
||||||
Models.PersonContainer[] TestStatic_GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, string facesFileNameExtension) =>
|
Models.PersonContainer[] TestStatic_GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) =>
|
||||||
GetPersonContainers(storage, personBirthdayFormat, facesFileNameExtension);
|
GetPersonContainers(storage, personBirthdayFormat, personCharacters, facesFileNameExtension);
|
||||||
static Models.PersonContainer[] GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, string facesFileNameExtension) =>
|
static Models.PersonContainer[] GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension) =>
|
||||||
PersonContainer.GetPersonContainers(storage, personBirthdayFormat, facesFileNameExtension);
|
PersonContainer.GetPersonContainers(storage, personBirthdayFormat, personCharacters, facesFileNameExtension);
|
||||||
|
|
||||||
List<(long?, string)> TestStatic_GetDisplay(string personBirthdayFormat, Models.PersonContainer personContainer) =>
|
List<(long?, string)> TestStatic_GetDisplay(string personBirthdayFormat, Models.PersonContainer personContainer) =>
|
||||||
GetDisplay(personBirthdayFormat, personContainer);
|
GetDisplay(personBirthdayFormat, personContainer);
|
||||||
|
@ -33,7 +33,7 @@ internal abstract class PersonContainer
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<(long?, Models.PersonContainer)> GetPersonContainersCollections(string facesFileNameExtension, char[] chars, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection)
|
private static List<(long?, Models.PersonContainer)> GetPersonContainersCollections(string facesFileNameExtension, char[] personCharacters, char @char, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection)
|
||||||
{
|
{
|
||||||
List<(long?, Models.PersonContainer)> results = new();
|
List<(long?, Models.PersonContainer)> results = new();
|
||||||
long personKey;
|
long personKey;
|
||||||
@ -45,7 +45,7 @@ internal abstract class PersonContainer
|
|||||||
string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory);
|
string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory);
|
||||||
foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection)
|
foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection)
|
||||||
{
|
{
|
||||||
segments = personDisplayDirectoryName.Split(chars);
|
segments = personDisplayDirectoryName.Split(personCharacters);
|
||||||
orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray();
|
orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray();
|
||||||
if (!orderedPersonBirthdays.Any())
|
if (!orderedPersonBirthdays.Any())
|
||||||
personKey = collection[zero].PersonBirthday.Value.Ticks;
|
personKey = collection[zero].PersonBirthday.Value.Ticks;
|
||||||
@ -56,17 +56,17 @@ internal abstract class PersonContainer
|
|||||||
personKey = orderedPersonBirthdays[zero].Value.Ticks;
|
personKey = orderedPersonBirthdays[zero].Value.Ticks;
|
||||||
}
|
}
|
||||||
person = IPerson.GetPerson(personKey, segments);
|
person = IPerson.GetPerson(personKey, segments);
|
||||||
personContainer = new(approximateYears, person, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey);
|
personContainer = new(approximateYears, @char, person, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey);
|
||||||
results.Add(new(personKey, personContainer));
|
results.Add(new(personKey, personContainer));
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Models.PersonContainer GetPersonContainer(string facesFileNameExtension, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears)
|
private static Models.PersonContainer GetPersonContainer(string facesFileNameExtension, char @char, string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears)
|
||||||
{
|
{
|
||||||
Models.PersonContainer result;
|
Models.PersonContainer result;
|
||||||
string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory);
|
string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory);
|
||||||
result = new(approximateYears, personDisplayDirectoryAllFiles, personDisplayDirectoryName);
|
result = new(approximateYears, @char, personDisplayDirectoryAllFiles, personDisplayDirectoryName);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ internal abstract class PersonContainer
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<(long?, Models.PersonContainer)> GetPersonContainersGroup(string personBirthdayFormat, string facesFileNameExtension, char[] chars, string[] personDisplayDirectories)
|
private static List<(long?, Models.PersonContainer)> GetPersonContainersGroup(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, char @char, string[] personDisplayDirectories)
|
||||||
{
|
{
|
||||||
List<(long?, Models.PersonContainer)> results = new();
|
List<(long?, Models.PersonContainer)> results = new();
|
||||||
string? minusOne;
|
string? minusOne;
|
||||||
@ -117,7 +117,7 @@ internal abstract class PersonContainer
|
|||||||
personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory);
|
personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory);
|
||||||
if (string.IsNullOrEmpty(personDisplayDirectoryName))
|
if (string.IsNullOrEmpty(personDisplayDirectoryName))
|
||||||
continue;
|
continue;
|
||||||
approximateYears = Age.GetApproximateYears(personDisplayDirectoryName, chars);
|
approximateYears = Age.GetApproximateYears(personCharacters, personDisplayDirectoryName);
|
||||||
personKeyDirectories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly);
|
personKeyDirectories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||||
collection = PersonBirthday.GetPersonBirthdays(personBirthdayFormat, personKeyDirectories, personDisplayDirectory, personDisplayDirectoryName);
|
collection = PersonBirthday.GetPersonBirthdays(personBirthdayFormat, personKeyDirectories, personDisplayDirectory, personDisplayDirectoryName);
|
||||||
if (personDisplayDirectoryName.Contains('^'))
|
if (personDisplayDirectoryName.Contains('^'))
|
||||||
@ -130,10 +130,10 @@ internal abstract class PersonContainer
|
|||||||
if (changes.Any(l => l is not null))
|
if (changes.Any(l => l is not null))
|
||||||
continue;
|
continue;
|
||||||
if (collection.Any())
|
if (collection.Any())
|
||||||
results.AddRange(GetPersonContainersCollections(facesFileNameExtension, chars, numberSign, personDisplayDirectory, personDisplayDirectoryName, approximateYears, collection));
|
results.AddRange(GetPersonContainersCollections(facesFileNameExtension, personCharacters, @char, numberSign, personDisplayDirectory, personDisplayDirectoryName, approximateYears, collection));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
personContainer = GetPersonContainer(facesFileNameExtension, personDisplayDirectory, personDisplayDirectoryName, approximateYears);
|
personContainer = GetPersonContainer(facesFileNameExtension, @char, personDisplayDirectory, personDisplayDirectoryName, approximateYears);
|
||||||
results.Add(new(null, personContainer));
|
results.Add(new(null, personContainer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,7 +142,7 @@ internal abstract class PersonContainer
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Models.PersonContainer[] GetPersonContainersGroups(string personBirthdayFormat, string facesFileNameExtension, char[] chars, string[] groupDirectories)
|
private static Models.PersonContainer[] GetPersonContainersGroups(string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string[] groupDirectories)
|
||||||
{
|
{
|
||||||
Models.PersonContainer[] results;
|
Models.PersonContainer[] results;
|
||||||
const int zero = 0;
|
const int zero = 0;
|
||||||
@ -153,27 +153,26 @@ internal abstract class PersonContainer
|
|||||||
foreach (string groupDirectory in groupDirectories)
|
foreach (string groupDirectory in groupDirectories)
|
||||||
{
|
{
|
||||||
groupDirectoryName = Path.GetFileName(groupDirectory);
|
groupDirectoryName = Path.GetFileName(groupDirectory);
|
||||||
if (!chars.Contains(groupDirectoryName[zero]))
|
if (!personCharacters.Contains(groupDirectoryName[zero]))
|
||||||
continue;
|
continue;
|
||||||
personDisplayDirectories = Directory.GetDirectories(groupDirectory, "*", SearchOption.TopDirectoryOnly);
|
personDisplayDirectories = Directory.GetDirectories(groupDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||||
collection = GetPersonContainersGroup(personBirthdayFormat, facesFileNameExtension, chars, personDisplayDirectories);
|
collection = GetPersonContainersGroup(personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectoryName[zero], personDisplayDirectories);
|
||||||
personContainers.AddRange(collection);
|
personContainers.AddRange(collection);
|
||||||
}
|
}
|
||||||
results = (from l in personContainers orderby l.PersonKey is not null, l.PersonKey select l.PersonContainer).ToArray();
|
results = (from l in personContainers orderby l.PersonKey is not null, l.PersonKey select l.PersonContainer).ToArray();
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static Models.PersonContainer[] GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, string facesFileNameExtension)
|
internal static Models.PersonContainer[] GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat, char[] personCharacters, string facesFileNameExtension)
|
||||||
{
|
{
|
||||||
Models.PersonContainer[] results;
|
Models.PersonContainer[] results;
|
||||||
char[] chars = IAge.GetChars();
|
|
||||||
string a2PeopleSingletonDirectory = Path.Combine(storage.PeopleRootDirectory, "{}");
|
string a2PeopleSingletonDirectory = Path.Combine(storage.PeopleRootDirectory, "{}");
|
||||||
if (!Directory.Exists(a2PeopleSingletonDirectory))
|
if (!Directory.Exists(a2PeopleSingletonDirectory))
|
||||||
_ = Directory.CreateDirectory(a2PeopleSingletonDirectory);
|
_ = Directory.CreateDirectory(a2PeopleSingletonDirectory);
|
||||||
string a2PeopleSingletonDirectoryChar;
|
string a2PeopleSingletonDirectoryChar;
|
||||||
foreach (char @char in chars)
|
foreach (char personCharacter in personCharacters)
|
||||||
{
|
{
|
||||||
a2PeopleSingletonDirectoryChar = Path.Combine(a2PeopleSingletonDirectory, @char.ToString());
|
a2PeopleSingletonDirectoryChar = Path.Combine(a2PeopleSingletonDirectory, personCharacter.ToString());
|
||||||
if (!Directory.Exists(a2PeopleSingletonDirectoryChar))
|
if (!Directory.Exists(a2PeopleSingletonDirectoryChar))
|
||||||
_ = Directory.CreateDirectory(a2PeopleSingletonDirectoryChar);
|
_ = Directory.CreateDirectory(a2PeopleSingletonDirectoryChar);
|
||||||
}
|
}
|
||||||
@ -181,7 +180,7 @@ internal abstract class PersonContainer
|
|||||||
if (!groupDirectories.Any())
|
if (!groupDirectories.Any())
|
||||||
results = Array.Empty<Models.PersonContainer>();
|
results = Array.Empty<Models.PersonContainer>();
|
||||||
else
|
else
|
||||||
results = GetPersonContainersGroups(personBirthdayFormat, facesFileNameExtension, chars, groupDirectories);
|
results = GetPersonContainersGroups(personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectories);
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user