Potential scanner fix (#4242)

This commit is contained in:
Fesaa 2025-11-29 15:32:23 +01:00 committed by GitHub
parent c4fed09e48
commit 5dd010b1b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 37 additions and 6 deletions

View File

@ -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<IImageService>(), ds, Substitute.For<ILogger<ReadingItemService>>());
var processSeries = new ProcessSeries(_unitOfWork, Substitute.For<ILogger<ProcessSeries>>(),
Substitute.For<IEventHub>(),
ds, Substitute.For<ICacheHelper>(), readingItemService, new FileService(fs),
@ -83,10 +85,20 @@ public class ScannerHelper
Substitute.For<IReadingListService>(),
Substitute.For<IExternalMetadataService>());
var serviceProvider = Substitute.For<IServiceProvider>();
serviceProvider.GetService(typeof(IUnitOfWork)).Returns(_unitOfWork);
serviceProvider.GetService(typeof(IProcessSeries)).Returns(processSeries);
var scope = Substitute.For<IServiceScope>();
scope.ServiceProvider.Returns(serviceProvider);
var scopeFactory = Substitute.For<IServiceScopeFactory>();
scopeFactory.CreateScope().Returns(scope);
var scanner = new ScannerService(_unitOfWork, Substitute.For<ILogger<ScannerService>>(),
Substitute.For<IMetadataService>(),
Substitute.For<ICacheService>(), Substitute.For<IEventHub>(), ds,
readingItemService, processSeries, Substitute.For<IWordCountAnalyzerService>());
readingItemService, scopeFactory, Substitute.For<IWordCountAnalyzerService>());
return scanner;
}

View File

@ -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<ScannerService> 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<IUnitOfWork>();
var processSeries = scope.ServiceProvider.GetRequiredService<IProcessSeries>();
// 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<IUnitOfWork>();
var processSeries = scope.ServiceProvider.GetRequiredService<IProcessSeries>();
// 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--;
}