Runs but broken
This commit is contained in:
@ -1,6 +1,8 @@
|
||||
namespace View_by_Distance.Map.Models;
|
||||
|
||||
public record Configuration(bool DeletePossibleDuplicates,
|
||||
public record Configuration(Shared.Models.Methods.IDistanceLimits DistanceLimits,
|
||||
Shared.Models.Properties.IPropertyConfiguration PropertyConfiguration,
|
||||
bool DeletePossibleDuplicates,
|
||||
bool DistanceMoveUnableToMatch,
|
||||
bool DistanceRenameToMatch,
|
||||
int FaceConfidencePercent,
|
||||
|
@ -23,6 +23,14 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
long? Ticks,
|
||||
string? PersonDirectory);
|
||||
|
||||
internal record FilteredOriginalImage(int Id,
|
||||
FilePath FilePath,
|
||||
int ApproximateYears,
|
||||
string PersonKeyFormatted,
|
||||
string Directory,
|
||||
string PersonDirectory,
|
||||
string CheckFile);
|
||||
|
||||
public void SaveContainers(int? updated, List<SaveContainer> saveContainers)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
@ -137,7 +145,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
}
|
||||
}
|
||||
|
||||
private List<SaveShortcutsForOutputResolutions> GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> mappingCollection)
|
||||
private List<SaveShortcutsForOutputResolutions> GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection)
|
||||
{
|
||||
List<SaveShortcutsForOutputResolutions> results = [];
|
||||
if (_Configuration is null)
|
||||
@ -153,7 +161,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
string personKeyFormatted;
|
||||
Calendar calendar = new CultureInfo("en-US").Calendar;
|
||||
ReadOnlyDictionary<int, List<long>> idToPersonKeys = IMapLogic.GetIdToPersonKeys(personKeyToIds);
|
||||
foreach (Mapping mapping in mappingCollection)
|
||||
foreach (Mapping mapping in distinctValidImageMappingCollection)
|
||||
{
|
||||
dateTime = mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime();
|
||||
description = mapping.MappingFromLocation is null ? mapping.MappingFromItem.Id.ToString() : mapping.MappingFromLocation.DeterministicHashCodeKey;
|
||||
@ -181,12 +189,12 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonKey);
|
||||
directory = Path.Combine($"{eDistanceContentDirectory}---", "Person Key Shortcuts", personKeyFormatted, directoryName);
|
||||
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.FilePath.Name}.lnk");
|
||||
results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, description, MakeAllHidden: false));
|
||||
results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, dateTime, fileName, description, MakeAllHidden: false));
|
||||
if (IPerson.IsDefaultName(mapping.MappingFromPerson))
|
||||
continue;
|
||||
directory = Path.Combine($"{eDistanceContentDirectory}---", "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, directoryName);
|
||||
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.FilePath.Name}.lnk");
|
||||
results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, description, MakeAllHidden: false));
|
||||
results.Add(new(mapping.MappingFromItem.FilePath.FullName, directory, dateTime, fileName, description, MakeAllHidden: false));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
@ -230,7 +238,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
ReadOnlyDictionary<long, int> readOnlyPersonKeyToCount;
|
||||
Dictionary<int, List<(string, int)>> skipCollection = [];
|
||||
Dictionary<int, List<(string, int)>> skipNotSkipCollection = [];
|
||||
ReadOnlyDictionary<int, List<(string, int)>> readOnlyskipCollection;
|
||||
ReadOnlyDictionary<int, List<(string, int)>> readOnlySkipCollection;
|
||||
string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory);
|
||||
string eDistanceContentTicksDirectory = Path.Combine(eDistanceContentDirectory, ticks.ToString());
|
||||
ReadOnlyDictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> idThenWholePercentagesToPersonContainers;
|
||||
@ -297,7 +305,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
skipCollection,
|
||||
readOnlyPersonKeyFormattedToPersonContainer,
|
||||
personKeyFormattedIdThenWholePercentagesCollection);
|
||||
readOnlyskipCollection = new(skipCollection);
|
||||
readOnlySkipCollection = new(skipCollection);
|
||||
notMappedPersonContainers.AddRange(Stateless.MapLogic.GetNotMappedPersonContainers(configuration,
|
||||
ticks,
|
||||
personContainers,
|
||||
@ -307,7 +315,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
configuration,
|
||||
ticks,
|
||||
personContainers,
|
||||
readOnlyskipCollection,
|
||||
readOnlySkipCollection,
|
||||
records));
|
||||
int lossCount = records.Count - locationContainers.Count;
|
||||
int unableToMatchCount = records.Count - personKeyFormattedIdThenWholePercentagesCollection.Count;
|
||||
@ -351,6 +359,12 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return new(results);
|
||||
}
|
||||
|
||||
public ReadOnlyDictionary<long, PersonContainer> GetPersonKeyToPersonContainer()
|
||||
{
|
||||
Dictionary<long, PersonContainer> results = [];
|
||||
return new(results);
|
||||
}
|
||||
|
||||
public ReadOnlyDictionary<long, List<int>> GetPersonKeyToIds()
|
||||
{
|
||||
Dictionary<long, List<int>> results = [];
|
||||
@ -452,6 +466,31 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
private (long?, string?) GetDirectory(Configuration configuration, string by, string segmentB)
|
||||
{
|
||||
long? ticks = null;
|
||||
const int zero = 0;
|
||||
string? directory = null;
|
||||
string personKeyFormatted;
|
||||
PersonBirthday personBirthday;
|
||||
PersonContainer personContainer;
|
||||
for (int i = _NotMappedPersonContainers.Count - 1; i > 0; i--)
|
||||
{
|
||||
if (configuration.SaveIndividually)
|
||||
break;
|
||||
personContainer = _NotMappedPersonContainers[i];
|
||||
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
|
||||
continue;
|
||||
personBirthday = personContainer.Birthdays[zero];
|
||||
ticks = personBirthday.Value.Ticks;
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday);
|
||||
directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, segmentB);
|
||||
_NotMappedPersonContainers.RemoveAt(i);
|
||||
break;
|
||||
}
|
||||
return (ticks, directory);
|
||||
}
|
||||
|
||||
private (long?, string?) GetDirectory(Configuration configuration, bool saveIndividually, int padLeft, string? segmentC, string by, MappingFromItem mappingFromItem)
|
||||
{
|
||||
long? ticks = null;
|
||||
@ -504,7 +543,30 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
private Record Get(Configuration configuration, bool saveIndividually, string by, Mapping question, int padLeft)
|
||||
private Record Get(Configuration configuration, string by, long? personKey, string? displayDirectoryName, string segmentB)
|
||||
{
|
||||
long? ticks;
|
||||
string? directory;
|
||||
string? debugDirectory;
|
||||
string? personDirectory;
|
||||
if (personKey is null || string.IsNullOrEmpty(displayDirectoryName))
|
||||
{
|
||||
debugDirectory = null;
|
||||
(ticks, directory) = GetDirectory(configuration, by, segmentB);
|
||||
personDirectory = directory is null ? null : Path.Combine(directory, $"X+{ticks}");
|
||||
}
|
||||
else
|
||||
{
|
||||
ticks = null;
|
||||
string personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personKey.Value);
|
||||
debugDirectory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, displayDirectoryName);
|
||||
directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, segmentB);
|
||||
personDirectory = Path.Combine(directory, displayDirectoryName, "lnk");
|
||||
}
|
||||
return new(debugDirectory, directory, ticks, personDirectory);
|
||||
}
|
||||
|
||||
private Record Get(Configuration configuration, bool saveIndividually, int padLeft, string by, Mapping question)
|
||||
{
|
||||
long? ticks;
|
||||
string? directory;
|
||||
@ -532,7 +594,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return new(debugDirectory, directory, ticks, personDirectory);
|
||||
}
|
||||
|
||||
private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping, ReadOnlyDictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny)
|
||||
private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping, ReadOnlyDictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
@ -557,7 +619,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
ReadOnlyDictionary<int, Mapping>? wholePercentagesToMapping;
|
||||
int padLeft = _Configuration.FaceDistancePermyriad.ToString().Length;
|
||||
string forceSingleImageHumanized = nameof(Shared.Models.Stateless.IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title);
|
||||
foreach (Mapping mapping in mappingCollection)
|
||||
foreach (Mapping mapping in distinctValidImageMappingCollection)
|
||||
{
|
||||
if (mapping.MappingFromLocation is null)
|
||||
continue;
|
||||
@ -586,7 +648,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
if (!PreAndPostContinue(_Configuration, mapping, question))
|
||||
continue;
|
||||
}
|
||||
record = Get(_Configuration, saveIndividually, by, mapping, padLeft);
|
||||
record = Get(_Configuration, saveIndividually, padLeft, by, mapping);
|
||||
if (string.IsNullOrEmpty(record.Directory) || string.IsNullOrEmpty(record.PersonDirectory))
|
||||
continue;
|
||||
directory = record.Directory;
|
||||
@ -651,7 +713,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return results;
|
||||
}
|
||||
|
||||
public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping)
|
||||
public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
@ -659,7 +721,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
bool saveMapped = true;
|
||||
int? useFiltersCounter = null;
|
||||
string mappingDirectory = Path.Combine(_EDistanceContentTicksDirectory, nameof(Shared.Models.Stateless.IMapLogic.Mapping));
|
||||
List<SaveContainer> saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false);
|
||||
List<SaveContainer> saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, distinctValidImageMappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false);
|
||||
SaveContainers(updated, saveContainers);
|
||||
if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory))
|
||||
Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory);
|
||||
@ -753,7 +815,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
keyToCount.Add(key, new());
|
||||
_ = keyToCount.TryAdd(key, 0);
|
||||
keyToCount[key]++;
|
||||
if (!_Configuration.SaveIndividually && keyToCount[key] < _Configuration.SortingMaximumPerKey)
|
||||
if (!_Configuration.SaveIndividually && keyToCount[key] <= _Configuration.SortingMaximumPerKey)
|
||||
segmentC = null;
|
||||
else
|
||||
segmentC = sortingContainer.Sorting.DistancePermyriad.ToString();
|
||||
@ -764,6 +826,95 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
private string? GetDisplayDirectoryName(string? displayDirectoryName, LocationContainer locationContainer, ReadOnlyDictionary<long, PersonContainer> personKeyToPersonContainer)
|
||||
{
|
||||
string? result = displayDirectoryName;
|
||||
if (personKeyToPersonContainer.Count != 0)
|
||||
{
|
||||
ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers = GetWholePercentagesToPersonContainers(locationContainer.Id);
|
||||
if (wholePercentagesToPersonContainers is not null)
|
||||
{
|
||||
foreach (KeyValuePair<int, ReadOnlyCollection<PersonContainer>> keyValuePair in wholePercentagesToPersonContainers)
|
||||
{
|
||||
if (keyValuePair.Key != locationContainer.WholePercentages)
|
||||
continue;
|
||||
if (keyValuePair.Value.Count != 1)
|
||||
continue;
|
||||
result = keyValuePair.Value[0].DisplayDirectoryName;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<SaveContainer> GetSaveContainers(string cResultsFullGroupDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, Shared.Models.Methods.IDistanceLimits distanceLimits, ReadOnlyDictionary<string, LocationContainer> onlyOne, ReadOnlyDictionary<long, PersonContainer> personKeyToPersonContainer)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
List<SaveContainer> results = [];
|
||||
string by;
|
||||
Record record;
|
||||
string segmentB;
|
||||
bool isBySorting;
|
||||
string checkFile;
|
||||
string? directory;
|
||||
string shortcutFile;
|
||||
string facesDirectory;
|
||||
bool isCounterPersonYear;
|
||||
string facePartsDirectory;
|
||||
FileHolder? faceFileHolder;
|
||||
SaveContainer? saveContainer;
|
||||
string? displayDirectoryName;
|
||||
FileHolder? resizedFileHolder;
|
||||
int? useFiltersCounter = null;
|
||||
string resizeContentDirectory;
|
||||
FileHolder? facePartsFileHolder;
|
||||
FileHolder? hiddenFaceFileHolder;
|
||||
LocationContainer locationContainer;
|
||||
bool sortingContainersAny = onlyOne.Count > 0;
|
||||
string cContentDirectory = Path.Combine(cResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultContent);
|
||||
string forceSingleImageHumanized = nameof(Shared.Models.Stateless.IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title);
|
||||
string d2FacePartsContentDirectory = Path.Combine(d2ResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultContent);
|
||||
foreach (KeyValuePair<string, LocationContainer> keyValuePair in onlyOne)
|
||||
{
|
||||
if (_Configuration.SaveIndividually)
|
||||
break;
|
||||
locationContainer = keyValuePair.Value;
|
||||
if (locationContainer.LengthPermyriad is null || locationContainer.LengthSource is null)
|
||||
continue;
|
||||
segmentB = locationContainer.LengthPermyriad.Value.ToString().PadLeft(2, '0')[..2];
|
||||
displayDirectoryName = GetDisplayDirectoryName(locationContainer.DisplayDirectoryName, locationContainer, personKeyToPersonContainer);
|
||||
isCounterPersonYear = locationContainer.PersonKey is not null && IPersonBirthday.IsCounterPersonYear(locationContainer.PersonKey.Value);
|
||||
(by, _, isBySorting) = Stateless.MapLogic.Get(useFiltersCounter, _Configuration.SaveIndividually, sortingContainersAny, forceSingleImageHumanized, locationContainer.LengthPermyriad, locationContainer.PersonKey, displayDirectoryName);
|
||||
record = Get(_Configuration, by, locationContainer.PersonKey, displayDirectoryName, segmentB);
|
||||
if (string.IsNullOrEmpty(record.Directory) || string.IsNullOrEmpty(record.PersonDirectory))
|
||||
continue;
|
||||
directory = record.Directory;
|
||||
if (!string.IsNullOrEmpty(record.DebugDirectory))
|
||||
results.Add(new(record.DebugDirectory));
|
||||
if (locationContainer.PersonKey is null)
|
||||
{
|
||||
if (!_Configuration.SaveSortingWithoutPerson)
|
||||
throw new NotSupportedException();
|
||||
if (record.Ticks is null)
|
||||
continue;
|
||||
}
|
||||
results.Add(new(record.PersonDirectory));
|
||||
facesDirectory = locationContainer.LengthSource.DirectoryName;
|
||||
faceFileHolder = IFileHolder.Get(locationContainer.LengthSource.FullName);
|
||||
checkFile = Path.Combine(directory, $"{locationContainer.LengthSource.Name}");
|
||||
shortcutFile = Path.Combine(record.PersonDirectory, $"{locationContainer.LengthSource.Name}.lnk");
|
||||
resizeContentDirectory = Stateless.MapLogic.GetResizeContentDirectory(_PropertyConfiguration, cContentDirectory, locationContainer.LengthSource);
|
||||
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectoryX(_PropertyConfiguration, d2FacePartsContentDirectory, locationContainer.LengthSource);
|
||||
hiddenFaceFileHolder = IFileHolder.Get(Path.Combine(facesDirectory, $"{locationContainer.LengthSource.NameWithoutExtension}{_Configuration.FacesHiddenFileNameExtension}"));
|
||||
facePartsFileHolder = IFileHolder.Get(Path.Combine(facePartsDirectory, $"{locationContainer.LengthSource.NameWithoutExtension}{_Configuration.FacePartsFileNameExtension}"));
|
||||
resizedFileHolder = IFileHolder.Get(Path.Combine(resizeContentDirectory, $"{locationContainer.LengthSource.FileNameFirstSegment}{Path.GetExtension(locationContainer.LengthSource.NameWithoutExtension)}"));
|
||||
saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, resizedFileHolder, shortcutFile);
|
||||
results.Add(saveContainer);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping, Shared.Models.Methods.IDistanceLimits distanceLimits, int? useFiltersCounter, ReadOnlyCollection<SortingContainer> sortingContainers)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
@ -802,7 +953,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
throw new NotSupportedException();
|
||||
if (question.MappingFromLocation is null)
|
||||
continue;
|
||||
record = Get(_Configuration, _Configuration.SaveIndividually, by, question, padLeft);
|
||||
record = Get(_Configuration, _Configuration.SaveIndividually, padLeft, by, question);
|
||||
if (string.IsNullOrEmpty(record.Directory) || string.IsNullOrEmpty(record.PersonDirectory))
|
||||
continue;
|
||||
directory = record.Directory;
|
||||
@ -1029,7 +1180,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension, $"{ids.Count} Face(s)")));
|
||||
foreach ((long personKey, string displayDirectoryName) in collection)
|
||||
{
|
||||
matches = (from l in personContainers where l.Key == personKey && l.ApproximateYears.HasValue select l).ToArray();
|
||||
matches = (from l in personContainers where l.Key == personKey select l).ToArray();
|
||||
if (matches.Length == 0)
|
||||
continue;
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey);
|
||||
@ -1044,11 +1195,11 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return results;
|
||||
}
|
||||
|
||||
private (int, FilePath, int, string, string, string, string)[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory, ReadOnlyCollection<PersonContainer> personContainers, ReadOnlyCollection<Mapping> mappingCollection, ReadOnlyDictionary<long, List<int>> personKeyToIds)
|
||||
private FilteredOriginalImage[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory, ReadOnlyCollection<PersonContainer> personContainers, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection, ReadOnlyDictionary<long, List<int>> personKeyToIds)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
(int, FilePath, int, string, string, string, string)[] results;
|
||||
FilteredOriginalImage[] results;
|
||||
int count = 0;
|
||||
int group = 65;
|
||||
string checkFile;
|
||||
@ -1058,9 +1209,9 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
string personKeyFormatted;
|
||||
List<int> distinctCollection = [];
|
||||
bool usePersonKeyAndDeterministicHashCodeKey = false;
|
||||
List<FilteredOriginalImage> filteredOriginalImages = [];
|
||||
List<string> personKeyFormattedCollection = GetPersonKeyFormattedCollection(jLinks, a2PeopleContentDirectory, personContainers, personKeyToIds);
|
||||
List<(int Id, FilePath FilePath, int ApproximateYears, string PersonKeyFormatted, string CheckFile, string Directory, string PersonDirectory)> collection = [];
|
||||
foreach (Mapping mapping in mappingCollection)
|
||||
foreach (Mapping mapping in distinctValidImageMappingCollection)
|
||||
{
|
||||
if (distinctCollection.Contains(mapping.MappingFromItem.Id))
|
||||
continue;
|
||||
@ -1069,7 +1220,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
throw new NotSupportedException();
|
||||
if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting)
|
||||
continue;
|
||||
if (mapping.MappingFromPerson?.ApproximateYears is null || mapping.MappingFromLocation is null)
|
||||
if (mapping.MappingFromPerson is null || mapping.MappingFromLocation is null)
|
||||
continue;
|
||||
if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB))
|
||||
throw new NotSupportedException();
|
||||
@ -1097,39 +1248,44 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName);
|
||||
checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}");
|
||||
}
|
||||
collection.Add(new(mapping.MappingFromItem.Id, mapping.MappingFromItem.FilePath, mapping.MappingFromPerson.ApproximateYears.Value, personKeyFormatted, directory, personDirectory, checkFile));
|
||||
if (mapping is null)
|
||||
continue;
|
||||
if (mapping.MappingFromPerson.ApproximateYears is null)
|
||||
filteredOriginalImages.Add(new(mapping.MappingFromItem.Id, mapping.MappingFromItem.FilePath, -1, personKeyFormatted, directory, personDirectory, checkFile));
|
||||
else
|
||||
filteredOriginalImages.Add(new(mapping.MappingFromItem.Id, mapping.MappingFromItem.FilePath, mapping.MappingFromPerson.ApproximateYears.Value, personKeyFormatted, directory, personDirectory, checkFile));
|
||||
distinctCollection.Add(mapping.MappingFromItem.Id);
|
||||
count += 1;
|
||||
}
|
||||
results = (from l in collection orderby l.ApproximateYears descending, l.PersonKeyFormatted descending select l).ToArray();
|
||||
results = (from l in filteredOriginalImages orderby l.ApproximateYears descending, l.PersonKeyFormatted descending select l).ToArray();
|
||||
return results;
|
||||
}
|
||||
|
||||
public void SaveFilteredOriginalImagesFromJLinks(string[] jLinks, ReadOnlyCollection<PersonContainer> personContainers, string a2PeopleContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> mappingCollection)
|
||||
public void SaveFilteredOriginalImagesFromJLinks(string[] jLinks, ReadOnlyCollection<PersonContainer> personContainers, string a2PeopleContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
FileHolder fileHolder;
|
||||
SaveContainer? saveContainer;
|
||||
List<SaveContainer> saveContainers = [];
|
||||
(int, FilePath, int, string, string, string, string)[] collection = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, mappingCollection, personKeyToIds);
|
||||
foreach ((int id, FilePath filePath, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection)
|
||||
FilteredOriginalImage[] filteredOriginalImages = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, distinctValidImageMappingCollection, personKeyToIds);
|
||||
foreach (FilteredOriginalImage filteredOriginalImage in filteredOriginalImages)
|
||||
{
|
||||
fileHolder = FileHolder.Get(filePath);
|
||||
saveContainer = new(personDirectory);
|
||||
fileHolder = FileHolder.Get(filteredOriginalImage.FilePath);
|
||||
saveContainer = new(filteredOriginalImage.PersonDirectory);
|
||||
saveContainers.Add(saveContainer);
|
||||
saveContainer = new(fileHolder, checkFile, directory);
|
||||
saveContainer = new(fileHolder, filteredOriginalImage.CheckFile, filteredOriginalImage.Directory);
|
||||
saveContainers.Add(saveContainer);
|
||||
}
|
||||
SaveContainers(null, saveContainers);
|
||||
}
|
||||
|
||||
public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> mappingCollection)
|
||||
public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, ReadOnlyDictionary<long, List<int>> personKeyToIds, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection)
|
||||
{
|
||||
string hiddenFile;
|
||||
WindowsShortcut windowsShortcut;
|
||||
List<SaveShortcutsForOutputResolutions> collection = [];
|
||||
collection = GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, mappingCollection);
|
||||
collection = GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, distinctValidImageMappingCollection);
|
||||
string[] distinctDirectories = (from l in collection select l.Directory).Distinct().ToArray();
|
||||
foreach (string directory in distinctDirectories)
|
||||
{
|
||||
@ -1163,7 +1319,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
}
|
||||
}
|
||||
|
||||
private (List<(string, DateTime[])>, List<SaveShortcutsForOutputResolutions>) GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(ReadOnlyDictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, ReadOnlyCollection<Item> filteredItems, ReadOnlyCollection<Mapping> mappingCollection)
|
||||
private (List<(string, DateTime[])>, List<SaveShortcutsForOutputResolutions>) GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(ReadOnlyDictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, ReadOnlyCollection<Item> validImageItems, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
@ -1171,6 +1327,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
string fileName;
|
||||
string fullName;
|
||||
string directory;
|
||||
DateTime dateTime;
|
||||
string facesDirectory;
|
||||
string? directoryName;
|
||||
string personDirectory;
|
||||
@ -1178,7 +1335,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
List<string> distinct = [];
|
||||
List<SaveShortcutsForOutputResolutions> collection = [];
|
||||
List<(string, DateTime[])> directoriesAndDateTimes = [];
|
||||
foreach (Item item in filteredItems)
|
||||
foreach (Item item in validImageItems)
|
||||
{
|
||||
if (item.ResizedFileHolder is null)
|
||||
continue;
|
||||
@ -1204,13 +1361,14 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (Mapping mapping in mappingCollection)
|
||||
foreach (Mapping mapping in distinctValidImageMappingCollection)
|
||||
{
|
||||
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;
|
||||
dateTime = mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime();
|
||||
if (mapping.By is null or Shared.Models.Stateless.IMapLogic.Sorting || mapping.MappingFromPerson?.ApproximateYears is null)
|
||||
{
|
||||
if (mapping.MappingFromItem.ContainerDateTimes.Length > 0 && !distinct.Contains(mapping.MappingFromItem.ResizedFileHolder.DirectoryName))
|
||||
@ -1221,13 +1379,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
directory = Path.Combine(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", _PropertyConfiguration.ResultAllInOne);
|
||||
personDirectory = Path.Combine(directory, "Unknown");
|
||||
fileName = Path.Combine(personDirectory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk");
|
||||
collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false));
|
||||
collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, dateTime, fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false));
|
||||
facesDirectory = Stateless.MapLogic.GetFacesDirectory(_PropertyConfiguration, dFacesContentDirectory, mapping.FilePath, mapping.MappingFromItem);
|
||||
if (mapping.MappingFromLocation is null)
|
||||
continue;
|
||||
fullName = Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.FilePath.ExtensionLowered}{_Configuration.FacesFileNameExtension}");
|
||||
fileName = Path.Combine(personDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ResizedFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}.lnk");
|
||||
collection.Add(new(fullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: true));
|
||||
collection.Add(new(fullName, personDirectory, dateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: true));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1247,21 +1405,21 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
else
|
||||
personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, $"{ids.Count} Face(s)");
|
||||
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk");
|
||||
collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false));
|
||||
collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, dateTime, fileName, mapping.MappingFromLocation?.DeterministicHashCodeKey, MakeAllHidden: false));
|
||||
}
|
||||
}
|
||||
return new(directoriesAndDateTimes, collection);
|
||||
}
|
||||
|
||||
public void SaveShortcutsForOutputResolutionsDuringMapLogic(ReadOnlyCollection<Container> containers, ReadOnlyDictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, ReadOnlyCollection<Mapping> mappingCollection)
|
||||
public void SaveShortcutsForOutputResolutionsDuringMapLogic(ReadOnlyCollection<Container> containers, ReadOnlyDictionary<long, List<int>> personKeyToIds, string dFacesContentDirectory, ReadOnlyCollection<Mapping> distinctValidImageMappingCollection)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
WindowsShortcut windowsShortcut;
|
||||
List<(string, DateTime[])> directoriesAndDateTimes;
|
||||
List<SaveShortcutsForOutputResolutions> collection;
|
||||
ReadOnlyCollection<Item> filteredItems = IContainer.GetItems(_PropertyConfiguration, containers, distinctItems: true, filterItems: true);
|
||||
(directoriesAndDateTimes, collection) = GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, dFacesContentDirectory, filteredItems, mappingCollection);
|
||||
ReadOnlyCollection<Item> validImageItems = IContainer.GetValidImageItems(_PropertyConfiguration, containers, distinctItems: true, filterItems: true);
|
||||
(directoriesAndDateTimes, collection) = GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, dFacesContentDirectory, validImageItems, distinctValidImageMappingCollection);
|
||||
string[] directories = (from l in collection select l.Directory).Distinct().ToArray();
|
||||
foreach (string directory in directories)
|
||||
{
|
||||
@ -1305,10 +1463,13 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation) =>
|
||||
_SkipCollection.TryGetValue(id, out List<int>? wholePercentagesCollection) && wholePercentagesCollection.Contains(mappingFromLocation.WholePercentages);
|
||||
public bool InSkipCollection(int id, int wholePercentages) =>
|
||||
_SkipCollection.TryGetValue(id, out List<int>? wholePercentagesCollection) && wholePercentagesCollection.Contains(wholePercentages);
|
||||
|
||||
public bool? IsFocusPerson(int? skipPersonWithMoreThen, long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation)
|
||||
public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation) =>
|
||||
InSkipCollection(id, mappingFromLocation.WholePercentages);
|
||||
|
||||
public bool? IsFocusPerson(int? skipPersonWithMoreThen, long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, int wholePercentages)
|
||||
{
|
||||
bool? result;
|
||||
ReadOnlyCollection<PersonContainer>? personContainers;
|
||||
@ -1316,7 +1477,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
result = null;
|
||||
else if (wholePercentagesToPersonContainers is null)
|
||||
result = null;
|
||||
else if (!wholePercentagesToPersonContainers.TryGetValue(mappingFromLocation.WholePercentages, out personContainers))
|
||||
else if (!wholePercentagesToPersonContainers.TryGetValue(wholePercentages, out personContainers))
|
||||
result = null;
|
||||
else
|
||||
{
|
||||
@ -1340,37 +1501,46 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
public void LookForAbandoned(Property.Models.Configuration propertyConfiguration, string bResultsFullGroupDirectory, ReadOnlyCollection<Container> readOnlyContainers, string cResultsFullGroupDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory)
|
||||
public bool? IsFocusPerson(int? skipPersonWithMoreThen, long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation) =>
|
||||
IsFocusPerson(skipPersonWithMoreThen, jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation.WholePercentages);
|
||||
|
||||
public void LookForAbandoned(IDlibDotNet dlibDotNet, Property.Models.Configuration propertyConfiguration, string bResultsFullGroupDirectory, ReadOnlyCollection<Container> readOnlyContainers, string cResultsFullGroupDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory)
|
||||
{
|
||||
string[] directories;
|
||||
string? directoryName;
|
||||
List<int> distinctFilteredIds = IContainer.GetFilteredDistinctIds(propertyConfiguration, readOnlyContainers);
|
||||
LookForAbandoned(propertyConfiguration, distinctFilteredIds);
|
||||
Stateless.LookForAbandonedLogic.LookForAbandoned(propertyConfiguration, bResultsFullGroupDirectory, distinctFilteredIds);
|
||||
dlibDotNet.Tick();
|
||||
List<string> distinctFilteredFileNameFirstSegments = IContainer.GetFilteredDistinctFileNameFirstSegments(propertyConfiguration, readOnlyContainers);
|
||||
Stateless.LookForAbandonedLogic.LookForAbandoned(propertyConfiguration, bResultsFullGroupDirectory, distinctFilteredFileNameFirstSegments);
|
||||
dlibDotNet.Tick();
|
||||
directories = Directory.GetDirectories(cResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string directory in directories)
|
||||
{
|
||||
directoryName = Path.GetFileName(directory);
|
||||
if (string.IsNullOrEmpty(directoryName) || directoryName.Length != 2 && directoryName.Length != 4)
|
||||
continue;
|
||||
Stateless.LookForAbandonedLogic.LookForAbandoned(propertyConfiguration, distinctFilteredIds, directory, directoryName);
|
||||
Stateless.LookForAbandonedLogic.LookForAbandoned(propertyConfiguration, distinctFilteredFileNameFirstSegments, directory, directoryName);
|
||||
}
|
||||
dlibDotNet.Tick();
|
||||
directories = Directory.GetDirectories(dResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string directory in directories)
|
||||
{
|
||||
directoryName = Path.GetFileName(directory);
|
||||
if (string.IsNullOrEmpty(directoryName) || directoryName.Length != 2 && directoryName.Length != 4)
|
||||
continue;
|
||||
Stateless.LookForAbandonedLogic.LookForAbandoned(propertyConfiguration, distinctFilteredIds, directory, directoryName);
|
||||
Stateless.LookForAbandonedLogic.LookForAbandoned(propertyConfiguration, distinctFilteredFileNameFirstSegments, directory, directoryName);
|
||||
}
|
||||
dlibDotNet.Tick();
|
||||
directories = Directory.GetDirectories(d2ResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string directory in directories)
|
||||
{
|
||||
directoryName = Path.GetFileName(directory);
|
||||
if (string.IsNullOrEmpty(directoryName) || directoryName.Length != 2 && directoryName.Length != 4)
|
||||
continue;
|
||||
Stateless.LookForAbandonedLogic.LookForAbandoned(propertyConfiguration, distinctFilteredIds, directory, directoryName);
|
||||
Stateless.LookForAbandonedLogic.LookForAbandoned(propertyConfiguration, distinctFilteredFileNameFirstSegments, directory, directoryName);
|
||||
}
|
||||
dlibDotNet.Tick();
|
||||
}
|
||||
|
||||
}
|
@ -32,9 +32,23 @@ internal abstract class DecadeLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
internal static void SetCreationTimeMaybeMoveToDecade(Property.Models.Configuration propertyConfiguration, bool moveToDecade, MappingFromItem mappingFromItem, ReadOnlyCollection<LocationContainer> locationContainers)
|
||||
internal static void SetCreationTime(MappingFromItem mappingFromItem, ReadOnlyCollection<LocationContainer> locationContainers)
|
||||
{
|
||||
DateTime dateTime;
|
||||
foreach (LocationContainer locationContainer in locationContainers)
|
||||
{
|
||||
dateTime = mappingFromItem.DateTimeOriginal is null ? mappingFromItem.MinimumDateTime : mappingFromItem.DateTimeOriginal.Value;
|
||||
if (locationContainer.CreationDateOnly.Year != dateTime.Year || locationContainer.CreationDateOnly.Month != dateTime.Month || locationContainer.CreationDateOnly.Day != dateTime.Day)
|
||||
{
|
||||
if (!File.Exists(locationContainer.FilePath.FullName))
|
||||
continue;
|
||||
File.SetCreationTime(locationContainer.FilePath.FullName, dateTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static void MoveToDecade(Property.Models.Configuration propertyConfiguration, MappingFromItem mappingFromItem, ReadOnlyCollection<LocationContainer> locationContainers)
|
||||
{
|
||||
string halfDecade;
|
||||
string checkDirectory;
|
||||
string? yearDirectory;
|
||||
@ -44,13 +58,6 @@ internal abstract class DecadeLogic
|
||||
string? personKeyFormattedDirectoryName;
|
||||
foreach (LocationContainer locationContainer in locationContainers)
|
||||
{
|
||||
if (!File.Exists(locationContainer.FilePath.FullName))
|
||||
continue;
|
||||
dateTime = mappingFromItem.DateTimeOriginal is null ? mappingFromItem.MinimumDateTime : mappingFromItem.DateTimeOriginal.Value;
|
||||
if (locationContainer.CreationDateOnly.Year != dateTime.Year || locationContainer.CreationDateOnly.Month != dateTime.Month || locationContainer.CreationDateOnly.Day != dateTime.Day)
|
||||
File.SetCreationTime(locationContainer.FilePath.FullName, dateTime);
|
||||
if (!moveToDecade)
|
||||
continue;
|
||||
if (string.IsNullOrEmpty(locationContainer.FilePath.DirectoryName))
|
||||
continue;
|
||||
personNameDirectoryName = Path.GetFileName(locationContainer.FilePath.DirectoryName);
|
||||
@ -68,6 +75,8 @@ internal abstract class DecadeLogic
|
||||
if (halfDecade == yearDirectoryName)
|
||||
continue;
|
||||
checkDirectory = Path.Combine(personKeyFormattedDirectory, halfDecade, personNameDirectoryName);
|
||||
if (!File.Exists(locationContainer.FilePath.FullName))
|
||||
continue;
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
_ = Directory.CreateDirectory(checkDirectory);
|
||||
File.Move(locationContainer.FilePath.FullName, Path.Combine(checkDirectory, locationContainer.FilePath.Name));
|
||||
|
@ -250,14 +250,27 @@ internal abstract class DistanceLogic
|
||||
return results;
|
||||
}
|
||||
|
||||
private static void RenameUnknown(string[] files)
|
||||
private static string[] RenameBirth(string[] files)
|
||||
{
|
||||
List<string> results = [];
|
||||
string checkFile;
|
||||
foreach (string file in files)
|
||||
{
|
||||
if (file.EndsWith(".unk"))
|
||||
if (file.EndsWith(".brt"))
|
||||
{
|
||||
results.Add(file);
|
||||
continue;
|
||||
File.Move(file, $"{file}.unk");
|
||||
}
|
||||
checkFile = $"{file}.brt";
|
||||
if (File.Exists(checkFile))
|
||||
{
|
||||
results.Add(file);
|
||||
continue;
|
||||
}
|
||||
File.Move(file, checkFile);
|
||||
results.Add(checkFile);
|
||||
}
|
||||
return results.ToArray();
|
||||
}
|
||||
|
||||
private static void MovedToNewestPersonKeyFormatted(string personKeyFormatted, string newestPersonKeyFormatted, TicksDirectory ticksDirectory, string personKeyDirectory)
|
||||
@ -374,7 +387,7 @@ internal abstract class DistanceLogic
|
||||
}
|
||||
personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
if (personNameDirectories.Length > 1)
|
||||
throw new NotSupportedException();
|
||||
throw new NotSupportedException("Try deleting *.lnk files!");
|
||||
foreach (string personNameDirectory in personNameDirectories)
|
||||
{
|
||||
directoryNumber++;
|
||||
@ -422,7 +435,7 @@ internal abstract class DistanceLogic
|
||||
if (!isDefault.Value)
|
||||
{
|
||||
if (personKeyFormattedToNewestPersonKeyFormatted.Count > 0 && newestPersonKeyFormatted is null)
|
||||
RenameUnknown(files);
|
||||
files = RenameBirth(files);
|
||||
else if (newestPersonKeyFormatted is not null && personKeyFormatted != newestPersonKeyFormatted)
|
||||
{
|
||||
if (!check)
|
||||
|
212
Map/Models/Stateless/FaceFileLogic.cs
Normal file
212
Map/Models/Stateless/FaceFileLogic.cs
Normal file
@ -0,0 +1,212 @@
|
||||
using ShellProgressBar;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Drawing;
|
||||
using System.Text.Json;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Stateless.Methods;
|
||||
using static View_by_Distance.Map.Models.Stateless.MapLogic;
|
||||
|
||||
namespace View_by_Distance.Map.Models.Stateless;
|
||||
|
||||
internal abstract class FaceFileLogic
|
||||
{
|
||||
|
||||
private static void MappedParallelFor(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, ReadOnlyDictionary<int, List<(string, int)>> skipCollection, List<LocationContainer> locationContainers, MappedFile mappedFile)
|
||||
{
|
||||
int? id;
|
||||
string checkFile;
|
||||
DateOnly dateOnly;
|
||||
FilePath filePath;
|
||||
string[] fileMatches;
|
||||
FileHolder fileHolder;
|
||||
int? wholePercentages;
|
||||
const string lnk = ".lnk";
|
||||
ExifDirectory? exifDirectory;
|
||||
string personDisplayDirectoryName;
|
||||
const bool fromDistanceContent = true;
|
||||
List<(string File, int WholePercentages)>? wholePercentagesCollection;
|
||||
if (!mappedFile.FilePath.Name.EndsWith(lnk))
|
||||
{
|
||||
if (mappedFile.FilePath.Id is null)
|
||||
return;
|
||||
id = mappedFile.FilePath.Id;
|
||||
wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, mappedFile.FilePath);
|
||||
}
|
||||
else
|
||||
{
|
||||
fileHolder = IFileHolder.Get(mappedFile.FilePath.FullName[..^4]);
|
||||
filePath = FilePath.Get(propertyConfiguration, fileHolder, index: null);
|
||||
if (filePath.Id is null)
|
||||
return;
|
||||
id = filePath.Id;
|
||||
wholePercentages = IMapping.GetWholePercentages(configuration.FacesFileNameExtension, filePath);
|
||||
}
|
||||
if (wholePercentages is null)
|
||||
return;
|
||||
if (configuration.LinkedAlpha is null && 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)
|
||||
{
|
||||
if (string.IsNullOrEmpty(fileMatch) || !File.Exists(fileMatch))
|
||||
continue;
|
||||
checkFile = $"{fileMatch}.dup";
|
||||
if (File.Exists(checkFile))
|
||||
continue;
|
||||
File.Move(fileMatch, checkFile);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
dateOnly = DateOnly.FromDateTime(new DateTime(mappedFile.FilePath.CreationTicks));
|
||||
if (mappedFile.FilePath.Name.EndsWith(lnk) || !File.Exists(mappedFile.FilePath.FullName))
|
||||
exifDirectory = null;
|
||||
else
|
||||
exifDirectory = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(mappedFile.FilePath);
|
||||
RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value);
|
||||
personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName;
|
||||
lock (locationContainers)
|
||||
locationContainers.Add(new(dateOnly,
|
||||
exifDirectory,
|
||||
mappedFile.DirectoryNumber,
|
||||
personDisplayDirectoryName,
|
||||
null,
|
||||
null,
|
||||
mappedFile.FilePath,
|
||||
fromDistanceContent,
|
||||
id.Value,
|
||||
null,
|
||||
null,
|
||||
mappedFile.PersonKey,
|
||||
rectangle,
|
||||
wholePercentages.Value));
|
||||
}
|
||||
|
||||
private static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> GetReadOnly(Dictionary<int, Dictionary<int, LocationContainer>> keyValuePairs)
|
||||
{
|
||||
Dictionary<int, ReadOnlyDictionary<int, LocationContainer>> results = [];
|
||||
foreach (KeyValuePair<int, Dictionary<int, LocationContainer>> keyValuePair in keyValuePairs)
|
||||
results.Add(keyValuePair.Key, new(keyValuePair.Value));
|
||||
return new(results);
|
||||
}
|
||||
|
||||
internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> GetMapped(int maxDegreeOfParallelism, Property.Models.Configuration propertyConfiguration, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string a2PeopleSingletonDirectory, string eDistanceContentDirectory)
|
||||
{
|
||||
Dictionary<int, Dictionary<int, LocationContainer>> results = [];
|
||||
List<LocationContainer> locationContainers = [];
|
||||
Dictionary<int, LocationContainer>? keyValuePairs;
|
||||
Dictionary<int, List<(string, int)>> skipCollection = [];
|
||||
Dictionary<int, List<(string, int)>> skipNotSkipCollection = [];
|
||||
ReadOnlyCollection<string> readOnlyPersonKeyFormattedCollection;
|
||||
ReadOnlyDictionary<string, string> readOnlyPersonKeyFormattedToNewestPersonKeyFormatted;
|
||||
SetSkipCollections(configuration, personContainers, a2PeopleSingletonDirectory, skipCollection, skipNotSkipCollection);
|
||||
{
|
||||
List<string> personKeyFormattedCollection = [];
|
||||
Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted = [];
|
||||
SetPersonCollections(configuration, personContainers, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection);
|
||||
readOnlyPersonKeyFormattedCollection = new(personKeyFormattedCollection);
|
||||
readOnlyPersonKeyFormattedToNewestPersonKeyFormatted = new(personKeyFormattedToNewestPersonKeyFormatted);
|
||||
}
|
||||
List<Record> records = DistanceLogic.DeleteEmptyDirectoriesAndGetCollection(propertyConfiguration, configuration, ticks, eDistanceContentDirectory, readOnlyPersonKeyFormattedToNewestPersonKeyFormatted, readOnlyPersonKeyFormattedCollection);
|
||||
List<MappedFile> mappedFiles = GetMappedFiles(propertyConfiguration, configuration, personContainers, records);
|
||||
if (mappedFiles.Count > 0)
|
||||
{
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
string message = $") Building Mapped Face Files Collection - {totalSeconds} total second(s)";
|
||||
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
||||
ReadOnlyDictionary<int, List<(string, int)>> readOnlySkipNotSkipCollection = new(skipCollection);
|
||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||
using ProgressBar progressBar = new(mappedFiles.Count, message, options);
|
||||
_ = Parallel.For(0, mappedFiles.Count, parallelOptions, (i, state) =>
|
||||
{
|
||||
progressBar.Tick();
|
||||
MappedParallelFor(propertyConfiguration, configuration, readOnlySkipNotSkipCollection, locationContainers, mappedFiles[i]);
|
||||
});
|
||||
}
|
||||
foreach (LocationContainer locationContainer in locationContainers)
|
||||
{
|
||||
if (!results.TryGetValue(locationContainer.Id, out keyValuePairs))
|
||||
{
|
||||
results.Add(locationContainer.Id, []);
|
||||
if (!results.TryGetValue(locationContainer.Id, out keyValuePairs))
|
||||
throw new Exception();
|
||||
}
|
||||
if (keyValuePairs.ContainsKey(locationContainer.WholePercentages))
|
||||
continue;
|
||||
keyValuePairs.Add(locationContainer.WholePercentages, locationContainer);
|
||||
}
|
||||
return GetReadOnly(results);
|
||||
}
|
||||
|
||||
private static void MoveUnableToMatch(FilePath filePath)
|
||||
{
|
||||
string checkFile = $"{filePath.FullName}.unk";
|
||||
if (File.Exists(filePath.FullName) && !File.Exists(checkFile))
|
||||
File.Move(filePath.FullName, checkFile);
|
||||
}
|
||||
|
||||
private static void AvailableParallelFor(Configuration configuration, IFaceD dFace, List<LocationContainer> locationContainers, FilePath filePath)
|
||||
{
|
||||
string? json;
|
||||
const bool fromDistanceContent = false;
|
||||
if (filePath.Id is null)
|
||||
return;
|
||||
DateOnly dateOnly = DateOnly.FromDateTime(new DateTime(filePath.CreationTicks));
|
||||
int? wholePercentages = IMapping.GetWholePercentages(dFace.FileNameExtension, filePath);
|
||||
if (wholePercentages is null)
|
||||
{
|
||||
if (configuration.DistanceMoveUnableToMatch)
|
||||
MoveUnableToMatch(filePath);
|
||||
return;
|
||||
}
|
||||
ExifDirectory exifDirectory = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(filePath);
|
||||
json = Metadata.Models.Stateless.Methods.IMetadata.GetOutputResolution(exifDirectory);
|
||||
if (json is null || !json.Contains(nameof(DateTime)))
|
||||
{
|
||||
if (configuration.DistanceMoveUnableToMatch)
|
||||
MoveUnableToMatch(filePath);
|
||||
return;
|
||||
}
|
||||
FaceFile? faceFile = JsonSerializer.Deserialize(json, FaceFileGenerationContext.Default.FaceFile);
|
||||
if (faceFile is null || faceFile.Location is null)
|
||||
{
|
||||
if (configuration.DistanceMoveUnableToMatch)
|
||||
MoveUnableToMatch(filePath);
|
||||
return;
|
||||
}
|
||||
RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value);
|
||||
if (rectangle is null)
|
||||
return;
|
||||
lock (locationContainers)
|
||||
locationContainers.Add(new(dateOnly,
|
||||
exifDirectory,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
faceFile,
|
||||
filePath,
|
||||
fromDistanceContent,
|
||||
filePath.Id.Value,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
rectangle,
|
||||
wholePercentages.Value));
|
||||
}
|
||||
|
||||
internal static List<LocationContainer> GetAvailable(int maxDegreeOfParallelism, Configuration configuration, IFaceD dFace, long ticks, ReadOnlyCollection<FilePath> filePaths)
|
||||
{
|
||||
List<LocationContainer> results = [];
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
||||
string message = $") Building Available Face Files Collection - {totalSeconds} total second(s)";
|
||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||
using ProgressBar progressBar = new(filePaths.Count, message, options);
|
||||
_ = Parallel.For(0, filePaths.Count, parallelOptions, (i, state) =>
|
||||
{
|
||||
progressBar.Tick();
|
||||
AvailableParallelFor(configuration, dFace, results, filePaths[i]);
|
||||
});
|
||||
return results;
|
||||
}
|
||||
|
||||
}
|
@ -6,13 +6,12 @@ namespace View_by_Distance.Map.Models.Stateless;
|
||||
internal abstract class LookForAbandonedLogic
|
||||
{
|
||||
|
||||
internal static void LookForAbandoned(Property.Models.Configuration propertyConfiguration, List<int> distinctFilteredIds, string directory, string directoryName)
|
||||
internal static void LookForAbandoned(Property.Models.Configuration propertyConfiguration, List<string> distinctFilteredFileNameFirstSegments, string directory, string directoryName)
|
||||
{
|
||||
FilePath filePath;
|
||||
FileHolder fileHolder;
|
||||
string fileNameFirstSegment;
|
||||
List<string> renameCollection = [];
|
||||
string[] distinctFilteredIdsValues = distinctFilteredIds.Select(l => l.ToString()).ToArray();
|
||||
string[] files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories);
|
||||
foreach (string file in files)
|
||||
{
|
||||
@ -21,7 +20,7 @@ internal abstract class LookForAbandonedLogic
|
||||
fileNameFirstSegment = fileHolder.NameWithoutExtension.Split('.')[0];
|
||||
if (!filePath.IsIntelligentIdFormat && filePath.SortOrder is null)
|
||||
continue;
|
||||
if (distinctFilteredIdsValues.Contains(fileNameFirstSegment))
|
||||
if (distinctFilteredFileNameFirstSegments.Contains(fileNameFirstSegment))
|
||||
continue;
|
||||
renameCollection.Add(file);
|
||||
}
|
||||
@ -36,7 +35,7 @@ internal abstract class LookForAbandonedLogic
|
||||
}
|
||||
}
|
||||
|
||||
internal static void LookForAbandoned(Property.Models.Configuration propertyConfiguration, string bResultsFullGroupDirectory, List<int> distinctFilteredIds)
|
||||
internal static void LookForAbandoned(Property.Models.Configuration propertyConfiguration, string bResultsFullGroupDirectory, List<string> distinctFilteredFileNameFirstSegments)
|
||||
{
|
||||
string[] directories = Directory.GetDirectories(bResultsFullGroupDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string directory in directories)
|
||||
@ -44,7 +43,7 @@ internal abstract class LookForAbandonedLogic
|
||||
string? directoryName = Path.GetFileName(directory);
|
||||
if (string.IsNullOrEmpty(directoryName) || (directoryName.Length != 2 && directoryName.Length != 4))
|
||||
continue;
|
||||
LookForAbandoned(propertyConfiguration, distinctFilteredIds, directory, directoryName);
|
||||
LookForAbandoned(propertyConfiguration, distinctFilteredFileNameFirstSegments, directory, directoryName);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -106,8 +106,9 @@ internal abstract class MapLogic
|
||||
internal static string GetMappingSegmentB(long ticks, long personKey, int? approximateYears, MappingFromItem mappingFromItem)
|
||||
{
|
||||
string result;
|
||||
DateTime dateTime = mappingFromItem.GetDateTimeOriginalThenMinimumDateTime();
|
||||
PersonBirthday personBirthday = IPersonBirthday.GetPersonBirthday(personKey);
|
||||
result = GetMappingSegmentB(ticks, personBirthday, approximateYears, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), mappingFromItem.IsWrongYear);
|
||||
result = GetMappingSegmentB(ticks, personBirthday, approximateYears, dateTime, mappingFromItem.IsWrongYear);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -178,7 +179,9 @@ internal abstract class MapLogic
|
||||
|
||||
internal static string GetMappingSegmentB(long ticks, PersonBirthday personBirthday, int? approximateYears, MappingFromItem mappingFromItem)
|
||||
{
|
||||
string result = GetMappingSegmentB(ticks, personBirthday, approximateYears, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), mappingFromItem.IsWrongYear);
|
||||
string result;
|
||||
DateTime dateTime = mappingFromItem.GetDateTimeOriginalThenMinimumDateTime();
|
||||
result = GetMappingSegmentB(ticks, personBirthday, approximateYears, dateTime, mappingFromItem.IsWrongYear);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -322,7 +325,7 @@ internal abstract class MapLogic
|
||||
continue;
|
||||
}
|
||||
if (!personKeyFormattedToPersonContainer.TryGetValue(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, out personContainer))
|
||||
throw new Exception();
|
||||
continue;
|
||||
if (!results.TryGetValue(personKeyFormattedIdThenWholePercentages.Id, out idTo))
|
||||
{
|
||||
results.Add(personKeyFormattedIdThenWholePercentages.Id, []);
|
||||
@ -435,7 +438,7 @@ internal abstract class MapLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
private static List<MappedFile> GetMappedFiles(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, List<Record> records)
|
||||
internal static List<MappedFile> GetMappedFiles(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, List<Record> records)
|
||||
{
|
||||
List<MappedFile> results = [];
|
||||
long personKey;
|
||||
@ -464,7 +467,7 @@ internal abstract class MapLogic
|
||||
results.RemoveAt(i);
|
||||
continue;
|
||||
}
|
||||
if (!filePath.Name.EndsWith(".dup") && !filePath.Name.EndsWith(".unk") && !filePath.Name.EndsWith(".abd"))
|
||||
if (!filePath.Name.EndsWith(".abd") && !filePath.Name.EndsWith(".brt") && !filePath.Name.EndsWith(".dup") && !filePath.Name.EndsWith(".unk"))
|
||||
continue;
|
||||
if (!File.Exists(filePath.FullName))
|
||||
continue;
|
||||
@ -537,10 +540,13 @@ internal abstract class MapLogic
|
||||
exifDirectory,
|
||||
mappedFile.DirectoryNumber,
|
||||
personDisplayDirectoryName,
|
||||
null,
|
||||
null,
|
||||
mappedFile.FilePath,
|
||||
fromDistanceContent,
|
||||
id.Value,
|
||||
null,
|
||||
null,
|
||||
mappedFile.PersonKey,
|
||||
rectangle,
|
||||
wholePercentages.Value));
|
||||
@ -558,6 +564,8 @@ internal abstract class MapLogic
|
||||
Dictionary<string, (FilePath, int)> distinct = [];
|
||||
foreach (LocationContainer locationContainer in locationContainers)
|
||||
{
|
||||
if (locationContainer.PersonKey is null)
|
||||
continue;
|
||||
key = string.Concat(locationContainer.PersonKey, locationContainer.Id);
|
||||
if (distinct.TryGetValue(key, out item))
|
||||
{
|
||||
@ -573,7 +581,7 @@ internal abstract class MapLogic
|
||||
}
|
||||
delete.Add(item.FilePath);
|
||||
delete.Add(locationContainer.FilePath);
|
||||
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.FilePath, percent));
|
||||
duplicates.Add(new(locationContainer.PersonKey.Value, locationContainer.Id, locationContainer.FilePath, percent));
|
||||
continue;
|
||||
}
|
||||
distinct.Add(key, new(locationContainer.FilePath, locationContainer.WholePercentages));
|
||||
@ -727,7 +735,7 @@ internal abstract class MapLogic
|
||||
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();
|
||||
continue;
|
||||
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);
|
||||
@ -987,6 +995,22 @@ internal abstract class MapLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
internal static string GetFacePartsDirectoryX(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string d2FacePartsContentDirectory, FilePath filePath)
|
||||
{
|
||||
string result;
|
||||
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
|
||||
result = Path.Combine(d2FacePartsContentDirectory, directoryName, filePath.NameWithoutExtension);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal static string GetResizeContentDirectory(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string cContentDirectory, FilePath filePath)
|
||||
{
|
||||
string result;
|
||||
(string directoryName, _) = IPath.GetDirectoryNameAndIndex(propertyConfiguration, filePath);
|
||||
result = Path.Combine(cContentDirectory, directoryName);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal static SaveContainer GetDebugSaveContainer(SortingContainer sortingContainer, string directory, Mapping keyMapping)
|
||||
{
|
||||
SaveContainer result;
|
||||
@ -1095,11 +1119,11 @@ internal abstract class MapLogic
|
||||
return new(results);
|
||||
}
|
||||
|
||||
internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> GetIdToWholePercentagesToFace(ReadOnlyCollection<Mapping> mappingCollection)
|
||||
internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> GetIdToWholePercentagesToFace(ReadOnlyCollection<Mapping> distinctValidImageMappingCollection)
|
||||
{
|
||||
Dictionary<int, Dictionary<int, Mapping>> results = [];
|
||||
Dictionary<int, Mapping>? keyValuePairs;
|
||||
foreach (Mapping mapping in mappingCollection)
|
||||
foreach (Mapping mapping in distinctValidImageMappingCollection)
|
||||
{
|
||||
if (mapping.MappingFromLocation is null)
|
||||
continue;
|
||||
@ -1168,29 +1192,29 @@ internal abstract class MapLogic
|
||||
return results;
|
||||
}
|
||||
|
||||
internal static (string, bool, bool) Get(int? useFiltersCounter, bool saveIndividually, bool sortingContainersAny, string forceSingleImageHumanized, int? distancePermyriad, Mapping mapping)
|
||||
internal static (string, bool, bool) Get(int? useFiltersCounter, bool saveIndividually, bool sortingContainersAny, string forceSingleImageHumanized, int? distancePermyriad, int? by, string? displayDirectoryName)
|
||||
{
|
||||
string by;
|
||||
string byValue;
|
||||
bool isByMapping;
|
||||
bool isBySorting;
|
||||
if (mapping.By is null)
|
||||
if (by is null)
|
||||
{
|
||||
isByMapping = false;
|
||||
isBySorting = !sortingContainersAny;
|
||||
by = $"{nameof(Shared.Models.Stateless.IMapLogic.Mapping)}Null";
|
||||
byValue = $"{nameof(Shared.Models.Stateless.IMapLogic.Mapping)}Null";
|
||||
}
|
||||
else
|
||||
{
|
||||
isByMapping = mapping.By == Shared.Models.Stateless.IMapLogic.Mapping;
|
||||
isBySorting = mapping.By == Shared.Models.Stateless.IMapLogic.Sorting;
|
||||
bool isDefaultName = mapping.MappingFromPerson is not null && IPerson.IsDefaultName(mapping.MappingFromPerson.DisplayDirectoryName);
|
||||
if (isBySorting && mapping.MappingFromPerson is null)
|
||||
by = saveIndividually ? nameof(Shared.Models.Stateless.IMapLogic.Individually) : $"{nameof(Shared.Models.Stateless.IMapLogic.Sorting)} Without Person{(distancePermyriad < 2000 ? "-A" : "-Z")}";
|
||||
isByMapping = by == Shared.Models.Stateless.IMapLogic.Mapping;
|
||||
isBySorting = by == Shared.Models.Stateless.IMapLogic.Sorting;
|
||||
bool isDefaultName = displayDirectoryName is not null && IPerson.IsDefaultName(displayDirectoryName);
|
||||
if (isBySorting && displayDirectoryName is null)
|
||||
byValue = saveIndividually ? nameof(Shared.Models.Stateless.IMapLogic.Individually) : $"{nameof(Shared.Models.Stateless.IMapLogic.Sorting)} Without Person{(distancePermyriad < 2000 ? "-A" : "-Z")}";
|
||||
else if (isBySorting && useFiltersCounter.HasValue)
|
||||
by = $"{nameof(Shared.Models.Stateless.IMapLogic.Sorting)}{(!isDefaultName ? "-A" : "-Z")} Modified Filters - {useFiltersCounter.Value}";
|
||||
byValue = $"{nameof(Shared.Models.Stateless.IMapLogic.Sorting)}{(!isDefaultName ? "-A" : "-Z")} Modified Filters - {useFiltersCounter.Value}";
|
||||
else
|
||||
{
|
||||
by = $"{mapping.By.Value switch
|
||||
byValue = $"{by.Value switch
|
||||
{
|
||||
Shared.Models.Stateless.IMapLogic.Mapping => nameof(Shared.Models.Stateless.IMapLogic.Mapping),
|
||||
Shared.Models.Stateless.IMapLogic.Sorting => saveIndividually ? nameof(Shared.Models.Stateless.IMapLogic.Individually) : nameof(Shared.Models.Stateless.IMapLogic.Sorting),
|
||||
@ -1199,9 +1223,15 @@ internal abstract class MapLogic
|
||||
}}{(!isDefaultName ? "-A" : "-Z")}";
|
||||
}
|
||||
}
|
||||
return new(by, isByMapping, isBySorting);
|
||||
return new(byValue, isByMapping, isBySorting);
|
||||
}
|
||||
|
||||
internal static (string, bool, bool) Get(int? useFiltersCounter, bool saveIndividually, bool sortingContainersAny, string forceSingleImageHumanized, int? distancePermyriad, long? personKey, string? displayDirectoryName) =>
|
||||
Get(useFiltersCounter, saveIndividually, sortingContainersAny, forceSingleImageHumanized, distancePermyriad, personKey is null ? null : Shared.Models.Stateless.IMapLogic.Mapping, displayDirectoryName);
|
||||
|
||||
internal static (string, bool, bool) Get(int? useFiltersCounter, bool saveIndividually, bool sortingContainersAny, string forceSingleImageHumanized, int? distancePermyriad, Mapping mapping) =>
|
||||
Get(useFiltersCounter, saveIndividually, sortingContainersAny, forceSingleImageHumanized, distancePermyriad, mapping.By, mapping.MappingFromPerson?.DisplayDirectoryName);
|
||||
|
||||
internal static void CheckCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, string? rootDirectoryParent)
|
||||
{
|
||||
string json;
|
||||
@ -1269,7 +1299,7 @@ internal abstract class MapLogic
|
||||
return new(results);
|
||||
}
|
||||
|
||||
internal static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation)
|
||||
internal static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, int wholePercentages)
|
||||
{
|
||||
bool? result;
|
||||
ReadOnlyCollection<PersonContainer>? personContainers;
|
||||
@ -1277,7 +1307,7 @@ internal abstract class MapLogic
|
||||
result = null;
|
||||
else
|
||||
{
|
||||
if (!wholePercentagesToPersonContainers.TryGetValue(mappingFromLocation.WholePercentages, out personContainers))
|
||||
if (!wholePercentagesToPersonContainers.TryGetValue(wholePercentages, out personContainers))
|
||||
result = null;
|
||||
else
|
||||
{
|
||||
|
@ -1,4 +1,6 @@
|
||||
using System.Collections.ObjectModel;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Stateless.Methods;
|
||||
|
||||
namespace View_by_Distance.Map.Models.Stateless.Methods;
|
||||
|
||||
@ -10,44 +12,64 @@ public interface IMapLogic
|
||||
static ReadOnlyDictionary<int, List<long>> GetIdToPersonKeys(ReadOnlyDictionary<long, List<int>> personKeyToIds) =>
|
||||
MapLogic.GetIdToPersonKeys(personKeyToIds);
|
||||
|
||||
ReadOnlyCollection<Shared.Models.Face> TestStatic_GetFaces(ReadOnlyCollection<Shared.Models.Item> items) =>
|
||||
ReadOnlyCollection<Face> TestStatic_GetFaces(ReadOnlyCollection<Item> items) =>
|
||||
GetFaces(items);
|
||||
static ReadOnlyCollection<Shared.Models.Face> GetFaces(ReadOnlyCollection<Shared.Models.Item> items) =>
|
||||
static ReadOnlyCollection<Face> GetFaces(ReadOnlyCollection<Item> items) =>
|
||||
MapLogic.GetFaces(items);
|
||||
|
||||
Shared.Models.Mapping[] TestStatic_GetSelectedMappingCollection(ReadOnlyCollection<Shared.Models.Item> items) =>
|
||||
Mapping[] TestStatic_GetSelectedMappingCollection(ReadOnlyCollection<Item> items) =>
|
||||
GetSelectedMappingCollection(items);
|
||||
static Shared.Models.Mapping[] GetSelectedMappingCollection(ReadOnlyCollection<Shared.Models.Item> items) =>
|
||||
static Mapping[] GetSelectedMappingCollection(ReadOnlyCollection<Item> items) =>
|
||||
MapLogic.GetSelectedMappingCollection(items);
|
||||
|
||||
Shared.Models.Mapping[] TestStatic_GetSelectedMappingCollection(ReadOnlyCollection<Shared.Models.Face> faces) =>
|
||||
Mapping[] TestStatic_GetSelectedMappingCollection(ReadOnlyCollection<Face> faces) =>
|
||||
GetSelectedMappingCollection(faces);
|
||||
static Shared.Models.Mapping[] GetSelectedMappingCollection(ReadOnlyCollection<Shared.Models.Face> faces) =>
|
||||
static Mapping[] GetSelectedMappingCollection(ReadOnlyCollection<Face> faces) =>
|
||||
MapLogic.GetSelectedMappingCollection(faces);
|
||||
|
||||
ReadOnlyDictionary<int, ReadOnlyDictionary<int, Shared.Models.Mapping>> TestStatic_GetIdToWholePercentagesToFace(ReadOnlyCollection<Shared.Models.Mapping> mappingCollection) =>
|
||||
GetIdToWholePercentagesToFace(mappingCollection);
|
||||
static ReadOnlyDictionary<int, ReadOnlyDictionary<int, Shared.Models.Mapping>> GetIdToWholePercentagesToFace(ReadOnlyCollection<Shared.Models.Mapping> mappingCollection) =>
|
||||
MapLogic.GetIdToWholePercentagesToFace(mappingCollection);
|
||||
ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> TestStatic_GetIdToWholePercentagesToFace(ReadOnlyCollection<Mapping> distinctValidImageMappingCollection) =>
|
||||
GetIdToWholePercentagesToFace(distinctValidImageMappingCollection);
|
||||
static ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> GetIdToWholePercentagesToFace(ReadOnlyCollection<Mapping> distinctValidImageMappingCollection) =>
|
||||
MapLogic.GetIdToWholePercentagesToFace(distinctValidImageMappingCollection);
|
||||
|
||||
List<(string, long)> TestStatic_GetJLinkDirectories(string genealogicalDataCommunicationFile, string[] jLinks, string personBirthdayFormat, char[] personCharacters, string a2PeopleSingletonDirectory, string a2PeopleContentDirectory) =>
|
||||
GetJLinkDirectories(genealogicalDataCommunicationFile, jLinks, personBirthdayFormat, personCharacters, a2PeopleSingletonDirectory, a2PeopleContentDirectory);
|
||||
static List<(string, long)> GetJLinkDirectories(string genealogicalDataCommunicationFile, string[] jLinks, string personBirthdayFormat, char[] personCharacters, string a2PeopleSingletonDirectory, string a2PeopleContentDirectory) =>
|
||||
MapLogic.GetJLinkDirectories(genealogicalDataCommunicationFile, jLinks, personBirthdayFormat, personCharacters, a2PeopleSingletonDirectory, a2PeopleContentDirectory);
|
||||
|
||||
void TestStatic_SetCreationTimeMaybeMoveToDecade(Property.Models.Configuration propertyConfiguration, bool moveToDecade, Shared.Models.MappingFromItem mappingFromItem, ReadOnlyCollection<Shared.Models.LocationContainer> locationContainers) =>
|
||||
SetCreationTimeMaybeMoveToDecade(propertyConfiguration, moveToDecade, mappingFromItem, locationContainers);
|
||||
static void SetCreationTimeMaybeMoveToDecade(Property.Models.Configuration propertyConfiguration, bool moveToDecade, Shared.Models.MappingFromItem mappingFromItem, ReadOnlyCollection<Shared.Models.LocationContainer> locationContainers) =>
|
||||
DecadeLogic.SetCreationTimeMaybeMoveToDecade(propertyConfiguration, moveToDecade, mappingFromItem, locationContainers);
|
||||
void TestStatic_SetCreationTime(MappingFromItem mappingFromItem, ReadOnlyCollection<LocationContainer> locationContainers) =>
|
||||
SetCreationTime(mappingFromItem, locationContainers);
|
||||
static void SetCreationTime(MappingFromItem mappingFromItem, ReadOnlyCollection<LocationContainer> locationContainers) =>
|
||||
DecadeLogic.SetCreationTime(mappingFromItem, locationContainers);
|
||||
|
||||
bool? TestStatic_CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<Shared.Models.PersonContainer>>? wholePercentagesToPersonContainers, Shared.Models.MappingFromLocation mappingFromLocation) =>
|
||||
void TestStatic_MoveToDecade(Property.Models.Configuration propertyConfiguration, MappingFromItem mappingFromItem, ReadOnlyCollection<LocationContainer> locationContainers) =>
|
||||
MoveToDecade(propertyConfiguration, mappingFromItem, locationContainers);
|
||||
static void MoveToDecade(Property.Models.Configuration propertyConfiguration, MappingFromItem mappingFromItem, ReadOnlyCollection<LocationContainer> locationContainers) =>
|
||||
DecadeLogic.MoveToDecade(propertyConfiguration, mappingFromItem, locationContainers);
|
||||
|
||||
bool? TestStatic_CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation) =>
|
||||
CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
|
||||
static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<Shared.Models.PersonContainer>>? wholePercentagesToPersonContainers, Shared.Models.MappingFromLocation mappingFromLocation) =>
|
||||
MapLogic.CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
|
||||
static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation) =>
|
||||
MapLogic.CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation.WholePercentages);
|
||||
|
||||
string TestStatic_GetDecade(Shared.Models.MappingFromItem mappingFromItem) =>
|
||||
bool? TestStatic_CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, int wholePercentages) =>
|
||||
CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, wholePercentages);
|
||||
static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, int wholePercentages) =>
|
||||
MapLogic.CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, wholePercentages);
|
||||
|
||||
string TestStatic_GetDecade(MappingFromItem mappingFromItem) =>
|
||||
GetDecade(mappingFromItem);
|
||||
static string GetDecade(Shared.Models.MappingFromItem mappingFromItem) =>
|
||||
static string GetDecade(MappingFromItem mappingFromItem) =>
|
||||
DecadeLogic.GetDecade(mappingFromItem, null);
|
||||
|
||||
ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> TestStatic_GetMappedFiles(int maxDegreeOfParallelism, Property.Models.Configuration propertyConfiguration, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string a2PeopleSingletonDirectory, string eDistanceContentDirectory) =>
|
||||
GetMapped(maxDegreeOfParallelism, propertyConfiguration, configuration, ticks, personContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory);
|
||||
static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> GetMapped(int maxDegreeOfParallelism, Property.Models.Configuration propertyConfiguration, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string a2PeopleSingletonDirectory, string eDistanceContentDirectory) =>
|
||||
FaceFileLogic.GetMapped(maxDegreeOfParallelism, propertyConfiguration, configuration, ticks, personContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory);
|
||||
|
||||
List<LocationContainer> TestStatic_GetAvailable(int maxDegreeOfParallelism, Configuration configuration, IFaceD dFace, long ticks, ReadOnlyCollection<FilePath> filePaths) =>
|
||||
GetAvailable(maxDegreeOfParallelism, configuration, dFace, ticks, filePaths);
|
||||
static List<LocationContainer> GetAvailable(int maxDegreeOfParallelism, Configuration configuration, IFaceD dFace, long ticks, ReadOnlyCollection<FilePath> filePaths) =>
|
||||
FaceFileLogic.GetAvailable(maxDegreeOfParallelism, configuration, dFace, ticks, filePaths);
|
||||
|
||||
}
|
@ -17,14 +17,16 @@ internal abstract class RelationLogic
|
||||
Dictionary<long, Dictionary<int, List<LocationContainer>>> personKeyTo = [];
|
||||
foreach (LocationContainer locationContainer in locationContainers)
|
||||
{
|
||||
if (locationContainer.PersonKey is null)
|
||||
continue;
|
||||
if (!locationContainer.FromDistanceContent)
|
||||
continue;
|
||||
if (!locationContainer.FilePath.FullName.Contains(configuration.LocationContainerDirectoryPattern))
|
||||
continue;
|
||||
if (!personKeyTo.TryGetValue(locationContainer.PersonKey, out yearTo))
|
||||
if (!personKeyTo.TryGetValue(locationContainer.PersonKey.Value, out yearTo))
|
||||
{
|
||||
personKeyTo.Add(locationContainer.PersonKey, []);
|
||||
if (!personKeyTo.TryGetValue(locationContainer.PersonKey, out yearTo))
|
||||
personKeyTo.Add(locationContainer.PersonKey.Value, []);
|
||||
if (!personKeyTo.TryGetValue(locationContainer.PersonKey.Value, out yearTo))
|
||||
throw new Exception();
|
||||
}
|
||||
if (!yearTo.TryGetValue(locationContainer.CreationDateOnly.Year, out collection))
|
||||
@ -45,6 +47,7 @@ internal abstract class RelationLogic
|
||||
int lastIndex;
|
||||
List<int> years = [];
|
||||
List<int> indices = [];
|
||||
LocationContainer locationContainer;
|
||||
List<(int Index, int Year)> sort = [];
|
||||
List<LocationContainer> collection = [];
|
||||
KeyValuePair<int, List<LocationContainer>> keyValue;
|
||||
@ -76,7 +79,10 @@ internal abstract class RelationLogic
|
||||
key = $"{years.Min()}-{keyValue.Key}";
|
||||
if (collection.Count == 0)
|
||||
continue;
|
||||
results.Add(new(key, collection[0].PersonKey, new(collection)));
|
||||
locationContainer = collection[0];
|
||||
if (locationContainer.PersonKey is null)
|
||||
continue;
|
||||
results.Add(new(key, locationContainer.PersonKey.Value, new(collection)));
|
||||
collection = [];
|
||||
years.Clear();
|
||||
}
|
||||
@ -254,7 +260,7 @@ internal abstract class RelationLogic
|
||||
_ = Directory.CreateDirectory(vsCodeDirectory);
|
||||
if (displayDirectoryName is not null)
|
||||
File.WriteAllText(Path.Combine(directory, $"_ {displayDirectoryName}.txt"), string.Empty);
|
||||
json = "{ \"[markdown]\": { \"editor.wordWrap\": \"off\" }, \"foam.links.hover.enable\": false, \"foam.graph.style\": { \"background\": \"#202020\", \"node\": { \"note\": \"#f2cb1d\", \"distance\": \"green\", \"image\": \"orange\", \"placeholder\": \"white\", } } }";
|
||||
json = /*lang=json*/ """{ "[markdown]": { "editor.wordWrap": "off" }, "foam.links.hover.enable": false, "foam.graph.style": { "background": "#202020", "node": { "note": "#f2cb1d", "distance": "green", "image": "orange", "placeholder": "white", } } }""";
|
||||
_ = IPath.WriteAllText(Path.Combine(vsCodeDirectory, "settings.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
||||
json = string.Concat("{ \"version\": \"2.0.0\", \"tasks\": [ { \"label\": \"MKLink\", \"type\": \"shell\", \"command\": \"New-Item\", \"args\": [ \"-ItemType\", \"Junction\", \"-Path\", \"'", directory.Replace('\\', '/'), "/()'\", \"-Target\", \"'", eDistanceContentDirectory.Replace('\\', '/'), "'\" ], \"problemMatcher\": [] } ] }");
|
||||
_ = IPath.WriteAllText(Path.Combine(vsCodeDirectory, "tasks.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
||||
@ -422,7 +428,7 @@ internal abstract class RelationLogic
|
||||
if (!Directory.Exists(directory))
|
||||
_ = Directory.CreateDirectory(directory);
|
||||
WriteVsCodeFiles(eDistanceContentDirectory, displayDirectoryName, directory);
|
||||
relationContainers = distance.GetRelationContainers(configuration.FaceDistancePermyriad, configuration.LocationContainerDistanceTake, configuration.LocationContainerDistanceTolerance.Value, group.RelationContainersCollection);
|
||||
relationContainers = distance.GetRelationContainers(configuration.DistanceLimits, configuration.FaceDistancePermyriad, configuration.LocationContainerDistanceTake, configuration.LocationContainerDistanceTolerance.Value, group.RelationContainersCollection);
|
||||
movedFiles = GetMoveFiles(configuration, group.Key, take, isCounterPersonYear, displayDirectoryName, relationContainers);
|
||||
WriteFile(take, group.PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, directory, ticks, uri, relationContainers, movedFiles);
|
||||
}
|
||||
|
Reference in New Issue
Block a user