diff --git a/ComicNodes/Comics/CreateComicInfo.cs b/ComicNodes/Comics/CreateComicInfo.cs index c703d09c..85625273 100644 --- a/ComicNodes/Comics/CreateComicInfo.cs +++ b/ComicNodes/Comics/CreateComicInfo.cs @@ -59,7 +59,7 @@ public class CreateComicInfo : Node return 2; } - var info = GetInfo(args.Logger, args.LibraryFileName, Publisher); + var info = GetInfo(args.Logger, args.LibraryFileName, args.LibraryPath, Publisher); if (info.Failed(out error)) { args.FailureReason = error; @@ -102,9 +102,10 @@ public class CreateComicInfo : Node /// /// the logger to log with /// the library filename to use + /// the library path /// if there is a publisher folder /// the comic info - public static Result GetInfo(ILogger? logger, string libraryFile, bool publisher) + public static Result GetInfo(ILogger? logger, string libraryFile, string libraryPath, bool publisher) { // Publisher / Series (year?) / Title - #number (of #)- Issue Title.extension ComicInfo info = new(); @@ -115,10 +116,12 @@ public class CreateComicInfo : Node if (yearMatch.Success) { info.Volume = yearMatch.Groups["year"].Value; - info.Series = Regex.Replace(info.Series, @"\((19|20)\d{2}\)", "").Trim(); + // info.Series = Regex.Replace(info.Series, @"\((19|20)\d{2}\)", "").Trim(); } - info.Publisher = publisher ? FileHelper.GetDirectoryName(FileHelper.GetDirectory(libraryFile)) : null; + string relative = libraryFile[(libraryPath.Length + 1)..]; + + info.Publisher = publisher ? relative.Replace("\\", "/").Split('/').First() : null; string shortname = FileHelper.GetShortFileName(libraryFile); info.Tags = GetTags(ref shortname); shortname = shortname[..shortname.LastIndexOf('.')]; @@ -140,7 +143,15 @@ public class CreateComicInfo : Node } else { - logger?.WLog("Issue number not found in: " + parts[1]); + var volMatch = Regex.Match(parts[1], @"\b[Vv](?:olume|ol)?\s*(\d+)\b", RegexOptions.IgnoreCase); + if (volMatch.Success) + { + info.Volume = "Volume " + int.Parse(volMatch.Groups[1].Value); + } + else + { + logger?.WLog("Issue number not found in: " + parts[1]); + } } if (parts.Length > 2) diff --git a/ComicNodes/Tests/ComicInfoTests.cs b/ComicNodes/Tests/ComicInfoTests.cs index a1ffd025..91b123a2 100644 --- a/ComicNodes/Tests/ComicInfoTests.cs +++ b/ComicNodes/Tests/ComicInfoTests.cs @@ -12,7 +12,8 @@ public class ComicInfoTests : TestBase public void Basic() { var result = CreateComicInfo.GetInfo(Logger, - "/home/john/comics/DC/Batman (1939)/Batman - #1 - Batman vs. Joker [old] [great] [amazing].cbr", true); + "/home/john/Comics/DC/Batman (1939)/Batman - #1 - Batman vs. Joker [old] [great] [amazing].cbr", + "/home/john/Comics",true); TestContext.WriteLine(Logger.ToString()); @@ -20,7 +21,7 @@ public class ComicInfoTests : TestBase var info = result.Value; Assert.IsNotNull(info); Assert.AreEqual("DC", info.Publisher); - Assert.AreEqual("Batman", info.Series); + Assert.AreEqual("Batman (1939)", info.Series); Assert.AreEqual("1939", info.Volume); Assert.AreEqual("Batman vs. Joker", info.Title); Assert.AreEqual(3, info.Tags.Length); @@ -33,7 +34,55 @@ public class ComicInfoTests : TestBase TestContext.WriteLine(new string('-', 70)); TestContext.WriteLine(xml); } + + [TestMethod] + public void VolumeYear() + { + var result = CreateComicInfo.GetInfo(Logger, + "/home/john/Comics/actual/DC/He-Man and the Masters of the Universe/He-Man and the Masters of the Universe (2013)/He-Man and the Masters of the Universe - #001 - Desperate Times.cbr", + "/home/john/Comics/actual", + true); + TestContext.WriteLine(Logger.ToString()); + + Assert.IsFalse(result.IsFailed); + var info = result.Value; + Assert.IsNotNull(info); + Assert.AreEqual("DC", info.Publisher); + Assert.AreEqual("He-Man and the Masters of the Universe (2013)", info.Series); + Assert.AreEqual("2013", info.Volume); + Assert.AreEqual("Desperate Times", info.Title); + + var xml = CreateComicInfo.SerializeToXml(info); + Assert.IsFalse(string.IsNullOrWhiteSpace(xml)); + TestContext.WriteLine(new string('-', 70)); + TestContext.WriteLine(xml); + } + + [TestMethod] + public void Volume() + { + var result = CreateComicInfo.GetInfo(Logger, + "/home/john/Comics/Marvel/Ultimate Spider-Man (2000)/Ultimate Spider-Man - v05 - Public Scrutiny.cbz", + "/home/john/Comics", + true); + + TestContext.WriteLine(Logger.ToString()); + + Assert.IsFalse(result.IsFailed); + var info = result.Value; + Assert.IsNotNull(info); + Assert.AreEqual("Marvel", info.Publisher); + Assert.AreEqual("Ultimate Spider-Man (2000)", info.Series); + Assert.AreEqual("Volume 5", info.Volume); + Assert.AreEqual("Public Scrutiny", info.Title); + + var xml = CreateComicInfo.SerializeToXml(info); + Assert.IsFalse(string.IsNullOrWhiteSpace(xml)); + TestContext.WriteLine(new string('-', 70)); + TestContext.WriteLine(xml); + } + [TestMethod] public void PhysicalFileTest() { @@ -42,7 +91,8 @@ public class ComicInfoTests : TestBase var logger = new TestLogger(); var args = new NodeParameters(FILE, logger, false, string.Empty, new LocalFileService()) { - LibraryFileName = FILE + LibraryFileName = FILE, + LibraryPath = "/home/john/Comics" }; args.TempPath = TempPath;