From 192d2ad7767ca4329a36b3171288b6b3ebc3a976 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Wed, 21 Sep 2022 13:55:57 -0700 Subject: [PATCH] Save Url and Get New Root Directory --- Compare/Compare.cs | 2 +- Date-Group/DateGroup.cs | 2 +- Instance/DlibDotNet.cs | 97 ++++++++++++++++++++++---- Not-Copy-Copy/Not-Copy-Copy.cs | 2 +- PrepareForOld/PrepareForOld.cs | 2 +- Property/Models/Configuration.cs | 4 +- Property/Models/Stateless/Container.cs | 19 ++--- Shared/Models/Item.cs | 6 +- 8 files changed, 107 insertions(+), 27 deletions(-) diff --git a/Compare/Compare.cs b/Compare/Compare.cs index 2931b86..a6130f7 100644 --- a/Compare/Compare.cs +++ b/Compare/Compare.cs @@ -47,7 +47,7 @@ public class Compare List topDirectories = new(); List<(int g, string sourceDirectory, string[] sourceDirectoryFiles)> groupCollection; Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); - Property.Models.Configuration.Verify(propertyConfiguration); + Property.Models.Configuration.Verify(propertyConfiguration, requireExist: true); Models.Configuration configuration = Models.Stateless.Configuration.Get(isEnvironment, configurationRoot, workingDirectory, propertyConfiguration); Verify(configuration); Model? model = null; diff --git a/Date-Group/DateGroup.cs b/Date-Group/DateGroup.cs index 824f484..545d3b3 100644 --- a/Date-Group/DateGroup.cs +++ b/Date-Group/DateGroup.cs @@ -36,7 +36,7 @@ public class DateGroup _FileKeyValuePairs = new List>(); _FilePropertiesKeyValuePairs = new Dictionary>>(); Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); - Property.Models.Configuration.Verify(propertyConfiguration); + Property.Models.Configuration.Verify(propertyConfiguration, requireExist: true); Models.Configuration configuration = Models.Stateless.Configuration.Get(isEnvironment, configurationRoot, workingDirectory, propertyConfiguration); Verify(configuration); bool reverse = false; diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 417ad2d..2578ebd 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -24,6 +24,7 @@ public partial class DlibDotNet private readonly C_Resize _Resize; private readonly F_Random _Random; private readonly E3_Rename _Rename; + private readonly IConsole _Console; private readonly B_Metadata _Metadata; private readonly Serilog.ILogger? _Log; private readonly D2_FaceParts _FaceParts; @@ -38,6 +39,7 @@ public partial class DlibDotNet public DlibDotNet(List args, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console) { + _Console = console; string argZero; string message; _AppSettings = appSettings; @@ -50,7 +52,7 @@ public partial class DlibDotNet _FilePropertiesKeyValuePairs = new Dictionary>>(); Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); _Log.Information(propertyConfiguration.RootDirectory); - Property.Models.Configuration.Verify(propertyConfiguration); + Property.Models.Configuration.Verify(propertyConfiguration, requireExist: false); Models.Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); Verify(configuration); VerifyExtra(args, propertyConfiguration, configuration); @@ -64,10 +66,7 @@ public partial class DlibDotNet string propertyRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(propertyConfiguration, nameof(A_Property), create: false); _FirstRun = !Directory.Exists(propertyRoot); _Metadata = new(configuration.ForceMetadataLastWriteTimeToCreationTime, configuration.PropertiesChangedForMetadata); - if (args.Count > 0) - argZero = Path.GetFullPath(args[0]); - else - argZero = Path.GetFullPath(propertyConfiguration.RootDirectory); + argZero = args.Count > 0 ? Path.GetFullPath(args[0]) : Path.GetFullPath(propertyConfiguration.RootDirectory); _ArgZeroIsConfigurationRootDirectory = propertyConfiguration.RootDirectory == argZero; _Log.Information(configuration.ModelDirectory); (Model model, PredictorModel predictorModel, ModelParameter modelParameter) = GetModel(configuration); @@ -666,7 +665,7 @@ public partial class DlibDotNet for (int y = 0; y < int.MaxValue; y++) { _Log.Information("Press \"Y\" key when ready to continue or close console"); - if (System.Console.ReadKey().Key == ConsoleKey.Y) + if (_Console.ReadKey() == ConsoleKey.Y) break; } _Log.Information(". . ."); @@ -756,6 +755,72 @@ public partial class DlibDotNet mapLogic.SaveShortcuts(_Configuration.JuliePhares, distinctFilteredFaces); } + private static Container? AreAllSameStartsWith(string argZero, Container[] containers) + { + Container? result = null; + string[] directoryNames = Shared.Models.Stateless.Methods.IPath.GetDirectoryNames(argZero); + if (directoryNames.Length > 2) + { + string directoryName; + string rootDirectoryName = directoryNames[^2]; + if (!Directory.Exists(argZero)) + throw new Exception(); + foreach (Container container in containers) + { + if (container.SourceDirectory == argZero) + result = container; + directoryName = Path.GetFileName(container.SourceDirectory); + if (!directoryName.StartsWith(rootDirectoryName)) + { + result = null; + break; + } + } + } + return result; + } + + private string SaveUrlAndGetNewRootDirectory(Container container) + { + if (_Log is null) + throw new NullReferenceException(nameof(_Log)); + string? result = Path.GetDirectoryName(Path.GetDirectoryName(container.SourceDirectory)); + if (result is null) + throw new Exception(); + Uri uri; + Item item; + string? line; + string fileName; + Task task; + string relativePath; + string extensionLowered; + string sourceDirectoryFile; + int length = result.Length; + HttpClient httpClient = new(); + bool isValidImageFormatExtension; + for (int y = 0; y < int.MaxValue; y++) + { + _Log.Information("Enter a url for a image"); + line = _Console.ReadLine(); + if (string.IsNullOrEmpty(line)) + break; + uri = new(line); + if (uri.HostNameType != UriHostNameType.Dns) + continue; + task = httpClient.GetByteArrayAsync(uri); + fileName = Path.GetFileName(uri.LocalPath); + sourceDirectoryFile = Path.Combine(container.SourceDirectory, fileName); + File.WriteAllBytes(sourceDirectoryFile, task.Result); + extensionLowered = Path.GetExtension(uri.LocalPath); + relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFile, length, forceExtensionToLower: true); + isValidImageFormatExtension = _Configuration.PropertyConfiguration.ValidImageFormatExtensions.Contains(extensionLowered); + item = new(sourceDirectoryFile, relativePath, isValidImageFormatExtension); + container.Items.Add(item); + } + _Log.Information(". . ."); + return result; + } + private void Search(long ticks, Model? model, PredictorModel? predictorModel, string argZero, string propertyRoot, PersonContainer[] personContainers) { int j; @@ -768,22 +833,30 @@ public partial class DlibDotNet string dResultsFullGroupDirectory; string eResultsFullGroupDirectory; string d2ResultsFullGroupDirectory; - A_Property propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, model, predictorModel); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); string message = $") Building Container(s) - {totalSeconds} total second(s)"; + A_Property propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, model, predictorModel); ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; using (ProgressBar progressBar = new(1, message, options)) { progressBar.Tick(); - if (string.IsNullOrEmpty(_Configuration.PropertyConfiguration.RootDirectory)) - (j, f, t, containers) = A_Property.Get(_Configuration.PropertyConfiguration, propertyLogic); - else - (j, f, t, containers) = Property.Models.Stateless.Container.GetContainers(_Configuration.PropertyConfiguration, _FirstRun, propertyLogic); + (j, f, t, containers) = Property.Models.Stateless.Container.GetContainers(_Configuration.PropertyConfiguration, _FirstRun, propertyLogic); + } + Container? container = AreAllSameStartsWith(argZero, containers); + if (_ArgZeroIsConfigurationRootDirectory && container is not null) + { + string? newRootDirectory = SaveUrlAndGetNewRootDirectory(container); + for (int i = 1; i < 10; i++) + _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(Property.Models.Stateless.IResult.GetResultsGroupDirectory(_Configuration.PropertyConfiguration, string.Empty, create: true)); + argZero = newRootDirectory; + _Configuration.PropertyConfiguration.ChangeRootDirectory(newRootDirectory); + propertyRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(_Configuration.PropertyConfiguration, nameof(A_Property), create: false); + propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, model, predictorModel); } FullDoWork(argZero, model, predictorModel, propertyRoot, ticks, propertyLogic, t, containers); foreach (string outputResolution in _Configuration.OutputResolutions) { - if (_FirstRun) + if (_FirstRun || container is not null) break; (aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, eResultsFullGroupDirectory) = GetResultsFullGroupDirectories(model, predictorModel, outputResolution); if (_ArgZeroIsConfigurationRootDirectory && _Configuration.SaveResizedSubfiles && outputResolution == _Configuration.OutputResolutions[0] && _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution) && _Exceptions.Count == 0) diff --git a/Not-Copy-Copy/Not-Copy-Copy.cs b/Not-Copy-Copy/Not-Copy-Copy.cs index 4b4e67f..8ff41fb 100644 --- a/Not-Copy-Copy/Not-Copy-Copy.cs +++ b/Not-Copy-Copy/Not-Copy-Copy.cs @@ -27,7 +27,7 @@ public class NotCopyCopy _IsEnvironment = isEnvironment; _Log = Serilog.Log.ForContext(); Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); - Property.Models.Configuration.Verify(propertyConfiguration); + Property.Models.Configuration.Verify(propertyConfiguration, requireExist: true); Models.Configuration configuration = Models.Stateless.Configuration.Get(isEnvironment, configurationRoot, workingDirectory, propertyConfiguration); Verify(configuration); bool reverse = false; diff --git a/PrepareForOld/PrepareForOld.cs b/PrepareForOld/PrepareForOld.cs index ccf77d7..ea47183 100644 --- a/PrepareForOld/PrepareForOld.cs +++ b/PrepareForOld/PrepareForOld.cs @@ -35,7 +35,7 @@ public class PrepareForOld _FileKeyValuePairs = new List>(); _FilePropertiesKeyValuePairs = new Dictionary>>(); Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); - Property.Models.Configuration.Verify(propertyConfiguration); + Property.Models.Configuration.Verify(propertyConfiguration, requireExist: true); Configuration configuration = Models.Stateless.Configuration.Get(isEnvironment, configurationRoot, workingDirectory, propertyConfiguration); Verify(configuration); if (propertyConfiguration.IgnoreExtensions is null) diff --git a/Property/Models/Configuration.cs b/Property/Models/Configuration.cs index c0638d7..dda6c63 100644 --- a/Property/Models/Configuration.cs +++ b/Property/Models/Configuration.cs @@ -77,7 +77,7 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration public void ChangeRootDirectory(string rootDirectory) => _RootDirectory = rootDirectory; - public static void Verify(Configuration propertyConfiguration) + public static void Verify(Configuration propertyConfiguration, bool requireExist) { if (propertyConfiguration is null) throw new NullReferenceException(nameof(propertyConfiguration)); @@ -101,7 +101,7 @@ public class Configuration : Shared.Models.Properties.IPropertyConfiguration throw new NullReferenceException(nameof(propertyConfiguration.FileNameDirectorySeparator)); if (string.IsNullOrEmpty(propertyConfiguration.Pattern)) throw new NullReferenceException(nameof(propertyConfiguration.Pattern)); - if (string.IsNullOrEmpty(propertyConfiguration.RootDirectory) || !Directory.Exists(propertyConfiguration.RootDirectory)) + if (string.IsNullOrEmpty(propertyConfiguration.RootDirectory) || (requireExist && !Directory.Exists(propertyConfiguration.RootDirectory))) throw new NullReferenceException(nameof(propertyConfiguration.RootDirectory)); } diff --git a/Property/Models/Stateless/Container.cs b/Property/Models/Stateless/Container.cs index 8c1716a..abe9284 100644 --- a/Property/Models/Stateless/Container.cs +++ b/Property/Models/Stateless/Container.cs @@ -15,7 +15,11 @@ public class Container string[] sourceDirectoryFiles; List fileCollections = new(); if (!topDirectories.Any()) + { + if (!Directory.Exists(rootDirectory)) + _ = Directory.CreateDirectory(rootDirectory); topDirectories.AddRange(from l in Directory.GetDirectories(rootDirectory, "*", SearchOption.TopDirectoryOnly) select Path.GetFullPath(l)); + } for (int g = 1; g < 5; g++) { if (g == 4) @@ -76,14 +80,8 @@ public class Container { if (sourceDirectoryFiles.Any() || Directory.GetDirectories(subDirectory, "*", SearchOption.TopDirectoryOnly).Any()) results.Add(new(g, subDirectory, sourceDirectoryFiles)); - else if (searchPattern == "*") - { - sourceDirectoryFiles = Directory.GetFiles(subDirectory, searchPattern, SearchOption.TopDirectoryOnly); - result += sourceDirectoryFiles.Length; - foreach (string subFile in sourceDirectoryFiles) - File.Delete(subFile); + else if (searchPattern == "*" && subDirectory != rootDirectory) Directory.Delete(subDirectory); - } } } fileCollections.Reverse(); @@ -172,6 +170,11 @@ public class Container { foreach (FileHolder sourceDirectoryFileHolder in sourceDirectoryFileHolderCollection) { + if (sourceDirectory.Contains("Facebook")) + { + if (sourceDirectory.Contains("Facebook")) + { } + } relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFileHolder.FullName, length, forceExtensionToLower: true); fileHolderKeyValuePairs.Add(relativePath, new(sourceDirectory, sourceDirectoryFileHolder)); } @@ -247,7 +250,7 @@ public class Container item = new(sourceDirectoryFileHolder.FullName, relativePath, sourceDirectoryFileHolder, isValidImageFormatExtension, null, null, null); items.Add(item); } - if (items.Any()) + if (sourceDirectory == configuration.RootDirectory || items.Any()) { if (!keyValuePairs.ContainsKey(sourceDirectory)) { diff --git a/Shared/Models/Item.cs b/Shared/Models/Item.cs index 5eec194..49525f0 100644 --- a/Shared/Models/Item.cs +++ b/Shared/Models/Item.cs @@ -45,7 +45,7 @@ public class Item : Properties.IItem _ValidImageFormatExtension = validImageFormatExtension; } - public Item(string sourceDirectoryFile, string relativePath, FileHolder? imageFileInfo, bool isValidImageFormatExtension, Property? property, bool? abandoned, bool? changed) + public Item(string sourceDirectoryFile, string relativePath, FileHolder imageFileInfo, bool isValidImageFormatExtension, Property? property, bool? abandoned, bool? changed) { _Faces = new(); _Changed = changed; @@ -62,6 +62,10 @@ public class Item : Properties.IItem throw new ArgumentException("Can not be a *.json file!"); } + public Item(string sourceDirectoryFile, string relativePath, bool isValidImageFormatExtension) : + this(sourceDirectoryFile, relativePath, new(sourceDirectoryFile), isValidImageFormatExtension, null, null, null) + { } + public override string ToString() { string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });