Save Shortcuts Rev B

This commit is contained in:
2022-10-09 12:02:38 -07:00
parent d951ad6696
commit b0b4c20597
20 changed files with 302 additions and 180 deletions

View File

@ -25,12 +25,14 @@ public class MapLogic
private readonly int _MaxDegreeOfParallelism;
private readonly Configuration? _Configuration;
private readonly string _EDistanceContentTicksDirectory;
private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration;
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, long ticks, PersonContainer[] personContainers, string a2PeopleSingletonDirectory, string eDistanceContentDirectory, Mapping[] mappingCollection, Shared.Models.Methods.IMapLogicSupport? faceDistance)
{
_Ticks = ticks;
_Configuration = configuration;
_Log = Serilog.Log.ForContext<MapLogic>();
_PropertyConfiguration = propertyConfiguration;
_MaxDegreeOfParallelism = maxDegreeOfParallelism;
if (_Log is null)
{ }
@ -704,47 +706,82 @@ public class MapLogic
SaveContainers(totalNotMapped, updated, saveContainers);
}
private (string, PersonBirthday?) GetPersonBirthday(string windowsShortcutPath)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
PersonBirthday? personBirthday = null;
string personKeyFormatted = string.Empty;
string[] directoryNames = IPath.GetDirectoryNames(windowsShortcutPath);
foreach (string directoryName in directoryNames)
{
personBirthday = IPersonBirthday.GetPersonBirthday(_Configuration.PersonBirthdayFormat, directoryName);
if (personBirthday is not null)
{
personKeyFormatted = directoryName;
break;
}
}
return new(personKeyFormatted, personBirthday);
}
private List<(string, PersonContainer)> GetPersonContainers(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
List<(string, PersonContainer)> results = new();
string[] files;
long personKey;
const int zero = 0;
string[] directories;
string checkDirectory;
string[] checkDirectories;
string personKeyFormatted;
string displayDirectoryName;
PersonContainer[] collection;
PersonContainer[] matches;
PersonBirthday? personBirthday;
string fileNameWithoutExtension;
WindowsShortcut windowsShortcut;
List<(long, string)> collection = new();
foreach (string directoryName in jLinks)
{
checkDirectory = Path.Combine(a2PeopleSingletonDirectory, directoryName);
if (!Directory.Exists(checkDirectory))
continue;
checkDirectories = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly);
files = Directory.GetFiles(checkDirectory, "*.lnk", SearchOption.TopDirectoryOnly);
foreach (string file in files)
{
collection.Clear();
windowsShortcut = WindowsShortcut.Load(file);
if (windowsShortcut.Path is null || !Directory.Exists(windowsShortcut.Path))
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
if (windowsShortcut.Path is null)
continue;
directories = Directory.GetDirectories(windowsShortcut.Path, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
if (!Directory.Exists(windowsShortcut.Path) && files.Length != checkDirectories.Length)
throw new NotSupportedException(fileNameWithoutExtension);
(personKeyFormatted, personBirthday) = GetPersonBirthday(windowsShortcut.Path);
if (personBirthday is not null)
collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension)));
else
{
personKeyFormatted = Path.GetFileName(directory);
personBirthday = IPersonBirthday.GetPersonBirthday(_Configuration.PersonBirthdayFormat, personKeyFormatted);
if (personBirthday is null)
continue;
personKey = personBirthday.Value.Ticks;
collection = (from l in personContainers where l.Key == personKey && l.ApproximateYears.HasValue select l).ToArray();
if (!collection.Any())
continue;
displayDirectoryName = Path.Combine(checkDirectory, personKeyFormatted, Path.GetFileNameWithoutExtension(file));
directories = Directory.GetDirectories(windowsShortcut.Path, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
personKeyFormatted = Path.GetFileName(directory);
personBirthday = IPersonBirthday.GetPersonBirthday(_Configuration.PersonBirthdayFormat, personKeyFormatted);
if (personBirthday is null)
continue;
collection.Add(new(personBirthday.Value.Ticks, Path.Combine(checkDirectory, personKeyFormatted, fileNameWithoutExtension)));
}
}
if (!collection.Any())
throw new NotSupportedException(fileNameWithoutExtension);
foreach ((long personKey, string displayDirectoryName) in collection)
{
matches = (from l in personContainers where l.Key == personKey && l.ApproximateYears.HasValue select l).ToArray();
if (!matches.Any())
throw new NotSupportedException(fileNameWithoutExtension);
if (!Directory.Exists(displayDirectoryName))
_ = Directory.CreateDirectory(displayDirectoryName);
results.Add(new(personKeyFormatted, collection[zero]));
results.Add(new(personKeyFormatted, matches[zero]));
}
}
}
@ -759,7 +796,7 @@ public class MapLogic
return results;
}
private (int, FileHolder, int, string, string, string, string)[] GetCollection(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, Mapping[] mappingCollection)
private (int, FileHolder, int, string, string, string, string)[] GetCollectionForSaveResizedImagesByPersonKeyFormatted(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, Mapping[] mappingCollection)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
@ -805,7 +842,7 @@ public class MapLogic
SaveContainer? saveContainer;
List<int> distinctCollection = new();
List<SaveContainer> saveContainers = new();
(int, FileHolder, int, string, string, string, string)[] collection = GetCollection(jLinks, a2PeopleSingletonDirectory, personContainers, mappingCollection);
(int, FileHolder, int, string, string, string, string)[] collection = GetCollectionForSaveResizedImagesByPersonKeyFormatted(jLinks, a2PeopleSingletonDirectory, personContainers, mappingCollection);
foreach ((int id, FileHolder resizedFileHolder, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection)
{
if (distinctCollection.Contains(id))
@ -819,4 +856,89 @@ public class MapLogic
SaveContainers(totalNotMapped, null, saveContainers);
}
private List<(string, string, string)> GetCollectionForSaveShortcuts(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, List<Item> filteredItems, Mapping[] mappingCollection)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
string fileName;
string directory;
string? directoryName;
string personDirectory;
string personKeyFormatted;
List<(string, string Directory, string)> collection = new();
string[] personKeyFormattedCollection = GetPersonKeyFormattedCollection(jLinks, a2PeopleSingletonDirectory, personContainers);
foreach (Item item in filteredItems)
{
directoryName = Path.GetDirectoryName(item.RelativePath);
if (directoryName is null)
throw new NotSupportedException();
if (item.ResizedFileHolder?.DirectoryName is null || !item.ResizedFileHolder.Exists)
continue;
directory = Path.Combine(item.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", _PropertyConfiguration.ResultAllInOne);
personDirectory = Path.Combine(directory, "No Faces");
fileName = Path.Combine(personDirectory, $"{item.ResizedFileHolder.Name}.lnk");
collection.Add(new(item.ResizedFileHolder.FullName, personDirectory, fileName));
}
foreach (Mapping mapping in mappingCollection)
{
directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath);
if (directoryName is null)
throw new NotSupportedException();
if (mapping.MappingFromItem.ResizedFileHolder.DirectoryName is null || !mapping.MappingFromItem.ResizedFileHolder.Exists)
continue;
if (mapping.By is null or IMapLogic.Sorting || mapping.MappingFromPerson?.ApproximateYears is null)
{
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, fileName));
}
else
{
if (string.IsNullOrEmpty(mapping.MappingFromPerson.SegmentB))
throw new NotSupportedException();
if (string.IsNullOrEmpty(mapping.MappingFromPerson.DisplayDirectoryName))
throw new NotSupportedException();
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday);
if (!personKeyFormattedCollection.Contains(personKeyFormatted))
continue;
directory = Path.Combine(mapping.MappingFromItem.ResizedFileHolder.DirectoryName, $"{_PropertyConfiguration.ResultAllInOne}Shortcuts", personKeyFormatted);
personDirectory = Path.Combine(directory, mapping.MappingFromPerson.DisplayDirectoryName);
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ResizedFileHolder.Name}.lnk");
collection.Add(new(mapping.MappingFromItem.ResizedFileHolder.FullName, personDirectory, fileName));
}
}
return collection;
}
public void SaveShortcuts(string a2PeopleSingletonDirectory, PersonContainer[] personContainers, List<Item> filteredItems, Mapping[] mappingCollection)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
WindowsShortcut windowsShortcut;
string[] jLinks = new string[] { "All" };
List<(string, string Directory, string)> collection = GetCollectionForSaveShortcuts(jLinks, a2PeopleSingletonDirectory, personContainers, filteredItems, mappingCollection);
string[] directories = (from l in collection select l.Directory).Distinct().ToArray();
foreach (string directory in directories)
{
if (string.IsNullOrEmpty(directory))
continue;
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
}
foreach ((string fullName, string directory, string fileName) in collection)
{
if (File.Exists(fileName))
continue;
try
{
windowsShortcut = new() { Path = fullName };
windowsShortcut.Save(fileName);
windowsShortcut.Dispose();
}
catch (Exception)
{ }
}
}
}