From 78187b68f9d98272101722df133fc0122d6e2227 Mon Sep 17 00:00:00 2001
From: Mark McDowall <markus.mcd5@gmail.com>
Date: Wed, 26 Dec 2012 20:12:23 -0800
Subject: [PATCH] DailySeries renaming fixed

Fixed: Daily Series will be named with AirDate
#ND-112 fixed
---
 .../GetNewFilenameFixture.cs                  | 89 +++++++++++++++++++
 NzbDrone.Core/Providers/MediaFileProvider.cs  | 54 ++++++-----
 2 files changed, 123 insertions(+), 20 deletions(-)

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<ConfigProvider>();
+            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<Series>
+                    .CreateNew()
+                    .With(s => s.IsDaily = true)
+                    .With(s => s.Title = "The Daily Show with Jon Stewart")
+                    .Build();
+
+            var episodes = Builder<Episode>
+                    .CreateListOfSize(1)
+                    .All()
+                    .With(e => e.AirDate = new DateTime(2012, 12, 13))
+                    .With(e => e.Title = "Kristen Stewart")
+                    .Build();
+
+            var result = Mocker.Resolve<MediaFileProvider>()
+                               .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<ConfigProvider>();
+            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<Series>
+                    .CreateNew()
+                    .With(s => s.IsDaily = true)
+                    .With(s => s.Title = "The Daily Show with Jon Stewart")
+                    .Build();
+
+            var episodes = Builder<Episode>
+                    .CreateListOfSize(1)
+                    .All()
+                    .With(e => e.AirDate = new DateTime(2012, 12, 13))
+                    .With(e => e.Title = "Kristen Stewart")
+                    .Build();
+
+            var result = Mocker.Resolve<MediaFileProvider>()
+                               .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<ConfigProvider>();
+            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<Series>
+                    .CreateNew()
+                    .With(s => s.IsDaily = true)
+                    .With(s => s.Title = "The Daily Show with Jon Stewart")
+                    .Build();
+
+            var episodes = Builder<Episode>
+                    .CreateListOfSize(1)
+                    .All()
+                    .With(e => e.AirDate = null)
+                    .With(e => e.Title = "Kristen Stewart")
+                    .Build();
+
+            var result = Mocker.Resolve<MediaFileProvider>()
+                               .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)
             {