Helper to diff video files Move matches from directory Bug fix for DirectoryToISO Find replace instead of remove Rename Directory Amazon Immich Person PersonKeyToName PullIconsForBLM New links
160 lines
6.9 KiB
C#
160 lines
6.9 KiB
C#
using File_Folder_Helper.Helpers;
|
|
using Microsoft.Extensions.Logging;
|
|
using System.Collections.ObjectModel;
|
|
using System.Text.Json;
|
|
using System.Text.Json.Serialization;
|
|
|
|
namespace File_Folder_Helper.Day;
|
|
|
|
internal static partial class Helper20240520
|
|
{
|
|
|
|
private record RecordA(string Directory, string Extension, string SourceFile, Identifier Identifier);
|
|
|
|
private record RecordB(ReadOnlyDictionary<int, Identifier> IdTo, ReadOnlyDictionary<long, Identifier> LengthTo, ReadOnlyDictionary<string, Identifier> PaddedTo);
|
|
|
|
internal sealed record Identifier(int Id, long Length, string PaddedId, long Ticks)
|
|
{
|
|
|
|
public override string ToString()
|
|
{
|
|
string result = JsonSerializer.Serialize(this, IdentifierSourceGenerationContext.Default.Identifier);
|
|
return result;
|
|
}
|
|
|
|
}
|
|
|
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
|
[JsonSerializable(typeof(Identifier))]
|
|
internal partial class IdentifierSourceGenerationContext : JsonSerializerContext
|
|
{
|
|
}
|
|
|
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
|
[JsonSerializable(typeof(Identifier[]))]
|
|
internal partial class IdentifierCollectionSourceGenerationContext : JsonSerializerContext
|
|
{
|
|
}
|
|
|
|
private static RecordB GetRecordB(string jsonFile)
|
|
{
|
|
RecordB result;
|
|
Dictionary<int, Identifier> idTo = [];
|
|
Dictionary<long, Identifier> lengthTo = [];
|
|
Dictionary<string, Identifier> paddedTo = [];
|
|
string? json = !File.Exists(jsonFile) ? null : File.ReadAllText(jsonFile);
|
|
Identifier[]? identifiers = json is null ? null : JsonSerializer.Deserialize(json, IdentifierCollectionSourceGenerationContext.Default.IdentifierArray);
|
|
if (identifiers is null && !string.IsNullOrEmpty(jsonFile))
|
|
throw new Exception($"Invalid {nameof(jsonFile)}");
|
|
if (identifiers is not null)
|
|
{
|
|
foreach (Identifier identifier in identifiers)
|
|
{
|
|
idTo.Add(identifier.Id, identifier);
|
|
paddedTo.Add(identifier.PaddedId, identifier);
|
|
if (lengthTo.ContainsKey(identifier.Length))
|
|
{
|
|
_ = lengthTo.Remove(identifier.Length);
|
|
continue;
|
|
}
|
|
lengthTo.Add(identifier.Length, identifier);
|
|
}
|
|
}
|
|
result = new(new(idTo), new(lengthTo), new(paddedTo));
|
|
return result;
|
|
}
|
|
|
|
internal static void IdentifierRename(ILogger<Worker> logger, List<string> args)
|
|
{
|
|
int id;
|
|
string key;
|
|
RecordA recordA;
|
|
string checkFile;
|
|
FileInfo fileInfo;
|
|
string checkDirectory;
|
|
Identifier? identifier;
|
|
string offset = args[5];
|
|
string option = args[7];
|
|
string jsonFile = args[4];
|
|
string fileNameWithoutExtension;
|
|
List<RecordA> recordACollection = [];
|
|
RecordB recordB = GetRecordB(jsonFile);
|
|
string deterministicHashCode = args[3];
|
|
string source = Path.GetFullPath(args[0]);
|
|
int intMinValueLength = int.Parse(args[2]);
|
|
string destination = Path.GetFullPath(args[6]);
|
|
bool isOffsetDeterministicHashCode = offset == deterministicHashCode;
|
|
string[] sourceFiles = Directory.GetFiles(source, "*", SearchOption.AllDirectories);
|
|
logger.LogInformation("Found {files}(s)", sourceFiles.Length);
|
|
int sourceLength = source.Length;
|
|
foreach (string sourceFile in sourceFiles)
|
|
{
|
|
fileInfo = new(sourceFile);
|
|
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
|
|
if (fileInfo.Directory is null)
|
|
throw new NotSupportedException();
|
|
if (option == "Padded")
|
|
{
|
|
if (fileNameWithoutExtension.Length < intMinValueLength)
|
|
continue;
|
|
key = fileNameWithoutExtension;
|
|
if (recordB.PaddedTo.TryGetValue(key, out identifier))
|
|
{
|
|
recordACollection.Add(new($"{destination}{fileInfo.Directory.FullName[sourceLength..]}", fileInfo.Extension, fileInfo.FullName, identifier));
|
|
continue;
|
|
}
|
|
}
|
|
if (option == "Length")
|
|
{
|
|
if (recordB.LengthTo.TryGetValue(fileInfo.Length, out identifier))
|
|
{
|
|
checkDirectory = $"{destination}{fileInfo.Directory.FullName[sourceLength..]}";
|
|
if (!Directory.Exists(checkDirectory))
|
|
_ = Directory.CreateDirectory(checkDirectory);
|
|
checkFile = Path.Combine(checkDirectory, $"{identifier.PaddedId}{fileInfo.Extension}");
|
|
if (File.Exists(checkFile))
|
|
continue;
|
|
File.Copy(fileInfo.FullName, checkFile);
|
|
logger.LogInformation("<{fileInfo.FullName}> was moved to <{checkFile}>", fileInfo.FullName, checkFile);
|
|
continue;
|
|
}
|
|
}
|
|
if (option == "Id")
|
|
{
|
|
if (int.TryParse(fileNameWithoutExtension, out id))
|
|
{
|
|
if (recordB.IdTo.TryGetValue(id, out identifier))
|
|
{
|
|
checkDirectory = $"{destination}{fileInfo.Directory.FullName[sourceLength..]}";
|
|
if (!Directory.Exists(checkDirectory))
|
|
_ = Directory.CreateDirectory(checkDirectory);
|
|
checkFile = Path.Combine(checkDirectory, $"{identifier.PaddedId}{fileInfo.Extension}");
|
|
if (File.Exists(checkFile))
|
|
continue;
|
|
File.Move(fileInfo.FullName, checkFile);
|
|
logger.LogInformation("<{fileInfo.FullName}> was moved to <{checkFile}>", fileInfo.FullName, checkFile);
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (option == "Padded")
|
|
{
|
|
if (!isOffsetDeterministicHashCode)
|
|
recordACollection = (from l in recordACollection orderby l.Identifier.Ticks select l).ToList();
|
|
for (int i = 0; i < recordACollection.Count; i++)
|
|
{
|
|
recordA = recordACollection[i];
|
|
if (!Directory.Exists(recordA.Directory))
|
|
_ = Directory.CreateDirectory(recordA.Directory);
|
|
checkFile = Path.Combine(recordA.Directory, isOffsetDeterministicHashCode ? $"{recordA.Identifier.PaddedId}{recordA.Extension}" : $"{offset + i}{recordA.Identifier.PaddedId}{recordA.Extension}");
|
|
if (File.Exists(checkFile))
|
|
continue;
|
|
File.Move(recordA.SourceFile, checkFile);
|
|
logger.LogInformation("<{recordA.SourceFile}> was moved to <{checkFile}>", recordA.SourceFile, checkFile);
|
|
}
|
|
}
|
|
HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, source);
|
|
}
|
|
|
|
} |