using System.Collections.ObjectModel; using System.Text.Json; using View_by_Distance.Shared.Models; namespace View_by_Distance.Instance.Models; /// // List /// internal class F_Random { private readonly Configuration _Configuration; private readonly JsonSerializerOptions _WriteIndentedJsonSerializerOptions; internal F_Random(Configuration configuration) { _Configuration = configuration; _WriteIndentedJsonSerializerOptions = new JsonSerializerOptions { WriteIndented = false }; } public override string ToString() { string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); return result; } private static ReadOnlyDictionary> GetDayToRelativePaths(ReadOnlyCollection distinctValidImageMappingCollection, string dateFormat, Dictionary immichAssets, ReadOnlyDictionary> idToPersonKeys) { Dictionary> results = []; string key; DateTime dateTime; List? personKeys; ImmichAsset? immichAsset; List? relativePaths; bool immichAssetsCountIsZero = immichAssets.Count == 0; foreach (Mapping mapping in distinctValidImageMappingCollection) { if (mapping.MappingFromItem.FilePath.DirectoryName is null || mapping.MappingFromPerson is null) continue; if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys)) continue; if (Shared.Models.Stateless.Methods.IPersonBirthday.IsCounterPersonYear(mapping.MappingFromPerson.PersonKey)) continue; if (!personKeys.Contains(mapping.MappingFromPerson.PersonKey)) continue; dateTime = new(mapping.MappingFromPerson.PersonKey); key = dateTime.ToString(dateFormat); if (!results.TryGetValue(key, out relativePaths)) { results.Add(key, []); if (!results.TryGetValue(key, out relativePaths)) throw new Exception(); } if (immichAssetsCountIsZero) relativePaths.Add(mapping.MappingFromItem.RelativePath); else { if (!immichAssets.TryGetValue(mapping.MappingFromItem.RelativePath, out immichAsset)) continue; relativePaths.Add(immichAsset.PreviewPath); } } return new(results); } private static Dictionary GetImmichAssets(string immichAssetsFile) { Dictionary results = []; if (!string.IsNullOrEmpty(immichAssetsFile) && File.Exists(immichAssetsFile)) { string json = File.ReadAllText(immichAssetsFile); ImmichAsset[]? immichAssets = JsonSerializer.Deserialize(json, ImmichAssetCollectionSourceGenerationContext.Default.ImmichAssetArray); if (immichAssets is not null) { foreach (ImmichAsset immichAsset in immichAssets) results.Add(immichAsset.OriginalPath, immichAsset); } } return results; } internal void Random(Property.Models.Configuration configuration, string immichAssetsFile, int radomUseBirthdayMinimum, string[] validKeyWordsToIgnoreInRandom, ReadOnlyDictionary> personKeyToIds, ReadOnlyCollection? notNineCollection, ReadOnlyCollection distinctValidImageMappingCollection) { string key; string json; string jsonFile; Random random = new(); List? collection; ImmichAsset? immichAsset; string dateFormat = "MM-dd"; List relativePaths = []; List distinctCollection = []; DateTime dateTime = new(2024, 1, 1); //Leap year Dictionary immichAssets = GetImmichAssets(immichAssetsFile); ReadOnlyDictionary> idToPersonKeys = Map.Models.Stateless.Methods.IMapLogic.GetIdToPersonKeys(personKeyToIds); ReadOnlyDictionary> dayToRelativePaths = GetDayToRelativePaths(distinctValidImageMappingCollection, dateFormat, immichAssets, idToPersonKeys); string fRandomCollectionDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(F_Random), "[]"); string[] files = Directory.GetFiles(fRandomCollectionDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string file in files) File.Delete(file); bool immichAssetsCountIsZero = immichAssets.Count == 0; foreach (Mapping mapping in distinctValidImageMappingCollection) { if (distinctCollection.Contains(mapping.MappingFromItem.Id)) continue; if (mapping.MappingFromItem.FilePath.DirectoryName is null) continue; if (notNineCollection is not null && notNineCollection.Contains(mapping.MappingFromItem.Id)) continue; if (mapping.MappingFromItem.Keywords is not null && mapping.MappingFromItem.Keywords.Any(l => validKeyWordsToIgnoreInRandom.Contains(l))) continue; if (immichAssetsCountIsZero) relativePaths.Add(mapping.MappingFromItem.RelativePath); else { if (!immichAssets.TryGetValue(mapping.MappingFromItem.RelativePath, out immichAsset)) continue; relativePaths.Add(immichAsset.PreviewPath); } distinctCollection.Add(mapping.MappingFromItem.Id); } if (relativePaths.Count > 0) { for (int i = 0; i < 366; i++) { random = new(i); key = dateTime.AddDays(i).ToString(dateFormat); if (dayToRelativePaths.TryGetValue(key, out collection) && collection.Count > radomUseBirthdayMinimum) collection = (from l in collection orderby random.NextDouble() select l).ToList(); else collection = (from l in relativePaths orderby random.NextDouble() select l).ToList(); jsonFile = Path.Combine(fRandomCollectionDirectory, $"{key}.json"); json = JsonSerializer.Serialize(collection, _WriteIndentedJsonSerializerOptions); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(jsonFile, json, updateDateWhenMatches: false, compareBeforeWrite: false); if (!_Configuration.SaveFullYearOfRandomFiles) break; } } } }