Lots of Bugfixes (#2356)
This commit is contained in:
parent
86e931dd9a
commit
226d6831df
47 changed files with 359 additions and 225 deletions
|
|
@ -13,6 +13,7 @@ using API.DTOs.SeriesDetail;
|
|||
using API.Entities;
|
||||
using API.Entities.Enums;
|
||||
using API.Entities.Metadata;
|
||||
using API.Extensions;
|
||||
using API.Helpers;
|
||||
using API.Helpers.Builders;
|
||||
using API.Services.Plus;
|
||||
|
|
@ -77,20 +78,22 @@ public class SeriesService : ISeriesService
|
|||
public static Chapter? GetFirstChapterForMetadata(Series series)
|
||||
{
|
||||
var sortedVolumes = series.Volumes
|
||||
.Where(v => float.TryParse(v.Name, out var parsedValue) && parsedValue != 0.0f)
|
||||
.OrderBy(v => float.TryParse(v.Name, out var parsedValue) ? parsedValue : float.MaxValue);
|
||||
.Where(v => float.TryParse(v.Name, CultureInfo.InvariantCulture, out var parsedValue) && parsedValue != 0.0f)
|
||||
.OrderBy(v => float.TryParse(v.Name, CultureInfo.InvariantCulture, out var parsedValue) ? parsedValue : float.MaxValue);
|
||||
var minVolumeNumber = sortedVolumes
|
||||
.MinBy(v => float.Parse(v.Name));
|
||||
.MinBy(v => v.Name.AsFloat());
|
||||
|
||||
|
||||
var allChapters = series.Volumes
|
||||
.SelectMany(v => v.Chapters.OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default)).ToList();
|
||||
var minChapter = allChapters
|
||||
.SelectMany(v => v.Chapters.OrderBy(c => c.Number.AsFloat(), ChapterSortComparer.Default))
|
||||
.ToList();
|
||||
var minChapter = allChapters
|
||||
.FirstOrDefault();
|
||||
|
||||
if (minVolumeNumber != null && minChapter != null && float.TryParse(minChapter.Number, out var chapNum) && chapNum >= minVolumeNumber.Number)
|
||||
if (minVolumeNumber != null && minChapter != null && float.TryParse(minChapter.Number, CultureInfo.InvariantCulture, out var chapNum) &&
|
||||
(chapNum >= minVolumeNumber.Number || chapNum == 0))
|
||||
{
|
||||
return minVolumeNumber.Chapters.MinBy(c => float.Parse(c.Number), ChapterSortComparer.Default);
|
||||
return minVolumeNumber.Chapters.MinBy(c => c.Number.AsFloat(), ChapterSortComparer.Default);
|
||||
}
|
||||
|
||||
return minChapter;
|
||||
|
|
@ -436,7 +439,9 @@ public class SeriesService : ISeriesService
|
|||
var volumeLabel = await _localizationService.Translate(userId, "volume-num", string.Empty);
|
||||
foreach (var volume in volumes)
|
||||
{
|
||||
volume.Chapters = volume.Chapters.OrderBy(d => double.Parse(d.Number), ChapterSortComparer.Default).ToList();
|
||||
volume.Chapters = volume.Chapters
|
||||
.OrderBy(d => d.Number.AsDouble(), ChapterSortComparer.Default)
|
||||
.ToList();
|
||||
var firstChapter = volume.Chapters.First();
|
||||
// On Books, skip volumes that are specials, since these will be shown
|
||||
if (firstChapter.IsSpecial) continue;
|
||||
|
|
@ -450,7 +455,7 @@ public class SeriesService : ISeriesService
|
|||
processedVolumes.ForEach(v =>
|
||||
{
|
||||
v.Name = $"Volume {v.Name}";
|
||||
v.Chapters = v.Chapters.OrderBy(d => double.Parse(d.Number), ChapterSortComparer.Default).ToList();
|
||||
v.Chapters = v.Chapters.OrderBy(d => d.Number.AsDouble(), ChapterSortComparer.Default).ToList();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -460,7 +465,7 @@ public class SeriesService : ISeriesService
|
|||
if (v.Number == 0) return c;
|
||||
c.VolumeTitle = v.Name;
|
||||
return c;
|
||||
}).OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default)).ToList();
|
||||
}).OrderBy(c => c.Number.AsFloat(), ChapterSortComparer.Default)).ToList();
|
||||
|
||||
foreach (var chapter in chapters)
|
||||
{
|
||||
|
|
@ -485,12 +490,12 @@ public class SeriesService : ISeriesService
|
|||
var storylineChapters = volumes
|
||||
.Where(v => v.Number == 0)
|
||||
.SelectMany(v => v.Chapters.Where(c => !c.IsSpecial))
|
||||
.OrderBy(c => float.Parse(c.Number), ChapterSortComparer.Default)
|
||||
.OrderBy(c => c.Number.AsFloat(), 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);
|
||||
retChapters = retChapters.OrderBy(c => c.Number.AsFloat(), ChapterSortComparer.Default);
|
||||
}
|
||||
|
||||
return new SeriesDetailDto()
|
||||
|
|
@ -717,33 +722,8 @@ public class SeriesService : ISeriesService
|
|||
? chapters.Max(c => c.CreatedUtc) + TimeSpan.FromDays(forecastedTimeDifference)
|
||||
: (DateTime?)null;
|
||||
|
||||
// if (nextChapterExpected != null && nextChapterExpected < DateTime.UtcNow)
|
||||
// {
|
||||
// nextChapterExpected = DateTime.UtcNow + TimeSpan.FromDays(forecastedTimeDifference);
|
||||
// }
|
||||
//
|
||||
// var averageTimeDifference = timeDifferences
|
||||
// .Average(td => td.TotalDays);
|
||||
//
|
||||
//
|
||||
// if (averageTimeDifference == 0)
|
||||
// {
|
||||
// return _emptyExpectedChapter;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// // Calculate the forecast for when the next chapter is expected
|
||||
// var nextChapterExpected = chapters.Any()
|
||||
// ? chapters.Max(c => c.CreatedUtc) + TimeSpan.FromDays(averageTimeDifference)
|
||||
// : (DateTime?) null;
|
||||
//
|
||||
// if (nextChapterExpected != null && nextChapterExpected < DateTime.UtcNow)
|
||||
// {
|
||||
// nextChapterExpected = DateTime.UtcNow + TimeSpan.FromDays(averageTimeDifference);
|
||||
// }
|
||||
|
||||
// For number and volume number, we need the highest chapter, not the latest created
|
||||
var lastChapter = chapters.MaxBy(c => float.Parse(c.Number))!;
|
||||
var lastChapter = chapters.MaxBy(c => c.Number.AsFloat())!;
|
||||
float.TryParse(lastChapter.Number, NumberStyles.Number, CultureInfo.InvariantCulture,
|
||||
out var lastChapterNumber);
|
||||
|
||||
|
|
@ -759,7 +739,7 @@ public class SeriesService : ISeriesService
|
|||
|
||||
if (lastChapterNumber > 0)
|
||||
{
|
||||
result.ChapterNumber = lastChapterNumber + 1;
|
||||
result.ChapterNumber = (int) Math.Truncate(lastChapterNumber) + 1;
|
||||
result.VolumeNumber = lastChapter.Volume.Number;
|
||||
result.Title = series.Library.Type switch
|
||||
{
|
||||
|
|
@ -783,9 +763,9 @@ public class SeriesService : ISeriesService
|
|||
return result;
|
||||
}
|
||||
|
||||
private double ExponentialSmoothing(IEnumerable<double> data, double alpha)
|
||||
private static double ExponentialSmoothing(IList<double> data, double alpha)
|
||||
{
|
||||
double forecast = data.First();
|
||||
var forecast = data.First();
|
||||
|
||||
foreach (var value in data)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue