mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-23 06:45:19 -07:00
Ensure drone factory runs on its specificed interval (#1067)
* Ensure drone factory runs on its specificed interval * Fix the tests for DownloadedMovieImportServiceFixture
This commit is contained in:
parent
fe0a54685f
commit
5c22d0b61d
28 changed files with 625 additions and 69 deletions
|
@ -12,13 +12,13 @@ namespace NzbDrone.Api.Config
|
||||||
MappedNetworkDriveValidator mappedNetworkDriveValidator)
|
MappedNetworkDriveValidator mappedNetworkDriveValidator)
|
||||||
: base(configService)
|
: base(configService)
|
||||||
{
|
{
|
||||||
SharedValidator.RuleFor(c => c.DownloadedEpisodesFolder)
|
SharedValidator.RuleFor(c => c.DownloadedMoviesFolder)
|
||||||
.Cascade(CascadeMode.StopOnFirstFailure)
|
.Cascade(CascadeMode.StopOnFirstFailure)
|
||||||
.IsValidPath()
|
.IsValidPath()
|
||||||
.SetValidator(rootFolderValidator)
|
.SetValidator(rootFolderValidator)
|
||||||
.SetValidator(mappedNetworkDriveValidator)
|
.SetValidator(mappedNetworkDriveValidator)
|
||||||
.SetValidator(pathExistsValidator)
|
.SetValidator(pathExistsValidator)
|
||||||
.When(c => !string.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder));
|
.When(c => !string.IsNullOrWhiteSpace(c.DownloadedMoviesFolder));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override DownloadClientConfigResource ToResource(IConfigService model)
|
protected override DownloadClientConfigResource ToResource(IConfigService model)
|
||||||
|
|
|
@ -5,9 +5,9 @@ namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
public class DownloadClientConfigResource : RestResource
|
public class DownloadClientConfigResource : RestResource
|
||||||
{
|
{
|
||||||
public string DownloadedEpisodesFolder { get; set; }
|
public string DownloadedMoviesFolder { get; set; }
|
||||||
public string DownloadClientWorkingFolders { get; set; }
|
public string DownloadClientWorkingFolders { get; set; }
|
||||||
public int DownloadedEpisodesScanInterval { get; set; }
|
public int DownloadedMoviesScanInterval { get; set; }
|
||||||
|
|
||||||
public bool EnableCompletedDownloadHandling { get; set; }
|
public bool EnableCompletedDownloadHandling { get; set; }
|
||||||
public bool RemoveCompletedDownloads { get; set; }
|
public bool RemoveCompletedDownloads { get; set; }
|
||||||
|
@ -22,9 +22,9 @@ namespace NzbDrone.Api.Config
|
||||||
{
|
{
|
||||||
return new DownloadClientConfigResource
|
return new DownloadClientConfigResource
|
||||||
{
|
{
|
||||||
DownloadedEpisodesFolder = model.DownloadedEpisodesFolder,
|
DownloadedMoviesFolder = model.DownloadedMoviesFolder,
|
||||||
DownloadClientWorkingFolders = model.DownloadClientWorkingFolders,
|
DownloadClientWorkingFolders = model.DownloadClientWorkingFolders,
|
||||||
DownloadedEpisodesScanInterval = model.DownloadedEpisodesScanInterval,
|
DownloadedMoviesScanInterval = model.DownloadedMoviesScanInterval,
|
||||||
|
|
||||||
EnableCompletedDownloadHandling = model.EnableCompletedDownloadHandling,
|
EnableCompletedDownloadHandling = model.EnableCompletedDownloadHandling,
|
||||||
RemoveCompletedDownloads = model.RemoveCompletedDownloads,
|
RemoveCompletedDownloads = model.RemoveCompletedDownloads,
|
||||||
|
|
|
@ -154,7 +154,7 @@ namespace NzbDrone.Core.Test.Download
|
||||||
public void should_not_process_if_storage_directory_in_drone_factory()
|
public void should_not_process_if_storage_directory_in_drone_factory()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IConfigService>()
|
Mocker.GetMock<IConfigService>()
|
||||||
.SetupGet(v => v.DownloadedEpisodesFolder)
|
.SetupGet(v => v.DownloadedMoviesFolder)
|
||||||
.Returns(@"C:\DropFolder".AsOsAgnostic());
|
.Returns(@"C:\DropFolder".AsOsAgnostic());
|
||||||
|
|
||||||
_trackedDownload.DownloadItem.OutputPath = new OsPath(@"C:\DropFolder\SomeOtherFolder".AsOsAgnostic());
|
_trackedDownload.DownloadItem.OutputPath = new OsPath(@"C:\DropFolder\SomeOtherFolder".AsOsAgnostic());
|
||||||
|
@ -372,8 +372,8 @@ namespace NzbDrone.Core.Test.Download
|
||||||
|
|
||||||
private void AssertNoAttemptedImport()
|
private void AssertNoAttemptedImport()
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IDownloadedEpisodesImportService>()
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
.Verify(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Series>(), It.IsAny<DownloadClientItem>()), Times.Never());
|
.Verify(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()), Times.Never());
|
||||||
|
|
||||||
AssertNoCompletedDownload();
|
AssertNoCompletedDownload();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using Moq;
|
using Moq;
|
||||||
|
@ -31,7 +31,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
|
||||||
_nzbPath = Path.Combine(_pneumaticFolder, _title + ".nzb").AsOsAgnostic();
|
_nzbPath = Path.Combine(_pneumaticFolder, _title + ".nzb").AsOsAgnostic();
|
||||||
_sabDrop = @"d:\unsorted tv\".AsOsAgnostic();
|
_sabDrop = @"d:\unsorted tv\".AsOsAgnostic();
|
||||||
|
|
||||||
Mocker.GetMock<IConfigService>().SetupGet(c => c.DownloadedEpisodesFolder).Returns(_sabDrop);
|
Mocker.GetMock<IConfigService>().SetupGet(c => c.DownloadedMoviesFolder).Returns(_sabDrop);
|
||||||
|
|
||||||
_remoteMovie = new RemoteMovie();
|
_remoteMovie = new RemoteMovie();
|
||||||
_remoteMovie.Release = new ReleaseInfo();
|
_remoteMovie.Release = new ReleaseInfo();
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
|
||||||
private void GivenDroneFactoryFolder(bool exists = false, bool writable = true)
|
private void GivenDroneFactoryFolder(bool exists = false, bool writable = true)
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IConfigService>()
|
Mocker.GetMock<IConfigService>()
|
||||||
.SetupGet(s => s.DownloadedEpisodesFolder)
|
.SetupGet(s => s.DownloadedMoviesFolder)
|
||||||
.Returns(DRONE_FACTORY_FOLDER);
|
.Returns(DRONE_FACTORY_FOLDER);
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
|
||||||
private void GivenDroneFactoryFolder(bool exists = false)
|
private void GivenDroneFactoryFolder(bool exists = false)
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IConfigService>()
|
Mocker.GetMock<IConfigService>()
|
||||||
.SetupGet(s => s.DownloadedEpisodesFolder)
|
.SetupGet(s => s.DownloadedMoviesFolder)
|
||||||
.Returns(DRONE_FACTORY_FOLDER.AsOsAgnostic());
|
.Returns(DRONE_FACTORY_FOLDER.AsOsAgnostic());
|
||||||
|
|
||||||
Mocker.GetMock<IDiskProvider>()
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
|
|
@ -0,0 +1,172 @@
|
||||||
|
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;
|
||||||
|
using NzbDrone.Core.MediaFiles.Commands;
|
||||||
|
using NzbDrone.Core.MediaFiles.EpisodeImport;
|
||||||
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
using NzbDrone.Test.Common;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.MediaFiles
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class DownloadedMoviesCommandServiceFixture : CoreTest<DownloadedMovieCommandService>
|
||||||
|
{
|
||||||
|
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();
|
||||||
|
|
||||||
|
private TrackedDownload _trackedDownload;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IConfigService>().SetupGet(c => c.DownloadedMoviesFolder)
|
||||||
|
.Returns(_droneFactory);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
|
.Setup(v => v.ProcessRootFolder(It.IsAny<DirectoryInfo>()))
|
||||||
|
.Returns(new List<ImportResult>());
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>()
|
||||||
|
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Movie>(), It.IsAny<DownloadClientItem>()))
|
||||||
|
.Returns(new List<ImportResult>());
|
||||||
|
|
||||||
|
var downloadItem = Builder<DownloadClientItem>.CreateNew()
|
||||||
|
.With(v => v.DownloadId = "sab1")
|
||||||
|
.With(v => v.Status = DownloadItemStatus.Downloading)
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var remoteMovie = Builder<RemoteMovie>.CreateNew()
|
||||||
|
.With(v => v.Movie = new Movie())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
_trackedDownload = new TrackedDownload
|
||||||
|
{
|
||||||
|
DownloadItem = downloadItem,
|
||||||
|
RemoteMovie = remoteMovie,
|
||||||
|
State = TrackedDownloadStage.Downloading
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenExistingFolder(string path)
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FolderExists(It.IsAny<string>()))
|
||||||
|
.Returns(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenExistingFile(string path)
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FileExists(It.IsAny<string>()))
|
||||||
|
.Returns(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenValidQueueItem()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<ITrackedDownloadService>()
|
||||||
|
.Setup(s => s.Find("sab1"))
|
||||||
|
.Returns(_trackedDownload);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_process_dronefactory_if_path_is_not_specified()
|
||||||
|
{
|
||||||
|
GivenExistingFolder(_droneFactory);
|
||||||
|
|
||||||
|
Subject.Execute(new DownloadedMoviesScanCommand());
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>().Verify(c => c.ProcessRootFolder(It.IsAny<DirectoryInfo>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_skip_import_if_dronefactory_doesnt_exist()
|
||||||
|
{
|
||||||
|
Subject.Execute(new DownloadedMoviesScanCommand());
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>().Verify(c => c.ProcessRootFolder(It.IsAny<DirectoryInfo>()), Times.Never());
|
||||||
|
|
||||||
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_ignore_downloadclientid_if_path_is_not_specified()
|
||||||
|
{
|
||||||
|
GivenExistingFolder(_droneFactory);
|
||||||
|
|
||||||
|
Subject.Execute(new DownloadedMoviesScanCommand() { DownloadClientId = "sab1" });
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>().Verify(c => c.ProcessRootFolder(It.IsAny<DirectoryInfo>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_process_folder_if_downloadclientid_is_not_specified()
|
||||||
|
{
|
||||||
|
GivenExistingFolder(_downloadFolder);
|
||||||
|
|
||||||
|
Subject.Execute(new DownloadedMoviesScanCommand() { Path = _downloadFolder });
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>().Verify(c => c.ProcessPath(It.IsAny<string>(), ImportMode.Auto, null, null), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_process_file_if_downloadclientid_is_not_specified()
|
||||||
|
{
|
||||||
|
GivenExistingFile(_downloadFile);
|
||||||
|
|
||||||
|
Subject.Execute(new DownloadedMoviesScanCommand() { Path = _downloadFile });
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>().Verify(c => c.ProcessPath(It.IsAny<string>(), ImportMode.Auto, null, null), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_process_folder_with_downloadclientitem_if_available()
|
||||||
|
{
|
||||||
|
GivenExistingFolder(_downloadFolder);
|
||||||
|
GivenValidQueueItem();
|
||||||
|
|
||||||
|
Subject.Execute(new DownloadedMoviesScanCommand() { Path = _downloadFolder, DownloadClientId = "sab1" });
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>().Verify(c => c.ProcessPath(_downloadFolder, ImportMode.Auto, _trackedDownload.RemoteMovie.Movie, _trackedDownload.DownloadItem), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_process_folder_without_downloadclientitem_if_not_available()
|
||||||
|
{
|
||||||
|
GivenExistingFolder(_downloadFolder);
|
||||||
|
|
||||||
|
Subject.Execute(new DownloadedMoviesScanCommand() { Path = _downloadFolder, DownloadClientId = "sab1" });
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>().Verify(c => c.ProcessPath(_downloadFolder, ImportMode.Auto, null, null), Times.Once());
|
||||||
|
|
||||||
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_warn_if_neither_folder_or_file_exists()
|
||||||
|
{
|
||||||
|
Subject.Execute(new DownloadedMoviesScanCommand() { Path = _downloadFolder });
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>().Verify(c => c.ProcessPath(It.IsAny<string>(), ImportMode.Auto, null, null), Times.Never());
|
||||||
|
|
||||||
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_override_import_mode()
|
||||||
|
{
|
||||||
|
GivenExistingFile(_downloadFile);
|
||||||
|
|
||||||
|
Subject.Execute(new DownloadedMoviesScanCommand() { Path = _downloadFile, ImportMode = ImportMode.Copy });
|
||||||
|
|
||||||
|
Mocker.GetMock<IDownloadedMovieImportService>().Verify(c => c.ProcessPath(It.IsAny<string>(), ImportMode.Copy, null, null), Times.Once());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,377 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using FizzWare.NBuilder;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common.Disk;
|
||||||
|
using NzbDrone.Core.MediaFiles;
|
||||||
|
using NzbDrone.Core.MediaFiles.EpisodeImport;
|
||||||
|
using NzbDrone.Core.Parser;
|
||||||
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
using NzbDrone.Core.Qualities;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
using NzbDrone.Test.Common;
|
||||||
|
using FluentAssertions;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.MediaFiles
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class DownloadedMoviesImportServiceFixture : CoreTest<DownloadedMovieImportService>
|
||||||
|
{
|
||||||
|
private string _droneFactory = "c:\\drop\\".AsOsAgnostic();
|
||||||
|
private string[] _subFolders = new[] { "c:\\root\\foldername".AsOsAgnostic() };
|
||||||
|
private string[] _videoFiles = new[] { "c:\\root\\foldername\\47.ronin.2013.ext".AsOsAgnostic() };
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IDiskScanService>().Setup(c => c.GetVideoFiles(It.IsAny<string>(), It.IsAny<bool>()))
|
||||||
|
.Returns(_videoFiles);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.GetDirectories(It.IsAny<string>()))
|
||||||
|
.Returns(_subFolders);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FolderExists(It.IsAny<string>()))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
Mocker.GetMock<IImportApprovedMovie>()
|
||||||
|
.Setup(s => s.Import(It.IsAny<List<ImportDecision>>(), true, null, ImportMode.Auto))
|
||||||
|
.Returns(new List<ImportResult>());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenValidMovie()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IParsingService>()
|
||||||
|
.Setup(s => s.GetMovie(It.IsAny<string>()))
|
||||||
|
.Returns(Builder<Movie>.CreateNew().Build());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_search_for_series_using_folder_name()
|
||||||
|
{
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
Mocker.GetMock<IParsingService>().Verify(c => c.GetMovie("foldername"), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_skip_if_file_is_in_use_by_another_process()
|
||||||
|
{
|
||||||
|
GivenValidMovie();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.IsFileLocked(It.IsAny<string>()))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
VerifyNoImport();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_skip_if_no_series_found()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IParsingService>().Setup(c => c.GetMovie("foldername")).Returns((Movie)null);
|
||||||
|
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
Mocker.GetMock<IMakeImportDecision>()
|
||||||
|
.Verify(c => c.GetImportDecisions(It.IsAny<List<string>>(), It.IsAny<Movie>(), It.IsAny<ParsedMovieInfo>(), It.IsAny<bool>()),
|
||||||
|
Times.Never());
|
||||||
|
|
||||||
|
VerifyNoImport();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_import_if_folder_is_a_series_path()
|
||||||
|
{
|
||||||
|
GivenValidMovie();
|
||||||
|
|
||||||
|
Mocker.GetMock<IMovieService>()
|
||||||
|
.Setup(s => s.MoviePathExists(It.IsAny<string>()))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskScanService>()
|
||||||
|
.Setup(c => c.GetVideoFiles(It.IsAny<string>(), It.IsAny<bool>()))
|
||||||
|
.Returns(new string[0]);
|
||||||
|
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskScanService>()
|
||||||
|
.Verify(v => v.GetVideoFiles(It.IsAny<string>(), true), Times.Never());
|
||||||
|
|
||||||
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_delete_folder_if_no_files_were_imported()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IImportApprovedMovie>()
|
||||||
|
.Setup(s => s.Import(It.IsAny<List<ImportDecision>>(), false, null, ImportMode.Auto))
|
||||||
|
.Returns(new List<ImportResult>());
|
||||||
|
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
.Verify(v => v.GetFolderSize(It.IsAny<string>()), Times.Never());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_delete_folder_if_files_were_imported_and_video_files_remain()
|
||||||
|
{
|
||||||
|
GivenValidMovie();
|
||||||
|
|
||||||
|
var localMovie = new LocalMovie();
|
||||||
|
|
||||||
|
var imported = new List<ImportDecision>();
|
||||||
|
imported.Add(new ImportDecision(localMovie));
|
||||||
|
|
||||||
|
Mocker.GetMock<IMakeImportDecision>()
|
||||||
|
.Setup(s => s.GetImportDecisions(It.IsAny<List<string>>(), It.IsAny<Movie>(), null, true))
|
||||||
|
.Returns(imported);
|
||||||
|
|
||||||
|
Mocker.GetMock<IImportApprovedMovie>()
|
||||||
|
.Setup(s => s.Import(It.IsAny<List<ImportDecision>>(), true, null, ImportMode.Auto))
|
||||||
|
.Returns(imported.Select(i => new ImportResult(i)).ToList());
|
||||||
|
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
.Verify(v => v.DeleteFolder(It.IsAny<string>(), true), Times.Never());
|
||||||
|
|
||||||
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_delete_folder_if_files_were_imported_and_only_sample_files_remain()
|
||||||
|
{
|
||||||
|
GivenValidMovie();
|
||||||
|
|
||||||
|
var localMovie = new LocalMovie();
|
||||||
|
|
||||||
|
var imported = new List<ImportDecision>();
|
||||||
|
imported.Add(new ImportDecision(localMovie));
|
||||||
|
|
||||||
|
Mocker.GetMock<IMakeImportDecision>()
|
||||||
|
.Setup(s => s.GetImportDecisions(It.IsAny<List<string>>(), It.IsAny<Movie>(), null, true))
|
||||||
|
.Returns(imported);
|
||||||
|
|
||||||
|
Mocker.GetMock<IImportApprovedMovie>()
|
||||||
|
.Setup(s => s.Import(It.IsAny<List<ImportDecision>>(), true, null, ImportMode.Auto))
|
||||||
|
.Returns(imported.Select(i => new ImportResult(i)).ToList());
|
||||||
|
|
||||||
|
Mocker.GetMock<IDetectSample>()
|
||||||
|
.Setup(s => s.IsSample(It.IsAny<Movie>(),
|
||||||
|
It.IsAny<QualityModel>(),
|
||||||
|
It.IsAny<string>(),
|
||||||
|
It.IsAny<long>(),
|
||||||
|
It.IsAny<bool>()))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
.Verify(v => v.DeleteFolder(It.IsAny<string>(), true), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase("_UNPACK_")]
|
||||||
|
[TestCase("_FAILED_")]
|
||||||
|
public void should_remove_unpack_from_folder_name(string prefix)
|
||||||
|
{
|
||||||
|
var folderName = "47.ronin.2013.hdtv-lol";
|
||||||
|
var folders = new[] { string.Format(@"C:\Test\Unsorted\{0}{1}", prefix, folderName).AsOsAgnostic() };
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
.Setup(c => c.GetDirectories(It.IsAny<string>()))
|
||||||
|
.Returns(folders);
|
||||||
|
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
Mocker.GetMock<IParsingService>()
|
||||||
|
.Verify(v => v.GetMovie(folderName), Times.Once());
|
||||||
|
|
||||||
|
Mocker.GetMock<IParsingService>()
|
||||||
|
.Verify(v => v.GetMovie(It.Is<string>(s => s.StartsWith(prefix))), Times.Never());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_return_importresult_on_unknown_movie()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FolderExists(It.IsAny<string>()))
|
||||||
|
.Returns(false);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FileExists(It.IsAny<string>()))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
var fileName = @"C:\folder\file.mkv".AsOsAgnostic();
|
||||||
|
|
||||||
|
var result = Subject.ProcessPath(fileName);
|
||||||
|
|
||||||
|
result.Should().HaveCount(1);
|
||||||
|
result.First().ImportDecision.Should().NotBeNull();
|
||||||
|
result.First().ImportDecision.LocalMovie.Should().NotBeNull();
|
||||||
|
result.First().ImportDecision.LocalMovie.Path.Should().Be(fileName);
|
||||||
|
result.First().Result.Should().Be(ImportResultType.Rejected);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_delete_if_there_is_large_rar_file()
|
||||||
|
{
|
||||||
|
GivenValidMovie();
|
||||||
|
|
||||||
|
var localMovie = new LocalMovie();
|
||||||
|
|
||||||
|
var imported = new List<ImportDecision>();
|
||||||
|
imported.Add(new ImportDecision(localMovie));
|
||||||
|
|
||||||
|
Mocker.GetMock<IMakeImportDecision>()
|
||||||
|
.Setup(s => s.GetImportDecisions(It.IsAny<List<string>>(), It.IsAny<Movie>(), null, true))
|
||||||
|
.Returns(imported);
|
||||||
|
|
||||||
|
Mocker.GetMock<IImportApprovedMovie>()
|
||||||
|
.Setup(s => s.Import(It.IsAny<List<ImportDecision>>(), true, null, ImportMode.Auto))
|
||||||
|
.Returns(imported.Select(i => new ImportResult(i)).ToList());
|
||||||
|
|
||||||
|
Mocker.GetMock<IDetectSample>()
|
||||||
|
.Setup(s => s.IsSample(It.IsAny<Movie>(),
|
||||||
|
It.IsAny<QualityModel>(),
|
||||||
|
It.IsAny<string>(),
|
||||||
|
It.IsAny<long>(),
|
||||||
|
It.IsAny<bool>()))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
.Setup(s => s.GetFiles(It.IsAny<string>(), SearchOption.AllDirectories))
|
||||||
|
.Returns(new[] { _videoFiles.First().Replace(".ext", ".rar") });
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
.Setup(s => s.GetFileSize(It.IsAny<string>()))
|
||||||
|
.Returns(15.Megabytes());
|
||||||
|
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
.Verify(v => v.DeleteFolder(It.IsAny<string>(), true), Times.Never());
|
||||||
|
|
||||||
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_use_folder_if_folder_import()
|
||||||
|
{
|
||||||
|
GivenValidMovie();
|
||||||
|
|
||||||
|
var folderName = @"C:\media\ba09030e-1234-1234-1234-123456789abc\[HorribleSubs] American Psycho (2000) [720p]".AsOsAgnostic();
|
||||||
|
var fileName = @"C:\media\ba09030e-1234-1234-1234-123456789abc\[HorribleSubs] American Psycho (2000) [720p]\[HorribleSubs] American Psycho (2000) [720p].mkv".AsOsAgnostic();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FolderExists(folderName))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.GetFiles(folderName, SearchOption.TopDirectoryOnly))
|
||||||
|
.Returns(new[] { fileName });
|
||||||
|
|
||||||
|
var localMovie = new LocalMovie();
|
||||||
|
|
||||||
|
var imported = new List<ImportDecision>();
|
||||||
|
imported.Add(new ImportDecision(localMovie));
|
||||||
|
|
||||||
|
|
||||||
|
Subject.ProcessPath(fileName);
|
||||||
|
|
||||||
|
Mocker.GetMock<IMakeImportDecision>()
|
||||||
|
.Verify(s => s.GetImportDecisions(It.IsAny<List<string>>(), It.IsAny<Movie>(), It.IsAny<ParsedMovieInfo>(), true, false), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_use_folder_if_file_import()
|
||||||
|
{
|
||||||
|
GivenValidMovie();
|
||||||
|
|
||||||
|
var fileName = @"C:\media\ba09030e-1234-1234-1234-123456789abc\Torrents\[HorribleSubs] 47 Ronin (2013) [720p].mkv".AsOsAgnostic();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FolderExists(fileName))
|
||||||
|
.Returns(false);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FileExists(fileName))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
var localMovie = new LocalMovie();
|
||||||
|
|
||||||
|
var imported = new List<ImportDecision>();
|
||||||
|
imported.Add(new ImportDecision(localMovie));
|
||||||
|
|
||||||
|
var result = Subject.ProcessPath(fileName);
|
||||||
|
|
||||||
|
Mocker.GetMock<IMakeImportDecision>()
|
||||||
|
.Verify(s => s.GetImportDecisions(It.IsAny<List<string>>(), It.IsAny<Movie>(), null, true, false), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_process_if_file_and_folder_do_not_exist()
|
||||||
|
{
|
||||||
|
var folderName = @"C:\media\ba09030e-1234-1234-1234-123456789abc\[HorribleSubs] 47 Ronin (2013) [720p]".AsOsAgnostic();
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FolderExists(folderName))
|
||||||
|
.Returns(false);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>().Setup(c => c.FileExists(folderName))
|
||||||
|
.Returns(false);
|
||||||
|
|
||||||
|
Subject.ProcessPath(folderName).Should().BeEmpty();
|
||||||
|
|
||||||
|
Mocker.GetMock<IParsingService>()
|
||||||
|
.Verify(v => v.GetMovie(It.IsAny<string>()), Times.Never());
|
||||||
|
|
||||||
|
ExceptionVerification.ExpectedErrors(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_delete_if_no_files_were_imported()
|
||||||
|
{
|
||||||
|
GivenValidMovie();
|
||||||
|
|
||||||
|
var localMovie = new LocalMovie();
|
||||||
|
|
||||||
|
var imported = new List<ImportDecision>();
|
||||||
|
imported.Add(new ImportDecision(localMovie));
|
||||||
|
|
||||||
|
Mocker.GetMock<IMakeImportDecision>()
|
||||||
|
.Setup(s => s.GetImportDecisions(It.IsAny<List<string>>(), It.IsAny<Movie>(), null, true))
|
||||||
|
.Returns(imported);
|
||||||
|
|
||||||
|
Mocker.GetMock<IImportApprovedEpisodes>()
|
||||||
|
.Setup(s => s.Import(It.IsAny<List<ImportDecision>>(), true, null, ImportMode.Auto))
|
||||||
|
.Returns(new List<ImportResult>());
|
||||||
|
|
||||||
|
Mocker.GetMock<IDetectSample>()
|
||||||
|
.Setup(s => s.IsSample(It.IsAny<Movie>(),
|
||||||
|
It.IsAny<QualityModel>(),
|
||||||
|
It.IsAny<string>(),
|
||||||
|
It.IsAny<long>(),
|
||||||
|
It.IsAny<bool>()))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
.Setup(s => s.GetFileSize(It.IsAny<string>()))
|
||||||
|
.Returns(15.Megabytes());
|
||||||
|
|
||||||
|
Subject.ProcessRootFolder(new DirectoryInfo(_droneFactory));
|
||||||
|
|
||||||
|
Mocker.GetMock<IDiskProvider>()
|
||||||
|
.Verify(v => v.DeleteFolder(It.IsAny<string>(), true), Times.Never());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void VerifyNoImport()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IImportApprovedEpisodes>().Verify(c => c.Import(It.IsAny<List<ImportDecision>>(), true, null, ImportMode.Auto),
|
||||||
|
Times.Never());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void VerifyImport()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IImportApprovedEpisodes>().Verify(c => c.Import(It.IsAny<List<ImportDecision>>(), true, null, ImportMode.Auto),
|
||||||
|
Times.Once());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,8 +15,8 @@ namespace NzbDrone.Core.Test.Messaging.Commands
|
||||||
[Test]
|
[Test]
|
||||||
public void should_return_true_when_there_are_no_properties()
|
public void should_return_true_when_there_are_no_properties()
|
||||||
{
|
{
|
||||||
var command1 = new DownloadedEpisodesScanCommand();
|
var command1 = new DownloadedMoviesScanCommand();
|
||||||
var command2 = new DownloadedEpisodesScanCommand();
|
var command2 = new DownloadedMoviesScanCommand();
|
||||||
|
|
||||||
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeTrue();
|
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
|
@ -272,8 +272,8 @@
|
||||||
<Compile Include="MediaCoverTests\ImageResizerFixture.cs" />
|
<Compile Include="MediaCoverTests\ImageResizerFixture.cs" />
|
||||||
<Compile Include="MediaCoverTests\MediaCoverServiceFixture.cs" />
|
<Compile Include="MediaCoverTests\MediaCoverServiceFixture.cs" />
|
||||||
<Compile Include="MediaFiles\DiskScanServiceTests\ScanFixture.cs" />
|
<Compile Include="MediaFiles\DiskScanServiceTests\ScanFixture.cs" />
|
||||||
<Compile Include="MediaFiles\DownloadedEpisodesCommandServiceFixture.cs" />
|
<Compile Include="MediaFiles\DownloadedMoviesCommandServiceFixture.cs" />
|
||||||
<Compile Include="MediaFiles\DownloadedEpisodesImportServiceFixture.cs" />
|
<Compile Include="MediaFiles\DownloadedMoviesImportServiceFixture.cs" />
|
||||||
<Compile Include="MediaFiles\EpisodeFileMovingServiceTests\MoveEpisodeFileFixture.cs" />
|
<Compile Include="MediaFiles\EpisodeFileMovingServiceTests\MoveEpisodeFileFixture.cs" />
|
||||||
<Compile Include="MediaFiles\EpisodeImport\ImportDecisionMakerFixture.cs" />
|
<Compile Include="MediaFiles\EpisodeImport\ImportDecisionMakerFixture.cs" />
|
||||||
<Compile Include="MediaFiles\EpisodeImport\SampleServiceFixture.cs" />
|
<Compile Include="MediaFiles\EpisodeImport\SampleServiceFixture.cs" />
|
||||||
|
@ -590,4 +590,4 @@
|
||||||
<Target Name="AfterBuild">
|
<Target Name="AfterBuild">
|
||||||
</Target>
|
</Target>
|
||||||
-->
|
-->
|
||||||
</Project>
|
</Project>
|
|
@ -103,7 +103,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
||||||
var path = @"C:\TV".AsOsAgnostic();
|
var path = @"C:\TV".AsOsAgnostic();
|
||||||
|
|
||||||
Mocker.GetMock<IConfigService>()
|
Mocker.GetMock<IConfigService>()
|
||||||
.SetupGet(s => s.DownloadedEpisodesFolder)
|
.SetupGet(s => s.DownloadedMoviesFolder)
|
||||||
.Returns(path);
|
.Returns(path);
|
||||||
|
|
||||||
Assert.Throws<InvalidOperationException>(() => Subject.Add(new RootFolder { Path = path }));
|
Assert.Throws<InvalidOperationException>(() => Subject.Add(new RootFolder { Path = path }));
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace NzbDrone.Core.Configuration
|
||||||
{
|
{
|
||||||
public enum ConfigKey
|
public enum ConfigKey
|
||||||
{
|
{
|
||||||
DownloadedEpisodesFolder
|
DownloadedMoviesFolder
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ConfigService : IConfigService
|
public class ConfigService : IConfigService
|
||||||
|
@ -73,11 +73,11 @@ namespace NzbDrone.Core.Configuration
|
||||||
return _repository.Get(key.ToLower()) != null;
|
return _repository.Get(key.ToLower()) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string DownloadedEpisodesFolder
|
public string DownloadedMoviesFolder
|
||||||
{
|
{
|
||||||
get { return GetValue(ConfigKey.DownloadedEpisodesFolder.ToString()); }
|
get { return GetValue(ConfigKey.DownloadedMoviesFolder.ToString()); }
|
||||||
|
|
||||||
set { SetValue(ConfigKey.DownloadedEpisodesFolder.ToString(), value); }
|
set { SetValue(ConfigKey.DownloadedMoviesFolder.ToString(), value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool AutoUnmonitorPreviouslyDownloadedEpisodes
|
public bool AutoUnmonitorPreviouslyDownloadedEpisodes
|
||||||
|
@ -231,11 +231,11 @@ namespace NzbDrone.Core.Configuration
|
||||||
set { SetValue("DownloadClientWorkingFolders", value); }
|
set { SetValue("DownloadClientWorkingFolders", value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public int DownloadedEpisodesScanInterval
|
public int DownloadedMoviesScanInterval
|
||||||
{
|
{
|
||||||
get { return GetValueInt("DownloadedEpisodesScanInterval", 0); }
|
get { return GetValueInt("DownloadedMoviesScanInterval", 0); }
|
||||||
|
|
||||||
set { SetValue("DownloadedEpisodesScanInterval", value); }
|
set { SetValue("DownloadedMoviesScanInterval", value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public int DownloadClientHistoryLimit
|
public int DownloadClientHistoryLimit
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using NzbDrone.Core.MediaFiles;
|
using NzbDrone.Core.MediaFiles;
|
||||||
using NzbDrone.Common.Http.Proxy;
|
using NzbDrone.Common.Http.Proxy;
|
||||||
|
|
||||||
|
@ -11,9 +11,9 @@ namespace NzbDrone.Core.Configuration
|
||||||
bool IsDefined(string key);
|
bool IsDefined(string key);
|
||||||
|
|
||||||
//Download Client
|
//Download Client
|
||||||
string DownloadedEpisodesFolder { get; set; }
|
string DownloadedMoviesFolder { get; set; }
|
||||||
string DownloadClientWorkingFolders { get; set; }
|
string DownloadClientWorkingFolders { get; set; }
|
||||||
int DownloadedEpisodesScanInterval { get; set; }
|
int DownloadedMoviesScanInterval { get; set; }
|
||||||
int DownloadClientHistoryLimit { get; set; }
|
int DownloadClientHistoryLimit { get; set; }
|
||||||
|
|
||||||
//Completed/Failed Download Handling (Download client)
|
//Completed/Failed Download Handling (Download client)
|
||||||
|
|
|
@ -49,9 +49,9 @@ namespace NzbDrone.Core.DiskSpace
|
||||||
|
|
||||||
private IEnumerable<DiskSpace> GetDroneFactoryFreeSpace()
|
private IEnumerable<DiskSpace> GetDroneFactoryFreeSpace()
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrWhiteSpace(_configService.DownloadedEpisodesFolder))
|
if (!string.IsNullOrWhiteSpace(_configService.DownloadedMoviesFolder))
|
||||||
{
|
{
|
||||||
return GetDiskSpace(new[] { _diskProvider.GetPathRoot(_configService.DownloadedEpisodesFolder) });
|
return GetDiskSpace(new[] { _diskProvider.GetPathRoot(_configService.DownloadedMoviesFolder) });
|
||||||
}
|
}
|
||||||
|
|
||||||
return new List<DiskSpace>();
|
return new List<DiskSpace>();
|
||||||
|
|
|
@ -127,7 +127,7 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic
|
||||||
|
|
||||||
if (Settings.StrmFolder.IsNullOrWhiteSpace())
|
if (Settings.StrmFolder.IsNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
folder = _configService.DownloadedEpisodesFolder;
|
folder = _configService.DownloadedMoviesFolder;
|
||||||
|
|
||||||
if (folder.IsNullOrWhiteSpace())
|
if (folder.IsNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,7 +26,6 @@ namespace NzbDrone.Core.Download
|
||||||
private readonly IConfigService _configService;
|
private readonly IConfigService _configService;
|
||||||
private readonly IEventAggregator _eventAggregator;
|
private readonly IEventAggregator _eventAggregator;
|
||||||
private readonly IHistoryService _historyService;
|
private readonly IHistoryService _historyService;
|
||||||
private readonly IDownloadedEpisodesImportService _downloadedEpisodesImportService;
|
|
||||||
private readonly IDownloadedMovieImportService _downloadedMovieImportService;
|
private readonly IDownloadedMovieImportService _downloadedMovieImportService;
|
||||||
private readonly IParsingService _parsingService;
|
private readonly IParsingService _parsingService;
|
||||||
private readonly IMovieService _movieService;
|
private readonly IMovieService _movieService;
|
||||||
|
@ -36,7 +35,6 @@ namespace NzbDrone.Core.Download
|
||||||
public CompletedDownloadService(IConfigService configService,
|
public CompletedDownloadService(IConfigService configService,
|
||||||
IEventAggregator eventAggregator,
|
IEventAggregator eventAggregator,
|
||||||
IHistoryService historyService,
|
IHistoryService historyService,
|
||||||
IDownloadedEpisodesImportService downloadedEpisodesImportService,
|
|
||||||
IDownloadedMovieImportService downloadedMovieImportService,
|
IDownloadedMovieImportService downloadedMovieImportService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
ISeriesService seriesService,
|
ISeriesService seriesService,
|
||||||
|
@ -46,7 +44,6 @@ namespace NzbDrone.Core.Download
|
||||||
_configService = configService;
|
_configService = configService;
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
_historyService = historyService;
|
_historyService = historyService;
|
||||||
_downloadedEpisodesImportService = downloadedEpisodesImportService;
|
|
||||||
_downloadedMovieImportService = downloadedMovieImportService;
|
_downloadedMovieImportService = downloadedMovieImportService;
|
||||||
_parsingService = parsingService;
|
_parsingService = parsingService;
|
||||||
_movieService = movieService;
|
_movieService = movieService;
|
||||||
|
@ -86,9 +83,9 @@ namespace NzbDrone.Core.Download
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var downloadedEpisodesFolder = new OsPath(_configService.DownloadedEpisodesFolder);
|
var downloadedMoviesFolder = new OsPath(_configService.DownloadedMoviesFolder);
|
||||||
|
|
||||||
if (downloadedEpisodesFolder.Contains(downloadItemOutputPath))
|
if (downloadedMoviesFolder.Contains(downloadItemOutputPath))
|
||||||
{
|
{
|
||||||
trackedDownload.Warn("Intermediate Download path inside drone factory, Skipping.");
|
trackedDownload.Warn("Intermediate Download path inside drone factory, Skipping.");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace NzbDrone.Core.HealthCheck.Checks
|
||||||
|
|
||||||
public override HealthCheck Check()
|
public override HealthCheck Check()
|
||||||
{
|
{
|
||||||
var droneFactoryFolder = _configService.DownloadedEpisodesFolder;
|
var droneFactoryFolder = _configService.DownloadedMoviesFolder;
|
||||||
|
|
||||||
if (droneFactoryFolder.IsNullOrWhiteSpace())
|
if (droneFactoryFolder.IsNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace NzbDrone.Core.HealthCheck.Checks
|
||||||
|
|
||||||
public override HealthCheck Check()
|
public override HealthCheck Check()
|
||||||
{
|
{
|
||||||
var droneFactoryFolder = new OsPath(_configService.DownloadedEpisodesFolder);
|
var droneFactoryFolder = new OsPath(_configService.DownloadedMoviesFolder);
|
||||||
List<ImportMechanismCheckStatus> downloadClients;
|
List<ImportMechanismCheckStatus> downloadClients;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
@ -94,9 +94,9 @@ namespace NzbDrone.Core.Jobs
|
||||||
|
|
||||||
new ScheduledTask
|
new ScheduledTask
|
||||||
{
|
{
|
||||||
Interval = _configService.DownloadedEpisodesScanInterval,
|
Interval = _configService.DownloadedMoviesScanInterval,
|
||||||
TypeName = typeof(DownloadedEpisodesScanCommand).FullName
|
//TypeName = typeof(DownloadedEpisodesScanCommand).FullName
|
||||||
//TypeName = typeof(DownloadedMovieScanCommand).FullName
|
TypeName = typeof(DownloadedMoviesScanCommand).FullName
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -178,13 +178,13 @@ namespace NzbDrone.Core.Jobs
|
||||||
var rss = _scheduledTaskRepository.GetDefinition(typeof(RssSyncCommand));
|
var rss = _scheduledTaskRepository.GetDefinition(typeof(RssSyncCommand));
|
||||||
rss.Interval = _configService.RssSyncInterval;
|
rss.Interval = _configService.RssSyncInterval;
|
||||||
|
|
||||||
var downloadedEpisodes = _scheduledTaskRepository.GetDefinition(typeof(DownloadedEpisodesScanCommand));
|
var downloadedMovies = _scheduledTaskRepository.GetDefinition(typeof(DownloadedMoviesScanCommand));
|
||||||
downloadedEpisodes.Interval = _configService.DownloadedEpisodesScanInterval;
|
downloadedMovies.Interval = _configService.DownloadedMoviesScanInterval;
|
||||||
|
|
||||||
var netImport = _scheduledTaskRepository.GetDefinition(typeof(NetImportSyncCommand));
|
var netImport = _scheduledTaskRepository.GetDefinition(typeof(NetImportSyncCommand));
|
||||||
netImport.Interval = _configService.NetImportSyncInterval;
|
netImport.Interval = _configService.NetImportSyncInterval;
|
||||||
|
|
||||||
_scheduledTaskRepository.UpdateMany(new List<ScheduledTask> { rss, downloadedEpisodes, netImport });
|
_scheduledTaskRepository.UpdateMany(new List<ScheduledTask> { rss, downloadedMovies, netImport });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ using NzbDrone.Core.Messaging.Commands;
|
||||||
|
|
||||||
namespace NzbDrone.Core.MediaFiles.Commands
|
namespace NzbDrone.Core.MediaFiles.Commands
|
||||||
{
|
{
|
||||||
public class DownloadedMovieScanCommand : Command
|
public class DownloadedMoviesScanCommand : Command
|
||||||
{
|
{
|
||||||
public override bool SendUpdatesToClient => SendUpdates;
|
public override bool SendUpdatesToClient => SendUpdates;
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ using System.Text;
|
||||||
|
|
||||||
namespace NzbDrone.Core.MediaFiles
|
namespace NzbDrone.Core.MediaFiles
|
||||||
{
|
{
|
||||||
public class DownloadedMovieCommandService : IExecute<DownloadedMovieScanCommand>
|
public class DownloadedMovieCommandService : IExecute<DownloadedMoviesScanCommand>
|
||||||
{
|
{
|
||||||
private readonly IDownloadedMovieImportService _downloadedMovieImportService;
|
private readonly IDownloadedMovieImportService _downloadedMovieImportService;
|
||||||
private readonly ITrackedDownloadService _trackedDownloadService;
|
private readonly ITrackedDownloadService _trackedDownloadService;
|
||||||
|
@ -37,24 +37,24 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
|
|
||||||
private List<ImportResult> ProcessDroneFactoryFolder()
|
private List<ImportResult> ProcessDroneFactoryFolder()
|
||||||
{
|
{
|
||||||
var downloadedEpisodesFolder = _configService.DownloadedEpisodesFolder;
|
var downloadedMoviesFolder = _configService.DownloadedMoviesFolder;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(downloadedEpisodesFolder))
|
if (string.IsNullOrEmpty(downloadedMoviesFolder))
|
||||||
{
|
{
|
||||||
_logger.Trace("Drone Factory folder is not configured");
|
_logger.Trace("Drone Factory folder is not configured");
|
||||||
return new List<ImportResult>();
|
return new List<ImportResult>();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_diskProvider.FolderExists(downloadedEpisodesFolder))
|
if (!_diskProvider.FolderExists(downloadedMoviesFolder))
|
||||||
{
|
{
|
||||||
_logger.Warn("Drone Factory folder [{0}] doesn't exist.", downloadedEpisodesFolder);
|
_logger.Warn("Drone Factory folder [{0}] doesn't exist.", downloadedMoviesFolder);
|
||||||
return new List<ImportResult>();
|
return new List<ImportResult>();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _downloadedMovieImportService.ProcessRootFolder(new DirectoryInfo(downloadedEpisodesFolder));
|
return _downloadedMovieImportService.ProcessRootFolder(new DirectoryInfo(downloadedMoviesFolder));
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<ImportResult> ProcessPath(DownloadedMovieScanCommand message)
|
private List<ImportResult> ProcessPath(DownloadedMoviesScanCommand message)
|
||||||
{
|
{
|
||||||
if (!_diskProvider.FolderExists(message.Path) && !_diskProvider.FileExists(message.Path))
|
if (!_diskProvider.FolderExists(message.Path) && !_diskProvider.FileExists(message.Path))
|
||||||
{
|
{
|
||||||
|
@ -83,7 +83,7 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
return _downloadedMovieImportService.ProcessPath(message.Path, message.ImportMode);
|
return _downloadedMovieImportService.ProcessPath(message.Path, message.ImportMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Execute(DownloadedMovieScanCommand message)
|
public void Execute(DownloadedMoviesScanCommand message)
|
||||||
{
|
{
|
||||||
List<ImportResult> importResults;
|
List<ImportResult> importResults;
|
||||||
|
|
||||||
|
|
|
@ -258,7 +258,7 @@ namespace NzbDrone.Core.MediaFiles
|
||||||
|
|
||||||
private ImportResult UnknownMovieResult(string message, string videoFile = null)
|
private ImportResult UnknownMovieResult(string message, string videoFile = null)
|
||||||
{
|
{
|
||||||
var localEpisode = videoFile == null ? null : new LocalEpisode { Path = videoFile };
|
var localEpisode = videoFile == null ? null : new LocalMovie { Path = videoFile };
|
||||||
|
|
||||||
return new ImportResult(new ImportDecision(localEpisode, new Rejection("Unknown Movie")), message);
|
return new ImportResult(new ImportDecision(localEpisode, new Rejection("Unknown Movie")), message);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,8 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
|
||||||
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Series series);
|
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Series series);
|
||||||
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie);
|
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie);
|
||||||
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie, bool shouldCheckQuality);
|
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie, bool shouldCheckQuality);
|
||||||
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldCheckQuality); //TODO: Needs changing to ParsedMovieInfo!!
|
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldCheckQuality);
|
||||||
|
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource);
|
||||||
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Series series, ParsedEpisodeInfo folderInfo, bool sceneSource);
|
List<ImportDecision> GetImportDecisions(List<string> videoFiles, Series series, ParsedEpisodeInfo folderInfo, bool sceneSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +87,23 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
|
||||||
return decisions;
|
return decisions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource)
|
||||||
|
{
|
||||||
|
var newFiles = _mediaFileService.FilterExistingFiles(videoFiles.ToList(), movie);
|
||||||
|
|
||||||
|
_logger.Debug("Analyzing {0}/{1} files.", newFiles.Count, videoFiles.Count());
|
||||||
|
|
||||||
|
var shouldUseFolderName = ShouldUseFolderName(videoFiles, movie, folderInfo);
|
||||||
|
var decisions = new List<ImportDecision>();
|
||||||
|
|
||||||
|
foreach (var file in newFiles)
|
||||||
|
{
|
||||||
|
decisions.AddIfNotNull(GetDecision(file, movie, folderInfo, sceneSource, shouldUseFolderName));
|
||||||
|
}
|
||||||
|
|
||||||
|
return decisions;
|
||||||
|
}
|
||||||
|
|
||||||
public List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldCheckQuality = false)
|
public List<ImportDecision> GetImportDecisions(List<string> videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldCheckQuality = false)
|
||||||
{
|
{
|
||||||
var newFiles = _mediaFileService.FilterExistingFiles(videoFiles.ToList(), movie);
|
var newFiles = _mediaFileService.FilterExistingFiles(videoFiles.ToList(), movie);
|
||||||
|
|
|
@ -36,7 +36,6 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
private readonly IImportApprovedEpisodes _importApprovedEpisodes;
|
private readonly IImportApprovedEpisodes _importApprovedEpisodes;
|
||||||
private readonly IImportApprovedMovie _importApprovedMovie;
|
private readonly IImportApprovedMovie _importApprovedMovie;
|
||||||
private readonly ITrackedDownloadService _trackedDownloadService;
|
private readonly ITrackedDownloadService _trackedDownloadService;
|
||||||
private readonly IDownloadedEpisodesImportService _downloadedEpisodesImportService;
|
|
||||||
private readonly IDownloadedMovieImportService _downloadedMovieImportService;
|
private readonly IDownloadedMovieImportService _downloadedMovieImportService;
|
||||||
private readonly IEventAggregator _eventAggregator;
|
private readonly IEventAggregator _eventAggregator;
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
@ -52,7 +51,6 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
IImportApprovedEpisodes importApprovedEpisodes,
|
IImportApprovedEpisodes importApprovedEpisodes,
|
||||||
IImportApprovedMovie importApprovedMovie,
|
IImportApprovedMovie importApprovedMovie,
|
||||||
ITrackedDownloadService trackedDownloadService,
|
ITrackedDownloadService trackedDownloadService,
|
||||||
IDownloadedEpisodesImportService downloadedEpisodesImportService,
|
|
||||||
IDownloadedMovieImportService downloadedMovieImportService,
|
IDownloadedMovieImportService downloadedMovieImportService,
|
||||||
IEventAggregator eventAggregator,
|
IEventAggregator eventAggregator,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
|
@ -68,7 +66,6 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
_importApprovedEpisodes = importApprovedEpisodes;
|
_importApprovedEpisodes = importApprovedEpisodes;
|
||||||
_importApprovedMovie = importApprovedMovie;
|
_importApprovedMovie = importApprovedMovie;
|
||||||
_trackedDownloadService = trackedDownloadService;
|
_trackedDownloadService = trackedDownloadService;
|
||||||
_downloadedEpisodesImportService = downloadedEpisodesImportService;
|
|
||||||
_downloadedMovieImportService = downloadedMovieImportService;
|
_downloadedMovieImportService = downloadedMovieImportService;
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
|
|
@ -787,7 +787,6 @@
|
||||||
<Compile Include="MediaCover\MediaCoversUpdatedEvent.cs" />
|
<Compile Include="MediaCover\MediaCoversUpdatedEvent.cs" />
|
||||||
<Compile Include="MediaFiles\Commands\BackendCommandAttribute.cs" />
|
<Compile Include="MediaFiles\Commands\BackendCommandAttribute.cs" />
|
||||||
<Compile Include="MediaFiles\Commands\CleanUpRecycleBinCommand.cs" />
|
<Compile Include="MediaFiles\Commands\CleanUpRecycleBinCommand.cs" />
|
||||||
<Compile Include="MediaFiles\Commands\DownloadedEpisodesScanCommand.cs" />
|
|
||||||
<Compile Include="MediaFiles\Commands\DownloadedMovieScanCommand.cs" />
|
<Compile Include="MediaFiles\Commands\DownloadedMovieScanCommand.cs" />
|
||||||
<Compile Include="MediaFiles\Commands\RenameMovieCommand.cs" />
|
<Compile Include="MediaFiles\Commands\RenameMovieCommand.cs" />
|
||||||
<Compile Include="MediaFiles\Commands\RenameMovieFilesCommand.cs" />
|
<Compile Include="MediaFiles\Commands\RenameMovieFilesCommand.cs" />
|
||||||
|
@ -812,10 +811,6 @@
|
||||||
<Compile Include="MediaFiles\DiskScanService.cs">
|
<Compile Include="MediaFiles\DiskScanService.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="MediaFiles\DownloadedEpisodesImportService.cs">
|
|
||||||
<SubType>Code</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="MediaFiles\DownloadedEpisodesCommandService.cs" />
|
|
||||||
<Compile Include="MediaFiles\EpisodeFile.cs" />
|
<Compile Include="MediaFiles\EpisodeFile.cs" />
|
||||||
<Compile Include="MediaFiles\EpisodeFileMoveResult.cs" />
|
<Compile Include="MediaFiles\EpisodeFileMoveResult.cs" />
|
||||||
<Compile Include="MediaFiles\EpisodeFileMovingService.cs" />
|
<Compile Include="MediaFiles\EpisodeFileMovingService.cs" />
|
||||||
|
|
|
@ -110,7 +110,7 @@ namespace NzbDrone.Core.RootFolders
|
||||||
throw new InvalidOperationException("Recent directory already exists.");
|
throw new InvalidOperationException("Recent directory already exists.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_configService.DownloadedEpisodesFolder.IsNotNullOrWhiteSpace() && _configService.DownloadedEpisodesFolder.PathEquals(rootFolder.Path))
|
if (_configService.DownloadedMoviesFolder.IsNotNullOrWhiteSpace() && _configService.DownloadedMoviesFolder.PathEquals(rootFolder.Path))
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Drone Factory folder cannot be used.");
|
throw new InvalidOperationException("Drone Factory folder cannot be used.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ namespace NzbDrone.Core.Validation.Paths
|
||||||
{
|
{
|
||||||
if (context.PropertyValue == null) return false;
|
if (context.PropertyValue == null) return false;
|
||||||
|
|
||||||
var droneFactory = _configService.DownloadedEpisodesFolder;
|
var droneFactory = _configService.DownloadedMoviesFolder;
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(droneFactory)) return true;
|
if (string.IsNullOrWhiteSpace(droneFactory)) return true;
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-8 col-sm-pull-1">
|
<div class="col-sm-8 col-sm-pull-1">
|
||||||
<input type="text" name="downloadedEpisodesFolder" class="form-control x-path" />
|
<input type="text" name="downloadedMoviesFolder" class="form-control x-path" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-2 col-sm-pull-1">
|
<div class="col-sm-2 col-sm-pull-1">
|
||||||
<input type="number" name="downloadedEpisodesScanInterval" class="form-control" />
|
<input type="number" name="downloadedMoviesScanInterval" class="form-control" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
Loading…
Add table
Add a link
Reference in a new issue