133 lines
5.9 KiB
C#
133 lines
5.9 KiB
C#
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.Logging;
|
|
using Phares.Shared;
|
|
using ShellProgressBar;
|
|
using System.Collections.ObjectModel;
|
|
using System.Text;
|
|
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 message;
|
|
FileInfo fileInfo;
|
|
FilePath filePath;
|
|
FileHolder fileHolder;
|
|
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);
|
|
fileHolder = FileHolder.Get(fileInfo);
|
|
filePath = FilePath.Get(_PropertyConfiguration, fileHolder, index: null);
|
|
exifDirectory = Metadata.Models.Stateless.Methods.IMetadata.GetExifDirectory(filePath);
|
|
// exifDirectory.ExifDirectoryBase.Artist;
|
|
// exifDirectory.ExifDirectoryBase.WinComment;
|
|
// exifDirectory.ExifDirectoryBase.Model;
|
|
// exifDirectory.ExifDirectoryBase.CameraOwnerName;
|
|
// exifDirectory.ExifDirectoryBase.Make;
|
|
// exifDirectory.ExifDirectoryBase.BodySerialNumber;
|
|
// exifDirectory.ExifDirectoryBase.LensSerialNumber;
|
|
// exifDirectory.ExifDirectoryBase.Software;
|
|
// 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);
|
|
}
|
|
}
|
|
|
|
} |