private ParsedEpisodeInfo ParseSpecialEpisodeTitle(string releaseTitle, Series series) { // find special episode in series season 0 var episode = _episodeService.FindEpisodeByTitle(series.Id, 0, releaseTitle); if (episode != null) { // create parsed info from tv episode var info = new ParsedEpisodeInfo { ReleaseTitle = releaseTitle, SeriesTitle = series.Title, SeriesTitleInfo = new SeriesTitleInfo { Title = series.Title }, SeasonNumber = episode.SeasonNumber, EpisodeNumbers = new int[1] { episode.EpisodeNumber }, FullSeason = false, Quality = QualityParser.ParseQuality(releaseTitle), ReleaseGroup = Parser.ParseReleaseGroup(releaseTitle), Language = LanguageParser.ParseLanguage(releaseTitle), Special = true }; _logger.Debug("Found special episode {0} for title '{1}'", info, releaseTitle); return(info); } return(null); }
private ParsedEpisodeInfo ParseSpecialEpisodeTitle(string title, Series series) { // find special episode in series season 0 var episode = _episodeService.FindEpisodeByTitle(series.Id, 0, title); if (episode != null) { // create parsed info from tv episode var info = new ParsedEpisodeInfo(); info.SeriesTitle = series.Title; info.SeriesTitleInfo = new SeriesTitleInfo(); info.SeriesTitleInfo.Title = info.SeriesTitle; info.SeasonNumber = episode.SeasonNumber; info.EpisodeNumbers = new int[1] { episode.EpisodeNumber }; info.FullSeason = false; info.Quality = QualityParser.ParseQuality(title); info.ReleaseGroup = Parser.ParseReleaseGroup(title); info.Language = LanguageParser.ParseLanguage(title); info.Special = true; _logger.Debug("Found special episode {0} for title '{1}'", info, title); return(info); } return(null); }
private ParsedEpisodeInfo ParseSpecialEpisodeTitle(ParsedEpisodeInfo parsedEpisodeInfo, string releaseTitle, Series series) { // SxxE00 episodes are sometimes mapped via TheXEM, don't use episode title parsing in that case. if (parsedEpisodeInfo != null && parsedEpisodeInfo.IsPossibleSceneSeasonSpecial && series.UseSceneNumbering) { if (_episodeService.FindEpisodesBySceneNumbering(series.Id, parsedEpisodeInfo.SeasonNumber, 0).Any()) { return(parsedEpisodeInfo); } } // find special episode in series season 0 var episode = _episodeService.FindEpisodeByTitle(series.Id, 0, releaseTitle); if (episode != null) { // create parsed info from tv episode var info = new ParsedEpisodeInfo { ReleaseTitle = releaseTitle, SeriesTitle = series.Title, SeriesTitleInfo = new SeriesTitleInfo { Title = series.Title }, SeasonNumber = episode.SeasonNumber, EpisodeNumbers = new int[1] { episode.EpisodeNumber }, FullSeason = false, Quality = QualityParser.ParseQuality(releaseTitle), ReleaseGroup = Parser.ParseReleaseGroup(releaseTitle), Language = LanguageParser.ParseLanguage(releaseTitle), Special = true }; _logger.Debug("Found special episode {0} for title '{1}'", info, releaseTitle); return(info); } return(null); }
public static ParsedEpisodeInfo ParseTitle(string title) { try { if (!ValidateBeforeParsing(title)) { return(null); } Logger.Debug("Parsing string '{0}'", title); if (ReversedTitleRegex.IsMatch(title)) { var titleWithoutExtension = RemoveFileExtension(title).ToCharArray(); Array.Reverse(titleWithoutExtension); title = new string(titleWithoutExtension) + title.Substring(titleWithoutExtension.Length); Logger.Debug("Reversed name detected. Converted to '{0}'", title); } var releaseTitle = RemoveFileExtension(title); releaseTitle = releaseTitle.Replace("【", "[").Replace("】", "]"); foreach (var replace in PreSubstitutionRegex) { if (replace.TryReplace(ref releaseTitle)) { Logger.Debug("Substituted with " + releaseTitle); } } var simpleTitle = SimpleTitleRegex.Replace(releaseTitle); // TODO: Quick fix stripping [url] - prefixes. simpleTitle = WebsitePrefixRegex.Replace(simpleTitle); simpleTitle = CleanTorrentSuffixRegex.Replace(simpleTitle); simpleTitle = CleanQualityBracketsRegex.Replace(simpleTitle, m => { if (QualityParser.ParseQualityName(m.Value).Quality != Qualities.Quality.Unknown) { return(string.Empty); } return(m.Value); }); var sixDigitAirDateMatch = SixDigitAirDateRegex.Match(simpleTitle); if (sixDigitAirDateMatch.Success) { var airYear = sixDigitAirDateMatch.Groups["airyear"].Value; var airMonth = sixDigitAirDateMatch.Groups["airmonth"].Value; var airDay = sixDigitAirDateMatch.Groups["airday"].Value; if (airMonth != "00" || airDay != "00") { var fixedDate = string.Format("20{0}.{1}.{2}", airYear, airMonth, airDay); simpleTitle = simpleTitle.Replace(sixDigitAirDateMatch.Groups["airdate"].Value, fixedDate); } } foreach (var regex in ReportTitleRegex) { var match = regex.Matches(simpleTitle); if (match.Count != 0) { Logger.Trace(regex); try { var result = ParseMatchCollection(match, releaseTitle); if (result != null) { if (result.FullSeason && result.ReleaseTokens.ContainsIgnoreCase("Special")) { result.FullSeason = false; result.Special = true; } result.Language = LanguageParser.ParseLanguage(releaseTitle); Logger.Debug("Language parsed: {0}", result.Language); result.Quality = QualityParser.ParseQuality(title); Logger.Debug("Quality parsed: {0}", result.Quality); result.ReleaseGroup = ParseReleaseGroup(releaseTitle); var subGroup = GetSubGroup(match); if (!subGroup.IsNullOrWhiteSpace()) { result.ReleaseGroup = subGroup; } Logger.Debug("Release Group parsed: {0}", result.ReleaseGroup); result.ReleaseHash = GetReleaseHash(match); if (!result.ReleaseHash.IsNullOrWhiteSpace()) { Logger.Debug("Release Hash parsed: {0}", result.ReleaseHash); } return(result); } } catch (InvalidDateException ex) { Logger.Debug(ex, ex.Message); break; } } } } catch (Exception e) { if (!title.ToLower().Contains("password") && !title.ToLower().Contains("yenc")) { Logger.Error(e, "An error has occurred while trying to parse {0}", title); } } Logger.Debug("Unable to parse {0}", title); return(null); }