Progress Overhaul + Profile Page and a LOT more! (#4262)

Co-authored-by: Amelia <77553571+Fesaa@users.noreply.github.com>
Co-authored-by: Robbie Davis <robbie@therobbiedavis.com>
This commit is contained in:
Joe Milazzo
2025-12-09 10:00:11 -07:00
committed by GitHub
parent 4ac13f1f25
commit 9f29fa593d
645 changed files with 25585 additions and 4805 deletions
+36 -10
View File
@@ -4,7 +4,6 @@ using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;
using API.Data;
@@ -12,7 +11,6 @@ using API.Data.Repositories;
using API.DTOs.KavitaPlus.Metadata;
using API.DTOs.Settings;
using API.Entities;
using API.Entities.Enums;
using API.Extensions;
using API.Helpers;
using API.Helpers.Builders;
@@ -219,6 +217,9 @@ public class ScannerService : IScannerService
var series = await _unitOfWork.SeriesRepository.GetFullSeriesForSeriesIdAsync(seriesId);
if (series == null) return; // This can occur when UI deletes a series but doesn't update and user re-requests update
var settings = await _unitOfWork.SettingsRepository.GetMetadataSettingDto();
var serverSettings = await _unitOfWork.SettingsRepository.GetSettingsDtoAsync();
var existingChapterIdsToClean = await _unitOfWork.SeriesRepository.GetChapterIdsForSeriesAsync(new[] {seriesId});
var library = await _unitOfWork.LibraryRepository.GetLibraryForIdAsync(series.LibraryId, LibraryIncludes.Folders | LibraryIncludes.FileTypes | LibraryIncludes.ExcludePatterns);
@@ -227,8 +228,6 @@ public class ScannerService : IScannerService
var libraryPaths = library.Folders.Select(f => f.Path).ToList();
if (await ShouldScanSeries(seriesId, library, libraryPaths, series, true) != ScanCancelReason.NoCancel)
{
var serverSettings = await _unitOfWork.SettingsRepository.GetSettingsDtoAsync();
BackgroundJob.Enqueue(() => _metadataService.GenerateCoversForSeries(serverSettings, series.LibraryId, seriesId, false, false));
BackgroundJob.Enqueue(() => _wordCountAnalyzerService.ScanSeries(library.Id, seriesId, bypassFolderOptimizationChecks));
return;
@@ -318,14 +317,41 @@ public class ScannerService : IScannerService
key.NormalizedName.Equals(series.OriginalName?.ToNormalized()))
.ToList();
var settings = await _unitOfWork.SettingsRepository.GetMetadataSettingDto();
var toProcessList = toProcess.Select(k => parsedSeries[k]).ToList();
await ProcessParserInfo(settings, toProcessList, library, bypassFolderOptimizationChecks);
var totalCount = toProcessList.Count;
var current = 0;
foreach (var pSeries in toProcessList)
{
current++;
using var scope = _scopeFactory.CreateScope();
var processSeries = scope.ServiceProvider.GetRequiredService<IProcessSeries>();
var unitOfWork = scope.ServiceProvider.GetRequiredService<IUnitOfWork>();
var scopedLibrary = (await unitOfWork.LibraryRepository.GetLibraryForIdAsync(library.Id, LibraryIncludes.Folders | LibraryIncludes.FileTypes | LibraryIncludes.ExcludePatterns))!;
var processedSeriesId = await processSeries.ProcessSeriesAsync(settings, pSeries, new ProcessSeriesArgs
{
Library = scopedLibrary,
LeftToProcess = totalCount - current,
TotalToProcess = totalCount,
ForceUpdate = bypassFolderOptimizationChecks,
});
if (processedSeriesId != null)
{
var metadataService = scope.ServiceProvider.GetRequiredService<IMetadataService>();
var wordCountAnalyzerService = scope.ServiceProvider.GetRequiredService<IWordCountAnalyzerService>();
await metadataService.GenerateCoversForSeries(serverSettings, scopedLibrary.Id, processedSeriesId.Value, bypassFolderOptimizationChecks, false);
await wordCountAnalyzerService.ScanSeries(scopedLibrary.Id, processedSeriesId.Value, bypassFolderOptimizationChecks);
}
}
// Tell UI that this series is done
await _eventHub.SendMessageAsync(MessageFactory.ScanSeries,
MessageFactory.ScanSeriesEvent(library.Id, seriesId, series.Name));
await _eventHub.SendMessageAsync(MessageFactory.NotificationProgress,
MessageFactory.LibraryScanProgressEvent(library.Name, ProgressEventType.Ended, series.Name));
await _metadataService.RemoveAbandonedMetadataKeys();
@@ -785,7 +811,7 @@ public class ScannerService : IScannerService
}
await _eventHub.SendMessageAsync(MessageFactory.NotificationProgress,
MessageFactory.FileScanProgressEvent(string.Empty, libraryName, ProgressEventType.Ended));
MessageFactory.LibraryScanProgressEvent(string.Empty, libraryName, ProgressEventType.Ended));
_logger.LogDebug("[ScannerService] Finished writing metadata for {Count} series in {Elapsed}ms", toProcess.Count, sw.ElapsedMilliseconds);