Individually with Explorer
This commit is contained in:
@ -28,7 +28,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
private readonly string _EDistanceContentTicksDirectory;
|
||||
private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration;
|
||||
|
||||
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, PersonContainer[] personContainers, long ticks, string a2PeopleSingletonDirectory, string eDistanceContentDirectory)
|
||||
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, bool saveIndividually, Configuration? configuration, PersonContainer[] personContainers, long ticks, string a2PeopleSingletonDirectory, string eDistanceContentDirectory)
|
||||
{
|
||||
_Ticks = ticks;
|
||||
_Configuration = configuration;
|
||||
@ -51,15 +51,16 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory);
|
||||
string eDistanceContentTicksDirectory = Path.Combine(eDistanceContentDirectory, $"({ticks})");
|
||||
Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers = new();
|
||||
for (int i = 1; i < 5; i++)
|
||||
if (!saveIndividually)
|
||||
{
|
||||
for (int i = 1; i < 5; i++)
|
||||
_ = IPath.DeleteEmptyDirectories(eDistanceContentDirectory);
|
||||
_ = IPath.DeleteEmptyDirectories(eDistanceContentDirectory);
|
||||
_ = IPath.DeleteEmptyDirectories(eDistanceContentDirectory);
|
||||
}
|
||||
if (string.IsNullOrEmpty(rootDirectoryParent))
|
||||
throw new NullReferenceException(nameof(rootDirectoryParent));
|
||||
if (!Directory.Exists(eDistanceContentDirectory))
|
||||
_ = Directory.CreateDirectory(eDistanceContentDirectory);
|
||||
if (!Directory.Exists(eDistanceContentTicksDirectory))
|
||||
_ = Directory.CreateDirectory(eDistanceContentTicksDirectory);
|
||||
if (configuration is not null)
|
||||
{
|
||||
List<PersonContainer> personContainerCollection = new(personContainers);
|
||||
@ -335,40 +336,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return result;
|
||||
}
|
||||
|
||||
private static (string, bool, bool) Get(int? useFiltersCounter, bool forIndividually, bool sortingContainersAny, string forceSingleImageHumanized, Mapping mapping)
|
||||
{
|
||||
string by;
|
||||
bool isByMapping;
|
||||
bool isBySorting;
|
||||
if (mapping.By is null)
|
||||
{
|
||||
isByMapping = false;
|
||||
isBySorting = !sortingContainersAny;
|
||||
by = $"{nameof(Shared.Models.Stateless.IMapLogic.Mapping)}Null";
|
||||
}
|
||||
else
|
||||
{
|
||||
isByMapping = mapping.By == Shared.Models.Stateless.IMapLogic.Mapping;
|
||||
isBySorting = mapping.By == Shared.Models.Stateless.IMapLogic.Sorting;
|
||||
if (isBySorting && mapping.MappingFromPerson is null)
|
||||
by = forIndividually ? nameof(Shared.Models.Stateless.IMapLogic.Individually) : $"{nameof(Shared.Models.Stateless.IMapLogic.Sorting)} Without Person";
|
||||
else if (isBySorting && useFiltersCounter.HasValue)
|
||||
by = $"{nameof(Shared.Models.Stateless.IMapLogic.Sorting)} Modified Filters - {useFiltersCounter.Value}";
|
||||
else
|
||||
{
|
||||
by = mapping.By.Value switch
|
||||
{
|
||||
Shared.Models.Stateless.IMapLogic.Mapping => nameof(Shared.Models.Stateless.IMapLogic.Mapping),
|
||||
Shared.Models.Stateless.IMapLogic.Sorting => forIndividually ? nameof(Shared.Models.Stateless.IMapLogic.Individually) : nameof(Shared.Models.Stateless.IMapLogic.Sorting),
|
||||
Shared.Models.Stateless.IMapLogic.ForceSingleImage => forceSingleImageHumanized,
|
||||
_ => throw new NotImplementedException()
|
||||
};
|
||||
}
|
||||
}
|
||||
return new(by, isByMapping, isBySorting);
|
||||
}
|
||||
|
||||
private string GetDirectory(string by, MappingFromItem mappingFromItem, SortingContainer sortingContainer)
|
||||
private string GetDirectory(bool saveIndividually, int padLeft, string? segmentC, string by, MappingFromItem mappingFromItem, SortingContainer sortingContainer)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
@ -387,19 +355,23 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
personBirthday = personContainer.Birthdays[zero];
|
||||
mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, mappingFromItem);
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday);
|
||||
result = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, mappingSegmentB);
|
||||
if (!saveIndividually || segmentC is null)
|
||||
result = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, mappingSegmentB);
|
||||
else
|
||||
result = Path.Combine(_EDistanceContentTicksDirectory, by, segmentC.PadLeft(padLeft, '0'), personKeyFormatted, mappingSegmentB);
|
||||
_NotMappedPersonContainers.RemoveAt(i);
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping, Dictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool forIndividually, bool sortingContainersAny)
|
||||
private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping, Dictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
List<SaveContainer> results = new();
|
||||
string by;
|
||||
long ticks;
|
||||
List<int>? ids;
|
||||
long personKey;
|
||||
bool isByMapping;
|
||||
@ -420,6 +392,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
FileHolder hiddenFaceFileHolder;
|
||||
string? facePartsContentCollectionFile;
|
||||
Dictionary<int, Mapping>? normalizedRectangleToMapping;
|
||||
int padLeft = _Configuration.FaceDistancePermyriad.ToString().Length;
|
||||
string forceSingleImageHumanized = nameof(Shared.Models.Stateless.IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title);
|
||||
foreach (Mapping mapping in mappingCollection)
|
||||
{
|
||||
@ -430,7 +403,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
throw new NotSupportedException();
|
||||
if (mapping.MappingFromFilter.InSkipCollection is not null && mapping.MappingFromFilter.InSkipCollection.Value)
|
||||
continue;
|
||||
(by, isByMapping, isBySorting) = Get(useFiltersCounter, forIndividually, sortingContainersAny, forceSingleImageHumanized, mapping);
|
||||
(by, isByMapping, isBySorting) = Stateless.MapLogic.Get(useFiltersCounter, saveIndividually, sortingContainersAny, forceSingleImageHumanized, mapping);
|
||||
if (isByMapping && !saveMapped)
|
||||
continue;
|
||||
if (mapping.MappingFromPerson is null)
|
||||
@ -449,10 +422,14 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
continue;
|
||||
if (distinct.Contains(mapping.SortingContainer.Sorting.Id))
|
||||
continue;
|
||||
directory = GetDirectory(by, mapping.MappingFromItem, mapping.SortingContainer);
|
||||
personDirectory = Path.Combine(directory, $"Z]{DateTime.Now.Ticks}");
|
||||
if (forIndividually)
|
||||
ticks = DateTime.Now.Ticks;
|
||||
directory = GetDirectory(saveIndividually, padLeft, mapping.SegmentC, by, mapping.MappingFromItem, mapping.SortingContainer);
|
||||
personDirectory = Path.Combine(directory, $"Z]{ticks}");
|
||||
if (saveIndividually)
|
||||
{
|
||||
directory = Path.Combine(directory, mapping.MappingFromItem.Id.ToString());
|
||||
results.Add(new(Path.Combine(directory, $"Z]{ticks}")));
|
||||
}
|
||||
distinct.Add(mapping.MappingFromItem.Id);
|
||||
distinct.Add(mapping.SortingContainer.Sorting.Id);
|
||||
}
|
||||
@ -464,8 +441,10 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
throw new NotSupportedException();
|
||||
personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks;
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday);
|
||||
if (forIndividually || string.IsNullOrEmpty(mapping.SegmentC))
|
||||
if (string.IsNullOrEmpty(mapping.SegmentC))
|
||||
directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, mapping.MappingFromPerson.SegmentB);
|
||||
else if (saveIndividually)
|
||||
directory = Path.Combine(_EDistanceContentTicksDirectory, by, mapping.SegmentC.PadLeft(padLeft, '0'), personKeyFormatted, mapping.MappingFromPerson.SegmentB);
|
||||
else
|
||||
directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, mapping.MappingFromPerson.SegmentB, mapping.SegmentC);
|
||||
if (isByMapping)
|
||||
@ -474,16 +453,15 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, "lnk");
|
||||
else
|
||||
personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName[..1], "lnk");
|
||||
if (forIndividually)
|
||||
directory = Path.Combine(directory, mapping.MappingFromItem.Id.ToString());
|
||||
if (isByMapping && personKeyToIds.TryGetValue(personKey, out ids))
|
||||
if (saveIndividually)
|
||||
{
|
||||
saveContainer = new(Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, $"{ids.Count} Face(s)"));
|
||||
results.Add(saveContainer);
|
||||
directory = Path.Combine(directory, mapping.MappingFromItem.Id.ToString());
|
||||
results.Add(new(Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName)));
|
||||
}
|
||||
if (isByMapping && personKeyToIds.TryGetValue(personKey, out ids))
|
||||
results.Add(new(Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName, $"{ids.Count} Face(s)")));
|
||||
}
|
||||
saveContainer = new(personDirectory);
|
||||
results.Add(saveContainer);
|
||||
results.Add(new(personDirectory));
|
||||
if (!isBySorting || mapping.SortingContainer is null)
|
||||
keyMapping = null;
|
||||
else
|
||||
@ -496,10 +474,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
if (keyMapping.MappingFromLocation is null)
|
||||
continue;
|
||||
if (keyMapping.MappingFromLocation.NormalizedRectangle == mapping.MappingFromLocation.NormalizedRectangle)
|
||||
{
|
||||
saveContainer = new(Path.Combine(directory, "Maybe"));
|
||||
results.Add(saveContainer);
|
||||
}
|
||||
results.Add(new(Path.Combine(directory, "Maybe")));
|
||||
}
|
||||
facesDirectory = Stateless.MapLogic.GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem);
|
||||
if (facesDirectory is null)
|
||||
@ -514,7 +489,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
}
|
||||
else
|
||||
{
|
||||
if (forIndividually)
|
||||
if (saveIndividually)
|
||||
{
|
||||
facePartsContentCollectionFile = Stateless.MapLogic.GetFacePartsContentCollectionFile(_Configuration.FacePartsFileNameExtension, d2FacePartsContentCollectionDirectory, mapping.MappingFromItem);
|
||||
if (facePartsContentCollectionFile is null)
|
||||
@ -537,13 +512,13 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
results.Add(saveContainer);
|
||||
if (!isBySorting || mapping.SortingContainer is null || keyMapping is null)
|
||||
continue;
|
||||
if (!forIndividually && isBySorting && mapping.MappingFromPerson is null)
|
||||
if (!saveIndividually && isBySorting && mapping.MappingFromPerson is null)
|
||||
{
|
||||
saveContainer = GetMatchSaveContainer(dFacesContentDirectory, d2FacePartsContentDirectory, directory, keyMapping);
|
||||
if (saveContainer is not null)
|
||||
results.Add(saveContainer);
|
||||
}
|
||||
if (!forIndividually)
|
||||
if (!saveIndividually)
|
||||
saveContainer = Stateless.MapLogic.GetDebugSaveContainer(directory, mapping.SortingContainer, keyMapping);
|
||||
else
|
||||
{
|
||||
@ -557,14 +532,14 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping, int? useFiltersCounter, bool forIndividually, bool sortingContainersAny)
|
||||
public List<SaveContainer> GetSaveContainers(bool saveIndividually, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping, int? useFiltersCounter, bool sortingContainersAny)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
List<SaveContainer> results;
|
||||
bool saveMapped = false;
|
||||
Dictionary<long, List<int>> personKeyToIds = new();
|
||||
results = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToNormalizedRectangleToMapping, personKeyToIds, useFiltersCounter, saveMapped, forIndividually, sortingContainersAny);
|
||||
results = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToNormalizedRectangleToMapping, personKeyToIds, useFiltersCounter, saveMapped, saveIndividually, sortingContainersAny);
|
||||
return results;
|
||||
}
|
||||
|
||||
@ -576,7 +551,7 @@ public 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, d2FacePartsContentCollectionDirectory, mappingCollection, idToNormalizedRectangleToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, forIndividually: false);
|
||||
List<SaveContainer> saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToNormalizedRectangleToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false);
|
||||
SaveContainers(totalNotMapped, updated, saveContainers);
|
||||
if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory))
|
||||
Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory);
|
||||
@ -643,7 +618,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return results;
|
||||
}
|
||||
|
||||
public int UpdateFromSortingContainers(Shared.Models.Methods.IDistanceLimits distanceLimits, SortingContainer[] sortingContainers)
|
||||
public int UpdateFromSortingContainers(bool saveIndividually, Shared.Models.Methods.IDistanceLimits distanceLimits, SortingContainer[] sortingContainers)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
@ -710,7 +685,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
if (!keyToSegmentC.ContainsKey(key))
|
||||
keyToSegmentC.Add(key, string.Empty);
|
||||
keyToCount[key]++;
|
||||
if (keyToCount[key] > _Configuration.SortingMaximumPerKey)
|
||||
if (saveIndividually || keyToCount[key] > _Configuration.SortingMaximumPerKey)
|
||||
{
|
||||
keyToCount[key] = 0;
|
||||
keyToSegmentC[key] = sortingContainer.Sorting.DistancePermyriad.ToString();
|
||||
@ -1037,64 +1012,13 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
||||
return results;
|
||||
}
|
||||
|
||||
private static bool TryToFind(string a2PeopleSingletonDirectory, string file, string path)
|
||||
{
|
||||
bool result = false;
|
||||
string? pathName = Path.GetFileName(path);
|
||||
string? group = Path.GetDirectoryName(path);
|
||||
string? groupName = Path.GetFileName(group);
|
||||
if (pathName is not null && group is not null && groupName is not null)
|
||||
{
|
||||
WindowsShortcut windowsShortcut;
|
||||
string checkDirectory = Path.Combine(a2PeopleSingletonDirectory, groupName, pathName);
|
||||
if (Directory.Exists(checkDirectory))
|
||||
{
|
||||
try
|
||||
{
|
||||
windowsShortcut = new() { Path = checkDirectory };
|
||||
windowsShortcut.Save(file);
|
||||
windowsShortcut.Dispose();
|
||||
result = true;
|
||||
}
|
||||
catch (Exception)
|
||||
{ }
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void BeforeSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory)
|
||||
{
|
||||
string[] files;
|
||||
string checkDirectory;
|
||||
WindowsShortcut windowsShortcut;
|
||||
foreach (string directoryName in jLinks)
|
||||
{
|
||||
checkDirectory = Path.Combine(a2PeopleContentDirectory, directoryName);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
continue;
|
||||
files = Directory.GetFiles(checkDirectory, "*.lnk", SearchOption.TopDirectoryOnly);
|
||||
foreach (string file in files)
|
||||
{
|
||||
windowsShortcut = WindowsShortcut.Load(file);
|
||||
if (windowsShortcut.Path is null)
|
||||
continue;
|
||||
if (!Directory.Exists(windowsShortcut.Path))
|
||||
{
|
||||
if (!TryToFind(a2PeopleContentDirectory, file, windowsShortcut.Path))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SaveFilteredOriginalImagesFromJLinks(string[] jLinks, PersonContainer[] personContainers, string a2PeopleContentDirectory, Dictionary<long, List<int>> personKeyToIds, Mapping[] mappingCollection, int totalNotMapped)
|
||||
{
|
||||
if (_Configuration is null)
|
||||
throw new NullReferenceException(nameof(_Configuration));
|
||||
SaveContainer? saveContainer;
|
||||
List<SaveContainer> saveContainers = new();
|
||||
BeforeSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory);
|
||||
Stateless.MapLogic.BeforeSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory);
|
||||
(int, FileHolder, int, string, string, string, string)[] collection = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, mappingCollection, personKeyToIds);
|
||||
foreach ((int id, FileHolder imageFileHolder, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection)
|
||||
{
|
||||
|
Reference in New Issue
Block a user