aa/Rename/Rename.cs

125 lines
5.8 KiB
C#

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using ShellProgressBar;
using View_by_Distance.Metadata.Models;
using View_by_Distance.Rename.Models;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Rename;
public class Rename
{
private readonly AppSettings _AppSettings;
private readonly Configuration _Configuration;
private readonly IConfigurationRoot _ConfigurationRoot;
private readonly MetadataConfiguration _MetadataConfiguration;
public Rename(List<string> args, ILogger<Program>? logger, IConfigurationRoot configurationRoot, AppSettings appSettings, bool isSilent, IConsole console)
{
if (isSilent)
{ }
if (args is null)
throw new NullReferenceException(nameof(args));
if (console is null)
throw new NullReferenceException(nameof(console));
_AppSettings = appSettings;
long ticks = DateTime.Now.Ticks;
_ConfigurationRoot = configurationRoot;
MetadataConfiguration metadataConfiguration = Metadata.Models.Binder.Configuration.Get(configurationRoot);
Configuration configuration = Models.Binder.Configuration.Get(configurationRoot, metadataConfiguration);
_MetadataConfiguration = metadataConfiguration;
_Configuration = configuration;
DirectoryInfo directoryInfo = new(Path.GetFullPath(metadataConfiguration.RootDirectory));
logger?.LogInformation("{RootDirectory}", directoryInfo.FullName);
MetadataConfiguration.Verify(metadataConfiguration, requireExist: false);
Verify();
List<string> linesB = RenameFilesInDirectories(logger, ticks, directoryInfo);
if (linesB.Count != 0)
{
File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", linesB);
_ = IPath.DeleteEmptyDirectories(directoryInfo.FullName);
}
}
private void Verify()
{
if (_AppSettings is null)
throw new NullReferenceException(nameof(_AppSettings));
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
if (_ConfigurationRoot is null)
throw new NullReferenceException(nameof(_ConfigurationRoot));
if (_MetadataConfiguration is null)
throw new NullReferenceException(nameof(_MetadataConfiguration));
}
private bool GetRunToDoCollectionFirst(long ticks, DirectoryInfo directoryInfo)
{
bool result = false;
string[] directories;
string seasonDirectory;
DateTime dateTime = new(ticks);
(int season, string seasonName) = IDate.GetSeason(dateTime.DayOfYear);
string eDistanceContentDirectory = IResult.GetResultsDateGroupDirectory(_MetadataConfiguration, nameof(A_Metadata), _MetadataConfiguration.ResultContent);
FileSystemInfo fileSystemInfo = new DirectoryInfo(eDistanceContentDirectory);
string[] checkDirectories =
[
Path.Combine(directoryInfo.FullName, "Ancestry"),
Path.Combine(directoryInfo.FullName, "Facebook"),
Path.Combine(directoryInfo.FullName, "LinkedIn"),
directoryInfo.FullName,
];
foreach (string checkDirectory in checkDirectories)
{
if (checkDirectory == directoryInfo.FullName)
seasonDirectory = Path.Combine(checkDirectory, $"{dateTime.Year}.{season} {seasonName}");
else
seasonDirectory = Path.Combine(checkDirectory, $"{dateTime.Year}.{season} {seasonName} {Path.GetFileName(checkDirectory)}");
if (!Directory.Exists(seasonDirectory))
_ = Directory.CreateDirectory(seasonDirectory);
if (result)
continue;
directories = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
if (new DirectoryInfo(directory).LastWriteTime > fileSystemInfo.LastWriteTime)
{
result = true;
break;
}
}
}
return result;
}
private List<string> RenameFilesInDirectories(ILogger? logger, long ticks, DirectoryInfo directoryInfo)
{
List<string> old = [];
List<ExifDirectory> exifDirectories = [];
bool runToDoCollectionFirst = GetRunToDoCollectionFirst(ticks, directoryInfo);
IEnumerable<string> files = Directory.EnumerateFiles(directoryInfo.FullName, "*", SearchOption.AllDirectories);
A_Metadata metadata = new(_MetadataConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata);
if (runToDoCollectionFirst)
{
foreach (string file in files)
{
NameWithoutExtension nameWithoutExtension = IId.GetNameWithoutExtension(_MetadataConfiguration, file);
exifDirectories.Add(metadata.GetMetadataCollection(_MetadataConfiguration, file, nameWithoutExtension));
if (nameWithoutExtension.Id is null || (!nameWithoutExtension.IsIdFormat && !nameWithoutExtension.IsPaddedIdFormat))
;
}
}
else
{
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism };
ProgressBar progressBar = new(123000, "EnumerateFiles load", new ProgressBarOptions() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true });
files.AsParallel().ForAll(A_Metadata.GetResultCollection(_MetadataConfiguration, metadata, exifDirectories, () => progressBar.Tick()));
if (progressBar.CurrentTick != exifDirectories.Count)
throw new NotSupportedException();
}
return old;
}
}