Changed GetDimensions to handle a stream at the end and one exit Switched to using Action? over IDlibDotNet for Tick method Switched to using AsReadOnly over new() Moved Meta Base to Shared
120 lines
5.9 KiB
C#
120 lines
5.9 KiB
C#
using System.Text;
|
|
|
|
namespace View_by_Distance.Shared.Models.Stateless.Methods;
|
|
|
|
internal abstract class Id
|
|
{
|
|
|
|
internal static int GetDeterministicHashCode(byte[] value)
|
|
{
|
|
int result;
|
|
unchecked
|
|
{
|
|
int hash1 = (5381 << 16) + 5381;
|
|
int hash2 = hash1;
|
|
for (int i = 0; i < value.Length; i += 2)
|
|
{
|
|
hash1 = ((hash1 << 5) + hash1) ^ value[i];
|
|
if (i == value.Length - 1)
|
|
break;
|
|
hash2 = ((hash2 << 5) + hash2) ^ value[i + 1];
|
|
}
|
|
result = hash1 + (hash2 * 1566083941);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal static byte GetHasIgnoreKeyword(FilePath filePath) =>
|
|
(byte)(filePath.Id > -1 ? 8 : 2);
|
|
|
|
internal static int GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId)
|
|
{
|
|
int result;
|
|
StringBuilder results = new();
|
|
if (propertyConfiguration.IntMinValueLength < (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2))
|
|
throw new NotSupportedException();
|
|
for (int i = intelligentId.Length - (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2); i > -1; i--)
|
|
_ = results.Append(intelligentId[i]);
|
|
_ = results.Append(intelligentId[^3]).Append(intelligentId[^2]);
|
|
result = int.Parse(results.ToString());
|
|
if (intelligentId[^1] is '0' or '1' or '2' or '3' or '4')
|
|
result *= -1;
|
|
else if (intelligentId[^1] is not '9' and not '8' and not '7' and not '6' and not '5')
|
|
throw new NotSupportedException();
|
|
return result;
|
|
}
|
|
|
|
internal static byte GetHasDateTimeOriginal(Properties.IPropertyConfiguration propertyConfiguration, FilePath filePath) =>
|
|
(byte)(propertyConfiguration.IgnoreExtensions.Contains(filePath.ExtensionLowered) || propertyConfiguration.ValidVideoFormatExtensions.Contains(filePath.ExtensionLowered) ? filePath.Id > -1 ? 6 : 4 : filePath.Id > -1 ? 9 : 1);
|
|
|
|
internal static byte GetMissingDateTimeOriginal(Properties.IPropertyConfiguration propertyConfiguration, FilePath filePath) =>
|
|
(byte)(propertyConfiguration.IgnoreExtensions.Contains(filePath.ExtensionLowered) || propertyConfiguration.ValidVideoFormatExtensions.Contains(filePath.ExtensionLowered) ? filePath.Id > -1 ? 5 : 0 : filePath.Id > -1 ? 7 : 3);
|
|
|
|
internal static bool NameWithoutExtensionIsIdFormat(Properties.IPropertyConfiguration propertyConfiguration, string fileNameWithoutExtension)
|
|
{
|
|
bool result;
|
|
if (fileNameWithoutExtension.Length < 5 || fileNameWithoutExtension.Length > propertyConfiguration.IntMinValueLength)
|
|
result = false;
|
|
else
|
|
{
|
|
bool skipOneAllAreNumbers = fileNameWithoutExtension[1..].All(char.IsNumber);
|
|
result = (skipOneAllAreNumbers && fileNameWithoutExtension[0] == '-') || (skipOneAllAreNumbers && char.IsNumber(fileNameWithoutExtension[0]));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, string extensionLowered, bool? hasIgnoreKeyword, bool? hasDateTimeOriginal)
|
|
{
|
|
string result;
|
|
StringBuilder stringBuilder = new();
|
|
if (propertyConfiguration.IntMinValueLength < (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2))
|
|
throw new NotSupportedException();
|
|
int key;
|
|
string value;
|
|
List<char> resultAllInOneSubdirectoryChars = [];
|
|
if (hasDateTimeOriginal is null)
|
|
{
|
|
key = 0;
|
|
value = id.ToString().PadLeft(propertyConfiguration.IntMinValueLength, '0');
|
|
}
|
|
else if (id > -1)
|
|
{
|
|
if (!propertyConfiguration.ValidVideoFormatExtensions.Contains(extensionLowered))
|
|
key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 8 : hasDateTimeOriginal.Value ? 9 : 7;
|
|
else
|
|
key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? throw new NotImplementedException() : hasDateTimeOriginal.Value ? 6 : 5;
|
|
value = id.ToString().PadLeft(propertyConfiguration.IntMinValueLength, '0');
|
|
}
|
|
else
|
|
{
|
|
if (!propertyConfiguration.ValidVideoFormatExtensions.Contains(extensionLowered))
|
|
key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? 2 : hasDateTimeOriginal.Value ? 1 : 3;
|
|
else
|
|
key = hasIgnoreKeyword is not null && hasIgnoreKeyword.Value ? throw new NotImplementedException() : hasDateTimeOriginal.Value ? 4 : 0;
|
|
value = id.ToString()[1..].PadLeft(propertyConfiguration.IntMinValueLength, '0');
|
|
}
|
|
for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength - 1; i > -1; i--)
|
|
_ = stringBuilder.Append(value[i]);
|
|
for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength; i < value.Length; i++)
|
|
resultAllInOneSubdirectoryChars.Add(value[i]);
|
|
result = $"{stringBuilder}{string.Join(string.Empty, resultAllInOneSubdirectoryChars)}{key}";
|
|
return result;
|
|
}
|
|
|
|
internal static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int id, string extensionLowered, bool? hasIgnoreKeyword, bool? hasDateTimeOriginal, int? index)
|
|
{
|
|
string result;
|
|
if (propertyConfiguration.Offset < 0)
|
|
result = Guid.NewGuid().ToString();
|
|
else
|
|
{
|
|
string intelligentId = GetIntelligentId(propertyConfiguration, id, extensionLowered, hasIgnoreKeyword, hasDateTimeOriginal);
|
|
int check = GetId(propertyConfiguration, intelligentId);
|
|
if (check != id)
|
|
throw new NotSupportedException();
|
|
result = index is null || propertyConfiguration.Offset == IId.DeterministicHashCode ? intelligentId : $"{propertyConfiguration.Offset + index}{intelligentId}";
|
|
}
|
|
return result;
|
|
}
|
|
|
|
} |