public static ParsedMovieInfo ParseMinimalMovieTitle(string title, string foundTitle, int foundYear) { var result = new ParsedMovieInfo { MovieTitle = foundTitle }; var languageTitle = Regex.Replace(title.Replace(".", " "), foundTitle, "A Movie", RegexOptions.IgnoreCase); result.Languages = LanguageParser.ParseLanguages(title); Logger.Debug("Language parsed: {0}", result.Languages.ToExtendedString()); result.Quality = QualityParser.ParseQuality(title); Logger.Debug("Quality parsed: {0}", result.Quality); if (result.Edition.IsNullOrWhiteSpace()) { result.Edition = ParseEdition(languageTitle); } result.ReleaseGroup = ParseReleaseGroup(title); result.ImdbId = ParseImdbId(title); Logger.Debug("Release Group parsed: {0}", result.ReleaseGroup); if (foundYear > 1800) { result.Year = foundYear; } else { var match = ReportYearRegex.Match(title); if (match.Success && match.Groups["year"].Value != null) { int year = 1290; if (int.TryParse(match.Groups["year"].Value, out year)) { result.Year = year; } else { result.Year = year; } } } return(result); }
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); }
public static ParsedMovieInfo ParseMovieTitle(string title, bool isDir = false) { var originalTitle = 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); //Trim dashes from end releaseTitle = releaseTitle.Trim('-', '_'); releaseTitle = releaseTitle.Replace("【", "[").Replace("】", "]"); var simpleTitle = SimpleTitleRegex.Replace(releaseTitle); // TODO: Quick fix stripping [url] - prefixes. simpleTitle = WebsitePrefixRegex.Replace(simpleTitle); simpleTitle = WebsitePostfixRegex.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 allRegexes = ReportMovieTitleRegex.ToList(); if (isDir) { allRegexes.AddRange(ReportMovieTitleFolderRegex); } foreach (var regex in allRegexes) { var match = regex.Matches(simpleTitle); if (match.Count != 0) { Logger.Trace(regex); try { var result = ParseMovieMatchCollection(match); if (result != null) { //TODO: Add tests for this! var simpleReleaseTitle = SimpleReleaseTitleRegex.Replace(releaseTitle, string.Empty); var simpleTitleReplaceString = match[0].Groups["title"].Success ? match[0].Groups["title"].Value : result.MovieTitle; if (simpleTitleReplaceString.IsNotNullOrWhiteSpace()) { simpleReleaseTitle = simpleReleaseTitle.Replace(simpleTitleReplaceString, simpleTitleReplaceString.Contains(".") ? "A.Movie" : "A Movie"); } result.ReleaseGroup = ParseReleaseGroup(simpleReleaseTitle); var subGroup = GetSubGroup(match); if (!subGroup.IsNullOrWhiteSpace()) { result.ReleaseGroup = subGroup; } Logger.Debug("Release Group parsed: {0}", result.ReleaseGroup); result.Languages = LanguageParser.ParseLanguages(result.ReleaseGroup.IsNotNullOrWhiteSpace() ? simpleReleaseTitle.Replace(result.ReleaseGroup, "RlsGrp") : simpleReleaseTitle); Logger.Debug("Languages parsed: {0}", string.Join(", ", result.Languages)); result.Quality = QualityParser.ParseQuality(title); Logger.Debug("Quality parsed: {0}", result.Quality); if (result.Edition.IsNullOrWhiteSpace()) { result.Edition = ParseEdition(simpleReleaseTitle); Logger.Debug("Edition parsed: {0}", result.Edition); } result.ReleaseHash = GetReleaseHash(match); if (!result.ReleaseHash.IsNullOrWhiteSpace()) { Logger.Debug("Release Hash parsed: {0}", result.ReleaseHash); } result.OriginalTitle = originalTitle; result.ReleaseTitle = releaseTitle; result.SimpleReleaseTitle = simpleReleaseTitle; result.ImdbId = ParseImdbId(simpleReleaseTitle); result.TmdbId = ParseTmdbId(simpleReleaseTitle); 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); }