1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2024-12-16 11:37:58 +02:00

Better handling of SAB not returning json to addfile

Fixed: Handling of unexpected responses from SABnzbd when adding releases
This commit is contained in:
Mark McDowall 2013-11-19 21:47:26 -08:00
parent a01f2dd862
commit 4a7bd5b849
5 changed files with 60 additions and 10 deletions

View File

@ -41,6 +41,18 @@ public static object Deserialize(string json, Type type)
return JsonConvert.DeserializeObject(json, type, SerializerSetting);
}
public static T TryDeserialize<T>(string json) where T : new()
{
try
{
return Deserialize<T>(json);
}
catch (JsonReaderException ex)
{
return default(T);
}
}
public static string ToJson(this object obj)
{
return JsonConvert.SerializeObject(obj, SerializerSetting);

View File

@ -6,6 +6,11 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
{
public class SabAddResponse
{
public SabAddResponse()
{
Ids = new List<String>();
}
public bool Status { get; set; }
[JsonProperty(PropertyName = "nzo_ids")]

View File

@ -1,5 +1,6 @@
using System;
using System.IO;
using Newtonsoft.Json;
using NLog;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Configuration;
@ -9,7 +10,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
{
public interface ISabCommunicationProxy
{
string DownloadNzb(Stream nzb, string name, string category, int priority);
SabAddResponse DownloadNzb(Stream nzb, string name, string category, int priority);
void RemoveFrom(string source, string id);
string ProcessRequest(IRestRequest restRequest, string action);
}
@ -25,14 +26,22 @@ public SabCommunicationProxy(IConfigService configService, Logger logger)
_logger = logger;
}
public string DownloadNzb(Stream nzb, string title, string category, int priority)
public SabAddResponse DownloadNzb(Stream nzb, string title, string category, int priority)
{
var request = new RestRequest(Method.POST);
var action = String.Format("mode=addfile&cat={0}&priority={1}", category, priority);
request.AddFile("name", ReadFully(nzb), title, "application/x-nzb");
return ProcessRequest(request, action);
var response = Json.TryDeserialize<SabAddResponse>(ProcessRequest(request, action));
if (response == null)
{
response = new SabAddResponse();
response.Status = true;
}
return response;
}
public void RemoveFrom(string source, string id)
@ -67,6 +76,8 @@ private IRestClient BuildClient(string action)
_configService.SabUsername,
_configService.SabPassword);
_logger.Trace(url);
return new RestClient(url);
}
@ -77,9 +88,28 @@ private void CheckForError(IRestResponse response)
throw new ApplicationException("Unable to connect to SABnzbd, please check your settings");
}
var result = Json.Deserialize<SabJsonError>(response.Content);
var result = Json.TryDeserialize<SabJsonError>(response.Content);
if (result.Status != null && result.Status.Equals("false", StringComparison.InvariantCultureIgnoreCase))
if (result == null)
{
//Handle plain text responses from SAB
result = new SabJsonError();
if (response.Content.StartsWith("error", StringComparison.InvariantCultureIgnoreCase))
{
result.Status = false;
result.Error = response.Content.Replace("error: ", "");
}
else
{
result.Status = true;
}
result.Error = response.Content.Replace("error: ", "");
}
if (!result.Status)
throw new ApplicationException(result.Error);
}

View File

@ -2,7 +2,7 @@
{
public class SabJsonError
{
public string Status { get; set; }
public bool Status { get; set; }
public string Error { get; set; }
}
}

View File

@ -55,11 +55,14 @@ public string DownloadNzb(RemoteEpisode remoteEpisode)
using (var nzb = _httpProvider.DownloadStream(url))
{
_logger.Info("Adding report [{0}] to the queue.", title);
var response = Json.Deserialize<SabAddResponse>(_sabCommunicationProxy.DownloadNzb(nzb, title, category, priority));
var response = _sabCommunicationProxy.DownloadNzb(nzb, title, category, priority);
_logger.Debug("Queue Response: [{0}]", response.Status);
if (response != null && response.Ids.Any())
{
return response.Ids.First();
}
return response.Ids.First();
return null;
}
}
@ -240,7 +243,7 @@ private void CheckForError(string response)
{
var result = Json.Deserialize<SabJsonError>(response);
if (result.Status != null && result.Status.Equals("false", StringComparison.InvariantCultureIgnoreCase))
if (result.Status)
throw new ApplicationException(result.Error);
}
}