Fixed: Now shows UI notification if downloading nzb from indexer fails.

This commit is contained in:
Taloth Saldono 2014-09-07 13:39:00 +02:00
parent 70fc927e9f
commit 56436fea69
10 changed files with 145 additions and 60 deletions

View File

@ -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();
}

View File

@ -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("-", ""));
}

View File

@ -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")]

View File

@ -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()

View File

@ -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));

View File

@ -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()

View File

@ -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;

View File

@ -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);
}
}
}

View File

@ -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;
}
}
}

View File

@ -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" />