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:
2
Rename/.vscode/UserSecrets/secrets.json
vendored
2
Rename/.vscode/UserSecrets/secrets.json
vendored
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
2
Rename/.vscode/tasks.json
vendored
2
Rename/.vscode/tasks.json
vendored
@ -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"
|
||||
},
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user