code cleanup
This commit is contained in:
parent
99ab384ade
commit
e705d0d286
@ -6,122 +6,121 @@ using Serilog;
|
|||||||
using ShellProgressBar;
|
using ShellProgressBar;
|
||||||
using Directory = System.IO.Directory;
|
using Directory = System.IO.Directory;
|
||||||
|
|
||||||
namespace PhotoRenamer
|
namespace PhotoRenamer;
|
||||||
|
|
||||||
|
internal class Renamer
|
||||||
{
|
{
|
||||||
internal class Renamer
|
private readonly ProgressBarOptions _childOptions;
|
||||||
|
private readonly string _sourcePath;
|
||||||
|
private readonly string _targetPath;
|
||||||
|
private int _currentCount;
|
||||||
|
|
||||||
|
public Renamer(IConfiguration configuration)
|
||||||
{
|
{
|
||||||
private readonly ProgressBarOptions _childOptions;
|
_sourcePath = Path.GetFullPath(configuration["Source"]);
|
||||||
private readonly string _sourcePath;
|
_targetPath = Path.GetFullPath(configuration["Target"]);
|
||||||
private readonly string _targetPath;
|
Log.Information($"Source path: {_sourcePath}");
|
||||||
private int _currentCount;
|
Log.Information($"Target path: {_targetPath}");
|
||||||
|
_childOptions = new ProgressBarOptions
|
||||||
public Renamer(IConfiguration configuration)
|
|
||||||
{
|
{
|
||||||
_sourcePath = Path.GetFullPath(configuration["Source"]);
|
ForegroundColor = ConsoleColor.Yellow,
|
||||||
_targetPath = Path.GetFullPath(configuration["Target"]);
|
BackgroundColor = ConsoleColor.DarkGreen,
|
||||||
Log.Information($"Source path: {_sourcePath}");
|
ProgressCharacter = '─',
|
||||||
Log.Information($"Target path: {_targetPath}");
|
CollapseWhenFinished = true
|
||||||
_childOptions = new ProgressBarOptions
|
};
|
||||||
{
|
}
|
||||||
ForegroundColor = ConsoleColor.Yellow,
|
|
||||||
BackgroundColor = ConsoleColor.DarkGreen,
|
public int Run()
|
||||||
ProgressCharacter = '─',
|
{
|
||||||
CollapseWhenFinished = true
|
var files = Directory.GetFiles(_sourcePath, "*", SearchOption.AllDirectories);
|
||||||
};
|
var options = new ProgressBarOptions
|
||||||
|
{
|
||||||
|
ForegroundColor = ConsoleColor.Yellow,
|
||||||
|
ForegroundColorDone = ConsoleColor.DarkGreen,
|
||||||
|
BackgroundColor = ConsoleColor.DarkGray,
|
||||||
|
BackgroundCharacter = '\u2593'
|
||||||
|
};
|
||||||
|
_currentCount = 0;
|
||||||
|
using var progressBar = new ProgressBar(files.Length, "Copying files", options);
|
||||||
|
var po = new ParallelOptions { MaxDegreeOfParallelism = 1 };
|
||||||
|
|
||||||
|
Parallel.ForEach(files, po, file => Body(file, progressBar));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Body(string file, ProgressBar progressBar)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var directories = ImageMetadataReader.ReadMetadata(file);
|
||||||
|
var dateTime = GetDateTimeFromExif(directories) ?? GetDateTimeFromMp4(directories) ?? GetDateTimeFromLastWrite(file);
|
||||||
|
var folder = CreateFolder(dateTime);
|
||||||
|
CopyFile(folder, file, progressBar);
|
||||||
}
|
}
|
||||||
|
catch (ImageProcessingException)
|
||||||
public int Run()
|
|
||||||
{
|
{
|
||||||
var files = Directory.GetFiles(_sourcePath, "*", SearchOption.AllDirectories);
|
//silently ignore
|
||||||
var options = new ProgressBarOptions
|
|
||||||
{
|
|
||||||
ForegroundColor = ConsoleColor.Yellow,
|
|
||||||
ForegroundColorDone = ConsoleColor.DarkGreen,
|
|
||||||
BackgroundColor = ConsoleColor.DarkGray,
|
|
||||||
BackgroundCharacter = '\u2593'
|
|
||||||
};
|
|
||||||
_currentCount = 0;
|
|
||||||
using var progressBar = new ProgressBar(files.Length, "Copying files", options);
|
|
||||||
var po = new ParallelOptions { MaxDegreeOfParallelism = 1 };
|
|
||||||
|
|
||||||
Parallel.ForEach(files, po, file => Body(file, progressBar));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
private void Body(string file, ProgressBar progressBar)
|
|
||||||
{
|
{
|
||||||
try
|
Interlocked.Increment(ref _currentCount);
|
||||||
{
|
progressBar.Tick(_currentCount);
|
||||||
var directories = ImageMetadataReader.ReadMetadata(file);
|
|
||||||
var dateTime = GetDateTimeFromExif(directories) ?? GetDateTimeFromMp4(directories) ?? GetDateTimeFromLastWrite(file);
|
|
||||||
var folder = CreateFolder(dateTime);
|
|
||||||
CopyFile(folder, file, progressBar);
|
|
||||||
}
|
|
||||||
catch (ImageProcessingException)
|
|
||||||
{
|
|
||||||
//silently ignore
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
Interlocked.Increment(ref _currentCount);
|
|
||||||
progressBar.Tick(_currentCount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DateTime GetDateTimeFromLastWrite(string file)
|
|
||||||
{
|
|
||||||
var creationTime = File.GetLastWriteTime(file);
|
|
||||||
return creationTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DateTime? GetDateTimeFromExif(IEnumerable<MetadataExtractor.Directory> directories)
|
|
||||||
{
|
|
||||||
return directories.OfType<ExifIfd0Directory>().FirstOrDefault()?.TryGetDateTime(ExifDirectoryBase.TagDateTime, out var dateTime) == true ? dateTime : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DateTime? GetDateTimeFromMp4(IEnumerable<MetadataExtractor.Directory> directories)
|
|
||||||
{
|
|
||||||
return directories.OfType<QuickTimeMovieHeaderDirectory>().FirstOrDefault()?.TryGetDateTime(QuickTimeMovieHeaderDirectory.TagCreated, out var dateTime) == true ? dateTime : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ResetTimes(FileSystemInfo destination, FileSystemInfo source)
|
|
||||||
{
|
|
||||||
destination.LastWriteTime = source.LastWriteTime;
|
|
||||||
destination.LastWriteTimeUtc = source.LastWriteTimeUtc;
|
|
||||||
destination.CreationTime = source.CreationTime;
|
|
||||||
destination.CreationTimeUtc = source.CreationTimeUtc;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void CopyFile(string folder, string file, ProgressBarBase progressBar)
|
|
||||||
{
|
|
||||||
var destination = new FileInfo(Path.Combine(folder, Path.GetFileName(file)));
|
|
||||||
var source = new FileInfo(file);
|
|
||||||
if (destination.Exists && destination.Length == source.Length)
|
|
||||||
return;
|
|
||||||
|
|
||||||
using var child = progressBar.Spawn(100, destination.FullName, _childOptions);
|
|
||||||
|
|
||||||
await using var sourceStream = File.Open(source.FullName, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
||||||
await using var targetStream = File.Open(destination.FullName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
|
|
||||||
|
|
||||||
var progress = new Progress<long>(o => progressBar.Tick((int)o * 100));
|
|
||||||
await sourceStream.CopyToAsync(targetStream, 81920, progress);
|
|
||||||
|
|
||||||
ResetTimes(destination, source);
|
|
||||||
|
|
||||||
child.Tick(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
private string CreateFolder(DateTime dateTime)
|
|
||||||
{
|
|
||||||
var folder = Path.Combine(_targetPath, dateTime.Year.ToString(), dateTime.Month.ToString("D2"));
|
|
||||||
if (!Directory.Exists(folder))
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(folder);
|
|
||||||
}
|
|
||||||
|
|
||||||
return folder;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static DateTime GetDateTimeFromLastWrite(string file)
|
||||||
|
{
|
||||||
|
var creationTime = File.GetLastWriteTime(file);
|
||||||
|
return creationTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DateTime? GetDateTimeFromExif(IEnumerable<MetadataExtractor.Directory> directories)
|
||||||
|
{
|
||||||
|
return directories.OfType<ExifIfd0Directory>().FirstOrDefault()?.TryGetDateTime(ExifDirectoryBase.TagDateTime, out var dateTime) == true ? dateTime : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DateTime? GetDateTimeFromMp4(IEnumerable<MetadataExtractor.Directory> directories)
|
||||||
|
{
|
||||||
|
return directories.OfType<QuickTimeMovieHeaderDirectory>().FirstOrDefault()?.TryGetDateTime(QuickTimeMovieHeaderDirectory.TagCreated, out var dateTime) == true ? dateTime : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ResetTimes(FileSystemInfo destination, FileSystemInfo source)
|
||||||
|
{
|
||||||
|
destination.LastWriteTime = source.LastWriteTime;
|
||||||
|
destination.LastWriteTimeUtc = source.LastWriteTimeUtc;
|
||||||
|
destination.CreationTime = source.CreationTime;
|
||||||
|
destination.CreationTimeUtc = source.CreationTimeUtc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void CopyFile(string folder, string file, ProgressBarBase progressBar)
|
||||||
|
{
|
||||||
|
var destination = new FileInfo(Path.Combine(folder, Path.GetFileName(file)));
|
||||||
|
var source = new FileInfo(file);
|
||||||
|
if (destination.Exists && destination.Length == source.Length)
|
||||||
|
return;
|
||||||
|
|
||||||
|
using var child = progressBar.Spawn(100, destination.FullName, _childOptions);
|
||||||
|
|
||||||
|
await using var sourceStream = File.Open(source.FullName, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||||
|
await using var targetStream = File.Open(destination.FullName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
|
||||||
|
|
||||||
|
var progress = new Progress<long>(o => progressBar.Tick((int)o * 100));
|
||||||
|
await sourceStream.CopyToAsync(targetStream, 81920, progress);
|
||||||
|
|
||||||
|
ResetTimes(destination, source);
|
||||||
|
|
||||||
|
child.Tick(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string CreateFolder(DateTime dateTime)
|
||||||
|
{
|
||||||
|
var folder = Path.Combine(_targetPath, dateTime.Year.ToString(), dateTime.Month.ToString("D2"));
|
||||||
|
if (!Directory.Exists(folder))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
return folder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
namespace PhotoRenamer.Types
|
namespace PhotoRenamer.Types;
|
||||||
{
|
|
||||||
public record MediaFile(string Path, DateTime CreationDate);
|
public record MediaFile(string Path, DateTime CreationDate);
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user