Sort series by chapter number only when some chapters have no volume (#1487)

* Sort series by chapter number only when some chapters have no volume information

* Implement a Default static instance of ChapterSortComparer

* Further use Default static Comparers

* Add missing ToLit() as per comments
This commit is contained in:
tjarls 2022-08-28 22:39:35 +01:00 committed by GitHub
parent ae13775791
commit f0c516ab62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 6 deletions

View File

@ -23,6 +23,8 @@ namespace API.Comparators
return x.CompareTo(y); return x.CompareTo(y);
} }
public static readonly ChapterSortComparer Default = new ChapterSortComparer();
} }
/// <summary> /// <summary>
@ -44,6 +46,8 @@ namespace API.Comparators
return x.CompareTo(y); return x.CompareTo(y);
} }
public static readonly ChapterSortComparerZeroFirst Default = new ChapterSortComparerZeroFirst();
} }
public class SortComparerZeroLast : IComparer<double> public class SortComparerZeroLast : IComparer<double>

View File

@ -60,14 +60,14 @@ public class TachiyomiController : BaseApiController
var looseLeafChapterVolume = volumes.FirstOrDefault(v => v.Number == 0); var looseLeafChapterVolume = volumes.FirstOrDefault(v => v.Number == 0);
if (looseLeafChapterVolume == null) if (looseLeafChapterVolume == null)
{ {
var volumeChapter = _mapper.Map<ChapterDto>(volumes.Last().Chapters.OrderBy(c => float.Parse(c.Number), new ChapterSortComparerZeroFirst()).Last()); var volumeChapter = _mapper.Map<ChapterDto>(volumes.Last().Chapters.OrderBy(c => float.Parse(c.Number), ChapterSortComparerZeroFirst.Default).Last());
return Ok(new ChapterDto() return Ok(new ChapterDto()
{ {
Number = $"{int.Parse(volumeChapter.Number) / 100f}" 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<ChapterDto>(lastChapter)); return Ok(_mapper.Map<ChapterDto>(lastChapter));
} }

View File

@ -50,8 +50,8 @@ public class SeriesService : ISeriesService
/// <returns></returns> /// <returns></returns>
public static Chapter GetFirstChapterForMetadata(Series series, bool isBookLibrary) public static Chapter GetFirstChapterForMetadata(Series series, bool isBookLibrary)
{ {
return series.Volumes.OrderBy(v => v.Number, new ChapterSortComparer()) return series.Volumes.OrderBy(v => v.Number, ChapterSortComparer.Default)
.SelectMany(v => v.Chapters.OrderBy(c => float.Parse(c.Number), new ChapterSortComparer())) .SelectMany(v => v.Chapters.OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default))
.FirstOrDefault(); .FirstOrDefault();
} }
@ -493,7 +493,7 @@ public class SeriesService : ISeriesService
if (v.Number == 0) return c; if (v.Number == 0) return c;
c.VolumeTitle = v.Name; c.VolumeTitle = v.Name;
return c; return c;
}).OrderBy(c => float.Parse(c.Number), new ChapterSortComparer())); }).OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default)).ToList();
foreach (var chapter in chapters) foreach (var chapter in chapters)
{ {
@ -518,7 +518,13 @@ public class SeriesService : ISeriesService
var storylineChapters = volumes var storylineChapters = volumes
.Where(v => v.Number == 0) .Where(v => v.Number == 0)
.SelectMany(v => v.Chapters.Where(c => !c.IsSpecial)) .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() return new SeriesDetailDto()
{ {