Changed GetDimensions to handle a stream at the end and one exit Switched to using Action? over IDlibDotNet for Tick method Switched to using AsReadOnly over new() Moved Meta Base to Shared
130 lines
5.6 KiB
C#
130 lines
5.6 KiB
C#
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<string> args, ILogger<Program> 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<string[]> 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 = Shared.Models.Stateless.Methods.IMetaBase.GetMaker(exifDirectory);
|
|
model = Shared.Models.Stateless.Methods.IMetaBase.GetModel(exifDirectory);
|
|
// collection.Add(new(fileInfo.Name, keyValuePair.Key, keyValue.Key, keyValue.Value));
|
|
}
|
|
progressBar.Dispose();
|
|
}
|
|
return collection;
|
|
}
|
|
|
|
private void MetadataQueryFilesInDirectories(ILogger<Program>? 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<string, List<string>> 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);
|
|
}
|
|
}
|
|
|
|
} |