using JSMR.Application.Common.Caching; using JSMR.Infrastructure.Common.Locales; using JSMR.Infrastructure.Common.SupportedLanguages; using JSMR.Infrastructure.Http; using System.Text.RegularExpressions; namespace JSMR.Infrastructure.Scanning; public partial class EnglishVoiceWorksScanner(IHtmlLoader loader, ISpamCircleCache spamCircleCache) : VoiceWorksScanner(loader, spamCircleCache) { [GeneratedRegex(@"Release: (.*?)[/](\d{2})[/](\d{4})", RegexOptions.IgnoreCase, "en-US")] private static partial Regex SalesDateRegex(); [GeneratedRegex(@"^(Early|Middle|Late)\s(.*?)\s(\d{4})", RegexOptions.IgnoreCase, "en-US")] private static partial Regex EstimatedDateRegex(); protected override ILocale Locale => new EnglishLocale(); protected override ISupportedLanguage[] SupportedLanguages => [ new JapaneseLanguage(), new EnglishLanguage(), new AlingualLanguage() ]; protected override DateTime? GetEstimatedReleaseDate(string expectedDate) { if (expectedDate.Contains("販売中") || expectedDate.Contains("発売予定未定")) return null; Regex textRegex = EstimatedDateRegex(); MatchCollection textMatches = textRegex.Matches(expectedDate); if (textMatches.Count == 0 || textMatches[0].Groups.Count < 4) return null; GroupCollection groups = textMatches[0].Groups; int releaseYear = Convert.ToInt32(groups[3].Value); int releaseMonth = 1; int releaseDay = 1; string releaseTime = groups[1].Value; string releaseMonthText = groups[2].Value; switch (releaseTime) { case "Early": releaseDay = 1; break; case "Middle": releaseDay = 11; break; case "Late": releaseDay = 21; break; } switch (releaseMonthText) { case "Jan.": releaseMonth = 1; break; case "Feb.": releaseMonth = 2; break; case "Mar.": releaseMonth = 3; break; case "Apr.": releaseMonth = 4; break; case "May.": releaseMonth = 5; break; case "Jun.": releaseMonth = 6; break; case "Jul.": releaseMonth = 7; break; case "Aug.": releaseMonth = 8; break; case "Sep.": releaseMonth = 9; break; case "Oct.": releaseMonth = 10; break; case "Nov.": releaseMonth = 11; break; case "Dec.": releaseMonth = 12; break; } return new DateTime(releaseYear, releaseMonth, releaseDay); } protected override DateTime? GetSalesDate(string salesDate) { Regex textRegex = SalesDateRegex(); MatchCollection textMatches = textRegex.Matches(salesDate); if (textMatches.Count == 0 || textMatches[0].Groups.Count < 4) return null; string month = textMatches[0].Groups[1].Value; int releaseMonth = -1; switch (month) { case "Jan": releaseMonth = 1; break; case "Feb": releaseMonth = 2; break; case "Mar": releaseMonth = 3; break; case "Apr": releaseMonth = 4; break; case "May": releaseMonth = 5; break; case "Jun": releaseMonth = 6; break; case "Jul": releaseMonth = 7; break; case "Aug": releaseMonth = 8; break; case "Sep": releaseMonth = 9; break; case "Oct": releaseMonth = 10; break; case "Nov": releaseMonth = 11; break; case "Dec": releaseMonth = 12; break; } if (releaseMonth == -1) return null; int releaseYear = Convert.ToInt32(textMatches[0].Groups[3].Value); int releaseDay = Convert.ToInt32(textMatches[0].Groups[2].Value); return new DateTime(releaseYear, releaseMonth, releaseDay); } }