diff --git a/src/NzbDrone.Api/Config/DownloadClientConfigModule.cs b/src/NzbDrone.Api/Config/DownloadClientConfigModule.cs index c504ffe08..3e19e7564 100644 --- a/src/NzbDrone.Api/Config/DownloadClientConfigModule.cs +++ b/src/NzbDrone.Api/Config/DownloadClientConfigModule.cs @@ -1,4 +1,4 @@ -using FluentValidation; +using FluentValidation; using NzbDrone.Core.Configuration; using NzbDrone.Core.Validation.Paths; @@ -6,19 +6,10 @@ namespace NzbDrone.Api.Config { public class DownloadClientConfigModule : NzbDroneConfigModule { - public DownloadClientConfigModule(IConfigService configService, - RootFolderValidator rootFolderValidator, - PathExistsValidator pathExistsValidator, - MappedNetworkDriveValidator mappedNetworkDriveValidator) + public DownloadClientConfigModule(IConfigService configService) : base(configService) { - SharedValidator.RuleFor(c => c.DownloadedAlbumsFolder) - .Cascade(CascadeMode.StopOnFirstFailure) - .IsValidPath() - .SetValidator(rootFolderValidator) - .SetValidator(mappedNetworkDriveValidator) - .SetValidator(pathExistsValidator) - .When(c => !string.IsNullOrWhiteSpace(c.DownloadedAlbumsFolder)); + } protected override DownloadClientConfigResource ToResource(IConfigService model) @@ -26,4 +17,4 @@ namespace NzbDrone.Api.Config return DownloadClientConfigResourceMapper.ToResource(model); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Api/Config/DownloadClientConfigResource.cs b/src/NzbDrone.Api/Config/DownloadClientConfigResource.cs index 3ad22e818..836c4d29a 100644 --- a/src/NzbDrone.Api/Config/DownloadClientConfigResource.cs +++ b/src/NzbDrone.Api/Config/DownloadClientConfigResource.cs @@ -5,9 +5,7 @@ namespace NzbDrone.Api.Config { public class DownloadClientConfigResource : RestResource { - public string DownloadedAlbumsFolder { get; set; } public string DownloadClientWorkingFolders { get; set; } - public int DownloadedAlbumsScanInterval { get; set; } public bool EnableCompletedDownloadHandling { get; set; } public bool RemoveCompletedDownloads { get; set; } @@ -22,9 +20,7 @@ namespace NzbDrone.Api.Config { return new DownloadClientConfigResource { - DownloadedAlbumsFolder = model.DownloadedAlbumsFolder, DownloadClientWorkingFolders = model.DownloadClientWorkingFolders, - DownloadedAlbumsScanInterval = model.DownloadedAlbumsScanInterval, EnableCompletedDownloadHandling = model.EnableCompletedDownloadHandling, RemoveCompletedDownloads = model.RemoveCompletedDownloads, diff --git a/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs index e92dba2ad..53d38eaed 100644 --- a/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs +++ b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -101,34 +101,5 @@ namespace NzbDrone.Core.Test.DiskSpace Mocker.GetMock() .Verify(v => v.GetAvailableSpace(It.IsAny()), Times.Never()); } - - [Test] - public void should_check_diskspace_for_dronefactory_folder() - { - Mocker.GetMock() - .SetupGet(v => v.DownloadedAlbumsFolder) - .Returns(_droneFactoryFolder); - - GivenExistingFolder(_droneFactoryFolder); - - var freeSpace = Subject.GetFreeSpace(); - - freeSpace.Should().NotBeEmpty(); - } - - [Test] - public void should_not_check_diskspace_for_missing_dronefactory_folder() - { - Mocker.GetMock() - .SetupGet(v => v.DownloadedAlbumsFolder) - .Returns(_droneFactoryFolder); - - var freeSpace = Subject.GetFreeSpace(); - - freeSpace.Should().BeEmpty(); - - Mocker.GetMock() - .Verify(v => v.GetAvailableSpace(It.IsAny()), Times.Never()); - } } } diff --git a/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceFixture.cs b/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceFixture.cs index 164120012..364667196 100644 --- a/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceFixture.cs +++ b/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceFixture.cs @@ -35,12 +35,12 @@ namespace NzbDrone.Core.Test.Download .With(h => h.Title = "Drone.S01E01.HDTV") .Build(); - var remoteEpisode = BuildRemoteEpisode(); + var remoteAlbum = BuildRemoteAlbum(); _trackedDownload = Builder.CreateNew() .With(c => c.State = TrackedDownloadStage.Downloading) .With(c => c.DownloadItem = completed) - .With(c => c.RemoteEpisode = remoteEpisode) + .With(c => c.RemoteAlbum = remoteAlbum) .Build(); @@ -57,17 +57,17 @@ namespace NzbDrone.Core.Test.Download .Returns(new History.History()); Mocker.GetMock() - .Setup(s => s.GetSeries("Drone.S01E01.HDTV")) - .Returns(remoteEpisode.Series); + .Setup(s => s.GetArtist("Drone.S01E01.HDTV")) + .Returns(remoteAlbum.Artist); } - private RemoteEpisode BuildRemoteEpisode() + private RemoteAlbum BuildRemoteAlbum() { - return new RemoteEpisode + return new RemoteAlbum { - Series = new Series(), - Episodes = new List { new Episode { Id = 1 } } + Artist = new Artist(), + Albums = new List { new Album { Id = 1 } } }; } @@ -81,8 +81,8 @@ namespace NzbDrone.Core.Test.Download private void GivenSuccessfulImport() { - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult(new ImportDecision(new LocalTrack() { Path = @"C:\TestPath\Droned.S01E01.mkv" })) @@ -99,19 +99,19 @@ namespace NzbDrone.Core.Test.Download .Returns(new History.History() { SourceTitle = "Droned S01E01" }); Mocker.GetMock() - .Setup(s => s.GetSeries(It.IsAny())) - .Returns((Series)null); + .Setup(s => s.GetArtist(It.IsAny())) + .Returns((Artist)null); Mocker.GetMock() - .Setup(s => s.GetSeries("Droned S01E01")) - .Returns(BuildRemoteEpisode().Series); + .Setup(s => s.GetArtist("Droned S01E01")) + .Returns(BuildRemoteAlbum().Artist); } - private void GivenSeriesMatch() + private void GivenArtistMatch() { Mocker.GetMock() - .Setup(s => s.GetSeries(It.IsAny())) - .Returns(_trackedDownload.RemoteEpisode.Series); + .Setup(s => s.GetArtist(It.IsAny())) + .Returns(_trackedDownload.RemoteAlbum.Artist); } [TestCase(DownloadItemStatus.Downloading)] @@ -144,7 +144,7 @@ namespace NzbDrone.Core.Test.Download { _trackedDownload.DownloadItem.Category = "tv"; GivenNoGrabbedHistory(); - GivenSeriesMatch(); + GivenArtistMatch(); GivenSuccessfulImport(); Subject.Process(_trackedDownload); @@ -152,20 +152,6 @@ namespace NzbDrone.Core.Test.Download AssertCompletedDownload(); } - [Test] - public void should_not_process_if_storage_directory_in_drone_factory() - { - Mocker.GetMock() - .SetupGet(v => v.DownloadedAlbumsFolder) - .Returns(@"C:\DropFolder".AsOsAgnostic()); - - _trackedDownload.DownloadItem.OutputPath = new OsPath(@"C:\DropFolder\SomeOtherFolder".AsOsAgnostic()); - - Subject.Process(_trackedDownload); - - AssertNoAttemptedImport(); - } - [Test] public void should_not_process_if_output_path_is_empty() { @@ -179,8 +165,8 @@ namespace NzbDrone.Core.Test.Download [Test] public void should_mark_as_imported_if_all_episodes_were_imported() { - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult( @@ -200,8 +186,8 @@ namespace NzbDrone.Core.Test.Download [Test] public void should_not_mark_as_imported_if_all_files_were_rejected() { - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult( @@ -224,8 +210,8 @@ namespace NzbDrone.Core.Test.Download [Test] public void should_not_mark_as_imported_if_no_episodes_were_parsed() { - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult( @@ -237,7 +223,7 @@ namespace NzbDrone.Core.Test.Download new LocalTrack {Path = @"C:\TestPath\Droned.S01E02.mkv"},new Rejection("Rejected!")), "Test Failure") }); - _trackedDownload.RemoteEpisode.Episodes.Clear(); + _trackedDownload.RemoteAlbum.Albums.Clear(); Subject.Process(_trackedDownload); @@ -247,8 +233,8 @@ namespace NzbDrone.Core.Test.Download [Test] public void should_not_mark_as_imported_if_all_files_were_skipped() { - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult(new ImportDecision(new LocalTrack {Path = @"C:\TestPath\Droned.S01E01.mkv"}),"Test Failure"), @@ -264,15 +250,15 @@ namespace NzbDrone.Core.Test.Download [Test] public void should_mark_as_imported_if_all_episodes_were_imported_but_extra_files_were_not() { - GivenSeriesMatch(); + GivenArtistMatch(); - _trackedDownload.RemoteEpisode.Episodes = new List + _trackedDownload.RemoteAlbum.Albums = new List { - new Episode() + new Album() }; - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult(new ImportDecision(new LocalTrack {Path = @"C:\TestPath\Droned.S01E01.mkv"})), @@ -287,15 +273,15 @@ namespace NzbDrone.Core.Test.Download [Test] public void should_mark_as_failed_if_some_of_episodes_were_not_imported() { - _trackedDownload.RemoteEpisode.Episodes = new List + _trackedDownload.RemoteAlbum.Albums = new List { - new Episode(), - new Episode(), - new Episode() + new Album(), + new Album(), + new Album() }; - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult(new ImportDecision(new LocalTrack {Path = @"C:\TestPath\Droned.S01E01.mkv"})), @@ -314,16 +300,16 @@ namespace NzbDrone.Core.Test.Download { GivenABadlyNamedDownload(); - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult(new ImportDecision(new LocalTrack {Path = @"C:\TestPath\Droned.S01E01.mkv"})) }); - Mocker.GetMock() - .Setup(v => v.GetSeries(It.IsAny())) - .Returns(BuildRemoteEpisode().Series); + Mocker.GetMock() + .Setup(v => v.GetArtist(It.IsAny())) + .Returns(BuildRemoteAlbum().Artist); Subject.Process(_trackedDownload); @@ -335,8 +321,8 @@ namespace NzbDrone.Core.Test.Download { GivenABadlyNamedDownload(); - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult(new ImportDecision(new LocalTrack {Path = @"C:\TestPath\Droned.S01E01.mkv"})) @@ -354,8 +340,8 @@ namespace NzbDrone.Core.Test.Download public void should_not_import_when_there_is_a_title_mismatch() { Mocker.GetMock() - .Setup(s => s.GetSeries("Drone.S01E01.HDTV")) - .Returns((Series)null); + .Setup(s => s.GetArtist("Drone.S01E01.HDTV")) + .Returns((Artist)null); Subject.Process(_trackedDownload); @@ -365,13 +351,13 @@ namespace NzbDrone.Core.Test.Download [Test] public void should_mark_as_import_title_mismatch_if_ignore_warnings_is_true() { - _trackedDownload.RemoteEpisode.Episodes = new List + _trackedDownload.RemoteAlbum.Albums = new List { - new Episode() + new Album() }; - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { new ImportResult(new ImportDecision(new LocalTrack {Path = @"C:\TestPath\Droned.S01E01.mkv"})) @@ -408,8 +394,8 @@ namespace NzbDrone.Core.Test.Download private void AssertNoAttemptedImport() { - Mocker.GetMock() - .Verify(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); + Mocker.GetMock() + .Verify(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); AssertNoCompletedDownload(); } @@ -424,8 +410,8 @@ namespace NzbDrone.Core.Test.Download private void AssertCompletedDownload() { - Mocker.GetMock() - .Verify(v => v.ProcessPath(_trackedDownload.DownloadItem.OutputPath.FullPath, ImportMode.Auto, _trackedDownload.RemoteEpisode.Series, _trackedDownload.DownloadItem), Times.Once()); + Mocker.GetMock() + .Verify(v => v.ProcessPath(_trackedDownload.DownloadItem.OutputPath.FullPath, ImportMode.Auto, _trackedDownload.RemoteAlbum.Artist, _trackedDownload.DownloadItem), Times.Once()); Mocker.GetMock() .Verify(v => v.PublishEvent(It.IsAny()), Times.Once()); diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs index a27cfc6b4..97aacaf56 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.IO; using System.Net; using Moq; using NUnit.Framework; using NzbDrone.Common.Http; -using NzbDrone.Core.Configuration; using NzbDrone.Core.Download; using NzbDrone.Core.Download.Clients.Pneumatic; using NzbDrone.Core.Parser.Model; @@ -19,9 +18,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests private const string _nzbUrl = "http://www.nzbs.com/url"; private const string _title = "30.Rock.S01E05.hdtv.xvid-LoL"; private string _pneumaticFolder; - private string _sabDrop; + private string _strmFolder; private string _nzbPath; - private RemoteAlbum _remoteEpisode; + private RemoteAlbum _remoteAlbum; [SetUp] public void Setup() @@ -29,21 +28,20 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests _pneumaticFolder = @"d:\nzb\pneumatic\".AsOsAgnostic(); _nzbPath = Path.Combine(_pneumaticFolder, _title + ".nzb").AsOsAgnostic(); - _sabDrop = @"d:\unsorted tv\".AsOsAgnostic(); + _strmFolder = @"d:\unsorted tv\".AsOsAgnostic(); - Mocker.GetMock().SetupGet(c => c.DownloadedAlbumsFolder).Returns(_sabDrop); + _remoteAlbum = new RemoteAlbum(); + _remoteAlbum.Release = new ReleaseInfo(); + _remoteAlbum.Release.Title = _title; + _remoteAlbum.Release.DownloadUrl = _nzbUrl; - _remoteEpisode = new RemoteAlbum(); - _remoteEpisode.Release = new ReleaseInfo(); - _remoteEpisode.Release.Title = _title; - _remoteEpisode.Release.DownloadUrl = _nzbUrl; - - _remoteEpisode.ParsedAlbumInfo = new ParsedAlbumInfo(); + _remoteAlbum.ParsedAlbumInfo = new ParsedAlbumInfo(); Subject.Definition = new DownloadClientDefinition(); Subject.Definition.Settings = new PneumaticSettings { - NzbFolder = _pneumaticFolder + NzbFolder = _pneumaticFolder, + StrmFolder = _strmFolder }; } @@ -55,26 +53,25 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests [Test] public void should_download_file_if_it_doesnt_exist() { - Subject.Download(_remoteEpisode); + Subject.Download(_remoteAlbum); Mocker.GetMock().Verify(c => c.DownloadFile(_nzbUrl, _nzbPath), Times.Once()); } - [Test] public void should_throw_on_failed_download() { WithFailedDownload(); - Assert.Throws(() => Subject.Download(_remoteEpisode)); + Assert.Throws(() => Subject.Download(_remoteAlbum)); } [Test] public void should_throw_if_full_season_download() { - _remoteEpisode.Release.Title = "30 Rock - Season 1"; + _remoteAlbum.Release.Title = "30 Rock - Season 1"; - Assert.Throws(() => Subject.Download(_remoteEpisode)); + Assert.Throws(() => Subject.Download(_remoteAlbum)); } [Test] @@ -88,9 +85,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests { var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]"; var expectedFilename = Path.Combine(_pneumaticFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV].nzb"); - _remoteEpisode.Release.Title = illegalTitle; + _remoteAlbum.Release.Title = illegalTitle; - Subject.Download(_remoteEpisode); + Subject.Download(_remoteAlbum); Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), expectedFilename), Times.Once()); } diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/DroneFactoryCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/DroneFactoryCheckFixture.cs deleted file mode 100644 index 8f1224ad5..000000000 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/DroneFactoryCheckFixture.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Moq; -using NUnit.Framework; -using NzbDrone.Common.Disk; -using NzbDrone.Core.Configuration; -using NzbDrone.Core.HealthCheck.Checks; -using NzbDrone.Core.Test.Framework; - -namespace NzbDrone.Core.Test.HealthCheck.Checks -{ - [TestFixture] - public class DroneFactoryCheckFixture : CoreTest - { - private const string DRONE_FACTORY_FOLDER = @"C:\Test\Unsorted"; - - private void GivenDroneFactoryFolder(bool exists = false, bool writable = true) - { - Mocker.GetMock() - .SetupGet(s => s.DownloadedAlbumsFolder) - .Returns(DRONE_FACTORY_FOLDER); - - Mocker.GetMock() - .Setup(s => s.FolderExists(DRONE_FACTORY_FOLDER)) - .Returns(exists); - - Mocker.GetMock() - .Setup(s => s.FolderWritable(It.IsAny())) - .Returns(exists && writable); - } - - [Test] - public void should_return_error_when_drone_factory_folder_does_not_exist() - { - GivenDroneFactoryFolder(); - - Subject.Check().ShouldBeError(); - } - - [Test] - public void should_return_error_when_unable_to_write_to_drone_factory_folder() - { - GivenDroneFactoryFolder(true, false); - - Subject.Check().ShouldBeError(); - } - - [Test] - public void should_return_ok_when_no_issues_found() - { - GivenDroneFactoryFolder(true); - - Subject.Check().ShouldBeOk(); - } - } -} diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/ImportMechanismCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/ImportMechanismCheckFixture.cs index 49be9e435..060076142 100644 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/ImportMechanismCheckFixture.cs +++ b/src/NzbDrone.Core.Test/HealthCheck/Checks/ImportMechanismCheckFixture.cs @@ -1,4 +1,4 @@ -using NUnit.Framework; +using NUnit.Framework; using NzbDrone.Common.Disk; using NzbDrone.Core.Configuration; using NzbDrone.Core.HealthCheck.Checks; @@ -10,8 +10,6 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks [TestFixture] public class ImportMechanismCheckFixture : CoreTest { - private const string DRONE_FACTORY_FOLDER = @"C:\Test\Unsorted"; - private void GivenCompletedDownloadHandling(bool? enabled = null) { @@ -27,17 +25,6 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks } } - private void GivenDroneFactoryFolder(bool exists = false) - { - Mocker.GetMock() - .SetupGet(s => s.DownloadedAlbumsFolder) - .Returns(DRONE_FACTORY_FOLDER.AsOsAgnostic()); - - Mocker.GetMock() - .Setup(s => s.FolderExists(DRONE_FACTORY_FOLDER.AsOsAgnostic())) - .Returns(exists); - } - [Test] public void should_return_warning_when_completed_download_handling_not_configured() { @@ -56,7 +43,6 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks public void should_return_ok_when_no_issues_found() { GivenCompletedDownloadHandling(true); - GivenDroneFactoryFolder(true); Subject.Check().ShouldBeOk(); } diff --git a/src/NzbDrone.Core.Test/MediaFiles/DownloadedAlbumsCommandServiceFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/DownloadedAlbumsCommandServiceFixture.cs index 0bb230743..a5360f84c 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/DownloadedAlbumsCommandServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/DownloadedAlbumsCommandServiceFixture.cs @@ -1,10 +1,10 @@ +using System; using System.Collections.Generic; using System.IO; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; -using NzbDrone.Core.Configuration; using NzbDrone.Core.Download; using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.MediaFiles; @@ -12,7 +12,7 @@ using NzbDrone.Core.MediaFiles.Commands; using NzbDrone.Core.MediaFiles.TrackImport; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; -using NzbDrone.Core.Tv; +using NzbDrone.Core.Music; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.MediaFiles @@ -20,7 +20,6 @@ namespace NzbDrone.Core.Test.MediaFiles [TestFixture] public class DownloadedAlbumsCommandServiceFixture : CoreTest { - private string _droneFactory = "c:\\drop\\".AsOsAgnostic(); private string _downloadFolder = "c:\\drop_other\\Show.S01E01\\".AsOsAgnostic(); private string _downloadFile = "c:\\drop_other\\Show.S01E01.mkv".AsOsAgnostic(); @@ -29,15 +28,13 @@ namespace NzbDrone.Core.Test.MediaFiles [SetUp] public void Setup() { - Mocker.GetMock().SetupGet(c => c.DownloadedAlbumsFolder) - .Returns(_droneFactory); - Mocker.GetMock() + Mocker.GetMock() .Setup(v => v.ProcessRootFolder(It.IsAny())) .Returns(new List()); - Mocker.GetMock() - .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + Mocker.GetMock() + .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List()); var downloadItem = Builder.CreateNew() @@ -45,14 +42,14 @@ namespace NzbDrone.Core.Test.MediaFiles .With(v => v.Status = DownloadItemStatus.Downloading) .Build(); - var remoteEpisode = Builder.CreateNew() - .With(v => v.Series = new Series()) + var remoteAlbum = Builder.CreateNew() + .With(v => v.Artist = new Artist()) .Build(); _trackedDownload = new TrackedDownload { DownloadItem = downloadItem, - RemoteEpisode = remoteEpisode, + RemoteAlbum = remoteAlbum, State = TrackedDownloadStage.Downloading }; } @@ -76,35 +73,15 @@ namespace NzbDrone.Core.Test.MediaFiles .Returns(_trackedDownload); } - [Test] - public void should_process_dronefactory_if_path_is_not_specified() - { - GivenExistingFolder(_droneFactory); - - Subject.Execute(new DownloadedAlbumsScanCommand()); - - Mocker.GetMock().Verify(c => c.ProcessRootFolder(It.IsAny()), Times.Once()); - } - [Test] public void should_skip_import_if_dronefactory_doesnt_exist() { - Subject.Execute(new DownloadedAlbumsScanCommand()); + Assert.Throws(() => Subject.Execute(new DownloadedAlbumsScanCommand())); - Mocker.GetMock().Verify(c => c.ProcessRootFolder(It.IsAny()), Times.Never()); + Mocker.GetMock().Verify(c => c.ProcessRootFolder(It.IsAny()), Times.Never()); - ExceptionVerification.ExpectedWarns(1); } - [Test] - public void should_ignore_downloadclientid_if_path_is_not_specified() - { - GivenExistingFolder(_droneFactory); - - Subject.Execute(new DownloadedAlbumsScanCommand() { DownloadClientId = "sab1" }); - - Mocker.GetMock().Verify(c => c.ProcessRootFolder(It.IsAny()), Times.Once()); - } [Test] public void should_process_folder_if_downloadclientid_is_not_specified() @@ -113,7 +90,7 @@ namespace NzbDrone.Core.Test.MediaFiles Subject.Execute(new DownloadedAlbumsScanCommand() { Path = _downloadFolder }); - Mocker.GetMock().Verify(c => c.ProcessPath(It.IsAny(), ImportMode.Auto, null, null), Times.Once()); + Mocker.GetMock().Verify(c => c.ProcessPath(It.IsAny(), ImportMode.Auto, null, null), Times.Once()); } [Test] @@ -123,7 +100,7 @@ namespace NzbDrone.Core.Test.MediaFiles Subject.Execute(new DownloadedAlbumsScanCommand() { Path = _downloadFile }); - Mocker.GetMock().Verify(c => c.ProcessPath(It.IsAny(), ImportMode.Auto, null, null), Times.Once()); + Mocker.GetMock().Verify(c => c.ProcessPath(It.IsAny(), ImportMode.Auto, null, null), Times.Once()); } [Test] @@ -134,7 +111,7 @@ namespace NzbDrone.Core.Test.MediaFiles Subject.Execute(new DownloadedAlbumsScanCommand() { Path = _downloadFolder, DownloadClientId = "sab1" }); - Mocker.GetMock().Verify(c => c.ProcessPath(_downloadFolder, ImportMode.Auto, _trackedDownload.RemoteEpisode.Series, _trackedDownload.DownloadItem), Times.Once()); + Mocker.GetMock().Verify(c => c.ProcessPath(_downloadFolder, ImportMode.Auto, _trackedDownload.RemoteAlbum.Artist, _trackedDownload.DownloadItem), Times.Once()); } [Test] @@ -144,7 +121,7 @@ namespace NzbDrone.Core.Test.MediaFiles Subject.Execute(new DownloadedAlbumsScanCommand() { Path = _downloadFolder, DownloadClientId = "sab1" }); - Mocker.GetMock().Verify(c => c.ProcessPath(_downloadFolder, ImportMode.Auto, null, null), Times.Once()); + Mocker.GetMock().Verify(c => c.ProcessPath(_downloadFolder, ImportMode.Auto, null, null), Times.Once()); ExceptionVerification.ExpectedWarns(1); } @@ -154,7 +131,7 @@ namespace NzbDrone.Core.Test.MediaFiles { Subject.Execute(new DownloadedAlbumsScanCommand() { Path = _downloadFolder }); - Mocker.GetMock().Verify(c => c.ProcessPath(It.IsAny(), ImportMode.Auto, null, null), Times.Never()); + Mocker.GetMock().Verify(c => c.ProcessPath(It.IsAny(), ImportMode.Auto, null, null), Times.Never()); ExceptionVerification.ExpectedWarns(1); } @@ -166,7 +143,7 @@ namespace NzbDrone.Core.Test.MediaFiles Subject.Execute(new DownloadedAlbumsScanCommand() { Path = _downloadFile, ImportMode = ImportMode.Copy }); - Mocker.GetMock().Verify(c => c.ProcessPath(It.IsAny(), ImportMode.Copy, null, null), Times.Once()); + Mocker.GetMock().Verify(c => c.ProcessPath(It.IsAny(), ImportMode.Copy, null, null), Times.Once()); } } } diff --git a/src/NzbDrone.Core.Test/MediaFiles/DownloadedEpisodesImportServiceFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/DownloadedTracksImportServiceFixture.cs similarity index 80% rename from src/NzbDrone.Core.Test/MediaFiles/DownloadedEpisodesImportServiceFixture.cs rename to src/NzbDrone.Core.Test/MediaFiles/DownloadedTracksImportServiceFixture.cs index d2d517caa..5bfe5230e 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/DownloadedEpisodesImportServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/DownloadedTracksImportServiceFixture.cs @@ -11,7 +11,6 @@ using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.Framework; -using NzbDrone.Core.Tv; using NzbDrone.Core.Music; using NzbDrone.Test.Common; using FluentAssertions; @@ -19,7 +18,7 @@ using FluentAssertions; namespace NzbDrone.Core.Test.MediaFiles { [TestFixture] - public class DownloadedTracksImportServiceFixture : CoreTest + public class DownloadedTracksImportServiceFixture : CoreTest { private string _droneFactory = "c:\\drop\\".AsOsAgnostic(); private string[] _subFolders = new[] { "c:\\root\\foldername".AsOsAgnostic() }; @@ -42,25 +41,25 @@ namespace NzbDrone.Core.Test.MediaFiles .Returns(new List()); } - private void GivenValidSeries() + private void GivenValidArtist() { Mocker.GetMock() - .Setup(s => s.GetSeries(It.IsAny())) - .Returns(Builder.CreateNew().Build()); + .Setup(s => s.GetArtist(It.IsAny())) + .Returns(Builder.CreateNew().Build()); } [Test] - public void should_search_for_series_using_folder_name() + public void should_search_for_artist_using_folder_name() { Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory)); - Mocker.GetMock().Verify(c => c.GetSeries("foldername"), Times.Once()); + Mocker.GetMock().Verify(c => c.GetArtist("foldername"), Times.Once()); } [Test] public void should_skip_if_file_is_in_use_by_another_process() { - GivenValidSeries(); + GivenValidArtist(); Mocker.GetMock().Setup(c => c.IsFileLocked(It.IsAny())) .Returns(true); @@ -71,9 +70,9 @@ namespace NzbDrone.Core.Test.MediaFiles } [Test] - public void should_skip_if_no_series_found() + public void should_skip_if_no_artist_found() { - Mocker.GetMock().Setup(c => c.GetSeries("foldername")).Returns((Series)null); + Mocker.GetMock().Setup(c => c.GetArtist("foldername")).Returns((Artist)null); Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory)); @@ -85,12 +84,12 @@ namespace NzbDrone.Core.Test.MediaFiles } [Test] - public void should_not_import_if_folder_is_a_series_path() + public void should_not_import_if_folder_is_a_artist_path() { - GivenValidSeries(); + GivenValidArtist(); - Mocker.GetMock() - .Setup(s => s.SeriesPathExists(It.IsAny())) + Mocker.GetMock() + .Setup(s => s.ArtistPathExists(It.IsAny())) .Returns(true); Mocker.GetMock() @@ -108,7 +107,7 @@ namespace NzbDrone.Core.Test.MediaFiles [Test] public void should_not_delete_folder_if_no_files_were_imported() { - Mocker.GetMock() + Mocker.GetMock() .Setup(s => s.Import(It.IsAny>(), false, null, ImportMode.Auto)) .Returns(new List()); @@ -121,18 +120,18 @@ namespace NzbDrone.Core.Test.MediaFiles [Test] public void should_not_delete_folder_if_files_were_imported_and_video_files_remain() { - GivenValidSeries(); + GivenValidArtist(); - var localEpisode = new LocalTrack(); + var localTrack = new LocalTrack(); var imported = new List(); - imported.Add(new ImportDecision(localEpisode)); + imported.Add(new ImportDecision(localTrack)); Mocker.GetMock() .Setup(s => s.GetImportDecisions(It.IsAny>(), It.IsAny(), null)) .Returns(imported); - Mocker.GetMock() + Mocker.GetMock() .Setup(s => s.Import(It.IsAny>(), true, null, ImportMode.Auto)) .Returns(imported.Select(i => new ImportResult(i)).ToList()); @@ -147,7 +146,7 @@ namespace NzbDrone.Core.Test.MediaFiles [Test] public void should_delete_folder_if_files_were_imported_and_only_sample_files_remain() { - GivenValidSeries(); + GivenValidArtist(); var localEpisode = new LocalTrack(); @@ -158,17 +157,17 @@ namespace NzbDrone.Core.Test.MediaFiles .Setup(s => s.GetImportDecisions(It.IsAny>(), It.IsAny(), null)) .Returns(imported); - Mocker.GetMock() + Mocker.GetMock() .Setup(s => s.Import(It.IsAny>(), true, null, ImportMode.Auto)) .Returns(imported.Select(i => new ImportResult(i)).ToList()); - Mocker.GetMock() - .Setup(s => s.IsSample(It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(true); + //Mocker.GetMock() + // .Setup(s => s.IsSample(It.IsAny(), + // It.IsAny(), + // It.IsAny(), + // It.IsAny(), + // It.IsAny())) + // .Returns(true); Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory)); @@ -190,14 +189,14 @@ namespace NzbDrone.Core.Test.MediaFiles Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory)); Mocker.GetMock() - .Verify(v => v.GetSeries(folderName), Times.Once()); + .Verify(v => v.GetArtist(folderName), Times.Once()); Mocker.GetMock() - .Verify(v => v.GetSeries(It.Is(s => s.StartsWith(prefix))), Times.Never()); + .Verify(v => v.GetArtist(It.Is(s => s.StartsWith(prefix))), Times.Never()); } [Test] - public void should_return_importresult_on_unknown_series() + public void should_return_importresult_on_unknown_artist() { Mocker.GetMock().Setup(c => c.FolderExists(It.IsAny())) .Returns(false); @@ -219,7 +218,7 @@ namespace NzbDrone.Core.Test.MediaFiles [Test] public void should_not_delete_if_there_is_large_rar_file() { - GivenValidSeries(); + GivenValidArtist(); var localEpisode = new LocalTrack(); @@ -230,17 +229,17 @@ namespace NzbDrone.Core.Test.MediaFiles .Setup(s => s.GetImportDecisions(It.IsAny>(), It.IsAny(), null)) .Returns(imported); - Mocker.GetMock() + Mocker.GetMock() .Setup(s => s.Import(It.IsAny>(), true, null, ImportMode.Auto)) .Returns(imported.Select(i => new ImportResult(i)).ToList()); - Mocker.GetMock() - .Setup(s => s.IsSample(It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(true); + //Mocker.GetMock() + // .Setup(s => s.IsSample(It.IsAny(), + // It.IsAny(), + // It.IsAny(), + // It.IsAny(), + // It.IsAny())) + // .Returns(true); Mocker.GetMock() .Setup(s => s.GetFiles(It.IsAny(), SearchOption.AllDirectories)) @@ -261,7 +260,7 @@ namespace NzbDrone.Core.Test.MediaFiles [Test] public void should_use_folder_if_folder_import() { - GivenValidSeries(); + GivenValidArtist(); var folderName = @"C:\media\ba09030e-1234-1234-1234-123456789abc\[HorribleSubs] Maria the Virgin Witch - 09 [720p]".AsOsAgnostic(); var fileName = @"C:\media\ba09030e-1234-1234-1234-123456789abc\[HorribleSubs] Maria the Virgin Witch - 09 [720p]\[HorribleSubs] Maria the Virgin Witch - 09 [720p].mkv".AsOsAgnostic(); @@ -287,7 +286,7 @@ namespace NzbDrone.Core.Test.MediaFiles [Test] public void should_not_use_folder_if_file_import() { - GivenValidSeries(); + GivenValidArtist(); var fileName = @"C:\media\ba09030e-1234-1234-1234-123456789abc\Torrents\[HorribleSubs] Maria the Virgin Witch - 09 [720p].mkv".AsOsAgnostic(); @@ -322,7 +321,7 @@ namespace NzbDrone.Core.Test.MediaFiles Subject.ProcessPath(folderName).Should().BeEmpty(); Mocker.GetMock() - .Verify(v => v.GetSeries(It.IsAny()), Times.Never()); + .Verify(v => v.GetArtist(It.IsAny()), Times.Never()); ExceptionVerification.ExpectedErrors(1); } @@ -330,7 +329,7 @@ namespace NzbDrone.Core.Test.MediaFiles [Test] public void should_not_delete_if_no_files_were_imported() { - GivenValidSeries(); + GivenValidArtist(); var localEpisode = new LocalTrack(); @@ -341,17 +340,17 @@ namespace NzbDrone.Core.Test.MediaFiles .Setup(s => s.GetImportDecisions(It.IsAny>(), It.IsAny(), null)) .Returns(imported); - Mocker.GetMock() + Mocker.GetMock() .Setup(s => s.Import(It.IsAny>(), true, null, ImportMode.Auto)) .Returns(new List()); - Mocker.GetMock() - .Setup(s => s.IsSample(It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(true); + //Mocker.GetMock() + // .Setup(s => s.IsSample(It.IsAny(), + // It.IsAny(), + // It.IsAny(), + // It.IsAny(), + // It.IsAny())) + // .Returns(true); Mocker.GetMock() .Setup(s => s.GetFileSize(It.IsAny())) @@ -365,13 +364,13 @@ namespace NzbDrone.Core.Test.MediaFiles private void VerifyNoImport() { - Mocker.GetMock().Verify(c => c.Import(It.IsAny>(), true, null, ImportMode.Auto), + Mocker.GetMock().Verify(c => c.Import(It.IsAny>(), true, null, ImportMode.Auto), Times.Never()); } private void VerifyImport() { - Mocker.GetMock().Verify(c => c.Import(It.IsAny>(), true, null, ImportMode.Auto), + Mocker.GetMock().Verify(c => c.Import(It.IsAny>(), true, null, ImportMode.Auto), Times.Once()); } } diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 407c6ca10..0fa0b530e 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -219,7 +219,6 @@ - @@ -283,7 +282,7 @@ - + diff --git a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs index 9f932bca5..6e57d432f 100644 --- a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs +++ b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -96,18 +96,6 @@ namespace NzbDrone.Core.Test.RootFolderTests Assert.Throws(() => Subject.Add(new RootFolder { Path = @"C:\TV".AsOsAgnostic() })); } - [Test] - public void should_throw_when_same_path_as_drone_factory() - { - var path = @"C:\TV".AsOsAgnostic(); - - Mocker.GetMock() - .SetupGet(s => s.DownloadedAlbumsFolder) - .Returns(path); - - Assert.Throws(() => Subject.Add(new RootFolder { Path = path })); -} - [TestCase("$recycle.bin")] [TestCase("system volume information")] [TestCase("recycler")] @@ -152,4 +140,4 @@ namespace NzbDrone.Core.Test.RootFolderTests unmappedFolders.Should().NotContain(u => u.Name == subFolder); } } -} \ No newline at end of file +} diff --git a/src/NzbDrone.Core/Configuration/ConfigService.cs b/src/NzbDrone.Core/Configuration/ConfigService.cs index 85d4c4215..0d9bede18 100644 --- a/src/NzbDrone.Core/Configuration/ConfigService.cs +++ b/src/NzbDrone.Core/Configuration/ConfigService.cs @@ -74,13 +74,6 @@ namespace NzbDrone.Core.Configuration return _repository.Get(key.ToLower()) != null; } - public string DownloadedAlbumsFolder - { - get { return GetValue(ConfigKey.DownloadedAlbumsFolder.ToString()); } - - set { SetValue(ConfigKey.DownloadedAlbumsFolder.ToString(), value); } - } - public bool AutoUnmonitorPreviouslyDownloadedTracks { get { return GetValueBoolean("AutoUnmonitorPreviouslyDownloadedTracks"); } @@ -168,13 +161,6 @@ namespace NzbDrone.Core.Configuration set { SetValue("DownloadClientWorkingFolders", value); } } - public int DownloadedAlbumsScanInterval - { - get { return GetValueInt("DownloadedAlbumsScanInterval", 1); } - - set { SetValue("DownloadedAlbumsScanInterval", value); } - } - public int DownloadClientHistoryLimit { get { return GetValueInt("DownloadClientHistoryLimit", 30); } diff --git a/src/NzbDrone.Core/Configuration/IConfigService.cs b/src/NzbDrone.Core/Configuration/IConfigService.cs index 6ceab7c72..72822fb2f 100644 --- a/src/NzbDrone.Core/Configuration/IConfigService.cs +++ b/src/NzbDrone.Core/Configuration/IConfigService.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using NzbDrone.Core.MediaFiles; using NzbDrone.Common.Http.Proxy; @@ -11,9 +11,7 @@ namespace NzbDrone.Core.Configuration bool IsDefined(string key); //Download Client - string DownloadedAlbumsFolder { get; set; } string DownloadClientWorkingFolders { get; set; } - int DownloadedAlbumsScanInterval { get; set; } int DownloadClientHistoryLimit { get; set; } //Completed/Failed Download Handling (Download client) diff --git a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs index 32fad0d99..d8a7c80d0 100644 --- a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs +++ b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using FluentValidation.Results; @@ -113,25 +113,14 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic private string WriteStrmFile(string title, string nzbFile) { - string folder; if (Settings.StrmFolder.IsNullOrWhiteSpace()) { - folder = _configService.DownloadedAlbumsFolder; - - if (folder.IsNullOrWhiteSpace()) - { - throw new DownloadClientException("Strm Folder needs to be set for Pneumatic Downloader"); - } - } - - else - { - folder = Settings.StrmFolder; + throw new DownloadClientException("Strm Folder needs to be set for Pneumatic Downloader"); } var contents = string.Format("plugin://plugin.program.pneumatic/?mode=strm&type=add_file&nzb={0}&nzbname={1}", nzbFile, title); - var filename = Path.Combine(folder, title + ".strm"); + var filename = Path.Combine(Settings.StrmFolder, title + ".strm"); _diskProvider.WriteAllText(filename, contents); diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 9f56132b5..6e889c771 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -11,7 +11,7 @@ using NzbDrone.Core.History; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Parser; -using NzbDrone.Core.Tv; +using NzbDrone.Core.Music; using NzbDrone.Core.MediaFiles.TrackImport; namespace NzbDrone.Core.Download @@ -26,26 +26,26 @@ namespace NzbDrone.Core.Download private readonly IConfigService _configService; private readonly IEventAggregator _eventAggregator; private readonly IHistoryService _historyService; - private readonly IDownloadedEpisodesImportService _downloadedEpisodesImportService; + private readonly IDownloadedTracksImportService _downloadedTracksImportService; private readonly IParsingService _parsingService; private readonly Logger _logger; - private readonly ISeriesService _seriesService; + private readonly IArtistService _artistService; public CompletedDownloadService(IConfigService configService, IEventAggregator eventAggregator, IHistoryService historyService, - IDownloadedEpisodesImportService downloadedEpisodesImportService, + IDownloadedTracksImportService downloadedTracksImportService, IParsingService parsingService, - ISeriesService seriesService, + IArtistService artistService, Logger logger) { _configService = configService; _eventAggregator = eventAggregator; _historyService = historyService; - _downloadedEpisodesImportService = downloadedEpisodesImportService; + _downloadedTracksImportService = downloadedTracksImportService; _parsingService = parsingService; _logger = logger; - _seriesService = seriesService; + _artistService = artistService; } public void Process(TrackedDownload trackedDownload, bool ignoreWarnings = false) @@ -80,26 +80,18 @@ namespace NzbDrone.Core.Download return; } - var downloadedEpisodesFolder = new OsPath(_configService.DownloadedAlbumsFolder); + var artist = trackedDownload.RemoteAlbum.Artist; - if (downloadedEpisodesFolder.Contains(downloadItemOutputPath)) - { - trackedDownload.Warn("Intermediate Download path inside drone factory, Skipping."); - return; - } - - var series = _parsingService.GetSeries(trackedDownload.DownloadItem.Title); - - if (series == null) + if (artist == null) { if (historyItem != null) { - series = _seriesService.GetSeries(historyItem.ArtistId); + artist = _artistService.GetArtist(historyItem.ArtistId); } - if (series == null) + if (artist == null) { - trackedDownload.Warn("Series title mismatch, automatic import is not possible."); + trackedDownload.Warn("Artist name mismatch, automatic import is not possible."); return; } } @@ -111,7 +103,7 @@ namespace NzbDrone.Core.Download private void Import(TrackedDownload trackedDownload) { var outputPath = trackedDownload.DownloadItem.OutputPath.FullPath; - var importResults = _downloadedEpisodesImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); + var importResults = _downloadedTracksImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteAlbum.Artist, trackedDownload.DownloadItem); if (importResults.Empty()) { @@ -119,7 +111,7 @@ namespace NzbDrone.Core.Download return; } - if (importResults.Count(c => c.Result == ImportResultType.Imported) >= Math.Max(1, trackedDownload.RemoteEpisode.Episodes.Count)) + if (importResults.Count(c => c.Result == ImportResultType.Imported) >= Math.Max(1, trackedDownload.RemoteAlbum.Albums.Count)) { trackedDownload.State = TrackedDownloadStage.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DroneFactoryCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DroneFactoryCheck.cs deleted file mode 100644 index af78455fd..000000000 --- a/src/NzbDrone.Core/HealthCheck/Checks/DroneFactoryCheck.cs +++ /dev/null @@ -1,42 +0,0 @@ -using NzbDrone.Common.Disk; -using NzbDrone.Common.Extensions; -using NzbDrone.Core.Configuration; - -namespace NzbDrone.Core.HealthCheck.Checks -{ - public class DroneFactoryCheck : HealthCheckBase - { - private readonly IConfigService _configService; - private readonly IDiskProvider _diskProvider; - - public DroneFactoryCheck(IConfigService configService, IDiskProvider diskProvider) - { - _configService = configService; - _diskProvider = diskProvider; - } - - public override HealthCheck Check() - { - var droneFactoryFolder = _configService.DownloadedAlbumsFolder; - - if (droneFactoryFolder.IsNullOrWhiteSpace()) - { - return new HealthCheck(GetType()); - } - - if (!_diskProvider.FolderExists(droneFactoryFolder)) - { - return new HealthCheck(GetType(), HealthCheckResult.Error, "Drone factory folder does not exist"); - } - - if (!_diskProvider.FolderWritable(droneFactoryFolder)) - { - return new HealthCheck(GetType(), HealthCheckResult.Error, "Unable to write to drone factory folder"); - } - - //Todo: Unable to import one or more files/folders from - - return new HealthCheck(GetType()); - } - } -} diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ImportMechanismCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ImportMechanismCheck.cs index 233144a8b..bfc343bf9 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ImportMechanismCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ImportMechanismCheck.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; -using NzbDrone.Common.Disk; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download; using NzbDrone.Core.Download.Clients; @@ -24,7 +23,6 @@ namespace NzbDrone.Core.HealthCheck.Checks public override HealthCheck Check() { - var droneFactoryFolder = new OsPath(_configService.DownloadedAlbumsFolder); List downloadClients; try @@ -42,9 +40,6 @@ namespace NzbDrone.Core.HealthCheck.Checks } var downloadClientIsLocalHost = downloadClients.All(v => v.Status.IsLocalhost); - var downloadClientOutputInDroneFactory = !droneFactoryFolder.IsEmpty && - downloadClients.Any(v => v.Status.OutputRootFolders != null && - v.Status.OutputRootFolders.Any(droneFactoryFolder.Contains)); if (!_configService.IsDefined("EnableCompletedDownloadHandling")) { @@ -56,32 +51,20 @@ namespace NzbDrone.Core.HealthCheck.Checks if (downloadClients.All(v => v.DownloadClient is Sabnzbd)) { - // With Sabnzbd we can check if the category should be changed. - if (downloadClientOutputInDroneFactory) - { - return new HealthCheck(GetType(), HealthCheckResult.Warning, "Enable Completed Download Handling if possible (Sabnzbd - Conflicting Category)", "Migrating-to-Completed-Download-Handling#sabnzbd-conflicting-download-client-category"); - } - return new HealthCheck(GetType(), HealthCheckResult.Warning, "Enable Completed Download Handling if possible (Sabnzbd)", "Migrating-to-Completed-Download-Handling#sabnzbd-enable-completed-download-handling"); } if (downloadClients.All(v => v.DownloadClient is Nzbget)) { - // With Nzbget we can check if the category should be changed. - if (downloadClientOutputInDroneFactory) - { - return new HealthCheck(GetType(), HealthCheckResult.Warning, "Enable Completed Download Handling if possible (Nzbget - Conflicting Category)", "Migrating-to-Completed-Download-Handling#nzbget-conflicting-download-client-category"); - } - return new HealthCheck(GetType(), HealthCheckResult.Warning, "Enable Completed Download Handling if possible (Nzbget)", "Migrating-to-Completed-Download-Handling#nzbget-enable-completed-download-handling"); } return new HealthCheck(GetType(), HealthCheckResult.Warning, "Enable Completed Download Handling if possible", "Migrating-to-Completed-Download-Handling"); } - if (!_configService.EnableCompletedDownloadHandling && droneFactoryFolder.IsEmpty) + if (!_configService.EnableCompletedDownloadHandling) { - return new HealthCheck(GetType(), HealthCheckResult.Warning, "Enable Completed Download Handling or configure Drone factory"); + return new HealthCheck(GetType(), HealthCheckResult.Warning, "Enable Completed Download Handling"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/Jobs/TaskManager.cs b/src/NzbDrone.Core/Jobs/TaskManager.cs index 646f9a249..c728379ef 100644 --- a/src/NzbDrone.Core/Jobs/TaskManager.cs +++ b/src/NzbDrone.Core/Jobs/TaskManager.cs @@ -11,10 +11,8 @@ using NzbDrone.Core.HealthCheck; using NzbDrone.Core.Housekeeping; using NzbDrone.Core.Indexers; using NzbDrone.Core.Lifecycle; -using NzbDrone.Core.MediaFiles.Commands; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; -using NzbDrone.Core.Tv.Commands; using NzbDrone.Core.Update.Commands; using NzbDrone.Core.Music.Commands; @@ -74,13 +72,7 @@ namespace NzbDrone.Core.Jobs { Interval = GetRssSyncInterval(), TypeName = typeof(RssSyncCommand).FullName - }, - - new ScheduledTask - { - Interval = _configService.DownloadedAlbumsScanInterval, - TypeName = typeof(DownloadedAlbumsScanCommand).FullName - }, + } }; var currentTasks = _scheduledTaskRepository.All().ToList(); @@ -144,10 +136,7 @@ namespace NzbDrone.Core.Jobs var rss = _scheduledTaskRepository.GetDefinition(typeof(RssSyncCommand)); rss.Interval = _configService.RssSyncInterval; - var downloadedAlbums = _scheduledTaskRepository.GetDefinition(typeof(DownloadedAlbumsScanCommand)); - downloadedAlbums.Interval = _configService.DownloadedAlbumsScanInterval; - - _scheduledTaskRepository.UpdateMany(new List { rss, downloadedAlbums }); + _scheduledTaskRepository.Update(rss); } } } diff --git a/src/NzbDrone.Core/MediaFiles/DownloadedAlbumsCommandService.cs b/src/NzbDrone.Core/MediaFiles/DownloadedAlbumsCommandService.cs index 41bfd2739..e117b6b1f 100644 --- a/src/NzbDrone.Core/MediaFiles/DownloadedAlbumsCommandService.cs +++ b/src/NzbDrone.Core/MediaFiles/DownloadedAlbumsCommandService.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using System.IO; +using System; using System.Linq; using NLog; using NzbDrone.Common.Disk; @@ -9,49 +9,28 @@ using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.MediaFiles.Commands; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.MediaFiles.TrackImport; +using NzbDrone.Common.Instrumentation.Extensions; namespace NzbDrone.Core.MediaFiles { public class DownloadedAlbumsCommandService : IExecute { - private readonly IDownloadedEpisodesImportService _downloadedEpisodesImportService; + private readonly IDownloadedTracksImportService _downloadedTracksImportService; private readonly ITrackedDownloadService _trackedDownloadService; private readonly IDiskProvider _diskProvider; - private readonly IConfigService _configService; private readonly Logger _logger; - public DownloadedAlbumsCommandService(IDownloadedEpisodesImportService downloadedEpisodesImportService, + public DownloadedAlbumsCommandService(IDownloadedTracksImportService downloadedTracksImportService, ITrackedDownloadService trackedDownloadService, IDiskProvider diskProvider, - IConfigService configService, Logger logger) { - _downloadedEpisodesImportService = downloadedEpisodesImportService; + _downloadedTracksImportService = downloadedTracksImportService; _trackedDownloadService = trackedDownloadService; _diskProvider = diskProvider; - _configService = configService; _logger = logger; } - private List ProcessDroneFactoryFolder() - { - var downloadedAlbumsFolder = _configService.DownloadedAlbumsFolder; - - if (string.IsNullOrEmpty(downloadedAlbumsFolder)) - { - _logger.Trace("Drone Factory folder is not configured"); - return new List(); - } - - if (!_diskProvider.FolderExists(downloadedAlbumsFolder)) - { - _logger.Warn("Drone Factory folder [{0}] doesn't exist.", downloadedAlbumsFolder); - return new List(); - } - - return _downloadedEpisodesImportService.ProcessRootFolder(new DirectoryInfo(downloadedAlbumsFolder)); - } - private List ProcessPath(DownloadedAlbumsScanCommand message) { if (!_diskProvider.FolderExists(message.Path) && !_diskProvider.FileExists(message.Path)) @@ -68,17 +47,17 @@ namespace NzbDrone.Core.MediaFiles { _logger.Debug("External directory scan request for known download {0}. [{1}]", message.DownloadClientId, message.Path); - return _downloadedEpisodesImportService.ProcessPath(message.Path, message.ImportMode, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); + return _downloadedTracksImportService.ProcessPath(message.Path, message.ImportMode, trackedDownload.RemoteAlbum.Artist, trackedDownload.DownloadItem); } else { _logger.Warn("External directory scan request for unknown download {0}, attempting normal import. [{1}]", message.DownloadClientId, message.Path); - return _downloadedEpisodesImportService.ProcessPath(message.Path, message.ImportMode); + return _downloadedTracksImportService.ProcessPath(message.Path, message.ImportMode); } } - return _downloadedEpisodesImportService.ProcessPath(message.Path, message.ImportMode); + return _downloadedTracksImportService.ProcessPath(message.Path, message.ImportMode); } public void Execute(DownloadedAlbumsScanCommand message) @@ -91,7 +70,7 @@ namespace NzbDrone.Core.MediaFiles } else { - importResults = ProcessDroneFactoryFolder(); + throw new ArgumentException("A path must be provided", "path"); } if (importResults == null || importResults.All(v => v.Result != ImportResultType.Imported)) diff --git a/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs b/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs deleted file mode 100644 index 583d50708..000000000 --- a/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs +++ /dev/null @@ -1,270 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using NLog; -using NzbDrone.Common.Disk; -using NzbDrone.Core.DecisionEngine; -using NzbDrone.Core.Parser; -using NzbDrone.Core.Tv; -using NzbDrone.Core.Download; -using NzbDrone.Core.Parser.Model; -using NzbDrone.Core.MediaFiles.TrackImport; - -namespace NzbDrone.Core.MediaFiles -{ - public interface IDownloadedEpisodesImportService - { - List ProcessRootFolder(DirectoryInfo directoryInfo); - List ProcessPath(string path, ImportMode importMode = ImportMode.Auto, Series series = null, DownloadClientItem downloadClientItem = null); - bool ShouldDeleteFolder(DirectoryInfo directoryInfo, Series series); - } - - public class DownloadedEpisodesImportService : IDownloadedEpisodesImportService - { - private readonly IDiskProvider _diskProvider; - private readonly IDiskScanService _diskScanService; - private readonly ISeriesService _seriesService; - private readonly IParsingService _parsingService; - private readonly IMakeImportDecision _importDecisionMaker; - private readonly IImportApprovedEpisodes _importApprovedEpisodes; - private readonly IDetectSample _detectSample; - private readonly Logger _logger; - - public DownloadedEpisodesImportService(IDiskProvider diskProvider, - IDiskScanService diskScanService, - ISeriesService seriesService, - IParsingService parsingService, - IMakeImportDecision importDecisionMaker, - IImportApprovedEpisodes importApprovedEpisodes, - IDetectSample detectSample, - Logger logger) - { - _diskProvider = diskProvider; - _diskScanService = diskScanService; - _seriesService = seriesService; - _parsingService = parsingService; - _importDecisionMaker = importDecisionMaker; - _importApprovedEpisodes = importApprovedEpisodes; - _detectSample = detectSample; - _logger = logger; - } - - public List ProcessRootFolder(DirectoryInfo directoryInfo) - { - var results = new List(); - - foreach (var subFolder in _diskProvider.GetDirectories(directoryInfo.FullName)) - { - var folderResults = ProcessFolder(new DirectoryInfo(subFolder), ImportMode.Auto, null); - results.AddRange(folderResults); - } - - foreach (var videoFile in _diskScanService.GetNonAudioFiles(directoryInfo.FullName, false)) - { - var fileResults = ProcessFile(new FileInfo(videoFile), ImportMode.Auto, null); - results.AddRange(fileResults); - } - - return results; - } - - public List ProcessPath(string path, ImportMode importMode = ImportMode.Auto, Series series = null, DownloadClientItem downloadClientItem = null) - { - if (_diskProvider.FolderExists(path)) - { - var directoryInfo = new DirectoryInfo(path); - - if (series == null) - { - return ProcessFolder(directoryInfo, importMode, downloadClientItem); - } - - return ProcessFolder(directoryInfo, importMode, series, downloadClientItem); - } - - if (_diskProvider.FileExists(path)) - { - var fileInfo = new FileInfo(path); - - if (series == null) - { - return ProcessFile(fileInfo, importMode, downloadClientItem); - } - - return ProcessFile(fileInfo, importMode, series, downloadClientItem); - } - - _logger.Error("Import failed, path does not exist or is not accessible by Lidarr: {0}", path); - return new List(); - } - - public bool ShouldDeleteFolder(DirectoryInfo directoryInfo, Series series) - { - var videoFiles = _diskScanService.GetNonAudioFiles(directoryInfo.FullName); - var rarFiles = _diskProvider.GetFiles(directoryInfo.FullName, SearchOption.AllDirectories).Where(f => Path.GetExtension(f) == ".rar"); - - foreach (var videoFile in videoFiles) - { - var episodeParseResult = Parser.Parser.ParseTitle(Path.GetFileName(videoFile)); - - if (episodeParseResult == null) - { - _logger.Warn("Unable to parse file on import: [{0}]", videoFile); - return false; - } - - var size = _diskProvider.GetFileSize(videoFile); - var quality = QualityParser.ParseQuality(videoFile); - - if (!_detectSample.IsSample(series, quality, videoFile, size, episodeParseResult.IsPossibleSpecialEpisode)) - { - _logger.Warn("Non-sample file detected: [{0}]", videoFile); - return false; - } - } - - if (rarFiles.Any(f => _diskProvider.GetFileSize(f) > 10.Megabytes())) - { - _logger.Warn("RAR file detected, will require manual cleanup"); - return false; - } - - return true; - } - - private List ProcessFolder(DirectoryInfo directoryInfo, ImportMode importMode, DownloadClientItem downloadClientItem) - { - var cleanedUpName = GetCleanedUpFolderName(directoryInfo.Name); - var series = _parsingService.GetSeries(cleanedUpName); - - if (series == null) - { - _logger.Debug("Unknown Series {0}", cleanedUpName); - - return new List - { - UnknownSeriesResult("Unknown Series") - }; - } - - return ProcessFolder(directoryInfo, importMode, series, downloadClientItem); - } - - private List ProcessFolder(DirectoryInfo directoryInfo, ImportMode importMode, Series series, DownloadClientItem downloadClientItem) - { - throw new System.NotImplementedException("Will be removed"); - - //if (_seriesService.SeriesPathExists(directoryInfo.FullName)) - //{ - // _logger.Warn("Unable to process folder that is mapped to an existing show"); - // return new List(); - //} - - //var cleanedUpName = GetCleanedUpFolderName(directoryInfo.Name); - //var folderInfo = Parser.Parser.ParseTitle(directoryInfo.Name); - - //if (folderInfo != null) - //{ - // _logger.Debug("{0} folder quality: {1}", cleanedUpName, folderInfo.Quality); - //} - - //var videoFiles = _diskScanService.GetVideoFiles(directoryInfo.FullName); - - //if (downloadClientItem == null) - //{ - // foreach (var videoFile in videoFiles) - // { - // if (_diskProvider.IsFileLocked(videoFile)) - // { - // return new List - // { - // FileIsLockedResult(videoFile) - // }; - // } - // } - //} - - //var decisions = _importDecisionMaker.GetImportDecisions(videoFiles.ToList(), series, folderInfo, true); - //var importResults = _importApprovedEpisodes.Import(decisions, true, downloadClientItem, importMode); - - //if ((downloadClientItem == null || !downloadClientItem.IsReadOnly) && - // importResults.Any(i => i.Result == ImportResultType.Imported) && - // ShouldDeleteFolder(directoryInfo, series)) - //{ - // _logger.Debug("Deleting folder after importing valid files"); - // _diskProvider.DeleteFolder(directoryInfo.FullName, true); - //} - - //return importResults; - } - - private List ProcessFile(FileInfo fileInfo, ImportMode importMode, DownloadClientItem downloadClientItem) - { - var series = _parsingService.GetSeries(Path.GetFileNameWithoutExtension(fileInfo.Name)); - - if (series == null) - { - _logger.Debug("Unknown Series for file: {0}", fileInfo.Name); - - return new List - { - UnknownSeriesResult(string.Format("Unknown Series for file: {0}", fileInfo.Name), fileInfo.FullName) - }; - } - - return ProcessFile(fileInfo, importMode, series, downloadClientItem); - } - - private List ProcessFile(FileInfo fileInfo, ImportMode importMode, Series series, DownloadClientItem downloadClientItem) - { - throw new System.NotImplementedException("Will be removed"); - //if (Path.GetFileNameWithoutExtension(fileInfo.Name).StartsWith("._")) - //{ - // _logger.Debug("[{0}] starts with '._', skipping", fileInfo.FullName); - - // return new List - // { - // new ImportResult(new ImportDecision(new LocalTrack { Path = fileInfo.FullName }, new Rejection("Invalid music file, filename starts with '._'")), "Invalid music file, filename starts with '._'") - // }; - //} - - //if (downloadClientItem == null) - //{ - // if (_diskProvider.IsFileLocked(fileInfo.FullName)) - // { - // return new List - // { - // FileIsLockedResult(fileInfo.FullName) - // }; - // } - //} - - //var decisions = _importDecisionMaker.GetImportDecisions(new List() { fileInfo.FullName }, series, null, true); - - //return _importApprovedEpisodes.Import(decisions, true, downloadClientItem, importMode); - } - - private string GetCleanedUpFolderName(string folder) - { - folder = folder.Replace("_UNPACK_", "") - .Replace("_FAILED_", ""); - - return folder; - } - - private ImportResult FileIsLockedResult(string videoFile) - { - throw new System.NotImplementedException("Will be removed"); - //_logger.Debug("[{0}] is currently locked by another process, skipping", videoFile); - //return new ImportResult(new ImportDecision(new LocalEpisode { Path = videoFile }, new Rejection("Locked file, try again later")), "Locked file, try again later"); - } - - private ImportResult UnknownSeriesResult(string message, string videoFile = null) - { - throw new System.NotImplementedException("Will be removed"); - //var localEpisode = videoFile == null ? null : new LocalEpisode { Path = videoFile }; - - //return new ImportResult(new ImportDecision(localEpisode, new Rejection("Unknown Series")), message); - } - } -} diff --git a/src/NzbDrone.Core/MediaFiles/DownloadedTracksImportService.cs b/src/NzbDrone.Core/MediaFiles/DownloadedTracksImportService.cs new file mode 100644 index 000000000..b40a62f09 --- /dev/null +++ b/src/NzbDrone.Core/MediaFiles/DownloadedTracksImportService.cs @@ -0,0 +1,279 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using NLog; +using NzbDrone.Common.Disk; +using NzbDrone.Core.DecisionEngine; +using NzbDrone.Core.MediaFiles.TrackImport; +using NzbDrone.Core.Parser; +using NzbDrone.Core.Music; +using NzbDrone.Core.Download; +using NzbDrone.Core.Parser.Model; + +namespace NzbDrone.Core.MediaFiles +{ + public interface IDownloadedTracksImportService + { + List ProcessRootFolder(DirectoryInfo directoryInfo); + List ProcessPath(string path, ImportMode importMode = ImportMode.Auto, Artist artist = null, DownloadClientItem downloadClientItem = null); + bool ShouldDeleteFolder(DirectoryInfo directoryInfo, Artist artist); + } + + public class DownloadedTracksImportService : IDownloadedTracksImportService + { + private readonly IDiskProvider _diskProvider; + private readonly IDiskScanService _diskScanService; + private readonly IArtistService _artistService; + private readonly IParsingService _parsingService; + private readonly IMakeImportDecision _importDecisionMaker; + private readonly IImportApprovedTracks _importApprovedTracks; + private readonly IDetectSample _detectSample; + private readonly Logger _logger; + + public DownloadedTracksImportService(IDiskProvider diskProvider, + IDiskScanService diskScanService, + IArtistService artistService, + IParsingService parsingService, + IMakeImportDecision importDecisionMaker, + IImportApprovedTracks importApprovedTracks, + IDetectSample detectSample, + Logger logger) + { + _diskProvider = diskProvider; + _diskScanService = diskScanService; + _artistService = artistService; + _parsingService = parsingService; + _importDecisionMaker = importDecisionMaker; + _importApprovedTracks = importApprovedTracks; + _detectSample = detectSample; + _logger = logger; + } + + public List ProcessRootFolder(DirectoryInfo directoryInfo) + { + var results = new List(); + + foreach (var subFolder in _diskProvider.GetDirectories(directoryInfo.FullName)) + { + var folderResults = ProcessFolder(new DirectoryInfo(subFolder), ImportMode.Auto, null); + results.AddRange(folderResults); + } + + foreach (var videoFile in _diskScanService.GetNonAudioFiles(directoryInfo.FullName, false)) + { + var fileResults = ProcessFile(new FileInfo(videoFile), ImportMode.Auto, null); + results.AddRange(fileResults); + } + + return results; + } + + public List ProcessPath(string path, ImportMode importMode = ImportMode.Auto, Artist artist = null, DownloadClientItem downloadClientItem = null) + { + if (_diskProvider.FolderExists(path)) + { + var directoryInfo = new DirectoryInfo(path); + + if (artist == null) + { + return ProcessFolder(directoryInfo, importMode, downloadClientItem); + } + + return ProcessFolder(directoryInfo, importMode, artist, downloadClientItem); + } + + if (_diskProvider.FileExists(path)) + { + var fileInfo = new FileInfo(path); + + if (artist == null) + { + return ProcessFile(fileInfo, importMode, downloadClientItem); + } + + return ProcessFile(fileInfo, importMode, artist, downloadClientItem); + } + + _logger.Error("Import failed, path does not exist or is not accessible by Lidarr: {0}", path); + return new List(); + } + + public bool ShouldDeleteFolder(DirectoryInfo directoryInfo, Artist artist) + { + var audioFiles = _diskScanService.GetNonAudioFiles(directoryInfo.FullName); + var rarFiles = _diskProvider.GetFiles(directoryInfo.FullName, SearchOption.AllDirectories).Where(f => Path.GetExtension(f) == ".rar"); + + foreach (var audioFile in audioFiles) + { + var albumParseResult = Parser.Parser.ParseMusicTitle(Path.GetFileName(audioFile)); + + if (albumParseResult == null) + { + _logger.Warn("Unable to parse file on import: [{0}]", audioFile); + return false; + } + + var size = _diskProvider.GetFileSize(audioFile); + var quality = QualityParser.ParseQuality(audioFile); + + //if (!_detectSample.IsSample(artist, quality, audioFile, size, albumParseResult.IsPossibleSpecialEpisode)) + //{ + // _logger.Warn("Non-sample file detected: [{0}]", audioFile); + // return false; + //} + } + + if (rarFiles.Any(f => _diskProvider.GetFileSize(f) > 10.Megabytes())) + { + _logger.Warn("RAR file detected, will require manual cleanup"); + return false; + } + + return true; + } + + private List ProcessFolder(DirectoryInfo directoryInfo, ImportMode importMode, DownloadClientItem downloadClientItem) + { + var cleanedUpName = GetCleanedUpFolderName(directoryInfo.Name); + + var files = _diskScanService.GetAudioFiles(directoryInfo.FullName); + var artist = _parsingService.GetArtist(files.First()); + + if (artist == null) + { + _logger.Debug("Unknown Artist {0}", cleanedUpName); + + return new List + { + UnknownArtistResult("Unknown Artist") + }; + } + + return ProcessFolder(directoryInfo, importMode, artist, downloadClientItem); + } + + private List ProcessFolder(DirectoryInfo directoryInfo, ImportMode importMode, Artist artist, DownloadClientItem downloadClientItem) + { + if (_artistService.ArtistPathExists(directoryInfo.FullName)) + { + _logger.Warn("Unable to process folder that is mapped to an existing artist"); + return new List(); + } + + var cleanedUpName = GetCleanedUpFolderName(directoryInfo.Name); + var folderInfo = Parser.Parser.ParseAlbumTitle(directoryInfo.Name); + var trackInfo = new ParsedTrackInfo { }; + + if (folderInfo != null) + { + _logger.Debug("{0} folder quality: {1}", cleanedUpName, folderInfo.Quality); + + trackInfo = new ParsedTrackInfo + { + AlbumTitle = folderInfo.AlbumTitle, + ArtistTitle = folderInfo.ArtistName, + Quality = folderInfo.Quality, + ReleaseGroup = folderInfo.ReleaseGroup, + ReleaseHash = folderInfo.ReleaseHash, + }; + } + + var audioFiles = _diskScanService.GetAudioFiles(directoryInfo.FullName); + + if (downloadClientItem == null) + { + foreach (var audioFile in audioFiles) + { + if (_diskProvider.IsFileLocked(audioFile)) + { + return new List + { + FileIsLockedResult(audioFile) + }; + } + } + } + + + + var decisions = _importDecisionMaker.GetImportDecisions(audioFiles.ToList(), artist, trackInfo); + var importResults = _importApprovedTracks.Import(decisions, true, downloadClientItem, importMode); + + if ((downloadClientItem == null || !downloadClientItem.IsReadOnly) && + importResults.Any(i => i.Result == ImportResultType.Imported) && + ShouldDeleteFolder(directoryInfo, artist)) + { + _logger.Debug("Deleting folder after importing valid files"); + _diskProvider.DeleteFolder(directoryInfo.FullName, true); + } + + return importResults; + } + + private List ProcessFile(FileInfo fileInfo, ImportMode importMode, DownloadClientItem downloadClientItem) + { + var artist = _parsingService.GetArtist(Path.GetFileNameWithoutExtension(fileInfo.Name)); + + if (artist == null) + { + _logger.Debug("Unknown Artist for file: {0}", fileInfo.Name); + + return new List + { + UnknownArtistResult(string.Format("Unknown Artist for file: {0}", fileInfo.Name), fileInfo.FullName) + }; + } + + return ProcessFile(fileInfo, importMode, artist, downloadClientItem); + } + + private List ProcessFile(FileInfo fileInfo, ImportMode importMode, Artist artist, DownloadClientItem downloadClientItem) + { + if (Path.GetFileNameWithoutExtension(fileInfo.Name).StartsWith("._")) + { + _logger.Debug("[{0}] starts with '._', skipping", fileInfo.FullName); + + return new List + { + new ImportResult(new ImportDecision(new LocalTrack { Path = fileInfo.FullName }, new Rejection("Invalid music file, filename starts with '._'")), "Invalid music file, filename starts with '._'") + }; + } + + if (downloadClientItem == null) + { + if (_diskProvider.IsFileLocked(fileInfo.FullName)) + { + return new List + { + FileIsLockedResult(fileInfo.FullName) + }; + } + } + + var decisions = _importDecisionMaker.GetImportDecisions(new List() { fileInfo.FullName }, artist, null); + + return _importApprovedTracks.Import(decisions, true, downloadClientItem, importMode); + } + + private string GetCleanedUpFolderName(string folder) + { + folder = folder.Replace("_UNPACK_", "") + .Replace("_FAILED_", ""); + + return folder; + } + + private ImportResult FileIsLockedResult(string audioFile) + { + _logger.Debug("[{0}] is currently locked by another process, skipping", audioFile); + return new ImportResult(new ImportDecision(new LocalTrack { Path = audioFile }, new Rejection("Locked file, try again later")), "Locked file, try again later"); + } + + private ImportResult UnknownArtistResult(string message, string audioFile = null) + { + var localTrack = audioFile == null ? null : new LocalTrack { Path = audioFile }; + + return new ImportResult(new ImportDecision(localTrack, new Rejection("Unknown Artist")), message); + } + } +} diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs index 02db4a047..a038b5c23 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs @@ -35,7 +35,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual private readonly IVideoFileInfoReader _videoFileInfoReader; private readonly IImportApprovedTracks _importApprovedTracks; private readonly ITrackedDownloadService _trackedDownloadService; - private readonly IDownloadedEpisodesImportService _downloadedEpisodesImportService; + private readonly IDownloadedTracksImportService _downloadedEpisodesImportService; private readonly IEventAggregator _eventAggregator; private readonly Logger _logger; @@ -49,7 +49,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual IVideoFileInfoReader videoFileInfoReader, IImportApprovedTracks importApprovedTracks, ITrackedDownloadService trackedDownloadService, - IDownloadedEpisodesImportService downloadedEpisodesImportService, + IDownloadedTracksImportService downloadedEpisodesImportService, IEventAggregator eventAggregator, Logger logger) { @@ -258,7 +258,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual { if (_downloadedEpisodesImportService.ShouldDeleteFolder( new DirectoryInfo(trackedDownload.DownloadItem.OutputPath.FullPath), - trackedDownload.RemoteEpisode.Series) && !trackedDownload.DownloadItem.IsReadOnly) + trackedDownload.RemoteAlbum.Artist) && !trackedDownload.DownloadItem.IsReadOnly) { _diskProvider.DeleteFolder(trackedDownload.DownloadItem.OutputPath.FullPath, true); } diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 7b848fd9c..237c95a59 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -571,7 +571,6 @@ - @@ -748,7 +747,7 @@ Code - + Code diff --git a/src/NzbDrone.Core/RootFolders/RootFolderService.cs b/src/NzbDrone.Core/RootFolders/RootFolderService.cs index 84bb9f472..7360b5c61 100644 --- a/src/NzbDrone.Core/RootFolders/RootFolderService.cs +++ b/src/NzbDrone.Core/RootFolders/RootFolderService.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System; using System.Collections.Generic; using System.IO; @@ -107,11 +107,6 @@ namespace NzbDrone.Core.RootFolders throw new InvalidOperationException("Recent directory already exists."); } - if (_configService.DownloadedAlbumsFolder.IsNotNullOrWhiteSpace() && _configService.DownloadedAlbumsFolder.PathEquals(rootFolder.Path)) - { - throw new InvalidOperationException("Drone Factory folder cannot be used."); - } - if (!_diskProvider.FolderWritable(rootFolder.Path)) { throw new UnauthorizedAccessException(string.Format("Root folder path '{0}' is not writable by user '{1}'", rootFolder.Path, Environment.UserName)); @@ -171,4 +166,4 @@ namespace NzbDrone.Core.RootFolders return rootFolder; } } -} \ No newline at end of file +}