LocationContainerDistanceTolerance
This commit is contained in:
@ -15,9 +15,10 @@ internal abstract class MapLogic
|
||||
{
|
||||
|
||||
internal record Record(string PersonKeyFormatted,
|
||||
string[] PersonDisplayDirectoryNames,
|
||||
bool IsDefault,
|
||||
string MappedFaceFile);
|
||||
int DirectoryNumber,
|
||||
string PersonDisplayDirectoryName,
|
||||
bool IsDefault,
|
||||
string MappedFaceFile);
|
||||
|
||||
internal record TicksDirectory(string Directory,
|
||||
string DirectoryName,
|
||||
@ -26,7 +27,7 @@ internal abstract class MapLogic
|
||||
float? TotalDays);
|
||||
|
||||
internal record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted,
|
||||
string[] PersonDisplayDirectoryNames,
|
||||
string PersonDisplayDirectoryName,
|
||||
bool IsDefault,
|
||||
string MappedFaceFile,
|
||||
int Id,
|
||||
@ -257,6 +258,7 @@ internal abstract class MapLogic
|
||||
int totalSeconds;
|
||||
DateTime dateTime;
|
||||
TimeSpan timeSpan;
|
||||
int directoryNumber;
|
||||
int? wholePercentages;
|
||||
string? checkDirectory;
|
||||
ProgressBar progressBar;
|
||||
@ -267,9 +269,9 @@ internal abstract class MapLogic
|
||||
List<string> distinct = new();
|
||||
string[] personNameDirectories;
|
||||
string? newestPersonKeyFormatted;
|
||||
string personDisplayDirectoryName;
|
||||
string[] personNameLinkDirectories;
|
||||
string? personFirstInitialDirectory;
|
||||
string[] personDisplayDirectoryNames;
|
||||
List<TicksDirectory> ticksDirectories;
|
||||
string[] personKeyFormattedDirectories;
|
||||
string manualCopyHumanized = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy).Humanize(LetterCasing.Title);
|
||||
@ -280,6 +282,7 @@ internal abstract class MapLogic
|
||||
check = false;
|
||||
results.Clear();
|
||||
distinct.Clear();
|
||||
directoryNumber = 0;
|
||||
ticksDirectories = UpdateDateVerifyAndGetTicksDirectories(eDistanceContentDirectory);
|
||||
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
message = $"{i}) {ticksDirectories.Count:000} compile from and clean ticks Director(ies) - B - {totalSeconds} total second(s)";
|
||||
@ -316,11 +319,10 @@ internal abstract class MapLogic
|
||||
File.Delete(file);
|
||||
foreach (string personNameDirectory in personNameDirectories)
|
||||
{
|
||||
personDisplayDirectoryNames = IPath.GetDirectoryNames(personNameDirectory);
|
||||
if (personDisplayDirectoryNames.Length == 0)
|
||||
continue;
|
||||
isDefault = personDisplayDirectoryNames[^1].First() == 'X' && IPersonBirthday.IsCounterPersonYear(personKeyFormatted[..4]);
|
||||
if (isDefault && personDisplayDirectoryNames[^1].Length == 1)
|
||||
directoryNumber++;
|
||||
personDisplayDirectoryName = Path.GetFileName(personNameDirectory);
|
||||
isDefault = personDisplayDirectoryName.First() == 'X' && IPersonBirthday.IsCounterPersonYear(personKeyFormatted[..4]);
|
||||
if (isDefault && personDisplayDirectoryName.Length == 1)
|
||||
{
|
||||
if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length || !DateTime.TryParseExact(personKeyFormatted, configuration.PersonBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
|
||||
continue;
|
||||
@ -373,11 +375,11 @@ internal abstract class MapLogic
|
||||
}
|
||||
if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length)
|
||||
continue;
|
||||
if (personDisplayDirectoryNames[^1].Length == 1 || isDefault || !personKeyFormattedCollection.Contains(personKeyFormatted))
|
||||
if (personDisplayDirectoryName.Length == 1 || isDefault || !personKeyFormattedCollection.Contains(personKeyFormatted))
|
||||
personFirstInitialDirectory = personNameDirectory;
|
||||
else
|
||||
{
|
||||
personFirstInitial = personDisplayDirectoryNames[^1][..1];
|
||||
personFirstInitial = personDisplayDirectoryName[..1];
|
||||
if (personFirstInitial.All(l => char.IsDigit(l)))
|
||||
{
|
||||
foreach (string file in files)
|
||||
@ -409,7 +411,7 @@ internal abstract class MapLogic
|
||||
continue;
|
||||
}
|
||||
distinct.Add(fileName);
|
||||
results.Add(new(personKeyFormatted, personDisplayDirectoryNames, isDefault, mappedFaceFile));
|
||||
results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, mappedFaceFile));
|
||||
}
|
||||
personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string personNameLinkDirectory in personNameLinkDirectories)
|
||||
@ -454,7 +456,6 @@ internal abstract class MapLogic
|
||||
char status, sex, first;
|
||||
PersonDirectory personDirectory;
|
||||
PersonContainer? personContainer;
|
||||
string personDisplayDirectoryName;
|
||||
foreach (PersonKeyFormattedIdThenWholePercentages personKeyFormattedIdThenWholePercentages in personKeyFormattedIdThenWholePercentagesCollection)
|
||||
{
|
||||
personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormattedIdThenWholePercentages.PersonKeyFormatted);
|
||||
@ -462,14 +463,13 @@ internal abstract class MapLogic
|
||||
throw new Exception();
|
||||
if (!personKeyFormattedToPersonContainer.TryGetValue(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, out personContainer))
|
||||
{
|
||||
personDisplayDirectoryName = personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryNames[^1];
|
||||
matches = configuration.PersonCharacters.Where(l => personDisplayDirectoryName.Contains(l)).ToArray();
|
||||
matches = configuration.PersonCharacters.Where(l => personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName.Contains(l)).ToArray();
|
||||
if (matches.Length == 0)
|
||||
throw new NotSupportedException();
|
||||
group = IPerson.GetHourGroup(personDisplayDirectoryName, personBirthday.Value.Hour);
|
||||
(status, sex, first) = IPerson.GetPersonHour(personDisplayDirectoryName, personBirthday.Value.Hour);
|
||||
group = IPerson.GetHourGroup(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour);
|
||||
(status, sex, first) = IPerson.GetPersonHour(personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personBirthday.Value.Hour);
|
||||
personDirectory = new(matches.First(), group, status, sex, first);
|
||||
personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName, personDirectory);
|
||||
personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personDirectory);
|
||||
personKeyFormattedToPersonContainer.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, personContainer);
|
||||
}
|
||||
if (personContainer.Key is null)
|
||||
@ -588,7 +588,6 @@ internal abstract class MapLogic
|
||||
List<PersonKeyFormattedIdThenWholePercentages> results = new();
|
||||
int? id;
|
||||
int? wholePercentages;
|
||||
string personDisplayDirectoryName;
|
||||
List<int> wholePercentagesCollection;
|
||||
Dictionary<int, List<int>> idToWholePercentagesCollection = new();
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
@ -606,10 +605,7 @@ internal abstract class MapLogic
|
||||
wholePercentagesCollection = idToWholePercentagesCollection[id.Value];
|
||||
wholePercentagesCollection.Add(wholePercentages.Value);
|
||||
idToWholePercentagesCollection[id.Value].Add(wholePercentages.Value);
|
||||
personDisplayDirectoryName = record.PersonDisplayDirectoryNames[^1];
|
||||
if (string.IsNullOrEmpty(personDisplayDirectoryName))
|
||||
continue;
|
||||
results.Add(new(record.PersonKeyFormatted, record.PersonDisplayDirectoryNames, record.IsDefault, record.MappedFaceFile, id.Value, wholePercentages.Value));
|
||||
results.Add(new(record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.IsDefault, record.MappedFaceFile, id.Value, wholePercentages.Value));
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
@ -821,9 +817,9 @@ internal abstract class MapLogic
|
||||
return results;
|
||||
}
|
||||
|
||||
private static List<(long, string)> GetDisplayDirectoryAllFiles(string fileNameExtension, ReadOnlyCollection<PersonContainer> personContainers)
|
||||
private static List<(long, int?, string)> GetDisplayDirectoryAllFiles(string fileNameExtension, ReadOnlyCollection<PersonContainer> personContainers)
|
||||
{
|
||||
List<(long, string)> results = new();
|
||||
List<(long, int?, string)> results = new();
|
||||
string fileName;
|
||||
List<string> distinct = new();
|
||||
foreach (PersonContainer personContainer in personContainers)
|
||||
@ -838,15 +834,15 @@ internal abstract class MapLogic
|
||||
if (distinct.Contains(fileName))
|
||||
continue;
|
||||
distinct.Add(fileName);
|
||||
results.Add(new(personContainer.Key.Value, displayDirectoryAllFile));
|
||||
results.Add(new(personContainer.Key.Value, null, displayDirectoryAllFile));
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private static List<(long PersonKey, string File)> GetCollection(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, List<Record> records)
|
||||
private static List<(long PersonKey, int? DirectoryNumber, string File)> GetCollection(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, List<Record> records)
|
||||
{
|
||||
List<(long PersonKey, string File)> results = new();
|
||||
List<(long PersonKey, int? DirectoryNumber, string File)> results = new();
|
||||
string file;
|
||||
long personKey;
|
||||
string fileName;
|
||||
@ -863,7 +859,7 @@ internal abstract class MapLogic
|
||||
continue;
|
||||
distinct.Add(fileName);
|
||||
personKey = personBirthday.Value.Ticks;
|
||||
results.Add(new(personKey, record.MappedFaceFile));
|
||||
results.Add(new(personKey, record.DirectoryNumber, record.MappedFaceFile));
|
||||
}
|
||||
for (int i = results.Count - 1; i > -1; i--)
|
||||
{
|
||||
@ -878,12 +874,12 @@ internal abstract class MapLogic
|
||||
if (!File.Exists(file))
|
||||
continue;
|
||||
File.Move(file, file[..^4]);
|
||||
results[i] = new(results[i].PersonKey, file[..^4]);
|
||||
results[i] = new(results[i].PersonKey, results[i].DirectoryNumber, file[..^4]);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private static void ParallelFor(Configuration configuration, string eDistanceContentDirectory, Dictionary<int, List<(string, int)>> skipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, long personKey, string file)
|
||||
private static void ParallelFor(Configuration configuration, string eDistanceContentDirectory, Dictionary<int, List<(string, int)>> skipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, long personKey, int? directoryNumber, string file)
|
||||
{
|
||||
string[] fileMatches;
|
||||
const string lnk = ".lnk";
|
||||
@ -912,7 +908,7 @@ internal abstract class MapLogic
|
||||
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
|
||||
RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value);
|
||||
lock (locationContainers)
|
||||
locationContainers.Add(new(fromDistanceContent, file, personKey, id.Value, wholePercentages.Value, directories, rectangle, null));
|
||||
locationContainers.Add(new(fromDistanceContent, directoryNumber, file, personKey, id.Value, wholePercentages.Value, directories, rectangle, null));
|
||||
}
|
||||
|
||||
private static void OpenPossibleDuplicates(Configuration configuration, List<(long, int, string, float?)> duplicates)
|
||||
@ -987,10 +983,10 @@ internal abstract class MapLogic
|
||||
}
|
||||
}
|
||||
|
||||
internal static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string eDistanceContentDirectory, Dictionary<int, List<(string, int)>> skipCollection, List<Record> records)
|
||||
internal static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(Shared.Models.Methods.IDistance<MetadataExtractor.Directory> distance, int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string eDistanceContentDirectory, Dictionary<int, List<(string, int)>> skipCollection, List<Record> records)
|
||||
{
|
||||
List<LocationContainer<MetadataExtractor.Directory>> results = new();
|
||||
List<(long PersonKey, string File)> collection = GetCollection(configuration, personContainers, records);
|
||||
List<(long PersonKey, int? DirectoryNumber, string File)> collection = GetCollection(configuration, personContainers, records);
|
||||
if (collection.Count > 0 && (configuration.DistanceMoveUnableToMatch || configuration.DistanceRenameToMatch))
|
||||
{
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
@ -1001,10 +997,13 @@ internal abstract class MapLogic
|
||||
_ = Parallel.For(0, collection.Count, parallelOptions, (i, state) =>
|
||||
{
|
||||
progressBar.Tick();
|
||||
ParallelFor(configuration, eDistanceContentDirectory, skipCollection, results, collection[i].PersonKey, collection[i].File);
|
||||
ParallelFor(configuration, eDistanceContentDirectory, skipCollection, results, collection[i].PersonKey, collection[i].DirectoryNumber, collection[i].File);
|
||||
});
|
||||
}
|
||||
LookForPossibleDuplicates(configuration, new(results));
|
||||
ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers = new(results.OrderBy(l => l.DirectoryNumber).ToArray());
|
||||
LookForPossibleDuplicates(configuration, locationContainers);
|
||||
if (configuration.LocationContainerDistanceTolerance is not null)
|
||||
distance.ReviewLocationContainerDistanceTolerance(configuration.LocationContainerDistanceTolerance.Value, locationContainers);
|
||||
return results;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user