save-random-paths

sync-immich
This commit is contained in:
2024-11-23 23:46:24 -07:00
parent 590b1b87ca
commit 0e03b784a2
9 changed files with 158 additions and 24 deletions

View File

@ -1,5 +1,6 @@
using ImmichToSlideshow.Models;
using ImmichToSlideshow.Models.Immich;
using Microsoft.AspNetCore.Mvc;
using Npgsql;
using System.Collections.ObjectModel;
using System.Data;
@ -8,9 +9,10 @@ using System.Text.Json;
namespace ImmichToSlideshow.Services;
public class AssetService(AppSettings appSettings)
public class AssetService(ILogger<Program> logger, AppSettings appSettings)
{
private readonly ILogger<Program> _Logger = logger;
private readonly AppSettings _AppSettings = appSettings;
private static string GetColumnsCommandText()
@ -97,52 +99,56 @@ public class AssetService(AppSettings appSettings)
private static StringBuilder GetForJsonPath(string connectionString, string commandText, NpgsqlParameter[] npgsqlParameters)
{
StringBuilder stringBuilder = new();
StringBuilder result = new();
using NpgsqlConnection npgsqlConnection = new(connectionString);
npgsqlConnection.Open();
using NpgsqlCommand npgsqlCommand = new(commandText, npgsqlConnection);
npgsqlCommand.Parameters.AddRange(npgsqlParameters);
NpgsqlDataReader npgsqlDataReader = npgsqlCommand.ExecuteReader(CommandBehavior.SequentialAccess);
while (npgsqlDataReader.Read())
_ = stringBuilder.Append(npgsqlDataReader.GetString(0));
return stringBuilder;
_ = result.Append(npgsqlDataReader.GetString(0));
return result;
}
public string? GetColumns()
{
string result;
string commandText = GetColumnsCommandText();
NpgsqlParameter[] npgsqlParameters = [];
StringBuilder stringBuilder = GetForJsonPath(_AppSettings.ConnectionString, commandText, npgsqlParameters);
string json = stringBuilder.ToString();
if (json.Length == 1)
File.WriteAllText(".vscode/jsonl/.jsonl", json);
return json;
result = stringBuilder.ToString();
if (result.Length == 1)
File.WriteAllText(".vscode/jsonl/.jsonl", result);
return result;
}
public string? GetOwnerIds()
{
string result;
string commandText = GetOwnerIdActiveImageCommandText();
NpgsqlParameter[] npgsqlParameters = [];
StringBuilder stringBuilder = GetForJsonPath(_AppSettings.ConnectionString, commandText, npgsqlParameters);
string json = stringBuilder.ToString();
if (json.Length == 1)
File.WriteAllText(".vscode/jsonl/.jsonl", json);
return json;
result = stringBuilder.ToString();
if (result.Length == 1)
File.WriteAllText(".vscode/jsonl/.jsonl", result);
return result;
}
public string? GetAssets(Guid ownerId)
{
string result;
string commandText = GetAssetActiveImagePreviewNotDuplicateCommandText();
NpgsqlParameter[] npgsqlParameters = [new NpgsqlParameter(nameof(ownerId), ownerId)];
StringBuilder stringBuilder = GetForJsonPath(_AppSettings.ConnectionString, commandText, npgsqlParameters);
string json = stringBuilder.ToString();
if (json.Length == 1)
File.WriteAllText(".vscode/jsonl/assets.jsonl", json);
return json;
result = stringBuilder.ToString();
if (result.Length == 1)
File.WriteAllText(".vscode/jsonl/assets.jsonl", result);
return result;
}
public ReadOnlyCollection<string>? GetRandomPaths(Guid ownerId)
{
string[]? results;
string commandText = GetAssetActiveImagePreviewNotDuplicateCommandText();
NpgsqlParameter[] npgsqlParameters = [new NpgsqlParameter(nameof(ownerId), ownerId)];
StringBuilder stringBuilder = GetForJsonPath(_AppSettings.ConnectionString, commandText, npgsqlParameters);
@ -150,8 +156,69 @@ public class AssetService(AppSettings appSettings)
Random random = new();
string ownerIdValue = ownerId.ToString();
Asset[]? assets = JsonSerializer.Deserialize(json, AssetCollectionSourceGenerationContext.Default.AssetArray);
string[]? paths = assets is null ? null : (from l in assets orderby random.NextSingle() select l.Path.Split(ownerIdValue)[1][1..]).ToArray();
return paths?.AsReadOnly();
results = assets is null ? null : (from l in assets orderby random.NextSingle() select l.Path.Split(ownerIdValue)[1]).ToArray();
return results?.AsReadOnly();
}
public string? SaveRandomPaths(Guid ownerId)
{
string? results;
DateTime dateTime = DateTime.Now;
string tomorrow = dateTime.AddDays(1).ToString("MM-dd");
if (Directory.Exists(_AppSettings.RandomResultsDirectory))
_ = Directory.CreateDirectory(_AppSettings.RandomResultsDirectory);
FileInfo fileInfo = new(Path.Combine(_AppSettings.RandomResultsDirectory, $"{tomorrow}.json"));
if (fileInfo.Exists && fileInfo.CreationTime > dateTime.AddDays(_AppSettings.AddDays))
results = null;
else
{
_Logger.LogDebug("Writing <{FullName}>", fileInfo.FullName);
ReadOnlyCollection<string>? paths = GetRandomPaths(ownerId);
if (paths is null)
results = null;
else
{
_Logger.LogInformation("{count} path(s)", paths.Count.ToString());
results = JsonSerializer.Serialize(paths);
File.WriteAllText(fileInfo.FullName, results);
}
}
return results;
}
private record Record(string Source, string Destination);
public ReadOnlyCollection<string> SyncImmich(Guid ownerId)
{
List<string> results = [];
Record record;
List<Record> records = [];
if (Directory.Exists(_AppSettings.SyncDirectory))
_ = Directory.CreateDirectory(_AppSettings.SyncDirectory);
int syncLength = _AppSettings.SyncDirectory.Length;
string[] syncFiles = Directory.GetFiles(_AppSettings.SyncDirectory, "*", SearchOption.AllDirectories);
string[] syncCheck = syncFiles.Select(l => l[syncLength..]).ToArray();
if (Directory.Exists(_AppSettings.ImmichUploadDirectory))
_ = Directory.CreateDirectory(_AppSettings.ImmichUploadDirectory);
int immichUploadLength = _AppSettings.ImmichUploadDirectory.Length;
string[] immichUploadFiles = Directory.GetFiles(_AppSettings.ImmichUploadDirectory, "*", SearchOption.AllDirectories);
string[] immichUploadCheck = immichUploadFiles.Select(l => l[immichUploadLength..]).ToArray();
for (int i = 0; i < immichUploadFiles.Length; i++)
{
if (syncCheck.Contains(immichUploadCheck[i]))
continue;
results.Add(immichUploadCheck[i]);
record = new(immichUploadFiles[i], string.Concat(_AppSettings.SyncDirectory, immichUploadCheck[i]));
records.Add(record);
}
_Logger.LogInformation("{count} file(s)", results.Count.ToString());
for (int i = 0; i < records.Count; i++)
{
record = records[i];
_Logger.LogDebug("Copying <{source}>", record.Source);
File.Copy(record.Source, record.Destination);
}
return results.AsReadOnly();
}
}