diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 3985392e1..7f852ed5d 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -327,6 +327,7 @@ + diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index 492573da1..51076b228 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -5,7 +5,6 @@ using System.Text.RegularExpressions; using NLog; using NzbDrone.Core.Configuration; -using NzbDrone.Core.Datastore; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Tv; @@ -18,39 +17,7 @@ public interface IBuildFileNames string BuildFilePath(Series series, int seasonNumber, string fileName, string extension); } - public interface INamingConfigService - { - NamingConfig GetConfig(); - NamingConfig Save(NamingConfig namingConfig); - } - public class NamingConfigService : INamingConfigService - { - private readonly IBasicRepository _repository; - - public NamingConfigService(IBasicRepository repository) - { - _repository = repository; - } - - public NamingConfig GetConfig() - { - var config = _repository.SingleOrDefault(); - - if (config == null) - { - _repository.Insert(NamingConfig.Default); - config = _repository.Single(); - } - - return config; - } - - public NamingConfig Save(NamingConfig namingConfig) - { - return _repository.Upsert(namingConfig); - } - } public class FileNameBuilder : IBuildFileNames { @@ -84,9 +51,9 @@ public string BuildFilename(IList episodes, Series series, EpisodeFile return BuildFilename(episodes, series, episodeFile, nameSpec); } - public string BuildFilename(IList episodes, Series series, EpisodeFile episodeFile, NamingConfig nameSpec) + public string BuildFilename(IList episodes, Series series, EpisodeFile episodeFile, NamingConfig namingConfig) { - if (!nameSpec.RenameEpisodes) + if (!namingConfig.RenameEpisodes) { if (String.IsNullOrWhiteSpace(episodeFile.SceneName)) { @@ -96,29 +63,31 @@ public string BuildFilename(IList episodes, Series series, EpisodeFile return episodeFile.SceneName; } - if (String.IsNullOrWhiteSpace(nameSpec.StandardEpisodeFormat) && series.SeriesType == SeriesTypes.Standard) + if (String.IsNullOrWhiteSpace(namingConfig.StandardEpisodeFormat) && series.SeriesType == SeriesTypes.Standard) { throw new NamingFormatException("Standard episode format cannot be null"); } - if (String.IsNullOrWhiteSpace(nameSpec.DailyEpisodeFormat) && series.SeriesType == SeriesTypes.Daily) + if (String.IsNullOrWhiteSpace(namingConfig.DailyEpisodeFormat) && series.SeriesType == SeriesTypes.Daily) { throw new NamingFormatException("Daily episode format cannot be null"); } var sortedEpisodes = episodes.OrderBy(e => e.EpisodeNumber).ToList(); - var pattern = nameSpec.StandardEpisodeFormat; + var pattern = namingConfig.StandardEpisodeFormat; var episodeTitles = new List { Parser.Parser.CleanupEpisodeTitle(sortedEpisodes.First().Title) }; - var tokenValues = new Dictionary(new FilenameBuilderTokenEqualityComparer()); - tokenValues.Add("{Series Title}", series.Title); + var tokenValues = new Dictionary(FilenameBuilderTokenEqualityComparer.Instance) + { + {"{Series Title}", series.Title} + }; if (series.SeriesType == SeriesTypes.Daily) { - pattern = nameSpec.DailyEpisodeFormat; + pattern = namingConfig.DailyEpisodeFormat; if (!String.IsNullOrWhiteSpace(episodes.First().AirDate)) { @@ -146,7 +115,7 @@ public string BuildFilename(IList episodes, Series series, EpisodeFile foreach (var episode in sortedEpisodes.Skip(1)) { - switch ((MultiEpisodeStyle)nameSpec.MultiEpisodeStyle) + switch ((MultiEpisodeStyle)namingConfig.MultiEpisodeStyle) { case MultiEpisodeStyle.Duplicate: seasonEpisodePattern += episodeFormat.Separator + episodeFormat.SeasonEpisodePattern; @@ -194,7 +163,7 @@ public string BuildFilePath(Series series, int seasonNumber, string fileName, st else { - var tokenValues = new Dictionary(new FilenameBuilderTokenEqualityComparer()); + var tokenValues = new Dictionary(FilenameBuilderTokenEqualityComparer.Instance); tokenValues.Add("{Series Title}", series.Title); seasonFolder = ReplaceSeasonTokens(_configService.SeasonFolderFormat, seasonNumber); @@ -275,38 +244,6 @@ private string ReplaceNumberToken(string token, int value) return value.ToString().PadLeft(zeroCount + 1, '0'); } - private static readonly List MultiEpisodeStyles = new List - { - new EpisodeSortingType - { - Id = 0, - Name = "Extend", - Pattern = "-%0e" - }, - new EpisodeSortingType - { - Id = 1, - Name = "Duplicate", - Pattern = "%p%0s%x%0e" - }, - new EpisodeSortingType - { - Id = 2, - Name = "Repeat", - Pattern = "%x%0e" - }, - new EpisodeSortingType - { - Id = 3, - Name = "Scene", - Pattern = "-%x%0e" - } - }; - - private static EpisodeSortingType GetMultiEpisodeStyle(int id) - { - return MultiEpisodeStyles.Single(s => s.Id == id); - } } public enum MultiEpisodeStyle diff --git a/src/NzbDrone.Core/Organizer/FilenameBuilderTokenEqualityComparer.cs b/src/NzbDrone.Core/Organizer/FilenameBuilderTokenEqualityComparer.cs index a8ba17a23..16b225131 100644 --- a/src/NzbDrone.Core/Organizer/FilenameBuilderTokenEqualityComparer.cs +++ b/src/NzbDrone.Core/Organizer/FilenameBuilderTokenEqualityComparer.cs @@ -6,8 +6,15 @@ namespace NzbDrone.Core.Organizer { public class FilenameBuilderTokenEqualityComparer : IEqualityComparer { + public static readonly FilenameBuilderTokenEqualityComparer Instance = new FilenameBuilderTokenEqualityComparer(); + private static readonly Regex SimpleTokenRegex = new Regex(@"\s|_|\W", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private FilenameBuilderTokenEqualityComparer() + { + + } + public bool Equals(String s1, String s2) { return SimplifyToken(s1).Equals(SimplifyToken(s2)); @@ -18,7 +25,7 @@ public int GetHashCode(String str) return SimplifyToken(str).GetHashCode(); } - private string SimplifyToken(string token) + private static string SimplifyToken(string token) { return SimpleTokenRegex.Replace(token, String.Empty).ToLower(); } diff --git a/src/NzbDrone.Core/Organizer/NamingConfigService.cs b/src/NzbDrone.Core/Organizer/NamingConfigService.cs new file mode 100644 index 000000000..113ef030a --- /dev/null +++ b/src/NzbDrone.Core/Organizer/NamingConfigService.cs @@ -0,0 +1,38 @@ +using NzbDrone.Core.Datastore; + +namespace NzbDrone.Core.Organizer +{ + public interface INamingConfigService + { + NamingConfig GetConfig(); + void Save(NamingConfig namingConfig); + } + + public class NamingConfigService : INamingConfigService + { + private readonly IBasicRepository _repository; + + public NamingConfigService(IBasicRepository repository) + { + _repository = repository; + } + + public NamingConfig GetConfig() + { + var config = _repository.SingleOrDefault(); + + if (config == null) + { + _repository.Insert(NamingConfig.Default); + config = _repository.Single(); + } + + return config; + } + + public void Save(NamingConfig namingConfig) + { + _repository.Upsert(namingConfig); + } + } +} \ No newline at end of file