diff --git a/NzbDrone.Core.Test/ProviderTests/MediaFileProviderTests/GetNewFilenameFixture.cs b/NzbDrone.Core.Test/ProviderTests/MediaFileProviderTests/GetNewFilenameFixture.cs index 1f188f784..a01d64299 100644 --- a/NzbDrone.Core.Test/ProviderTests/MediaFileProviderTests/GetNewFilenameFixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/MediaFileProviderTests/GetNewFilenameFixture.cs @@ -1,7 +1,9 @@ // ReSharper disable RedundantUsingDirective +using System; using System.Collections.Generic; using System.IO; +using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; @@ -748,5 +750,92 @@ namespace NzbDrone.Core.Test.ProviderTests.MediaFileProviderTests //Assert result.Should().Be("30 Rock - S06E06-E07-E08 - Hello + World"); } + + [Test] + public void should_use_airDate_if_series_isDaily() + { + var fakeConfig = Mocker.GetMock(); + fakeConfig.SetupGet(c => c.SortingIncludeSeriesName).Returns(true); + fakeConfig.SetupGet(c => c.SortingIncludeEpisodeTitle).Returns(true); + fakeConfig.SetupGet(c => c.SortingAppendQuality).Returns(true); + fakeConfig.SetupGet(c => c.SortingSeparatorStyle).Returns(0); + fakeConfig.SetupGet(c => c.SortingNumberStyle).Returns(2); + fakeConfig.SetupGet(c => c.SortingReplaceSpaces).Returns(false); + + var series = Builder + .CreateNew() + .With(s => s.IsDaily = true) + .With(s => s.Title = "The Daily Show with Jon Stewart") + .Build(); + + var episodes = Builder + .CreateListOfSize(1) + .All() + .With(e => e.AirDate = new DateTime(2012, 12, 13)) + .With(e => e.Title = "Kristen Stewart") + .Build(); + + var result = Mocker.Resolve() + .GetNewFilename(episodes, series, QualityTypes.HDTV, false, new EpisodeFile()); + result.Should().Be("The Daily Show with Jon Stewart - 2012-12-13 - Kristen Stewart [HDTV]"); + } + + [Test] + public void should_use_airDate_if_series_isDaily_no_episode_title() + { + var fakeConfig = Mocker.GetMock(); + fakeConfig.SetupGet(c => c.SortingIncludeSeriesName).Returns(true); + fakeConfig.SetupGet(c => c.SortingIncludeEpisodeTitle).Returns(false); + fakeConfig.SetupGet(c => c.SortingAppendQuality).Returns(false); + fakeConfig.SetupGet(c => c.SortingSeparatorStyle).Returns(0); + fakeConfig.SetupGet(c => c.SortingNumberStyle).Returns(2); + fakeConfig.SetupGet(c => c.SortingReplaceSpaces).Returns(false); + + var series = Builder + .CreateNew() + .With(s => s.IsDaily = true) + .With(s => s.Title = "The Daily Show with Jon Stewart") + .Build(); + + var episodes = Builder + .CreateListOfSize(1) + .All() + .With(e => e.AirDate = new DateTime(2012, 12, 13)) + .With(e => e.Title = "Kristen Stewart") + .Build(); + + var result = Mocker.Resolve() + .GetNewFilename(episodes, series, QualityTypes.HDTV, false, new EpisodeFile()); + result.Should().Be("The Daily Show with Jon Stewart - 2012-12-13"); + } + + [Test] + public void should_set_airdate_to_unknown_if_not_available() + { + var fakeConfig = Mocker.GetMock(); + fakeConfig.SetupGet(c => c.SortingIncludeSeriesName).Returns(true); + fakeConfig.SetupGet(c => c.SortingIncludeEpisodeTitle).Returns(true); + fakeConfig.SetupGet(c => c.SortingAppendQuality).Returns(false); + fakeConfig.SetupGet(c => c.SortingSeparatorStyle).Returns(0); + fakeConfig.SetupGet(c => c.SortingNumberStyle).Returns(2); + fakeConfig.SetupGet(c => c.SortingReplaceSpaces).Returns(false); + + var series = Builder + .CreateNew() + .With(s => s.IsDaily = true) + .With(s => s.Title = "The Daily Show with Jon Stewart") + .Build(); + + var episodes = Builder + .CreateListOfSize(1) + .All() + .With(e => e.AirDate = null) + .With(e => e.Title = "Kristen Stewart") + .Build(); + + var result = Mocker.Resolve() + .GetNewFilename(episodes, series, QualityTypes.HDTV, false, new EpisodeFile()); + result.Should().Be("The Daily Show with Jon Stewart - Unknown - Kristen Stewart"); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/MediaFileProvider.cs b/NzbDrone.Core/Providers/MediaFileProvider.cs index c3819d150..9310447eb 100644 --- a/NzbDrone.Core/Providers/MediaFileProvider.cs +++ b/NzbDrone.Core/Providers/MediaFileProvider.cs @@ -174,33 +174,47 @@ namespace NzbDrone.Core.Providers result += series.Title + separatorStyle.Pattern; } - result += numberStyle.Pattern.Replace("%0e", String.Format("{0:00}", sortedEpisodes.First().EpisodeNumber)); - - if (episodes.Count > 1) + if(!series.IsDaily) { - var multiEpisodeStyle = EpisodeSortingHelper.GetMultiEpisodeStyle(_configProvider.SortingMultiEpisodeStyle); + result += numberStyle.Pattern.Replace("%0e", + String.Format("{0:00}", sortedEpisodes.First().EpisodeNumber)); - foreach (var episode in sortedEpisodes.Skip(1)) + if(episodes.Count > 1) { - if (multiEpisodeStyle.Name == "Duplicate") - { - result += separatorStyle.Pattern + numberStyle.Pattern; - } - else - { - result += multiEpisodeStyle.Pattern; - } + var multiEpisodeStyle = + EpisodeSortingHelper.GetMultiEpisodeStyle(_configProvider.SortingMultiEpisodeStyle); - result = result.Replace("%0e", String.Format("{0:00}", episode.EpisodeNumber)); - episodeNames.Add(Parser.CleanupEpisodeTitle(episode.Title)); + foreach(var episode in sortedEpisodes.Skip(1)) + { + if(multiEpisodeStyle.Name == "Duplicate") + { + result += separatorStyle.Pattern + numberStyle.Pattern; + } + else + { + result += multiEpisodeStyle.Pattern; + } + + result = result.Replace("%0e", String.Format("{0:00}", episode.EpisodeNumber)); + episodeNames.Add(Parser.CleanupEpisodeTitle(episode.Title)); + } } + + result = result + .Replace("%s", String.Format("{0}", episodes.First().SeasonNumber)) + .Replace("%0s", String.Format("{0:00}", episodes.First().SeasonNumber)) + .Replace("%x", numberStyle.EpisodeSeparator) + .Replace("%p", separatorStyle.Pattern); } - result = result - .Replace("%s", String.Format("{0}", episodes.First().SeasonNumber)) - .Replace("%0s", String.Format("{0:00}", episodes.First().SeasonNumber)) - .Replace("%x", numberStyle.EpisodeSeparator) - .Replace("%p", separatorStyle.Pattern); + else + { + if(episodes.First().AirDate.HasValue) + result += episodes.First().AirDate.Value.ToString("yyyy-MM-dd"); + + else + result += "Unknown"; + } if (_configProvider.SortingIncludeEpisodeTitle) {