|
|
|
@ -4,6 +4,7 @@ using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
using NLog;
|
|
|
|
|
using NzbDrone.Common.Cache;
|
|
|
|
|
using NzbDrone.Core.Configuration;
|
|
|
|
|
using NzbDrone.Core.MediaFiles;
|
|
|
|
|
using NzbDrone.Core.Tv;
|
|
|
|
@ -21,6 +22,7 @@ namespace NzbDrone.Core.Organizer
|
|
|
|
|
{
|
|
|
|
|
private readonly IConfigService _configService;
|
|
|
|
|
private readonly INamingConfigService _namingConfigService;
|
|
|
|
|
private readonly ICached<EpisodeFormat> _patternCache;
|
|
|
|
|
private readonly Logger _logger;
|
|
|
|
|
|
|
|
|
|
private static readonly Regex TitleRegex = new Regex(@"(?<token>\{(?:\w+)(?<separator>\s|\W|_)\w+\})",
|
|
|
|
@ -37,10 +39,14 @@ namespace NzbDrone.Core.Organizer
|
|
|
|
|
|
|
|
|
|
public static readonly Regex AirDateRegex = new Regex(@"\{Air(\s|\W|_)Date\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
|
|
|
|
|
|
|
|
|
public FileNameBuilder(INamingConfigService namingConfigService, IConfigService configService, Logger logger)
|
|
|
|
|
public FileNameBuilder(INamingConfigService namingConfigService,
|
|
|
|
|
IConfigService configService,
|
|
|
|
|
ICacheManger cacheManger,
|
|
|
|
|
Logger logger)
|
|
|
|
|
{
|
|
|
|
|
_namingConfigService = namingConfigService;
|
|
|
|
|
_configService = configService;
|
|
|
|
|
_patternCache = cacheManger.GetCache<EpisodeFormat>(GetType());
|
|
|
|
|
_logger = logger;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -99,17 +105,10 @@ namespace NzbDrone.Core.Organizer
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var seasonEpisode = SeasonEpisodePatternRegex.Match(pattern);
|
|
|
|
|
if (seasonEpisode.Success)
|
|
|
|
|
{
|
|
|
|
|
var episodeFormat = new EpisodeFormat
|
|
|
|
|
{
|
|
|
|
|
EpisodeSeparator = seasonEpisode.Groups["episodeSeparator"].Value,
|
|
|
|
|
Separator = seasonEpisode.Groups["separator"].Value,
|
|
|
|
|
EpisodePattern = seasonEpisode.Groups["episode"].Value,
|
|
|
|
|
SeasonEpisodePattern = seasonEpisode.Groups["seasonEpisode"].Value,
|
|
|
|
|
};
|
|
|
|
|
var episodeFormat = GetSeasonEpisodePattern(pattern);
|
|
|
|
|
|
|
|
|
|
if (episodeFormat != null)
|
|
|
|
|
{
|
|
|
|
|
pattern = pattern.Replace(episodeFormat.SeasonEpisodePattern, "{Season Episode}");
|
|
|
|
|
var seasonEpisodePattern = episodeFormat.SeasonEpisodePattern;
|
|
|
|
|
|
|
|
|
@ -246,6 +245,28 @@ namespace NzbDrone.Core.Organizer
|
|
|
|
|
|
|
|
|
|
return value.ToString(split[1]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private EpisodeFormat GetSeasonEpisodePattern(string pattern)
|
|
|
|
|
{
|
|
|
|
|
return _patternCache.Get(pattern, () =>
|
|
|
|
|
{
|
|
|
|
|
var match = SeasonEpisodePatternRegex.Match(pattern);
|
|
|
|
|
|
|
|
|
|
if (match.Success)
|
|
|
|
|
{
|
|
|
|
|
return new EpisodeFormat
|
|
|
|
|
{
|
|
|
|
|
EpisodeSeparator = match.Groups["episodeSeparator"].Value,
|
|
|
|
|
Separator = match.Groups["separator"].Value,
|
|
|
|
|
EpisodePattern = match.Groups["episode"].Value,
|
|
|
|
|
SeasonEpisodePattern = match.Groups["seasonEpisode"].Value,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public enum MultiEpisodeStyle
|
|
|
|
|