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:
parent
a01f2dd862
commit
4a7bd5b849
@ -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);
|
||||
|
@ -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")]
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
{
|
||||
public class SabJsonError
|
||||
{
|
||||
public string Status { get; set; }
|
||||
public bool Status { get; set; }
|
||||
public string Error { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user