diff --git a/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/FreeSpaceSpecificationFixture.cs b/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/FreeSpaceSpecificationFixture.cs index 80f9ec530..4f1f545a4 100644 --- a/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/FreeSpaceSpecificationFixture.cs +++ b/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/FreeSpaceSpecificationFixture.cs @@ -123,14 +123,24 @@ namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Specifications [Test] public void should_skip_check_for_files_under_series_folder() { - Mocker.GetMock() - .Setup(s => s.IsParent(It.IsAny(), It.IsAny())) - .Returns(true); + _localEpisode.ExistingFile = true; Subject.IsSatisfiedBy(_localEpisode).Should().BeTrue(); Mocker.GetMock() .Verify(s => s.GetAvailableSpace(It.IsAny()), Times.Never()); } + + [Test] + public void should_return_true_if_free_space_is_null() + { + long? freeSpace = null; + + Mocker.GetMock() + .Setup(s => s.GetAvailableSpace(It.IsAny())) + .Returns(freeSpace); + + Subject.IsSatisfiedBy(_localEpisode).Should().BeTrue(); + } } } diff --git a/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/NotInUseSpecificationFixture.cs b/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/NotInUseSpecificationFixture.cs index 38562f42f..7887e40aa 100644 --- a/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/NotInUseSpecificationFixture.cs +++ b/NzbDrone.Core.Test/MediaFiles/EpisodeImport/Specifications/NotInUseSpecificationFixture.cs @@ -29,9 +29,7 @@ namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Specifications private void GivenChildOfSeries() { - Mocker.GetMock() - .Setup(s => s.IsParent(_localEpisode.Series.Path, _localEpisode.Path)) - .Returns(true); + _localEpisode.ExistingFile = true; } private void GivenNewFile() diff --git a/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/FreeSpaceSpecification.cs b/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/FreeSpaceSpecification.cs index 0bdfd812b..609a962cd 100644 --- a/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/FreeSpaceSpecification.cs +++ b/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/FreeSpaceSpecification.cs @@ -23,7 +23,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Specifications { try { - if (_diskProvider.IsParent(localEpisode.Series.Path, localEpisode.Path)) + if (localEpisode.ExistingFile) { _logger.Trace("Skipping free space check for existing episode"); return true; @@ -32,6 +32,12 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Specifications var path = Directory.GetParent(localEpisode.Series.Path); var freeSpace = _diskProvider.GetAvailableSpace(path.FullName); + if (!freeSpace.HasValue) + { + _logger.Trace("Free space check returned an invalid result for: {0}", path); + return true; + } + if (freeSpace < localEpisode.Size + 100.Megabytes()) { _logger.Warn("Not enough free space to import: {0}", localEpisode); diff --git a/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/NotInUseSpecification.cs b/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/NotInUseSpecification.cs index fb1062252..1da911a60 100644 --- a/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/NotInUseSpecification.cs +++ b/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/NotInUseSpecification.cs @@ -19,7 +19,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Specifications public bool IsSatisfiedBy(LocalEpisode localEpisode) { - if (_diskProvider.IsParent(localEpisode.Series.Path, localEpisode.Path)) + if (localEpisode.ExistingFile) { _logger.Trace("{0} is in series folder, skipping in use check", localEpisode.Path); return true; diff --git a/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/NotUnpackingSpecification.cs b/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/NotUnpackingSpecification.cs index 0f1e66d3a..b8212e12c 100644 --- a/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/NotUnpackingSpecification.cs +++ b/NzbDrone.Core/MediaFiles/EpisodeImport/Specifications/NotUnpackingSpecification.cs @@ -24,7 +24,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Specifications public bool IsSatisfiedBy(LocalEpisode localEpisode) { - if (_diskProvider.IsParent(localEpisode.Series.Path, localEpisode.Path)) + if (localEpisode.ExistingFile) { _logger.Trace("{0} is in series folder, unpacking check", localEpisode.Path); return true; diff --git a/NzbDrone.Core/Parser/Model/LocalEpisode.cs b/NzbDrone.Core/Parser/Model/LocalEpisode.cs index 3936ca4b7..06f620a96 100644 --- a/NzbDrone.Core/Parser/Model/LocalEpisode.cs +++ b/NzbDrone.Core/Parser/Model/LocalEpisode.cs @@ -7,12 +7,13 @@ namespace NzbDrone.Core.Parser.Model { public class LocalEpisode { - public string Path { get; set; } + public String Path { get; set; } public Int64 Size { get; set; } public ParsedEpisodeInfo ParsedEpisodeInfo { get; set; } public Series Series { get; set; } public List Episodes { get; set; } public QualityModel Quality { get; set; } + public Boolean ExistingFile { get; set; } public int SeasonNumber { diff --git a/NzbDrone.Core/Parser/ParsingService.cs b/NzbDrone.Core/Parser/ParsingService.cs index 44113b8a4..11b236dc1 100644 --- a/NzbDrone.Core/Parser/ParsingService.cs +++ b/NzbDrone.Core/Parser/ParsingService.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using NLog; +using NzbDrone.Common; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Tv; @@ -18,12 +19,17 @@ namespace NzbDrone.Core.Parser { private readonly IEpisodeService _episodeService; private readonly ISeriesService _seriesService; + private readonly IDiskProvider _diskProvider; private readonly Logger _logger; - public ParsingService(IEpisodeService episodeService, ISeriesService seriesService, Logger logger) + public ParsingService(IEpisodeService episodeService, + ISeriesService seriesService, + IDiskProvider diskProvider, + Logger logger) { _episodeService = episodeService; _seriesService = seriesService; + _diskProvider = diskProvider; _logger = logger; } @@ -54,7 +60,8 @@ namespace NzbDrone.Core.Parser Quality = parsedEpisodeInfo.Quality, Episodes = episodes, Path = filename, - ParsedEpisodeInfo = parsedEpisodeInfo + ParsedEpisodeInfo = parsedEpisodeInfo, + ExistingFile = _diskProvider.IsParent(series.Path, filename) }; }