Work with video

This commit is contained in:
2024-01-27 18:11:24 -07:00
parent cfe43360fc
commit 4081a73b9d
20 changed files with 210 additions and 165 deletions

View File

@ -9,19 +9,21 @@ using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Map.Models.Stateless;
internal record Record(string PersonKeyFormatted,
int DirectoryNumber,
string? PersonDisplayDirectoryName,
internal record Record(int DirectoryNumber,
bool? IsDefault,
FilePath MappedFaceFilePath);
int? LinksCount,
FilePath MappedFaceFilePath,
string? PersonDisplayDirectoryName,
string PersonKeyFormatted);
internal abstract class DistanceLogic
{
internal record TicksDirectory(string Directory,
string DirectoryName,
internal record TicksDirectory(DateTime AlternateDirectoryDateTime,
string Directory,
DateTime DirectoryDateTime,
DateTime AlternateDirectoryDateTime,
string DirectoryName,
bool? IsLocationContainerDebugDirectory,
float? TotalDays);
private static void MoveTo(string actionDirectory, TicksDirectory ticksDirectory, string directory, string personKeyFormatted, string yearDirectoryName, string alphaDirectoryName, string[] files, string[] facesFileNames)
@ -89,6 +91,8 @@ internal abstract class DistanceLogic
DirectoryInfo directoryInfo;
long? lastDirectoryTicks = null;
DateTime dateTime = DateTime.Now;
DateTime alternateDirectoryDateTime;
bool? isLocationContainerDebugDirectory;
long month = dateTime.AddMonths(1).Ticks - dateTime.Ticks;
for (int i = 1; i < 5; i++)
_ = IPath.DeleteEmptyDirectories(eDistanceContentDirectory);
@ -125,8 +129,10 @@ internal abstract class DistanceLogic
Directory.SetCreationTime(ticksDirectory, new DateTime(directoryTicks));
if (directoryInfo.LastWriteTime.Ticks != directoryTicks)
Directory.SetLastWriteTime(ticksDirectory, new DateTime(directoryTicks));
alternateDirectoryDateTime = new DateTime(directoryDateTime.Year, directoryDateTime.Month, directoryDateTime.Day).AddMonths(1);
isLocationContainerDebugDirectory = configuration.LocationContainerDebugDirectory is null ? null : ticksDirectoryName.EndsWith(configuration.LocationContainerDebugDirectory);
totalDays = lastDirectoryTicks is null || new TimeSpan(dateTime.Ticks - directoryTicks).TotalDays < 1 ? null : (float)new TimeSpan(directoryTicks - lastDirectoryTicks.Value).TotalDays;
results.Add(new(ticksDirectory, ticksDirectoryName, new(directoryTicks), new DateTime(directoryDateTime.Year, directoryDateTime.Month, directoryDateTime.Day).AddMonths(1), totalDays));
results.Add(new(alternateDirectoryDateTime, ticksDirectory, new(directoryTicks), ticksDirectoryName, isLocationContainerDebugDirectory, totalDays));
if (directoryDateTime.Hour == 0 && directoryDateTime.Minute == 0 && directoryDateTime.Second == 0)
continue;
lastDirectoryTicks = directoryTicks;
@ -210,7 +216,7 @@ internal abstract class DistanceLogic
}
}
private static List<Record> GetRecords(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, List<string> distinct, string? personDisplayDirectoryName)
private static List<Record> GetRecords(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, bool? isDefault, string[] files, int directoryNumber, string personKeyFormatted, int? linksCount, List<string> distinct, string? personDisplayDirectoryName)
{
List<Record> results = [];
string fileName;
@ -239,7 +245,7 @@ internal abstract class DistanceLogic
continue;
}
distinct.Add(fileName);
results.Add(new(personKeyFormatted, directoryNumber, personDisplayDirectoryName, isDefault, filePath));
results.Add(new(directoryNumber, isDefault, linksCount, filePath, personDisplayDirectoryName, personKeyFormatted));
}
return results;
}
@ -263,6 +269,23 @@ internal abstract class DistanceLogic
Directory.Move(personKeyDirectory, newestPersonKeyDirectory);
}
private static int? GetLinksCount(string yearDirectory)
{
int? result;
string[] yearDirectoryNameSegments = Path.GetFileName(yearDirectory).Split('-');
if (yearDirectoryNameSegments.Length != 3)
result = null;
else
{
string lastSegment = yearDirectoryNameSegments[^1];
if (lastSegment.Length != 3 || !lastSegment.All(l => l == lastSegment[0]))
result = null;
else
result = lastSegment[0] - 65;
}
return result;
}
internal static List<Record> DeleteEmptyDirectoriesAndGetCollection(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, long ticks, string eDistanceContentDirectory, ReadOnlyDictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, ReadOnlyCollection<string> personKeyFormattedCollection)
{
List<Record> results = [];
@ -270,6 +293,7 @@ internal abstract class DistanceLogic
string message;
string[] files;
bool? isDefault;
int? linksCount;
int totalSeconds;
DateTime dateTime;
TimeSpan timeSpan;
@ -327,6 +351,10 @@ internal abstract class DistanceLogic
{
if (check && !Directory.Exists(yearDirectory))
continue;
if (ticksDirectory.IsLocationContainerDebugDirectory is null || !ticksDirectory.IsLocationContainerDebugDirectory.Value)
linksCount = null;
else
linksCount = GetLinksCount(yearDirectory);
if (ticksDirectory.DirectoryName != configuration.LocationContainerDebugDirectory)
{
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
@ -338,7 +366,7 @@ internal abstract class DistanceLogic
isDefault = null;
personDisplayDirectoryName = null;
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
results.AddRange(GetRecords(propertyConfiguration, configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
results.AddRange(GetRecords(propertyConfiguration, configuration, isDefault, files, directoryNumber, personKeyFormatted, linksCount, distinct, personDisplayDirectoryName));
files = Directory.GetFiles(yearDirectory, "*.lnk", SearchOption.AllDirectories);
foreach (string file in files)
File.Delete(file);
@ -426,7 +454,7 @@ internal abstract class DistanceLogic
Directory.Move(personNameDirectory, personFirstInitialDirectory);
files = Directory.GetFiles(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
}
results.AddRange(GetRecords(propertyConfiguration, configuration, isDefault, files, directoryNumber, personKeyFormatted, distinct, personDisplayDirectoryName));
results.AddRange(GetRecords(propertyConfiguration, configuration, isDefault, files, directoryNumber, personKeyFormatted, linksCount, distinct, personDisplayDirectoryName));
personNameLinkDirectories = Directory.GetDirectories(personFirstInitialDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string personNameLinkDirectory in personNameLinkDirectories)
{

View File

@ -27,6 +27,7 @@ internal abstract class MapLogic
internal record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted,
string? PersonDisplayDirectoryName,
bool? IsDefault,
int? LinksCount,
FilePath MappedFaceFilePath,
int Id,
int WholePercentages);
@ -298,13 +299,14 @@ internal abstract class MapLogic
return results;
}
private static Dictionary<int, Dictionary<int, List<PersonContainer>>> GetAll(Configuration configuration, ReadOnlyDictionary<string, PersonContainer> personKeyFormattedToPersonContainer, ReadOnlyCollection<PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection)
private static Dictionary<int, Dictionary<int, List<PersonContainer>>> GetAll(Configuration configuration, Dictionary<int, List<(string, int)>> skipCollection, ReadOnlyDictionary<string, PersonContainer> personKeyFormattedToPersonContainer, ReadOnlyCollection<PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection)
{
Dictionary<int, Dictionary<int, List<PersonContainer>>> results = [];
PersonBirthday? personBirthday;
PersonContainer? personContainer;
List<PersonContainer>? personContainers;
Dictionary<int, List<PersonContainer>>? idTo;
int? linkedAlphaCheck = string.IsNullOrEmpty(configuration.LinkedAlpha) ? null : configuration.LinkedAlpha[0] - 65;
if (personKeyFormattedIdThenWholePercentagesCollection.Count > 0)
{
foreach (PersonKeyFormattedIdThenWholePercentages personKeyFormattedIdThenWholePercentages in personKeyFormattedIdThenWholePercentagesCollection)
@ -312,6 +314,13 @@ internal abstract class MapLogic
personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormattedIdThenWholePercentages.PersonKeyFormatted);
if (personBirthday is null)
throw new Exception();
if (linkedAlphaCheck is not null && personKeyFormattedIdThenWholePercentages.LinksCount is not null && personKeyFormattedIdThenWholePercentages.LinksCount.Value < linkedAlphaCheck.Value)
{
if (!skipCollection.ContainsKey(personKeyFormattedIdThenWholePercentages.Id))
skipCollection.Add(personKeyFormattedIdThenWholePercentages.Id, []);
skipCollection[personKeyFormattedIdThenWholePercentages.Id].Add((personKeyFormattedIdThenWholePercentages.MappedFaceFilePath.FullName, personKeyFormattedIdThenWholePercentages.WholePercentages));
continue;
}
if (!personKeyFormattedToPersonContainer.TryGetValue(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, out personContainer))
throw new Exception();
if (!results.TryGetValue(personKeyFormattedIdThenWholePercentages.Id, out idTo))
@ -457,7 +466,7 @@ internal abstract class MapLogic
}
if (!filePath.Name.EndsWith(".dup") && !filePath.Name.EndsWith(".unk") && !filePath.Name.EndsWith(".abd"))
continue;
if (!File.Exists(filePath.Name))
if (!File.Exists(filePath.FullName))
continue;
checkFile = filePath.FullName[..^4];
if (File.Exists(checkFile))
@ -470,7 +479,7 @@ internal abstract class MapLogic
return results;
}
private static void ParallelFor(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, Dictionary<int, List<(string, int)>> skipCollection, List<LocationContainer> locationContainers, MappedFile mappedFile)
private static void ParallelFor(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, ReadOnlyDictionary<int, List<(string, int)>> skipCollection, List<LocationContainer> locationContainers, MappedFile mappedFile)
{
int? id;
string checkFile;
@ -502,7 +511,7 @@ internal abstract class MapLogic
}
if (wholePercentages is null)
return;
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory) && skipCollection.TryGetValue(id.Value, out wholePercentagesCollection))
if (configuration.LinkedAlpha is null && string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory) && skipCollection.TryGetValue(id.Value, out wholePercentagesCollection))
{
fileMatches = (from l in wholePercentagesCollection where l.WholePercentages == wholePercentages select l.File).ToArray();
foreach (string fileMatch in fileMatches)
@ -734,11 +743,11 @@ internal abstract class MapLogic
}
}
internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> GetIdThenWholePercentagesToPersonContainers(Configuration configuration, ReadOnlyDictionary<string, PersonContainer> personKeyFormattedToPersonContainer, ReadOnlyCollection<PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection)
internal static ReadOnlyDictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> GetIdThenWholePercentagesToPersonContainers(Configuration configuration, Dictionary<int, List<(string, int)>> skipCollection, ReadOnlyDictionary<string, PersonContainer> personKeyFormattedToPersonContainer, ReadOnlyCollection<PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection)
{
ReadOnlyDictionary<int, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>> results;
Dictionary<int, Dictionary<int, List<PersonContainer>>> idThenWholePercentagesToPersonContainerCollection;
idThenWholePercentagesToPersonContainerCollection = GetAll(configuration, personKeyFormattedToPersonContainer, personKeyFormattedIdThenWholePercentagesCollection);
idThenWholePercentagesToPersonContainerCollection = GetAll(configuration, skipCollection, personKeyFormattedToPersonContainer, personKeyFormattedIdThenWholePercentagesCollection);
results = GetReadOnly(idThenWholePercentagesToPersonContainerCollection);
return results;
}
@ -766,7 +775,7 @@ internal abstract class MapLogic
wholePercentagesCollection = idToWholePercentagesCollection[record.MappedFaceFilePath.Id.Value];
wholePercentagesCollection.Add(wholePercentages.Value);
idToWholePercentagesCollection[record.MappedFaceFilePath.Id.Value].Add(wholePercentages.Value);
results.Add(new(record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.IsDefault, record.MappedFaceFilePath, record.MappedFaceFilePath.Id.Value, wholePercentages.Value));
results.Add(new(record.PersonKeyFormatted, record.PersonDisplayDirectoryName, record.IsDefault, record.LinksCount, record.MappedFaceFilePath, record.MappedFaceFilePath.Id.Value, wholePercentages.Value));
}
return new(results);
}
@ -890,7 +899,7 @@ internal abstract class MapLogic
}
}
internal static List<LocationContainer> GetLocationContainers(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<int, List<(string, int)>> skipCollection, List<Record> records)
internal static List<LocationContainer> GetLocationContainers(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, ReadOnlyDictionary<int, List<(string, int)>> skipCollection, List<Record> records)
{
List<LocationContainer> results = [];
List<MappedFile> mappedFiles = GetMappedFiles(propertyConfiguration, configuration, personContainers, records);

View File

@ -84,7 +84,7 @@ internal abstract class RelationLogic
return new(results);
}
private static ReadOnlyDictionary<string, string> MoveFiles(Configuration configuration, string key, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection<RelationContainer> relationContainers, List<string> linked1, List<string> linked2, List<string> linked3, List<string> linked4, List<string> linked5, List<string> linked6, List<string> linked7, List<string> linked8, List<string> linked9)
private static ReadOnlyDictionary<string, string> MoveFiles(Configuration configuration, string key, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection<RelationContainer> relationContainers, List<List<string>> linked)
{
Dictionary<string, string> results = [];
string value;
@ -105,23 +105,55 @@ internal abstract class RelationLogic
maybeTicksDirectoryName = Path.GetFileName(personKeyFormattedDirectory);
if (string.IsNullOrEmpty(personNameDirectory) || string.IsNullOrEmpty(yearDirectory) || string.IsNullOrEmpty(personKeyFormattedDirectory) || string.IsNullOrEmpty(personNameDirectoryName))
continue;
if (linked9.Contains(fileHolder.FullName))
if (linked[24].Contains(fileHolder.FullName))
value = "ZZZ";
else if (linked[23].Contains(fileHolder.FullName))
value = "YYY";
else if (linked[22].Contains(fileHolder.FullName))
value = "XXX";
else if (linked[21].Contains(fileHolder.FullName))
value = "WWW";
else if (linked[20].Contains(fileHolder.FullName))
value = "VVV";
else if (linked[19].Contains(fileHolder.FullName))
value = "UUU";
else if (linked[18].Contains(fileHolder.FullName))
value = "TTT";
else if (linked[17].Contains(fileHolder.FullName))
value = "SSS";
else if (linked[16].Contains(fileHolder.FullName))
value = "RRR";
else if (linked[15].Contains(fileHolder.FullName))
value = "QQQ";
else if (linked[14].Contains(fileHolder.FullName))
value = "PPP";
else if (linked[13].Contains(fileHolder.FullName))
value = "OOO";
else if (linked[12].Contains(fileHolder.FullName))
value = "NNN";
else if (linked[11].Contains(fileHolder.FullName))
value = "MMM";
else if (linked[10].Contains(fileHolder.FullName))
value = "LLL";
else if (linked[9].Contains(fileHolder.FullName))
value = "KKK";
else if (linked[8].Contains(fileHolder.FullName))
value = "JJJ";
else if (linked8.Contains(fileHolder.FullName))
else if (linked[7].Contains(fileHolder.FullName))
value = "III";
else if (linked7.Contains(fileHolder.FullName))
else if (linked[6].Contains(fileHolder.FullName))
value = "HHH";
else if (linked6.Contains(fileHolder.FullName))
else if (linked[5].Contains(fileHolder.FullName))
value = "GGG";
else if (linked5.Contains(fileHolder.FullName))
else if (linked[4].Contains(fileHolder.FullName))
value = "FFF";
else if (linked4.Contains(fileHolder.FullName))
else if (linked[3].Contains(fileHolder.FullName))
value = "EEE";
else if (linked3.Contains(fileHolder.FullName))
else if (linked[2].Contains(fileHolder.FullName))
value = "DDD";
else if (linked2.Contains(fileHolder.FullName))
else if (linked[1].Contains(fileHolder.FullName))
value = "CCC";
else if (linked1.Contains(fileHolder.FullName))
else if (linked[0].Contains(fileHolder.FullName))
value = "BBB";
else
value = "AAA";
@ -231,67 +263,24 @@ internal abstract class RelationLogic
private static ReadOnlyDictionary<string, string> GetMoveFiles(Configuration configuration, string key, int take, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection<RelationContainer> relationContainers)
{
ReadOnlyDictionary<string, string> results;
List<string> linked1 = [];
List<string> linked2 = [];
List<string> linked3 = [];
List<string> linked4 = [];
List<string> linked5 = [];
List<string> linked6 = [];
List<string> linked7 = [];
List<string> linked8 = [];
List<string> linked9 = [];
List<List<string>> linked = [];
for (int i = 0; i < 25; i++)
linked.Add([]);
foreach ((FileHolder fileHolder, ReadOnlyCollection<Relation> relations) in relationContainers)
{
foreach (Relation relation in relations.Take(take))
{
if (!linked1.Contains(relation.File))
for (int i = 0; i < 25; i++)
{
linked1.Add(relation.File);
continue;
}
if (!linked2.Contains(relation.File))
{
linked2.Add(relation.File);
continue;
}
if (!linked3.Contains(relation.File))
{
linked3.Add(relation.File);
continue;
}
if (!linked4.Contains(relation.File))
{
linked4.Add(relation.File);
continue;
}
if (!linked5.Contains(relation.File))
{
linked5.Add(relation.File);
continue;
}
if (!linked6.Contains(relation.File))
{
linked6.Add(relation.File);
continue;
}
if (!linked7.Contains(relation.File))
{
linked7.Add(relation.File);
continue;
}
if (!linked8.Contains(relation.File))
{
linked8.Add(relation.File);
continue;
}
if (!linked9.Contains(relation.File))
{
linked9.Add(relation.File);
continue;
if (!linked[i].Contains(relation.File))
{
linked[i].Add(relation.File);
break;
}
}
}
}
results = MoveFiles(configuration, key, isCounterPersonYear, displayDirectoryName, relationContainers, linked1, linked2, linked3, linked4, linked5, linked6, linked7, linked8, linked9);
results = MoveFiles(configuration, key, isCounterPersonYear, displayDirectoryName, relationContainers, linked);
return results;
}