PersonCharactersCopyCount

This commit is contained in:
2023-01-01 22:19:21 -07:00
parent 1417d87930
commit af24897853
25 changed files with 251 additions and 187 deletions

View File

@ -79,7 +79,7 @@
"/zzz Phares Slides/Slides 2015-06-10/Magazine 01" "/zzz Phares Slides/Slides 2015-06-10/Magazine 01"
], ],
"Configuration": { "Configuration": {
"DateGroup": "2022-12-30", "DateGroup": "45f4401",
"DiffPropertyDirectory": "", "DiffPropertyDirectory": "",
"FileNameDirectorySeparator": ".Z.", "FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false,
@ -87,7 +87,7 @@
"Pattern": "[^ABCDEFGHIJKLMNOPQRSTUVWXYZbcdfghjklmnpqrstvwxyz0-9]", "Pattern": "[^ABCDEFGHIJKLMNOPQRSTUVWXYZbcdfghjklmnpqrstvwxyz0-9]",
"PopulatePropertyId": true, "PopulatePropertyId": true,
"PropertiesChangedForProperty": false, "PropertiesChangedForProperty": false,
"RootDirectory": "C:/Tmp/Phares/Compare/Images-ec5a909", "RootDirectory": "C:/Tmp/Phares/Compare/Images-45f4401",
"WriteBitmapDataBytes": false, "WriteBitmapDataBytes": false,
"IgnoreExtensions": [ "IgnoreExtensions": [
".gif", ".gif",

View File

@ -50,7 +50,7 @@
"WorkingDirectoryName": "PharesApps", "WorkingDirectoryName": "PharesApps",
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"DateGroup": "2022-12-30", "DateGroup": "45f4401",
"DiffPropertyDirectory": "", "DiffPropertyDirectory": "",
"FileNameDirectorySeparator": ".Z.", "FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false,

View File

@ -55,7 +55,7 @@
"ByHash": false, "ByHash": false,
"BySeason": true, "BySeason": true,
"ByWeek": false, "ByWeek": false,
"DateGroup": "2022-12-30", "DateGroup": "45f4401",
"FileNameDirectorySeparator": ".Z.", "FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false,
"KeepFullPath": false, "KeepFullPath": false,
@ -68,11 +68,12 @@
"ResultContent": "()", "ResultContent": "()",
"ResultSingleton": "{}", "ResultSingleton": "{}",
"xRootDirectory": "C:/Tmp/phares/Pictures", "xRootDirectory": "C:/Tmp/phares/Pictures",
"xxRootDirectory": "C:/Tmp/Phares/Compare/Images-ec5a909", "xxRootDirectory": "C:/Tmp/Phares/Compare/Images-45f4401",
"xxxRootDirectory": "F:/Tmp/Phares/Compare/Not-Copy-Copy-ec5a909", "xxxRootDirectory": "F:/Tmp/Phares/Compare/Not-Copy-Copy-45f4401",
"xxxxRootDirectory": "C:/Tmp/Phares/Compare/Not-Copy-Copy-ec5a909", "xxxxRootDirectory": "C:/Tmp/Phares/Compare/Not-Copy-Copy-45f4401",
"xxxxxRootDirectory": "F:/Tmp/Phares/2022-11-03-DCIM/DCIM/100D3400 2022", "xxxxxRootDirectory": "F:/Tmp/Phares/2022-11-03-DCIM/DCIM/100D3400 2022",
"RootDirectory": "E:/- - - Videos/-", "xxxxxxRootDirectory": "E:/- - - Videos/-",
"RootDirectory": "D:/2) Images B/Not-Copy-Copy/New folder/-",
"WriteBitmapDataBytes": false, "WriteBitmapDataBytes": false,
"IgnoreExtensions": [ "IgnoreExtensions": [
".gif", ".gif",

View File

@ -55,7 +55,7 @@
"ByHash": false, "ByHash": false,
"BySeason": false, "BySeason": false,
"ByWeek": false, "ByWeek": false,
"DateGroup": "2022-12-30", "DateGroup": "45f4401",
"FileNameDirectorySeparator": ".Z.", "FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false,
"KeepFullPath": false, "KeepFullPath": false,
@ -68,8 +68,8 @@
"ResultContent": "()", "ResultContent": "()",
"ResultSingleton": "{}", "ResultSingleton": "{}",
"xRootDirectory": "C:/Tmp/phares/Pictures", "xRootDirectory": "C:/Tmp/phares/Pictures",
"xxRootDirectory": "C:/Tmp/Phares/Compare/Images-ec5a909", "xxRootDirectory": "C:/Tmp/Phares/Compare/Images-45f4401",
"RootDirectory": "F:/Tmp/Phares/Compare/Not-Copy-Copy-ec5a909", "RootDirectory": "F:/Tmp/Phares/Compare/Not-Copy-Copy-45f4401",
"xxxxRootDirectory": "F:/Tmp/Phares/2022-11-03-DCIM/DCIM/100D3400 2022", "xxxxRootDirectory": "F:/Tmp/Phares/2022-11-03-DCIM/DCIM/100D3400 2022",
"WriteBitmapDataBytes": false, "WriteBitmapDataBytes": false,
"IgnoreExtensions": [ "IgnoreExtensions": [

View File

@ -1,6 +1,6 @@
{ {
"xCompareRootDirectory": "", "xCompareRootDirectory": "",
"CompareRootDirectory": "D:/7) Question/- - - Images", "CompareRootDirectory": "D:/2) Images B/Not-Copy-Copy-45f4401",
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Log4netProvider": "Debug" "Log4netProvider": "Debug"
@ -14,8 +14,8 @@
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"xRootDirectory": "D:/2) Images B/Corrupt", "xRootDirectory": "D:/2) Images B/Corrupt",
"xxRootDirectory": "D:/2) Images B/Not-Copy-Copy-ec5a909", "xxRootDirectory": "D:/2) Images B/Not-Copy-Copy-45f4401",
"RootDirectory": "D:/1) Images A/Images-ec5a909", "RootDirectory": "D:/1) Images A/Images-45f4401",
"VerifyToSeason": [ "VerifyToSeason": [
". 2000", ". 2000",
". 2001", ". 2001",

View File

@ -52,7 +52,7 @@
"WorkingDirectoryName": "PharesApps", "WorkingDirectoryName": "PharesApps",
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"DateGroup": "2022-12-30", "DateGroup": "45f4401",
"DiffPropertyDirectory": "", "DiffPropertyDirectory": "",
"FileNameDirectorySeparator": ".Z.", "FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false,
@ -65,7 +65,7 @@
"ResultCollection": "[]", "ResultCollection": "[]",
"ResultContent": "()", "ResultContent": "()",
"ResultSingleton": "{}", "ResultSingleton": "{}",
"RootDirectory": "C:/Tmp/Phares/Compare/Images-ec5a909", "RootDirectory": "C:/Tmp/Phares/Compare/Images-45f4401",
"WriteBitmapDataBytes": false, "WriteBitmapDataBytes": false,
"IgnoreExtensions": [ "IgnoreExtensions": [
".gif", ".gif",

View File

@ -1,7 +1,7 @@
{ {
"xCompareRootDirectory": "D:/Tmp/Phares/Not-Copy-Copy-ec5a909", "xCompareRootDirectory": "D:/Tmp/Phares/Not-Copy-Copy-45f4401",
"xxCompareRootDirectory": "E:/www/Images - Results/C) Resize/2021-11-03/2256 x 1496/()", "xxCompareRootDirectory": "E:/www/Images - Results/C) Resize/2021-11-03/2256 x 1496/()",
"xxxCompareRootDirectory": "C:/Tmp/Phares/Compare/.Delete-Not-Copy-Copy-ec5a909", "xxxCompareRootDirectory": "C:/Tmp/Phares/Compare/.Delete-Not-Copy-Copy-45f4401",
"CompareRootDirectory": "C:/Tmp/Phares/Compare/Not-Copy-Copy-Duplicates", "CompareRootDirectory": "C:/Tmp/Phares/Compare/Not-Copy-Copy-Duplicates",
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {

View File

@ -51,7 +51,7 @@
"WorkingDirectoryName": "PharesApps", "WorkingDirectoryName": "PharesApps",
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"DateGroup": "2022-12-30", "DateGroup": "45f4401",
"DiffPropertyDirectory": "", "DiffPropertyDirectory": "",
"FileNameDirectorySeparator": ".Z.", "FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false,
@ -64,7 +64,7 @@
"ResultCollection": "[]", "ResultCollection": "[]",
"ResultContent": "()", "ResultContent": "()",
"ResultSingleton": "{}", "ResultSingleton": "{}",
"RootDirectory": "C:/Tmp/Phares/Compare/Images-ec5a909", "RootDirectory": "C:/Tmp/Phares/Compare/Images-45f4401",
"WriteBitmapDataBytes": false, "WriteBitmapDataBytes": false,
"IgnoreExtensions": [ "IgnoreExtensions": [
".gif", ".gif",

View File

@ -38,7 +38,6 @@
<PackageReference Include="MetadataExtractor" Version="2.7.2" /> <PackageReference Include="MetadataExtractor" Version="2.7.2" />
<PackageReference Include="Serilog" Version="2.12.0" /> <PackageReference Include="Serilog" Version="2.12.0" />
<PackageReference Include="ShellProgressBar" Version="5.2.0" /> <PackageReference Include="ShellProgressBar" Version="5.2.0" />
<PackageReference Include="WindowsShortcutFactory" Version="1.1.0" />
<PackageReference Include="System.Text.Json" Version="7.0.1" /> <PackageReference Include="System.Text.Json" Version="7.0.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -4,7 +4,6 @@ using View_by_Distance.FaceRecognitionDotNet;
using View_by_Distance.Map.Models; using View_by_Distance.Map.Models;
using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Properties; using View_by_Distance.Shared.Models.Properties;
using WindowsShortcutFactory;
namespace View_by_Distance.Distance.Models; namespace View_by_Distance.Distance.Models;
@ -363,55 +362,4 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
return result; return result;
} }
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;
}
public static void BeforeSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleSingletonDirectory)
{
string[] files;
string checkDirectory;
WindowsShortcut windowsShortcut;
foreach (string directoryName in jLinks)
{
checkDirectory = Path.Combine(a2PeopleSingletonDirectory, 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(a2PeopleSingletonDirectory, file, windowsShortcut.Path))
continue;
}
}
}
}
} }

View File

@ -394,7 +394,7 @@ public partial class Form : System.Windows.Forms.Form
string? directoryName; string? directoryName;
foreach (string path in paths) foreach (string path in paths)
{ {
name = Path.GetFileName(path); name = Path.GetFileName(path).Trim();
if (name.Length < 1 || (!name.StartsWith("zzz =20") && !name.StartsWith("=20") && !name.StartsWith("#20"))) if (name.Length < 1 || (!name.StartsWith("zzz =20") && !name.StartsWith("=20") && !name.StartsWith("#20")))
// if (name.Length < 1 || !name.Contains(".Z.#20")) // if (name.Length < 1 || !name.Contains(".Z.#20"))
continue; continue;
@ -463,33 +463,22 @@ public partial class Form : System.Windows.Forms.Form
_ProgressBar.Visible = false; _ProgressBar.Visible = false;
} }
void Form1_DragDrop(object? sender, DragEventArgs e) private static void MoveMatches(string argZero)
{ {
try string moveDirectory;
string checkDirectory;
int length = argZero.Length;
string compareDirectory = "D:/";
string[] directories = Directory.GetDirectories(argZero, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{ {
if (e.Data is null || e.Data.GetData(DataFormats.FileDrop) is not string[] paths) if (!string.IsNullOrEmpty(directory))
_TextBox.Text = string.Empty; continue;
else checkDirectory = string.Concat(compareDirectory, directory[length..]);
{ if (!Directory.Exists(checkDirectory))
if (paths.All(l => l.Contains("=20")) || paths.All(l => l.Contains("#20"))) continue;
// if (paths.All(l => l.Contains('#'))) moveDirectory = string.Concat(compareDirectory[..^1], directory[length..]);
Rename2000(paths); Directory.Move(checkDirectory, moveDirectory);
else
{
List<string> directories = GetDirectoriesOrDoDragDrop(paths);
if (directories.Any())
{
RenameFilesInDirectories(directories);
string? parentDirectory = Path.GetDirectoryName(directories[0]);
if (parentDirectory is not null && parentDirectory != Path.GetPathRoot(directories[0]))
_ = IPath.DeleteEmptyDirectories(parentDirectory);
}
}
}
}
catch (Exception)
{
throw;
} }
} }
@ -526,4 +515,36 @@ public partial class Form : System.Windows.Forms.Form
return results; return results;
} }
void Form1_DragDrop(object? sender, DragEventArgs e)
{
try
{
if (e.Data is null || e.Data.GetData(DataFormats.FileDrop) is not string[] paths)
_TextBox.Text = string.Empty;
else
{
if (paths.Length == 0 && paths[0].Contains("~~~"))
MoveMatches(paths[0]);
else if (paths.All(l => l.Contains("=20")) || paths.All(l => l.Contains("#20")))
// if (paths.All(l => l.Contains('#')))
Rename2000(paths);
else
{
List<string> directories = GetDirectoriesOrDoDragDrop(paths);
if (directories.Any())
{
RenameFilesInDirectories(directories);
string? parentDirectory = Path.GetDirectoryName(directories[0]);
if (parentDirectory is not null && parentDirectory != Path.GetPathRoot(directories[0]))
_ = IPath.DeleteEmptyDirectories(parentDirectory);
}
}
}
}
catch (Exception)
{
throw;
}
}
} }

View File

@ -124,8 +124,8 @@
], ],
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"xRootDirectory": "F:/Tmp/Phares/Compare/Images-ec5a909", "xRootDirectory": "F:/Tmp/Phares/Compare/Images-45f4401",
"xxRootDirectory": "F:/Tmp/Phares/Compare/Not-Copy-Copy-ec5a909", "xxRootDirectory": "F:/Tmp/Phares/Compare/Not-Copy-Copy-45f4401",
"RootDirectory": "E:/", "RootDirectory": "E:/",
"VerifyToSeason": [ "VerifyToSeason": [
". 2000", ". 2000",

View File

@ -53,7 +53,7 @@
"WorkingDirectoryName": "PharesApps", "WorkingDirectoryName": "PharesApps",
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"DateGroup": "2022-12-30", "DateGroup": "45f4401",
"DiffPropertyDirectory": "", "DiffPropertyDirectory": "",
"FileNameDirectorySeparator": ".Z.", "FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false,
@ -66,7 +66,7 @@
"ResultCollection": "[]", "ResultCollection": "[]",
"ResultContent": "()", "ResultContent": "()",
"ResultSingleton": "{}", "ResultSingleton": "{}",
"RootDirectory": "C:/Tmp/Phares/Compare/Images-ec5a909", "RootDirectory": "C:/Tmp/Phares/Compare/Images-45f4401",
"WriteBitmapDataBytes": false, "WriteBitmapDataBytes": false,
"IgnoreExtensions": [ "IgnoreExtensions": [
".gif", ".gif",

View File

@ -63,7 +63,7 @@ public partial class DlibDotNet
Models.Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); Models.Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
_Log.Information(propertyConfiguration.RootDirectory); _Log.Information(propertyConfiguration.RootDirectory);
Property.Models.Configuration.Verify(propertyConfiguration, requireExist: false); Property.Models.Configuration.Verify(propertyConfiguration, requireExist: false);
OpenPossibleDuplicates(configuration); Verify(configuration);
VerifyExtra(args, propertyConfiguration, configuration); VerifyExtra(args, propertyConfiguration, configuration);
_Configuration = configuration; _Configuration = configuration;
_Index = new(configuration); _Index = new(configuration);
@ -206,7 +206,7 @@ public partial class DlibDotNet
return result; return result;
} }
private void OpenPossibleDuplicates(Models.Configuration configuration) private void Verify(Models.Configuration configuration)
{ {
if (!configuration.OutputResolutions.Any() || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0])) if (!configuration.OutputResolutions.Any() || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0]))
throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be _FileNameToCollection valid outputResolution!"); throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be _FileNameToCollection valid outputResolution!");
@ -274,7 +274,8 @@ public partial class DlibDotNet
configuration.MappingDefaultName, configuration.MappingDefaultName,
configuration.PersonBirthdayFirstYear, configuration.PersonBirthdayFirstYear,
configuration.PersonBirthdayFormat, configuration.PersonBirthdayFormat,
configuration.PersonCharacters, configuration.PersonCharacters.ToArray(),
configuration.PersonCharactersCopyCount,
configuration.RangeDaysDeltaTolerance, configuration.RangeDaysDeltaTolerance,
configuration.RangeDistanceTolerance, configuration.RangeDistanceTolerance,
configuration.SaveSortingWithoutPerson, configuration.SaveSortingWithoutPerson,
@ -783,6 +784,52 @@ public partial class DlibDotNet
} }
} }
private void RenameAbandoned(string argZero, Container[] containers)
{
List<string> renameCollection = new();
foreach (Container container in containers)
{
if (!container.Items.Any())
continue;
if (!_ArgZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero))
continue;
foreach (Item item in container.Items)
{
if (item.Abandoned is not null && item.Abandoned.Value)
renameCollection.Add(item.SourceDirectoryFileHolder.FullName);
}
}
if (renameCollection.Any())
{
foreach (string rename in renameCollection)
File.Move(rename, $"{rename}.abd");
throw new Exception($"Renamed {renameCollection.Count}(s) files!");
}
}
private void RenameMoved(string argZero, Container[] containers)
{
List<string> renameCollection = new();
foreach (Container container in containers)
{
if (!container.Items.Any())
continue;
if (!_ArgZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero))
continue;
foreach (Item item in container.Items)
{
if (item.Moved is not null && item.Moved.Value)
renameCollection.Add(item.SourceDirectoryFileHolder.FullName);
}
}
if (renameCollection.Any())
{
foreach (string rename in renameCollection)
File.Move(rename, $"{rename}.mvd");
throw new Exception($"Renamed {renameCollection.Count}(s) files!");
}
}
private List<Shared.Models.Face> GetFilteredDistinctFaces(string argZero, Container[] containers) private List<Shared.Models.Face> GetFilteredDistinctFaces(string argZero, Container[] containers)
{ {
List<Shared.Models.Face> results = new(); List<Shared.Models.Face> results = new();
@ -845,13 +892,12 @@ public partial class DlibDotNet
return items; return items;
} }
private void MapLogic(string argZero, long ticks, Container[] containers, string a2PeopleSingletonDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, string fPhotoPrismContentDirectory, MapLogicSupport mapLogicSupport, MapLogic mapLogic, string outputResolution, List<Shared.Models.Face> distinctFilteredFaces, Mapping[] mappingCollection, int totalNotMapped) private void MapLogic(string argZero, long ticks, Container[] containers, string a2PeopleSingletonDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, string fPhotoPrismContentDirectory, MapLogicSupport mapLogicSupport, MapLogic mapLogic, string outputResolution, List<Shared.Models.Face> distinctFilteredFaces, Mapping[] mappingCollection, int totalNotMapped, Dictionary<long, int> personKeyToCount)
{ {
int? useFiltersCounter = null; int? useFiltersCounter = null;
SortingContainer[] sortingContainers; SortingContainer[] sortingContainers;
string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, "()"); string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, "()");
string d2FacePartsContentDirectory = Path.Combine(d2ResultsFullGroupDirectory, "()"); string d2FacePartsContentDirectory = Path.Combine(d2ResultsFullGroupDirectory, "()");
Dictionary<long, int> personKeyToCount = mapLogic.GetPersonKeyToCount(mappingCollection);
string dFacesCollectionDirectory = Path.Combine(dResultsFullGroupDirectory, "[]", _Configuration.PropertyConfiguration.ResultAllInOne); string dFacesCollectionDirectory = Path.Combine(dResultsFullGroupDirectory, "[]", _Configuration.PropertyConfiguration.ResultAllInOne);
Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping = MapLogicSupport.GetIdToNormalizedRectangleToFace(mappingCollection); Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping = MapLogicSupport.GetIdToNormalizedRectangleToFace(mappingCollection);
if (Directory.Exists(fPhotoPrismContentDirectory)) if (Directory.Exists(fPhotoPrismContentDirectory))
@ -861,13 +907,11 @@ public partial class DlibDotNet
List<Item> filteredItems = GetItems(argZero, containers); List<Item> filteredItems = GetItems(argZero, containers);
mapLogic.SaveShortcutsForOutputResolutions(filteredItems, mappingCollection, personKeyToCount); mapLogic.SaveShortcutsForOutputResolutions(filteredItems, mappingCollection, personKeyToCount);
} }
if (_Configuration.PersonCharactersToCopyTo.Length == 1 && _Configuration.PersonCharacters.ToArray().Contains(_Configuration.PersonCharactersToCopyTo[0])) if (_Configuration.PersonCharactersCopyCount > 0 && !string.IsNullOrEmpty(_Configuration.PersonCharacters))
mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersToCopyTo[0], dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection); mapLogic.CopyAtLeastOneMappedFiles(dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection);
mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedRectangleToMapping); mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedRectangleToMapping);
if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution))
mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedRectangleToMapping, personKeyToCount, totalNotMapped); mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedRectangleToMapping, personKeyToCount, totalNotMapped);
if (_Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution))
mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, _PersonContainers, a2PeopleSingletonDirectory, mappingCollection, personKeyToCount, totalNotMapped);
if (_Configuration.SaveFaceDistancesForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveFaceDistancesForOutputResolutions.Contains(outputResolution))
{ {
MapLogicSupport.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces); MapLogicSupport.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces);
@ -1014,6 +1058,7 @@ public partial class DlibDotNet
string key; string key;
double? percent; double? percent;
Rectangle? rectangle; Rectangle? rectangle;
List<string> delete = new();
Rectangle intersectRectangle; Rectangle intersectRectangle;
(string File, int NormalizedRectangle) item; (string File, int NormalizedRectangle) item;
Dictionary<string, (string, int)> distinct = new(); Dictionary<string, (string, int)> distinct = new();
@ -1038,22 +1083,29 @@ public partial class DlibDotNet
percent = intersectRectangle.Width * intersectRectangle.Height; percent = intersectRectangle.Width * intersectRectangle.Height;
} }
} }
if (!_Configuration.DeletePossibleDuplicates) delete.Add(item.File);
delete.Add(locationContainer.File);
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File, percent)); duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File, percent));
else
{
if (File.Exists(item.File))
File.Delete(item.File);
if (File.Exists(locationContainer.File))
File.Delete(locationContainer.File);
}
continue; continue;
} }
distinct.Add(key, new(locationContainer.File, locationContainer.NormalizedRectangle)); distinct.Add(key, new(locationContainer.File, locationContainer.NormalizedRectangle));
} }
if (!_Configuration.DeletePossibleDuplicates)
{
if (duplicates.Any() && _IsEnvironment.Development) if (duplicates.Any() && _IsEnvironment.Development)
OpenPossibleDuplicates(duplicates); OpenPossibleDuplicates(duplicates);
} }
else
{
if (delete.Count > 5)
throw new Exception("Something maybe wrong!");
foreach (string file in delete)
{
if (File.Exists(file))
File.Delete(file);
}
}
}
private List<LocationContainer<MetadataExtractor.Directory>> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) private List<LocationContainer<MetadataExtractor.Directory>> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
{ {
@ -1107,9 +1159,7 @@ public partial class DlibDotNet
int f; int f;
int j; int j;
int t; int t;
int totalNotMapped;
Container[] containers; Container[] containers;
Mapping[] mappingCollection;
string eDistanceContentDirectory; string eDistanceContentDirectory;
string? a2PeopleContentDirectory; string? a2PeopleContentDirectory;
string aResultsFullGroupDirectory; string aResultsFullGroupDirectory;
@ -1119,7 +1169,6 @@ public partial class DlibDotNet
string d2ResultsFullGroupDirectory; string d2ResultsFullGroupDirectory;
string fPhotoPrismContentDirectory; string fPhotoPrismContentDirectory;
string fPhotoPrismSingletonDirectory; string fPhotoPrismSingletonDirectory;
List<Shared.Models.Face> distinctFilteredFaces;
string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "{}"); string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "{}");
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
string message = $") Building Container(s) - {totalSeconds} total second(s)"; string message = $") Building Container(s) - {totalSeconds} total second(s)";
@ -1130,6 +1179,8 @@ public partial class DlibDotNet
progressBar.Tick(); progressBar.Tick();
(j, f, t, containers) = Property.Models.Stateless.Container.GetContainers(_Configuration.PropertyConfiguration, propertyLogic); (j, f, t, containers) = Property.Models.Stateless.Container.GetContainers(_Configuration.PropertyConfiguration, propertyLogic);
} }
RenameMoved(argZero, containers);
RenameAbandoned(argZero, containers);
Container? container = AreAllSameEndsWith(argZero, containers); Container? container = AreAllSameEndsWith(argZero, containers);
if (!_ArgZeroIsConfigurationRootDirectory || container is null) if (!_ArgZeroIsConfigurationRootDirectory || container is null)
{ {
@ -1168,25 +1219,26 @@ public partial class DlibDotNet
FullDoWork(argZero, propertyRoot, ticks, propertyLogic, t, containers, a2PeopleContentDirectory, eDistanceContentDirectory); FullDoWork(argZero, propertyRoot, ticks, propertyLogic, t, containers, a2PeopleContentDirectory, eDistanceContentDirectory);
_Distance.Clear(); _Distance.Clear();
mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory, mapLogicSupport); mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory, mapLogicSupport);
SetMapping(_FileNameToCollection, argZero, containers);
List<Shared.Models.Face> distinctFilteredFaces = GetFilteredDistinctFaces(argZero, containers);
Mapping[] mappingCollection = MapLogicSupport.GetSelectedMappingCollection(distinctFilteredFaces);
Dictionary<long, int> personKeyToCount = mapLogic.GetPersonKeyToCount(mappingCollection);
int totalNotMapped = mapLogic.UpdateMappingFromPerson(mappingCollection);
if (a2PeopleContentDirectory is not null && false)
mapLogic.CreateTree(ticks, a2PeopleContentDirectory);
foreach (string outputResolution in _Configuration.OutputResolutions) foreach (string outputResolution in _Configuration.OutputResolutions)
{ {
if (_PropertyRootExistedBefore || container is not null) if (_PropertyRootExistedBefore || container is not null)
break; break;
(aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution); (aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory) = GetResultsFullGroupDirectories(outputResolution);
if (_Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution)) if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && _Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution))
MapLogicSupport.BeforeSaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, a2PeopleSingletonDirectory); mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, _PersonContainers, a2PeopleContentDirectory, mappingCollection, personKeyToCount, totalNotMapped);
SetMapping(_FileNameToCollection, argZero, containers);
distinctFilteredFaces = GetFilteredDistinctFaces(argZero, containers);
mappingCollection = MapLogicSupport.GetSelectedMappingCollection(distinctFilteredFaces);
totalNotMapped = mapLogic.UpdateMappingFromPerson(mappingCollection);
if (a2PeopleContentDirectory is not null)
mapLogic.CreateTree(ticks, a2PeopleContentDirectory);
if (_ArgZeroIsConfigurationRootDirectory if (_ArgZeroIsConfigurationRootDirectory
&& _Configuration.SaveResizedSubfiles && _Configuration.SaveResizedSubfiles
&& outputResolution == _Configuration.OutputResolutions[0] && outputResolution == _Configuration.OutputResolutions[0]
&& _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution) && _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution)
&& _Exceptions.Count == 0) && _Exceptions.Count == 0)
MapLogic(argZero, ticks, containers, a2PeopleSingletonDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, fPhotoPrismContentDirectory, mapLogicSupport, mapLogic, outputResolution, distinctFilteredFaces, mappingCollection, totalNotMapped); MapLogic(argZero, ticks, containers, a2PeopleSingletonDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, fPhotoPrismContentDirectory, mapLogicSupport, mapLogic, outputResolution, distinctFilteredFaces, mappingCollection, totalNotMapped, personKeyToCount);
if (_Configuration.SaveRandomForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveRandomForOutputResolutions.Contains(outputResolution))
_Random.Random(_Configuration.PropertyConfiguration, mapLogic, outputResolution, mappingCollection); _Random.Random(_Configuration.PropertyConfiguration, mapLogic, outputResolution, mappingCollection);
if (_IsEnvironment.Development) if (_IsEnvironment.Development)

View File

@ -51,7 +51,7 @@ public class Configuration
[Display(Name = "Person Birthday First Year"), Required] public int? PersonBirthdayFirstYear { get; set; } [Display(Name = "Person Birthday First Year"), Required] public int? PersonBirthdayFirstYear { get; set; }
[Display(Name = "Person Birthday Format"), Required] public string PersonBirthdayFormat { get; set; } [Display(Name = "Person Birthday Format"), Required] public string PersonBirthdayFormat { get; set; }
[Display(Name = "Person Characters"), Required] public string PersonCharacters { get; set; } [Display(Name = "Person Characters"), Required] public string PersonCharacters { get; set; }
[Display(Name = "Person Characters To Copy To"), Required] public string PersonCharactersToCopyTo { get; set; } [Display(Name = "Person Characters Copy Count"), Required] public int? PersonCharactersCopyCount { get; set; }
[Display(Name = "PersonKey Format"), Required] public string PersonKeyFormat { get; set; } [Display(Name = "PersonKey Format"), Required] public string PersonKeyFormat { get; set; }
[Display(Name = "Predictor Model Name"), Required] public string PredictorModelName { get; set; } [Display(Name = "Predictor Model Name"), Required] public string PredictorModelName { get; set; }
[Display(Name = "Properties Changed For Distance"), Required] public bool? PropertiesChangedForDistance { get; set; } [Display(Name = "Properties Changed For Distance"), Required] public bool? PropertiesChangedForDistance { get; set; }
@ -164,8 +164,8 @@ public class Configuration
throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat)); throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat));
if (configuration.PersonCharacters is null) if (configuration.PersonCharacters is null)
throw new NullReferenceException(nameof(configuration.PersonCharacters)); throw new NullReferenceException(nameof(configuration.PersonCharacters));
if (configuration.PersonCharactersToCopyTo is null) if (configuration.PersonCharactersCopyCount is null)
throw new NullReferenceException(nameof(configuration.PersonCharactersToCopyTo)); throw new NullReferenceException(nameof(configuration.PersonCharactersCopyCount));
if (configuration.PersonKeyFormat is null) if (configuration.PersonKeyFormat is null)
throw new NullReferenceException(nameof(configuration.PersonKeyFormat)); throw new NullReferenceException(nameof(configuration.PersonKeyFormat));
if (configuration.PropertiesChangedForDistance is null) if (configuration.PropertiesChangedForDistance is null)
@ -254,7 +254,7 @@ public class Configuration
configuration.PersonBirthdayFirstYear.Value, configuration.PersonBirthdayFirstYear.Value,
configuration.PersonBirthdayFormat, configuration.PersonBirthdayFormat,
configuration.PersonCharacters, configuration.PersonCharacters,
configuration.PersonCharactersToCopyTo, configuration.PersonCharactersCopyCount.Value,
configuration.PersonKeyFormat, configuration.PersonKeyFormat,
configuration.PredictorModelName, configuration.PredictorModelName,
configuration.PropertiesChangedForDistance.Value, configuration.PropertiesChangedForDistance.Value,

View File

@ -48,7 +48,7 @@ public class Configuration
public int PersonBirthdayFirstYear { init; get; } public int PersonBirthdayFirstYear { init; get; }
public string PersonBirthdayFormat { init; get; } public string PersonBirthdayFormat { init; get; }
public string PersonCharacters { init; get; } public string PersonCharacters { init; get; }
public string PersonCharactersToCopyTo { init; get; } public int PersonCharactersCopyCount { init; get; }
public string PersonKeyFormat { init; get; } public string PersonKeyFormat { init; get; }
public string PredictorModelName { init; get; } public string PredictorModelName { init; get; }
public bool PropertiesChangedForDistance { init; get; } public bool PropertiesChangedForDistance { init; get; }
@ -118,7 +118,7 @@ public class Configuration
int personBirthdayFirstYear, int personBirthdayFirstYear,
string personBirthdayFormat, string personBirthdayFormat,
string personCharacters, string personCharacters,
string personCharactersToCopyTo, int personCharactersCopyCount,
string personKeyFormat, string personKeyFormat,
string predictorModelName, string predictorModelName,
bool propertiesChangedForDistance, bool propertiesChangedForDistance,
@ -187,7 +187,7 @@ public class Configuration
PersonBirthdayFirstYear = personBirthdayFirstYear; PersonBirthdayFirstYear = personBirthdayFirstYear;
PersonBirthdayFormat = personBirthdayFormat; PersonBirthdayFormat = personBirthdayFormat;
PersonCharacters = personCharacters; PersonCharacters = personCharacters;
PersonCharactersToCopyTo = personCharactersToCopyTo; PersonCharactersCopyCount = personCharactersCopyCount;
PersonKeyFormat = personKeyFormat; PersonKeyFormat = personKeyFormat;
PredictorModelName = predictorModelName; PredictorModelName = predictorModelName;
PropertiesChangedForDistance = propertiesChangedForDistance; PropertiesChangedForDistance = propertiesChangedForDistance;

View File

@ -10,24 +10,18 @@
}, },
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"DeletePossibleDuplicates": false, "DateGroup": "45f4401",
"DeletePossibleDuplicates": true,
"DistanceRenameToMatch": true, "DistanceRenameToMatch": true,
"DistanceMoveUnableToMatch": true, "DistanceMoveUnableToMatch": true,
"PersonCharacters": "!#]^_`~+", "PersonCharacters": "!#]^_`~+",
"PersonCharactersToCopyTo": "x", "PersonCharactersCopyCount": 0,
"xPersonCharactersToCopyTo": "!", "xPersonCharactersCopyCount": 2,
"xxPersonCharactersToCopyTo": "#",
"xxxPersonCharactersToCopyTo": "]",
"xxxxPersonCharactersToCopyTo": "^",
"xxxxxPersonCharactersToCopyTo": "_",
"xxxxxxPersonCharactersToCopyTo": "`",
"xxxxxxxPersonCharactersToCopyTo": "~",
"xxxxxxxxPersonCharactersToCopyTo": "+",
"xRootDirectory": "D:/Tmp/phares/Pictures", "xRootDirectory": "D:/Tmp/phares/Pictures",
"xxRootDirectory": "D:/Tmp/Phares/Compare/Corrupt", "xxRootDirectory": "D:/Tmp/Phares/Compare/Corrupt",
"xxxRootDirectory": "D:/2) Images B/Not-Copy-Copy-ec5a909", "RootDirectory": "D:/2) Images B/Not-Copy-Copy-45f4401",
"RootDirectory": "D:/1) Images A/Images-ec5a909", "xxxxRootDirectory": "D:/1) Images A/Images-45f4401",
"xxxxxRootDirectory": "D:/1) Images A/Images-ec5a909/Facebook/=2022.3 Facebook", "xxxxxRootDirectory": "D:/1) Images A/Images-45f4401/Facebook/=2022.3 Facebook",
"SaveSortingWithoutPerson": true, "SaveSortingWithoutPerson": true,
"JLinks": [ "JLinks": [
"Julie" "Julie"
@ -44,12 +38,12 @@
"PropertyContentCollectionFiles": [], "PropertyContentCollectionFiles": [],
"RangeDaysDeltaTolerance": [ "RangeDaysDeltaTolerance": [
0, 0,
1, 2100,
123456 123456
], ],
"RangeDistanceTolerance": [ "RangeDistanceTolerance": [
0, 0,
0.4, 0.3,
0.6 0.6
], ],
"RangeFaceAreaPermilleTolerance": [ "RangeFaceAreaPermilleTolerance": [

View File

@ -53,7 +53,7 @@
"CheckDFaceAndUpWriteDates": false, "CheckDFaceAndUpWriteDates": false,
"CheckJsonForDistanceResults": false, "CheckJsonForDistanceResults": false,
"CrossDirectoryMaxItemsInDistanceCollection": 7, "CrossDirectoryMaxItemsInDistanceCollection": 7,
"DateGroup": "2022-12-30", "DateGroup": "DateGroup",
"DeletePossibleDuplicates": false, "DeletePossibleDuplicates": false,
"DistanceFactor": 8, "DistanceFactor": 8,
"DistanceMoveUnableToMatch": false, "DistanceMoveUnableToMatch": false,
@ -89,7 +89,7 @@
"PersonBirthdayFirstYear": 1500, "PersonBirthdayFirstYear": 1500,
"PersonBirthdayFormat": "yyyy-MM-dd_HH", "PersonBirthdayFormat": "yyyy-MM-dd_HH",
"PersonCharacters": "!#]^_`~+", "PersonCharacters": "!#]^_`~+",
"PersonCharactersToCopyTo": "~", "PersonCharactersCopyCount": 0,
"PersonKeyFormat": "yyyy-MM-dd_HH", "PersonKeyFormat": "yyyy-MM-dd_HH",
"PopulatePropertyId": true, "PopulatePropertyId": true,
"PredictorModelName": "Large", "PredictorModelName": "Large",

View File

@ -12,9 +12,10 @@ public class Configuration
public string FacesFileNameExtension { init; get; } public string FacesFileNameExtension { init; get; }
public string FacesHiddenFileNameExtension { init; get; } public string FacesHiddenFileNameExtension { init; get; }
public string MappingDefaultName { init; get; } public string MappingDefaultName { init; get; }
public string PersonCharacters { init; get; }
public int PersonBirthdayFirstYear { init; get; } public int PersonBirthdayFirstYear { init; get; }
public string PersonBirthdayFormat { init; get; } public string PersonBirthdayFormat { init; get; }
public char[] PersonCharacters { init; get; }
public int PersonCharactersCopyCount { init; get; }
public int RangeDaysDeltaTolerance { init; get; } public int RangeDaysDeltaTolerance { init; get; }
public double RangeDistanceTolerance { init; get; } public double RangeDistanceTolerance { init; get; }
public bool SaveSortingWithoutPerson { init; get; } public bool SaveSortingWithoutPerson { init; get; }
@ -27,7 +28,8 @@ public class Configuration
string mappingDefaultName, string mappingDefaultName,
int personBirthdayFirstYear, int personBirthdayFirstYear,
string personBirthdayFormat, string personBirthdayFormat,
string personCharacters, char[] personCharacters,
int personCharactersCopyCount,
int[] rangeDaysDeltaTolerance, int[] rangeDaysDeltaTolerance,
double[] rangeDistanceTolerance, double[] rangeDistanceTolerance,
bool saveSortingWithoutPerson, bool saveSortingWithoutPerson,
@ -49,6 +51,7 @@ public class Configuration
SaveSortingWithoutPerson = saveSortingWithoutPerson; SaveSortingWithoutPerson = saveSortingWithoutPerson;
SortingMinimumToUseSigma = sortingMinimumToUseSigma; SortingMinimumToUseSigma = sortingMinimumToUseSigma;
RangeDaysDeltaTolerance = rangeDaysDeltaTolerance[1]; RangeDaysDeltaTolerance = rangeDaysDeltaTolerance[1];
PersonCharactersCopyCount = personCharactersCopyCount;
FacePartsFileNameExtension = facePartsFileNameExtension; FacePartsFileNameExtension = facePartsFileNameExtension;
FacesHiddenFileNameExtension = facesHiddenFileNameExtension; FacesHiddenFileNameExtension = facesHiddenFileNameExtension;
} }

View File

@ -859,7 +859,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
} }
} }
public void CopyAtLeastOneMappedFiles(char personCharactersToCopyTo, string dFacesContentDirectory, string a2PeopleSingletonDirectory, Mapping[] mappingCollection) public void CopyAtLeastOneMappedFiles(string dFacesContentDirectory, string a2PeopleSingletonDirectory, Mapping[] mappingCollection)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
@ -897,13 +897,13 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
continue; continue;
if (!_PersonKeyToPersonContainer.TryGetValue(personKey, out personContainer)) if (!_PersonKeyToPersonContainer.TryGetValue(personKey, out personContainer))
continue; continue;
if (personContainer.Char is null || personContainer.Char != personCharactersToCopyTo) if (personContainer.Char is null || !_Configuration.PersonCharacters.Contains(personContainer.Char.Value))
continue; continue;
if (personContainer.DisplayDirectoryAllFiles.Any(l => l.EndsWith(faceFileName))) if (personContainer.DisplayDirectoryAllFiles.Any(l => l.EndsWith(faceFileName)))
continue; continue;
if (!File.Exists(faceFile)) if (!File.Exists(faceFile))
continue; continue;
directory = Path.Combine(a2PeopleSingletonDirectory, personCharactersToCopyTo.ToString(), personContainer.DisplayDirectoryName); directory = Path.Combine(a2PeopleSingletonDirectory, personContainer.Char.Value.ToString(), personContainer.DisplayDirectoryName);
if (!Directory.Exists(directory)) if (!Directory.Exists(directory))
continue; continue;
fileName = Path.Combine(directory, faceFileName); fileName = Path.Combine(directory, faceFileName);
@ -952,7 +952,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return new(personKeyFormatted, personBirthday); return new(personKeyFormatted, personBirthday);
} }
private List<string> GetPersonKeyFormattedCollection(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, Dictionary<long, int> personKeyToCount) private List<string> GetPersonKeyFormattedCollection(string[] jLinks, string a2PeopleContentDirectory, PersonContainer[] personContainers, Dictionary<long, int> personKeyToCount)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
@ -970,7 +970,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
List<(long, string)> collection = new(); List<(long, string)> collection = new();
foreach (string directoryName in jLinks) foreach (string directoryName in jLinks)
{ {
checkDirectory = Path.Combine(a2PeopleSingletonDirectory, directoryName); checkDirectory = Path.Combine(a2PeopleContentDirectory, directoryName);
if (!Directory.Exists(checkDirectory)) if (!Directory.Exists(checkDirectory))
continue; continue;
checkDirectories = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly); checkDirectories = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly);
@ -1012,7 +1012,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return results; return results;
} }
private (int, FileHolder, int, string, string, string, string)[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleSingletonDirectory, PersonContainer[] personContainers, Mapping[] mappingCollection, Dictionary<long, int> personKeyToCount) private (int, FileHolder, int, string, string, string, string)[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory, PersonContainer[] personContainers, Mapping[] mappingCollection, Dictionary<long, int> personKeyToCount)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
@ -1023,7 +1023,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
string personDirectory; string personDirectory;
string personKeyFormatted; string personKeyFormatted;
bool usePersonKeyAndDeterministicHashCodeKey = false; bool usePersonKeyAndDeterministicHashCodeKey = false;
List<string> personKeyFormattedCollection = GetPersonKeyFormattedCollection(jLinks, a2PeopleSingletonDirectory, personContainers, personKeyToCount); List<string> personKeyFormattedCollection = GetPersonKeyFormattedCollection(jLinks, a2PeopleContentDirectory, personContainers, personKeyToCount);
List<(int Id, FileHolder ImageFileHolder, int ApproximateYears, string PersonKeyFormatted, string CheckFile, string Directory, string PersonDirectory)> collection = new(); List<(int Id, FileHolder ImageFileHolder, int ApproximateYears, string PersonKeyFormatted, string CheckFile, string Directory, string PersonDirectory)> collection = new();
foreach (Mapping mapping in mappingCollection) foreach (Mapping mapping in mappingCollection)
{ {
@ -1061,14 +1061,66 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return results; return results;
} }
public void SaveFilteredOriginalImagesFromJLinks(string[] jLinks, PersonContainer[] personContainers, string a2PeopleSingletonDirectory, Mapping[] mappingCollection, Dictionary<long, int> personKeyToCount, int totalNotMapped) 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, Mapping[] mappingCollection, Dictionary<long, int> personKeyToCount, int totalNotMapped)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
SaveContainer? saveContainer; SaveContainer? saveContainer;
List<int> distinctCollection = new(); List<int> distinctCollection = new();
List<SaveContainer> saveContainers = new(); List<SaveContainer> saveContainers = new();
(int, FileHolder, int, string, string, string, string)[] collection = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleSingletonDirectory, personContainers, mappingCollection, personKeyToCount); BeforeSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory);
(int, FileHolder, int, string, string, string, string)[] collection = GetCollectionForSaveFilteredOriginalImagesFromJLinks(jLinks, a2PeopleContentDirectory, personContainers, mappingCollection, personKeyToCount);
foreach ((int id, FileHolder imageFileHolder, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection) foreach ((int id, FileHolder imageFileHolder, int approximateYears, string personKeyFormatted, string directory, string personDirectory, string checkFile) in collection)
{ {
if (distinctCollection.Contains(id)) if (distinctCollection.Contains(id))

View File

@ -50,7 +50,7 @@
"WorkingDirectoryName": "PharesApps", "WorkingDirectoryName": "PharesApps",
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"DateGroup": "2022-12-30", "DateGroup": "45f4401",
"FileNameDirectorySeparator": ".Z.", "FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false,
"MaxImagesInDirectoryForTopLevelFirstPass": 10, "MaxImagesInDirectoryForTopLevelFirstPass": 10,

View File

@ -50,7 +50,7 @@
"WorkingDirectoryName": "PharesApps", "WorkingDirectoryName": "PharesApps",
"Windows": { "Windows": {
"Configuration": { "Configuration": {
"DateGroup": "2022-12-30", "DateGroup": "45f4401",
"FileNameDirectorySeparator": ".Z.", "FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false,
"KeepFullPath": false, "KeepFullPath": false,

View File

@ -78,13 +78,11 @@ public class Container
return result; return result;
} }
private static (int, Shared.Models.Container[]) GetContainers(Configuration configuration, A_Property propertyLogic, string aPropertySingletonDirectory, List<(int, string, FileHolder[])> fileHolderGroupCollection, List<(string, List<(string, Shared.Models.Property?)>)> collectionFromJson) private static Shared.Models.Container[] GetContainers(Configuration configuration, A_Property propertyLogic, string aPropertySingletonDirectory, List<(int, string, FileHolder[])> fileHolderGroupCollection, List<(string, List<(string, Shared.Models.Property?)>)> collectionFromJson)
{ {
int result = 0;
Shared.Models.Container[] results; Shared.Models.Container[] results;
Item item; Item item;
int length; int length;
int additional;
string inferred; string inferred;
List<Item> items; List<Item> items;
const int last = 9; const int last = 9;
@ -155,7 +153,6 @@ public class Container
} }
if (items.Any()) if (items.Any())
{ {
result += items.Count;
if (keySourceDirectories.Distinct().Count() != 1) if (keySourceDirectories.Distinct().Count() != 1)
continue; continue;
container = new(last, items, keySourceDirectories[0]); container = new(last, items, keySourceDirectories[0]);
@ -183,15 +180,13 @@ public class Container
{ {
if (!keyValuePairs.ContainsKey(sourceDirectory)) if (!keyValuePairs.ContainsKey(sourceDirectory))
{ {
result += items.Count;
container = new(g, items, sourceDirectory); container = new(g, items, sourceDirectory);
keyValuePairs.Add(sourceDirectory, container); keyValuePairs.Add(sourceDirectory, container);
} }
else else
{ {
container = keyValuePairs[sourceDirectory]; container = keyValuePairs[sourceDirectory];
(items, additional) = Shared.Models.Stateless.Methods.IItem.GetMerged(container.Items, items); items = Shared.Models.Stateless.Methods.IItem.GetMerged(container.Items, items);
result += additional;
container = new(container.G, items, container.SourceDirectory); container = new(container.G, items, container.SourceDirectory);
keyValuePairs[sourceDirectory] = container; keyValuePairs[sourceDirectory] = container;
} }
@ -200,7 +195,7 @@ public class Container
if (fileHolderKeyValuePairs.Any()) if (fileHolderKeyValuePairs.Any())
throw new NotSupportedException("Unmapped left!"); throw new NotSupportedException("Unmapped left!");
results = (from l in keyValuePairs orderby l.Value.G, l.Value.Items.Count select l.Value).ToArray(); results = (from l in keyValuePairs orderby l.Value.G, l.Value.Items.Count select l.Value).ToArray();
return new(result, results); return results;
} }
private static void SetCollections(string aPropertySingletonDirectory, List<string> otherCollection, List<(string, string[])> jsonCollection) private static void SetCollections(string aPropertySingletonDirectory, List<string> otherCollection, List<(string, string[])> jsonCollection)
@ -253,7 +248,8 @@ public class Container
DeleteAbandoned(configuration, aPropertySingletonDirectory, otherCollection, fileHolderGroupCollection); DeleteAbandoned(configuration, aPropertySingletonDirectory, otherCollection, fileHolderGroupCollection);
List<(string sourceDirectory, List<(string sourceDirectoryFile, Shared.Models.Property? property)> collection)> collectionFromJson; List<(string sourceDirectory, List<(string sourceDirectoryFile, Shared.Models.Property? property)> collection)> collectionFromJson;
collectionFromJson = GetCollection(aPropertySingletonDirectory, jsonCollection); collectionFromJson = GetCollection(aPropertySingletonDirectory, jsonCollection);
(int t, results) = GetContainers(configuration, propertyLogic, aPropertySingletonDirectory, fileHolderGroupCollection, collectionFromJson); results = GetContainers(configuration, propertyLogic, aPropertySingletonDirectory, fileHolderGroupCollection, collectionFromJson);
int t = (from l in results select l.Items.Count).Sum();
int j = jsonCollection.Select(l => l.Item2.Length).Sum(); int j = jsonCollection.Select(l => l.Item2.Length).Sum();
return (j, f, t, results); return (j, f, t, results);
} }

View File

@ -7,9 +7,9 @@ public interface IItem
GetWrongYearFlag(isWrongYear); GetWrongYearFlag(isWrongYear);
static string GetWrongYearFlag(bool? isWrongYear) => isWrongYear is null ? "#" : isWrongYear.Value ? "~" : "="; static string GetWrongYearFlag(bool? isWrongYear) => isWrongYear is null ? "#" : isWrongYear.Value ? "~" : "=";
(List<Models.Item>, int) TestStatic_GetMerged(List<Models.Item> itemsA, List<Models.Item> itemsB) => List<Models.Item> TestStatic_GetMerged(List<Models.Item> itemsA, List<Models.Item> itemsB) =>
GetMerged(itemsA, itemsB); GetMerged(itemsA, itemsB);
static (List<Models.Item>, int) GetMerged(List<Models.Item> itemsA, List<Models.Item> itemsB) => static List<Models.Item> GetMerged(List<Models.Item> itemsA, List<Models.Item> itemsB) =>
Item.GetMerged(itemsA, itemsB); Item.GetMerged(itemsA, itemsB);
} }

View File

@ -3,9 +3,8 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class Item internal abstract class Item
{ {
internal static (List<Models.Item>, int) GetMerged(List<Models.Item> itemsA, List<Models.Item> itemsB) internal static List<Models.Item> GetMerged(List<Models.Item> itemsA, List<Models.Item> itemsB)
{ {
int result = 0;
List<Models.Item> results = new(); List<Models.Item> results = new();
List<string> collection = new(); List<string> collection = new();
foreach (Models.Item item in itemsA) foreach (Models.Item item in itemsA)
@ -17,10 +16,9 @@ internal abstract class Item
{ {
if (collection.Contains(item.ImageFileHolder.FullName)) if (collection.Contains(item.ImageFileHolder.FullName))
continue; continue;
result++;
results.Add(item); results.Add(item);
} }
return new(results, result); return results;
} }
} }