2023-01-25

This commit is contained in:
Mike Phares 2023-01-28 11:18:07 -07:00
parent 375447ce97
commit e31506cd37
7 changed files with 50 additions and 27 deletions

View File

@ -743,7 +743,7 @@ public partial class DlibDotNet
if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution))
{ {
List<Item> filteredItems = GetItems(argZero, containers); List<Item> filteredItems = GetItems(argZero, containers);
mapLogic.SaveShortcutsForOutputResolutions(personKeyToIds, filteredItems, mappingCollection); mapLogic.SaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, filteredItems, mappingCollection);
} }
if (_Configuration.PersonCharactersCopyCount > 0 && !string.IsNullOrEmpty(_Configuration.PersonCharacters)) if (_Configuration.PersonCharactersCopyCount > 0 && !string.IsNullOrEmpty(_Configuration.PersonCharacters))
mapLogic.CopyAtLeastOneMappedFiles(dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection); mapLogic.CopyAtLeastOneMappedFiles(dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection);
@ -1100,7 +1100,7 @@ public partial class DlibDotNet
if (_PropertyRootExistedBefore || container is not null) if (_PropertyRootExistedBefore || container is not null)
break; break;
if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution))
mapLogic.SaveShortcutsForOutputResolutions(a2PeopleContentDirectory, personKeyToIds, idToLocationContainers, mappingCollection, totalNotMapped); mapLogic.SaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, idToLocationContainers, mappingCollection, totalNotMapped);
if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution)) if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution))
mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, _PersonContainers, a2PeopleContentDirectory, personKeyToIds, mappingCollection, totalNotMapped); mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, _PersonContainers, a2PeopleContentDirectory, personKeyToIds, mappingCollection, totalNotMapped);
(cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); (cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution);

View File

@ -2,6 +2,7 @@ using Humanizer;
using ShellProgressBar; using ShellProgressBar;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Text.Json; using System.Text.Json;
using System.Text.RegularExpressions;
using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Stateless.Methods; using View_by_Distance.Shared.Models.Stateless.Methods;
using WindowsShortcutFactory; using WindowsShortcutFactory;
@ -1082,20 +1083,18 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
SaveContainers(totalNotMapped, null, saveContainers); SaveContainers(totalNotMapped, null, saveContainers);
} }
public void SaveShortcutsForOutputResolutions(string a2PeopleContentDirectory, Dictionary<long, List<int>> personKeyToIds, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Mapping[] mappingCollection, int totalNotMapped) private List<SaveShortcutsForOutputResolutions> GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Mapping[] mappingCollection)
{ {
List<SaveShortcutsForOutputResolutions> results = new();
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
string? model; string? model;
long personKey; long personKey;
string fileName; string fileName;
string directory; string directory;
string hiddenFile;
List<long>? personKeys; List<long>? personKeys;
string personKeyFormatted; string personKeyFormatted;
WindowsShortcut windowsShortcut;
IReadOnlyList<MetadataExtractor.Directory> directories; IReadOnlyList<MetadataExtractor.Directory> directories;
List<SaveShortcutsForOutputResolutions> collection = new();
List<LocationContainer<MetadataExtractor.Directory>>? locationContainers; List<LocationContainer<MetadataExtractor.Directory>>? locationContainers;
Dictionary<int, List<long>> idToPersonKeys = Stateless.Methods.IMapLogic.GetIdToPersonKeys(personKeyToIds); Dictionary<int, List<long>> idToPersonKeys = Stateless.Methods.IMapLogic.GetIdToPersonKeys(personKeyToIds);
foreach (Mapping mapping in mappingCollection) foreach (Mapping mapping in mappingCollection)
@ -1114,9 +1113,10 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories); model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories);
if (!string.IsNullOrEmpty(model) && !string.IsNullOrEmpty(model.Trim())) if (!string.IsNullOrEmpty(model) && !string.IsNullOrEmpty(model.Trim()))
{ {
directory = Path.Combine(a2PeopleContentDirectory, "Model Shortcuts", model, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); model = Regex.Replace(model, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_");
directory = Path.Combine(eDistanceContentDirectory, "Model Shortcuts", model, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName));
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk");
collection.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey));
} }
if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys)) if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys))
continue; continue;
@ -1124,20 +1124,29 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
if (!personKeys.Contains(mapping.MappingFromPerson.PersonBirthday.Value.Ticks)) if (!personKeys.Contains(mapping.MappingFromPerson.PersonBirthday.Value.Ticks))
continue; continue;
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday); personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday);
directory = Path.Combine(a2PeopleContentDirectory, "Person Key Shortcuts", personKeyFormatted, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); directory = Path.Combine(eDistanceContentDirectory, "Person Key Shortcuts", personKeyFormatted, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName));
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk");
collection.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey));
directory = Path.Combine(a2PeopleContentDirectory, "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName)); directory = Path.Combine(eDistanceContentDirectory, "Name Shortcuts", mapping.MappingFromPerson.DisplayDirectoryName, Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName));
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk"); fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk");
collection.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey)); results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey));
} }
string[] distinctDirectories = (from l in collection select l.Directory).Distinct().ToArray(); return results;
foreach (string d in distinctDirectories) }
public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Mapping[] mappingCollection, int totalNotMapped)
{ {
if (string.IsNullOrEmpty(d)) string hiddenFile;
WindowsShortcut windowsShortcut;
List<SaveShortcutsForOutputResolutions> collection = new();
collection = GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(eDistanceContentDirectory, personKeyToIds, idToLocationContainers, mappingCollection);
string[] distinctDirectories = (from l in collection select l.Directory).Distinct().ToArray();
foreach (string directory in distinctDirectories)
{
if (string.IsNullOrEmpty(directory))
continue; continue;
if (!Directory.Exists(d)) if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(d); _ = Directory.CreateDirectory(directory);
} }
foreach (SaveShortcutsForOutputResolutions s in collection) foreach (SaveShortcutsForOutputResolutions s in collection)
{ {
@ -1161,7 +1170,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
} }
} }
private (List<(string, DateTime[])>, List<SaveShortcutsForOutputResolutions>) GetCollectionForSaveShortcutsForOutputResolutions(Dictionary<long, List<int>> personKeyToIds, List<Item> filteredItems, Mapping[] mappingCollection) private (List<(string, DateTime[])>, List<SaveShortcutsForOutputResolutions>) GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(Dictionary<long, List<int>> personKeyToIds, List<Item> filteredItems, Mapping[] mappingCollection)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
@ -1242,14 +1251,14 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return new(directoriesAndDateTimes, collection); return new(directoriesAndDateTimes, collection);
} }
public void SaveShortcutsForOutputResolutions(Dictionary<long, List<int>> personKeyToIds, List<Item> filteredItems, Mapping[] mappingCollection) public void SaveShortcutsForOutputResolutionsDuringMapLogic(Dictionary<long, List<int>> personKeyToIds, List<Item> filteredItems, Mapping[] mappingCollection)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
WindowsShortcut windowsShortcut; WindowsShortcut windowsShortcut;
List<(string, DateTime[])> directoriesAndDateTimes; List<(string, DateTime[])> directoriesAndDateTimes;
List<SaveShortcutsForOutputResolutions> collection; List<SaveShortcutsForOutputResolutions> collection;
(directoriesAndDateTimes, collection) = GetCollectionForSaveShortcutsForOutputResolutions(personKeyToIds, filteredItems, mappingCollection); (directoriesAndDateTimes, collection) = GetCollectionForSaveShortcutsForOutputResolutionsDuringMapLogic(personKeyToIds, filteredItems, mappingCollection);
string[] directories = (from l in collection select l.Directory).Distinct().ToArray(); string[] directories = (from l in collection select l.Directory).Distinct().ToArray();
foreach (string directory in directories) foreach (string directory in directories)
{ {
@ -1258,15 +1267,16 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
if (!Directory.Exists(directory)) if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory); _ = Directory.CreateDirectory(directory);
} }
foreach (SaveShortcutsForOutputResolutions saveShortcutsForOutputResolutions in collection) foreach (SaveShortcutsForOutputResolutions s in collection)
{ {
if (File.Exists(saveShortcutsForOutputResolutions.FileName)) if (File.Exists(s.FileName))
continue; continue;
try try
{ {
windowsShortcut = new() { Path = saveShortcutsForOutputResolutions.FullName, Description = saveShortcutsForOutputResolutions.Description }; windowsShortcut = new() { Path = s.FullName, Description = s.Description };
windowsShortcut.Save(saveShortcutsForOutputResolutions.FileName); windowsShortcut.Save(s.FileName);
windowsShortcut.Dispose(); windowsShortcut.Dispose();
File.SetLastWriteTime(s.FileName, s.DateTime);
} }
catch (Exception) catch (Exception)
{ } { }

View File

@ -10,15 +10,22 @@ public class AppSettings
public string CopyTo { init; get; } public string CopyTo { init; get; }
public string ComparePathsFile { init; get; } public string ComparePathsFile { init; get; }
public int MaxDegreeOfParallelism { init; get; } public int MaxDegreeOfParallelism { init; get; }
public int MaxMinutesDelta { init; get; }
public string WorkingDirectoryName { init; get; } public string WorkingDirectoryName { init; get; }
[JsonConstructor] [JsonConstructor]
public AppSettings(string company, string copyTo, string comparePathsFile, int maxDegreeOfParallelism, string workingDirectoryName) public AppSettings(string company,
string copyTo,
string comparePathsFile,
int maxDegreeOfParallelism,
int maxMinutesDelta,
string workingDirectoryName)
{ {
Company = company; Company = company;
CopyTo = copyTo; CopyTo = copyTo;
ComparePathsFile = comparePathsFile; ComparePathsFile = comparePathsFile;
MaxDegreeOfParallelism = maxDegreeOfParallelism; MaxDegreeOfParallelism = maxDegreeOfParallelism;
MaxMinutesDelta = maxMinutesDelta;
WorkingDirectoryName = workingDirectoryName; WorkingDirectoryName = workingDirectoryName;
} }

View File

@ -12,6 +12,7 @@ public class AppSettings
public string CopyTo { get; set; } public string CopyTo { get; set; }
public string ComparePathsFile { get; set; } public string ComparePathsFile { get; set; }
public int? MaxDegreeOfParallelism { get; set; } public int? MaxDegreeOfParallelism { get; set; }
public int? MaxMinutesDelta { get; set; }
public string WorkingDirectoryName { get; set; } public string WorkingDirectoryName { get; set; }
#nullable restore #nullable restore
@ -27,11 +28,14 @@ public class AppSettings
Models.AppSettings result; Models.AppSettings result;
if (appSettings?.MaxDegreeOfParallelism is null) if (appSettings?.MaxDegreeOfParallelism is null)
throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism)); throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism));
if (appSettings?.MaxMinutesDelta is null)
throw new NullReferenceException(nameof(appSettings.MaxMinutesDelta));
result = new( result = new(
appSettings.Company, appSettings.Company,
appSettings.CopyTo, appSettings.CopyTo,
appSettings.ComparePathsFile, appSettings.ComparePathsFile,
appSettings.MaxDegreeOfParallelism.Value, appSettings.MaxDegreeOfParallelism.Value,
appSettings.MaxMinutesDelta.Value,
appSettings.WorkingDirectoryName appSettings.WorkingDirectoryName
); );
return result; return result;

View File

@ -176,7 +176,7 @@ public class Rename
dateTime = Metadata.Models.Stateless.Methods.IMetadata.GetMinimumDateTime(dateTimes, year, directories); dateTime = Metadata.Models.Stateless.Methods.IMetadata.GetMinimumDateTime(dateTimes, year, directories);
timeSpan = new TimeSpan(int.MaxValue); timeSpan = new TimeSpan(int.MaxValue);
} }
if (dateTime is not null && string.IsNullOrEmpty(_AppSettings.CopyTo) && timeSpan.TotalMinutes > 2) if (dateTime is not null && string.IsNullOrEmpty(_AppSettings.CopyTo) && timeSpan.TotalMinutes > _AppSettings.MaxMinutesDelta)
{ {
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered; checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}.{fileHolder.Length}{checkFileExtension}"); checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}.{fileHolder.Length}{checkFileExtension}");

View File

@ -1,12 +1,13 @@
{ {
"ComparePathsFile": "C:/Users/mikep/AppData/Local/PharesApps/Drag-Drop-Explorer/2023_03/638095825580115652.json", "ComparePathsFile": "C:/Users/mikep/AppData/Local/PharesApps/Drag-Drop-Explorer/2023_04/638105008748068423.json",
"CopyTo": "", "CopyTo": "L",
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Log4netProvider": "Debug" "Log4netProvider": "Debug"
} }
}, },
"MaxDegreeOfParallelism": 6, "MaxDegreeOfParallelism": 6,
"MaxMinutesDelta": 2,
"Serilog": { "Serilog": {
"MinimumLevel": "Debug" "MinimumLevel": "Debug"
}, },

View File

@ -12,6 +12,7 @@
} }
}, },
"MaxDegreeOfParallelism": 6, "MaxDegreeOfParallelism": 6,
"MaxMinutesDelta": 2,
"Serilog": { "Serilog": {
"Using": [ "Using": [
"Serilog.Sinks.Console", "Serilog.Sinks.Console",