diff --git a/API.Benchmark/TestBenchmark.cs b/API.Benchmark/TestBenchmark.cs index 3b08bbcdf..511d250aa 100644 --- a/API.Benchmark/TestBenchmark.cs +++ b/API.Benchmark/TestBenchmark.cs @@ -49,7 +49,7 @@ public class TestBenchmark private static void SortSpecialChapters(IEnumerable volumes) { - foreach (var v in volumes.Where(vDto => vDto.MinNumber == 0)) + foreach (var v in volumes.WhereNotLooseLeaf()) { v.Chapters = v.Chapters.OrderByNatural(x => x.Range).ToList(); } diff --git a/API.Tests/Extensions/ChapterListExtensionsTests.cs b/API.Tests/Extensions/ChapterListExtensionsTests.cs index 3b59f1b02..a37281217 100644 --- a/API.Tests/Extensions/ChapterListExtensionsTests.cs +++ b/API.Tests/Extensions/ChapterListExtensionsTests.cs @@ -30,7 +30,7 @@ public class ChapterListExtensionsTests { var info = new ParserInfo() { - Chapters = "0", + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Edition = "", Format = MangaFormat.Archive, FullFilePath = "/manga/darker than black.cbz", @@ -38,12 +38,12 @@ public class ChapterListExtensionsTests IsSpecial = false, Series = "darker than black", Title = "darker than black", - Volumes = "0" + Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume }; var chapterList = new List() { - CreateChapter("darker than black - Some special", "0", CreateFile("/manga/darker than black - special.cbz", MangaFormat.Archive), true) + CreateChapter("darker than black - Some special", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/darker than black - special.cbz", MangaFormat.Archive), true) }; var actualChapter = chapterList.GetChapterByRange(info); @@ -57,7 +57,7 @@ public class ChapterListExtensionsTests { var info = new ParserInfo() { - Chapters = "0", + Chapters = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Format = MangaFormat.Archive, FullFilePath = "/manga/darker than black.cbz", @@ -65,12 +65,12 @@ public class ChapterListExtensionsTests IsSpecial = true, Series = "darker than black", Title = "darker than black", - Volumes = "0" + Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume }; var chapterList = new List() { - CreateChapter("darker than black", "0", CreateFile("/manga/darker than black.cbz", MangaFormat.Archive), true) + CreateChapter("darker than black", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/darker than black.cbz", MangaFormat.Archive), true) }; var actualChapter = chapterList.GetChapterByRange(info); @@ -83,7 +83,7 @@ public class ChapterListExtensionsTests { var info = new ParserInfo() { - Chapters = "0", + Chapters = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Format = MangaFormat.Archive, FullFilePath = "/manga/detective comics #001.cbz", @@ -91,13 +91,13 @@ public class ChapterListExtensionsTests IsSpecial = true, Series = "detective comics", Title = "detective comics", - Volumes = "0" + Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume }; var chapterList = new List() { - CreateChapter("detective comics", "0", CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true), - CreateChapter("detective comics", "0", CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true) + CreateChapter("detective comics", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true), + CreateChapter("detective comics", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true) }; var actualChapter = chapterList.GetChapterByRange(info); @@ -112,7 +112,7 @@ public class ChapterListExtensionsTests { var chapterList = new List() { - CreateChapter("darker than black", "0", CreateFile("/manga/darker than black.cbz", MangaFormat.Archive), true), + CreateChapter("darker than black", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/darker than black.cbz", MangaFormat.Archive), true), CreateChapter("darker than black", "1", CreateFile("/manga/darker than black.cbz", MangaFormat.Archive), false), }; @@ -124,7 +124,7 @@ public class ChapterListExtensionsTests { var chapterList = new List() { - CreateChapter("darker than black", "0", CreateFile("/manga/darker than black.cbz", MangaFormat.Archive), true), + CreateChapter("darker than black", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/darker than black.cbz", MangaFormat.Archive), true), CreateChapter("darker than black", "1", CreateFile("/manga/darker than black.cbz", MangaFormat.Archive), false), }; @@ -151,8 +151,8 @@ public class ChapterListExtensionsTests { var chapterList = new List() { - CreateChapter("detective comics", "0", CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true), - CreateChapter("detective comics", "0", CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true) + CreateChapter("detective comics", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true), + CreateChapter("detective comics", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true) }; chapterList[0].ReleaseDate = new DateTime(10, 1, 1); @@ -166,8 +166,8 @@ public class ChapterListExtensionsTests { var chapterList = new List() { - CreateChapter("detective comics", "0", CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true), - CreateChapter("detective comics", "0", CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true) + CreateChapter("detective comics", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true), + CreateChapter("detective comics", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, CreateFile("/manga/detective comics #001.cbz", MangaFormat.Archive), true) }; chapterList[0].ReleaseDate = new DateTime(2002, 1, 1); diff --git a/API.Tests/Extensions/SeriesExtensionsTests.cs b/API.Tests/Extensions/SeriesExtensionsTests.cs index c14de4439..231c42151 100644 --- a/API.Tests/Extensions/SeriesExtensionsTests.cs +++ b/API.Tests/Extensions/SeriesExtensionsTests.cs @@ -17,8 +17,8 @@ public class SeriesExtensionsTests { var series = new SeriesBuilder("Test 1") .WithFormat(MangaFormat.Archive) - .WithVolume(new VolumeBuilder("0") - .WithName(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithCoverImage("Special 1") .WithIsSpecial(true) @@ -43,8 +43,8 @@ public class SeriesExtensionsTests { var series = new SeriesBuilder("Test 1") .WithFormat(MangaFormat.Archive) - .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) - .WithName(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("13") .WithCoverImage("Chapter 13") .Build()) @@ -59,7 +59,7 @@ public class SeriesExtensionsTests .WithVolume(new VolumeBuilder("2") .WithName("Volume 2") - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithCoverImage("Volume 2") .Build()) .Build()) @@ -81,14 +81,14 @@ public class SeriesExtensionsTests .WithVolume(new VolumeBuilder("1") .WithName("Volume 1") - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithCoverImage("Volume 1 Chapter 1") .Build()) .Build()) .WithVolume(new VolumeBuilder("2") .WithName("Volume 2") - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithCoverImage("Volume 2") .Build()) .Build()) @@ -120,8 +120,8 @@ public class SeriesExtensionsTests { var series = new SeriesBuilder("Test 1") .WithFormat(MangaFormat.Archive) - .WithVolume(new VolumeBuilder("0") - .WithName(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("2.5") .WithIsSpecial(false) .WithCoverImage("Special 1") @@ -146,8 +146,8 @@ public class SeriesExtensionsTests { var series = new SeriesBuilder("Test 1") .WithFormat(MangaFormat.Archive) - .WithVolume(new VolumeBuilder("0") - .WithName(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("2.5") .WithIsSpecial(false) .WithCoverImage("Chapter 2.5") @@ -156,7 +156,7 @@ public class SeriesExtensionsTests .WithIsSpecial(false) .WithCoverImage("Chapter 2") .Build()) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithIsSpecial(true) .WithCoverImage("Special 1") .Build()) @@ -176,8 +176,8 @@ public class SeriesExtensionsTests { var series = new SeriesBuilder("Test 1") .WithFormat(MangaFormat.Archive) - .WithVolume(new VolumeBuilder("0") - .WithName(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("2.5") .WithIsSpecial(false) .WithCoverImage("Chapter 2.5") @@ -186,14 +186,14 @@ public class SeriesExtensionsTests .WithIsSpecial(false) .WithCoverImage("Chapter 2") .Build()) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithIsSpecial(true) .WithCoverImage("Special 3") .Build()) .Build()) .WithVolume(new VolumeBuilder("1") .WithMinNumber(1) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithIsSpecial(false) .WithCoverImage("Volume 1") .Build()) @@ -213,8 +213,8 @@ public class SeriesExtensionsTests { var series = new SeriesBuilder("Test 1") .WithFormat(MangaFormat.Archive) - .WithVolume(new VolumeBuilder("0") - .WithName(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("2.5") .WithIsSpecial(false) .WithCoverImage("Chapter 2.5") @@ -223,14 +223,14 @@ public class SeriesExtensionsTests .WithIsSpecial(false) .WithCoverImage("Chapter 2") .Build()) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithIsSpecial(true) .WithCoverImage("Special 1") .Build()) .Build()) .WithVolume(new VolumeBuilder("1") .WithMinNumber(1) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithIsSpecial(false) .WithCoverImage("Volume 1") .Build()) @@ -250,8 +250,8 @@ public class SeriesExtensionsTests { var series = new SeriesBuilder("Ippo") .WithFormat(MangaFormat.Archive) - .WithVolume(new VolumeBuilder("0") - .WithName(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1426") .WithIsSpecial(false) .WithCoverImage("Chapter 1426") @@ -260,21 +260,21 @@ public class SeriesExtensionsTests .WithIsSpecial(false) .WithCoverImage("Chapter 1425") .Build()) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithIsSpecial(true) .WithCoverImage("Special 1") .Build()) .Build()) .WithVolume(new VolumeBuilder("1") .WithMinNumber(1) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithIsSpecial(false) .WithCoverImage("Volume 1") .Build()) .Build()) .WithVolume(new VolumeBuilder("137") .WithMinNumber(1) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithIsSpecial(false) .WithCoverImage("Volume 137") .Build()) @@ -294,8 +294,8 @@ public class SeriesExtensionsTests { var series = new SeriesBuilder("Test 1") .WithFormat(MangaFormat.Archive) - .WithVolume(new VolumeBuilder("0") - .WithName(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithName(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("2.5") .WithIsSpecial(false) .WithCoverImage("Chapter 2.5") @@ -307,7 +307,7 @@ public class SeriesExtensionsTests .Build()) .WithVolume(new VolumeBuilder("4") .WithMinNumber(4) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithIsSpecial(false) .WithCoverImage("Volume 4") .Build()) diff --git a/API.Tests/Extensions/VolumeListExtensionsTests.cs b/API.Tests/Extensions/VolumeListExtensionsTests.cs index e64267896..56aef59f3 100644 --- a/API.Tests/Extensions/VolumeListExtensionsTests.cs +++ b/API.Tests/Extensions/VolumeListExtensionsTests.cs @@ -21,7 +21,7 @@ public class VolumeListExtensionsTests .WithChapter(new ChapterBuilder("3").Build()) .WithChapter(new ChapterBuilder("4").Build()) .Build(), - new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithIsSpecial(true).Build()) .Build(), @@ -39,7 +39,7 @@ public class VolumeListExtensionsTests .WithChapter(new ChapterBuilder("3").Build()) .WithChapter(new ChapterBuilder("4").Build()) .Build(), - new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithIsSpecial(true).Build()) .Build(), @@ -57,7 +57,7 @@ public class VolumeListExtensionsTests .WithChapter(new ChapterBuilder("3").Build()) .WithChapter(new ChapterBuilder("4").Build()) .Build(), - new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithIsSpecial(true).Build()) .Build(), @@ -75,7 +75,7 @@ public class VolumeListExtensionsTests .WithChapter(new ChapterBuilder("3").Build()) .WithChapter(new ChapterBuilder("4").Build()) .Build(), - new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithIsSpecial(true).Build()) .Build(), diff --git a/API.Tests/Parser/ComicParserTests.cs b/API.Tests/Parser/ComicParserTests.cs index 4740c4f54..0b278dbb7 100644 --- a/API.Tests/Parser/ComicParserTests.cs +++ b/API.Tests/Parser/ComicParserTests.cs @@ -12,6 +12,7 @@ public class ComicParserTests { private readonly ITestOutputHelper _testOutputHelper; private readonly DefaultParser _defaultParser; + private static readonly string DefaultVolume = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume; public ComicParserTests(ITestOutputHelper testOutputHelper) { @@ -85,37 +86,37 @@ public class ComicParserTests } [Theory] - [InlineData("01 Spider-Man & Wolverine 01.cbr", "0")] - [InlineData("04 - Asterix the Gladiator (1964) (Digital-Empire) (WebP by Doc MaKS)", "0")] - [InlineData("The First Asterix Frieze (WebP by Doc MaKS)", "0")] - [InlineData("Batman & Catwoman - Trail of the Gun 01", "0")] - [InlineData("Batman & Daredevil - King of New York", "0")] - [InlineData("Batman & Grendel (1996) 01 - Devil's Bones", "0")] - [InlineData("Batman & Robin the Teen Wonder #0", "0")] - [InlineData("Batman & Wildcat (1 of 3)", "0")] - [InlineData("Batman And Superman World's Finest #01", "0")] - [InlineData("Babe 01", "0")] - [InlineData("Scott Pilgrim 01 - Scott Pilgrim's Precious Little Life (2004)", "0")] + [InlineData("01 Spider-Man & Wolverine 01.cbr", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("04 - Asterix the Gladiator (1964) (Digital-Empire) (WebP by Doc MaKS)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("The First Asterix Frieze (WebP by Doc MaKS)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman & Catwoman - Trail of the Gun 01", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman & Daredevil - King of New York", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman & Grendel (1996) 01 - Devil's Bones", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman & Robin the Teen Wonder #0", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman & Wildcat (1 of 3)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman And Superman World's Finest #01", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Babe 01", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Scott Pilgrim 01 - Scott Pilgrim's Precious Little Life (2004)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Teen Titans v1 001 (1966-02) (digital) (OkC.O.M.P.U.T.O.-Novus)", "1")] - [InlineData("Scott Pilgrim 02 - Scott Pilgrim vs. The World (2005)", "0")] + [InlineData("Scott Pilgrim 02 - Scott Pilgrim vs. The World (2005)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Superman v1 024 (09-10 1943)", "1")] [InlineData("Superman v1.5 024 (09-10 1943)", "1.5")] - [InlineData("Amazing Man Comics chapter 25", "0")] - [InlineData("Invincible 033.5 - Marvel Team-Up 14 (2006) (digital) (Minutemen-Slayer)", "0")] - [InlineData("Cyberpunk 2077 - Trauma Team 04.cbz", "0")] - [InlineData("spawn-123", "0")] - [InlineData("spawn-chapter-123", "0")] - [InlineData("Spawn 062 (1997) (digital) (TLK-EMPIRE-HD).cbr", "0")] - [InlineData("Batman Beyond 04 (of 6) (1999)", "0")] - [InlineData("Batman Beyond 001 (2012)", "0")] - [InlineData("Batman Beyond 2.0 001 (2013)", "0")] - [InlineData("Batman - Catwoman 001 (2021) (Webrip) (The Last Kryptonian-DCP)", "0")] + [InlineData("Amazing Man Comics chapter 25", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Invincible 033.5 - Marvel Team-Up 14 (2006) (digital) (Minutemen-Slayer)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Cyberpunk 2077 - Trauma Team 04.cbz", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("spawn-123", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("spawn-chapter-123", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Spawn 062 (1997) (digital) (TLK-EMPIRE-HD).cbr", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman Beyond 04 (of 6) (1999)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman Beyond 001 (2012)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman Beyond 2.0 001 (2013)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("Batman - Catwoman 001 (2021) (Webrip) (The Last Kryptonian-DCP)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Chew v1 - Taster´s Choise (2012) (Digital) (1920) (Kingpin-Empire)", "1")] - [InlineData("Chew Script Book (2011) (digital-Empire) SP04", "0")] + [InlineData("Chew Script Book (2011) (digital-Empire) SP04", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Batgirl Vol.2000 #57 (December, 2004)", "2000")] [InlineData("Batgirl V2000 #57", "2000")] - [InlineData("Fables 021 (2004) (Digital) (Nahga-Empire).cbr", "0")] - [InlineData("2000 AD 0366 [1984-04-28] (flopbie)", "0")] + [InlineData("Fables 021 (2004) (Digital) (Nahga-Empire).cbr", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] + [InlineData("2000 AD 0366 [1984-04-28] (flopbie)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Daredevil - v6 - 10 - (2019)", "6")] [InlineData("Daredevil - v6.5", "6.5")] // Tome Tests @@ -125,11 +126,11 @@ public class ComicParserTests [InlineData("Conquistador_Tome_2", "2")] [InlineData("Max_l_explorateur-_Tome_0", "0")] [InlineData("Chevaliers d'Héliopolis T3 - Rubedo, l'oeuvre au rouge (Jodorowsky & Jérémy)", "3")] - [InlineData("Adventure Time (2012)/Adventure Time #1 (2012)", "0")] + [InlineData("Adventure Time (2012)/Adventure Time #1 (2012)", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Adventure Time TPB (2012)/Adventure Time v01 (2012).cbz", "1")] // Russian Tests [InlineData("Kebab Том 1 Глава 3", "1")] - [InlineData("Манга Глава 2", "0")] + [InlineData("Манга Глава 2", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] public void ParseComicVolumeTest(string filename, string expected) { Assert.Equal(expected, API.Services.Tasks.Scanner.Parser.Parser.ParseComicVolume(filename)); @@ -137,10 +138,10 @@ public class ComicParserTests [Theory] [InlineData("01 Spider-Man & Wolverine 01.cbr", "1")] - [InlineData("04 - Asterix the Gladiator (1964) (Digital-Empire) (WebP by Doc MaKS)", "0")] - [InlineData("The First Asterix Frieze (WebP by Doc MaKS)", "0")] + [InlineData("04 - Asterix the Gladiator (1964) (Digital-Empire) (WebP by Doc MaKS)", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] + [InlineData("The First Asterix Frieze (WebP by Doc MaKS)", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Batman & Catwoman - Trail of the Gun 01", "1")] - [InlineData("Batman & Daredevil - King of New York", "0")] + [InlineData("Batman & Daredevil - King of New York", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Batman & Grendel (1996) 01 - Devil's Bones", "1")] [InlineData("Batman & Robin the Teen Wonder #0", "0")] [InlineData("Batman & Wildcat (1 of 3)", "1")] @@ -164,8 +165,8 @@ public class ComicParserTests [InlineData("Batman Beyond 001 (2012)", "1")] [InlineData("Batman Beyond 2.0 001 (2013)", "1")] [InlineData("Batman - Catwoman 001 (2021) (Webrip) (The Last Kryptonian-DCP)", "1")] - [InlineData("Chew v1 - Taster´s Choise (2012) (Digital) (1920) (Kingpin-Empire)", "0")] - [InlineData("Chew Script Book (2011) (digital-Empire) SP04", "0")] + [InlineData("Chew v1 - Taster´s Choise (2012) (Digital) (1920) (Kingpin-Empire)", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] + [InlineData("Chew Script Book (2011) (digital-Empire) SP04", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Batgirl Vol.2000 #57 (December, 2004)", "57")] [InlineData("Batgirl V2000 #57", "57")] [InlineData("Fables 021 (2004) (Digital) (Nahga-Empire).cbr", "21")] @@ -174,7 +175,7 @@ public class ComicParserTests [InlineData("Daredevil - v6 - 10 - (2019)", "10")] [InlineData("Batman Beyond 2016 - Chapter 001.cbz", "1")] [InlineData("Adventure Time (2012)/Adventure Time #1 (2012)", "1")] - [InlineData("Adventure Time TPB (2012)/Adventure Time v01 (2012).cbz", "0")] + [InlineData("Adventure Time TPB (2012)/Adventure Time v01 (2012).cbz", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Kebab Том 1 Глава 3", "3")] [InlineData("Манга Глава 2", "2")] [InlineData("Манга 2 Глава", "2")] diff --git a/API.Tests/Parser/DefaultParserTests.cs b/API.Tests/Parser/DefaultParserTests.cs index 14e75f353..eef5bc2dc 100644 --- a/API.Tests/Parser/DefaultParserTests.cs +++ b/API.Tests/Parser/DefaultParserTests.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging; using NSubstitute; using Xunit; using Xunit.Abstractions; +using API.Services.Tasks.Scanner.Parser; namespace API.Tests.Parser; @@ -44,19 +45,18 @@ public class DefaultParserTests } [Theory] - [InlineData("/manga/Btooom!/Vol.1/Chapter 1/1.cbz", "Btooom!~1~1")] - [InlineData("/manga/Btooom!/Vol.1 Chapter 2/1.cbz", "Btooom!~1~2")] - [InlineData("/manga/Monster/Ch. 001-016 [MangaPlus] [Digital] [amit34521]/Monster Ch. 001 [MangaPlus] [Digital] [amit34521]/13.jpg", "Monster~0~1")] - [InlineData("/manga/Hajime no Ippo/Artbook/Hajime no Ippo - Artbook.cbz", "Hajime no Ippo~0~0")] - public void ParseFromFallbackFolders_ShouldParseSeriesVolumeAndChapter(string inputFile, string expectedParseInfo) + [InlineData("/manga/Btooom!/Vol.1/Chapter 1/1.cbz", new [] {"Btooom!", "1", "1"})] + [InlineData("/manga/Btooom!/Vol.1 Chapter 2/1.cbz", new [] {"Btooom!", "1", "2"})] + [InlineData("/manga/Monster/Ch. 001-016 [MangaPlus] [Digital] [amit34521]/Monster Ch. 001 [MangaPlus] [Digital] [amit34521]/13.jpg", new [] {"Monster", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, "1"})] + [InlineData("/manga/Hajime no Ippo/Artbook/Hajime no Ippo - Artbook.cbz", new [] {"Hajime no Ippo", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter})] + public void ParseFromFallbackFolders_ShouldParseSeriesVolumeAndChapter(string inputFile, string[] expectedParseInfo) { const string rootDirectory = "/manga/"; - var tokens = expectedParseInfo.Split("~"); - var actual = new ParserInfo {Series = "", Chapters = "0", Volumes = "0"}; + var actual = new ParserInfo {Series = "", Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume}; _defaultParser.ParseFromFallbackFolders(inputFile, rootDirectory, LibraryType.Manga, ref actual); - Assert.Equal(tokens[0], actual.Series); - Assert.Equal(tokens[1], actual.Volumes); - Assert.Equal(tokens[2], actual.Chapters); + Assert.Equal(expectedParseInfo[0], actual.Series); + Assert.Equal(expectedParseInfo[1], actual.Volumes); + Assert.Equal(expectedParseInfo[2], actual.Chapters); } [Theory] @@ -127,14 +127,14 @@ public class DefaultParserTests expected.Add(filepath, new ParserInfo { Series = "Shimoneta to Iu Gainen ga Sonzai Shinai Taikutsu na Sekai Man-hen", Volumes = "1", - Chapters = "0", Filename = "Vol 1.cbz", Format = MangaFormat.Archive, + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Filename = "Vol 1.cbz", Format = MangaFormat.Archive, FullFilePath = filepath }); filepath = @"E:\Manga\Beelzebub\Beelzebub_01_[Noodles].zip"; expected.Add(filepath, new ParserInfo { - Series = "Beelzebub", Volumes = "0", + Series = "Beelzebub", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Chapters = "1", Filename = "Beelzebub_01_[Noodles].zip", Format = MangaFormat.Archive, FullFilePath = filepath }); @@ -151,7 +151,7 @@ public class DefaultParserTests expected.Add(filepath, new ParserInfo { Series = "Tenjo Tenge {Full Contact Edition}", Volumes = "1", Edition = "", - Chapters = "0", Filename = "Tenjo Tenge {Full Contact Edition} v01 (2011) (Digital) (ASTC).cbz", Format = MangaFormat.Archive, + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Filename = "Tenjo Tenge {Full Contact Edition} v01 (2011) (Digital) (ASTC).cbz", Format = MangaFormat.Archive, FullFilePath = filepath }); @@ -159,7 +159,7 @@ public class DefaultParserTests expected.Add(filepath, new ParserInfo { Series = "Akame ga KILL! ZERO", Volumes = "1", Edition = "", - Chapters = "0", Filename = "Akame ga KILL! ZERO v01 (2016) (Digital) (LuCaZ).cbz", Format = MangaFormat.Archive, + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Filename = "Akame ga KILL! ZERO v01 (2016) (Digital) (LuCaZ).cbz", Format = MangaFormat.Archive, FullFilePath = filepath }); @@ -167,14 +167,14 @@ public class DefaultParserTests expected.Add(filepath, new ParserInfo { Series = "Dorohedoro", Volumes = "1", Edition = "", - Chapters = "0", Filename = "Dorohedoro v01 (2010) (Digital) (LostNerevarine-Empire).cbz", Format = MangaFormat.Archive, + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Filename = "Dorohedoro v01 (2010) (Digital) (LostNerevarine-Empire).cbz", Format = MangaFormat.Archive, FullFilePath = filepath }); filepath = @"E:\Manga\APOSIMZ\APOSIMZ 040 (2020) (Digital) (danke-Empire).cbz"; expected.Add(filepath, new ParserInfo { - Series = "APOSIMZ", Volumes = "0", Edition = "", + Series = "APOSIMZ", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Chapters = "40", Filename = "APOSIMZ 040 (2020) (Digital) (danke-Empire).cbz", Format = MangaFormat.Archive, FullFilePath = filepath }); @@ -182,7 +182,7 @@ public class DefaultParserTests filepath = @"E:\Manga\Corpse Party Musume\Kedouin Makoto - Corpse Party Musume, Chapter 09.cbz"; expected.Add(filepath, new ParserInfo { - Series = "Kedouin Makoto - Corpse Party Musume", Volumes = "0", Edition = "", + Series = "Kedouin Makoto - Corpse Party Musume", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Chapters = "9", Filename = "Kedouin Makoto - Corpse Party Musume, Chapter 09.cbz", Format = MangaFormat.Archive, FullFilePath = filepath }); @@ -190,7 +190,7 @@ public class DefaultParserTests filepath = @"E:\Manga\Goblin Slayer\Goblin Slayer - Brand New Day 006.5 (2019) (Digital) (danke-Empire).cbz"; expected.Add(filepath, new ParserInfo { - Series = "Goblin Slayer - Brand New Day", Volumes = "0", Edition = "", + Series = "Goblin Slayer - Brand New Day", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Chapters = "6.5", Filename = "Goblin Slayer - Brand New Day 006.5 (2019) (Digital) (danke-Empire).cbz", Format = MangaFormat.Archive, FullFilePath = filepath }); @@ -198,15 +198,15 @@ public class DefaultParserTests filepath = @"E:\Manga\Summer Time Rendering\Specials\Record 014 (between chapter 083 and ch084) SP11.cbr"; expected.Add(filepath, new ParserInfo { - Series = "Summer Time Rendering", Volumes = "0", Edition = "", - Chapters = "0", Filename = "Record 014 (between chapter 083 and ch084) SP11.cbr", Format = MangaFormat.Archive, + Series = "Summer Time Rendering", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Filename = "Record 014 (between chapter 083 and ch084) SP11.cbr", Format = MangaFormat.Archive, FullFilePath = filepath, IsSpecial = true }); filepath = @"E:\Manga\Seraph of the End\Seraph of the End - Vampire Reign 093 (2020) (Digital) (LuCaZ).cbz"; expected.Add(filepath, new ParserInfo { - Series = "Seraph of the End - Vampire Reign", Volumes = "0", Edition = "", + Series = "Seraph of the End - Vampire Reign", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Chapters = "93", Filename = "Seraph of the End - Vampire Reign 093 (2020) (Digital) (LuCaZ).cbz", Format = MangaFormat.Archive, FullFilePath = filepath, IsSpecial = false }); @@ -234,7 +234,7 @@ public class DefaultParserTests filepath = @"E:\Manga\The Beginning After the End\Chapter 001.cbz"; expected.Add(filepath, new ParserInfo { - Series = "The Beginning After the End", Volumes = "0", Edition = "", + Series = "The Beginning After the End", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Chapters = "1", Filename = "Chapter 001.cbz", Format = MangaFormat.Archive, FullFilePath = filepath, IsSpecial = false }); @@ -243,7 +243,7 @@ public class DefaultParserTests expected.Add(filepath, new ParserInfo { Series = "Air Gear", Volumes = "1", Edition = "Omnibus", - Chapters = "0", Filename = "Air Gear Omnibus v01 (2016) (Digital) (Shadowcat-Empire).cbz", Format = MangaFormat.Archive, + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Filename = "Air Gear Omnibus v01 (2016) (Digital) (Shadowcat-Empire).cbz", Format = MangaFormat.Archive, FullFilePath = filepath, IsSpecial = false }); @@ -251,7 +251,7 @@ public class DefaultParserTests expected.Add(filepath, new ParserInfo { Series = "Harrison, Kim - The Good, The Bad, and the Undead - Hollows", Volumes = "2.5", Edition = "", - Chapters = "0", Filename = "Harrison, Kim - The Good, The Bad, and the Undead - Hollows Vol 2.5.epub", Format = MangaFormat.Epub, + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Filename = "Harrison, Kim - The Good, The Bad, and the Undead - Hollows Vol 2.5.epub", Format = MangaFormat.Epub, FullFilePath = filepath, IsSpecial = false }); @@ -292,7 +292,7 @@ public class DefaultParserTests var filepath = @"E:\Manga\Monster #8\Ch. 001-016 [MangaPlus] [Digital] [amit34521]\Monster #8 Ch. 001 [MangaPlus] [Digital] [amit34521]\13.jpg"; var expectedInfo2 = new ParserInfo { - Series = "Monster #8", Volumes = "0", Edition = "", + Series = "Monster #8", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Chapters = "8", Filename = "13.jpg", Format = MangaFormat.Image, FullFilePath = filepath, IsSpecial = false }; @@ -414,7 +414,7 @@ public class DefaultParserTests filepath = @"E:/Manga/Foo 50/Specials/Foo 50 SP01.cbz"; expected = new ParserInfo { - Series = "Foo 50", Volumes = "0", IsSpecial = true, + Series = "Foo 50", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, IsSpecial = true, Chapters = "50", Filename = "Foo 50 SP01.cbz", Format = MangaFormat.Archive, FullFilePath = filepath }; @@ -449,8 +449,8 @@ public class DefaultParserTests var filepath = @"E:/Comics/Teen Titans/Teen Titans v1 Annual 01 (1967) SP01.cbr"; expected.Add(filepath, new ParserInfo { - Series = "Teen Titans", Volumes = "0", - Chapters = "0", Filename = "Teen Titans v1 Annual 01 (1967) SP01.cbr", Format = MangaFormat.Archive, + Series = "Teen Titans", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Filename = "Teen Titans v1 Annual 01 (1967) SP01.cbr", Format = MangaFormat.Archive, FullFilePath = filepath }); @@ -458,7 +458,7 @@ public class DefaultParserTests filepath = @"E:\Comics\Comics\Babe\Babe Vol.1 #1-4\Babe 01.cbr"; expected.Add(filepath, new ParserInfo { - Series = "Babe", Volumes = "0", Edition = "", + Series = "Babe", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Chapters = "1", Filename = "Babe 01.cbr", Format = MangaFormat.Archive, FullFilePath = filepath, IsSpecial = false }); @@ -474,7 +474,7 @@ public class DefaultParserTests filepath = @"E:\Comics\Comics\Batman - The Man Who Laughs #1 (2005)\Batman - The Man Who Laughs #1 (2005).cbr"; expected.Add(filepath, new ParserInfo { - Series = "Batman - The Man Who Laughs", Volumes = "0", Edition = "", + Series = "Batman - The Man Who Laughs", Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, Edition = "", Chapters = "1", Filename = "Batman - The Man Who Laughs #1 (2005).cbr", Format = MangaFormat.Archive, FullFilePath = filepath, IsSpecial = false }); diff --git a/API.Tests/Parser/MangaParserTests.cs b/API.Tests/Parser/MangaParserTests.cs index 126e781d6..7413ffe85 100644 --- a/API.Tests/Parser/MangaParserTests.cs +++ b/API.Tests/Parser/MangaParserTests.cs @@ -25,7 +25,7 @@ public class MangaParserTests [InlineData("v001", "1")] [InlineData("Vol 1", "1")] [InlineData("vol_356-1", "356")] // Mangapy syntax - [InlineData("No Volume", "0")] + [InlineData("No Volume", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("U12 (Under 12) Vol. 0001 Ch. 0001 - Reiwa Scans (gb)", "1")] [InlineData("[Suihei Kiki]_Kasumi_Otoko_no_Ko_[Taruby]_v1.1.zip", "1.1")] [InlineData("Tonikaku Cawaii [Volume 11].cbz", "11")] @@ -40,18 +40,18 @@ public class MangaParserTests [InlineData("Dorohedoro v01 (2010) (Digital) (LostNerevarine-Empire).cbz", "1")] [InlineData("Dorohedoro v11 (2013) (Digital) (LostNerevarine-Empire).cbz", "11")] [InlineData("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "1")] - [InlineData("Yumekui-Merry_DKThias_Chapter11v2.zip", "0")] + [InlineData("Yumekui-Merry_DKThias_Chapter11v2.zip", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Itoshi no Karin - c001-006x1 (v01) [Renzokusei Scans]", "1")] - [InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 12", "0")] + [InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 12", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("VanDread-v01-c001[MD].zip", "1")] [InlineData("Ichiban_Ushiro_no_Daimaou_v04_ch27_[VISCANS].zip", "4")] [InlineData("Mob Psycho 100 v02 (2019) (Digital) (Shizu).cbz", "2")] [InlineData("Kodomo no Jikan vol. 1.cbz", "1")] [InlineData("Kodomo no Jikan vol. 10.cbz", "10")] - [InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 12 [Dametrans][v2]", "0")] + [InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 12 [Dametrans][v2]", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Vagabond_v03", "3")] [InlineData("Mujaki No Rakune Volume 10.cbz", "10")] - [InlineData("Umineko no Naku Koro ni - Episode 3 - Banquet of the Golden Witch #02.cbz", "0")] + [InlineData("Umineko no Naku Koro ni - Episode 3 - Banquet of the Golden Witch #02.cbz", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Volume 12 - Janken Boy is Coming!.cbz", "12")] [InlineData("[dmntsf.net] One Piece - Digital Colored Comics Vol. 20 Ch. 177 - 30 Million vs 81 Million.cbz", "20")] [InlineData("Gantz.V26.cbz", "26")] @@ -60,7 +60,7 @@ public class MangaParserTests [InlineData("NEEDLESS_Vol.4_-_Simeon_6_v2_[SugoiSugoi].rar", "4")] [InlineData("Okusama wa Shougakusei c003 (v01) [bokuwaNEET]", "1")] [InlineData("Sword Art Online Vol 10 - Alicization Running [Yen Press] [LuCaZ] {r2}.epub", "10")] - [InlineData("Noblesse - Episode 406 (52 Pages).7z", "0")] + [InlineData("Noblesse - Episode 406 (52 Pages).7z", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("X-Men v1 #201 (September 2007).cbz", "1")] [InlineData("Hentai Ouji to Warawanai Neko. - Vol. 06 Ch. 034.5", "6")] [InlineData("The 100 Girlfriends Who Really, Really, Really, Really, Really Love You - Vol. 03 Ch. 023.5 - Volume 3 Extras.cbz", "3")] @@ -72,7 +72,7 @@ public class MangaParserTests [InlineData("スライム倒して300年、知らないうちにレベルMAXになってました 1-3巻", "1-3")] [InlineData("Dance in the Vampire Bund {Special Edition} v03.5 (2019) (Digital) (KG Manga)", "3.5")] [InlineData("Kebab Том 1 Глава 3", "1")] - [InlineData("Манга Глава 2", "0")] + [InlineData("Манга Глава 2", API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)] [InlineData("Манга Тома 1-4", "1-4")] [InlineData("Манга Том 1-4", "1-4")] [InlineData("조선왕조실톡 106화", "106")] @@ -215,12 +215,12 @@ public class MangaParserTests [InlineData("Killing Bites Vol. 0001 Ch. 0001 - Galactica Scanlations (gb)", "1")] [InlineData("My Girlfriend Is Shobitch v01 - ch. 09 - pg. 008.png", "9")] [InlineData("Historys Strongest Disciple Kenichi_v11_c90-98.zip", "90-98")] - [InlineData("B_Gata_H_Kei_v01[SlowManga&OverloadScans]", "0")] - [InlineData("BTOOOM! v01 (2013) (Digital) (Shadowcat-Empire)", "0")] + [InlineData("B_Gata_H_Kei_v01[SlowManga&OverloadScans]", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] + [InlineData("BTOOOM! v01 (2013) (Digital) (Shadowcat-Empire)", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Gokukoku no Brynhildr - c001-008 (v01) [TrinityBAKumA]", "1-8")] - [InlineData("Dance in the Vampire Bund v16-17 (Digital) (NiceDragon)", "0")] + [InlineData("Dance in the Vampire Bund v16-17 (Digital) (NiceDragon)", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("c001", "1")] - [InlineData("[Suihei Kiki]_Kasumi_Otoko_no_Ko_[Taruby]_v1.12.zip", "0")] + [InlineData("[Suihei Kiki]_Kasumi_Otoko_no_Ko_[Taruby]_v1.12.zip", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Adding volume 1 with File: Ana Satsujin Vol. 1 Ch. 5 - Manga Box (gb).cbz", "5")] [InlineData("Hinowa ga CRUSH! 018 (2019) (Digital) (LuCaZ).cbz", "18")] [InlineData("Cynthia The Mission - c000-006 (v06) [Desudesu&Brolen].zip", "0-6")] @@ -243,7 +243,7 @@ public class MangaParserTests [InlineData("Itoshi no Karin - c001-006x1 (v01) [Renzokusei Scans]", "1-6")] [InlineData("APOSIMZ 040 (2020) (Digital) (danke-Empire).cbz", "40")] [InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 12", "12")] - [InlineData("Vol 1", "0")] + [InlineData("Vol 1", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("VanDread-v01-c001[MD].zip", "1")] [InlineData("Goblin Slayer Side Story - Year One 025.5", "25.5")] [InlineData("Kedouin Makoto - Corpse Party Musume, Chapter 01", "1")] @@ -255,10 +255,10 @@ public class MangaParserTests [InlineData("Fullmetal Alchemist chapters 101-108.cbz", "101-108")] [InlineData("Umineko no Naku Koro ni - Episode 3 - Banquet of the Golden Witch #02.cbz", "2")] [InlineData("To Love Ru v09 Uncensored (Ch.071-079).cbz", "71-79")] - [InlineData("Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U Extra Chapter.rar", "0")] + [InlineData("Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U Extra Chapter.rar", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Beelzebub_153b_RHS.zip", "153.5")] [InlineData("Beelzebub_150-153b_RHS.zip", "150-153.5")] - [InlineData("Transferred to another world magical swordsman v1.1", "0")] + [InlineData("Transferred to another world magical swordsman v1.1", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Kiss x Sis - Ch.15 - The Angst of a 15 Year Old Boy.cbz", "15")] [InlineData("Kiss x Sis - Ch.12 - 1 , 2 , 3P!.cbz", "12")] [InlineData("Umineko no Naku Koro ni - Episode 1 - Legend of the Golden Witch #1", "1")] @@ -277,21 +277,21 @@ public class MangaParserTests [InlineData("Kimi no Koto ga Daidaidaidaidaisuki na 100-nin no Kanojo Chapter 1-10", "1-10")] [InlineData("Deku_&_Bakugo_-_Rising_v1_c1.1.cbz", "1.1")] [InlineData("Chapter 63 - The Promise Made for 520 Cenz.cbr", "63")] - [InlineData("Harrison, Kim - The Good, The Bad, and the Undead - Hollows Vol 2.5.epub", "0")] + [InlineData("Harrison, Kim - The Good, The Bad, and the Undead - Hollows Vol 2.5.epub", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Kaiju No. 8 036 (2021) (Digital)", "36")] - [InlineData("Samurai Jack Vol. 01 - The threads of Time", "0")] + [InlineData("Samurai Jack Vol. 01 - The threads of Time", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("【TFO汉化&Petit汉化】迷你偶像漫画第25话", "25")] [InlineData("자유록 13회#2", "13")] [InlineData("이세계에서 고아원을 열었지만, 어째서인지 아무도 독립하려 하지 않는다 38-1화 ", "38")] [InlineData("[ハレム]ナナとカオル ~高校生のSMごっこ~ 第10話", "10")] - [InlineData("Dance in the Vampire Bund {Special Edition} v03.5 (2019) (Digital) (KG Manga)", "0")] + [InlineData("Dance in the Vampire Bund {Special Edition} v03.5 (2019) (Digital) (KG Manga)", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Kebab Том 1 Глава 3", "3")] [InlineData("Манга Глава 2", "2")] [InlineData("Манга 2 Глава", "2")] [InlineData("Манга Том 1 2 Глава", "2")] [InlineData("Accel World Chapter 001 Volume 002", "1")] [InlineData("Bleach 001-003", "1-3")] - [InlineData("Accel World Volume 2", "0")] + [InlineData("Accel World Volume 2", API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter)] [InlineData("Historys Strongest Disciple Kenichi_v11_c90-98", "90-98")] [InlineData("Historys Strongest Disciple Kenichi c01-c04", "1-4")] public void ParseChaptersTest(string filename, string expected) diff --git a/API.Tests/Parser/ParserInfoTests.cs b/API.Tests/Parser/ParserInfoTests.cs index e7c48317b..33d560c68 100644 --- a/API.Tests/Parser/ParserInfoTests.cs +++ b/API.Tests/Parser/ParserInfoTests.cs @@ -11,14 +11,14 @@ public class ParserInfoTests { var p1 = new ParserInfo() { - Chapters = "0", + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Edition = "", Format = MangaFormat.Archive, FullFilePath = "/manga/darker than black.cbz", IsSpecial = false, Series = "darker than black", Title = "darker than black", - Volumes = "0" + Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume }; var p2 = new ParserInfo() @@ -30,7 +30,7 @@ public class ParserInfoTests IsSpecial = false, Series = "darker than black", Title = "Darker Than Black", - Volumes = "0" + Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume }; var expected = new ParserInfo() @@ -42,7 +42,7 @@ public class ParserInfoTests IsSpecial = false, Series = "darker than black", Title = "darker than black", - Volumes = "0" + Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume }; p1.Merge(p2); @@ -62,12 +62,12 @@ public class ParserInfoTests IsSpecial = true, Series = "darker than black", Title = "darker than black", - Volumes = "0" + Volumes = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume }; var p2 = new ParserInfo() { - Chapters = "0", + Chapters = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, Edition = "", Format = MangaFormat.Archive, FullFilePath = "/manga/darker than black.cbz", diff --git a/API.Tests/Services/BookmarkServiceTests.cs b/API.Tests/Services/BookmarkServiceTests.cs index 6a82f457d..80a483833 100644 --- a/API.Tests/Services/BookmarkServiceTests.cs +++ b/API.Tests/Services/BookmarkServiceTests.cs @@ -132,7 +132,7 @@ Substitute.For()); var series = new SeriesBuilder("Test") .WithFormat(MangaFormat.Epub) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .Build()) .Build()) @@ -181,7 +181,7 @@ Substitute.For()); .WithFormat(MangaFormat.Epub) .WithVolume(new VolumeBuilder("1") .WithMinNumber(1) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .Build()) .Build()) .Build(); diff --git a/API.Tests/Services/CleanupServiceTests.cs b/API.Tests/Services/CleanupServiceTests.cs index 8c29c5c18..250b72c34 100644 --- a/API.Tests/Services/CleanupServiceTests.cs +++ b/API.Tests/Services/CleanupServiceTests.cs @@ -139,7 +139,7 @@ public class CleanupServiceTests : AbstractDbTest // Add 2 series with cover images _context.Series.Add(new SeriesBuilder("Test 1") .WithVolume(new VolumeBuilder("1") - .WithChapter(new ChapterBuilder("0").WithCoverImage("v01_c01.jpg").Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithCoverImage("v01_c01.jpg").Build()) .WithCoverImage("v01_c01.jpg") .Build()) .WithCoverImage("series_01.jpg") @@ -148,7 +148,7 @@ public class CleanupServiceTests : AbstractDbTest _context.Series.Add(new SeriesBuilder("Test 2") .WithVolume(new VolumeBuilder("1") - .WithChapter(new ChapterBuilder("0").WithCoverImage("v01_c03.jpg").Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithCoverImage("v01_c03.jpg").Build()) .WithCoverImage("v01_c03.jpg") .Build()) .WithCoverImage("series_03.jpg") @@ -389,12 +389,12 @@ public class CleanupServiceTests : AbstractDbTest [Fact] public async Task CleanupDbEntries_CleanupAbandonedChapters() { - var c = new ChapterBuilder("0") + var c = new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithPages(1) .Build(); var series = new SeriesBuilder("Test") .WithFormat(MangaFormat.Epub) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(1) .WithChapter(c) .Build()) @@ -537,7 +537,7 @@ public class CleanupServiceTests : AbstractDbTest c.UserProgress = new List(); s.Volumes = new List() { - new VolumeBuilder("0").WithChapter(c).Build() + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume).WithChapter(c).Build() }; _context.Series.Add(s); diff --git a/API.Tests/Services/ReaderServiceTests.cs b/API.Tests/Services/ReaderServiceTests.cs index 3134997ff..f81273a0b 100644 --- a/API.Tests/Services/ReaderServiceTests.cs +++ b/API.Tests/Services/ReaderServiceTests.cs @@ -135,9 +135,9 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithPages(1) .Build()) .Build()) @@ -165,9 +165,9 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithPages(1) .Build()) .Build()) @@ -204,9 +204,9 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithPages(1) .Build()) .Build()) @@ -259,12 +259,12 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithPages(1) .Build()) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithPages(2) .Build()) .Build()) @@ -298,12 +298,12 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithPages(1) .Build()) - .WithChapter(new ChapterBuilder("0") + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) .WithPages(2) .Build()) .Build()) @@ -391,7 +391,7 @@ public class ReaderServiceTests var series = new SeriesBuilder("Test") .WithVolume(new VolumeBuilder("1-2") .WithMinNumber(1) - .WithChapter(new ChapterBuilder("0").Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).Build()) .Build()) .WithVolume(new VolumeBuilder("3-4") @@ -548,7 +548,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) @@ -583,7 +583,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("66").Build()) .WithChapter(new ChapterBuilder("67").Build()) @@ -596,7 +596,7 @@ public class ReaderServiceTests .WithVolume(new VolumeBuilder("2") .WithMinNumber(2) - .WithChapter(new ChapterBuilder("0").Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).Build()) .Build()) .Build(); series.Library = new LibraryBuilder("Test LIb", LibraryType.Manga).Build(); @@ -616,7 +616,7 @@ public class ReaderServiceTests var nextChapter = await _readerService.GetNextChapterIdAsync(1, 2, 3, 1); Assert.NotEqual(-1, nextChapter); var actualChapter = await _unitOfWork.ChapterRepository.GetChapterAsync(nextChapter); - Assert.Equal("0", actualChapter.Range); + Assert.Equal(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, actualChapter.Range); } [Fact] @@ -631,7 +631,7 @@ public class ReaderServiceTests .WithChapter(new ChapterBuilder("2").Build()) .Build()) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("A.cbz").WithIsSpecial(true).Build()) .WithChapter(new ChapterBuilder("B.cbz").WithIsSpecial(true).Build()) @@ -683,7 +683,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) @@ -710,14 +710,14 @@ public class ReaderServiceTests // await ResetDb(); // // var series = new SeriesBuilder("Test") - // .WithVolume(new VolumeBuilder("0") + // .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) // .WithMinNumber(0) // .WithChapter(new ChapterBuilder("1").Build()) // .WithChapter(new ChapterBuilder("2").Build()) // .Build()) // .WithVolume(new VolumeBuilder("1") // .WithMinNumber(1) - // .WithChapter(new ChapterBuilder("0").Build()) + // .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).Build()) // .Build()) // .Build(); // series.Library = new LibraryBuilder("Test LIb", LibraryType.Manga).Build(); @@ -741,11 +741,11 @@ public class ReaderServiceTests // await ResetDb(); // // var series = new SeriesBuilder("Test") - // .WithVolume(new VolumeBuilder("0") + // .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) // .WithMinNumber(0) // .WithChapter(new ChapterBuilder("1").Build()) // .WithChapter(new ChapterBuilder("2").Build()) - // .WithChapter(new ChapterBuilder("0").WithIsSpecial(true).Build()) + // .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithIsSpecial(true).Build()) // .Build()) // // .WithVolume(new VolumeBuilder("1") @@ -781,7 +781,7 @@ public class ReaderServiceTests .WithChapter(new ChapterBuilder("2").Build()) .Build()) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("A.cbz").WithIsSpecial(true).Build()) .WithChapter(new ChapterBuilder("B.cbz").WithIsSpecial(true).Build()) @@ -811,7 +811,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) @@ -842,7 +842,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) @@ -850,7 +850,7 @@ public class ReaderServiceTests .Build()) .WithVolume(new VolumeBuilder("1") .WithMinNumber(1) - .WithChapter(new ChapterBuilder("0").Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).Build()) .Build()) .Build(); series.Library = new LibraryBuilder("Test LIb", LibraryType.Manga).Build(); @@ -880,7 +880,7 @@ public class ReaderServiceTests .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) .Build()) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("A.cbz").WithIsSpecial(true).Build()) .WithChapter(new ChapterBuilder("B.cbz").WithIsSpecial(true).Build()) @@ -1034,7 +1034,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("40").WithPages(1).Build()) .WithChapter(new ChapterBuilder("50").WithPages(1).Build()) .WithChapter(new ChapterBuilder("60").WithPages(1).Build()) @@ -1124,7 +1124,7 @@ public class ReaderServiceTests .WithChapter(new ChapterBuilder("2").Build()) .Build()) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("A.cbz").WithIsSpecial(true).Build()) .WithChapter(new ChapterBuilder("B.cbz").WithIsSpecial(true).Build()) @@ -1188,7 +1188,7 @@ public class ReaderServiceTests var series = new SeriesBuilder("Test") .WithVolume(new VolumeBuilder("1") .WithMinNumber(1) - .WithChapter(new ChapterBuilder("0").Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).Build()) .Build()) .Build(); series.Library = new LibraryBuilder("Test LIb", LibraryType.Manga).Build(); @@ -1215,7 +1215,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) @@ -1223,7 +1223,7 @@ public class ReaderServiceTests .WithVolume(new VolumeBuilder("1") .WithMinNumber(1) - .WithChapter(new ChapterBuilder("0").Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).Build()) .Build()) .Build(); series.Library = new LibraryBuilder("Test LIb", LibraryType.Manga).Build(); @@ -1250,7 +1250,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("5").Build()) .WithChapter(new ChapterBuilder("6").Build()) @@ -1298,7 +1298,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) @@ -1333,7 +1333,7 @@ public class ReaderServiceTests .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) .Build()) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("A.cbz").WithIsSpecial(true).Build()) .WithChapter(new ChapterBuilder("B.cbz").WithIsSpecial(true).Build()) @@ -1366,7 +1366,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithMinNumber(0) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) @@ -1438,7 +1438,7 @@ public class ReaderServiceTests { await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").Build()) .WithChapter(new ChapterBuilder("96").Build()) .Build()) @@ -1485,7 +1485,7 @@ public class ReaderServiceTests .WithChapter(new ChapterBuilder("1").WithPages(3).Build()) .Build()) .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithPages(4) .Build(); @@ -1524,7 +1524,7 @@ public class ReaderServiceTests .WithChapter(new ChapterBuilder("1", "1-11").WithPages(3).Build()) .Build()) .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithPages(4) .Build(); @@ -1625,7 +1625,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") // Loose chapters - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("45").WithPages(1).Build()) .WithChapter(new ChapterBuilder("46").WithPages(1).Build()) .WithChapter(new ChapterBuilder("47").WithPages(1).Build()) @@ -1634,7 +1634,7 @@ public class ReaderServiceTests .Build()) // One file volume .WithVolume(new VolumeBuilder("1") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) // Read + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) // Read .Build()) // Chapter-based volume .WithVolume(new VolumeBuilder("2") @@ -1694,7 +1694,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") // Loose chapters - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithPages(1).Build()) .WithChapter(new ChapterBuilder("2").WithPages(1).Build()) .WithChapter(new ChapterBuilder("Prologue").WithIsSpecial(true).WithPages(1).Build()) @@ -1728,7 +1728,7 @@ public class ReaderServiceTests .WithVolume(new VolumeBuilder("2") .WithChapter(new ChapterBuilder("21").WithPages(1).Build()) .Build()) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("31").WithPages(1).Build()) .WithChapter(new ChapterBuilder("32").WithPages(1).Build()) .Build()) @@ -1782,7 +1782,7 @@ public class ReaderServiceTests { await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("230").WithPages(1).Build()) .WithChapter(new ChapterBuilder("231").WithPages(1).Build()) .Build()) @@ -1818,17 +1818,17 @@ public class ReaderServiceTests { await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("100").WithPages(1).Build()) .WithChapter(new ChapterBuilder("101").WithPages(1).Build()) .WithChapter(new ChapterBuilder("Christmas Eve").WithIsSpecial(true).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("1") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .Build(); series.Library = new LibraryBuilder("Test LIb", LibraryType.Manga).Build(); @@ -1871,7 +1871,7 @@ public class ReaderServiceTests { await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("100").WithPages(1).Build()) .WithChapter(new ChapterBuilder("101").WithPages(1).Build()) .WithChapter(new ChapterBuilder("102").WithPages(1).Build()) @@ -1987,7 +1987,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithPages(1).Build()) .WithChapter(new ChapterBuilder("2").WithPages(1).Build()) .WithChapter(new ChapterBuilder("3").WithPages(1).Build()) @@ -2027,7 +2027,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithPages(1).Build()) .WithChapter(new ChapterBuilder("2").WithPages(1).Build()) .WithChapter(new ChapterBuilder("3").WithPages(1).Build()) @@ -2083,7 +2083,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("230").WithPages(1).Build()) //.WithChapter(new ChapterBuilder("231").WithPages(1).Build()) (Added later) .Build()) @@ -2093,7 +2093,7 @@ public class ReaderServiceTests .WithChapter(new ChapterBuilder("2").WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) //.WithChapter(new ChapterBuilder("14.9").WithPages(1).Build()) (added later) .Build()) .Build(); @@ -2133,13 +2133,13 @@ public class ReaderServiceTests public async Task GetContinuePoint_ShouldReturnUnreadSingleVolume_WhenThereAreSomeSingleVolumesBeforeLooseLeafChapters() { await ResetDb(); - var readChapter1 = new ChapterBuilder("0").WithPages(1).Build(); - var readChapter2 = new ChapterBuilder("0").WithPages(1).Build(); - var volume = new VolumeBuilder("3").WithChapter(new ChapterBuilder("0").WithPages(1).Build()).Build(); + var readChapter1 = new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build(); + var readChapter2 = new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build(); + var volume = new VolumeBuilder("3").WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()).Build(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("51").WithPages(1).Build()) .WithChapter(new ChapterBuilder("52").WithPages(1).Build()) .WithChapter(new ChapterBuilder("53").WithPages(1).Build()) @@ -2153,7 +2153,7 @@ public class ReaderServiceTests .Build()) // 3, 4, and all loose leafs are unread should be unread .WithVolume(new VolumeBuilder("3") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("4") .WithChapter(new ChapterBuilder("40").WithPages(1).Build()) @@ -2207,7 +2207,7 @@ public class ReaderServiceTests .WithChapter(new ChapterBuilder("21").WithPages(1).Build()) .WithChapter(new ChapterBuilder("22").WithPages(1).Build()) .Build()) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("51").WithPages(1).Build()) .WithChapter(new ChapterBuilder("52").WithPages(1).Build()) .WithChapter(new ChapterBuilder("91").WithPages(2).Build()) @@ -2376,7 +2376,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithPages(1).Build()) .WithChapter(new ChapterBuilder("2").WithPages(1).Build()) .WithChapter(new ChapterBuilder("3").WithPages(1).Build()) @@ -2413,7 +2413,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithPages(1).Build()) .WithChapter(new ChapterBuilder("2").WithPages(1).Build()) .WithChapter(new ChapterBuilder("2.5").WithPages(1).Build()) @@ -2453,10 +2453,10 @@ public class ReaderServiceTests var series = new SeriesBuilder("Test") .WithVolume(new VolumeBuilder("1") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .Build(); series.Library = new LibraryBuilder("Test LIb", LibraryType.Manga).Build(); @@ -2486,7 +2486,7 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("45").WithPages(5).Build()) .WithChapter(new ChapterBuilder("46").WithPages(46).Build()) .WithChapter(new ChapterBuilder("47").WithPages(47).Build()) @@ -2497,10 +2497,10 @@ public class ReaderServiceTests .Build()) .WithVolume(new VolumeBuilder("1") - .WithChapter(new ChapterBuilder("0").WithPages(6).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(6).Build()) .Build()) .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(7).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(7).Build()) .Build()) .WithVolume(new VolumeBuilder("3") .WithChapter(new ChapterBuilder("12").WithPages(5).Build()) @@ -2553,12 +2553,12 @@ public class ReaderServiceTests // TODO: Validate this is correct, shouldn't be possible to have 2 Volume 0's in a series var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .WithChapter(new ChapterBuilder("1").WithPages(2).Build()) .Build()) - .WithVolume(new VolumeBuilder("0") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .WithChapter(new ChapterBuilder("1").WithPages(2).Build()) .Build()) .Build(); @@ -2592,8 +2592,8 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .WithChapter(new ChapterBuilder("1").WithPages(2).Build()) .Build()) .Build(); @@ -2665,22 +2665,22 @@ public class ReaderServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("10").WithPages(1).Build()) .WithChapter(new ChapterBuilder("20").WithPages(1).Build()) .WithChapter(new ChapterBuilder("30").WithPages(1).Build()) .WithChapter(new ChapterBuilder("Some Special Title").WithIsSpecial(true).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("1997") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("2002") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("2003") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .Build(); series.Library = new LibraryBuilder("Test LIb", LibraryType.Manga).Build(); @@ -2718,7 +2718,7 @@ public class ReaderServiceTests { await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("10").WithPages(1).Build()) .WithChapter(new ChapterBuilder("20").WithPages(1).Build()) .WithChapter(new ChapterBuilder("30").WithPages(1).Build()) diff --git a/API.Tests/Services/ReadingListServiceTests.cs b/API.Tests/Services/ReadingListServiceTests.cs index 23de53674..0c615207f 100644 --- a/API.Tests/Services/ReadingListServiceTests.cs +++ b/API.Tests/Services/ReadingListServiceTests.cs @@ -128,7 +128,7 @@ public class ReadingListServiceTests .WithMetadata(new SeriesMetadataBuilder().Build()) .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .WithAgeRating(AgeRating.Everyone) .Build() @@ -177,7 +177,7 @@ public class ReadingListServiceTests .WithSeries(new SeriesBuilder("Test") .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .WithAgeRating(AgeRating.Everyone) .Build() @@ -236,7 +236,7 @@ public class ReadingListServiceTests .WithMetadata(new SeriesMetadataBuilder().Build()) .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .WithAgeRating(AgeRating.Everyone) .Build() @@ -296,7 +296,7 @@ public class ReadingListServiceTests .WithMetadata(new SeriesMetadataBuilder().Build()) .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .WithAgeRating(AgeRating.Everyone) .Build() @@ -375,7 +375,7 @@ public class ReadingListServiceTests .WithMetadata(new SeriesMetadataBuilder().Build()) .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .WithAgeRating(AgeRating.Everyone) .Build() @@ -432,7 +432,7 @@ public class ReadingListServiceTests .WithMetadata(new SeriesMetadataBuilder().Build()) .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .WithAgeRating(AgeRating.Everyone) .Build() @@ -497,7 +497,7 @@ public class ReadingListServiceTests .WithMetadata(new SeriesMetadataBuilder().Build()) .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .Build() ) @@ -538,7 +538,7 @@ public class ReadingListServiceTests .WithMetadata(new SeriesMetadataBuilder().Build()) .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .Build() ) @@ -593,7 +593,7 @@ public class ReadingListServiceTests .WithMetadata(new SeriesMetadataBuilder().Build()) .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .Build() ) @@ -645,7 +645,7 @@ public class ReadingListServiceTests .WithMetadata(new SeriesMetadataBuilder().Build()) .WithVolumes(new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1") .WithReleaseDate(new DateTime(2005, 03, 01)) .Build() @@ -736,8 +736,8 @@ public class ReadingListServiceTests } private static ReadingListItemDto CreateListItemDto(MangaFormat seriesFormat, LibraryType libraryType, - string volumeNumber = API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume, - string chapterNumber = API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, + string volumeNumber = API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume, + string chapterNumber =API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter, string chapterTitleName = "") { return new ReadingListItemDto() @@ -1239,7 +1239,7 @@ public class ReadingListServiceTests var series2 = new SeriesBuilder("Series 2") .WithFormat(MangaFormat.Archive) - .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultVolume) + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").Build()) .WithChapter(new ChapterBuilder("2").Build()) .Build()) diff --git a/API.Tests/Services/SeriesServiceTests.cs b/API.Tests/Services/SeriesServiceTests.cs index 97a4306d3..bdaad2d72 100644 --- a/API.Tests/Services/SeriesServiceTests.cs +++ b/API.Tests/Services/SeriesServiceTests.cs @@ -108,7 +108,7 @@ public class SeriesServiceTests : AbstractDbTest .WithAppUser(new AppUserBuilder("majora2007", string.Empty).Build()) .WithSeries(new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("Omake").WithIsSpecial(true).WithTitle("Omake").WithPages(1).Build()) .WithChapter(new ChapterBuilder("Something SP02").WithIsSpecial(true).WithTitle("Something").WithPages(1).Build()) .Build()) @@ -144,7 +144,7 @@ public class SeriesServiceTests : AbstractDbTest .WithAppUser(new AppUserBuilder("majora2007", string.Empty).Build()) .WithSeries(new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithPages(1).Build()) .WithChapter(new ChapterBuilder("2").WithPages(1).Build()) .Build()) @@ -181,12 +181,12 @@ public class SeriesServiceTests : AbstractDbTest .WithAppUser(new AppUserBuilder("majora2007", string.Empty).Build()) .WithSeries(new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithPages(1).Build()) .WithChapter(new ChapterBuilder("2").WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("3") @@ -214,12 +214,12 @@ public class SeriesServiceTests : AbstractDbTest _context.Library.Add(new LibraryBuilder("Test LIb") .WithAppUser(new AppUserBuilder("majora2007", string.Empty).Build()) .WithSeries(new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithPages(1).Build()) .WithChapter(new ChapterBuilder("2").WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("3") @@ -252,11 +252,11 @@ public class SeriesServiceTests : AbstractDbTest .WithSeries(new SeriesBuilder("Test") .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("3") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .Build()) .Build()); @@ -280,7 +280,7 @@ public class SeriesServiceTests : AbstractDbTest .WithAppUser(new AppUserBuilder("majora2007", string.Empty).Build()) .WithSeries(new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("Ano Orokamono ni mo Kyakkou wo! - Volume 1.epub", "Ano Orokamono ni mo Kyakkou wo! - Volume 1.epub").WithIsSpecial(true).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("2") @@ -316,14 +316,14 @@ public class SeriesServiceTests : AbstractDbTest .WithSeries(new SeriesBuilder("Test") .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("1.2") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .WithVolume(new VolumeBuilder("1") - .WithChapter(new ChapterBuilder("0").WithPages(1).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).Build()) .Build()) .Build()) .Build()); @@ -776,7 +776,7 @@ public class SeriesServiceTests : AbstractDbTest var file = new MangaFileBuilder("Test.cbz", MangaFormat.Archive, 1).Build(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).WithFile(file).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).WithFile(file).Build()) .WithChapter(new ChapterBuilder("A Special Case").WithIsSpecial(true).WithFile(file).WithPages(1).Build()) @@ -808,11 +808,11 @@ public class SeriesServiceTests : AbstractDbTest var series = new SeriesBuilder("Test") .WithVolume(new VolumeBuilder("1") - .WithChapter(new ChapterBuilder("0").WithPages(1).WithFile(file).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(1).WithFile(file).Build()) .Build()) .WithVolume(new VolumeBuilder("1.5") - .WithChapter(new ChapterBuilder("0").WithPages(2).WithFile(file).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter).WithPages(2).WithFile(file).Build()) .Build()) .Build(); series.Library = new LibraryBuilder("Test LIb", LibraryType.Book).Build(); @@ -866,7 +866,7 @@ public class SeriesServiceTests : AbstractDbTest var file = new MangaFileBuilder("Test.cbz", MangaFormat.Archive, 1).Build(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithPages(1).WithFile(file).Build()) .WithChapter(new ChapterBuilder("2").WithPages(1).WithFile(file).Build()) .Build()) @@ -1183,7 +1183,7 @@ public class SeriesServiceTests : AbstractDbTest await ResetDb(); var lib1 = new LibraryBuilder("Test LIb") .WithSeries(new SeriesBuilder("Test Series") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithFile( new MangaFileBuilder($"{DataDirectory}1.zip", MangaFormat.Archive) .WithPages(1) @@ -1405,7 +1405,7 @@ public class SeriesServiceTests : AbstractDbTest { AgeRating = AgeRating.Everyone }) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("1").WithFile( new MangaFileBuilder($"{DataDirectory}1.zip", MangaFormat.Archive) .WithPages(1) diff --git a/API.Tests/Services/TachiyomiServiceTests.cs b/API.Tests/Services/TachiyomiServiceTests.cs index c94ff1c48..72b16773f 100644 --- a/API.Tests/Services/TachiyomiServiceTests.cs +++ b/API.Tests/Services/TachiyomiServiceTests.cs @@ -125,7 +125,7 @@ public class TachiyomiServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).Build()) .Build()) @@ -170,7 +170,7 @@ public class TachiyomiServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).Build()) .Build()) @@ -221,7 +221,7 @@ public class TachiyomiServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).Build()) .Build()) @@ -271,7 +271,7 @@ public class TachiyomiServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).Build()) .Build()) @@ -323,13 +323,16 @@ public class TachiyomiServiceTests var series = new SeriesBuilder("Test") .WithVolume(new VolumeBuilder("1") - .WithChapter(new ChapterBuilder("0").WithPages(199).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) + .WithPages(199).Build()) .Build()) .WithVolume(new VolumeBuilder("2") - .WithChapter(new ChapterBuilder("0").WithPages(192).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) + .WithPages(192).Build()) .Build()) .WithVolume(new VolumeBuilder("3") - .WithChapter(new ChapterBuilder("0").WithPages(255).Build()) + .WithChapter(new ChapterBuilder(API.Services.Tasks.Scanner.Parser.Parser.DefaultChapter) + .WithPages(255).Build()) .Build()) .WithPages(646) .Build(); @@ -368,7 +371,7 @@ public class TachiyomiServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).Build()) .Build()) @@ -421,7 +424,7 @@ public class TachiyomiServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).Build()) .Build()) @@ -464,7 +467,7 @@ public class TachiyomiServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).Build()) .Build()) @@ -514,7 +517,7 @@ public class TachiyomiServiceTests await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).Build()) .Build()) @@ -562,7 +565,7 @@ public class TachiyomiServiceTests { await ResetDb(); var series = new SeriesBuilder("Test") - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(new ChapterBuilder("95").WithPages(1).Build()) .WithChapter(new ChapterBuilder("96").WithPages(1).Build()) .Build()) diff --git a/API.Tests/Services/WordCountAnalysisTests.cs b/API.Tests/Services/WordCountAnalysisTests.cs index 6d17f3834..4d86ea2d3 100644 --- a/API.Tests/Services/WordCountAnalysisTests.cs +++ b/API.Tests/Services/WordCountAnalysisTests.cs @@ -64,7 +64,7 @@ public class WordCountAnalysisTests : AbstractDbTest series.Volumes = new List() { - new VolumeBuilder("0") + new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(chapter) .Build(), }; @@ -111,7 +111,7 @@ public class WordCountAnalysisTests : AbstractDbTest .Build(); var series = new SeriesBuilder("Test Series") .WithFormat(MangaFormat.Epub) - .WithVolume(new VolumeBuilder("0") + .WithVolume(new VolumeBuilder(API.Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume) .WithChapter(chapter) .Build()) .Build(); diff --git a/API/Comparators/ChapterSortComparer.cs b/API/Comparators/ChapterSortComparer.cs index beac530fb..e4f5dad8b 100644 --- a/API/Comparators/ChapterSortComparer.cs +++ b/API/Comparators/ChapterSortComparer.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using API.Services.Tasks.Scanner.Parser; namespace API.Comparators; @@ -17,11 +18,11 @@ public class ChapterSortComparer : IComparer /// public int Compare(double x, double y) { - if (x == 0.0 && y == 0.0) return 0; + if (x == Parser.DefaultChapterNumber && y == Parser.DefaultChapterNumber) return 0; // if x is 0, it comes second - if (x == 0.0) return 1; + if (x == Parser.DefaultChapterNumber) return 1; // if y is 0, it comes second - if (y == 0.0) return -1; + if (y == Parser.DefaultChapterNumber) return -1; return x.CompareTo(y); } @@ -40,11 +41,11 @@ public class ChapterSortComparerZeroFirst : IComparer { public int Compare(double x, double y) { - if (x == 0.0 && y == 0.0) return 0; + if (x == Parser.DefaultChapterNumber && y == Parser.DefaultChapterNumber) return 0; // if x is 0, it comes first - if (x == 0.0) return -1; + if (x == Parser.DefaultChapterNumber) return -1; // if y is 0, it comes first - if (y == 0.0) return 1; + if (y == Parser.DefaultChapterNumber) return 1; return x.CompareTo(y); } @@ -56,11 +57,11 @@ public class SortComparerZeroLast : IComparer { public int Compare(double x, double y) { - if (x == 0.0 && y == 0.0) return 0; + if (x == Parser.DefaultChapterNumber && y == Parser.DefaultChapterNumber) return 0; // if x is 0, it comes last - if (x == 0.0) return 1; + if (x == Parser.DefaultChapterNumber) return 1; // if y is 0, it comes last - if (y == 0.0) return -1; + if (y == Parser.DefaultChapterNumber) return -1; return x.CompareTo(y); } diff --git a/API/Controllers/OPDSController.cs b/API/Controllers/OPDSController.cs index 2482ef714..3363c1b14 100644 --- a/API/Controllers/OPDSController.cs +++ b/API/Controllers/OPDSController.cs @@ -19,6 +19,7 @@ using API.Entities.Enums; using API.Extensions; using API.Helpers; using API.Services; +using API.Services.Tasks.Scanner.Parser; using Kavita.Common; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -1104,12 +1105,12 @@ public class OpdsController : BaseApiController { var volumeLabel = await _localizationService.Translate(userId, "volume-num", string.Empty); SeriesService.RenameVolumeName(volume.Chapters.First(), volume, libraryType, volumeLabel); - if (volume.Name != "0") + if (volume.Name != Services.Tasks.Scanner.Parser.Parser.DefaultChapter) { title += $" - {volume.Name}"; } } - else if (volume.MinNumber != 0) + else if (!volume.IsLooseLeaf()) { title = $"{series.Name} - Volume {volume.Name} - {await _seriesService.FormatChapterTitle(userId, chapter, libraryType)}"; } diff --git a/API/Controllers/ReaderController.cs b/API/Controllers/ReaderController.cs index 89078487d..dd2ec1575 100644 --- a/API/Controllers/ReaderController.cs +++ b/API/Controllers/ReaderController.cs @@ -263,10 +263,10 @@ public class ReaderController : BaseApiController info.Title += " - " + info.ChapterTitle; } - if (info.IsSpecial && dto.VolumeNumber.Equals(Services.Tasks.Scanner.Parser.Parser.DefaultVolume)) + if (info.IsSpecial && dto.VolumeNumber.Equals(Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)) { info.Subtitle = info.FileName; - } else if (!info.IsSpecial && info.VolumeNumber.Equals(Services.Tasks.Scanner.Parser.Parser.DefaultVolume)) + } else if (!info.IsSpecial && info.VolumeNumber.Equals(Services.Tasks.Scanner.Parser.Parser.LooseLeafVolume)) { info.Subtitle = ReaderService.FormatChapterName(info.LibraryType, true, true) + info.ChapterNumber; } diff --git a/API/DTOs/Settings/ServerSettingDTO.cs b/API/DTOs/Settings/ServerSettingDTO.cs index 077ffbaac..fd1cb3b65 100644 --- a/API/DTOs/Settings/ServerSettingDTO.cs +++ b/API/DTOs/Settings/ServerSettingDTO.cs @@ -96,7 +96,7 @@ public class ServerSettingDto public bool IsEmailSetup() { return !string.IsNullOrEmpty(SmtpConfig.Host) - && !string.IsNullOrEmpty(SmtpConfig.UserName) + && !string.IsNullOrEmpty(SmtpConfig.SenderAddress) && !string.IsNullOrEmpty(HostName); } @@ -107,6 +107,6 @@ public class ServerSettingDto public bool IsEmailSetupForSendToDevice() { return !string.IsNullOrEmpty(SmtpConfig.Host) - && !string.IsNullOrEmpty(SmtpConfig.UserName); + && !string.IsNullOrEmpty(SmtpConfig.SenderAddress); } } diff --git a/API/DTOs/VolumeDto.cs b/API/DTOs/VolumeDto.cs index 4820f4d95..7e94b5733 100644 --- a/API/DTOs/VolumeDto.cs +++ b/API/DTOs/VolumeDto.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using API.Entities; using API.Entities.Interfaces; +using API.Services.Tasks.Scanner.Parser; namespace API.DTOs; @@ -42,4 +43,13 @@ public class VolumeDto : IHasReadTimeEstimate public int MaxHoursToRead { get; set; } /// public int AvgHoursToRead { get; set; } + + /// + /// Is this a loose leaf volume + /// + /// + public bool IsLooseLeaf() + { + return Math.Abs(this.MinNumber - Parser.LooseLeafVolumeNumber) < 0.001f; + } } diff --git a/API/Data/Repositories/VolumeRepository.cs b/API/Data/Repositories/VolumeRepository.cs index 53a45a946..00dd01c2c 100644 --- a/API/Data/Repositories/VolumeRepository.cs +++ b/API/Data/Repositories/VolumeRepository.cs @@ -215,7 +215,7 @@ public class VolumeRepository : IVolumeRepository private static void SortSpecialChapters(IEnumerable volumes) { - foreach (var v in volumes.Where(vDto => vDto.MinNumber == 0)) + foreach (var v in volumes.WhereLooseLeaf()) { v.Chapters = v.Chapters.OrderByNatural(x => x.Range).ToList(); } diff --git a/API/Entities/Chapter.cs b/API/Entities/Chapter.cs index ffb88cafb..1361cbae3 100644 --- a/API/Entities/Chapter.cs +++ b/API/Entities/Chapter.cs @@ -129,7 +129,7 @@ public class Chapter : IEntityDate, IHasReadTimeEstimate IsSpecial = info.IsSpecialInfo(); if (IsSpecial) { - Number = "0"; + Number = Parser.DefaultChapter; } Title = (IsSpecial && info.Format == MangaFormat.Epub) ? info.Title diff --git a/API/Extensions/SeriesExtensions.cs b/API/Extensions/SeriesExtensions.cs index 5db96a30c..9d6d0f63f 100644 --- a/API/Extensions/SeriesExtensions.cs +++ b/API/Extensions/SeriesExtensions.cs @@ -34,16 +34,16 @@ public static class SeriesExtensions } // just volumes - if (volumes.TrueForAll(v => $"{v.MinNumber}" != Parser.DefaultVolume)) + if (volumes.TrueForAll(v => $"{v.MinNumber}" != Parser.LooseLeafVolume)) { return firstVolume.CoverImage; } // If we have loose leaf chapters // if loose leaf chapters AND volumes, just return first volume - if (volumes.Count >= 1 && $"{volumes[0].MinNumber}" != Parser.DefaultVolume) + if (volumes.Count >= 1 && $"{volumes[0].MinNumber}" != Parser.LooseLeafVolume) { - var looseLeafChapters = volumes.Where(v => $"{v.MinNumber}" == Parser.DefaultVolume) + var looseLeafChapters = volumes.Where(v => $"{v.MinNumber}" == Parser.LooseLeafVolume) .SelectMany(c => c.Chapters.Where(c => !c.IsSpecial)) .OrderBy(c => c.Number.AsDouble(), ChapterSortComparerZeroFirst.Default) .ToList(); @@ -55,7 +55,7 @@ public static class SeriesExtensions } var firstLooseLeafChapter = volumes - .Where(v => $"{v.MinNumber}" == Parser.DefaultVolume) + .Where(v => $"{v.MinNumber}" == Parser.LooseLeafVolume) .SelectMany(v => v.Chapters) .OrderBy(c => c.Number.AsDouble(), ChapterSortComparerZeroFirst.Default) .FirstOrDefault(c => !c.IsSpecial); diff --git a/API/Extensions/VolumeListExtensions.cs b/API/Extensions/VolumeListExtensions.cs index f1ef051b1..c37a68364 100644 --- a/API/Extensions/VolumeListExtensions.cs +++ b/API/Extensions/VolumeListExtensions.cs @@ -1,6 +1,9 @@ using System; +using System.Collections; using System.Collections.Generic; +using System.Collections.Immutable; using System.Linq; +using API.DTOs; using API.Entities; using API.Entities.Enums; using API.Services.Tasks.Scanner.Parser; @@ -26,13 +29,52 @@ public static class VolumeListExtensions return volumes.MinBy(x => x.MinNumber); } - - if (volumes.Any(x => x.MinNumber != 0f)) // TODO: Refactor this so we can avoid a magic number + if (volumes.HasAnyNonLooseLeafVolumes()) { - return volumes.OrderBy(x => x.MinNumber).FirstOrDefault(x => x.MinNumber != 0); + return volumes.FirstNonLooseLeafOrDefault(); } // We only have 1 volume of chapters, we need to be cautious if there are specials, as we don't want to order them first return volumes.MinBy(x => x.MinNumber); } + + /// + /// If the collection of volumes has any non-loose leaf volumes + /// + /// + /// + public static bool HasAnyNonLooseLeafVolumes(this IEnumerable volumes) + { + return volumes.Any(x => Math.Abs(x.MinNumber - Parser.DefaultChapterNumber) > 0.001f); + } + + /// + /// Returns first non-loose leaf volume + /// + /// + /// + public static Volume? FirstNonLooseLeafOrDefault(this IEnumerable volumes) + { + return volumes.OrderBy(x => x.MinNumber).FirstOrDefault(v => Math.Abs(v.MinNumber - Parser.DefaultChapterNumber) >= 0.001f); + } + + /// + /// Returns the first (and only) loose leaf volume or null if none + /// + /// + /// + public static Volume? GetLooseLeafVolumeOrDefault(this IEnumerable volumes) + { + return volumes.FirstOrDefault(v => Math.Abs(v.MinNumber - Parser.DefaultChapterNumber) < 0.001f); + } + + public static IEnumerable WhereNotLooseLeaf(this IEnumerable volumes) + { + return volumes.Where(v => Math.Abs(v.MinNumber - Parser.DefaultChapterNumber) >= 0.001f); + } + + public static IEnumerable WhereLooseLeaf(this IEnumerable volumes) + { + return volumes.Where(v => Math.Abs(v.MinNumber - Parser.DefaultChapterNumber) < 0.001f); + } } diff --git a/API/Services/BookService.cs b/API/Services/BookService.cs index 19dedde5c..9d50b1fe9 100644 --- a/API/Services/BookService.cs +++ b/API/Services/BookService.cs @@ -551,7 +551,7 @@ public class BookService : IBookService } // If this is a single book and not a collection, set publication status to Completed - if (string.IsNullOrEmpty(info.Volume) && Parser.ParseVolume(filePath).Equals(Parser.DefaultVolume)) + if (string.IsNullOrEmpty(info.Volume) && Parser.ParseVolume(filePath).Equals(Parser.LooseLeafVolume)) { info.Count = 1; } @@ -561,7 +561,7 @@ public class BookService : IBookService epubBook.Schema.Package.Metadata.Creators.Select(c => Parser.CleanAuthor(c.Creator))); var hasVolumeInSeries = !Parser.ParseVolume(info.Title) - .Equals(Parser.DefaultVolume); + .Equals(Parser.LooseLeafVolume); if (string.IsNullOrEmpty(info.Volume) && hasVolumeInSeries && (!info.Series.Equals(info.Title) || string.IsNullOrEmpty(info.Series))) { @@ -873,7 +873,7 @@ public class BookService : IBookService FullFilePath = filePath, IsSpecial = false, Series = epubBook.Title.Trim(), - Volumes = Parser.DefaultVolume, + Volumes = Parser.LooseLeafVolume, }; } catch (Exception ex) diff --git a/API/Services/Plus/ScrobblingService.cs b/API/Services/Plus/ScrobblingService.cs index 93d75c246..5342d5432 100644 --- a/API/Services/Plus/ScrobblingService.cs +++ b/API/Services/Plus/ScrobblingService.cs @@ -274,7 +274,7 @@ public class ScrobblingService : IScrobblingService SeriesId = series.Id, LibraryId = series.LibraryId, ScrobbleEventType = ScrobbleEventType.ScoreUpdated, - AniListId = ExtractId(series.Metadata.WebLinks, AniListWeblinkWebsite), + AniListId = ExtractId(series.Metadata.WebLinks, AniListWeblinkWebsite), // TODO: We can get this also from ExternalSeriesMetadata MalId = ExtractId(series.Metadata.WebLinks, MalWeblinkWebsite), AppUserId = userId, Format = LibraryTypeHelper.GetFormat(series.Library.Type), diff --git a/API/Services/ReaderService.cs b/API/Services/ReaderService.cs index 19548e0a6..9f4c226bf 100644 --- a/API/Services/ReaderService.cs +++ b/API/Services/ReaderService.cs @@ -146,9 +146,8 @@ public class ReaderService : IReaderService MessageFactory.UserProgressUpdateEvent(user.Id, user.UserName!, seriesId, chapter.VolumeId, chapter.Id, chapter.Pages)); // Send out volume events for each distinct volume - if (!seenVolume.ContainsKey(chapter.VolumeId)) + if (seenVolume.TryAdd(chapter.VolumeId, true)) { - seenVolume[chapter.VolumeId] = true; await _eventHub.SendMessageAsync(MessageFactory.UserProgressUpdate, MessageFactory.UserProgressUpdateEvent(user.Id, user.UserName!, seriesId, chapter.VolumeId, 0, chapters.Where(c => c.VolumeId == chapter.VolumeId).Sum(c => c.Pages))); @@ -365,7 +364,7 @@ public class ReaderService : IReaderService var currentVolume = volumes.Single(v => v.Id == volumeId); var currentChapter = currentVolume.Chapters.Single(c => c.Id == currentChapterId); - if (currentVolume.MinNumber == 0) + if (currentVolume.IsLooseLeaf()) { // Handle specials by sorting on their Filename aka Range var chapterId = GetNextChapterId(currentVolume.Chapters.OrderByNatural(x => x.Range), currentChapter.Range, dto => dto.Range); @@ -416,12 +415,12 @@ public class ReaderService : IReaderService if (chapterId > 0) return chapterId; } else if (firstChapter.Number.AsDouble() >= currentChapter.Number.AsDouble()) return firstChapter.Id; // If we are the last chapter and next volume is there, we should try to use it (unless it's volume 0) - else if (firstChapter.Number.AsDouble() == 0) return firstChapter.Id; + else if (firstChapter.Number.AsDouble() == Parser.DefaultChapterNumber) return firstChapter.Id; // If on last volume AND there are no specials left, then let's return -1 - var anySpecials = volumes.Where(v => $"{v.MinNumber}" == Parser.DefaultVolume) + var anySpecials = volumes.Where(v => $"{v.MinNumber}" == Parser.LooseLeafVolume) .SelectMany(v => v.Chapters.Where(c => c.IsSpecial)).Any(); - if (currentVolume.MinNumber != 0 && !anySpecials) + if (!currentVolume.IsLooseLeaf() && !anySpecials) { return -1; } @@ -433,10 +432,10 @@ public class ReaderService : IReaderService // This has an added problem that it will loop up to the beginning always // Should I change this to Max number? volumes.LastOrDefault()?.Number -> volumes.Max(v => v.Number) - if (currentVolume.MinNumber != 0 && currentVolume.MinNumber == volumes.LastOrDefault()?.MinNumber && volumes.Count > 1) + if (!currentVolume.IsLooseLeaf() && currentVolume.MinNumber == volumes.LastOrDefault()?.MinNumber && volumes.Count > 1) { var chapterVolume = volumes.FirstOrDefault(); - if (chapterVolume?.MinNumber != 0) return -1; + if (chapterVolume == null || !chapterVolume.IsLooseLeaf()) return -1; // This is my attempt at fixing a bug where we loop around to the beginning, but I just can't seem to figure it out // var orderedVolumes = volumes.OrderBy(v => v.Number, SortComparerZeroLast.Default).ToList(); @@ -478,7 +477,7 @@ public class ReaderService : IReaderService var currentVolume = volumes.Single(v => v.Id == volumeId); var currentChapter = currentVolume.Chapters.Single(c => c.Id == currentChapterId); - if (currentVolume.MinNumber == 0) + if (currentVolume.IsLooseLeaf()) { var chapterId = GetNextChapterId(currentVolume.Chapters.OrderByNatural(x => x.Range).Reverse(), currentChapter.Range, dto => dto.Range); @@ -498,7 +497,7 @@ public class ReaderService : IReaderService } if (next) { - if (currentVolume.MinNumber - 1 == 0) break; // If we have walked all the way to chapter volume, then we should break so logic outside can work + if (currentVolume.MinNumber - 1 == Parser.LooseLeafVolumeNumber) break; // If we have walked all the way to chapter volume, then we should break so logic outside can work var lastChapter = volume.Chapters.MaxBy(x => x.Number.AsDouble(), _chapterSortComparerForInChapterSorting); if (lastChapter == null) return -1; return lastChapter.Id; @@ -506,7 +505,7 @@ public class ReaderService : IReaderService } var lastVolume = volumes.MaxBy(v => v.MinNumber); - if (currentVolume.MinNumber == 0 && currentVolume.MinNumber != lastVolume?.MinNumber && lastVolume?.Chapters.Count > 1) + if (currentVolume.IsLooseLeaf() && currentVolume.MinNumber != lastVolume?.MinNumber && lastVolume?.Chapters.Count > 1) { var lastChapter = lastVolume.Chapters.MaxBy(x => x.Number.AsDouble(), _chapterSortComparerForInChapterSorting); if (lastChapter == null) return -1; @@ -553,7 +552,7 @@ public class ReaderService : IReaderService // Loop through all chapters that are not in volume 0 var volumeChapters = volumes - .Where(v => v.MinNumber != 0) + .WhereNotLooseLeaf() .SelectMany(v => v.Chapters) .ToList(); diff --git a/API/Services/ReadingItemService.cs b/API/Services/ReadingItemService.cs index 86deed393..129a3ad4a 100644 --- a/API/Services/ReadingItemService.cs +++ b/API/Services/ReadingItemService.cs @@ -69,12 +69,12 @@ public class ReadingItemService : IReadingItemService // This catches when original library type is Manga/Comic and when parsing with non - if (Parser.IsEpub(path) && Parser.ParseVolume(info.Series) != Parser.DefaultVolume) // Shouldn't this be info.Volume != DefaultVolume? + if (Parser.IsEpub(path) && Parser.ParseVolume(info.Series) != Parser.LooseLeafVolume) // Shouldn't this be info.Volume != DefaultVolume? { var hasVolumeInTitle = !Parser.ParseVolume(info.Title) - .Equals(Parser.DefaultVolume); + .Equals(Parser.LooseLeafVolume); var hasVolumeInSeries = !Parser.ParseVolume(info.Series) - .Equals(Parser.DefaultVolume); + .Equals(Parser.LooseLeafVolume); if (string.IsNullOrEmpty(info.ComicInfo?.Volume) && hasVolumeInTitle && (hasVolumeInSeries || string.IsNullOrEmpty(info.Series))) { @@ -117,7 +117,7 @@ public class ReadingItemService : IReadingItemService { info.IsSpecial = true; info.Chapters = Parser.DefaultChapter; - info.Volumes = Parser.DefaultVolume; + info.Volumes = Parser.LooseLeafVolume; } if (!string.IsNullOrEmpty(info.ComicInfo.SeriesSort)) diff --git a/API/Services/ReadingListService.cs b/API/Services/ReadingListService.cs index 4f12f9df1..4b8899fcf 100644 --- a/API/Services/ReadingListService.cs +++ b/API/Services/ReadingListService.cs @@ -71,7 +71,7 @@ public class ReadingListService : IReadingListService public static string FormatTitle(ReadingListItemDto item) { var title = string.Empty; - if (item.ChapterNumber == Parser.DefaultChapter && item.VolumeNumber != Parser.DefaultVolume) { + if (item.ChapterNumber == Parser.DefaultChapter && item.VolumeNumber != Parser.LooseLeafVolume) { title = $"Volume {item.VolumeNumber}"; } @@ -631,9 +631,9 @@ public class ReadingListService : IReadingListService } // Prioritize lookup by Volume then Chapter, but allow fallback to just Chapter var bookVolume = string.IsNullOrEmpty(book.Volume) - ? Parser.DefaultVolume + ? Parser.LooseLeafVolume : book.Volume; - var matchingVolume = bookSeries.Volumes.Find(v => bookVolume == v.Name) ?? bookSeries.Volumes.Find(v => v.MinNumber == 0); + var matchingVolume = bookSeries.Volumes.Find(v => bookVolume == v.Name) ?? bookSeries.Volumes.GetLooseLeafVolumeOrDefault(); if (matchingVolume == null) { importSummary.Results.Add(new CblBookResult(book) diff --git a/API/Services/SeriesService.cs b/API/Services/SeriesService.cs index b7556655f..461f807d9 100644 --- a/API/Services/SeriesService.cs +++ b/API/Services/SeriesService.cs @@ -81,10 +81,9 @@ public class SeriesService : ISeriesService public static Chapter? GetFirstChapterForMetadata(Series series) { var sortedVolumes = series.Volumes - .Where(v => float.TryParse(v.Name, CultureInfo.InvariantCulture, out var parsedValue) && parsedValue != 0.0f) + .Where(v => float.TryParse(v.Name, CultureInfo.InvariantCulture, out var parsedValue) && parsedValue != Parser.LooseLeafVolumeNumber) .OrderBy(v => float.TryParse(v.Name, CultureInfo.InvariantCulture, out var parsedValue) ? parsedValue : float.MaxValue); - var minVolumeNumber = sortedVolumes - .MinBy(v => v.Name.AsFloat()); + var minVolumeNumber = sortedVolumes.MinBy(v => v.MinNumber); var allChapters = series.Volumes @@ -94,7 +93,7 @@ public class SeriesService : ISeriesService .FirstOrDefault(); if (minVolumeNumber != null && minChapter != null && float.TryParse(minChapter.Number, CultureInfo.InvariantCulture, out var chapNum) && - (chapNum >= minVolumeNumber.MinNumber || chapNum == 0)) + (chapNum >= minVolumeNumber.MinNumber || chapNum == Parser.DefaultChapterNumber)) { return minVolumeNumber.Chapters.MinBy(c => c.Number.AsFloat(), ChapterSortComparer.Default); } @@ -516,7 +515,7 @@ public class SeriesService : ISeriesService var specials = new List(); var chapters = volumes.SelectMany(v => v.Chapters.Select(c => { - if (v.MinNumber == 0) return c; + if (v.IsLooseLeaf()) return c; c.VolumeTitle = v.Name; return c; }).OrderBy(c => c.Number.AsFloat(), ChapterSortComparer.Default)).ToList(); @@ -542,7 +541,7 @@ public class SeriesService : ISeriesService } var storylineChapters = volumes - .Where(v => v.MinNumber == 0) + .WhereLooseLeaf() .SelectMany(v => v.Chapters.Where(c => !c.IsSpecial)) .OrderBy(c => c.Number.AsFloat(), ChapterSortComparer.Default) .ToList(); @@ -575,16 +574,17 @@ public class SeriesService : ISeriesService public static void RenameVolumeName(ChapterDto firstChapter, VolumeDto volume, LibraryType libraryType, string volumeLabel = "Volume") { + // TODO: Move this into DB if (libraryType is LibraryType.Book or LibraryType.LightNovel) { if (string.IsNullOrEmpty(firstChapter.TitleName)) { - if (firstChapter.Range.Equals(Parser.DefaultVolume)) return; + if (firstChapter.Range.Equals(Parser.LooseLeafVolume)) return; var title = Path.GetFileNameWithoutExtension(firstChapter.Range); if (string.IsNullOrEmpty(title)) return; volume.Name += $" - {title}"; } - else if (volume.Name != "0") + else if (volume.Name != Parser.LooseLeafVolume) { // If the titleName has Volume inside it, let's just send that back? volume.Name += $" - {firstChapter.TitleName}"; diff --git a/API/Services/StatisticService.cs b/API/Services/StatisticService.cs index 6e39e76a3..d3a26269a 100644 --- a/API/Services/StatisticService.cs +++ b/API/Services/StatisticService.cs @@ -9,6 +9,7 @@ using API.Entities; using API.Entities.Enums; using API.Extensions; using API.Extensions.QueryExtensions; +using API.Services.Tasks.Scanner.Parser; using AutoMapper; using AutoMapper.QueryableExtensions; using Microsoft.EntityFrameworkCore; @@ -269,7 +270,6 @@ public class StatisticService : IStatisticService var distinctPeople = _context.Person - .AsSplitQuery() .AsEnumerable() .GroupBy(sm => sm.NormalizedName) .Select(sm => sm.Key) @@ -287,7 +287,7 @@ public class StatisticService : IStatisticService TotalPeople = distinctPeople, TotalSize = await _context.MangaFile.SumAsync(m => m.Bytes), TotalTags = await _context.Tag.CountAsync(), - VolumeCount = await _context.Volume.Where(v => v.MinNumber != 0).CountAsync(), + VolumeCount = await _context.Volume.Where(v => Math.Abs(v.MinNumber - Parser.LooseLeafVolumeNumber) > 0.001f).CountAsync(), MostActiveUsers = mostActiveUsers, MostActiveLibraries = mostActiveLibrary, MostPopularSeries = mostPopularSeries, diff --git a/API/Services/TachiyomiService.cs b/API/Services/TachiyomiService.cs index 68d4bb5ac..27ee7ad10 100644 --- a/API/Services/TachiyomiService.cs +++ b/API/Services/TachiyomiService.cs @@ -69,14 +69,14 @@ public class TachiyomiService : ITachiyomiService // Else return the max chapter to Tachiyomi so it can consider everything read var volumes = (await _unitOfWork.VolumeRepository.GetVolumes(seriesId)).ToImmutableList(); - var looseLeafChapterVolume = volumes.Find(v => v.MinNumber == 0); + var looseLeafChapterVolume = volumes.GetLooseLeafVolumeOrDefault(); if (looseLeafChapterVolume == null) { var volumeChapter = _mapper.Map(volumes [^1].Chapters .OrderBy(c => c.Number.AsFloat(), ChapterSortComparerZeroFirst.Default) .Last()); - if (volumeChapter.Number == Parser.DefaultVolume) + if (volumeChapter.Number == Parser.LooseLeafVolume) { var volume = volumes.First(v => v.Id == volumeChapter.VolumeId); return new ChapterDto() @@ -104,7 +104,7 @@ public class TachiyomiService : ITachiyomiService var volumeWithProgress = await _unitOfWork.VolumeRepository.GetVolumeDtoAsync(prevChapter.VolumeId, userId); // We only encode for single-file volumes - if (volumeWithProgress!.MinNumber != 0 && volumeWithProgress.Chapters.Count == 1) + if (!volumeWithProgress!.IsLooseLeaf() && volumeWithProgress.Chapters.Count == 1) { // The progress is on a volume, encode it as a fake chapterDTO return new ChapterDto() diff --git a/API/Services/Tasks/Scanner/Parser/DefaultParser.cs b/API/Services/Tasks/Scanner/Parser/DefaultParser.cs index c0b1b55c9..b77ff8f4c 100644 --- a/API/Services/Tasks/Scanner/Parser/DefaultParser.cs +++ b/API/Services/Tasks/Scanner/Parser/DefaultParser.cs @@ -86,7 +86,7 @@ public class DefaultParser : IDefaultParser var isSpecial = type == LibraryType.Comic ? Parser.IsComicSpecial(fileName) : Parser.IsMangaSpecial(fileName); // We must ensure that we can only parse a special out. As some files will have v20 c171-180+Omake and that // could cause a problem as Omake is a special term, but there is valid volume/chapter information. - if (ret.Chapters == Parser.DefaultChapter && ret.Volumes == Parser.DefaultVolume && isSpecial) + if (ret.Chapters == Parser.DefaultChapter && ret.Volumes == Parser.LooseLeafVolume && isSpecial) { ret.IsSpecial = true; ParseFromFallbackFolders(filePath, rootPath, type, ref ret); // NOTE: This can cause some complications, we should try to be a bit less aggressive to fallback to folder @@ -97,7 +97,7 @@ public class DefaultParser : IDefaultParser { ret.IsSpecial = true; ret.Chapters = Parser.DefaultChapter; - ret.Volumes = Parser.DefaultVolume; + ret.Volumes = Parser.LooseLeafVolume; ParseFromFallbackFolders(filePath, rootPath, type, ref ret); } @@ -118,7 +118,7 @@ public class DefaultParser : IDefaultParser private ParserInfo ParseImage(string filePath, string rootPath, ParserInfo ret) { - ret.Volumes = Parser.DefaultVolume; + ret.Volumes = Parser.LooseLeafVolume; ret.Chapters = Parser.DefaultChapter; var directoryName = _directoryService.FileSystem.DirectoryInfo.New(rootPath).Name; ret.Series = directoryName; @@ -134,7 +134,7 @@ public class DefaultParser : IDefaultParser { var parsedVolume = Parser.ParseVolume(ret.Filename); var parsedChapter = Parser.ParseChapter(ret.Filename); - if (IsEmptyOrDefault(ret.Volumes, string.Empty) && !parsedVolume.Equals(Parser.DefaultVolume)) + if (IsEmptyOrDefault(ret.Volumes, string.Empty) && !parsedVolume.Equals(Parser.LooseLeafVolume)) { ret.Volumes = parsedVolume; } @@ -157,7 +157,7 @@ public class DefaultParser : IDefaultParser private static bool IsEmptyOrDefault(string volumes, string chapters) { return (string.IsNullOrEmpty(chapters) || chapters == Parser.DefaultChapter) && - (string.IsNullOrEmpty(volumes) || volumes == Parser.DefaultVolume); + (string.IsNullOrEmpty(volumes) || volumes == Parser.LooseLeafVolume); } /// @@ -198,9 +198,9 @@ public class DefaultParser : IDefaultParser var parsedVolume = type is LibraryType.Manga ? Parser.ParseVolume(folder) : Parser.ParseComicVolume(folder); var parsedChapter = type is LibraryType.Manga ? Parser.ParseChapter(folder) : Parser.ParseComicChapter(folder); - if (!parsedVolume.Equals(Parser.DefaultVolume) || !parsedChapter.Equals(Parser.DefaultChapter)) + if (!parsedVolume.Equals(Parser.LooseLeafVolume) || !parsedChapter.Equals(Parser.DefaultChapter)) { - if ((string.IsNullOrEmpty(ret.Volumes) || ret.Volumes.Equals(Parser.DefaultVolume)) && !string.IsNullOrEmpty(parsedVolume) && !parsedVolume.Equals(Parser.DefaultVolume)) + if ((string.IsNullOrEmpty(ret.Volumes) || ret.Volumes.Equals(Parser.LooseLeafVolume)) && !string.IsNullOrEmpty(parsedVolume) && !parsedVolume.Equals(Parser.LooseLeafVolume)) { ret.Volumes = parsedVolume; } diff --git a/API/Services/Tasks/Scanner/Parser/Parser.cs b/API/Services/Tasks/Scanner/Parser/Parser.cs index a557e6458..739153571 100644 --- a/API/Services/Tasks/Scanner/Parser/Parser.cs +++ b/API/Services/Tasks/Scanner/Parser/Parser.cs @@ -11,8 +11,11 @@ namespace API.Services.Tasks.Scanner.Parser; public static class Parser { - public const string DefaultChapter = "0"; - public const string DefaultVolume = "0"; + // NOTE: If you change this, don't forget to change in the UI (see Series Detail) + public const string DefaultChapter = "0"; // -2147483648 + public const string LooseLeafVolume = "0"; + public const int DefaultChapterNumber = 0; + public const int LooseLeafVolumeNumber = 0; public static readonly TimeSpan RegexTimeout = TimeSpan.FromMilliseconds(500); public const string ImageFileExtensions = @"^(\.png|\.jpeg|\.jpg|\.webp|\.gif|\.avif)"; // Don't forget to update CoverChooser @@ -729,7 +732,7 @@ public static class Parser } } - return DefaultVolume; + return LooseLeafVolume; } public static string ParseComicVolume(string filename) @@ -747,7 +750,7 @@ public static class Parser } } - return DefaultVolume; + return LooseLeafVolume; } private static string FormatValue(string value, bool hasPart) diff --git a/API/Services/Tasks/Scanner/Parser/ParserInfo.cs b/API/Services/Tasks/Scanner/Parser/ParserInfo.cs index 8cd81cf6d..5a4003b4b 100644 --- a/API/Services/Tasks/Scanner/Parser/ParserInfo.cs +++ b/API/Services/Tasks/Scanner/Parser/ParserInfo.cs @@ -73,7 +73,7 @@ public class ParserInfo /// public bool IsSpecialInfo() { - return (IsSpecial || (Volumes == Parser.DefaultVolume && Chapters == Parser.DefaultChapter)); + return (IsSpecial || (Volumes == Parser.LooseLeafVolume && Chapters == Parser.DefaultChapter)); } /// @@ -91,7 +91,7 @@ public class ParserInfo { if (info2 == null) return; Chapters = string.IsNullOrEmpty(Chapters) || Chapters == Parser.DefaultChapter ? info2.Chapters: Chapters; - Volumes = string.IsNullOrEmpty(Volumes) || Volumes == Parser.DefaultVolume ? info2.Volumes : Volumes; + Volumes = string.IsNullOrEmpty(Volumes) || Volumes == Parser.LooseLeafVolume ? info2.Volumes : Volumes; Edition = string.IsNullOrEmpty(Edition) ? info2.Edition : Edition; Title = string.IsNullOrEmpty(Title) ? info2.Title : Title; Series = string.IsNullOrEmpty(Series) ? info2.Series : Series; diff --git a/API/Services/Tasks/Scanner/ProcessSeries.cs b/API/Services/Tasks/Scanner/ProcessSeries.cs index d82d075d8..540d4f84a 100644 --- a/API/Services/Tasks/Scanner/ProcessSeries.cs +++ b/API/Services/Tasks/Scanner/ProcessSeries.cs @@ -325,7 +325,7 @@ public class ProcessSeries : IProcessSeries { // If a series has a TotalCount of 1 (or no total count) and there is only a Special, mark it as Complete series.Metadata.MaxCount = series.Metadata.TotalCount; - } else if ((maxChapter == 0 || maxChapter > series.Metadata.TotalCount) && maxVolume <= series.Metadata.TotalCount) + } else if ((maxChapter == Parser.Parser.DefaultChapterNumber || maxChapter > series.Metadata.TotalCount) && maxVolume <= series.Metadata.TotalCount) { series.Metadata.MaxCount = maxVolume; } else if (maxVolume == series.Metadata.TotalCount) diff --git a/UI/Web/src/app/_models/chapter.ts b/UI/Web/src/app/_models/chapter.ts index f3010fb95..2e0bf481c 100644 --- a/UI/Web/src/app/_models/chapter.ts +++ b/UI/Web/src/app/_models/chapter.ts @@ -1,6 +1,8 @@ import { MangaFile } from './manga-file'; import { AgeRating } from './metadata/age-rating'; +export const LooseLeafOrSpecialNumber = 0; + /** * Chapter table object. This does not have metadata on it, use ChapterMetadata which is the same Chapter but with those fields. */ diff --git a/UI/Web/src/app/cards/entity-title/entity-title.component.html b/UI/Web/src/app/cards/entity-title/entity-title.component.html index 62730076c..3a35f3670 100644 --- a/UI/Web/src/app/cards/entity-title/entity-title.component.html +++ b/UI/Web/src/app/cards/entity-title/entity-title.component.html @@ -7,9 +7,9 @@ {{seriesName.length > 0 ? seriesName + ' - ' : ''}} - {{Number !== 0 ? (isChapter && includeVolume ? volumeTitle : '') : ''}} + {{Number !== LooseLeafOrSpecialNumber ? (isChapter && includeVolume ? volumeTitle : '') : ''}} - {{Number !== 0 ? (isChapter ? t('issue-num') + Number : volumeTitle) : t('special')}} + {{Number !== LooseLeafOrSpecialNumber ? (isChapter ? t('issue-num') + Number : volumeTitle) : t('special')}} @@ -19,9 +19,9 @@ {{seriesName.length > 0 ? seriesName + ' - ' : ''}} - {{Number !== 0 ? (isChapter && includeVolume ? volumeTitle : '') : ''}} + {{Number !== LooseLeafOrSpecialNumber ? (isChapter && includeVolume ? volumeTitle : '') : ''}} - {{Number !== 0 ? (isChapter ? (t('chapter') + ' ') + Number : volumeTitle) : t('special')}} + {{Number !== LooseLeafOrSpecialNumber ? (isChapter ? (t('chapter') + ' ') + Number : volumeTitle) : t('special')}} diff --git a/UI/Web/src/app/cards/entity-title/entity-title.component.ts b/UI/Web/src/app/cards/entity-title/entity-title.component.ts index 564c5eaaa..56bfab3dd 100644 --- a/UI/Web/src/app/cards/entity-title/entity-title.component.ts +++ b/UI/Web/src/app/cards/entity-title/entity-title.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; import { UtilityService } from 'src/app/shared/_services/utility.service'; -import { Chapter } from 'src/app/_models/chapter'; +import { Chapter, LooseLeafOrSpecialNumber } from 'src/app/_models/chapter'; import { LibraryType } from 'src/app/_models/library/library'; import { Volume } from 'src/app/_models/volume'; import {CommonModule, NgSwitch} from "@angular/common"; @@ -20,6 +20,8 @@ import {TranslocoModule} from "@ngneat/transloco"; }) export class EntityTitleComponent implements OnInit { + protected readonly LooseLeafOrSpecialNumber = LooseLeafOrSpecialNumber; + /** * Library type for which the entity belongs */ diff --git a/UI/Web/src/app/series-detail/_components/series-detail/series-detail.component.html b/UI/Web/src/app/series-detail/_components/series-detail/series-detail.component.html index b8caa93fe..d9eb93dca 100644 --- a/UI/Web/src/app/series-detail/_components/series-detail/series-detail.component.html +++ b/UI/Web/src/app/series-detail/_components/series-detail/series-detail.component.html @@ -308,7 +308,7 @@ - @@ -335,7 +335,7 @@ - diff --git a/UI/Web/src/app/series-detail/_components/series-detail/series-detail.component.ts b/UI/Web/src/app/series-detail/_components/series-detail/series-detail.component.ts index ca022e22a..9d6ed059f 100644 --- a/UI/Web/src/app/series-detail/_components/series-detail/series-detail.component.ts +++ b/UI/Web/src/app/series-detail/_components/series-detail/series-detail.component.ts @@ -67,6 +67,7 @@ import {RelationKind} from 'src/app/_models/series-detail/relation-kind'; import {SeriesMetadata} from 'src/app/_models/metadata/series-metadata'; import {User} from 'src/app/_models/user'; import {Volume} from 'src/app/_models/volume'; +import {LooseLeafOrSpecialNumber} from 'src/app/_models/chapter'; import {AccountService} from 'src/app/_services/account.service'; import {Action, ActionFactoryService, ActionItem} from 'src/app/_services/action-factory.service'; import {ActionService} from 'src/app/_services/action.service'; @@ -137,8 +138,6 @@ interface StoryLineItem { isChapter: boolean; } -const KavitaPlusSupportedLibraryTypes = [LibraryType.Manga, LibraryType.LightNovel]; - @Component({ selector: 'app-series-detail', templateUrl: './series-detail.component.html', @@ -185,6 +184,7 @@ export class SeriesDetailComponent implements OnInit, AfterContentChecked { protected readonly PageLayoutMode = PageLayoutMode; protected readonly TabID = TabID; protected readonly TagBadgeCursor = TagBadgeCursor; + protected readonly LooseLeafOrSpecialNumber = LooseLeafOrSpecialNumber; @ViewChild('scrollingBlock') scrollingBlock: ElementRef | undefined; @ViewChild('companionBar') companionBar: ElementRef | undefined; diff --git a/openapi.json b/openapi.json index 35b9b8ef0..2e58077f7 100644 --- a/openapi.json +++ b/openapi.json @@ -7,7 +7,7 @@ "name": "GPL-3.0", "url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE" }, - "version": "0.7.14.1" + "version": "0.7.14.2" }, "servers": [ {