diff --git a/src/NzbDrone.Api/Config/NetImportConfigModule.cs b/src/NzbDrone.Api/Config/NetImportConfigModule.cs
index 3cd194116..f805e8c2d 100644
--- a/src/NzbDrone.Api/Config/NetImportConfigModule.cs
+++ b/src/NzbDrone.Api/Config/NetImportConfigModule.cs
@@ -10,6 +10,8 @@ namespace NzbDrone.Api.Config
public NetImportConfigModule(IConfigService configService)
: base(configService)
{
+ SharedValidator.RuleFor(c => c.NetImportSyncInterval)
+ .IsValidNetImportSyncInterval();
}
protected override NetImportConfigResource ToResource(IConfigService model)
diff --git a/src/NzbDrone.Api/Config/NetImportConfigResource.cs b/src/NzbDrone.Api/Config/NetImportConfigResource.cs
index 7b32aefe3..a1502375c 100644
--- a/src/NzbDrone.Api/Config/NetImportConfigResource.cs
+++ b/src/NzbDrone.Api/Config/NetImportConfigResource.cs
@@ -5,6 +5,7 @@ namespace NzbDrone.Api.Config
{
public class NetImportConfigResource : RestResource
{
+ public int NetImportSyncInterval { get; set; }
}
public static class NetImportConfigResourceMapper
@@ -13,6 +14,7 @@ namespace NzbDrone.Api.Config
{
return new NetImportConfigResource
{
+ NetImportSyncInterval = model.NetImportSyncInterval
};
}
}
diff --git a/src/NzbDrone.Api/NzbDrone.Api.csproj b/src/NzbDrone.Api/NzbDrone.Api.csproj
index 1f0542788..d467e397e 100644
--- a/src/NzbDrone.Api/NzbDrone.Api.csproj
+++ b/src/NzbDrone.Api/NzbDrone.Api.csproj
@@ -260,6 +260,7 @@
+
diff --git a/src/NzbDrone.Api/Validation/NetImportSyncIntervalValidator.cs b/src/NzbDrone.Api/Validation/NetImportSyncIntervalValidator.cs
new file mode 100644
index 000000000..b44b3f9e4
--- /dev/null
+++ b/src/NzbDrone.Api/Validation/NetImportSyncIntervalValidator.cs
@@ -0,0 +1,34 @@
+using FluentValidation.Validators;
+
+namespace NzbDrone.Api.Validation
+{
+ public class NetImportSyncIntervalValidator : PropertyValidator
+ {
+ public NetImportSyncIntervalValidator()
+ : base("Must be between 10 and 1440 or 0 to disable")
+ {
+ }
+
+ protected override bool IsValid(PropertyValidatorContext context)
+ {
+ if (context.PropertyValue == null)
+ {
+ return true;
+ }
+
+ var value = (int)context.PropertyValue;
+
+ if (value == 0)
+ {
+ return true;
+ }
+
+ if (value >= 10 && value <= 1440)
+ {
+ return true;
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/src/NzbDrone.Api/Validation/RuleBuilderExtensions.cs b/src/NzbDrone.Api/Validation/RuleBuilderExtensions.cs
index 01a3a4f75..4684d3f12 100644
--- a/src/NzbDrone.Api/Validation/RuleBuilderExtensions.cs
+++ b/src/NzbDrone.Api/Validation/RuleBuilderExtensions.cs
@@ -36,5 +36,10 @@ namespace NzbDrone.Api.Validation
{
return ruleBuilder.SetValidator(new RssSyncIntervalValidator());
}
+
+ public static IRuleBuilderOptions IsValidNetImportSyncInterval(this IRuleBuilder ruleBuilder)
+ {
+ return ruleBuilder.SetValidator(new NetImportSyncIntervalValidator());
+ }
}
}
diff --git a/src/NzbDrone.Core/Configuration/ConfigService.cs b/src/NzbDrone.Core/Configuration/ConfigService.cs
index d19cddd67..639bb69d6 100644
--- a/src/NzbDrone.Core/Configuration/ConfigService.cs
+++ b/src/NzbDrone.Core/Configuration/ConfigService.cs
@@ -105,6 +105,13 @@ namespace NzbDrone.Core.Configuration
set { SetValue("RssSyncInterval", value); }
}
+ public int NetImportSyncInterval
+ {
+ get { return GetValueInt("NetImportSyncInterval", 60); }
+
+ set { SetValue("NetImportSyncInterval", value); }
+ }
+
public int MinimumAge
{
get { return GetValueInt("MinimumAge", 0); }
diff --git a/src/NzbDrone.Core/Configuration/IConfigService.cs b/src/NzbDrone.Core/Configuration/IConfigService.cs
index e17d8d6dc..a2d56e778 100644
--- a/src/NzbDrone.Core/Configuration/IConfigService.cs
+++ b/src/NzbDrone.Core/Configuration/IConfigService.cs
@@ -46,6 +46,8 @@ namespace NzbDrone.Core.Configuration
int RssSyncInterval { get; set; }
int MinimumAge { get; set; }
+ int NetImportSyncInterval { get; set; }
+
//UI
int FirstDayOfWeek { get; set; }
string CalendarWeekColumnHeader { get; set; }
diff --git a/src/NzbDrone.Core/Jobs/TaskManager.cs b/src/NzbDrone.Core/Jobs/TaskManager.cs
index 52e564e5d..184dfedb9 100644
--- a/src/NzbDrone.Core/Jobs/TaskManager.cs
+++ b/src/NzbDrone.Core/Jobs/TaskManager.cs
@@ -75,7 +75,6 @@ namespace NzbDrone.Core.Jobs
new ScheduledTask{ Interval = 5, TypeName = typeof(MessagingCleanupCommand).FullName},
new ScheduledTask{ Interval = updateInterval, TypeName = typeof(ApplicationUpdateCommand).FullName},
// new ScheduledTask{ Interval = 3*60, TypeName = typeof(UpdateSceneMappingCommand).FullName},
- new ScheduledTask{ Interval = 12*60, TypeName = typeof(NetImportSyncCommand).FullName},
new ScheduledTask{ Interval = 6*60, TypeName = typeof(CheckHealthCommand).FullName},
new ScheduledTask{ Interval = 24*60, TypeName = typeof(RefreshMovieCommand).FullName},
new ScheduledTask{ Interval = 24*60, TypeName = typeof(HousekeepingCommand).FullName},
@@ -87,6 +86,12 @@ namespace NzbDrone.Core.Jobs
TypeName = typeof(RssSyncCommand).FullName
},
+ new ScheduledTask
+ {
+ Interval = GetNetImportSyncInterval(),
+ TypeName = typeof(NetImportSyncCommand).FullName
+ },
+
new ScheduledTask
{
Interval = _configService.DownloadedEpisodesScanInterval,
@@ -140,6 +145,23 @@ namespace NzbDrone.Core.Jobs
return interval;
}
+ private int GetNetImportSyncInterval()
+ {
+ var interval = _configService.NetImportSyncInterval;
+
+ if (interval > 0 && interval < 10)
+ {
+ return 10;
+ }
+
+ if (interval < 0)
+ {
+ return 0;
+ }
+
+ return interval;
+ }
+
public void Handle(CommandExecutedEvent message)
{
var scheduledTask = _scheduledTaskRepository.All().SingleOrDefault(c => c.TypeName == message.Command.Body.GetType().FullName);
diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs
index f6d5b1ecd..32422092e 100644
--- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs
+++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs
@@ -1,337 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Text.RegularExpressions;
-using NLog;
-using NzbDrone.Common.Cache;
-using NzbDrone.Common.EnsureThat;
-using NzbDrone.Common.Extensions;
-using NzbDrone.Core.MediaFiles;
-using NzbDrone.Core.Qualities;
-using NzbDrone.Core.Tv;
-
-namespace NzbDrone.Core.Organizer
-{
- public interface IBuildFileNames
- {
- string BuildFileName(List episodes, Series series, EpisodeFile episodeFile, NamingConfig namingConfig = null);
- string BuildFileName(Movie movie, MovieFile movieFile, NamingConfig namingConfig = null);
- string BuildFilePath(Movie movie, string fileName, string extension);
- string BuildFilePath(Series series, int seasonNumber, string fileName, string extension);
- string BuildSeasonPath(Series series, int seasonNumber);
- BasicNamingConfig GetBasicNamingConfig(NamingConfig nameSpec);
- string GetSeriesFolder(Series series, NamingConfig namingConfig = null);
- string GetSeasonFolder(Series series, int seasonNumber, NamingConfig namingConfig = null);
- string GetMovieFolder(Movie movie, NamingConfig namingConfig = null);
- }
-
- public class FileNameBuilder : IBuildFileNames
- {
- private readonly INamingConfigService _namingConfigService;
- private readonly IQualityDefinitionService _qualityDefinitionService;
- private readonly ICached _episodeFormatCache;
- private readonly ICached _absoluteEpisodeFormatCache;
- private readonly Logger _logger;
-
- private static readonly Regex TitleRegex = new Regex(@"\{(?[- ._\[(]*)(?(?:[a-z0-9]+)(?:(?[- ._]+)(?:[a-z0-9]+))?)(?::(?[a-z0-9]+))?(?[- ._)\]]*)\}",
- RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- private static readonly Regex EpisodeRegex = new Regex(@"(?\{episode(?:\:0+)?})",
- RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- private static readonly Regex SeasonRegex = new Regex(@"(?\{season(?:\:0+)?})",
- RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- private static readonly Regex AbsoluteEpisodeRegex = new Regex(@"(?\{absolute(?:\:0+)?})",
- RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- public static readonly Regex SeasonEpisodePatternRegex = new Regex(@"(?(?<=})[- ._]+?)?(?s?{season(?:\:0+)?}(?[- ._]?[ex])(?{episode(?:\:0+)?}))(?[- ._]+?(?={))?",
- RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- public static readonly Regex AbsoluteEpisodePatternRegex = new Regex(@"(?(?<=})[- ._]+?)?(?{absolute(?:\:0+)?})(?[- ._]+?(?={))?",
- RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- public static readonly Regex AirDateRegex = new Regex(@"\{Air(\s|\W|_)Date\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- public static readonly Regex SeriesTitleRegex = new Regex(@"(?\{(?:Series)(?[- ._])(Clean)?Title\})",
- RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- public static readonly Regex MovieTitleRegex = new Regex(@"(?\{((?:(Movie|Original))(?[- ._])(Clean)?Title(The)?)\})",
- RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- private static readonly Regex FileNameCleanupRegex = new Regex(@"([- ._])(\1)+", RegexOptions.Compiled);
- private static readonly Regex TrimSeparatorsRegex = new Regex(@"[- ._]$", RegexOptions.Compiled);
-
- private static readonly Regex ScenifyRemoveChars = new Regex(@"(?<=\s)(,|<|>|\/|\\|;|:|'|""|\||`|~|!|\?|@|$|%|^|\*|-|_|=){1}(?=\s)|('|:|\?|,)(?=(?:(?:s|m)\s)|\s|$)|(\(|\)|\[|\]|\{|\})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
- private static readonly Regex ScenifyReplaceChars = new Regex(@"[\/]", RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- //TODO: Support Written numbers (One, Two, etc) and Roman Numerals (I, II, III etc)
- private static readonly Regex MultiPartCleanupRegex = new Regex(@"(?:\(\d+\)|(Part|Pt\.?)\s?\d+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
-
- private static readonly char[] EpisodeTitleTrimCharacters = new[] { ' ', '.', '?' };
-
- public FileNameBuilder(INamingConfigService namingConfigService,
- IQualityDefinitionService qualityDefinitionService,
- ICacheManager cacheManager,
- Logger logger)
- {
- _namingConfigService = namingConfigService;
- _qualityDefinitionService = qualityDefinitionService;
- //_movieFormatCache = cacheManager.GetCache(GetType(), "movieFormat");
- _episodeFormatCache = cacheManager.GetCache(GetType(), "episodeFormat");
- _absoluteEpisodeFormatCache = cacheManager.GetCache(GetType(), "absoluteEpisodeFormat");
- _logger = logger;
- }
-
- public string BuildFileName(List episodes, Series series, EpisodeFile episodeFile, NamingConfig namingConfig = null)
- {
- if (namingConfig == null)
- {
- namingConfig = _namingConfigService.GetConfig();
- }
-
- if (!namingConfig.RenameEpisodes)
- {
- return GetOriginalTitle(episodeFile);
- }
-
- if (namingConfig.StandardEpisodeFormat.IsNullOrWhiteSpace() && series.SeriesType == SeriesTypes.Standard)
- {
- throw new NamingFormatException("Standard episode format cannot be empty");
- }
-
- if (namingConfig.DailyEpisodeFormat.IsNullOrWhiteSpace() && series.SeriesType == SeriesTypes.Daily)
- {
- throw new NamingFormatException("Daily episode format cannot be empty");
- }
-
- if (namingConfig.AnimeEpisodeFormat.IsNullOrWhiteSpace() && series.SeriesType == SeriesTypes.Anime)
- {
- throw new NamingFormatException("Anime episode format cannot be empty");
- }
-
- var pattern = namingConfig.StandardEpisodeFormat;
- var tokenHandlers = new Dictionary>(FileNameBuilderTokenEqualityComparer.Instance);
-
- episodes = episodes.OrderBy(e => e.SeasonNumber).ThenBy(e => e.EpisodeNumber).ToList();
-
- if (series.SeriesType == SeriesTypes.Daily)
- {
- pattern = namingConfig.DailyEpisodeFormat;
- }
-
- if (series.SeriesType == SeriesTypes.Anime && episodes.All(e => e.AbsoluteEpisodeNumber.HasValue))
- {
- pattern = namingConfig.AnimeEpisodeFormat;
- }
-
- pattern = AddSeasonEpisodeNumberingTokens(pattern, tokenHandlers, episodes, namingConfig);
- pattern = AddAbsoluteNumberingTokens(pattern, tokenHandlers, series, episodes, namingConfig);
-
- AddSeriesTokens(tokenHandlers, series);
- AddEpisodeTokens(tokenHandlers, episodes);
- AddEpisodeFileTokens(tokenHandlers, episodeFile);
- AddQualityTokens(tokenHandlers, series, episodeFile);
- AddMediaInfoTokens(tokenHandlers, episodeFile);
-
- var fileName = ReplaceTokens(pattern, tokenHandlers, namingConfig).Trim();
- fileName = FileNameCleanupRegex.Replace(fileName, match => match.Captures[0].Value[0].ToString());
- fileName = TrimSeparatorsRegex.Replace(fileName, string.Empty);
-
- return fileName;
- }
-
- public string BuildFileName(Movie movie, MovieFile movieFile, NamingConfig namingConfig = null)
- {
- if (namingConfig == null)
- {
- namingConfig = _namingConfigService.GetConfig();
- }
-
- if (!namingConfig.RenameEpisodes)
- {
- return GetOriginalTitle(movieFile);
- }
-
- //TODO: Update namingConfig for Movies!
- var pattern = namingConfig.StandardMovieFormat;
- var tokenHandlers = new Dictionary>(FileNameBuilderTokenEqualityComparer.Instance);
-
- AddMovieTokens(tokenHandlers, movie);
- AddReleaseDateTokens(tokenHandlers, movie.Year); //In case we want to separate the year
- AddImdbIdTokens(tokenHandlers, movie.ImdbId);
- AddQualityTokens(tokenHandlers, movie, movieFile);
- AddMediaInfoTokens(tokenHandlers, movieFile);
- AddMovieFileTokens(tokenHandlers, movieFile);
-
- var fileName = ReplaceTokens(pattern, tokenHandlers, namingConfig).Trim();
- fileName = FileNameCleanupRegex.Replace(fileName, match => match.Captures[0].Value[0].ToString());
- fileName = TrimSeparatorsRegex.Replace(fileName, string.Empty);
-
- return fileName;
- }
-
- public string BuildFilePath(Series series, int seasonNumber, string fileName, string extension)
- {
- Ensure.That(extension, () => extension).IsNotNullOrWhiteSpace();
-
- var path = BuildSeasonPath(series, seasonNumber);
-
- return Path.Combine(path, fileName + extension);
- }
-
- public string BuildFilePath(Movie movie, string fileName, string extension)
- {
- Ensure.That(extension, () => extension).IsNotNullOrWhiteSpace();
-
- var path = movie.Path;
-
- return Path.Combine(path, fileName + extension);
- }
-
- public string BuildSeasonPath(Series series, int seasonNumber)
- {
- var path = series.Path;
-
- if (series.SeasonFolder)
- {
- if (seasonNumber == 0)
- {
- path = Path.Combine(path, "Specials");
- }
- else
- {
- var seasonFolder = GetSeasonFolder(series, seasonNumber);
-
- seasonFolder = CleanFileName(seasonFolder);
-
- path = Path.Combine(path, seasonFolder);
- }
- }
-
- return path;
- }
-
- public BasicNamingConfig GetBasicNamingConfig(NamingConfig nameSpec)
- {
- return new BasicNamingConfig(); //For now let's be lazy
-
- var episodeFormat = GetEpisodeFormat(nameSpec.StandardEpisodeFormat).LastOrDefault();
-
- if (episodeFormat == null)
- {
- return new BasicNamingConfig();
- }
-
- var basicNamingConfig = new BasicNamingConfig
- {
- Separator = episodeFormat.Separator,
- NumberStyle = episodeFormat.SeasonEpisodePattern
- };
-
- var titleTokens = TitleRegex.Matches(nameSpec.StandardEpisodeFormat);
-
- foreach (Match match in titleTokens)
- {
- var separator = match.Groups["separator"].Value;
- var token = match.Groups["token"].Value;
-
- if (!separator.Equals(" "))
- {
- basicNamingConfig.ReplaceSpaces = true;
- }
-
- if (token.StartsWith("{Series", StringComparison.InvariantCultureIgnoreCase))
- {
- basicNamingConfig.IncludeSeriesTitle = true;
- }
-
- if (token.StartsWith("{Episode", StringComparison.InvariantCultureIgnoreCase))
- {
- basicNamingConfig.IncludeEpisodeTitle = true;
- }
-
- if (token.StartsWith("{Quality", StringComparison.InvariantCultureIgnoreCase))
- {
- basicNamingConfig.IncludeQuality = true;
- }
- }
-
- return basicNamingConfig;
- }
-
- public string GetSeriesFolder(Series series, NamingConfig namingConfig = null)
- {
- if (namingConfig == null)
- {
- namingConfig = _namingConfigService.GetConfig();
- }
-
- var tokenHandlers = new Dictionary>(FileNameBuilderTokenEqualityComparer.Instance);
-
- AddSeriesTokens(tokenHandlers, series);
-
- return CleanFolderName(ReplaceTokens(namingConfig.SeriesFolderFormat, tokenHandlers, namingConfig));
- }
-
- public string GetSeasonFolder(Series series, int seasonNumber, NamingConfig namingConfig = null)
- {
- if (namingConfig == null)
- {
- namingConfig = _namingConfigService.GetConfig();
- }
-
- var tokenHandlers = new Dictionary>(FileNameBuilderTokenEqualityComparer.Instance);
-
- AddSeriesTokens(tokenHandlers, series);
- AddSeasonTokens(tokenHandlers, seasonNumber);
-
- return CleanFolderName(ReplaceTokens(namingConfig.SeasonFolderFormat, tokenHandlers, namingConfig));
- }
-
- public string GetMovieFolder(Movie movie, NamingConfig namingConfig = null)
- {
- if(namingConfig == null)
- {
- namingConfig = _namingConfigService.GetConfig();
- }
-
- var tokenHandlers = new Dictionary>(FileNameBuilderTokenEqualityComparer.Instance);
-
- AddMovieTokens(tokenHandlers, movie);
- AddReleaseDateTokens(tokenHandlers, movie.Year);
- AddImdbIdTokens(tokenHandlers, movie.ImdbId);
-
- return CleanFolderName(ReplaceTokens(namingConfig.MovieFolderFormat, tokenHandlers, namingConfig));
- }
-
- public static string CleanTitle(string title)
- {
- title = title.Replace("&", "and");
- title = ScenifyReplaceChars.Replace(title, " ");
- title = ScenifyRemoveChars.Replace(title, string.Empty);
-
- return title;
- }
-
- public static string TitleThe(string title)
- {
- string[] prefixes = { "The ", "An ", "A " };
- foreach (string prefix in prefixes)
- {
- int prefix_length = prefix.Length;
- if (prefix.ToLower() == title.Substring(0, prefix_length).ToLower())
- {
- title = title.Substring(prefix_length) + ", " + prefix.Trim();
- break;
- }
- }
-
- return title.Trim();
- }
-
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -472,7 +138,7 @@ namespace NzbDrone.Core.Organizer
AddEpisodeFileTokens(tokenHandlers, episodeFile);
AddQualityTokens(tokenHandlers, series, episodeFile);
AddMediaInfoTokens(tokenHandlers, episodeFile);
-
+
var fileName = ReplaceTokens(pattern, tokenHandlers, namingConfig).Trim();
fileName = FileNameCleanupRegex.Replace(fileName, match => match.Captures[0].Value[0].ToString());
fileName = TrimSeparatorsRegex.Replace(fileName, string.Empty);
@@ -564,10 +230,10 @@ namespace NzbDrone.Core.Organizer
}
var basicNamingConfig = new BasicNamingConfig
- {
- Separator = episodeFormat.Separator,
- NumberStyle = episodeFormat.SeasonEpisodePattern
- };
+ {
+ Separator = episodeFormat.Separator,
+ NumberStyle = episodeFormat.SeasonEpisodePattern
+ };
var titleTokens = TitleRegex.Matches(nameSpec.StandardEpisodeFormat);
@@ -631,7 +297,7 @@ namespace NzbDrone.Core.Organizer
public string GetMovieFolder(Movie movie, NamingConfig namingConfig = null)
{
- if(namingConfig == null)
+ if (namingConfig == null)
{
namingConfig = _namingConfigService.GetConfig();
}
@@ -654,6 +320,20 @@ namespace NzbDrone.Core.Organizer
return title;
}
+ public static string TitleThe(string title)
+ {
+ string[] prefixes = { "The ", "An ", "A " };
+ foreach (string prefix in prefixes)
+ {
+ int prefix_length = prefix.Length;
+ if (prefix.ToLower() == title.Substring(0, prefix_length).ToLower())
+ {
+ title = title.Substring(prefix_length) + ", " + prefix.Trim();
+ break;
+ }
+ }
+
+ return title.Trim();
}
public static string CleanFileName(string name, bool replace = true)
@@ -763,7 +443,7 @@ namespace NzbDrone.Core.Organizer
var absoluteEpisodePattern = absoluteEpisodeFormat.AbsoluteEpisodePattern;
string formatPattern;
- switch ((MultiEpisodeStyle) namingConfig.MultiEpisodeStyle)
+ switch ((MultiEpisodeStyle)namingConfig.MultiEpisodeStyle)
{
case MultiEpisodeStyle.Duplicate:
@@ -786,14 +466,14 @@ namespace NzbDrone.Core.Organizer
case MultiEpisodeStyle.Range:
case MultiEpisodeStyle.PrefixedRange:
formatPattern = "-" + absoluteEpisodeFormat.AbsoluteEpisodePattern;
- var eps = new List {episodes.First()};
+ var eps = new List { episodes.First() };
if (episodes.Count > 1) eps.Add(episodes.Last());
absoluteEpisodePattern = FormatAbsoluteNumberTokens(absoluteEpisodePattern, formatPattern, eps);
break;
- //MultiEpisodeStyle.Extend
+ //MultiEpisodeStyle.Extend
default:
formatPattern = "-" + absoluteEpisodeFormat.AbsoluteEpisodePattern;
absoluteEpisodePattern = FormatAbsoluteNumberTokens(absoluteEpisodePattern, formatPattern, episodes);
@@ -1241,7 +921,7 @@ namespace NzbDrone.Core.Organizer
private AbsoluteEpisodeFormat[] GetAbsoluteFormat(string pattern)
{
- return _absoluteEpisodeFormatCache.Get(pattern, () => AbsoluteEpisodePatternRegex.Matches(pattern).OfType()
+ return _absoluteEpisodeFormatCache.Get(pattern, () => AbsoluteEpisodePatternRegex.Matches(pattern).OfType()
.Select(match => new AbsoluteEpisodeFormat
{
Separator = match.Groups["separator"].Value.IsNotNullOrWhiteSpace() ? match.Groups["separator"].Value : "-",
@@ -1396,4 +1076,4 @@ namespace NzbDrone.Core.Organizer
Range = 4,
PrefixedRange = 5
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/UI/Settings/NetImport/Options/NetImportOptionsViewTemplate.hbs b/src/UI/Settings/NetImport/Options/NetImportOptionsViewTemplate.hbs
index ab42a0351..6e6072609 100644
--- a/src/UI/Settings/NetImport/Options/NetImportOptionsViewTemplate.hbs
+++ b/src/UI/Settings/NetImport/Options/NetImportOptionsViewTemplate.hbs
@@ -10,7 +10,7 @@
-
+