diff --git a/src/NzbDrone.Common/PathEqualityComparer.cs b/src/NzbDrone.Common/PathEqualityComparer.cs index 32d6bf07c..ce55c50e8 100644 --- a/src/NzbDrone.Common/PathEqualityComparer.cs +++ b/src/NzbDrone.Common/PathEqualityComparer.cs @@ -6,6 +6,13 @@ namespace NzbDrone.Common { public class PathEqualityComparer : IEqualityComparer { + public static readonly PathEqualityComparer Instance = new PathEqualityComparer(); + + private PathEqualityComparer() + { + + } + public bool Equals(string x, string y) { return x.PathEquals(y); diff --git a/src/NzbDrone.Common/PathExtensions.cs b/src/NzbDrone.Common/PathExtensions.cs index b472178d6..5bf143796 100644 --- a/src/NzbDrone.Common/PathExtensions.cs +++ b/src/NzbDrone.Common/PathExtensions.cs @@ -40,10 +40,12 @@ namespace NzbDrone.Common { if (OsInfo.IsLinux) { + if (firstPath.Equals(secondPath)) return true; return String.Equals(firstPath.CleanFilePath(), secondPath.CleanFilePath()); } - return String.Equals(firstPath.CleanFilePath(), secondPath.CleanFilePath(), StringComparison.InvariantCultureIgnoreCase); + if (firstPath.Equals(secondPath, StringComparison.OrdinalIgnoreCase)) return true; + return String.Equals(firstPath.CleanFilePath(), secondPath.CleanFilePath(), StringComparison.OrdinalIgnoreCase); } private static readonly Regex WindowsPathWithDriveRegex = new Regex(@"^[a-zA-Z]:\\", RegexOptions.Compiled); diff --git a/src/NzbDrone.Core.Test/MediaFiles/DownloadedEpisodesImportServiceFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/DownloadedEpisodesImportServiceFixture.cs index f00c6830a..ddfcc9bbc 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/DownloadedEpisodesImportServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/DownloadedEpisodesImportServiceFixture.cs @@ -124,7 +124,7 @@ namespace NzbDrone.Core.Test.MediaFiles imported.Add(new ImportDecision(localEpisode)); Mocker.GetMock() - .Setup(s => s.GetImportDecisions(It.IsAny>(), It.IsAny(), true, null)) + .Setup(s => s.GetImportDecisions(It.IsAny>(), It.IsAny(), true, null)) .Returns(imported); Mocker.GetMock() diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index e0816dd1e..c5478ccf1 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -56,14 +56,16 @@ namespace NzbDrone.Core.MediaFiles { _logger.Debug("Creating missing series folder: {0}", series.Path); _diskProvider.CreateFolder(series.Path); - return; + } + else + { + _logger.Debug("Series folder doesn't exist: {0}", series.Path); } - _logger.Debug("Series folder doesn't exist: {0}", series.Path); return; } - var mediaFileList = GetVideoFiles(series.Path); + var mediaFileList = GetVideoFiles(series.Path).ToList(); var decisions = _importDecisionMaker.GetImportDecisions(mediaFileList, series, false); _importApprovedEpisodes.Import(decisions); diff --git a/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs b/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs index 194aaeef3..b3bcad533 100644 --- a/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs @@ -133,7 +133,7 @@ namespace NzbDrone.Core.MediaFiles private List ProcessFiles(Series series, QualityModel quality, params string[] videoFiles) { - var decisions = _importDecisionMaker.GetImportDecisions(videoFiles, series, true, quality); + var decisions = _importDecisionMaker.GetImportDecisions(videoFiles.ToList(), series, true, quality); return _importApprovedEpisodes.Import(decisions, true); } diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedEpisodes.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedEpisodes.cs index 325bf8223..0173056f9 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedEpisodes.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedEpisodes.cs @@ -38,7 +38,10 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport public List Import(List decisions, bool newDownload = false) { - var qualifiedImports = GetQualifiedImports(decisions); + var qualifiedImports = decisions.Where(c => c.Approved) + .OrderByDescending(c => c.LocalEpisode.Quality) + .ThenByDescending(c => c.LocalEpisode.Size); + var imported = new List(); foreach (var importDecision in qualifiedImports.OrderByDescending(e => e.LocalEpisode.Size)) @@ -48,9 +51,9 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport try { + //check if already imported if (imported.SelectMany(r => r.LocalEpisode.Episodes) .Select(e => e.Id) - .ToList() .Intersect(localEpisode.Episodes.Select(e => e.Id)) .Any()) { @@ -91,13 +94,5 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport return imported; } - - private List GetQualifiedImports(List decisions) - { - return decisions.Where(c => c.Approved) - .OrderByDescending(c => c.LocalEpisode.Quality) - .ThenByDescending(c => c.LocalEpisode.Size) - .ToList(); - } } } diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs index eed1da547..71ec33f0c 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs @@ -13,7 +13,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport { public interface IMakeImportDecision { - List GetImportDecisions(IEnumerable videoFiles, Series series, bool sceneSource, QualityModel quality = null); + List GetImportDecisions(List videoFiles, Series series, bool sceneSource, QualityModel quality = null); } public class ImportDecisionMaker : IMakeImportDecision @@ -38,11 +38,11 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport _logger = logger; } - public List GetImportDecisions(IEnumerable videoFiles, Series series, bool sceneSource, QualityModel quality = null) + public List GetImportDecisions(List videoFiles, Series series, bool sceneSource, QualityModel quality = null) { var newFiles = _mediaFileService.FilterExistingFiles(videoFiles.ToList(), series.Id); - _logger.Debug("Analysing {0}/{1} files.", newFiles.Count, videoFiles.Count()); + _logger.Debug("Analyzing {0}/{1} files.", newFiles.Count, videoFiles.Count()); return GetDecisions(newFiles, series, sceneSource, quality).ToList(); } diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs index a49d667df..bef1bde40 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs @@ -65,11 +65,11 @@ namespace NzbDrone.Core.MediaFiles public List FilterExistingFiles(List files, int seriesId) { - var seriesFiles = GetFilesBySeries(seriesId).Select(f => f.Path.CleanFilePath()).ToList(); + var seriesFiles = GetFilesBySeries(seriesId).Select(f => f.Path).ToList(); if (!seriesFiles.Any()) return files; - return files.Select(f => f.CleanFilePath()).Except(seriesFiles, new PathEqualityComparer()).ToList(); + return files.Except(seriesFiles, PathEqualityComparer.Instance).ToList(); } public EpisodeFile Get(int id) diff --git a/src/NzbDrone.Core/RootFolders/RootFolderService.cs b/src/NzbDrone.Core/RootFolders/RootFolderService.cs index 2173c61c6..8b3ab07c1 100644 --- a/src/NzbDrone.Core/RootFolders/RootFolderService.cs +++ b/src/NzbDrone.Core/RootFolders/RootFolderService.cs @@ -111,7 +111,7 @@ namespace NzbDrone.Core.RootFolders } var seriesFolders = _diskProvider.GetDirectories(path).ToList(); - var unmappedFolders = seriesFolders.Except(series.Select(s => s.Path), new PathEqualityComparer()).ToList(); + var unmappedFolders = seriesFolders.Except(series.Select(s => s.Path), PathEqualityComparer.Instance).ToList(); foreach (string unmappedFolder in unmappedFolders) {