Comic Rework Bugfixes Round 1 (#2774)
This commit is contained in:
parent
d29dd59964
commit
3e813534f9
13 changed files with 260 additions and 85 deletions
|
|
@ -1,11 +1,9 @@
|
||||||
using System.Collections.Generic;
|
using System.Linq;
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
|
||||||
using API.Comparators;
|
using API.Comparators;
|
||||||
using API.Entities;
|
|
||||||
using API.Entities.Enums;
|
using API.Entities.Enums;
|
||||||
using API.Extensions;
|
using API.Extensions;
|
||||||
using API.Helpers.Builders;
|
using API.Helpers.Builders;
|
||||||
|
using API.Services.Tasks.Scanner.Parser;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace API.Tests.Extensions;
|
namespace API.Tests.Extensions;
|
||||||
|
|
@ -17,16 +15,16 @@ public class SeriesExtensionsTests
|
||||||
{
|
{
|
||||||
var series = new SeriesBuilder("Test 1")
|
var series = new SeriesBuilder("Test 1")
|
||||||
.WithFormat(MangaFormat.Archive)
|
.WithFormat(MangaFormat.Archive)
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolume)
|
.WithVolume(new VolumeBuilder(Parser.SpecialVolume)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithCoverImage("Special 1")
|
.WithCoverImage("Special 1")
|
||||||
.WithIsSpecial(true)
|
.WithIsSpecial(true)
|
||||||
.WithSortOrder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolumeNumber + 1)
|
.WithSortOrder(Parser.SpecialVolumeNumber + 1)
|
||||||
.Build())
|
.Build())
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithCoverImage("Special 2")
|
.WithCoverImage("Special 2")
|
||||||
.WithIsSpecial(true)
|
.WithIsSpecial(true)
|
||||||
.WithSortOrder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolumeNumber + 2)
|
.WithSortOrder(Parser.SpecialVolumeNumber + 2)
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.Build();
|
.Build();
|
||||||
|
|
@ -44,8 +42,8 @@ public class SeriesExtensionsTests
|
||||||
{
|
{
|
||||||
var series = new SeriesBuilder("Test 1")
|
var series = new SeriesBuilder("Test 1")
|
||||||
.WithFormat(MangaFormat.Archive)
|
.WithFormat(MangaFormat.Archive)
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
.WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithName(Parser.LooseLeafVolume)
|
||||||
.WithChapter(new ChapterBuilder("13")
|
.WithChapter(new ChapterBuilder("13")
|
||||||
.WithCoverImage("Chapter 13")
|
.WithCoverImage("Chapter 13")
|
||||||
.Build())
|
.Build())
|
||||||
|
|
@ -60,7 +58,7 @@ public class SeriesExtensionsTests
|
||||||
|
|
||||||
.WithVolume(new VolumeBuilder("2")
|
.WithVolume(new VolumeBuilder("2")
|
||||||
.WithName("Volume 2")
|
.WithName("Volume 2")
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithCoverImage("Volume 2")
|
.WithCoverImage("Volume 2")
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
|
|
@ -79,8 +77,8 @@ public class SeriesExtensionsTests
|
||||||
{
|
{
|
||||||
var series = new SeriesBuilder("Test 1")
|
var series = new SeriesBuilder("Test 1")
|
||||||
.WithFormat(MangaFormat.Archive)
|
.WithFormat(MangaFormat.Archive)
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
.WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithName(Parser.LooseLeafVolume)
|
||||||
.WithChapter(new ChapterBuilder("0.5")
|
.WithChapter(new ChapterBuilder("0.5")
|
||||||
.WithCoverImage("Chapter 0.5")
|
.WithCoverImage("Chapter 0.5")
|
||||||
.Build())
|
.Build())
|
||||||
|
|
@ -106,14 +104,14 @@ public class SeriesExtensionsTests
|
||||||
|
|
||||||
.WithVolume(new VolumeBuilder("1")
|
.WithVolume(new VolumeBuilder("1")
|
||||||
.WithName("Volume 1")
|
.WithName("Volume 1")
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithCoverImage("Volume 1 Chapter 1")
|
.WithCoverImage("Volume 1 Chapter 1")
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
|
|
||||||
.WithVolume(new VolumeBuilder("2")
|
.WithVolume(new VolumeBuilder("2")
|
||||||
.WithName("Volume 2")
|
.WithName("Volume 2")
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithCoverImage("Volume 2")
|
.WithCoverImage("Volume 2")
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
|
|
@ -145,8 +143,8 @@ public class SeriesExtensionsTests
|
||||||
{
|
{
|
||||||
var series = new SeriesBuilder("Test 1")
|
var series = new SeriesBuilder("Test 1")
|
||||||
.WithFormat(MangaFormat.Archive)
|
.WithFormat(MangaFormat.Archive)
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
.WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithName(Parser.LooseLeafVolume)
|
||||||
.WithChapter(new ChapterBuilder("2.5")
|
.WithChapter(new ChapterBuilder("2.5")
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Special 1")
|
.WithCoverImage("Special 1")
|
||||||
|
|
@ -171,8 +169,8 @@ public class SeriesExtensionsTests
|
||||||
{
|
{
|
||||||
var series = new SeriesBuilder("Test 1")
|
var series = new SeriesBuilder("Test 1")
|
||||||
.WithFormat(MangaFormat.Archive)
|
.WithFormat(MangaFormat.Archive)
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
.WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithName(Parser.LooseLeafVolume)
|
||||||
.WithChapter(new ChapterBuilder("2.5")
|
.WithChapter(new ChapterBuilder("2.5")
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Chapter 2.5")
|
.WithCoverImage("Chapter 2.5")
|
||||||
|
|
@ -182,11 +180,11 @@ public class SeriesExtensionsTests
|
||||||
.WithCoverImage("Chapter 2")
|
.WithCoverImage("Chapter 2")
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolume)
|
.WithVolume(new VolumeBuilder(Parser.SpecialVolume)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithIsSpecial(true)
|
.WithIsSpecial(true)
|
||||||
.WithCoverImage("Special 1")
|
.WithCoverImage("Special 1")
|
||||||
.WithSortOrder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolumeNumber + 1)
|
.WithSortOrder(Parser.SpecialVolumeNumber + 1)
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.Build();
|
.Build();
|
||||||
|
|
@ -204,8 +202,8 @@ public class SeriesExtensionsTests
|
||||||
{
|
{
|
||||||
var series = new SeriesBuilder("Test 1")
|
var series = new SeriesBuilder("Test 1")
|
||||||
.WithFormat(MangaFormat.Archive)
|
.WithFormat(MangaFormat.Archive)
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
.WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithName(Parser.LooseLeafVolume)
|
||||||
.WithChapter(new ChapterBuilder("2.5")
|
.WithChapter(new ChapterBuilder("2.5")
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Chapter 2.5")
|
.WithCoverImage("Chapter 2.5")
|
||||||
|
|
@ -215,16 +213,16 @@ public class SeriesExtensionsTests
|
||||||
.WithCoverImage("Chapter 2")
|
.WithCoverImage("Chapter 2")
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolume)
|
.WithVolume(new VolumeBuilder(Parser.SpecialVolume)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithIsSpecial(true)
|
.WithIsSpecial(true)
|
||||||
.WithCoverImage("Special 3")
|
.WithCoverImage("Special 3")
|
||||||
.WithSortOrder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolumeNumber + 1)
|
.WithSortOrder(Parser.SpecialVolumeNumber + 1)
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.WithVolume(new VolumeBuilder("1")
|
.WithVolume(new VolumeBuilder("1")
|
||||||
.WithMinNumber(1)
|
.WithMinNumber(1)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Volume 1")
|
.WithCoverImage("Volume 1")
|
||||||
.Build())
|
.Build())
|
||||||
|
|
@ -244,8 +242,8 @@ public class SeriesExtensionsTests
|
||||||
{
|
{
|
||||||
var series = new SeriesBuilder("Test 1")
|
var series = new SeriesBuilder("Test 1")
|
||||||
.WithFormat(MangaFormat.Archive)
|
.WithFormat(MangaFormat.Archive)
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
.WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithName(Parser.LooseLeafVolume)
|
||||||
.WithChapter(new ChapterBuilder("2.5")
|
.WithChapter(new ChapterBuilder("2.5")
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Chapter 2.5")
|
.WithCoverImage("Chapter 2.5")
|
||||||
|
|
@ -255,16 +253,16 @@ public class SeriesExtensionsTests
|
||||||
.WithCoverImage("Chapter 2")
|
.WithCoverImage("Chapter 2")
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolume)
|
.WithVolume(new VolumeBuilder(Parser.SpecialVolume)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithIsSpecial(true)
|
.WithIsSpecial(true)
|
||||||
.WithCoverImage("Special 1")
|
.WithCoverImage("Special 1")
|
||||||
.WithSortOrder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolumeNumber + 1)
|
.WithSortOrder(Parser.SpecialVolumeNumber + 1)
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.WithVolume(new VolumeBuilder("1")
|
.WithVolume(new VolumeBuilder("1")
|
||||||
.WithMinNumber(1)
|
.WithMinNumber(1)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Volume 1")
|
.WithCoverImage("Volume 1")
|
||||||
.Build())
|
.Build())
|
||||||
|
|
@ -284,8 +282,8 @@ public class SeriesExtensionsTests
|
||||||
{
|
{
|
||||||
var series = new SeriesBuilder("Ippo")
|
var series = new SeriesBuilder("Ippo")
|
||||||
.WithFormat(MangaFormat.Archive)
|
.WithFormat(MangaFormat.Archive)
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
.WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithName(Parser.LooseLeafVolume)
|
||||||
.WithChapter(new ChapterBuilder("1426")
|
.WithChapter(new ChapterBuilder("1426")
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Chapter 1426")
|
.WithCoverImage("Chapter 1426")
|
||||||
|
|
@ -295,23 +293,23 @@ public class SeriesExtensionsTests
|
||||||
.WithCoverImage("Chapter 1425")
|
.WithCoverImage("Chapter 1425")
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolume)
|
.WithVolume(new VolumeBuilder(Parser.SpecialVolume)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithIsSpecial(true)
|
.WithIsSpecial(true)
|
||||||
.WithCoverImage("Special 3")
|
.WithCoverImage("Special 3")
|
||||||
.WithSortOrder(API.Services.Tasks.Scanner.Parser.Parser.SpecialVolumeNumber + 1)
|
.WithSortOrder(Parser.SpecialVolumeNumber + 1)
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.WithVolume(new VolumeBuilder("1")
|
.WithVolume(new VolumeBuilder("1")
|
||||||
.WithMinNumber(1)
|
.WithMinNumber(1)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Volume 1")
|
.WithCoverImage("Volume 1")
|
||||||
.Build())
|
.Build())
|
||||||
.Build())
|
.Build())
|
||||||
.WithVolume(new VolumeBuilder("137")
|
.WithVolume(new VolumeBuilder("137")
|
||||||
.WithMinNumber(1)
|
.WithMinNumber(1)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Volume 137")
|
.WithCoverImage("Volume 137")
|
||||||
.Build())
|
.Build())
|
||||||
|
|
@ -331,8 +329,8 @@ public class SeriesExtensionsTests
|
||||||
{
|
{
|
||||||
var series = new SeriesBuilder("Test 1")
|
var series = new SeriesBuilder("Test 1")
|
||||||
.WithFormat(MangaFormat.Archive)
|
.WithFormat(MangaFormat.Archive)
|
||||||
.WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
.WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)
|
.WithName(Parser.LooseLeafVolume)
|
||||||
.WithChapter(new ChapterBuilder("2.5")
|
.WithChapter(new ChapterBuilder("2.5")
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Chapter 2.5")
|
.WithCoverImage("Chapter 2.5")
|
||||||
|
|
@ -344,7 +342,7 @@ public class SeriesExtensionsTests
|
||||||
.Build())
|
.Build())
|
||||||
.WithVolume(new VolumeBuilder("4")
|
.WithVolume(new VolumeBuilder("4")
|
||||||
.WithMinNumber(4)
|
.WithMinNumber(4)
|
||||||
.WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
.WithIsSpecial(false)
|
.WithIsSpecial(false)
|
||||||
.WithCoverImage("Volume 4")
|
.WithCoverImage("Volume 4")
|
||||||
.Build())
|
.Build())
|
||||||
|
|
@ -359,5 +357,71 @@ public class SeriesExtensionsTests
|
||||||
Assert.Equal("Chapter 2", series.GetCoverImage());
|
Assert.Equal("Chapter 2", series.GetCoverImage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ensure that Series cover is issue 1, when there are less than 1 entities and specials
|
||||||
|
/// </summary>
|
||||||
|
[Fact]
|
||||||
|
public void GetCoverImage_LessThanIssue1()
|
||||||
|
{
|
||||||
|
var series = new SeriesBuilder("Test 1")
|
||||||
|
.WithFormat(MangaFormat.Archive)
|
||||||
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
|
.WithName(Parser.LooseLeafVolume)
|
||||||
|
.WithChapter(new ChapterBuilder("0")
|
||||||
|
.WithIsSpecial(false)
|
||||||
|
.WithCoverImage("Chapter 0")
|
||||||
|
.Build())
|
||||||
|
.WithChapter(new ChapterBuilder("1")
|
||||||
|
.WithIsSpecial(false)
|
||||||
|
.WithCoverImage("Chapter 1")
|
||||||
|
.Build())
|
||||||
|
.Build())
|
||||||
|
.WithVolume(new VolumeBuilder(Parser.SpecialVolume)
|
||||||
|
.WithMinNumber(4)
|
||||||
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
|
.WithIsSpecial(false)
|
||||||
|
.WithCoverImage("Volume 4")
|
||||||
|
.Build())
|
||||||
|
.Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
Assert.Equal("Chapter 1", series.GetCoverImage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ensure that Series cover is issue 1, when there are less than 1 entities and specials
|
||||||
|
/// </summary>
|
||||||
|
[Fact]
|
||||||
|
public void GetCoverImage_LessThanIssue1_WithNegative()
|
||||||
|
{
|
||||||
|
var series = new SeriesBuilder("Test 1")
|
||||||
|
.WithFormat(MangaFormat.Archive)
|
||||||
|
.WithVolume(new VolumeBuilder(Parser.LooseLeafVolume)
|
||||||
|
.WithName(Parser.LooseLeafVolume)
|
||||||
|
.WithChapter(new ChapterBuilder("-1")
|
||||||
|
.WithIsSpecial(false)
|
||||||
|
.WithCoverImage("Chapter -1")
|
||||||
|
.Build())
|
||||||
|
.WithChapter(new ChapterBuilder("0")
|
||||||
|
.WithIsSpecial(false)
|
||||||
|
.WithCoverImage("Chapter 0")
|
||||||
|
.Build())
|
||||||
|
.WithChapter(new ChapterBuilder("1")
|
||||||
|
.WithIsSpecial(false)
|
||||||
|
.WithCoverImage("Chapter 1")
|
||||||
|
.Build())
|
||||||
|
.Build())
|
||||||
|
.WithVolume(new VolumeBuilder(Parser.SpecialVolume)
|
||||||
|
.WithMinNumber(4)
|
||||||
|
.WithChapter(new ChapterBuilder(Parser.DefaultChapter)
|
||||||
|
.WithIsSpecial(false)
|
||||||
|
.WithCoverImage("Volume 4")
|
||||||
|
.Build())
|
||||||
|
.Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
Assert.Equal("Chapter 1", series.GetCoverImage());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1205,6 +1205,65 @@ public class ReadingListServiceTests
|
||||||
Assert.Equal(2, createdList.Items.First(item => item.Order == 2).ChapterId);
|
Assert.Equal(2, createdList.Items.First(item => item.Order == 2).ChapterId);
|
||||||
Assert.Equal(4, createdList.Items.First(item => item.Order == 3).ChapterId);
|
Assert.Equal(4, createdList.Items.First(item => item.Order == 3).ChapterId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This test is about ensuring Annuals that are a separate series can be linked up properly (ComicVine)
|
||||||
|
/// </summary>
|
||||||
|
//[Fact]
|
||||||
|
public async Task CreateReadingListFromCBL_ShouldCreateList_WithAnnuals()
|
||||||
|
{
|
||||||
|
// TODO: Implement this correctly
|
||||||
|
await ResetDb();
|
||||||
|
var cblReadingList = LoadCblFromPath("Annual.cbl");
|
||||||
|
|
||||||
|
// Mock up our series
|
||||||
|
var fablesSeries = new SeriesBuilder("Fables")
|
||||||
|
.WithVolume(new VolumeBuilder("2002")
|
||||||
|
.WithMinNumber(1)
|
||||||
|
.WithChapter(new ChapterBuilder("1").Build())
|
||||||
|
.WithChapter(new ChapterBuilder("2").Build())
|
||||||
|
.WithChapter(new ChapterBuilder("3").Build())
|
||||||
|
.Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var fables2Series = new SeriesBuilder("Fables Annual")
|
||||||
|
.WithVolume(new VolumeBuilder("2003")
|
||||||
|
.WithMinNumber(1)
|
||||||
|
.WithChapter(new ChapterBuilder("1").Build())
|
||||||
|
.Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
_context.AppUser.Add(new AppUser()
|
||||||
|
{
|
||||||
|
UserName = "majora2007",
|
||||||
|
ReadingLists = new List<ReadingList>(),
|
||||||
|
Libraries = new List<Library>()
|
||||||
|
{
|
||||||
|
new LibraryBuilder("Test LIb 2", LibraryType.Book)
|
||||||
|
.WithSeries(fablesSeries)
|
||||||
|
.WithSeries(fables2Series)
|
||||||
|
.Build()
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await _unitOfWork.CommitAsync();
|
||||||
|
|
||||||
|
var importSummary = await _readingListService.CreateReadingListFromCbl(1, cblReadingList);
|
||||||
|
|
||||||
|
Assert.Equal(CblImportResult.Success, importSummary.Success);
|
||||||
|
Assert.NotEmpty(importSummary.Results);
|
||||||
|
|
||||||
|
var createdList = await _unitOfWork.ReadingListRepository.GetReadingListByIdAsync(1);
|
||||||
|
|
||||||
|
Assert.NotNull(createdList);
|
||||||
|
Assert.Equal("Annual", createdList.Title);
|
||||||
|
|
||||||
|
Assert.Equal(4, createdList.Items.Count);
|
||||||
|
Assert.Equal(1, createdList.Items.First(item => item.Order == 0).ChapterId);
|
||||||
|
Assert.Equal(2, createdList.Items.First(item => item.Order == 1).ChapterId);
|
||||||
|
Assert.Equal(4, createdList.Items.First(item => item.Order == 2).ChapterId);
|
||||||
|
Assert.Equal(3, createdList.Items.First(item => item.Order == 3).ChapterId);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CreateReadingListsFromSeries
|
#region CreateReadingListsFromSeries
|
||||||
|
|
|
||||||
19
API.Tests/Services/Test Data/ReadingListService/Annual.cbl
Normal file
19
API.Tests/Services/Test Data/ReadingListService/Annual.cbl
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<ReadingList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<Name>Fables</Name>
|
||||||
|
<Books>
|
||||||
|
<Book Series="Fables" Number="1" Volume="2002" Year="2002">
|
||||||
|
<Id>5bd3dd55-2a85-4325-aefa-21e9f19b12c9</Id>
|
||||||
|
</Book>
|
||||||
|
<Book Series="Fables" Number="2" Volume="2002" Year="2002">
|
||||||
|
<Id>3831761c-604a-4420-bed2-9f5ac4e94bd4</Id>
|
||||||
|
</Book>
|
||||||
|
<Book Series="Fables Annual" Number="1" Volume="2003" Year="2003" Format="Annual">
|
||||||
|
<Id>23acefd4-1bc7-4c3c-99df-133045d1f266</Id>
|
||||||
|
</Book>
|
||||||
|
<Book Series="Fables" Number="3" Volume="2002" Year="2002">
|
||||||
|
<Id>27a5d7db-9f7e-4be1-aca6-998a1cc1488f</Id>
|
||||||
|
</Book>
|
||||||
|
</Books>
|
||||||
|
<Matchers />
|
||||||
|
</ReadingList>
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
using System.Collections.Generic;
|
using System.Linq;
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
|
||||||
using API.Comparators;
|
using API.Comparators;
|
||||||
using API.Entities;
|
using API.Entities;
|
||||||
using API.Services.Tasks.Scanner.Parser;
|
using API.Services.Tasks.Scanner.Parser;
|
||||||
|
|
@ -25,7 +23,7 @@ public static class SeriesExtensions
|
||||||
if (firstVolume == null) return null;
|
if (firstVolume == null) return null;
|
||||||
|
|
||||||
var chapters = firstVolume.Chapters
|
var chapters = firstVolume.Chapters
|
||||||
.OrderBy(c => c.SortOrder, ChapterSortComparerDefaultLast.Default)
|
.OrderBy(c => c.SortOrder)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
if (chapters.Count > 1 && chapters.Exists(c => c.IsSpecial))
|
if (chapters.Count > 1 && chapters.Exists(c => c.IsSpecial))
|
||||||
|
|
@ -34,7 +32,7 @@ public static class SeriesExtensions
|
||||||
}
|
}
|
||||||
|
|
||||||
// just volumes
|
// just volumes
|
||||||
if (volumes.TrueForAll(v => $"{v.MinNumber}" != Parser.LooseLeafVolume))
|
if (volumes.TrueForAll(v => v.MinNumber.IsNot(Parser.LooseLeafVolumeNumber)))
|
||||||
{
|
{
|
||||||
return firstVolume.CoverImage;
|
return firstVolume.CoverImage;
|
||||||
}
|
}
|
||||||
|
|
@ -45,11 +43,13 @@ public static class SeriesExtensions
|
||||||
{
|
{
|
||||||
var looseLeafChapters = volumes.Where(v => v.MinNumber.Is(Parser.LooseLeafVolumeNumber))
|
var looseLeafChapters = volumes.Where(v => v.MinNumber.Is(Parser.LooseLeafVolumeNumber))
|
||||||
.SelectMany(c => c.Chapters.Where(c2 => !c2.IsSpecial))
|
.SelectMany(c => c.Chapters.Where(c2 => !c2.IsSpecial))
|
||||||
.OrderBy(c => c.MinNumber, ChapterSortComparerDefaultFirst.Default)
|
.OrderBy(c => c.SortOrder)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
if (looseLeafChapters.Count > 0 && volumes[0].MinNumber > looseLeafChapters[0].MinNumber)
|
if (looseLeafChapters.Count > 0 && volumes[0].MinNumber > looseLeafChapters[0].MinNumber)
|
||||||
{
|
{
|
||||||
|
var first = looseLeafChapters.Find(c => c.SortOrder.Is(1f));
|
||||||
|
if (first != null) return first.CoverImage;
|
||||||
return looseLeafChapters[0].CoverImage;
|
return looseLeafChapters[0].CoverImage;
|
||||||
}
|
}
|
||||||
return firstVolume.CoverImage;
|
return firstVolume.CoverImage;
|
||||||
|
|
@ -58,14 +58,11 @@ public static class SeriesExtensions
|
||||||
var chpts = volumes
|
var chpts = volumes
|
||||||
.First(v => v.MinNumber.Is(Parser.LooseLeafVolumeNumber))
|
.First(v => v.MinNumber.Is(Parser.LooseLeafVolumeNumber))
|
||||||
.Chapters
|
.Chapters
|
||||||
//.Where(v => v.MinNumber.Is(Parser.LooseLeafVolumeNumber))
|
|
||||||
//.SelectMany(v => v.Chapters)
|
|
||||||
|
|
||||||
.Where(c => !c.IsSpecial)
|
.Where(c => !c.IsSpecial)
|
||||||
.OrderBy(c => c.MinNumber, ChapterSortComparerDefaultLast.Default)
|
.OrderBy(c => c.MinNumber, ChapterSortComparerDefaultLast.Default)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var exactlyChapter1 = chpts.FirstOrDefault(c => c.MinNumber.Is(1f));
|
var exactlyChapter1 = chpts.Find(c => c.MinNumber.Is(1f));
|
||||||
if (exactlyChapter1 != null)
|
if (exactlyChapter1 != null)
|
||||||
{
|
{
|
||||||
return exactlyChapter1.CoverImage;
|
return exactlyChapter1.CoverImage;
|
||||||
|
|
|
||||||
|
|
@ -218,7 +218,7 @@ public class ArchiveService : IArchiveService
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public string GetCoverImage(string archivePath, string fileName, string outputDirectory, EncodeFormat format, CoverImageSize size = CoverImageSize.Default)
|
public string GetCoverImage(string archivePath, string fileName, string outputDirectory, EncodeFormat format, CoverImageSize size = CoverImageSize.Default)
|
||||||
{
|
{
|
||||||
if (archivePath == null || !IsValidArchive(archivePath)) return string.Empty;
|
if (string.IsNullOrEmpty(archivePath) || !IsValidArchive(archivePath)) return string.Empty;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var libraryHandler = CanOpen(archivePath);
|
var libraryHandler = CanOpen(archivePath);
|
||||||
|
|
|
||||||
|
|
@ -181,6 +181,11 @@ public class LicenseService(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if the sub is active and caches the result. This should not be used too much over cache as it will skip backend caching.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="license"></param>
|
||||||
|
/// <returns></returns>
|
||||||
public async Task<bool> HasActiveSubscription(string? license)
|
public async Task<bool> HasActiveSubscription(string? license)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(license)) return false;
|
if (string.IsNullOrWhiteSpace(license)) return false;
|
||||||
|
|
|
||||||
|
|
@ -797,6 +797,7 @@ public class ReaderService : IReaderService
|
||||||
case LibraryType.Manga:
|
case LibraryType.Manga:
|
||||||
return "Chapter" + (includeSpace ? " " : string.Empty);
|
return "Chapter" + (includeSpace ? " " : string.Empty);
|
||||||
case LibraryType.Comic:
|
case LibraryType.Comic:
|
||||||
|
case LibraryType.ComicVine:
|
||||||
if (includeHash) {
|
if (includeHash) {
|
||||||
return "Issue #";
|
return "Issue #";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -619,6 +619,26 @@ public class ReadingListService : IReadingListService
|
||||||
readingList.Items ??= new List<ReadingListItem>();
|
readingList.Items ??= new List<ReadingListItem>();
|
||||||
foreach (var (book, i) in cblReading.Books.Book.Select((value, i) => ( value, i )))
|
foreach (var (book, i) in cblReading.Books.Book.Select((value, i) => ( value, i )))
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// I want to refactor this so that we move the matching logic into a method.
|
||||||
|
// But when I looked, we are returning statuses on different conditions, hard to keep it single responsibility
|
||||||
|
// Either refactor to return an enum for the state, make it return the BookResult, or refactor the reasoning so it's more straightforward
|
||||||
|
|
||||||
|
// var match = FindMatchingCblBookSeries(book);
|
||||||
|
// if (match == null)
|
||||||
|
// {
|
||||||
|
// importSummary.Results.Add(new CblBookResult(book)
|
||||||
|
// {
|
||||||
|
// Reason = CblImportReason.SeriesMissing,
|
||||||
|
// Order = i
|
||||||
|
// });
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: I need a dedicated db query to get Series name's processed if they are ComicVine.
|
||||||
|
// In comicvine, series names are Series(Volume), but the spec just has Series="Series" Volume="Volume"
|
||||||
|
// So we need to combine them for comics that are in ComicVine libraries.
|
||||||
var normalizedSeries = Parser.Normalize(book.Series);
|
var normalizedSeries = Parser.Normalize(book.Series);
|
||||||
if (!allSeries.TryGetValue(normalizedSeries, out var bookSeries) && !allSeriesLocalized.TryGetValue(normalizedSeries, out bookSeries))
|
if (!allSeries.TryGetValue(normalizedSeries, out var bookSeries) && !allSeriesLocalized.TryGetValue(normalizedSeries, out bookSeries))
|
||||||
{
|
{
|
||||||
|
|
@ -645,7 +665,7 @@ public class ReadingListService : IReadingListService
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We need to handle chapter 0 or empty string when it's just a volume
|
// We need to handle default chapter or empty string when it's just a volume
|
||||||
var bookNumber = string.IsNullOrEmpty(book.Number)
|
var bookNumber = string.IsNullOrEmpty(book.Number)
|
||||||
? Parser.DefaultChapterNumber
|
? Parser.DefaultChapterNumber
|
||||||
: float.Parse(book.Number);
|
: float.Parse(book.Number);
|
||||||
|
|
|
||||||
|
|
@ -113,13 +113,15 @@ public class ProcessSeries : IProcessSeries
|
||||||
var seriesName = parsedInfos[0].Series;
|
var seriesName = parsedInfos[0].Series;
|
||||||
await _eventHub.SendMessageAsync(MessageFactory.NotificationProgress,
|
await _eventHub.SendMessageAsync(MessageFactory.NotificationProgress,
|
||||||
MessageFactory.LibraryScanProgressEvent(library.Name, ProgressEventType.Updated, seriesName));
|
MessageFactory.LibraryScanProgressEvent(library.Name, ProgressEventType.Updated, seriesName));
|
||||||
_logger.LogInformation("[ScannerService] Beginning series update on {SeriesName}", seriesName);
|
_logger.LogInformation("[ScannerService] Beginning series update on {SeriesName}, Forced: {ForceUpdate}", seriesName, forceUpdate);
|
||||||
|
|
||||||
// Check if there is a Series
|
// Check if there is a Series
|
||||||
var firstInfo = parsedInfos[0];
|
var firstInfo = parsedInfos[0];
|
||||||
Series? series;
|
Series? series;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// There is an opportunity to allow duplicate series here. Like if One is in root/marvel/batman and another is root/dc/batman
|
||||||
|
// by changing to a ToList() and if multiple, doing a firstInfo.FirstFolder/RootFolder type check
|
||||||
series =
|
series =
|
||||||
await _unitOfWork.SeriesRepository.GetFullSeriesByAnyName(firstInfo.Series, firstInfo.LocalizedSeries,
|
await _unitOfWork.SeriesRepository.GetFullSeriesByAnyName(firstInfo.Series, firstInfo.LocalizedSeries,
|
||||||
library.Id, firstInfo.Format);
|
library.Id, firstInfo.Format);
|
||||||
|
|
|
||||||
|
|
@ -598,6 +598,8 @@ public class ScannerService : IScannerService
|
||||||
|
|
||||||
|
|
||||||
seenSeries.Add(foundParsedSeries);
|
seenSeries.Add(foundParsedSeries);
|
||||||
|
// TODO: This is extremely expensive to lock the thread on this. We should instead move this onto Hangfire
|
||||||
|
// or in a queue to be processed.
|
||||||
await _seriesProcessingSemaphore.WaitAsync();
|
await _seriesProcessingSemaphore.WaitAsync();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,10 @@ export class LibraryTypePipe implements PipeTransform {
|
||||||
return this.translocoService.translate('library-type-pipe.book');
|
return this.translocoService.translate('library-type-pipe.book');
|
||||||
case LibraryType.Comic:
|
case LibraryType.Comic:
|
||||||
return this.translocoService.translate('library-type-pipe.comic');
|
return this.translocoService.translate('library-type-pipe.comic');
|
||||||
|
case LibraryType.ComicVine:
|
||||||
|
return this.translocoService.translate('library-type-pipe.comicVine');
|
||||||
|
case LibraryType.Images:
|
||||||
|
return this.translocoService.translate('library-type-pipe.image');
|
||||||
case LibraryType.Manga:
|
case LibraryType.Manga:
|
||||||
return this.translocoService.translate('library-type-pipe.manga');
|
return this.translocoService.translate('library-type-pipe.manga');
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -497,7 +497,9 @@
|
||||||
"library-type-pipe": {
|
"library-type-pipe": {
|
||||||
"book": "Book",
|
"book": "Book",
|
||||||
"comic": "Comic",
|
"comic": "Comic",
|
||||||
"manga": "Manga"
|
"manga": "Manga",
|
||||||
|
"comicVine": "ComicVine",
|
||||||
|
"image": "Image"
|
||||||
},
|
},
|
||||||
|
|
||||||
"age-rating-pipe": {
|
"age-rating-pipe": {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
"name": "GPL-3.0",
|
"name": "GPL-3.0",
|
||||||
"url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
|
"url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
|
||||||
},
|
},
|
||||||
"version": "0.7.14.6"
|
"version": "0.7.14.7"
|
||||||
},
|
},
|
||||||
"servers": [
|
"servers": [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue