adds full sync command
All checks were successful
PiwigoDirectorySync/pipeline/head This commit looks good
All checks were successful
PiwigoDirectorySync/pipeline/head This commit looks good
This commit is contained in:
parent
98fea6c0be
commit
303d69efe6
@ -1,9 +1,30 @@
|
|||||||
using Spectre.Console.Cli;
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using Spectre.Console;
|
||||||
|
using Spectre.Console.Cli;
|
||||||
|
|
||||||
namespace PiwigoDirectorySync.Commands;
|
namespace PiwigoDirectorySync.Commands;
|
||||||
|
|
||||||
|
[SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Global", Justification = "Done by parser")]
|
||||||
public class CommonCommandSettings : CommandSettings
|
public class CommonCommandSettings : CommandSettings
|
||||||
{
|
{
|
||||||
[CommandArgument(0, "<PiwigoServerId>")]
|
[CommandArgument(0, "[PiwigoServerId]")]
|
||||||
public int PiwigoServerId { get; set; }
|
[DefaultValue(1)]
|
||||||
|
public int PiwigoServerId { get; init; }
|
||||||
|
|
||||||
|
public override ValidationResult Validate()
|
||||||
|
{
|
||||||
|
var baseResult = base.Validate();
|
||||||
|
if (!baseResult.Successful)
|
||||||
|
{
|
||||||
|
return baseResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PiwigoServerId < 1)
|
||||||
|
{
|
||||||
|
return ValidationResult.Error("the piwigo server id can not be less than 1");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ValidationResult.Success();
|
||||||
|
}
|
||||||
}
|
}
|
@ -20,29 +20,34 @@ public class ScanCommand : AsyncCommand<ScanSettings>
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<int> ExecuteAsync(CommandContext context, ScanSettings settings)
|
public override async Task<int> ExecuteAsync(CommandContext context, ScanSettings settings)
|
||||||
|
{
|
||||||
|
var cancellationTokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
|
await ScanDirectory(_logger, _fileIndexer, _fileSystemScanner, settings.PiwigoServerId, cancellationTokenSource.Token);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
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.LogInformation("Starting scanner and remover");
|
||||||
var stopWatch = Stopwatch.StartNew();
|
var stopWatch = Stopwatch.StartNew();
|
||||||
|
|
||||||
var cancellationTokenSource = new CancellationTokenSource();
|
|
||||||
|
|
||||||
var fileQueue = Channel.CreateUnbounded<string>();
|
var fileQueue = Channel.CreateUnbounded<string>();
|
||||||
|
|
||||||
var indexerTask = _fileIndexer.StartProcessingAsync(fileQueue, settings.PiwigoServerId, cancellationTokenSource.Token);
|
var indexerTask = fileIndexer.StartProcessingAsync(fileQueue, piwigoServerId, ct);
|
||||||
|
|
||||||
await _fileSystemScanner.ScanAsync(fileQueue, settings.PiwigoServerId, cancellationTokenSource.Token);
|
await fileSystemScanner.ScanAsync(fileQueue, piwigoServerId, ct);
|
||||||
|
|
||||||
fileQueue.Writer.Complete();
|
fileQueue.Writer.Complete();
|
||||||
|
|
||||||
await Task.WhenAll(fileQueue.Reader.Completion, indexerTask);
|
await Task.WhenAll(fileQueue.Reader.Completion, indexerTask);
|
||||||
|
|
||||||
stopWatch.Stop();
|
stopWatch.Stop();
|
||||||
_logger.LogInformation("Processed {IndexerTotalFilesScanned} image files in {ElapsedTotalSeconds} seconds", _fileIndexer.TotalFilesScanned, stopWatch.Elapsed.TotalSeconds);
|
logger.LogInformation("Processed {IndexerTotalFilesScanned} image files in {ElapsedTotalSeconds} seconds", fileIndexer.TotalFilesScanned, stopWatch.Elapsed.TotalSeconds);
|
||||||
|
|
||||||
//TODO: write failed files to log
|
//TODO: write failed files to log
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
48
PiwigoDirectorySync/Commands/SyncFullCommand.cs
Normal file
48
PiwigoDirectorySync/Commands/SyncFullCommand.cs
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using PiwigoDirectorySync.Services;
|
||||||
|
using Spectre.Console.Cli;
|
||||||
|
|
||||||
|
namespace PiwigoDirectorySync.Commands;
|
||||||
|
|
||||||
|
public class SyncFullCommand : AsyncCommand<SyncFullSettings>
|
||||||
|
{
|
||||||
|
private readonly IAlbumSynchronizer _albumSynchronizer;
|
||||||
|
private readonly IFileIndexer _fileIndexer;
|
||||||
|
private readonly IFileSystemScanner _fileSystemScanner;
|
||||||
|
private readonly IImageSynchronizer _imageSynchronizer;
|
||||||
|
private readonly ILogger<SyncFullCommand> _logger;
|
||||||
|
|
||||||
|
public SyncFullCommand(IAlbumSynchronizer albumSynchronizer, IFileIndexer fileIndexer, IFileSystemScanner fileSystemScanner, IImageSynchronizer imageSynchronizer,
|
||||||
|
ILogger<SyncFullCommand> logger)
|
||||||
|
{
|
||||||
|
_albumSynchronizer = albumSynchronizer;
|
||||||
|
_fileIndexer = fileIndexer;
|
||||||
|
_fileSystemScanner = fileSystemScanner;
|
||||||
|
_imageSynchronizer = imageSynchronizer;
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task<int> ExecuteAsync(CommandContext context, SyncFullSettings settings)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("Starting full synchronization for piwigo server {SettingsPiwigoServerId}", settings.PiwigoServerId);
|
||||||
|
var stopWatch = Stopwatch.StartNew();
|
||||||
|
|
||||||
|
var cancellationTokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
|
_logger.LogInformation("running file system scan");
|
||||||
|
await ScanCommand.ScanDirectory(_logger, _fileIndexer, _fileSystemScanner, settings.PiwigoServerId, cancellationTokenSource.Token);
|
||||||
|
|
||||||
|
_logger.LogInformation("running album synchronization");
|
||||||
|
await _albumSynchronizer.SynchronizeAlbums(settings.PiwigoServerId, cancellationTokenSource.Token);
|
||||||
|
|
||||||
|
_logger.LogInformation("running image synchronization");
|
||||||
|
await _imageSynchronizer.SynchronizeImages(settings.PiwigoServerId, cancellationTokenSource.Token);
|
||||||
|
|
||||||
|
stopWatch.Stop();
|
||||||
|
_logger.LogInformation("Full synchronization for piwigo server {SettingsPiwigoServerId} finished in {ElapsedTotalSeconds} seconds", settings.PiwigoServerId,
|
||||||
|
stopWatch.Elapsed.TotalSeconds);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
3
PiwigoDirectorySync/Commands/SyncFullSettings.cs
Normal file
3
PiwigoDirectorySync/Commands/SyncFullSettings.cs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
namespace PiwigoDirectorySync.Commands;
|
||||||
|
|
||||||
|
public class SyncFullSettings : CommonCommandSettings {}
|
@ -49,6 +49,7 @@ app.Configure(config =>
|
|||||||
{
|
{
|
||||||
c.AddCommand<SyncAlbumsCommand>("albums");
|
c.AddCommand<SyncAlbumsCommand>("albums");
|
||||||
c.AddCommand<SyncImagesCommand>("images");
|
c.AddCommand<SyncImagesCommand>("images");
|
||||||
|
c.AddCommand<SyncFullCommand>("full");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -24,6 +24,12 @@
|
|||||||
"commandLineArgs": "sync images 1",
|
"commandLineArgs": "sync images 1",
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"SyncFull": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"commandLineArgs": "sync full",
|
||||||
|
"environmentVariables": {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user