person-key-to-immich-import birthday json (Day-Helper-2024-05-18)

csharp_prefer_braces = true
This commit is contained in:
2025-09-06 11:16:55 -07:00
parent 8ec89953bc
commit 6102da7266
54 changed files with 2218 additions and 1721 deletions

View File

@ -5,16 +5,14 @@ using System.Text.Json.Serialization;
namespace File_Folder_Helper.ADO2024.PI2;
internal static partial class Helper20240517
{
internal static partial class Helper20240517 {
private record ContentSignature([property: JsonPropertyName("contentSignature")] string Value,
[property: JsonPropertyName("contentSignatureType")] string ContentSignatureType);
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(ContentSignature))]
private partial class ContentSignatureGenerationContext : JsonSerializerContext
{
private partial class ContentSignatureGenerationContext : JsonSerializerContext {
}
private record Type([property: JsonPropertyName("count")] int Count,
@ -23,8 +21,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Type))]
private partial class TypeGenerationContext : JsonSerializerContext
{
private partial class TypeGenerationContext : JsonSerializerContext {
}
private record ImageAmazon([property: JsonPropertyName("colorSpace")] string ColorSpace,
@ -54,8 +51,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(ImageAmazon))]
private partial class ImageAmazonGenerationContext : JsonSerializerContext
{
private partial class ImageAmazonGenerationContext : JsonSerializerContext {
}
private record ContentProperties([property: JsonPropertyName("contentDate")] DateTime ContentDate,
@ -69,16 +65,14 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(ContentProperties))]
private partial class ContentPropertiesGenerationContext : JsonSerializerContext
{
private partial class ContentPropertiesGenerationContext : JsonSerializerContext {
}
private record XAccntParentMap();
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(XAccntParentMap))]
private partial class XAccntParentMapGenerationContext : JsonSerializerContext
{
private partial class XAccntParentMapGenerationContext : JsonSerializerContext {
}
private record Datum([property: JsonPropertyName("accessRuleIds")] IReadOnlyList<object> AccessRuleIds,
@ -111,14 +105,12 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Datum))]
private partial class DatumGenerationContext : JsonSerializerContext
{
private partial class DatumGenerationContext : JsonSerializerContext {
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Dictionary<string, Datum>))]
private partial class DictionaryDatumGenerationContext : JsonSerializerContext
{
private partial class DictionaryDatumGenerationContext : JsonSerializerContext {
}
private record LocationAmazon([property: JsonPropertyName("count")] int Count,
@ -127,8 +119,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(LocationAmazon))]
private partial class LocationAmazonGenerationContext : JsonSerializerContext
{
private partial class LocationAmazonGenerationContext : JsonSerializerContext {
}
private record LocationInfo([property: JsonPropertyName("city")] string City,
@ -139,8 +130,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(LocationInfo))]
private partial class LocationInfoGenerationContext : JsonSerializerContext
{
private partial class LocationInfoGenerationContext : JsonSerializerContext {
}
private record SearchData([property: JsonPropertyName("clusterName")] string ClusterName,
@ -150,8 +140,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(SearchData))]
private partial class SearchDataGenerationContext : JsonSerializerContext
{
private partial class SearchDataGenerationContext : JsonSerializerContext {
}
private record AllPerson([property: JsonPropertyName("count")] int Count,
@ -160,8 +149,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(AllPerson))]
private partial class AllPersonGenerationContext : JsonSerializerContext
{
private partial class AllPersonGenerationContext : JsonSerializerContext {
}
private record PersonAmazon([property: JsonPropertyName("count")] int Count,
@ -170,8 +158,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(PersonAmazon))]
private partial class PersonAmazonGenerationContext : JsonSerializerContext
{
private partial class PersonAmazonGenerationContext : JsonSerializerContext {
}
private record ClusterId([property: JsonPropertyName("count")] int Count,
@ -180,8 +167,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(ClusterId))]
private partial class ClusterIdGenerationContext : JsonSerializerContext
{
private partial class ClusterIdGenerationContext : JsonSerializerContext {
}
private record Thing([property: JsonPropertyName("count")] int Count,
@ -190,8 +176,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Thing))]
private partial class ThingGenerationContext : JsonSerializerContext
{
private partial class ThingGenerationContext : JsonSerializerContext {
}
private record Time([property: JsonPropertyName("count")] int Count,
@ -200,8 +185,7 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Time))]
private partial class TimeGenerationContext : JsonSerializerContext
{
private partial class TimeGenerationContext : JsonSerializerContext {
}
private record ParentMap([property: JsonPropertyName("FOLDER")] IReadOnlyList<string> FOLDER);
@ -216,14 +200,12 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Aggregations))]
private partial class AggregationsGenerationContext : JsonSerializerContext
{
private partial class AggregationsGenerationContext : JsonSerializerContext {
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(ParentMap))]
private partial class ParentMapGenerationContext : JsonSerializerContext
{
private partial class ParentMapGenerationContext : JsonSerializerContext {
}
private record RootAmazon([property: JsonPropertyName("aggregations")] Aggregations Aggregations,
@ -232,12 +214,23 @@ internal static partial class Helper20240517
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(RootAmazon))]
private partial class RootAmazonGenerationContext : JsonSerializerContext
{
private partial class RootAmazonGenerationContext : JsonSerializerContext {
}
private static void SaveAmazon(string destination, string harFile)
{
internal static void SaveAmazon(ILogger<Worker> logger, List<string> args) {
string root = Path.GetFullPath(args[0]);
string destination = Path.GetFullPath(args[2]);
if (string.IsNullOrEmpty(root)) {
throw new NullReferenceException(nameof(root));
}
string[] harFiles = Directory.GetFiles(root, "*.har", SearchOption.TopDirectoryOnly);
foreach (string harFile in harFiles) {
SaveAmazon(destination, harFile);
}
logger?.LogInformation("{harFiles} count", harFiles.Length);
}
private static void SaveAmazon(string destination, string harFile) {
string offset;
string personId;
RootAmazon amazon;
@ -247,37 +240,43 @@ internal static partial class Helper20240517
PersonAmazon personAmazon;
Dictionary<string, string> keyValuePairs = [];
ReadOnlyCollection<(string Url, string AggregationLine)> aggregationLines = GetAggregationLines(harFile);
foreach ((string url, string aggregationLine) in aggregationLines)
{
if (aggregationLine.Contains(",\"category\":\"allPeople\"}"))
foreach ((string url, string aggregationLine) in aggregationLines) {
if (aggregationLine.Contains(",\"category\":\"allPeople\"}")) {
continue;
}
amazon = JsonSerializer.Deserialize(aggregationLine, RootAmazonGenerationContext.Default.RootAmazon) ?? throw new Exception();
if (amazon.Aggregations?.People is null || amazon.Aggregations.People.Count < 1)
if (amazon.Aggregations?.People is null || amazon.Aggregations.People.Count < 1) {
continue;
}
personAmazon = amazon.Aggregations.People[0];
if (!url.Contains(personAmazon.Match))
if (!url.Contains(personAmazon.Match)) {
continue;
}
personDirectory = Path.Combine(destination, personAmazon.SearchData.ClusterName);
_ = Directory.CreateDirectory(personDirectory);
personIdFile = Path.Combine(personDirectory, $"000) {personAmazon.Match}.json");
_ = keyValuePairs.TryAdd(personAmazon.Match, personAmazon.SearchData.ClusterName);
SaveAmazon(amazon.Data, personIdFile);
}
foreach ((string url, string aggregationLine) in aggregationLines)
{
if (aggregationLine.Contains(",\"category\":\"allPeople\"}"))
foreach ((string url, string aggregationLine) in aggregationLines) {
if (aggregationLine.Contains(",\"category\":\"allPeople\"}")) {
continue;
}
amazon = JsonSerializer.Deserialize(aggregationLine, RootAmazonGenerationContext.Default.RootAmazon) ?? throw new Exception();
if (amazon.Aggregations?.People is not null && amazon.Aggregations.People.Count > 0)
if (amazon.Aggregations?.People is not null && amazon.Aggregations.People.Count > 0) {
continue;
if (!url.Contains("offset="))
}
if (!url.Contains("offset=")) {
continue;
}
offset = url.Split("offset=")[1];
if (!url.Contains("people%3A("))
if (!url.Contains("people%3A(")) {
continue;
}
personId = url.Split("people%3A(")[1].Split(')')[0];
if (!keyValuePairs.TryGetValue(personId, out personName))
if (!keyValuePairs.TryGetValue(personId, out personName)) {
continue;
}
personDirectory = Path.Combine(destination, personName);
_ = Directory.CreateDirectory(personDirectory);
personIdFile = Path.Combine(personDirectory, $"{offset.Split('&')[0]}) {personId}.json");
@ -285,46 +284,37 @@ internal static partial class Helper20240517
}
}
internal static void SaveAmazon(ILogger<Worker> logger, List<string> args)
{
string root = Path.GetFullPath(args[0]);
string destination = Path.GetFullPath(args[2]);
if (string.IsNullOrEmpty(root))
throw new NullReferenceException(nameof(root));
string[] harFiles = Directory.GetFiles(root, "*.har", SearchOption.TopDirectoryOnly);
foreach (string harFile in harFiles)
SaveAmazon(destination, harFile);
logger?.LogInformation("{harFiles} count", harFiles.Length);
}
private static void SaveAmazon(IReadOnlyList<Datum> data, string personIdFile)
{
private static void SaveAmazon(IReadOnlyList<Datum> data, string personIdFile) {
string json;
Dictionary<string, Datum> keyValuePairs = [];
foreach (Datum datum in data)
foreach (Datum datum in data) {
_ = keyValuePairs.TryAdd(datum.Name.Split('.')[0], datum);
}
json = JsonSerializer.Serialize(keyValuePairs, DictionaryDatumGenerationContext.Default.DictionaryStringDatum);
File.WriteAllText(personIdFile, json);
}
private static ReadOnlyCollection<(string, string)> GetAggregationLines(string harFile)
{
private static ReadOnlyCollection<(string, string)> GetAggregationLines(string harFile) {
List<(string, string)> results = [];
if (!File.Exists(harFile))
if (!File.Exists(harFile)) {
throw new Exception();
}
string lastUrl = string.Empty;
string text = "\"text\": \"{";
string[] lines = File.ReadAllLines(harFile);
foreach (string line in lines)
{
if (line.Contains("\"url\": \""))
foreach (string line in lines) {
if (line.Contains("\"url\": \"")) {
lastUrl = line;
if (!line.Contains(text))
}
if (!line.Contains(text)) {
continue;
if (!line.Contains("aggregations"))
}
if (!line.Contains("aggregations")) {
continue;
if (lastUrl.Contains("search?asset=NONE"))
}
if (lastUrl.Contains("search?asset=NONE")) {
continue;
}
results.Add(new(lastUrl, line.Trim()[(text.Length - 1)..^1].Replace("\\\"", "\"")));
lastUrl = string.Empty;
}