diff --git a/API/Comparators/ChapterSortComparer.cs b/API/Comparators/ChapterSortComparer.cs index 0e7f61a61e..ca55381bc0 100644 --- a/API/Comparators/ChapterSortComparer.cs +++ b/API/Comparators/ChapterSortComparer.cs @@ -23,6 +23,8 @@ public int Compare(double x, double y) return x.CompareTo(y); } + + public static readonly ChapterSortComparer Default = new ChapterSortComparer(); } /// @@ -44,6 +46,8 @@ public int Compare(double x, double y) return x.CompareTo(y); } + + public static readonly ChapterSortComparerZeroFirst Default = new ChapterSortComparerZeroFirst(); } public class SortComparerZeroLast : IComparer diff --git a/API/Controllers/TachiyomiController.cs b/API/Controllers/TachiyomiController.cs index 4f1fb965ec..58f1953d38 100644 --- a/API/Controllers/TachiyomiController.cs +++ b/API/Controllers/TachiyomiController.cs @@ -60,14 +60,14 @@ public async Task> GetLatestChapter(int seriesId) var looseLeafChapterVolume = volumes.FirstOrDefault(v => v.Number == 0); if (looseLeafChapterVolume == null) { - var volumeChapter = _mapper.Map(volumes.Last().Chapters.OrderBy(c => float.Parse(c.Number), new ChapterSortComparerZeroFirst()).Last()); + var volumeChapter = _mapper.Map(volumes.Last().Chapters.OrderBy(c => float.Parse(c.Number), ChapterSortComparerZeroFirst.Default).Last()); return Ok(new ChapterDto() { Number = $"{int.Parse(volumeChapter.Number) / 100f}" }); } - var lastChapter = looseLeafChapterVolume.Chapters.OrderBy(c => float.Parse(c.Number), new ChapterSortComparer()).Last(); + var lastChapter = looseLeafChapterVolume.Chapters.OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default).Last(); return Ok(_mapper.Map(lastChapter)); } diff --git a/API/Services/SeriesService.cs b/API/Services/SeriesService.cs index db3b1d1d64..bb9b6af76b 100644 --- a/API/Services/SeriesService.cs +++ b/API/Services/SeriesService.cs @@ -50,8 +50,8 @@ public SeriesService(IUnitOfWork unitOfWork, IEventHub eventHub, ITaskScheduler /// public static Chapter GetFirstChapterForMetadata(Series series, bool isBookLibrary) { - return series.Volumes.OrderBy(v => v.Number, new ChapterSortComparer()) - .SelectMany(v => v.Chapters.OrderBy(c => float.Parse(c.Number), new ChapterSortComparer())) + return series.Volumes.OrderBy(v => v.Number, ChapterSortComparer.Default) + .SelectMany(v => v.Chapters.OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default)) .FirstOrDefault(); } @@ -493,7 +493,7 @@ public async Task GetSeriesDetail(int seriesId, int userId) if (v.Number == 0) return c; c.VolumeTitle = v.Name; return c; - }).OrderBy(c => float.Parse(c.Number), new ChapterSortComparer())); + }).OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default)).ToList(); foreach (var chapter in chapters) { @@ -518,7 +518,13 @@ public async Task GetSeriesDetail(int seriesId, int userId) var storylineChapters = volumes .Where(v => v.Number == 0) .SelectMany(v => v.Chapters.Where(c => !c.IsSpecial)) - .OrderBy(c => float.Parse(c.Number), new ChapterSortComparer()); + .OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default) + .ToList(); + + // When there's chapters without a volume number revert to chapter sorting only as opposed to volume then chapter + if (storylineChapters.Any()) { + retChapters = retChapters.OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default); + } return new SeriesDetailDto() {