Offset-Date-Time-Original

Rename updates again
Mirror-Length in place
Delete-By-Distinct long to string
Copy-Distinct handle move and move back
This commit is contained in:
2023-07-02 17:57:50 -07:00
parent 131d24882e
commit d23398db7a
28 changed files with 1148 additions and 341 deletions

View File

@ -3,7 +3,7 @@
"ComparePathsFile": "C:/Users/mikep/AppData/Local/PharesApps/Drag-Drop-Explorer/2023_21/638202586000194405.json",
"Windows": {
"Configuration": {
"RootDirectory": "D:/1) Images A/Images-dd514b88"
"RootDirectory": "D:/1-Images-A/Images-dd514b88"
}
}
}

View File

@ -28,7 +28,7 @@
"${workspaceFolder}/Rename.csproj",
"set",
"SaveDirectory",
"D:/1) Images A/Images-dd514b88-Results/A2) People/dd514b88/([])"
"D:/1-Images-A/Images-dd514b88-Results/A2) People/dd514b88/([])"
],
"problemMatcher": "$msCompile"
},

View File

@ -151,9 +151,9 @@ public class Rename
string? message;
string checkFile;
DateTime dateTime;
bool? isWrongYear;
string seasonName;
string? directory;
bool? isWrongYear;
TimeSpan? timeSpan;
string directoryName;
DateTime?[] dateTimes;
@ -167,9 +167,11 @@ public class Rename
DateTime? dateTimeFromName;
DateTime? dateTimeOriginal;
const string jpeg = ".jpeg";
DateTime?[] metadataDateTimes;
List<string> distinct = new();
string[] directoryNameSegments;
bool isValidImageFormatExtension;
DateTime? metadataDateTimeOriginal;
bool nameWithoutExtensionIsIdFormat;
DateTime? metadataMinimumDateTime = null;
IReadOnlyList<MetadataExtractor.Directory> directories;
@ -219,6 +221,7 @@ public class Rename
nameWithoutExtensionIsIdFormat = Shared.Models.Stateless.Methods.IProperty.NameWithoutExtensionIsIdFormat(fileHolder);
if (nameWithoutExtensionIsIdFormat)
continue;
dateTimeFromName = Shared.Models.Stateless.Methods.IProperty.GetDateTimeFromName(fileHolder);
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
if (!isIgnoreExtension && isValidImageFormatExtension)
@ -280,32 +283,37 @@ public class Rename
continue;
}
}
dateTimeFromName = Shared.Models.Stateless.Methods.IProperty.GetDateTimeFromName(fileHolder);
(dateTimeOriginal, dateTimes, id, message) = Shared.Models.Stateless.Methods.IProperty.Get(fileHolder, isIgnoreExtension, isValidImageFormatExtension, _PropertyConfiguration.PopulatePropertyId);
if (ffmpegFiles is not null)
{
fileHolder = new(file);
foreach (string ffmpegFile in ffmpegFiles)
File.Delete(ffmpegFile);
}
if (fileHolder.DirectoryName is null)
continue;
minimumDateTime = dateTimes.Min();
if (minimumDateTime is null)
break;
if (dateTimeOriginal is not null && dateTimeFromName is not null)
{
timeSpan = new(Math.Abs(dateTimeOriginal.Value.Ticks - dateTimeFromName.Value.Ticks));
timeSpan = timeSpan.Value.TotalMinutes > _AppSettings.MaxMinutesDelta ? null : new(Math.Abs(minimumDateTime.Value.Ticks - new long[] { dateTimeOriginal.Value.Ticks, dateTimeFromName.Value.Ticks }.Min()));
}
else if (dateTimeFromName is not null)
timeSpan = new(Math.Abs(minimumDateTime.Value.Ticks - dateTimeFromName.Value.Ticks));
else if (dateTimeOriginal is not null)
timeSpan = new(Math.Abs(minimumDateTime.Value.Ticks - dateTimeOriginal.Value.Ticks));
throw new NotSupportedException();
if (dateTimeOriginal is null)
timeSpan = null;
else
timeSpan = new(Math.Abs(minimumDateTime.Value.Ticks - dateTimeOriginal.Value.Ticks));
if (timeSpan is null || timeSpan.Value.TotalMinutes > _AppSettings.MaxMinutesDelta)
{
if (_PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered))
continue;
try
{ directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file); }
{ directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(fileHolder.FullName); }
catch (Exception) { continue; }
metadataMinimumDateTime = Metadata.Models.Stateless.Methods.IMetadata.GetMinimumDateTime(directories);
if (metadataMinimumDateTime is null)
(metadataDateTimeOriginal, metadataDateTimes) = Metadata.Models.Stateless.Methods.IMetadata.GetDateTimes(fileHolder, directories);
dateTimeOriginal ??= metadataDateTimeOriginal;
if (ffmpegFiles is not null && dateTimeOriginal is not null)
minimumDateTime = dateTimeOriginal.Value;
if (dateTimeOriginal is null)
timeSpan = null;
else
timeSpan = new(Math.Abs(minimumDateTime.Value.Ticks - metadataMinimumDateTime.Value.Ticks));
timeSpan = new(Math.Abs(minimumDateTime.Value.Ticks - dateTimeOriginal.Value.Ticks));
}
if (timeSpan is null || timeSpan.Value.TotalMinutes > _AppSettings.MaxMinutesDelta)
(isWrongYear, seasonDirectory) = (null, null);
@ -313,17 +321,26 @@ public class Rename
{
directoryName = Path.GetFileName(fileHolder.DirectoryName);
directoryNameSegments = directoryName.Split(' ');
(isWrongYear, _) = Shared.Models.Stateless.Methods.IProperty.IsWrongYear(directoryNameSegments, string.Empty);
if (dateTimeFromName is null)
isWrongYear = null;
else
(isWrongYear, _) = Shared.Models.Stateless.Methods.IProperty.IsWrongYear(directoryNameSegments, dateTimeFromName.Value.ToString("yyyy"));
dateTime = minimumDateTime.Value.AddTicks(timeSpan.Value.Ticks);
(season, seasonName) = Shared.Models.Stateless.Methods.IProperty.GetSeason(dateTime.DayOfYear);
seasonDirectory = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Year}.{season} {seasonName}");
}
if (seasonDirectory is null || (isWrongYear is not null && isWrongYear.Value))
{
if (metadataMinimumDateTime is null)
if (dateTimeFromName is not null && isWrongYear is not null && isWrongYear.Value)
minimumDateTime = dateTimeFromName.Value;
else if (dateTimeOriginal is not null)
minimumDateTime = dateTimeOriginal.Value;
else
minimumDateTime = new DateTime?[] { dateTimeOriginal, metadataMinimumDateTime }.Min();
if (minimumDateTime is null)
continue;
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
checkFile = Path.Combine(fileHolder.DirectoryName, $"{metadataMinimumDateTime.Value:yyyy-MM-dd}.{metadataMinimumDateTime.Value.Ticks}.{fileHolder.Length}{checkFileExtension}");
checkFile = Path.Combine(fileHolder.DirectoryName, $"{minimumDateTime.Value:yyyy-MM-dd}.{minimumDateTime.Value.Ticks}.{fileHolder.Length}{checkFileExtension}");
if (checkFile == fileHolder.FullName)
continue;
if (distinct.Contains(checkFile))
@ -334,22 +351,11 @@ public class Rename
results.Add(new(new($"{fileHolder.FullName[..^4]}.tif"), directory, $"{checkFile[..^4]}.tif"));
if (nefPresent)
results.Add(new(new($"{fileHolder.FullName[..^4]}.nef"), directory, $"{checkFile[..^4]}.nef"));
if (ffmpegFiles is not null)
{
foreach (string ffmpegFile in ffmpegFiles)
File.Delete(ffmpegFile);
}
}
else
{
if (id is null)
continue;
if (ffmpegFiles is not null)
{
foreach (string ffmpegFile in ffmpegFiles)
File.Delete(ffmpegFile);
fileHolder = new(file);
}
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
checkFile = Path.Combine(seasonDirectory, $"{id.Value}{checkFileExtension}");
if (checkFile == fileHolder.FullName)