using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Phares.Shared; using ShellProgressBar; using System.Collections.ObjectModel; using System.Text; using System.Text.Json; using View_by_Distance.Metadata.Query.Models; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Methods; namespace View_by_Distance.Metadata.Query; public class MetadataQuery { private readonly AppSettings _AppSettings; private readonly string _WorkingDirectory; private readonly Configuration _Configuration; private readonly IsEnvironment _IsEnvironment; private readonly IConfigurationRoot _ConfigurationRoot; private readonly Property.Models.Configuration _PropertyConfiguration; public MetadataQuery(List args, ILogger logger, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console) { if (isSilent) { } if (console is null) { } _AppSettings = appSettings; _IsEnvironment = isEnvironment; long ticks = DateTime.Now.Ticks; _WorkingDirectory = workingDirectory; _ConfigurationRoot = configurationRoot; Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; logger?.LogInformation(propertyConfiguration.RootDirectory); Verify(); MetadataQueryFilesInDirectories(logger, ticks); } private void Verify() { if (_AppSettings is null) { } if (_IsEnvironment is null) { } if (_Configuration is null) { } if (_ConfigurationRoot is null) { } if (_WorkingDirectory is null) { } if (_PropertyConfiguration is null) { } } private List<(string FileName, string TagGroup, string TagIdName, string Value)> GetCollection(long ticks) { string json; string model; string maker; string message; FileInfo fileInfo; ProgressBar progressBar; ExifDirectory? exifDirectory; const string fileSearchFilter = "*"; const bool useCeilingAverage = true; const string directorySearchFilter = "*"; List<(string FileName, string TagGroup, string TagIdName, string Value)> collection = []; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ReadOnlyCollection filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); foreach (string[] files in filesCollection) { if (files.Length == 0) continue; message = $"{ticks}) Reading files for <{files.FirstOrDefault()}> - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)"; progressBar = new(files.Length, message, options); foreach (string file in files) { progressBar.Tick(); fileInfo = new(file); json = File.ReadAllText(fileInfo.FullName); exifDirectory = JsonSerializer.Deserialize(json, ExifDirectorySourceGenerationContext.Default.ExifDirectory); if (exifDirectory is null) continue; maker = Metadata.Models.Stateless.Methods.IMetadata.GetMaker(exifDirectory); model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(exifDirectory); // collection.Add(new(fileInfo.Name, keyValuePair.Key, keyValue.Key, keyValue.Value)); } progressBar.Dispose(); } return collection; } private void MetadataQueryFilesInDirectories(ILogger? logger, long ticks) { List<(string FileName, string TagGroup, string TagIdName, string Value)> collection = GetCollection(ticks); logger?.LogInformation($"Ready to query {collection.Count} entries?"); IEnumerable<(string FileName, string TagGroup, string TagIdName, string Value)> enumerable() { foreach ((string FileName, string TagGroup, string TagIdName, string Value) l in collection) { if (l.TagIdName.StartsWith("42016\t") && l.Value != "00000000000000000000000000000000") { yield return l; } } } List<(string FileName, string TagGroup, string TagIdName, string Value)> matches = enumerable().ToList(); if (matches.Count != 0) { matches.Sort(); StringBuilder stringBuilder = new(); // foreach (KeyValuePair> keyValuePair in keyValuePairs) // { // if (keyValuePair.Value.Count != 2) // continue; // foreach (string line in keyValuePair.Value) // _ = stringBuilder.AppendLine(line); // } string checkFile = $"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv"; string text = stringBuilder.ToString(); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(checkFile, text, updateToWhenMatches: null, compareBeforeWrite: true, updateDateWhenMatches: false); } } }