From ae23e803fa0b161038056eb3d365319ff5733db6 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Sun, 16 Mar 2025 22:22:29 -0700 Subject: [PATCH] added-logic-to-rename-to-3-and-7-like-should-ignore-for-missing-date-time-original --- Distance/Models/Stateless/MappedLogicA.cs | 2 +- Distance/Models/Stateless/MappedLogicB.cs | 95 +++++++++++++++-------- Metadata/Models/Stateless/Get.cs | 2 +- Shared/Models/Stateless/IId.cs | 17 +--- Shared/Models/Stateless/IPath.cs | 5 ++ Shared/Models/Stateless/Id.cs | 8 +- Shared/Models/Stateless/XPath.cs | 3 + 7 files changed, 78 insertions(+), 54 deletions(-) diff --git a/Distance/Models/Stateless/MappedLogicA.cs b/Distance/Models/Stateless/MappedLogicA.cs index bafc312..e9c5534 100644 --- a/Distance/Models/Stateless/MappedLogicA.cs +++ b/Distance/Models/Stateless/MappedLogicA.cs @@ -155,7 +155,7 @@ internal static class MappedLogicA internal static ReadOnlyCollection GetMapped(ResultSettings resultSettings, MetadataSettings metadataSettings, PeopleSettings peopleSettings, DistanceSettings distanceSettings, ICompareSettings compareSettings, ICompare compare, long ticks, ReadOnlyCollections readOnlyCollections) { List results = []; - string eDistanceContentDirectory = IResult.GetResultsDateGroupDirectory(resultSettings, nameof(E_Distance), resultSettings.ResultContent); + string eDistanceContentDirectory = Path.GetFullPath(IResult.GetResultsDateGroupDirectory(resultSettings, nameof(E_Distance), resultSettings.ResultContent)); ReadOnlyCollection records = MappedLogicB.DeleteEmptyDirectoriesAndGetCollection(resultSettings, metadataSettings, peopleSettings, distanceSettings, compareSettings, compare, ticks, eDistanceContentDirectory, readOnlyCollections); ReadOnlyCollection mappedFiles = GetMappedFiles(resultSettings, metadataSettings, peopleSettings, compareSettings, readOnlyCollections, records); if (mappedFiles.Count > 0) diff --git a/Distance/Models/Stateless/MappedLogicB.cs b/Distance/Models/Stateless/MappedLogicB.cs index 3180c70..aef7c3e 100644 --- a/Distance/Models/Stateless/MappedLogicB.cs +++ b/Distance/Models/Stateless/MappedLogicB.cs @@ -21,7 +21,6 @@ internal static class MappedLogicB internal record TicksDirectory(DateTime AlternateDirectoryDateTime, string Directory, DateTime DirectoryDateTime, - string DirectoryName, bool? IsLocationContainerDebugDirectory, float? TotalDays); @@ -85,13 +84,13 @@ internal static class MappedLogicB float? totalDays; long? next = null; string? checkDirectory; - string ticksDirectoryName; DateTime directoryDateTime; DirectoryInfo directoryInfo; TicksDirectory ticksDirectory; long? lastDirectoryTicks = null; DateTime dateTime = DateTime.Now; DateTime alternateDirectoryDateTime; + string ticksDirectoryNameFirstSegment; bool? isLocationContainerDebugDirectory; long month = dateTime.AddMonths(1).Ticks - dateTime.Ticks; for (int i = 1; i < 5; i++) @@ -101,10 +100,10 @@ internal static class MappedLogicB string[] ticksFullPaths = Directory.GetDirectories(eDistanceContentDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string ticksFullPath in ticksFullPaths) { - ticksDirectoryName = Path.GetFileName(ticksFullPath); - if (ticksDirectoryName.Length < 3) + ticksDirectoryNameFirstSegment = Path.GetFileName(ticksFullPath).Split('.')[0]; + if (ticksDirectoryNameFirstSegment.Length < 3) continue; - if (!long.TryParse(ticksDirectoryName, out long directoryTicks)) + if (!long.TryParse(ticksDirectoryNameFirstSegment, out long directoryTicks)) throw new NotSupportedException(); if (next is null) next = new DateTime(directoryTicks).Ticks; @@ -130,9 +129,9 @@ internal static class MappedLogicB if (directoryInfo.LastWriteTime.Ticks != directoryTicks) Directory.SetLastWriteTime(ticksFullPath, new DateTime(directoryTicks)); alternateDirectoryDateTime = new DateTime(directoryDateTime.Year, directoryDateTime.Month, directoryDateTime.Day).AddMonths(1); - isLocationContainerDebugDirectory = distanceSettings.LocationContainerDebugDirectory is null ? null : ticksDirectoryName.EndsWith(distanceSettings.LocationContainerDebugDirectory); + isLocationContainerDebugDirectory = distanceSettings.LocationContainerDebugDirectory is null ? null : ticksDirectoryNameFirstSegment.EndsWith(distanceSettings.LocationContainerDebugDirectory); totalDays = lastDirectoryTicks is null || new TimeSpan(dateTime.Ticks - directoryTicks).TotalDays < 1 ? null : (float)new TimeSpan(directoryTicks - lastDirectoryTicks.Value).TotalDays; - ticksDirectory = new(alternateDirectoryDateTime, ticksFullPath, new(directoryTicks), ticksDirectoryName, isLocationContainerDebugDirectory, totalDays); + ticksDirectory = new(alternateDirectoryDateTime, ticksFullPath, new(directoryTicks), isLocationContainerDebugDirectory, totalDays); results.Add(ticksDirectory); if (directoryDateTime.Hour == 0 && directoryDateTime.Minute == 0 && directoryDateTime.Second == 0) continue; @@ -217,9 +216,36 @@ internal static class MappedLogicB } } - private static List GetRecords(ResultSettings resultSettings, MetadataSettings metadataSettings, ICompareSettings compareSettings, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, int? linksCount, List distinct, string? personDisplayDirectoryName) + private static string GetCheckFile(TicksDirectory ticksDirectory, string @enum, string fileName, string file) + { + string result; + string checkDirectory; + string directory = file; + List collection = []; + for (int i = 0; i < file.Length; i++) + { + directory = Path.GetDirectoryName(directory) ?? throw new Exception(); + if (directory == ticksDirectory.Directory) + break; + collection.Add(Path.GetFileName(directory)); + } + collection.Reverse(); + checkDirectory = $"{ticksDirectory.Directory}.{@enum}"; + foreach (string directoryName in collection) + checkDirectory = Path.Combine(checkDirectory, directoryName); + if (!Directory.Exists(checkDirectory)) + _ = Directory.CreateDirectory(checkDirectory); + result = Path.Combine(checkDirectory, fileName); + if (File.Exists(result)) + throw new Exception($"File <{fileName}> already exists!"); + File.Move(file, result); + return result; + } + + private static List GetRecords(ResultSettings resultSettings, MetadataSettings metadataSettings, ICompareSettings compareSettings, TicksDirectory ticksDirectory, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, int? linksCount, List distinct, string? personDisplayDirectoryName) { List results = []; + string @enum; Record record; string fileName; string checkFile; @@ -246,8 +272,25 @@ internal static class MappedLogicB File.Move(file, checkFile); continue; } + if (file.StartsWith(ticksDirectory.Directory)) + { + @enum = IPath.GetEnum(filePath).ToString(); + if (!ticksDirectory.Directory.EndsWith(@enum)) + { + checkFile = GetCheckFile(ticksDirectory, @enum, fileName, file); + fileHolder = FileHolder.Get(checkFile); + filePath = FilePath.Get(resultSettings, metadataSettings, fileHolder, index: null); + if (filePath.Id is null) + continue; + } + } distinct.Add(fileName); - record = new(directoryNumber, isDefault, linksCount, filePath, personDisplayDirectoryName, personKeyFormatted); + record = new(DirectoryNumber: directoryNumber, + IsDefault: isDefault, + LinksCount: linksCount, + MappedFaceFilePath: filePath, + PersonDisplayDirectoryName: personDisplayDirectoryName, + PersonKeyFormatted: personKeyFormatted); results.Add(record); } return results; @@ -314,6 +357,7 @@ internal static class MappedLogicB DateTime dateTime; TimeSpan timeSpan; int directoryNumber; + List records; string? checkDirectory; string[] yearDirectories; string personKeyFormatted; @@ -327,8 +371,8 @@ internal static class MappedLogicB string? personFirstInitialDirectory; List ticksDirectories; string[] personKeyFormattedDirectories; - string manualCopyHumanized = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy).Humanize(LetterCasing.Title); - string forceSingleImageHumanized = nameof(Shared.Models.Stateless.IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title); + string manualCopyHumanized = nameof(IMapLogic.ManualCopy).Humanize(LetterCasing.Title); + string forceSingleImageHumanized = nameof(IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title); for (int i = 1; i < 6; i++) { check = false; @@ -347,11 +391,11 @@ internal static class MappedLogicB foreach (string personKeyFormattedDirectory in personKeyFormattedDirectories) { personKeyFormatted = Path.GetFileName(personKeyFormattedDirectory); - isReservedDirectoryName = personKeyFormatted.StartsWith(nameof(Shared.Models.Stateless.IMapLogic.Sorting)) || personKeyFormatted.StartsWith(nameof(Shared.Models.Stateless.IMapLogic.Mapping)) || personKeyFormatted.StartsWith(nameof(Shared.Models.Stateless.IMapLogic.ManualCopy)); - if (!isReservedDirectoryName && personKeyFormatted.StartsWith(nameof(Shared.Models.Stateless.IMapLogic.Individually))) + isReservedDirectoryName = personKeyFormatted.StartsWith(nameof(IMapLogic.Sorting)) || personKeyFormatted.StartsWith(nameof(IMapLogic.Mapping)) || personKeyFormatted.StartsWith(nameof(IMapLogic.ManualCopy)); + if (!isReservedDirectoryName && personKeyFormatted.StartsWith(nameof(IMapLogic.Individually))) { Individually(compareSettings, ticksDirectory, personKeyFormattedDirectory); - throw new Exception($"B) Move personKey directories up one from {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} and delete {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} directory!"); + throw new Exception($"B) Move personKey directories up one from {nameof(IMapLogic.Sorting)} and delete {nameof(IMapLogic.Sorting)} directory!"); } _ = readOnlyCollections.PersonKeyFormattedToNewestPersonKeyFormatted.TryGetValue(personKeyFormatted, out newestPersonKeyFormatted); if (readOnlyCollections.PersonKeyFormattedToNewestPersonKeyFormatted.Count > 0 && newestPersonKeyFormatted is null) @@ -369,23 +413,6 @@ internal static class MappedLogicB linksCount = null; else linksCount = GetLinksCount(yearDirectory); - if (ticksDirectory.DirectoryName != distanceSettings.LocationContainerDebugDirectory) - { - files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly); - foreach (string file in files) - File.Delete(file); - } - if (ticksDirectory.DirectoryName == distanceSettings.LocationContainerDebugDirectory) - { - isDefault = null; - personDisplayDirectoryName = null; - files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly); - results.AddRange(GetRecords(resultSettings, metadataSettings, compareSettings, isDefault, files, directoryNumber, personKeyFormatted, linksCount, distinct, personDisplayDirectoryName)); - files = Directory.GetFiles(yearDirectory, "*.lnk", SearchOption.AllDirectories); - foreach (string file in files) - File.Delete(file); - continue; - } personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly); if (personNameDirectories.Length > 1) throw new NotSupportedException("Try deleting *.lnk files!"); @@ -428,7 +455,7 @@ internal static class MappedLogicB } files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly); if (isReservedDirectoryName && files.Length > 0) - throw new Exception($"Move personKey directories up one from {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} and delete {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} directory!"); + throw new Exception($"Move personKey directories up one from {nameof(IMapLogic.Sorting)} and delete {nameof(IMapLogic.Sorting)} directory!"); if (personKeyFormatted == manualCopyHumanized && files.Length > 0) throw new Exception($"Move personKey directories up one from {manualCopyHumanized} and delete {manualCopyHumanized} directory!"); if (personKeyFormatted == forceSingleImageHumanized && files.Length > 0) @@ -468,7 +495,9 @@ internal static class MappedLogicB Directory.Move(personNameDirectory, personFirstInitialDirectory); files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); } - results.AddRange(GetRecords(resultSettings, metadataSettings, compareSettings, isDefault, files, directoryNumber, personKeyFormatted, linksCount, distinct, personDisplayDirectoryName)); + records = GetRecords(resultSettings, metadataSettings, compareSettings, ticksDirectory, isDefault, files, directoryNumber, personKeyFormatted, linksCount, distinct, personDisplayDirectoryName); + if (records.Count > 0) + results.AddRange(records); personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string personNameLinkDirectory in personNameLinkDirectories) { diff --git a/Metadata/Models/Stateless/Get.cs b/Metadata/Models/Stateless/Get.cs index 916837e..42d105f 100644 --- a/Metadata/Models/Stateless/Get.cs +++ b/Metadata/Models/Stateless/Get.cs @@ -63,8 +63,8 @@ internal static class Get MetadataGroup metadataGroup; DeterministicHashCode deterministicHashCode; FileHolder fileHolder = FileHolder.Get(file); - MinimumYearAndPathCombined minimumYearAndPathCombined; bool fastForwardMovingPictureExpertsGroupUsed; + MinimumYearAndPathCombined minimumYearAndPathCombined; FilePath? fastForwardMovingPictureExpertsGroupFilePath; ReadOnlyCollection? fastForwardMovingPictureExpertsGroupFiles; FilePath filePath = FilePath.Get(resultSettings, metadataSettings, fileHolder, index: null); diff --git a/Shared/Models/Stateless/IId.cs b/Shared/Models/Stateless/IId.cs index 243b73e..2c9464b 100644 --- a/Shared/Models/Stateless/IId.cs +++ b/Shared/Models/Stateless/IId.cs @@ -23,29 +23,16 @@ public interface IId static string GetPaddedId(ResultSettings resultSettings, MetadataSettings metadataSettings, int id, bool? hasIgnoreKeyword, bool? hasDateTimeOriginal, int? index) => Id.GetPaddedId(resultSettings, metadataSettings, id, hasIgnoreKeyword, hasDateTimeOriginal, index); - string TestStatic_GetIgnoreFullPath(FilePath filePath, FileHolder fileHolder) => - GetIgnoreFullPath(filePath, fileHolder); - static string GetIgnoreFullPath(FilePath filePath, FileHolder fileHolder) => - fileHolder.DirectoryFullPath is null ? - throw new NotSupportedException() : - filePath.Id > -1 ? - fileHolder.NameWithoutExtension[^1] == '9' ? - Path.Combine(fileHolder.DirectoryFullPath, $"{fileHolder.NameWithoutExtension[..^1]}8{fileHolder.ExtensionLowered}") : - throw new NotSupportedException("High") : - fileHolder.NameWithoutExtension[^1] == '1' ? - Path.Combine(fileHolder.DirectoryFullPath, $"{fileHolder.NameWithoutExtension[..^1]}2{fileHolder.ExtensionLowered}") : - throw new NotSupportedException("Low"); - bool TestStatic_NameWithoutExtensionIsIntelligentIdFormat(MetadataSettings metadataSettings, string fileNameFirstSegment) => NameWithoutExtensionIsIntelligentIdFormat(metadataSettings, fileNameFirstSegment); static bool NameWithoutExtensionIsIntelligentIdFormat(MetadataSettings metadataSettings, string fileNameFirstSegment) => - fileNameFirstSegment.Length - 1 == metadataSettings.IntMinValueLength && fileNameFirstSegment[^1] is '1' or '2' or '8' or '9' && fileNameFirstSegment.All(char.IsNumber); + fileNameFirstSegment.Length - 1 == metadataSettings.IntMinValueLength && fileNameFirstSegment[^1] is '1' or '2' or '3' or '7' or '8' or '9' && fileNameFirstSegment.All(char.IsNumber); bool TestStatic_NameWithoutExtensionIsPaddedIntelligentIdFormat(MetadataSettings metadataSettings, int sortOrderOnlyLengthIndex, string fileNameFirstSegment) => NameWithoutExtensionIsPaddedIntelligentIdFormat(metadataSettings, sortOrderOnlyLengthIndex, fileNameFirstSegment); static bool NameWithoutExtensionIsPaddedIntelligentIdFormat(MetadataSettings metadataSettings, int sortOrderOnlyLengthIndex, string fileNameFirstSegment) => fileNameFirstSegment.Length == metadataSettings.IntMinValueLength + sortOrderOnlyLengthIndex + 1 - && fileNameFirstSegment[^1] is '1' or '2' or '8' or '9' + && fileNameFirstSegment[^1] is '1' or '2' or '3' or '7' or '8' or '9' && fileNameFirstSegment.All(char.IsNumber); bool TestStatic_NameWithoutExtensionIsIdFormat(MetadataSettings metadataSettings, FileHolder fileHolder) => diff --git a/Shared/Models/Stateless/IPath.cs b/Shared/Models/Stateless/IPath.cs index 5cfe754..e63ae5b 100644 --- a/Shared/Models/Stateless/IPath.cs +++ b/Shared/Models/Stateless/IPath.cs @@ -71,4 +71,9 @@ public interface IPath static ReadOnlyDictionary>>> GetKeyValuePairs(ResultSettings resultSettings, string? resultsFullGroupDirectory, string[]? jsonGroups) => XPath.GetKeyValuePairs(resultSettings, resultsFullGroupDirectory, jsonGroups); + byte TestStatic_GetEnum(FilePath filePath) => + GetEnum(filePath); + static byte GetEnum(FilePath filePath) => + XPath.GetEnum(filePath); + } \ No newline at end of file diff --git a/Shared/Models/Stateless/Id.cs b/Shared/Models/Stateless/Id.cs index e1c02d6..e3007ae 100644 --- a/Shared/Models/Stateless/Id.cs +++ b/Shared/Models/Stateless/Id.cs @@ -28,9 +28,9 @@ internal abstract class Id _ = results.Append(intelligentId[i]); _ = results.Append(intelligentId[^3]).Append(intelligentId[^2]); result = int.Parse(results.ToString()); - if (intelligentId[^1] is '1' or '2') + if (intelligentId[^1] is '1' or '2' or '3') result *= -1; - else if (intelligentId[^1] is not '9' and not '8') + else if (intelligentId[^1] is not '9' and not '8' and not '7') throw new NotSupportedException(); return result; } @@ -48,12 +48,12 @@ internal abstract class Id List resultAllInOneSubdirectoryChars = []; if (id > -1) { - key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 8 : 9; + key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 8 : hasDateTimeOriginal is not null && hasDateTimeOriginal.Value ? 9 : 7; value = id.ToString().PadLeft(metadataSettings.IntMinValueLength, '0'); } else { - key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 2 : 1; + key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 2 : hasDateTimeOriginal is not null && hasDateTimeOriginal.Value ? 1 : 3; value = id.ToString()[1..].PadLeft(metadataSettings.IntMinValueLength, '0'); } for (int i = value.Length - resultSettings.ResultAllInOneSubdirectoryLength - 1; i > -1; i--) diff --git a/Shared/Models/Stateless/XPath.cs b/Shared/Models/Stateless/XPath.cs index 2985c3b..4986a0f 100644 --- a/Shared/Models/Stateless/XPath.cs +++ b/Shared/Models/Stateless/XPath.cs @@ -291,6 +291,9 @@ internal abstract class XPath return result; } + internal static byte GetEnum(FilePath filePath) => + GetEnum(filePath.HasIgnoreKeyword, filePath.HasDateTimeOriginal); + private static CombinedEnumAndIndex GetCombinedEnumAndIndex(int resultAllInOneSubdirectoryLength, FilePath filePath, string fileNameWithoutExtension) { CombinedEnumAndIndex result;