Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
66f366e9cf | |||
9a51d995cc |
@ -8,16 +8,16 @@ internal static class Dimensions
|
|||||||
#pragma warning disable IDE0230
|
#pragma warning disable IDE0230
|
||||||
private static readonly Dictionary<byte[], Func<BinaryReader, Size?>> _ImageFormatDecoders = new()
|
private static readonly Dictionary<byte[], Func<BinaryReader, Size?>> _ImageFormatDecoders = new()
|
||||||
{
|
{
|
||||||
|
{ new byte[] { 0xff, 0xd8 }, DecodeJfif },
|
||||||
{ new byte[] { 0x42, 0x4D }, DecodeBitmap },
|
{ new byte[] { 0x42, 0x4D }, DecodeBitmap },
|
||||||
|
{ new byte[] { 0x52, 0x49, 0x46, 0x46 }, DecodeWebP },
|
||||||
{ new byte[] { 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif },
|
{ new byte[] { 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif },
|
||||||
{ new byte[] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif },
|
{ new byte[] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif },
|
||||||
{ new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng },
|
{ new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng },
|
||||||
{ new byte[] { 0xff, 0xd8 }, DecodeJfif },
|
|
||||||
{ new byte[] { 0x52, 0x49, 0x46, 0x46 }, DecodeWebP },
|
|
||||||
};
|
};
|
||||||
#pragma warning restore IDE0230
|
#pragma warning restore IDE0230
|
||||||
|
|
||||||
private static bool StartsWith(byte[] thisBytes, byte[] thatBytes)
|
private static bool StartsWith(List<byte> thisBytes, byte[] thatBytes)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < thatBytes.Length; i += 1)
|
for (int i = 0; i < thatBytes.Length; i += 1)
|
||||||
{
|
{
|
||||||
@ -103,30 +103,49 @@ internal static class Dimensions
|
|||||||
|
|
||||||
internal static Size? GetDimensions(BinaryReader binaryReader)
|
internal static Size? GetDimensions(BinaryReader binaryReader)
|
||||||
{
|
{
|
||||||
int maxMagicBytesLength = _ImageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length;
|
Size? result;
|
||||||
byte[] magicBytes = new byte[maxMagicBytesLength];
|
List<byte> magicBytes = [];
|
||||||
for (int i = 0; i < maxMagicBytesLength; i += 1)
|
int[] magicBytesLengths = (from l in _ImageFormatDecoders.Keys where l.Length <= binaryReader.BaseStream.Length orderby l.Length descending select l.Length).ToArray();
|
||||||
|
if (magicBytesLengths.Length == 0)
|
||||||
|
result = null;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
magicBytes[i] = binaryReader.ReadByte();
|
result = null;
|
||||||
foreach (KeyValuePair<byte[], Func<BinaryReader, Size?>> kvPair in _ImageFormatDecoders)
|
if (binaryReader.BaseStream.Length == binaryReader.BaseStream.Position)
|
||||||
|
_ = binaryReader.BaseStream.Seek(0, SeekOrigin.Begin);
|
||||||
|
for (int i = 0; i < magicBytesLengths[0]; i++)
|
||||||
{
|
{
|
||||||
if (StartsWith(magicBytes, kvPair.Key))
|
magicBytes.Add(binaryReader.ReadByte());
|
||||||
return kvPair.Value(binaryReader);
|
foreach (KeyValuePair<byte[], Func<BinaryReader, Size?>> kvPair in _ImageFormatDecoders)
|
||||||
|
{
|
||||||
|
if (StartsWith(magicBytes, kvPair.Key))
|
||||||
|
{
|
||||||
|
result = kvPair.Value(binaryReader);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (result is not null)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static Size? GetDimensions(string path)
|
internal static Size? GetDimensions(string path)
|
||||||
{
|
{
|
||||||
using BinaryReader binaryReader = new(File.OpenRead(path));
|
Size? result;
|
||||||
return GetDimensions(binaryReader);
|
using FileStream fileStream = File.OpenRead(path);
|
||||||
|
using BinaryReader binaryReader = new(fileStream);
|
||||||
|
result = GetDimensions(binaryReader);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static Size? GetDimensions(Stream stream)
|
internal static Size? GetDimensions(Stream stream)
|
||||||
{
|
{
|
||||||
|
Size? result;
|
||||||
using BinaryReader binaryReader = new(stream);
|
using BinaryReader binaryReader = new(stream);
|
||||||
return GetDimensions(binaryReader);
|
result = GetDimensions(binaryReader);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -19,7 +19,9 @@ public record RenameSettings(string Company,
|
|||||||
string RelativePropertyCollectionFile,
|
string RelativePropertyCollectionFile,
|
||||||
bool RequireRootDirectoryExists,
|
bool RequireRootDirectoryExists,
|
||||||
string[] SidecarExtensions,
|
string[] SidecarExtensions,
|
||||||
bool SkipIdFiles) : Shared.Models.Properties.IRenameSettings
|
bool SkipIdFiles,
|
||||||
|
int ValidationImageDeterministicHashCodeId,
|
||||||
|
string ValidationImageFile) : Shared.Models.Properties.IRenameSettings
|
||||||
{
|
{
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
@ -127,9 +127,22 @@ public partial class Rename : IRename, IDisposable
|
|||||||
LogNetToHoursSince(logger);
|
LogNetToHoursSince(logger);
|
||||||
long ticks = DateTime.Now.Ticks;
|
long ticks = DateTime.Now.Ticks;
|
||||||
_ProgressBarOptions = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
_ProgressBarOptions = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||||
|
Verify(logger, appSettings, rename);
|
||||||
RenameWork(logger, appSettings, rename, ticks);
|
RenameWork(logger, appSettings, rename, ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void Verify(ILogger<Program>? logger, AppSettings appSettings, IRename rename)
|
||||||
|
{
|
||||||
|
FileHolder fileHolder = FileHolder.Get(appSettings.RenameSettings.ValidationImageFile);
|
||||||
|
FilePath filePath = FilePath.Get(appSettings.ResultSettings, appSettings.MetadataSettings, fileHolder, index: null);
|
||||||
|
DeterministicHashCode deterministicHashCode = rename.GetDeterministicHashCode(filePath);
|
||||||
|
if (deterministicHashCode.Id is null)
|
||||||
|
throw new NullReferenceException(nameof(deterministicHashCode));
|
||||||
|
if (deterministicHashCode.Id.Value != appSettings.RenameSettings.ValidationImageDeterministicHashCodeId)
|
||||||
|
throw new Exception("Deterministic hash code id is incorrect!");
|
||||||
|
logger?.LogDebug("Validated deterministic hash code id");
|
||||||
|
}
|
||||||
|
|
||||||
private static void LogNetToHoursSince(ILogger<Program>? logger)
|
private static void LogNetToHoursSince(ILogger<Program>? logger)
|
||||||
{
|
{
|
||||||
double secondsInAHour = 3600f;
|
double secondsInAHour = 3600f;
|
||||||
|
Reference in New Issue
Block a user