Fixed: Now shows UI notification if downloading nzb from indexer fails.
This commit is contained in:
parent
70fc927e9f
commit
56436fea69
|
@ -6,6 +6,7 @@ using NLog;
|
|||
using NzbDrone.Api.Mapping;
|
||||
using NzbDrone.Core.DecisionEngine;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.IndexerSearch;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Parser;
|
||||
|
@ -16,6 +17,7 @@ using Nancy.ModelBinding;
|
|||
using NzbDrone.Api.Extensions;
|
||||
using NzbDrone.Common.Cache;
|
||||
using System.Threading;
|
||||
using SystemNetHttpStatusCode = System.Net.HttpStatusCode;
|
||||
|
||||
namespace NzbDrone.Api.Indexers
|
||||
{
|
||||
|
@ -66,7 +68,15 @@ namespace NzbDrone.Api.Indexers
|
|||
return new NotFoundResponse();
|
||||
}
|
||||
|
||||
_downloadService.DownloadReport(remoteEpisode);
|
||||
try
|
||||
{
|
||||
_downloadService.DownloadReport(remoteEpisode);
|
||||
}
|
||||
catch (ReleaseDownloadException ex)
|
||||
{
|
||||
_logger.ErrorException(ex.Message, ex);
|
||||
throw new NzbDroneClientException(SystemNetHttpStatusCode.Conflict, "Getting release from indexer failed");
|
||||
}
|
||||
|
||||
return release.AsResponse();
|
||||
}
|
||||
|
|
|
@ -100,14 +100,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
|
|||
protected void GivenFailedDownload()
|
||||
{
|
||||
Mocker.GetMock<INzbgetProxy>()
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Stream>(), It.IsAny<String>(), It.IsAny<String>(), It.IsAny<int>(), It.IsAny<NzbgetSettings>()))
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Byte[]>(), It.IsAny<String>(), It.IsAny<String>(), It.IsAny<int>(), It.IsAny<NzbgetSettings>()))
|
||||
.Returns((String)null);
|
||||
}
|
||||
|
||||
protected void GivenSuccessfulDownload()
|
||||
{
|
||||
Mocker.GetMock<INzbgetProxy>()
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Stream>(), It.IsAny<String>(), It.IsAny<String>(), It.IsAny<int>(), It.IsAny<NzbgetSettings>()))
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Byte[]>(), It.IsAny<String>(), It.IsAny<String>(), It.IsAny<int>(), It.IsAny<NzbgetSettings>()))
|
||||
.Returns(Guid.NewGuid().ToString().Replace("-", ""));
|
||||
}
|
||||
|
||||
|
|
|
@ -114,14 +114,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||
protected void GivenFailedDownload()
|
||||
{
|
||||
Mocker.GetMock<ISabnzbdProxy>()
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Stream>(), It.IsAny<String>(), It.IsAny<String>(), It.IsAny<int>(), It.IsAny<SabnzbdSettings>()))
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Byte[]>(), It.IsAny<String>(), It.IsAny<String>(), It.IsAny<int>(), It.IsAny<SabnzbdSettings>()))
|
||||
.Returns((SabnzbdAddResponse)null);
|
||||
}
|
||||
|
||||
protected void GivenSuccessfulDownload()
|
||||
{
|
||||
Mocker.GetMock<ISabnzbdProxy>()
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Stream>(), It.IsAny<String>(), It.IsAny<String>(), It.IsAny<int>(), It.IsAny<SabnzbdSettings>()))
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Byte[]>(), It.IsAny<String>(), It.IsAny<String>(), It.IsAny<int>(), It.IsAny<SabnzbdSettings>()))
|
||||
.Returns(new SabnzbdAddResponse()
|
||||
{
|
||||
Status = true,
|
||||
|
@ -267,7 +267,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||
public void Download_should_use_sabRecentTvPriority_when_recentEpisode_is_true()
|
||||
{
|
||||
Mocker.GetMock<ISabnzbdProxy>()
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Stream>(), It.IsAny<String>(), It.IsAny<String>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>()))
|
||||
.Setup(s => s.DownloadNzb(It.IsAny<Byte[]>(), It.IsAny<String>(), It.IsAny<String>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>()))
|
||||
.Returns(new SabnzbdAddResponse());
|
||||
|
||||
var remoteEpisode = CreateRemoteEpisode();
|
||||
|
@ -280,7 +280,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
|||
Subject.Download(remoteEpisode);
|
||||
|
||||
Mocker.GetMock<ISabnzbdProxy>()
|
||||
.Verify(v => v.DownloadNzb(It.IsAny<Stream>(), It.IsAny<String>(), It.IsAny<String>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>()), Times.Once());
|
||||
.Verify(v => v.DownloadNzb(It.IsAny<Byte[]>(), It.IsAny<String>(), It.IsAny<String>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>()), Times.Once());
|
||||
}
|
||||
|
||||
[TestCase(@"Droned.S01E01.Pilot.1080p.WEB-DL-DRONE", @"Droned.S01E01_Pilot_1080p_WEB-DL-DRONE.mkv")]
|
||||
|
|
|
@ -15,10 +15,9 @@ using NzbDrone.Core.Validation;
|
|||
|
||||
namespace NzbDrone.Core.Download.Clients.Nzbget
|
||||
{
|
||||
public class Nzbget : DownloadClientBase<NzbgetSettings>
|
||||
public class Nzbget : UsenetClientBase<NzbgetSettings>
|
||||
{
|
||||
private readonly INzbgetProxy _proxy;
|
||||
private readonly IHttpClient _httpClient;
|
||||
|
||||
public Nzbget(INzbgetProxy proxy,
|
||||
IHttpClient httpClient,
|
||||
|
@ -26,36 +25,19 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
|
|||
IDiskProvider diskProvider,
|
||||
IParsingService parsingService,
|
||||
Logger logger)
|
||||
: base(configService, diskProvider, parsingService, logger)
|
||||
: base(httpClient, configService, diskProvider, parsingService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
_httpClient = httpClient;
|
||||
}
|
||||
|
||||
public override DownloadProtocol Protocol
|
||||
protected override string AddFromNzbFile(RemoteEpisode remoteEpisode, string filename, byte[] fileContent)
|
||||
{
|
||||
get
|
||||
{
|
||||
return DownloadProtocol.Usenet;
|
||||
}
|
||||
}
|
||||
|
||||
public override string Download(RemoteEpisode remoteEpisode)
|
||||
{
|
||||
var url = remoteEpisode.Release.DownloadUrl;
|
||||
var title = remoteEpisode.Release.Title + ".nzb";
|
||||
var category = Settings.TvCategory;
|
||||
var priority = remoteEpisode.IsRecentEpisode() ? Settings.RecentTvPriority : Settings.OlderTvPriority;
|
||||
|
||||
_logger.Info("Adding report [{0}] to the queue.", title);
|
||||
var response = _proxy.DownloadNzb(fileContent, filename, category, priority, Settings);
|
||||
|
||||
using (var nzb = _httpClient.Get(new HttpRequest(url)).GetStream())
|
||||
{
|
||||
_logger.Info("Adding report [{0}] to the queue.", title);
|
||||
var response = _proxy.DownloadNzb(nzb, title, category, priority, Settings);
|
||||
|
||||
return response;
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
private IEnumerable<DownloadClientItem> GetQueue()
|
||||
|
|
|
@ -12,7 +12,7 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
|
|||
{
|
||||
public interface INzbgetProxy
|
||||
{
|
||||
string DownloadNzb(Stream nzb, string title, string category, int priority, NzbgetSettings settings);
|
||||
string DownloadNzb(Byte[] nzbData, string title, string category, int priority, NzbgetSettings settings);
|
||||
NzbgetGlobalStatus GetGlobalStatus(NzbgetSettings settings);
|
||||
List<NzbgetQueueItem> GetQueue(NzbgetSettings settings);
|
||||
List<NzbgetPostQueueItem> GetPostQueue(NzbgetSettings settings);
|
||||
|
@ -32,9 +32,9 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
|
|||
_logger = logger;
|
||||
}
|
||||
|
||||
public string DownloadNzb(Stream nzb, string title, string category, int priority, NzbgetSettings settings)
|
||||
public string DownloadNzb(Byte[] nzbData, string title, string category, int priority, NzbgetSettings settings)
|
||||
{
|
||||
var parameters = new object[] { title, category, priority, false, Convert.ToBase64String(nzb.ToBytes()) };
|
||||
var parameters = new object[] { title, category, priority, false, Convert.ToBase64String(nzbData) };
|
||||
var request = BuildRequest(new JsonRequest("append", parameters));
|
||||
|
||||
var response = Json.Deserialize<NzbgetResponse<Boolean>>(ProcessRequest(request, settings));
|
||||
|
|
|
@ -16,10 +16,9 @@ using NzbDrone.Core.Validation;
|
|||
|
||||
namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
||||
{
|
||||
public class Sabnzbd : DownloadClientBase<SabnzbdSettings>
|
||||
public class Sabnzbd : UsenetClientBase<SabnzbdSettings>
|
||||
{
|
||||
private readonly ISabnzbdProxy _proxy;
|
||||
private readonly IHttpClient _httpClient;
|
||||
|
||||
public Sabnzbd(ISabnzbdProxy proxy,
|
||||
IHttpClient httpClient,
|
||||
|
@ -27,39 +26,25 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
|||
IDiskProvider diskProvider,
|
||||
IParsingService parsingService,
|
||||
Logger logger)
|
||||
: base(configService, diskProvider, parsingService, logger)
|
||||
: base(httpClient, configService, diskProvider, parsingService, logger)
|
||||
{
|
||||
_proxy = proxy;
|
||||
_httpClient = httpClient;
|
||||
}
|
||||
|
||||
public override DownloadProtocol Protocol
|
||||
protected override string AddFromNzbFile(RemoteEpisode remoteEpisode, string filename, byte[] fileContent)
|
||||
{
|
||||
get
|
||||
{
|
||||
return DownloadProtocol.Usenet;
|
||||
}
|
||||
}
|
||||
|
||||
public override string Download(RemoteEpisode remoteEpisode)
|
||||
{
|
||||
var url = remoteEpisode.Release.DownloadUrl;
|
||||
var title = remoteEpisode.Release.Title;
|
||||
var category = Settings.TvCategory;
|
||||
var priority = remoteEpisode.IsRecentEpisode() ? Settings.RecentTvPriority : Settings.OlderTvPriority;
|
||||
|
||||
using (var nzb = _httpClient.Get(new HttpRequest(url)).GetStream())
|
||||
var response = _proxy.DownloadNzb(fileContent, title, category, priority, Settings);
|
||||
|
||||
if (response != null && response.Ids.Any())
|
||||
{
|
||||
_logger.Info("Adding report [{0}] to the queue.", title);
|
||||
var response = _proxy.DownloadNzb(nzb, title, category, priority, Settings);
|
||||
|
||||
if (response != null && response.Ids.Any())
|
||||
{
|
||||
return response.Ids.First();
|
||||
}
|
||||
|
||||
return null;
|
||||
return response.Ids.First();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private IEnumerable<DownloadClientItem> GetQueue()
|
||||
|
|
|
@ -15,7 +15,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
|||
{
|
||||
public interface ISabnzbdProxy
|
||||
{
|
||||
SabnzbdAddResponse DownloadNzb(Stream nzb, string name, string category, int priority, SabnzbdSettings settings);
|
||||
SabnzbdAddResponse DownloadNzb(Byte[] nzbData, string name, string category, int priority, SabnzbdSettings settings);
|
||||
void RemoveFrom(string source, string id, SabnzbdSettings settings);
|
||||
string ProcessRequest(IRestRequest restRequest, string action, SabnzbdSettings settings);
|
||||
SabnzbdVersionResponse GetVersion(SabnzbdSettings settings);
|
||||
|
@ -34,12 +34,12 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
|||
_logger = logger;
|
||||
}
|
||||
|
||||
public SabnzbdAddResponse DownloadNzb(Stream nzb, string title, string category, int priority, SabnzbdSettings settings)
|
||||
public SabnzbdAddResponse DownloadNzb(Byte[] nzbData, string title, string category, int priority, SabnzbdSettings settings)
|
||||
{
|
||||
var request = new RestRequest(Method.POST);
|
||||
var action = String.Format("mode=addfile&cat={0}&priority={1}", category, priority);
|
||||
|
||||
request.AddFile("name", nzb.ToBytes(), title, "application/x-nzb");
|
||||
request.AddFile("name", nzbData, title, "application/x-nzb");
|
||||
|
||||
SabnzbdAddResponse response;
|
||||
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using NzbDrone.Common;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Organizer;
|
||||
using NzbDrone.Core.Parser;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NLog;
|
||||
|
||||
namespace NzbDrone.Core.Download
|
||||
{
|
||||
public abstract class UsenetClientBase<TSettings> : DownloadClientBase<TSettings>
|
||||
where TSettings : IProviderConfig, new()
|
||||
{
|
||||
protected readonly IHttpClient _httpClient;
|
||||
|
||||
protected UsenetClientBase(IHttpClient httpClient,
|
||||
IConfigService configService,
|
||||
IDiskProvider diskProvider,
|
||||
IParsingService parsingService,
|
||||
Logger logger)
|
||||
: base(configService, diskProvider, parsingService, logger)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
}
|
||||
|
||||
public override DownloadProtocol Protocol
|
||||
{
|
||||
get
|
||||
{
|
||||
return DownloadProtocol.Usenet;
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract String AddFromNzbFile(RemoteEpisode remoteEpisode, String filename, Byte[] fileContent);
|
||||
|
||||
public override String Download(RemoteEpisode remoteEpisode)
|
||||
{
|
||||
var url = remoteEpisode.Release.DownloadUrl;
|
||||
var filename = FileNameBuilder.CleanFileName(remoteEpisode.Release.Title) + ".nzb";
|
||||
|
||||
Byte[] nzbData;
|
||||
|
||||
try
|
||||
{
|
||||
using (var nzb = _httpClient.Get(new HttpRequest(url)).GetStream())
|
||||
{
|
||||
nzbData = nzb.ToBytes();
|
||||
}
|
||||
}
|
||||
catch (WebException ex)
|
||||
{
|
||||
_logger.ErrorException(String.Format("Downloading nzb for episode '{0}' failed ({1})",
|
||||
remoteEpisode.Release.Title, url), ex);
|
||||
|
||||
throw new ReleaseDownloadException(remoteEpisode.Release, "Downloading nzb failed", ex);
|
||||
}
|
||||
|
||||
_logger.Info("Adding report [{0}] to the queue.", remoteEpisode.Release.Title);
|
||||
return AddFromNzbFile(remoteEpisode, filename, nzbData);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
using System;
|
||||
using NzbDrone.Common.Exceptions;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
||||
namespace NzbDrone.Core.Exceptions
|
||||
{
|
||||
public class ReleaseDownloadException : NzbDroneException
|
||||
{
|
||||
public ReleaseInfo Release { get; set; }
|
||||
|
||||
public ReleaseDownloadException(ReleaseInfo release, String message, params Object[] args) : base(message, args)
|
||||
{
|
||||
Release = release;
|
||||
}
|
||||
|
||||
public ReleaseDownloadException(ReleaseInfo release, String message)
|
||||
: base(message)
|
||||
{
|
||||
Release = release;
|
||||
}
|
||||
|
||||
public ReleaseDownloadException(ReleaseInfo release, String message, Exception innerException, params Object[] args)
|
||||
: base(message, innerException, args)
|
||||
{
|
||||
Release = release;
|
||||
}
|
||||
|
||||
public ReleaseDownloadException(ReleaseInfo release, String message, Exception innerException)
|
||||
: base(message, innerException)
|
||||
{
|
||||
Release = release;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -314,6 +314,7 @@
|
|||
<Compile Include="Download\Clients\UsenetBlackhole\UsenetBlackhole.cs" />
|
||||
<Compile Include="Download\Clients\UsenetBlackhole\UsenetBlackholeSettings.cs" />
|
||||
<Compile Include="Download\CompletedDownloadService.cs" />
|
||||
<Compile Include="Download\UsenetClientBase.cs" />
|
||||
<Compile Include="Download\DownloadClientBase.cs" />
|
||||
<Compile Include="Download\DownloadClientDefinition.cs" />
|
||||
<Compile Include="Download\DownloadClientFactory.cs" />
|
||||
|
@ -344,6 +345,7 @@
|
|||
<Compile Include="Exceptions\BadRequestException.cs" />
|
||||
<Compile Include="Exceptions\DownstreamException.cs" />
|
||||
<Compile Include="Exceptions\NzbDroneClientException.cs" />
|
||||
<Compile Include="Exceptions\ReleaseDownloadException.cs" />
|
||||
<Compile Include="Exceptions\StatusCodeToExceptions.cs" />
|
||||
<Compile Include="Fluent.cs" />
|
||||
<Compile Include="HealthCheck\CheckHealthCommand.cs" />
|
||||
|
|
Loading…
Reference in New Issue