From d61ba765749ef876068409aa83bb1a20b91aca5d Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 13 Sep 2018 22:28:17 -0400 Subject: [PATCH] New: Choose extension for magnet links in Torrent Blackhole Co-Authored-By: Mark McDowall --- .../Blackhole/TorrentBlackholeFixture.cs | 25 ++++++++++++++++++- .../Clients/Blackhole/TorrentBlackhole.cs | 2 +- .../Blackhole/TorrentBlackholeSettings.cs | 11 +++++--- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs index d43459362..e972fc474 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs @@ -32,7 +32,6 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole _completedDownloadFolder = @"c:\blackhole\completed".AsOsAgnostic(); _blackholeFolder = @"c:\blackhole\torrent".AsOsAgnostic(); _filePath = (@"c:\blackhole\torrent\" + _title + ".torrent").AsOsAgnostic(); - _magnetFilePath = Path.ChangeExtension(_filePath, ".magnet"); Mocker.SetConstant(Mocker.Resolve()); @@ -79,6 +78,11 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole .Returns(1000000); } + protected void GivenMagnetFilePath(string extension = ".magnet") + { + _magnetFilePath = Path.ChangeExtension(_filePath, extension); + } + protected override RemoteAlbum CreateRemoteAlbum() { var remoteAlbum = base.CreateRemoteAlbum(); @@ -145,7 +149,25 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole [Test] public void Download_should_save_magnet_if_enabled() { + GivenMagnetFilePath(); + Subject.Definition.Settings.As().SaveMagnetFiles = true; + var remoteAlbum = CreateRemoteAlbum(); + remoteAlbum.Release.DownloadUrl = null; + Subject.Download(remoteAlbum); + Mocker.GetMock().Verify(c => c.Get(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Never()); + Mocker.GetMock().Verify(c => c.OpenWriteStream(_filePath), Times.Never()); + Mocker.GetMock().Verify(c => c.OpenWriteStream(_magnetFilePath), Times.Once()); + Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), It.IsAny()), Times.Never()); + } + + [Test] + public void Download_should_save_magnet_using_specified_extension() + { + var magnetFileExtension = ".url"; + GivenMagnetFilePath(magnetFileExtension); + Subject.Definition.Settings.As().SaveMagnetFiles = true; + Subject.Definition.Settings.As().MagnetFileExtension = magnetFileExtension; var remoteAlbum = CreateRemoteAlbum(); remoteAlbum.Release.DownloadUrl = null; @@ -161,6 +183,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole [Test] public void Download_should_not_save_magnet_if_disabled() { + GivenMagnetFilePath(); var remoteAlbum = CreateRemoteAlbum(); remoteAlbum.Release.DownloadUrl = null; diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs index 7851cdda1..0558e4692 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackhole.cs @@ -49,7 +49,7 @@ namespace NzbDrone.Core.Download.Clients.Blackhole title = FileNameBuilder.CleanFileName(title); - var filepath = Path.Combine(Settings.TorrentFolder, string.Format("{0}.magnet", title)); + var filepath = Path.Combine(Settings.TorrentFolder, $"{title}.{Settings.MagnetFileExtension.Trim('.')}"); var fileContent = Encoding.UTF8.GetBytes(magnetLink); using (var stream = _diskProvider.OpenWriteStream(filepath)) diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs index 943319a63..e08d89e39 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs @@ -1,4 +1,4 @@ -using System.ComponentModel; +using System.ComponentModel; using FluentValidation; using Newtonsoft.Json; using NzbDrone.Core.Annotations; @@ -14,6 +14,7 @@ namespace NzbDrone.Core.Download.Clients.Blackhole { //Todo: Validate that the path actually exists RuleFor(c => c.TorrentFolder).IsValidPath(); + RuleFor(c => c.MagnetFileExtension).NotEmpty(); } } @@ -21,6 +22,7 @@ namespace NzbDrone.Core.Download.Clients.Blackhole { public TorrentBlackholeSettings() { + MagnetFileExtension = ".magnet"; ReadOnly = true; } @@ -34,12 +36,15 @@ namespace NzbDrone.Core.Download.Clients.Blackhole [DefaultValue(false)] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] - [FieldDefinition(2, Label = "Save Magnet Files", Type = FieldType.Checkbox, HelpText = "Save a .magnet file with the magnet link if no .torrent file is available (only useful if the download client supports .magnet files)")] + [FieldDefinition(2, Label = "Save Magnet Files", Type = FieldType.Checkbox, HelpText = "Save the magnet link if no .torrent file is available (only useful if the download client supports magnets saved to a file)")] public bool SaveMagnetFiles { get; set; } + [FieldDefinition(3, Label = "Magnet File Extension", Type = FieldType.Textbox, HelpText = "Extension to use for magnet links, defaults to '.magnet'")] + public string MagnetFileExtension { get; set; } + [DefaultValue(false)] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] - [FieldDefinition(3, Label = "Read Only", Type = FieldType.Checkbox, HelpText = "Instead of moving files this will instruct Lidarr to Copy or Hardlink (depending on settings/system configuration)")] + [FieldDefinition(4, Label = "Read Only", Type = FieldType.Checkbox, HelpText = "Instead of moving files this will instruct Lidarr to Copy or Hardlink (depending on settings/system configuration)")] public bool ReadOnly { get; set; } public NzbDroneValidationResult Validate()