moves all classes to use serilog
All checks were successful
PiwigoDirectorySync/pipeline/head This commit looks good

This commit is contained in:
Philipp Häfelfinger 2023-09-11 23:04:21 +02:00
parent e6f4ebe4cb
commit 5123b59f70
15 changed files with 126 additions and 129 deletions

View File

@ -1,7 +1,7 @@
using System.Diagnostics; using System.Diagnostics;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Services; using PiwigoDirectorySync.Services;
using Serilog;
using Spectre.Console.Cli; using Spectre.Console.Cli;
namespace PiwigoDirectorySync.Commands; namespace PiwigoDirectorySync.Commands;
@ -9,23 +9,22 @@ namespace PiwigoDirectorySync.Commands;
internal class DownloadImagesCommand : CancellableAsyncCommand<DownloadImagesCommand.DownloadImagesSettings> internal class DownloadImagesCommand : CancellableAsyncCommand<DownloadImagesCommand.DownloadImagesSettings>
{ {
private readonly IImageSynchronizer _imageSynchronizer; private readonly IImageSynchronizer _imageSynchronizer;
private readonly ILogger<DownloadImagesCommand> _logger; private readonly ILogger _logger = Log.ForContext<DownloadImagesCommand>();
public DownloadImagesCommand(IImageSynchronizer imageSynchronizer, ILogger<DownloadImagesCommand> logger) public DownloadImagesCommand(IImageSynchronizer imageSynchronizer)
{ {
_imageSynchronizer = imageSynchronizer; _imageSynchronizer = imageSynchronizer;
_logger = logger;
} }
protected override async Task<int> ExecuteAsync(CommandContext context, DownloadImagesSettings settings, CancellationToken cancellationToken) protected override async Task<int> ExecuteAsync(CommandContext context, DownloadImagesSettings settings, CancellationToken cancellationToken)
{ {
_logger.LogInformation("Starting image download for piwigo server {SettingsPiwigoServerId}", settings.PiwigoServerId); _logger.Information("Starting image download for piwigo server {SettingsPiwigoServerId}", settings.PiwigoServerId);
var stopWatch = Stopwatch.StartNew(); var stopWatch = Stopwatch.StartNew();
await _imageSynchronizer.DownloadImagesAsync(settings.PiwigoServerId, cancellationToken); await _imageSynchronizer.DownloadImagesAsync(settings.PiwigoServerId, cancellationToken);
stopWatch.Stop(); stopWatch.Stop();
_logger.LogInformation("Synchronized all images with piwigo server {SettingsPiwigoServerId} in {ElapsedTotalSeconds} seconds", settings.PiwigoServerId, _logger.Information("Synchronized all images with piwigo server {SettingsPiwigoServerId} in {ElapsedTotalSeconds} seconds", settings.PiwigoServerId,
stopWatch.Elapsed.TotalSeconds); stopWatch.Elapsed.TotalSeconds);
return 0; return 0;

View File

@ -1,7 +1,7 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Persistence; using PiwigoDirectorySync.Persistence;
using Serilog;
using Spectre.Console; using Spectre.Console;
using Spectre.Console.Cli; using Spectre.Console.Cli;
@ -9,24 +9,22 @@ namespace PiwigoDirectorySync.Commands;
internal class PiwigoAddCommand : CancellableAsyncCommand<PiwigoAddCommand.PiwigoAddSettings> internal class PiwigoAddCommand : CancellableAsyncCommand<PiwigoAddCommand.PiwigoAddSettings>
{ {
private readonly ILogger<PiwigoAddCommand> _logger; private readonly ILogger _logger = Log.ForContext<PiwigoAddCommand>();
private readonly PersistenceContext _persistenceContext; private readonly PersistenceContext _persistenceContext;
public PiwigoAddCommand(ILogger<PiwigoAddCommand> logger, PersistenceContext persistenceContext) public PiwigoAddCommand(PersistenceContext persistenceContext)
{ {
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); _persistenceContext = persistenceContext;
_persistenceContext = persistenceContext ?? throw new ArgumentNullException(nameof(persistenceContext));
} }
protected override async Task<int> ExecuteAsync(CommandContext context, PiwigoAddSettings settings, CancellationToken cancellation) protected override async Task<int> ExecuteAsync(CommandContext context, PiwigoAddSettings settings, CancellationToken cancellation)
{ {
_logger.LogInformation("Adding piwigo server {SettingsServerName} with user {SettingsUserName} and url {SettingsUrl}", settings.ServerName, settings.UserName, _logger.Information("Adding piwigo server {SettingsServerName} with user {SettingsUserName} and url {SettingsUrl}", settings.ServerName, settings.UserName, settings.Url);
settings.Url);
var count = await _persistenceContext.PiwigoServers.Where(s => s.Name == settings.ServerName).CountAsync(cancellation); var count = await _persistenceContext.PiwigoServers.Where(s => s.Name == settings.ServerName).CountAsync(cancellation);
if (count > 0) if (count > 0)
{ {
_logger.LogWarning("Server with name {SettingsServerName} already exists. Not updated", settings.ServerName); _logger.Warning("Server with name {SettingsServerName} already exists. Not updated", settings.ServerName);
AnsiConsole.MarkupLine($"[maroon]There is already a server with the name {settings.ServerName}[/]"); AnsiConsole.MarkupLine($"[maroon]There is already a server with the name {settings.ServerName}[/]");
return -1; return -1;
} }

View File

@ -1,5 +1,4 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Persistence; using PiwigoDirectorySync.Persistence;
using Spectre.Console; using Spectre.Console;
@ -9,13 +8,11 @@ namespace PiwigoDirectorySync.Commands;
internal class PiwigoListCommand : CancellableAsyncCommand<PiwigoListCommand.PiwigoListSettings> internal class PiwigoListCommand : CancellableAsyncCommand<PiwigoListCommand.PiwigoListSettings>
{ {
private readonly ILogger<PiwigoListCommand> _logger;
private readonly PersistenceContext _persistenceContext; private readonly PersistenceContext _persistenceContext;
public PiwigoListCommand(ILogger<PiwigoListCommand> logger, PersistenceContext persistenceContext) public PiwigoListCommand(PersistenceContext persistenceContext)
{ {
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); _persistenceContext = persistenceContext;
_persistenceContext = persistenceContext ?? throw new ArgumentNullException(nameof(persistenceContext));
} }
protected override async Task<int> ExecuteAsync(CommandContext context, PiwigoListSettings settings, CancellationToken cancellation) protected override async Task<int> ExecuteAsync(CommandContext context, PiwigoListSettings settings, CancellationToken cancellation)

View File

@ -1,7 +1,7 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Persistence; using PiwigoDirectorySync.Persistence;
using Serilog;
using Spectre.Console; using Spectre.Console;
using Spectre.Console.Cli; using Spectre.Console.Cli;
@ -9,12 +9,11 @@ namespace PiwigoDirectorySync.Commands;
internal class PiwigoRemoveCommand : CancellableAsyncCommand<PiwigoRemoveCommand.PiwigoRemoveSettings> internal class PiwigoRemoveCommand : CancellableAsyncCommand<PiwigoRemoveCommand.PiwigoRemoveSettings>
{ {
private readonly ILogger<PiwigoRemoveCommand> _logger; private readonly ILogger _logger = Log.ForContext<PiwigoRemoveCommand>();
private readonly PersistenceContext _persistenceContext; private readonly PersistenceContext _persistenceContext;
public PiwigoRemoveCommand(ILogger<PiwigoRemoveCommand> logger, PersistenceContext persistenceContext) public PiwigoRemoveCommand(PersistenceContext persistenceContext)
{ {
_logger = logger;
_persistenceContext = persistenceContext; _persistenceContext = persistenceContext;
} }
@ -23,29 +22,44 @@ internal class PiwigoRemoveCommand : CancellableAsyncCommand<PiwigoRemoveCommand
var server = await _persistenceContext.PiwigoServers.FindByIdAsync(settings.PiwigoServerId, cancellation); var server = await _persistenceContext.PiwigoServers.FindByIdAsync(settings.PiwigoServerId, cancellation);
if (server is null) if (server is null)
{ {
_logger.LogWarning("Could not find server with id {SettingsPiwigoServerId}", settings.PiwigoServerId); _logger.Warning("Could not find server with id {SettingsPiwigoServerId}", settings.PiwigoServerId);
AnsiConsole.MarkupLine($"[maroon]Could not find server with id {settings.PiwigoServerId}[/]"); AnsiConsole.MarkupLine($"[maroon]Could not find server with id {settings.PiwigoServerId}[/]");
return -1; return -1;
} }
if (!AnsiConsole.Confirm($"[orange3]Do you really want to remove {server.Name} ({server.Id}) from this database?[/]", false)) var serverName = server.Name;
var serverId = server.Id;
if (!AnsiConsole.Confirm($"[orange3]Do you really want to remove {serverName} ({serverId}) from this database?[/]", false))
{ {
_logger.LogInformation("Do not remove server {ServerName}", server.Name); _logger.Information("Do not remove server {ServerName}", serverName);
AnsiConsole.MarkupLine("[green]Remove cancelled![/]"); AnsiConsole.MarkupLine("[green]Remove cancelled![/]");
return 1; return 1;
} }
AnsiConsole.MarkupLine($"[orange3]Removing image metadata of server {server.Name}![/]"); _logger.Information("Removing {ServerName} including images and albums from database", serverName);
await _persistenceContext.PiwigoImages.Where(i => i.Album.ServerId == server.Id).ExecuteDeleteAsync(cancellation);
await _persistenceContext.SaveChangesAsync(cancellation);
AnsiConsole.MarkupLine($"[orange3]Removing album metadata of server {server.Name}![/]"); await AnsiConsole.Status()
await _persistenceContext.PiwigoAlbums.Where(a => a.ServerId == server.Id).ExecuteDeleteAsync(cancellation); .Spinner(Spinner.Known.Star)
.SpinnerStyle(Style.Parse("green bold"))
.StartAsync("[orange3]Updating database[/]", async ctx =>
{
ctx.Status($"[orange3]Removing image metadata of server {serverName}![/]");
var deletedImages = await _persistenceContext.PiwigoImages.Where(i => i.Album.ServerId == serverId).ExecuteDeleteAsync(cancellation);
await _persistenceContext.SaveChangesAsync(cancellation); await _persistenceContext.SaveChangesAsync(cancellation);
ctx.Status($"[green]Deleted {deletedImages} images from database[/]");
AnsiConsole.MarkupLine($"[orange3]Removing server {server.Name}![/]"); ctx.Status($"[orange3]Removing album metadata of server {serverName}![/]");
await _persistenceContext.PiwigoServers.Where(s => s.Id == server.Id).ExecuteDeleteAsync(cancellation); var deletedAlbums = await _persistenceContext.PiwigoAlbums.Where(a => a.ServerId == serverId).ExecuteDeleteAsync(cancellation);
await _persistenceContext.SaveChangesAsync(cancellation); await _persistenceContext.SaveChangesAsync(cancellation);
ctx.Status($"[green]Deleted {deletedAlbums} albums from database[/]");
ctx.Status($"[orange3]Removing server {serverName}![/]");
await _persistenceContext.PiwigoServers.Where(s => s.Id == serverId).ExecuteDeleteAsync(cancellation);
await _persistenceContext.SaveChangesAsync(cancellation);
ctx.Status($"[green]Deleted piwigo server {serverName}[/]");
});
_logger.Information("Removed {ServerName} including images and albums from database", serverName);
return 0; return 0;
} }

View File

@ -1,8 +1,8 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Persistence; using PiwigoDirectorySync.Persistence;
using Serilog;
using Spectre.Console; using Spectre.Console;
using Spectre.Console.Cli; using Spectre.Console.Cli;
@ -10,24 +10,23 @@ namespace PiwigoDirectorySync.Commands;
internal class PiwigoUpdateCommand : CancellableAsyncCommand<PiwigoUpdateCommand.PiwigoUpdateSettings> internal class PiwigoUpdateCommand : CancellableAsyncCommand<PiwigoUpdateCommand.PiwigoUpdateSettings>
{ {
private readonly ILogger<PiwigoUpdateCommand> _logger; private readonly ILogger _logger = Log.ForContext<PiwigoUpdateCommand>();
private readonly PersistenceContext _persistenceContext; private readonly PersistenceContext _persistenceContext;
public PiwigoUpdateCommand(ILogger<PiwigoUpdateCommand> logger, PersistenceContext persistenceContext) public PiwigoUpdateCommand(PersistenceContext persistenceContext)
{ {
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); _persistenceContext = persistenceContext;
_persistenceContext = persistenceContext ?? throw new ArgumentNullException(nameof(persistenceContext));
} }
protected override async Task<int> ExecuteAsync(CommandContext context, PiwigoUpdateSettings settings, CancellationToken cancellation) protected override async Task<int> ExecuteAsync(CommandContext context, PiwigoUpdateSettings settings, CancellationToken cancellation)
{ {
_logger.LogInformation("Updating piwigo server {SettingsServerName} with user {SettingsUserName} and url {SettingsUrl}", settings.ServerName, settings.UserName, _logger.Information("Updating piwigo server {SettingsServerName} with user {SettingsUserName} and url {SettingsUrl}", settings.ServerName, settings.UserName, settings.Url);
settings.Url);
var count = await _persistenceContext.PiwigoServers.Where(s => s.Name == settings.ServerName && s.Id != settings.PiwigoServerId).CountAsync(cancellation); var count = await _persistenceContext.PiwigoServers.Where(s => s.Name == settings.ServerName && s.Id != settings.PiwigoServerId).CountAsync(cancellation);
if (count > 0) if (count > 0)
{ {
_logger.LogWarning("Server with name {SettingsServerName} already exists. Not updated", settings.ServerName); _logger.Warning("Server with name {SettingsServerName} already exists. Not updated", settings.ServerName);
AnsiConsole.MarkupLine( AnsiConsole.MarkupLine(
$"[maroon]You can not rename the server with id {settings.PiwigoServerId} to {settings.ServerName} as there is already a server with this name[/]"); $"[maroon]You can not rename the server with id {settings.PiwigoServerId} to {settings.ServerName} as there is already a server with this name[/]");
return -1; return -1;
@ -36,7 +35,7 @@ internal class PiwigoUpdateCommand : CancellableAsyncCommand<PiwigoUpdateCommand
var server = await _persistenceContext.PiwigoServers.FindByIdAsync(settings.PiwigoServerId, cancellation); var server = await _persistenceContext.PiwigoServers.FindByIdAsync(settings.PiwigoServerId, cancellation);
if (server is null) if (server is null)
{ {
_logger.LogWarning("Could not find server with id {SettingsPiwigoServerId}", settings.PiwigoServerId); _logger.Warning("Could not find server with id {SettingsPiwigoServerId}", settings.PiwigoServerId);
AnsiConsole.MarkupLine($"[maroon]Could not find server with id {settings.PiwigoServerId}[/]"); AnsiConsole.MarkupLine($"[maroon]Could not find server with id {settings.PiwigoServerId}[/]");
return -2; return -2;
} }

View File

@ -2,9 +2,9 @@
using System.Diagnostics; using System.Diagnostics;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Threading.Channels; using System.Threading.Channels;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Services; using PiwigoDirectorySync.Services;
using Serilog;
using Spectre.Console; using Spectre.Console;
using Spectre.Console.Cli; using Spectre.Console.Cli;
@ -14,11 +14,10 @@ internal class ScanCommand : CancellableAsyncCommand<ScanCommand.ScanSettings>
{ {
private readonly IFileIndexer _fileIndexer; private readonly IFileIndexer _fileIndexer;
private readonly IFileSystemScanner _fileSystemScanner; private readonly IFileSystemScanner _fileSystemScanner;
private readonly ILogger<ScanCommand> _logger; private readonly ILogger _logger = Log.ForContext<ScanCommand>();
public ScanCommand(ILogger<ScanCommand> logger, IFileIndexer fileIndexer, IFileSystemScanner fileSystemScanner) public ScanCommand(IFileIndexer fileIndexer, IFileSystemScanner fileSystemScanner)
{ {
_logger = logger;
_fileIndexer = fileIndexer; _fileIndexer = fileIndexer;
_fileSystemScanner = fileSystemScanner; _fileSystemScanner = fileSystemScanner;
} }
@ -32,7 +31,7 @@ internal class ScanCommand : CancellableAsyncCommand<ScanCommand.ScanSettings>
internal static async Task ScanDirectory(ILogger logger, IFileIndexer fileIndexer, IFileSystemScanner fileSystemScanner, int piwigoServerId, CancellationToken ct) internal static async Task ScanDirectory(ILogger logger, IFileIndexer fileIndexer, IFileSystemScanner fileSystemScanner, int piwigoServerId, CancellationToken ct)
{ {
//TODO: check files for deletion -> files in db but no longer exist //TODO: check files for deletion -> files in db but no longer exist
logger.LogInformation("Starting scanner and remover"); logger.Information("Starting scanner and remover");
var stopWatch = Stopwatch.StartNew(); var stopWatch = Stopwatch.StartNew();
var fileQueue = Channel.CreateUnbounded<string>(); var fileQueue = Channel.CreateUnbounded<string>();
@ -42,12 +41,12 @@ internal class ScanCommand : CancellableAsyncCommand<ScanCommand.ScanSettings>
await Task.WhenAll(scannerTask, indexerTask); await Task.WhenAll(scannerTask, indexerTask);
stopWatch.Stop(); stopWatch.Stop();
logger.LogInformation("Processed {IndexerTotalFilesScanned} image files in {ElapsedTotalSeconds} seconds", fileIndexer.TotalFilesScanned, stopWatch.Elapsed.TotalSeconds); logger.Information("Processed {IndexerTotalFilesScanned} image files in {ElapsedTotalSeconds} seconds", fileIndexer.TotalFilesScanned, stopWatch.Elapsed.TotalSeconds);
foreach (var failedFilePath in fileIndexer.FailedFiles) foreach (var failedFilePath in fileIndexer.FailedFiles)
{ {
AnsiConsole.MarkupLine($"[red]Failed to index file {failedFilePath}[/]"); AnsiConsole.MarkupLine($"[red]Failed to index file {failedFilePath}[/]");
logger.LogError("Failed to index file {FailedFilePath}", failedFilePath); logger.Error("Failed to index file {FailedFilePath}", failedFilePath);
} }
} }

View File

@ -1,8 +1,8 @@
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Services; using PiwigoDirectorySync.Services;
using Serilog;
using Spectre.Console.Cli; using Spectre.Console.Cli;
namespace PiwigoDirectorySync.Commands; namespace PiwigoDirectorySync.Commands;
@ -10,24 +10,23 @@ namespace PiwigoDirectorySync.Commands;
internal class SyncAlbumsCommand : CancellableAsyncCommand<SyncAlbumsCommand.SyncAlbumsSettings> internal class SyncAlbumsCommand : CancellableAsyncCommand<SyncAlbumsCommand.SyncAlbumsSettings>
{ {
private readonly IAlbumSynchronizer _albumSynchronizer; private readonly IAlbumSynchronizer _albumSynchronizer;
private readonly ILogger<SyncAlbumsCommand> _logger; private readonly ILogger _logger = Log.ForContext<SyncAlbumsCommand>();
public SyncAlbumsCommand(ILogger<SyncAlbumsCommand> logger, IAlbumSynchronizer albumSynchronizer) public SyncAlbumsCommand(IAlbumSynchronizer albumSynchronizer)
{ {
_logger = logger;
_albumSynchronizer = albumSynchronizer; _albumSynchronizer = albumSynchronizer;
} }
protected override async Task<int> ExecuteAsync(CommandContext context, SyncAlbumsSettings settings, CancellationToken cancellationToken) protected override async Task<int> ExecuteAsync(CommandContext context, SyncAlbumsSettings settings, CancellationToken cancellationToken)
{ {
_logger.LogInformation("Starting album synchronization for piwigo server {SettingsPiwigoServerId}", settings.PiwigoServerId); _logger.Information("Starting album synchronization for piwigo server {SettingsPiwigoServerId}", settings.PiwigoServerId);
var stopWatch = Stopwatch.StartNew(); var stopWatch = Stopwatch.StartNew();
await _albumSynchronizer.SynchronizeAlbums(settings.PiwigoServerId, settings.CreateAlbumsOnServer, cancellationToken); await _albumSynchronizer.SynchronizeAlbums(settings.PiwigoServerId, settings.CreateAlbumsOnServer, cancellationToken);
stopWatch.Stop(); stopWatch.Stop();
_logger.LogInformation("Synchronized all albums with piwigo server {SettingsPiwigoServerId} in {ElapsedTotalSeconds} seconds", settings.PiwigoServerId, _logger.Information("Synchronized all albums with piwigo server {SettingsPiwigoServerId} in {ElapsedTotalSeconds} seconds", settings.PiwigoServerId,
stopWatch.Elapsed.TotalSeconds); stopWatch.Elapsed.TotalSeconds);
return 0; return 0;

View File

@ -1,7 +1,7 @@
using System.Diagnostics; using System.Diagnostics;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Services; using PiwigoDirectorySync.Services;
using Serilog;
using Spectre.Console.Cli; using Spectre.Console.Cli;
namespace PiwigoDirectorySync.Commands; namespace PiwigoDirectorySync.Commands;
@ -12,34 +12,32 @@ internal class SyncFullCommand : CancellableAsyncCommand<SyncFullCommand.SyncFul
private readonly IFileIndexer _fileIndexer; private readonly IFileIndexer _fileIndexer;
private readonly IFileSystemScanner _fileSystemScanner; private readonly IFileSystemScanner _fileSystemScanner;
private readonly IImageSynchronizer _imageSynchronizer; private readonly IImageSynchronizer _imageSynchronizer;
private readonly ILogger<SyncFullCommand> _logger; private readonly ILogger _logger = Log.ForContext<SyncFullCommand>();
public SyncFullCommand(IAlbumSynchronizer albumSynchronizer, IFileIndexer fileIndexer, IFileSystemScanner fileSystemScanner, IImageSynchronizer imageSynchronizer, public SyncFullCommand(IAlbumSynchronizer albumSynchronizer, IFileIndexer fileIndexer, IFileSystemScanner fileSystemScanner, IImageSynchronizer imageSynchronizer)
ILogger<SyncFullCommand> logger)
{ {
_albumSynchronizer = albumSynchronizer; _albumSynchronizer = albumSynchronizer;
_fileIndexer = fileIndexer; _fileIndexer = fileIndexer;
_fileSystemScanner = fileSystemScanner; _fileSystemScanner = fileSystemScanner;
_imageSynchronizer = imageSynchronizer; _imageSynchronizer = imageSynchronizer;
_logger = logger;
} }
protected override async Task<int> ExecuteAsync(CommandContext context, SyncFullSettings settings, CancellationToken cancellationToken) protected override async Task<int> ExecuteAsync(CommandContext context, SyncFullSettings settings, CancellationToken cancellationToken)
{ {
_logger.LogInformation("Starting full synchronization for piwigo server {SettingsPiwigoServerId}", settings.PiwigoServerId); _logger.Information("Starting full synchronization for piwigo server {SettingsPiwigoServerId}", settings.PiwigoServerId);
var stopWatch = Stopwatch.StartNew(); var stopWatch = Stopwatch.StartNew();
_logger.LogInformation("running file system scan"); _logger.Information("running file system scan");
await ScanCommand.ScanDirectory(_logger, _fileIndexer, _fileSystemScanner, settings.PiwigoServerId, cancellationToken); await ScanCommand.ScanDirectory(_logger, _fileIndexer, _fileSystemScanner, settings.PiwigoServerId, cancellationToken);
_logger.LogInformation("running album synchronization"); _logger.Information("running album synchronization");
await _albumSynchronizer.SynchronizeAlbums(settings.PiwigoServerId, true, cancellationToken); await _albumSynchronizer.SynchronizeAlbums(settings.PiwigoServerId, true, cancellationToken);
_logger.LogInformation("running image synchronization"); _logger.Information("running image synchronization");
await _imageSynchronizer.SynchronizeImagesAsync(settings.PiwigoServerId, cancellationToken); await _imageSynchronizer.SynchronizeImagesAsync(settings.PiwigoServerId, cancellationToken);
stopWatch.Stop(); stopWatch.Stop();
_logger.LogInformation("Full synchronization for piwigo server {SettingsPiwigoServerId} finished in {ElapsedTotalSeconds} seconds", settings.PiwigoServerId, _logger.Information("Full synchronization for piwigo server {SettingsPiwigoServerId} finished in {ElapsedTotalSeconds} seconds", settings.PiwigoServerId,
stopWatch.Elapsed.TotalSeconds); stopWatch.Elapsed.TotalSeconds);
return 0; return 0;

View File

@ -1,7 +1,7 @@
using System.Diagnostics; using System.Diagnostics;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Services; using PiwigoDirectorySync.Services;
using Serilog;
using Spectre.Console.Cli; using Spectre.Console.Cli;
namespace PiwigoDirectorySync.Commands; namespace PiwigoDirectorySync.Commands;
@ -9,23 +9,22 @@ namespace PiwigoDirectorySync.Commands;
internal class SyncImagesCommand : CancellableAsyncCommand<SyncImagesCommand.SyncImagesSettings> internal class SyncImagesCommand : CancellableAsyncCommand<SyncImagesCommand.SyncImagesSettings>
{ {
private readonly IImageSynchronizer _imageSynchronizer; private readonly IImageSynchronizer _imageSynchronizer;
private readonly ILogger<SyncImagesCommand> _logger; private readonly ILogger _logger = Log.ForContext<SyncImagesCommand>();
public SyncImagesCommand(ILogger<SyncImagesCommand> logger, IImageSynchronizer imageSynchronizer) public SyncImagesCommand(IImageSynchronizer imageSynchronizer)
{ {
_logger = logger;
_imageSynchronizer = imageSynchronizer; _imageSynchronizer = imageSynchronizer;
} }
protected override async Task<int> ExecuteAsync(CommandContext context, SyncImagesSettings settings, CancellationToken cancellationToken) protected override async Task<int> ExecuteAsync(CommandContext context, SyncImagesSettings settings, CancellationToken cancellationToken)
{ {
_logger.LogInformation("Starting image synchronization of piwigo server {SettingsPiwigoServerId}", settings.PiwigoServerId); _logger.Information("Starting image synchronization of piwigo server {SettingsPiwigoServerId}", settings.PiwigoServerId);
var stopWatch = Stopwatch.StartNew(); var stopWatch = Stopwatch.StartNew();
await _imageSynchronizer.SynchronizeImagesAsync(settings.PiwigoServerId, cancellationToken); await _imageSynchronizer.SynchronizeImagesAsync(settings.PiwigoServerId, cancellationToken);
stopWatch.Stop(); stopWatch.Stop();
_logger.LogInformation("Synchronized all images with piwigo server {SettingsPiwigoServerId} in {ElapsedTotalSeconds} seconds", settings.PiwigoServerId, _logger.Information("Synchronized all images with piwigo server {SettingsPiwigoServerId} in {ElapsedTotalSeconds} seconds", settings.PiwigoServerId,
stopWatch.Elapsed.TotalSeconds); stopWatch.Elapsed.TotalSeconds);
return 0; return 0;

View File

@ -1,7 +1,7 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Persistence; using PiwigoDirectorySync.Persistence;
using Serilog;
using Spectre.Console; using Spectre.Console;
using Spectre.Console.Cli; using Spectre.Console.Cli;
@ -9,12 +9,11 @@ namespace PiwigoDirectorySync.Commands;
internal class UpdateDatabaseCommand : CancellableAsyncCommand<UpdateDatabaseCommand.UpdateDatabaseSettings> internal class UpdateDatabaseCommand : CancellableAsyncCommand<UpdateDatabaseCommand.UpdateDatabaseSettings>
{ {
private readonly ILogger<UpdateDatabaseCommand> _logger; private readonly ILogger _logger = Log.ForContext<UpdateDatabaseCommand>();
private readonly PersistenceContext _persistenceContext; private readonly PersistenceContext _persistenceContext;
public UpdateDatabaseCommand(ILogger<UpdateDatabaseCommand> logger, PersistenceContext persistenceContext) public UpdateDatabaseCommand(PersistenceContext persistenceContext)
{ {
_logger = logger;
_persistenceContext = persistenceContext; _persistenceContext = persistenceContext;
} }
@ -31,7 +30,7 @@ internal class UpdateDatabaseCommand : CancellableAsyncCommand<UpdateDatabaseCom
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogCritical(ex, "Could not update database due to an error {ExMessage}", ex.Message); _logger.Fatal(ex, "Could not update database due to an error {ExMessage}", ex.Message);
AnsiConsole.WriteException(ex); AnsiConsole.WriteException(ex);
} }

View File

@ -11,7 +11,7 @@ using Serilog.Events;
using Serilog.Sinks.SystemConsole.Themes; using Serilog.Sinks.SystemConsole.Themes;
using Spectre.Console.Cli; using Spectre.Console.Cli;
const string outputTemplateConsole = "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}: {Message}"; const string outputTemplateConsole = "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}: {Message}{NewLine}";
const string outputTemplateFile = "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message}{NewLine}{NewLine}{Exception}{NewLine}"; const string outputTemplateFile = "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message}{NewLine}{NewLine}{Exception}{NewLine}";
Log.Logger = new LoggerConfiguration() Log.Logger = new LoggerConfiguration()
@ -20,7 +20,7 @@ Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("System", LogEventLevel.Warning) .MinimumLevel.Override("System", LogEventLevel.Warning)
.MinimumLevel.Override("Piwigo.Client", LogEventLevel.Warning) .MinimumLevel.Override("Piwigo.Client", LogEventLevel.Warning)
.Enrich.FromLogContext() .Enrich.FromLogContext()
.WriteTo.Console(LogEventLevel.Warning, outputTemplateConsole, theme: AnsiConsoleTheme.Literate) .WriteTo.Console(LogEventLevel.Information, outputTemplateConsole, theme: AnsiConsoleTheme.Code)
.WriteTo.File("logs/PiwigoDirectorySync.txt", LogEventLevel.Debug, outputTemplate:outputTemplateFile, rollingInterval: RollingInterval.Day) .WriteTo.File("logs/PiwigoDirectorySync.txt", LogEventLevel.Debug, outputTemplate:outputTemplateFile, rollingInterval: RollingInterval.Day)
.CreateLogger(); .CreateLogger();

View File

@ -1,21 +1,20 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Piwigo.Client; using Piwigo.Client;
using Piwigo.Client.Albums; using Piwigo.Client.Albums;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Persistence; using PiwigoDirectorySync.Persistence;
using Serilog;
namespace PiwigoDirectorySync.Services; namespace PiwigoDirectorySync.Services;
internal class AlbumSynchronizer : IAlbumSynchronizer internal class AlbumSynchronizer : IAlbumSynchronizer
{ {
private readonly ILogger<AlbumSynchronizer> _logger; private readonly ILogger _logger = Log.ForContext<AlbumSynchronizer>();
private readonly PersistenceContext _persistenceContext; private readonly PersistenceContext _persistenceContext;
private readonly IPiwigoClientFactory _piwigoClientFactory; private readonly IPiwigoClientFactory _piwigoClientFactory;
public AlbumSynchronizer(ILogger<AlbumSynchronizer> logger, IPiwigoClientFactory piwigoClientFactory, PersistenceContext persistenceContext) public AlbumSynchronizer(IPiwigoClientFactory piwigoClientFactory, PersistenceContext persistenceContext)
{ {
_logger = logger;
_piwigoClientFactory = piwigoClientFactory; _piwigoClientFactory = piwigoClientFactory;
_persistenceContext = persistenceContext; _persistenceContext = persistenceContext;
} }
@ -25,7 +24,7 @@ internal class AlbumSynchronizer : IAlbumSynchronizer
var piwigoServer = await _persistenceContext.PiwigoServers.FindAsync(new object?[] { piwigoServerId }, ct); var piwigoServer = await _persistenceContext.PiwigoServers.FindAsync(new object?[] { piwigoServerId }, ct);
if (piwigoServer is null) if (piwigoServer is null)
{ {
_logger.LogError("Could not sync albums with piwigo server {PiwigoServerId}", piwigoServerId); _logger.Error("Could not sync albums with piwigo server {PiwigoServerId}", piwigoServerId);
return; return;
} }
@ -34,12 +33,12 @@ internal class AlbumSynchronizer : IAlbumSynchronizer
await UpdatePiwigoAlbumsFromServerAsync(piwigoClient, piwigoServer, ct); await UpdatePiwigoAlbumsFromServerAsync(piwigoClient, piwigoServer, ct);
if (createAlbumsOnServer) if (createAlbumsOnServer)
{ {
_logger.LogInformation("Creating missing albums on server {PiwigoServerId} - {PiwigoServerName}", piwigoServer.Id, piwigoServer.Name); _logger.Information("Creating missing albums on server {PiwigoServerId} - {PiwigoServerName}", piwigoServer.Id, piwigoServer.Name);
await AddMissingAlbumsToServerAsync(piwigoClient, piwigoServer, ct); await AddMissingAlbumsToServerAsync(piwigoClient, piwigoServer, ct);
} }
else else
{ {
_logger.LogInformation("Skipping album creation on server {PiwigoServerId} - {PiwigoServerName}", piwigoServer.Id, piwigoServer.Name); _logger.Information("Skipping album creation on server {PiwigoServerId} - {PiwigoServerName}", piwigoServer.Id, piwigoServer.Name);
} }
} }
@ -69,7 +68,7 @@ internal class AlbumSynchronizer : IAlbumSynchronizer
foreach (var serverAlbum in serverAlbums) foreach (var serverAlbum in serverAlbums)
{ {
_logger.LogInformation("Updating piwigo server album {ServerAlbumName} with piwigo id {ServerAlbumId}", serverAlbum.Name, serverAlbum.Id); _logger.Information("Updating piwigo server album {ServerAlbumName} with piwigo id {ServerAlbumId}", serverAlbum.Name, serverAlbum.Id);
var albumEntity = await GetOrAddPiwigoAlbumEntityFromServerAsync(piwigoServer, serverAlbum, serverAlbumDictionary, ct); var albumEntity = await GetOrAddPiwigoAlbumEntityFromServerAsync(piwigoServer, serverAlbum, serverAlbumDictionary, ct);
if (serverAlbum.IdUpperCat.HasValue) if (serverAlbum.IdUpperCat.HasValue)
@ -88,7 +87,7 @@ internal class AlbumSynchronizer : IAlbumSynchronizer
var albumEntity = await _persistenceContext.PiwigoAlbums.FindByServerIdAsync(piwigoServer.Id, serverAlbum.Id, ct); var albumEntity = await _persistenceContext.PiwigoAlbums.FindByServerIdAsync(piwigoServer.Id, serverAlbum.Id, ct);
if (albumEntity != null) if (albumEntity != null)
{ {
_logger.LogDebug("Found existing album {AlbumEntityName} with local id {AlbumEntityId} and piwigo server id {ServerAlbumId}", albumEntity.Name, albumEntity.Id, _logger.Debug("Found existing album {AlbumEntityName} with local id {AlbumEntityId} and piwigo server id {ServerAlbumId}", albumEntity.Name, albumEntity.Id,
albumEntity.ServerAlbumId); albumEntity.ServerAlbumId);
return albumEntity; return albumEntity;
} }
@ -100,7 +99,7 @@ internal class AlbumSynchronizer : IAlbumSynchronizer
if (albumEntity != null) if (albumEntity != null)
{ {
albumEntity.ServerAlbumId = serverAlbum.Id; albumEntity.ServerAlbumId = serverAlbum.Id;
_logger.LogInformation("Linking existing album {AlbumEntityName} with local id {AlbumEntityId} to piwigo server id {ServerAlbumId}", albumEntity.Name, albumEntity.Id, _logger.Information("Linking existing album {AlbumEntityName} with local id {AlbumEntityId} to piwigo server id {ServerAlbumId}", albumEntity.Name, albumEntity.Id,
albumEntity.ServerAlbumId); albumEntity.ServerAlbumId);
return albumEntity; return albumEntity;
} }
@ -113,7 +112,7 @@ internal class AlbumSynchronizer : IAlbumSynchronizer
ServerAlbumId = serverAlbum.Id, ServerAlbumId = serverAlbum.Id,
Path = path Path = path
}; };
_logger.LogInformation("Adding piwigo album {AlbumEntityName} with local id {AlbumEntityId} and piwigo server id {ServerAlbumId}", albumEntity.Name, albumEntity.Id, _logger.Information("Adding piwigo album {AlbumEntityName} with local id {AlbumEntityId} and piwigo server id {ServerAlbumId}", albumEntity.Name, albumEntity.Id,
albumEntity.ServerAlbumId); albumEntity.ServerAlbumId);
_persistenceContext.PiwigoAlbums.Add(albumEntity); _persistenceContext.PiwigoAlbums.Add(albumEntity);
@ -136,7 +135,7 @@ internal class AlbumSynchronizer : IAlbumSynchronizer
parentId = currentParent.IdUpperCat ?? 0; parentId = currentParent.IdUpperCat ?? 0;
} }
_logger.LogDebug("Generated path {Path} for album with piwigo id {ServerAlbumId}", path, serverAlbum.Id); _logger.Debug("Generated path {Path} for album with piwigo id {ServerAlbumId}", path, serverAlbum.Id);
return path; return path;
} }

View File

@ -2,22 +2,22 @@
using System.Threading.Channels; using System.Threading.Channels;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Persistence; using PiwigoDirectorySync.Persistence;
using Serilog;
namespace PiwigoDirectorySync.Services; namespace PiwigoDirectorySync.Services;
internal class FileIndexer : IFileIndexer internal class FileIndexer : IFileIndexer
{ {
private readonly ConcurrentBag<string> _failedFiles = new(); private readonly ConcurrentBag<string> _failedFiles = new();
private readonly ILogger<FileIndexer> _logger; private readonly ILogger _logger = Log.ForContext<FileIndexer>();
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
private int _totalFilesScanned; private int _totalFilesScanned;
public FileIndexer(ILogger<FileIndexer> logger, IServiceProvider serviceProvider) public FileIndexer(IServiceProvider serviceProvider)
{ {
_logger = logger;
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
} }
@ -42,16 +42,16 @@ internal class FileIndexer : IFileIndexer
{ {
if (ct.IsCancellationRequested) if (ct.IsCancellationRequested)
{ {
_logger.LogWarning("Indexing cancelled"); _logger.Warning("Indexing cancelled");
return; return;
} }
_logger.LogInformation("Indexing file {FullFilePath}", fullFilePath); _logger.Information("Indexing file {FullFilePath}", fullFilePath);
var fileInfo = new FileInfo(fullFilePath); var fileInfo = new FileInfo(fullFilePath);
if (!fileInfo.Exists) if (!fileInfo.Exists)
{ {
_logger.LogWarning("File {FullFilePath} not found", fullFilePath); _logger.Warning("File {FullFilePath} not found", fullFilePath);
_failedFiles.Add(fullFilePath); _failedFiles.Add(fullFilePath);
return; return;
} }
@ -82,7 +82,7 @@ internal class FileIndexer : IFileIndexer
catch (Exception ex) catch (Exception ex)
{ {
_failedFiles.Add(fullFilePath); _failedFiles.Add(fullFilePath);
_logger.LogError(ex, "could not index file {FullFilePath}", fullFilePath); _logger.Error(ex, "could not index file {FullFilePath}", fullFilePath);
} }
} }

View File

@ -1,18 +1,16 @@
using System.Threading.Channels; using System.Threading.Channels;
using Microsoft.Extensions.Logging;
using PiwigoDirectorySync.Persistence; using PiwigoDirectorySync.Persistence;
using Serilog;
namespace PiwigoDirectorySync.Services; namespace PiwigoDirectorySync.Services;
internal class FileSystemScanner : IFileSystemScanner internal class FileSystemScanner : IFileSystemScanner
{ {
private readonly ILogger<FileSystemScanner> _logger; private readonly ILogger _logger = Log.ForContext<FileSystemScanner>();
private readonly PersistenceContext _persistenceContext; private readonly PersistenceContext _persistenceContext;
public FileSystemScanner(PersistenceContext persistenceContext)
public FileSystemScanner(ILogger<FileSystemScanner> logger, PersistenceContext persistenceContext)
{ {
_logger = logger;
_persistenceContext = persistenceContext; _persistenceContext = persistenceContext;
} }
@ -21,7 +19,7 @@ internal class FileSystemScanner : IFileSystemScanner
try try
{ {
var piwigoServer = await _persistenceContext.PiwigoServers.GetByIdAsync(piwigoServerId, ct); var piwigoServer = await _persistenceContext.PiwigoServers.GetByIdAsync(piwigoServerId, ct);
_logger.LogInformation("Scanning files for piwigo server {PiwigoServerName} in directory {PiwigoServerRootDirectory}", piwigoServer.Name, piwigoServer.RootDirectory); _logger.Information("Scanning files for piwigo server {PiwigoServerName} in directory {PiwigoServerRootDirectory}", piwigoServer.Name, piwigoServer.RootDirectory);
await ScanRootDirectory(fileQueue, new DirectoryInfo(piwigoServer.RootDirectory), ct); await ScanRootDirectory(fileQueue, new DirectoryInfo(piwigoServer.RootDirectory), ct);
} }
@ -33,7 +31,7 @@ internal class FileSystemScanner : IFileSystemScanner
private async ValueTask ScanRootDirectory(Channel<string> fileQueue, DirectoryInfo directory, CancellationToken ct) private async ValueTask ScanRootDirectory(Channel<string> fileQueue, DirectoryInfo directory, CancellationToken ct)
{ {
_logger.LogInformation("Scanning root directory {DirectoryFullName} for sidecars to delete", directory.FullName); _logger.Information("Scanning root directory {DirectoryFullName} for sidecars to delete", directory.FullName);
var parallelOptions = new ParallelOptions var parallelOptions = new ParallelOptions
{ {
CancellationToken = ct CancellationToken = ct
@ -45,7 +43,7 @@ internal class FileSystemScanner : IFileSystemScanner
{ {
try try
{ {
_logger.LogInformation("Scanning directory {DirectoryFullName} for images", directory.FullName); _logger.Information("Scanning directory {DirectoryFullName} for images", directory.FullName);
var imageFiles = AppSettings.SupportedExtensions.SelectMany(ext => directory.GetFiles($"*.{ext}", SearchOption.TopDirectoryOnly)) var imageFiles = AppSettings.SupportedExtensions.SelectMany(ext => directory.GetFiles($"*.{ext}", SearchOption.TopDirectoryOnly))
.Select(f => f.FullName) .Select(f => f.FullName)
@ -53,19 +51,19 @@ internal class FileSystemScanner : IFileSystemScanner
if (!imageFiles.Any()) if (!imageFiles.Any())
{ {
_logger.LogDebug("No images in {DirectoryFullName} found, skipping", directory.FullName); _logger.Debug("No images in {DirectoryFullName} found, skipping", directory.FullName);
return; return;
} }
foreach (var imageFile in imageFiles.Select(f => new FileInfo(f))) foreach (var imageFile in imageFiles.Select(f => new FileInfo(f)))
{ {
_logger.LogDebug("Found image {ImageFileFullName}, enqueue index", imageFile.FullName); _logger.Debug("Found image {ImageFileFullName}, enqueue index", imageFile.FullName);
await fileQueue.Writer.WriteAsync(imageFile.FullName, ct); await fileQueue.Writer.WriteAsync(imageFile.FullName, ct);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "could not scan directory {DirectoryFullName}", directory.FullName); _logger.Error(ex, "could not scan directory {DirectoryFullName}", directory.FullName);
} }
} }

View File

@ -1,23 +1,22 @@
using Flurl.Http; using Flurl.Http;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Piwigo.Client; using Piwigo.Client;
using Piwigo.Client.Albums; using Piwigo.Client.Albums;
using Piwigo.Client.Images; using Piwigo.Client.Images;
using PiwigoDirectorySync.Infrastructure; using PiwigoDirectorySync.Infrastructure;
using PiwigoDirectorySync.Persistence; using PiwigoDirectorySync.Persistence;
using Serilog;
namespace PiwigoDirectorySync.Services; namespace PiwigoDirectorySync.Services;
internal class ImageSynchronizer : IImageSynchronizer internal class ImageSynchronizer : IImageSynchronizer
{ {
private readonly ILogger<ImageSynchronizer> _logger; private readonly ILogger _logger = Log.ForContext<ImageSynchronizer>();
private readonly PersistenceContext _persistenceContext; private readonly PersistenceContext _persistenceContext;
private readonly IPiwigoClientFactory _piwigoClientFactory; private readonly IPiwigoClientFactory _piwigoClientFactory;
public ImageSynchronizer(ILogger<ImageSynchronizer> logger, IPiwigoClientFactory piwigoClientFactory, PersistenceContext persistenceContext) public ImageSynchronizer(IPiwigoClientFactory piwigoClientFactory, PersistenceContext persistenceContext)
{ {
_logger = logger;
_piwigoClientFactory = piwigoClientFactory; _piwigoClientFactory = piwigoClientFactory;
_persistenceContext = persistenceContext; _persistenceContext = persistenceContext;
} }
@ -27,11 +26,11 @@ internal class ImageSynchronizer : IImageSynchronizer
var piwigoServer = await _persistenceContext.PiwigoServers.FindAsync(new object?[] { piwigoServerId }, ct); var piwigoServer = await _persistenceContext.PiwigoServers.FindAsync(new object?[] { piwigoServerId }, ct);
if (piwigoServer is null) if (piwigoServer is null)
{ {
_logger.LogError("Could not sync images with piwigo server {PiwigoServerId}", piwigoServerId); _logger.Error("Could not sync images with piwigo server {PiwigoServerId}", piwigoServerId);
return; return;
} }
_logger.LogInformation("Downloading missing images of piwigo server {PiwigoServerName} using base path {PiwigoServerRootDirectory}", piwigoServer.Name, _logger.Information("Downloading missing images of piwigo server {PiwigoServerName} using base path {PiwigoServerRootDirectory}", piwigoServer.Name,
piwigoServer.RootDirectory); piwigoServer.RootDirectory);
var piwigoClient = await _piwigoClientFactory.GetPiwigoClientAsync(piwigoServer, ct); var piwigoClient = await _piwigoClientFactory.GetPiwigoClientAsync(piwigoServer, ct);
@ -43,7 +42,7 @@ internal class ImageSynchronizer : IImageSynchronizer
var albumInfos = await piwigoClient.Album.GetListAsync(albumId, false, false, ThumbnailSize.Thumb, ct); var albumInfos = await piwigoClient.Album.GetListAsync(albumId, false, false, ThumbnailSize.Thumb, ct);
var albumInfo = albumInfos.First(); var albumInfo = albumInfos.First();
_logger.LogInformation("Starting downloads for album {AlbumInfoName}", albumInfo.Name); _logger.Information("Starting downloads for album {AlbumInfoName}", albumInfo.Name);
await DownloadImagesForAlbumAsync(piwigoClient, piwigoServer, albumId, albumInfo, ct); await DownloadImagesForAlbumAsync(piwigoClient, piwigoServer, albumId, albumInfo, ct);
} }
@ -54,11 +53,11 @@ internal class ImageSynchronizer : IImageSynchronizer
var piwigoServer = await _persistenceContext.PiwigoServers.FindAsync(new object?[] { piwigoServerId }, ct); var piwigoServer = await _persistenceContext.PiwigoServers.FindAsync(new object?[] { piwigoServerId }, ct);
if (piwigoServer is null) if (piwigoServer is null)
{ {
_logger.LogError("Could not sync images with piwigo server {PiwigoServerId}", piwigoServerId); _logger.Error("Could not sync images with piwigo server {PiwigoServerId}", piwigoServerId);
return; return;
} }
_logger.LogInformation("Synchronizing images of piwigo server {PiwigoServerName} using base path {PiwigoServerRootDirectory}", piwigoServer.Name, _logger.Information("Synchronizing images of piwigo server {PiwigoServerName} using base path {PiwigoServerRootDirectory}", piwigoServer.Name,
piwigoServer.RootDirectory); piwigoServer.RootDirectory);
var piwigoClient = await _piwigoClientFactory.GetPiwigoClientAsync(piwigoServer, ct); var piwigoClient = await _piwigoClientFactory.GetPiwigoClientAsync(piwigoServer, ct);
@ -72,7 +71,7 @@ internal class ImageSynchronizer : IImageSynchronizer
{ {
if (albumInfo.NbImages is null or <= 0) if (albumInfo.NbImages is null or <= 0)
{ {
_logger.LogInformation("No images to download for empty album {AlbumId} / {AlbumInfoName}", albumId, albumInfo.Name); _logger.Information("No images to download for empty album {AlbumId} / {AlbumInfoName}", albumId, albumInfo.Name);
return; return;
} }
@ -99,7 +98,7 @@ internal class ImageSynchronizer : IImageSynchronizer
var localAlbum = await _persistenceContext.PiwigoAlbums.FindByServerIdAsync(piwigoServer.Id, albumInfo.Id, ct); var localAlbum = await _persistenceContext.PiwigoAlbums.FindByServerIdAsync(piwigoServer.Id, albumInfo.Id, ct);
if (localAlbum is null) if (localAlbum is null)
{ {
_logger.LogWarning("Could not add image {ImageId} / {ImageFile}: album with server id {AlbumInfoId} / {AlbumInfoName} not found", image.Id, image.File, albumInfo.Id, _logger.Warning("Could not add image {ImageId} / {ImageFile}: album with server id {AlbumInfoId} / {AlbumInfoName} not found", image.Id, image.File, albumInfo.Id,
albumInfo.Name); albumInfo.Name);
return; return;
} }
@ -109,7 +108,7 @@ internal class ImageSynchronizer : IImageSynchronizer
var fileInfo = new FileInfo(Path.Combine(piwigoServer.RootDirectory, localImage.FilePath)); var fileInfo = new FileInfo(Path.Combine(piwigoServer.RootDirectory, localImage.FilePath));
if (fileInfo.Exists) if (fileInfo.Exists)
{ {
_logger.LogWarning("Tried to download image {ImageFile} but it already exists", image.File); _logger.Warning("Tried to download image {ImageFile} but it already exists", image.File);
return; return;
} }
@ -144,7 +143,7 @@ internal class ImageSynchronizer : IImageSynchronizer
.Where(i => i.ServerImageId != null && i.Album.ServerId == piwigoServer.Id && i.UploadRequired) .Where(i => i.ServerImageId != null && i.Album.ServerId == piwigoServer.Id && i.UploadRequired)
.ToListAsync(ct); .ToListAsync(ct);
_logger.LogInformation("Updating {Count} images", imagesToUpload.Count); _logger.Information("Updating {Count} images", imagesToUpload.Count);
foreach (var imageEntity in imagesToUpload) foreach (var imageEntity in imagesToUpload)
{ {
@ -155,7 +154,7 @@ internal class ImageSynchronizer : IImageSynchronizer
imageEntity.ServerImageId = imageUploaded.ImageId; imageEntity.ServerImageId = imageUploaded.ImageId;
imageEntity.UploadRequired = false; imageEntity.UploadRequired = false;
_logger.LogInformation("Updated image {ImageEntityName} ({ImageEntityId}) on piwigo server with id {ImageEntityServerImageId}", imageEntity.Name, imageEntity.Id, _logger.Information("Updated image {ImageEntityName} ({ImageEntityId}) on piwigo server with id {ImageEntityServerImageId}", imageEntity.Name, imageEntity.Id,
imageEntity.ServerImageId); imageEntity.ServerImageId);
await _persistenceContext.SaveChangesAsync(ct); await _persistenceContext.SaveChangesAsync(ct);
@ -168,7 +167,7 @@ internal class ImageSynchronizer : IImageSynchronizer
.Where(i => i.ServerImageId == null && i.Album.ServerId == piwigoServer.Id && i.Album.ServerAlbumId != null) .Where(i => i.ServerImageId == null && i.Album.ServerId == piwigoServer.Id && i.Album.ServerAlbumId != null)
.ToListAsync(ct); .ToListAsync(ct);
_logger.LogInformation("Uploading {Count} images", imagesToUpload.Count); _logger.Information("Uploading {Count} images", imagesToUpload.Count);
foreach (var imageEntity in imagesToUpload) foreach (var imageEntity in imagesToUpload)
{ {
@ -179,7 +178,7 @@ internal class ImageSynchronizer : IImageSynchronizer
imageEntity.ServerImageId = imageUploaded.ImageId; imageEntity.ServerImageId = imageUploaded.ImageId;
imageEntity.UploadRequired = false; imageEntity.UploadRequired = false;
_logger.LogInformation("Uploaded image {ImageEntityName} ({ImageEntityId}) to piwigo server with id {ImageEntityServerImageId}", imageEntity.Name, imageEntity.Id, _logger.Information("Uploaded image {ImageEntityName} ({ImageEntityId}) to piwigo server with id {ImageEntityServerImageId}", imageEntity.Name, imageEntity.Id,
imageEntity.ServerImageId); imageEntity.ServerImageId);
await _persistenceContext.SaveChangesAsync(ct); await _persistenceContext.SaveChangesAsync(ct);
@ -205,7 +204,7 @@ internal class ImageSynchronizer : IImageSynchronizer
.Where(i => i.ServerImageId == null && i.Album.ServerId == piwigoServer.Id) .Where(i => i.ServerImageId == null && i.Album.ServerId == piwigoServer.Id)
.ToListAsync(ct); .ToListAsync(ct);
_logger.LogInformation("Checking {Count} images if they exist", imagesToSearch.Count); _logger.Information("Checking {Count} images if they exist", imagesToSearch.Count);
var md5SumsToCheck = imagesToSearch.Where(i => i.Md5Sum != null).DistinctBy(i => i.Md5Sum).ToDictionary(i => i.Md5Sum!, i => i, StringComparer.OrdinalIgnoreCase); var md5SumsToCheck = imagesToSearch.Where(i => i.Md5Sum != null).DistinctBy(i => i.Md5Sum).ToDictionary(i => i.Md5Sum!, i => i, StringComparer.OrdinalIgnoreCase);
@ -221,7 +220,7 @@ internal class ImageSynchronizer : IImageSynchronizer
imageEntity.ServerImageId = existingImage.Value; imageEntity.ServerImageId = existingImage.Value;
imageEntity.UploadRequired = false; imageEntity.UploadRequired = false;
_logger.LogInformation("Found image {ImageEntityName} ({ImageEntityId}) on piwigo server with id {ImageEntityServerImageId}", imageEntity.Name, imageEntity.Id, _logger.Information("Found image {ImageEntityName} ({ImageEntityId}) on piwigo server with id {ImageEntityServerImageId}", imageEntity.Name, imageEntity.Id,
imageEntity.ServerImageId); imageEntity.ServerImageId);
} }