diff --git a/Tranga-API/Program.cs b/Tranga-API/Program.cs index 77e04bb..7c713aa 100644 --- a/Tranga-API/Program.cs +++ b/Tranga-API/Program.cs @@ -119,36 +119,7 @@ app.MapPost("/Tasks/CreateDownloadChaptersTask", (string connectorName, string i if (publication is null) return; - Chapter[] availableChapters = connector.GetChapters((Publication)publication, language??"en");; - IEnumerable toDownload; - - if (chapters.Contains("vol", StringComparison.InvariantCultureIgnoreCase)) - { - if (chapters.Contains('-')) - { - string selectString = chapters.Split(' ').First(str => str.Contains('-')); - int start = Convert.ToInt32(selectString.Split('-')[0]); - int end = Convert.ToInt32(selectString.Split('-')[1]); - toDownload = availableChapters.Where(chapter => - Convert.ToInt32(chapter.volumeNumber) >= start && Convert.ToInt32(chapter.volumeNumber) <= end); - } - else - { - string selectString = chapters.Split(' ').First(str => !str.Contains("vol", StringComparison.InvariantCultureIgnoreCase)); - toDownload = availableChapters.Where(chapter => chapter.volumeNumber.Equals(selectString)); - } - } - else if (chapters.Contains('-')) - { - int start = Convert.ToInt32(chapters.Split('-')[0]); - int end = Convert.ToInt32(chapters.Split('-')[1]) + 1; - toDownload = availableChapters[start..end]; - } - else - { - toDownload = new[] { availableChapters[Convert.ToInt32(chapters)] }; - } - + IEnumerable toDownload = connector.SearchChapters((Publication)publication, chapters, language ?? "en"); foreach(Chapter chapter in toDownload) taskManager.AddTask(new DownloadChapterTask(TrangaTask.Task.DownloadChapter, connectorName, (Publication)publication, chapter, "en")); diff --git a/Tranga-CLI/Tranga_Cli.cs b/Tranga-CLI/Tranga_Cli.cs index 10729f9..f4da68d 100644 --- a/Tranga-CLI/Tranga_Cli.cs +++ b/Tranga-CLI/Tranga_Cli.cs @@ -499,22 +499,7 @@ public static class Tranga_Cli while(selectedChapters is null || selectedChapters.Length < 1) selectedChapters = Console.ReadLine(); - if (selectedChapters.Length == 1 && selectedChapters.ToLower() == "q") - { - Console.Clear(); - Console.WriteLine("aborted."); - logger.WriteLine("Tranga_CLI", "aborted."); - return Array.Empty(); - } - - if (selectedChapters.Contains('-')) - { - int start = Convert.ToInt32(selectedChapters.Split('-')[0]); - int end = Convert.ToInt32(selectedChapters.Split('-')[1]) + 1; - return availableChapters[start..end]; - } - else - return new Chapter[] { availableChapters[Convert.ToInt32(selectedChapters)] }; + return connector.SearchChapters(publication, selectedChapters); } private static Connector? SelectConnector(Connector[] connectors, Logger logger) diff --git a/Tranga/Connector.cs b/Tranga/Connector.cs index 3888cf3..49c8172 100644 --- a/Tranga/Connector.cs +++ b/Tranga/Connector.cs @@ -53,6 +53,72 @@ public abstract class Connector /// Language of the Chapters /// Array of Chapters matching Publication and Language public abstract Chapter[] GetChapters(Publication publication, string language = ""); + + public Chapter[] SearchChapters(Publication publication, string searchTerm, string? language = null) + { + Chapter[] availableChapters = this.GetChapters(publication, language??"en"); + Regex volumeRegex = new ("((v(ol)*(olume)*)+ *([0-9]+(-[0-9]+)?){1})", RegexOptions.IgnoreCase); + Regex chapterRegex = new ("((c(h)*(hapter)*)+ *([0-9]+(-[0-9]+)?){1})", RegexOptions.IgnoreCase); + Regex singleResultRegex = new("([0-9]+)", RegexOptions.IgnoreCase); + Regex rangeResultRegex = new("([0-9]+(-[0-9]+))", RegexOptions.IgnoreCase); + if (volumeRegex.IsMatch(searchTerm) && chapterRegex.IsMatch(searchTerm)) + { + string volume = singleResultRegex.Match(volumeRegex.Match(searchTerm).Value).Value; + string chapter = singleResultRegex.Match(chapterRegex.Match(searchTerm).Value).Value; + return availableChapters.Where(aCh => aCh.volumeNumber is not null && aCh.chapterNumber is not null && + aCh.volumeNumber.Equals(volume, StringComparison.InvariantCultureIgnoreCase) && + aCh.chapterNumber.Equals(chapter, StringComparison.InvariantCultureIgnoreCase)) + .ToArray(); + } + else if (volumeRegex.IsMatch(searchTerm)) + { + string volume = volumeRegex.Match(searchTerm).Value; + if (rangeResultRegex.IsMatch(volume)) + { + string range = rangeResultRegex.Match(volume).Value; + int start = Convert.ToInt32(range.Split('-')[0]); + int end = Convert.ToInt32(range.Split('-')[1]); + return availableChapters.Where(aCh => aCh.volumeNumber is not null && + Convert.ToInt32(aCh.volumeNumber) >= start && + Convert.ToInt32(aCh.volumeNumber) <= end).ToArray(); + } + else if(singleResultRegex.IsMatch(volume)) + return availableChapters.Where(aCh => + aCh.volumeNumber is not null && + aCh.volumeNumber.Equals(volume, StringComparison.InvariantCultureIgnoreCase)).ToArray(); + + } + else if (chapterRegex.IsMatch(searchTerm)) + { + string chapter = volumeRegex.Match(searchTerm).Value; + if (rangeResultRegex.IsMatch(chapter)) + { + string range = rangeResultRegex.Match(chapter).Value; + int start = Convert.ToInt32(range.Split('-')[0]); + int end = Convert.ToInt32(range.Split('-')[1]); + return availableChapters.Where(aCh => aCh.chapterNumber is not null && + Convert.ToInt32(aCh.chapterNumber) >= start && + Convert.ToInt32(aCh.chapterNumber) <= end).ToArray(); + } + else if(singleResultRegex.IsMatch(chapter)) + return availableChapters.Where(aCh => + aCh.chapterNumber is not null && + aCh.chapterNumber.Equals(chapter, StringComparison.InvariantCultureIgnoreCase)).ToArray(); + } + else + { + if (rangeResultRegex.IsMatch(searchTerm)) + { + int start = Convert.ToInt32(searchTerm.Split('-')[0]); + int end = Convert.ToInt32(searchTerm.Split('-')[1]); + return availableChapters[start..(end + 1)]; + } + else if(singleResultRegex.IsMatch(searchTerm)) + return new [] { availableChapters[Convert.ToInt32(searchTerm)] }; + } + + return Array.Empty(); + } /// /// Retrieves the Chapter (+Images) from the website.