Fixed: Season pack with Special in series title was treated as unknown special

This commit is contained in:
Taloth Saldono 2019-02-12 21:56:55 +01:00
parent 1606ea19a8
commit 5b741a10db
5 changed files with 50 additions and 1 deletions

View File

@ -0,0 +1,13 @@
using System;
using System.Text.RegularExpressions;
namespace NzbDrone.Common.Extensions
{
public static class RegexExtensions
{
public static int EndIndex(this Capture regexMatch)
{
return regexMatch.Index + regexMatch.Length;
}
}
}

View File

@ -102,6 +102,7 @@
<Compile Include="Disk\DestinationAlreadyExistsException.cs" />
<Compile Include="Exceptions\SonarrStartupException.cs" />
<Compile Include="EnvironmentInfo\RuntimeMode.cs" />
<Compile Include="Extensions\RegexExtensions.cs" />
<Compile Include="Extensions\DictionaryExtensions.cs" />
<Compile Include="Disk\OsPath.cs" />
<Compile Include="Disk\DiskProviderBase.cs" />

View File

@ -46,5 +46,11 @@ namespace NzbDrone.Core.Test.ParserTests
{
Parser.Parser.ParseTitle(title).IsPossibleSpecialEpisode.Should().BeTrue();
}
[TestCase("Big.Special.Show.S05.HDTV.x264-2HD")]
public void IsPossibleSpecialEpisode_should_be_false_for_Special_in_title(string title)
{
Parser.Parser.ParseTitle(title).IsPossibleSpecialEpisode.Should().BeFalse();
}
}
}

View File

@ -24,6 +24,7 @@ namespace NzbDrone.Core.Parser.Model
public string ReleaseGroup { get; set; }
public string ReleaseHash { get; set; }
public int SeasonPart { get; set; }
public string ReleaseTokens { get; set; }
public ParsedEpisodeInfo()
{
@ -104,6 +105,13 @@ namespace NzbDrone.Core.Parser.Model
{
episodeString = string.Format("{0}", string.Join("-", AbsoluteEpisodeNumbers.Select(c => c.ToString("000"))));
}
else if (Special)
{
if (SeasonNumber != 0)
episodeString = string.Format("[Unknown Season {0:00} Special]", SeasonNumber);
else
episodeString = "[Unknown Special]";
}
return string.Format("{0} - {1} {2}", SeriesTitle, episodeString, Quality);
}

View File

@ -450,7 +450,7 @@ namespace NzbDrone.Core.Parser
if (result != null)
{
if (result.FullSeason && title.ContainsIgnoreCase("Special"))
if (result.FullSeason && result.ReleaseTokens.ContainsIgnoreCase("Special"))
{
result.FullSeason = false;
result.Special = true;
@ -643,6 +643,8 @@ namespace NzbDrone.Core.Parser
int airYear;
int.TryParse(matchCollection[0].Groups["airyear"].Value, out airYear);
int lastSeasonEpisodeStringIndex = matchCollection[0].Groups["title"].EndIndex();
ParsedEpisodeInfo result;
if (airYear < 1900)
@ -653,7 +655,11 @@ namespace NzbDrone.Core.Parser
{
int parsedSeason;
if (int.TryParse(seasonCapture.Value, out parsedSeason))
{
seasons.Add(parsedSeason);
lastSeasonEpisodeStringIndex = Math.Max(lastSeasonEpisodeStringIndex, seasonCapture.EndIndex());
}
}
//If no season was found it should be treated as a mini series and season 1
@ -688,6 +694,8 @@ namespace NzbDrone.Core.Parser
var count = last - first + 1;
result.EpisodeNumbers = Enumerable.Range(first, count).ToArray();
lastSeasonEpisodeStringIndex = Math.Max(lastSeasonEpisodeStringIndex, episodeCaptures.Last().EndIndex());
}
if (absoluteEpisodeCaptures.Any())
@ -707,6 +715,8 @@ namespace NzbDrone.Core.Parser
result.SpecialAbsoluteEpisodeNumbers = new decimal[] { first };
result.Special = true;
lastSeasonEpisodeStringIndex = Math.Max(lastSeasonEpisodeStringIndex, absoluteEpisodeCaptures.First().EndIndex());
}
else
{
@ -717,6 +727,8 @@ namespace NzbDrone.Core.Parser
{
result.Special = true;
}
lastSeasonEpisodeStringIndex = Math.Max(lastSeasonEpisodeStringIndex, absoluteEpisodeCaptures.Last().EndIndex());
}
}
@ -782,6 +794,10 @@ namespace NzbDrone.Core.Parser
throw new InvalidDateException("Invalid date found: {0}", airDate);
}
lastSeasonEpisodeStringIndex = Math.Max(lastSeasonEpisodeStringIndex, matchCollection[0].Groups["airyear"].EndIndex());
lastSeasonEpisodeStringIndex = Math.Max(lastSeasonEpisodeStringIndex, matchCollection[0].Groups["airmonth"].EndIndex());
lastSeasonEpisodeStringIndex = Math.Max(lastSeasonEpisodeStringIndex, matchCollection[0].Groups["airday"].EndIndex());
result = new ParsedEpisodeInfo
{
ReleaseTitle = releaseTitle,
@ -789,6 +805,11 @@ namespace NzbDrone.Core.Parser
};
}
if (lastSeasonEpisodeStringIndex != releaseTitle.Length)
result.ReleaseTokens = releaseTitle.Substring(lastSeasonEpisodeStringIndex);
else
result.ReleaseTokens = releaseTitle;
result.SeriesTitle = seriesName;
result.SeriesTitleInfo = GetSeriesTitleInfo(result.SeriesTitle);