diff --git a/API/Services/Plus/ExternalMetadataService.cs b/API/Services/Plus/ExternalMetadataService.cs index 55e53560a..ed89cdad5 100644 --- a/API/Services/Plus/ExternalMetadataService.cs +++ b/API/Services/Plus/ExternalMetadataService.cs @@ -1629,15 +1629,15 @@ public class ExternalMetadataService : IExternalMetadataService } /// - /// Returns true if the series should be marked as completed, checks loosy with #chapters and #series; Also tries - /// to use specials to reach the required amount + /// Returns true if the series should be marked as completed, checks loosey with chapter and series numbers. + /// Respects Specials to reach the required amount. /// /// /// /// /// /// - /// Updates MaxCount and TotalCount if a loosy check is used to set as completed + /// Updates MaxCount and TotalCount if a loosey check is used to set as completed public static bool IsSeriesCompleted(Series series, List chapters, ExternalSeriesDetailDto externalMetadata, int maxVolumes) { // A series is completed if exactly the amount is found @@ -1648,12 +1648,17 @@ public class ExternalMetadataService : IExternalMetadataService // If volumes are collected, check if we reach the required volumes by including specials // - // TODO BUG: If the series has specials, that are not included in the external count. But you do own them + // TODO BUG: If the series has specials, that are not included in the external count. But you do own them // This may mark the series as completed pre-maturely // Note: I've currently opted to keep this an equals to prevent the above bug from happening // We *could* change this to >= in the future in case this is reported by users // If we do; test IsSeriesCompleted_Volumes_TooManySpecials needs to be updated - if (maxVolumes != Parser.DefaultChapterNumber && series.Volumes.Count == externalMetadata.Volumes) + + // Note: If Kavita has specials, we should be lenient and ignore for the volume check + var volumeModifier = series.Volumes.Any(v => v.Name == Parser.SpecialVolume) ? 1 : 0; + var modifiedMinVolumeCount = series.Volumes.Count - volumeModifier; + if (maxVolumes != Parser.DefaultChapterNumber && + (externalMetadata.Volumes == series.Volumes.Count || externalMetadata.Volumes == modifiedMinVolumeCount)) { series.Metadata.MaxCount = series.Volumes.Count; series.Metadata.TotalCount = series.Volumes.Count;