diff --git a/API.Tests/Helpers/ScannerHelper.cs b/API.Tests/Helpers/ScannerHelper.cs index 9ed6d8005..f9ec69124 100644 --- a/API.Tests/Helpers/ScannerHelper.cs +++ b/API.Tests/Helpers/ScannerHelper.cs @@ -21,6 +21,7 @@ using API.Services.Tasks; using API.Services.Tasks.Metadata; using API.Services.Tasks.Scanner; using API.SignalR; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NSubstitute; using Xunit.Abstractions; @@ -75,6 +76,7 @@ public class ScannerHelper Substitute.For(), ds, Substitute.For>()); + var processSeries = new ProcessSeries(_unitOfWork, Substitute.For>(), Substitute.For(), ds, Substitute.For(), readingItemService, new FileService(fs), @@ -83,10 +85,20 @@ public class ScannerHelper Substitute.For(), Substitute.For()); + var serviceProvider = Substitute.For(); + serviceProvider.GetService(typeof(IUnitOfWork)).Returns(_unitOfWork); + serviceProvider.GetService(typeof(IProcessSeries)).Returns(processSeries); + + var scope = Substitute.For(); + scope.ServiceProvider.Returns(serviceProvider); + + var scopeFactory = Substitute.For(); + scopeFactory.CreateScope().Returns(scope); + var scanner = new ScannerService(_unitOfWork, Substitute.For>(), Substitute.For(), Substitute.For(), Substitute.For(), ds, - readingItemService, processSeries, Substitute.For()); + readingItemService, scopeFactory, Substitute.For()); return scanner; } diff --git a/API/Services/Tasks/ScannerService.cs b/API/Services/Tasks/ScannerService.cs index b8afdbd90..742d268f8 100644 --- a/API/Services/Tasks/ScannerService.cs +++ b/API/Services/Tasks/ScannerService.cs @@ -19,6 +19,7 @@ using API.Services.Tasks.Scanner; using API.Services.Tasks.Scanner.Parser; using API.SignalR; using Hangfire; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace API.Services.Tasks; @@ -86,13 +87,13 @@ public class ScannerService : IScannerService private readonly IEventHub _eventHub; private readonly IDirectoryService _directoryService; private readonly IReadingItemService _readingItemService; - private readonly IProcessSeries _processSeries; private readonly IWordCountAnalyzerService _wordCountAnalyzerService; + private readonly IServiceScopeFactory _scopeFactory; public ScannerService(IUnitOfWork unitOfWork, ILogger logger, IMetadataService metadataService, ICacheService cacheService, IEventHub eventHub, IDirectoryService directoryService, IReadingItemService readingItemService, - IProcessSeries processSeries, IWordCountAnalyzerService wordCountAnalyzerService) + IServiceScopeFactory scopeFactory, IWordCountAnalyzerService wordCountAnalyzerService) { _unitOfWork = unitOfWork; _logger = logger; @@ -101,7 +102,7 @@ public class ScannerService : IScannerService _eventHub = eventHub; _directoryService = directoryService; _readingItemService = readingItemService; - _processSeries = processSeries; + _scopeFactory = scopeFactory; _wordCountAnalyzerService = wordCountAnalyzerService; } @@ -318,7 +319,16 @@ public class ScannerService : IScannerService // Process Series var seriesProcessStopWatch = Stopwatch.StartNew(); var settings = await _unitOfWork.SettingsRepository.GetMetadataSettingDto(); - await _processSeries.ProcessSeriesAsync(settings, parsedSeries[pSeries], library, seriesLeftToProcess, bypassFolderOptimizationChecks); + + using var scope = _scopeFactory.CreateScope(); + var unitOfWork = scope.ServiceProvider.GetRequiredService(); + var processSeries = scope.ServiceProvider.GetRequiredService(); + + // Library needs to be returned from the used UnitOfWork + library = (await unitOfWork.LibraryRepository.GetLibraryForIdAsync(library.Id, LibraryIncludes.Folders | LibraryIncludes.FileTypes | LibraryIncludes.ExcludePatterns))!; + + await processSeries.ProcessSeriesAsync(settings, parsedSeries[pSeries], library, seriesLeftToProcess, bypassFolderOptimizationChecks); + _logger.LogTrace("[TIME] Kavita took {Time} ms to process {SeriesName}", seriesProcessStopWatch.ElapsedMilliseconds, parsedSeries[pSeries][0].Series); seriesLeftToProcess--; } @@ -672,7 +682,16 @@ public class ScannerService : IScannerService { totalFiles += pSeries.Value.Count; var seriesProcessStopWatch = Stopwatch.StartNew(); - await _processSeries.ProcessSeriesAsync(settings, pSeries.Value, library, seriesLeftToProcess, forceUpdate); + + using var scope = _scopeFactory.CreateScope(); + var unitOfWork = scope.ServiceProvider.GetRequiredService(); + var processSeries = scope.ServiceProvider.GetRequiredService(); + + // Library needs to be returned from the used UnitOfWork + library = (await unitOfWork.LibraryRepository.GetLibraryForIdAsync(library.Id, LibraryIncludes.Folders | LibraryIncludes.FileTypes | LibraryIncludes.ExcludePatterns))!; + + await processSeries.ProcessSeriesAsync(settings, pSeries.Value, library, seriesLeftToProcess, forceUpdate); + _logger.LogTrace("[TIME] Kavita took {Time} ms to process {SeriesName}", seriesProcessStopWatch.ElapsedMilliseconds, pSeries.Value[0].Series); seriesLeftToProcess--; }