person-key-to-immich-import birthday json (Day-Helper-2024-05-18)
csharp_prefer_braces = true
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user