LocationContainerDebugDirectory
This commit is contained in:
@ -16,13 +16,13 @@ internal abstract class MapLogic
|
||||
|
||||
internal record Record(string PersonKeyFormatted,
|
||||
int DirectoryNumber,
|
||||
string PersonDisplayDirectoryName,
|
||||
bool IsDefault,
|
||||
string? PersonDisplayDirectoryName,
|
||||
bool? IsDefault,
|
||||
string MappedFaceFile);
|
||||
|
||||
internal record MappedFile(long PersonKey,
|
||||
string PersonKeyFormatted,
|
||||
string PersonDisplayDirectoryName,
|
||||
string? PersonDisplayDirectoryName,
|
||||
int? DirectoryNumber,
|
||||
string File);
|
||||
|
||||
@ -38,8 +38,8 @@ internal abstract class MapLogic
|
||||
float? TotalDays);
|
||||
|
||||
internal record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted,
|
||||
string PersonDisplayDirectoryName,
|
||||
bool IsDefault,
|
||||
string? PersonDisplayDirectoryName,
|
||||
bool? IsDefault,
|
||||
string MappedFaceFile,
|
||||
int Id,
|
||||
int WholePercentages);
|
||||
@ -335,7 +335,7 @@ internal abstract class MapLogic
|
||||
if (directoryInfo.LastWriteTime.Ticks != directoryTicks)
|
||||
Directory.SetLastWriteTime(ticksDirectory, new DateTime(directoryTicks));
|
||||
totalDays = lastDirectoryTicks is null || new TimeSpan(dateTime.Ticks - directoryTicks).TotalDays < 1 ? null : (float)new TimeSpan(directoryTicks - lastDirectoryTicks.Value).TotalDays;
|
||||
results.Add(new(ticksDirectory, ticksDirectoryName, new(directoryTicks), new DateTime(directoryDateTime.Year, directoryDateTime.Month, directoryDateTime.Day + 1), totalDays));
|
||||
results.Add(new(ticksDirectory, ticksDirectoryName, new(directoryTicks), new DateTime(directoryDateTime.Year, directoryDateTime.Month, directoryDateTime.Day).AddMonths(1), totalDays));
|
||||
if (directoryDateTime.Hour == 0 && directoryDateTime.Minute == 0 && directoryDateTime.Second == 0)
|
||||
continue;
|
||||
lastDirectoryTicks = directoryTicks;
|
||||
@ -641,6 +641,7 @@ internal abstract class MapLogic
|
||||
string[] fileMatches;
|
||||
const string lnk = ".lnk";
|
||||
int? id, wholePercentages;
|
||||
string personDisplayDirectoryName;
|
||||
const bool fromDistanceContent = true;
|
||||
IReadOnlyList<MetadataExtractor.Directory> directories;
|
||||
List<(string File, int WholePercentages)>? wholePercentagesCollection;
|
||||
@ -650,7 +651,7 @@ internal abstract class MapLogic
|
||||
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFile.File[..^4]);
|
||||
if (id is null || wholePercentages is null)
|
||||
return;
|
||||
if (skipCollection.TryGetValue(id.Value, out wholePercentagesCollection))
|
||||
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory) && skipCollection.TryGetValue(id.Value, out wholePercentagesCollection))
|
||||
{
|
||||
fileMatches = (from l in wholePercentagesCollection where l.WholePercentages == wholePercentages select l.File).ToArray();
|
||||
foreach (string fileMatch in fileMatches)
|
||||
@ -669,8 +670,9 @@ internal abstract class MapLogic
|
||||
else
|
||||
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappedFile.File);
|
||||
RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value);
|
||||
personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName;
|
||||
lock (locationContainers)
|
||||
locationContainers.Add(new(fromDistanceContent, mappedFile.DirectoryNumber, mappedFile.File, mappedFile.PersonKey, mappedFile.PersonDisplayDirectoryName, id.Value, wholePercentages.Value, directories, rectangle, null));
|
||||
locationContainers.Add(new(fromDistanceContent, mappedFile.DirectoryNumber, mappedFile.File, mappedFile.PersonKey, personDisplayDirectoryName, id.Value, wholePercentages.Value, directories, rectangle, null));
|
||||
}
|
||||
|
||||
private static void LookForPossibleDuplicates(Configuration configuration, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers)
|
||||
@ -870,21 +872,46 @@ internal abstract class MapLogic
|
||||
}
|
||||
}
|
||||
|
||||
internal static List<Record> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection<string> personKeyFormattedCollection)
|
||||
private static List<Record> GetRecords(Configuration configuration, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, List<string> distinct, string? personDisplayDirectoryName)
|
||||
{
|
||||
List<Record> results = new();
|
||||
int? id;
|
||||
string fileName;
|
||||
string checkFile;
|
||||
int? wholePercentages;
|
||||
foreach (string mappedFaceFile in files)
|
||||
{
|
||||
if (mappedFaceFile.EndsWith(".lnk"))
|
||||
continue;
|
||||
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFaceFile);
|
||||
if (id is null || wholePercentages is null)
|
||||
continue;
|
||||
fileName = Path.GetFileName(mappedFaceFile);
|
||||
if (distinct.Contains(fileName))
|
||||
{
|
||||
checkFile = $"{mappedFaceFile}.dup";
|
||||
if (File.Exists(checkFile))
|
||||
continue;
|
||||
File.Move(mappedFaceFile, checkFile);
|
||||
continue;
|
||||
}
|
||||
distinct.Add(fileName);
|
||||
results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, mappedFaceFile));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
internal static List<Record> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection<string> personKeyFormattedCollection)
|
||||
{
|
||||
List<Record> results = new();
|
||||
bool check;
|
||||
bool isDefault;
|
||||
string message;
|
||||
string[] files;
|
||||
string fileName;
|
||||
bool? isDefault;
|
||||
int totalSeconds;
|
||||
string checkFile;
|
||||
DateTime dateTime;
|
||||
TimeSpan timeSpan;
|
||||
int directoryNumber;
|
||||
int? wholePercentages;
|
||||
string? checkDirectory;
|
||||
ProgressBar progressBar;
|
||||
string[] yearDirectories;
|
||||
@ -894,7 +921,7 @@ internal abstract class MapLogic
|
||||
List<string> distinct = new();
|
||||
string[] personNameDirectories;
|
||||
string? newestPersonKeyFormatted;
|
||||
string personDisplayDirectoryName;
|
||||
string? personDisplayDirectoryName;
|
||||
string[] personNameLinkDirectories;
|
||||
string? personFirstInitialDirectory;
|
||||
List<TicksDirectory> ticksDirectories;
|
||||
@ -938,16 +965,32 @@ internal abstract class MapLogic
|
||||
{
|
||||
if (check && !Directory.Exists(yearDirectory))
|
||||
continue;
|
||||
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
if (ticksDirectory.DirectoryName != configuration.LocationContainerDebugDirectory)
|
||||
{
|
||||
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string file in files)
|
||||
File.Delete(file);
|
||||
}
|
||||
if (ticksDirectory.DirectoryName == configuration.LocationContainerDebugDirectory)
|
||||
{
|
||||
isDefault = null;
|
||||
personDisplayDirectoryName = null;
|
||||
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
results.AddRange(GetRecords(configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
|
||||
files = Directory.GetFiles(yearDirectory, "*.lnk", SearchOption.AllDirectories);
|
||||
foreach (string file in files)
|
||||
File.Delete(file);
|
||||
continue;
|
||||
}
|
||||
personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string file in files)
|
||||
File.Delete(file);
|
||||
if (personNameDirectories.Length > 1)
|
||||
throw new NotSupportedException();
|
||||
foreach (string personNameDirectory in personNameDirectories)
|
||||
{
|
||||
directoryNumber++;
|
||||
personDisplayDirectoryName = Path.GetFileName(personNameDirectory);
|
||||
isDefault = IPerson.IsDefaultName(personDisplayDirectoryName) && IPersonBirthday.IsCounterPersonYear(personKeyFormatted[..4]);
|
||||
if (isDefault && personDisplayDirectoryName.Length == 1)
|
||||
if (isDefault.Value && personDisplayDirectoryName.Length == 1)
|
||||
{
|
||||
if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length || !DateTime.TryParseExact(personKeyFormatted, configuration.PersonBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
|
||||
continue;
|
||||
@ -962,7 +1005,7 @@ internal abstract class MapLogic
|
||||
check = true;
|
||||
continue;
|
||||
}
|
||||
if (isDefault && (ticksDirectory.DirectoryDateTime.Hour != 0 || ticksDirectory.DirectoryDateTime.Minute != 0 || ticksDirectory.DirectoryDateTime.Second != 0))
|
||||
if (isDefault.Value && (ticksDirectory.DirectoryDateTime.Hour != 0 || ticksDirectory.DirectoryDateTime.Minute != 0 || ticksDirectory.DirectoryDateTime.Second != 0))
|
||||
{
|
||||
checkDirectory = Path.GetDirectoryName(ticksDirectory.Directory);
|
||||
if (checkDirectory is null)
|
||||
@ -986,7 +1029,7 @@ internal abstract class MapLogic
|
||||
throw new Exception($"Move personKey directories up one from {manualCopyHumanized} and delete {manualCopyHumanized} directory!");
|
||||
if (personKeyFormatted == forceSingleImageHumanized && files.Length > 0)
|
||||
throw new Exception($"Move personKey directories up one from {forceSingleImageHumanized} and delete {forceSingleImageHumanized} directory!");
|
||||
if (!isDefault)
|
||||
if (!isDefault.Value)
|
||||
{
|
||||
if (personKeyFormattedToNewestPersonKeyFormatted.Count > 0 && newestPersonKeyFormatted is null)
|
||||
RenameUnknown(files);
|
||||
@ -1000,7 +1043,7 @@ internal abstract class MapLogic
|
||||
}
|
||||
if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length)
|
||||
continue;
|
||||
if (personDisplayDirectoryName.Length == 1 || isDefault || !personKeyFormattedCollection.Contains(personKeyFormatted))
|
||||
if (personDisplayDirectoryName.Length == 1 || isDefault.Value || !personKeyFormattedCollection.Contains(personKeyFormatted))
|
||||
personFirstInitialDirectory = personNameDirectory;
|
||||
else
|
||||
{
|
||||
@ -1021,25 +1064,7 @@ internal abstract class MapLogic
|
||||
Directory.Move(personNameDirectory, personFirstInitialDirectory);
|
||||
files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
}
|
||||
foreach (string mappedFaceFile in files)
|
||||
{
|
||||
if (mappedFaceFile.EndsWith(".lnk"))
|
||||
continue;
|
||||
(id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFaceFile);
|
||||
if (id is null || wholePercentages is null)
|
||||
continue;
|
||||
fileName = Path.GetFileName(mappedFaceFile);
|
||||
if (distinct.Contains(fileName))
|
||||
{
|
||||
checkFile = $"{mappedFaceFile}.dup";
|
||||
if (File.Exists(checkFile))
|
||||
continue;
|
||||
File.Move(mappedFaceFile, checkFile);
|
||||
continue;
|
||||
}
|
||||
distinct.Add(fileName);
|
||||
results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, mappedFaceFile));
|
||||
}
|
||||
results.AddRange(GetRecords(configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
|
||||
personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string personNameLinkDirectory in personNameLinkDirectories)
|
||||
{
|
||||
@ -1083,6 +1108,7 @@ 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);
|
||||
@ -1090,13 +1116,14 @@ internal abstract class MapLogic
|
||||
throw new Exception();
|
||||
if (!personKeyFormattedToPersonContainer.TryGetValue(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, out personContainer))
|
||||
{
|
||||
matches = configuration.PersonCharacters.Where(l => personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName.Contains(l)).ToArray();
|
||||
personDisplayDirectoryName = personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName;
|
||||
matches = configuration.PersonCharacters.Where(l => personDisplayDirectoryName.Contains(l)).ToArray();
|
||||
if (matches.Length == 0)
|
||||
throw new NotSupportedException();
|
||||
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, personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryName, personDirectory);
|
||||
personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName, personDirectory);
|
||||
personKeyFormattedToPersonContainer.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, personContainer);
|
||||
}
|
||||
if (personContainer.Key is null)
|
||||
@ -1280,8 +1307,11 @@ internal abstract class MapLogic
|
||||
ParallelFor(configuration, skipCollection, results, mappedFiles[i]);
|
||||
});
|
||||
}
|
||||
ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers = new(results.OrderBy(l => l.DirectoryNumber).ToArray());
|
||||
LookForPossibleDuplicates(configuration, locationContainers);
|
||||
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory))
|
||||
{
|
||||
ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers = new(results.OrderBy(l => l.DirectoryNumber).ToArray());
|
||||
LookForPossibleDuplicates(configuration, locationContainers);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
@ -1785,6 +1815,39 @@ internal abstract class MapLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void AddDisplayDirectoryNames(Configuration configuration, string eDistanceContentDirectory, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection, ReadOnlyCollection<ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>>> collections)
|
||||
{
|
||||
bool isCounterPersonYear;
|
||||
string personKeyFormatted;
|
||||
string? displayDirectoryName;
|
||||
string? checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory);
|
||||
_ = IPath.DeleteEmptyDirectories(checkDirectory);
|
||||
foreach (ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> collection in collections)
|
||||
{
|
||||
if (configuration.LocationContainerDistanceTolerance is null)
|
||||
break;
|
||||
isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(collection[0].PersonKey).Year);
|
||||
if (isCounterPersonYear)
|
||||
continue;
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey);
|
||||
checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory, personKeyFormatted);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
continue;
|
||||
displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, collection[0].PersonKey, personKeyFormatted);
|
||||
if (string.IsNullOrEmpty(displayDirectoryName))
|
||||
continue;
|
||||
foreach (string yearDirectory in Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly))
|
||||
{
|
||||
checkDirectory = Path.Combine(yearDirectory, displayDirectoryName);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
_ = Directory.CreateDirectory(checkDirectory);
|
||||
}
|
||||
checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory, personKeyFormatted, displayDirectoryName);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
_ = Directory.CreateDirectory(checkDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SaveMappedRelations(Configuration configuration, Shared.Models.Methods.IDistance<MetadataExtractor.Directory> distance, string a2PeopleContentDirectory, string eDistanceContentDirectory, long ticks, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection)
|
||||
{
|
||||
bool isCounterPersonYear;
|
||||
@ -1802,11 +1865,13 @@ internal abstract class MapLogic
|
||||
progressBar.Tick();
|
||||
if (collection.Count == 0)
|
||||
continue;
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey);
|
||||
isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(collection[0].PersonKey).Year);
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey);
|
||||
displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, collection[0].PersonKey, personKeyFormatted);
|
||||
distance.SaveMappedForOutputResolutions(a2PeopleContentDirectory, eDistanceContentDirectory, configuration.LocationContainerDistanceTolerance.Value, collection, collection[0].PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName);
|
||||
distance.SaveMappedForOutputResolutions(configuration.LocationContainerDebugDirectory, a2PeopleContentDirectory, eDistanceContentDirectory, configuration.LocationContainerDistanceTolerance.Value, collection, collection[0].PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName);
|
||||
}
|
||||
if (!string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory))
|
||||
AddDisplayDirectoryNames(configuration, eDistanceContentDirectory, readOnlyPersonKeyFormattedToPersonContainer, readOnlyPersonKeyToPersonContainerCollection, collections);
|
||||
}
|
||||
|
||||
internal static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation)
|
||||
|
Reference in New Issue
Block a user