using System.Globalization; using ErsatzTV.Application.Libraries; using ErsatzTV.Core; using ErsatzTV.Core.Errors; using ErsatzTV.Core.Interfaces.Metadata; using ErsatzTV.Core.Interfaces.Repositories; using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.Infrastructure.Data; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace ErsatzTV.Application.Jellyfin; public class CallJellyfinShowScannerHandler : CallLibraryScannerHandler, IRequestHandler> { private readonly IScannerProxyService _scannerProxyService; public CallJellyfinShowScannerHandler( IDbContextFactory dbContextFactory, IConfigElementRepository configElementRepository, IScannerProxyService scannerProxyService, IRuntimeInfo runtimeInfo, ILogger logger) : base(dbContextFactory, configElementRepository, runtimeInfo, logger) { _scannerProxyService = scannerProxyService; } Task> IRequestHandler>.Handle( SynchronizeJellyfinShowById request, CancellationToken cancellationToken) => Handle(request, cancellationToken); private async Task> Handle( SynchronizeJellyfinShowById request, CancellationToken cancellationToken) { Validation validation = await Validate(request, cancellationToken); return await validation.Match( parameters => PerformScan(parameters, request, cancellationToken), error => { foreach (ScanIsNotRequired scanIsNotRequired in error.OfType()) { return Task.FromResult>(scanIsNotRequired); } return Task.FromResult>(error.Join()); }); } private async Task> PerformScan( ScanParameters parameters, SynchronizeJellyfinShowById request, CancellationToken cancellationToken) { Option maybeScanId = _scannerProxyService.StartScan(request.JellyfinLibraryId); foreach (var scanId in maybeScanId) { try { var arguments = new List { "scan-jellyfin-show", request.JellyfinLibraryId.ToString(CultureInfo.InvariantCulture), request.ShowId.ToString(CultureInfo.InvariantCulture), GetBaseUrl(scanId) }; if (request.DeepScan) { arguments.Add("--deep"); } return await base.PerformScan(parameters, arguments, cancellationToken); } finally { _scannerProxyService.EndScan(scanId); } } return BaseError.New($"Library {request.JellyfinLibraryId} is already scanning"); } protected override Task> GetLastScan( TvContext dbContext, SynchronizeJellyfinShowById request, CancellationToken cancellationToken) => Task.FromResult(new Tuple(string.Empty, DateTimeOffset.MinValue)); protected override bool ScanIsRequired( DateTimeOffset lastScan, int libraryRefreshInterval, SynchronizeJellyfinShowById request) => true; }