From c4b57c4a234b55162d2ed39c2a5889589c33daff Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 19 May 2012 13:07:30 -0700 Subject: [PATCH] Fixed: SABnzbd queue checking will not fail when items in queue are being repaired. SabQueue priority is parsed with a custom converter to prevent blowing up because SAB decides to use Repair as a queue priority type. --- .../Files/QueueUnknownPriority.txt | 210 ++++++++++++++++++ NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 3 + .../SabProviderTests/QueueFixture.cs | 23 +- .../Helpers/SabnzbdPriorityTypeConverter.cs | 33 +++ NzbDrone.Core/Model/Sabnzbd/SabQueueItem.cs | 1 + NzbDrone.Core/NzbDrone.Core.csproj | 1 + 6 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 NzbDrone.Core.Test/Files/QueueUnknownPriority.txt create mode 100644 NzbDrone.Core/Helpers/SabnzbdPriorityTypeConverter.cs diff --git a/NzbDrone.Core.Test/Files/QueueUnknownPriority.txt b/NzbDrone.Core.Test/Files/QueueUnknownPriority.txt new file mode 100644 index 000000000..0d0c18abd --- /dev/null +++ b/NzbDrone.Core.Test/Files/QueueUnknownPriority.txt @@ -0,0 +1,210 @@ +{ + "queue":{ + "active_lang":"en", + "cache_art":"10", + "cache_max":"67108864", + "cache_size":"7 MB", + "categories":[ + "*", + "apps", + "consoles", + "emp", + "movies", + "tv" + ], + "color_scheme":"lightblue", + "darwin":false, + "diskspace1":"127.50", + "diskspace2":"127.50", + "diskspacetotal1":"157.76", + "diskspacetotal2":"157.76", + "eta":"01:45 PM Mon 23 Jan", + "finish":0, + "finishaction":null, + "have_warnings":"20", + "helpuri":"http://wiki.sabnzbd.org/", + "isverbose":false, + "kbpersec":"2.18", + "last_warning":"2012-01-19 23:42:39,934\nWARNING:\nAPI Key incorrect, Use the api key from Config->General in your 3rd party program:", + "limit":0, + "loadavg":"", + "mb":"686.67", + "mbleft":"657.89", + "new_rel_url":"http://sourceforge.net/projects/sabnzbdplus/files/sabnzbdplus/sabnzbd-0.6.14", + "new_release":"0.6.14", + "newzbinDetails":true, + "noofslots":2, + "nt":true, + "nzb_quota":"", + "pause_int":"0", + "paused":false, + "paused_all":false, + "power_options":true, + "queue_details":"0", + "refresh_rate":"20", + "restart_req":false, + "scripts":[ + + ], + "session":"f37dc33baec2e5566f5aec666287870d", + "size":"687 MB", + "sizeleft":"658 MB", + "slots":[ + { + "avg_age":"149d", + "cat":"tv", + "eta":"06:55 AM Sat 21 Jan", + "filename":"30 Rock - 1x05 - Title [HDTV]", + "index":0, + "mb":"267.44", + "mbleft":"238.66", + "missing":0, + "msgid":6256072, + "nzo_id":"SABnzbd_nzo_qv6ilb", + "percentage":"10", + "priority":"Repair", + "script":"None", + "size":"267 MB", + "sizeleft":"239 MB", + "status":"Downloading", + "timeleft":"57:27:45", + "unpackopts":"3", + "verbosity":"" + }, + { + "avg_age":"580d", + "cat":"tv", + "eta":"01:45 PM Mon 23 Jan", + "filename":"Parks and Recreation - 4x8 - Smallest Park [WEBDL]", + "index":1, + "mb":"419.23", + "mbleft":"419.23", + "missing":0, + "msgid":5657628, + "nzo_id":"SABnzbd_nzo_dgrzts", + "percentage":"0", + "priority":"Fail", + "script":"None", + "size":"419 MB", + "sizeleft":"419 MB", + "status":"Queued", + "timeleft":"86:01:55", + "unpackopts":"3", + "verbosity":"" + }, + { + "avg_age":"580d", + "cat":"tv", + "eta":"01:45 PM Mon 23 Jan", + "filename":"Invalid Item", + "index":1, + "mb":"419.23", + "mbleft":"419.23", + "missing":0, + "msgid":5657628, + "nzo_id":"SABnzbd_nzo_dgrzts", + "percentage":"0", + "priority":"Normal", + "script":"None", + "size":"419 MB", + "sizeleft":"419 MB", + "status":"Queued", + "timeleft":"86:01:55", + "unpackopts":"3", + "verbosity":"" + }, + { + "avg_age":"580d", + "cat":"tv", + "eta":"01:45 PM Mon 23 Jan", + "filename":"The Dailyshow - 2011-12-01 - My Episode Title [Bluray720p] [Proper]", + "index":1, + "mb":"419.23", + "mbleft":"419.23", + "missing":0, + "msgid":5657628, + "nzo_id":"SABnzbd_nzo_dgrzts", + "percentage":"0", + "priority":"Test", + "script":"None", + "size":"419 MB", + "sizeleft":"419 MB", + "status":"Queued", + "timeleft":"86:01:55", + "unpackopts":"3", + "verbosity":"" + }, + { + "avg_age":"580d", + "cat":"tv", + "eta":"01:45 PM Mon 23 Jan", + "filename":"My Name is earl - Season 5 [Bluray720p]", + "index":1, + "mb":"419.23", + "mbleft":"419.23", + "missing":0, + "msgid":5657628, + "nzo_id":"SABnzbd_nzo_dgrzts", + "percentage":"0", + "priority":"Normal", + "script":"None", + "size":"419 MB", + "sizeleft":"419 MB", + "status":"Queued", + "timeleft":"86:01:55", + "unpackopts":"3", + "verbosity":"" + }, + { + "avg_age":"580d", + "cat":"tv", + "eta":"01:45 PM Mon 23 Jan", + "filename":"My Name Is Earl - 3x14-3x15 - I Won't Die With a Little Help from My Friends (1) + I Won't Die With a Little Help from My Friend [Bluray720p]", + "index":1, + "mb":"419.23", + "mbleft":"419.23", + "missing":0, + "msgid":5657628, + "nzo_id":"SABnzbd_nzo_dgrzts", + "percentage":"0", + "priority":"Normal", + "script":"None", + "size":"419 MB", + "sizeleft":"419 MB", + "status":"Queued", + "timeleft":"86:01:55", + "unpackopts":"3", + "verbosity":"" + }, + { + "status":"Paused", + "index":1, + "eta":"unknown", + "missing":0, + "avg_age":"1d", + "script":"None", + "msgid":"", + "verbosity":"", + "mb":"546.13", + "sizeleft":"546 MB", + "filename":"DUPLICATE / The Big Bang Theory - 5x13 - The Recombination Hypothesis [HDTV] [Proper]", + "priority":"NotReal", + "cat":"tv", + "mbleft":"546.13", + "timeleft":"0:00:00", + "percentage":"0", + "nzo_id":"SABnzbd_nzo_vayub5", + "unpackopts":"3", + "size":"546 MB" + } + ], + "speed":"2 K", + "speedlimit":"2", + "start":0, + "status":"Downloading", + "timeleft":"86:01:55", + "uptime":"2d", + "version":"0.6.9", + "webdir":"C:\\Tools\\SABnzbd\\interfaces\\Classic\\templates" + } +} \ No newline at end of file diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 74cac4081..c4938453d 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -206,6 +206,9 @@ Always + + Always + Always diff --git a/NzbDrone.Core.Test/ProviderTests/DownloadClientTests/SabProviderTests/QueueFixture.cs b/NzbDrone.Core.Test/ProviderTests/DownloadClientTests/SabProviderTests/QueueFixture.cs index 32c6c80d2..95445c30e 100644 --- a/NzbDrone.Core.Test/ProviderTests/DownloadClientTests/SabProviderTests/QueueFixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/DownloadClientTests/SabProviderTests/QueueFixture.cs @@ -9,6 +9,7 @@ using Moq; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.Model; +using NzbDrone.Core.Model.Sabnzbd; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.DownloadClients; using NzbDrone.Core.Repository; @@ -42,7 +43,6 @@ namespace NzbDrone.Core.Test.ProviderTests.DownloadClientTests.SabProviderTests fakeConfig.SetupGet(c => c.SabTvCategory).Returns(cat); } - private void WithFullQueue() { Mocker.GetMock() @@ -69,6 +69,16 @@ namespace NzbDrone.Core.Test.ProviderTests.DownloadClientTests.SabProviderTests .Setup(s => s.DownloadString(It.IsAny())).Returns(File.ReadAllText(@".\Files\JsonError.txt")); } + private void WithUnknownPriorityQueue() + { + Mocker.GetMock() + .Setup( + s => + s.DownloadString( + "http://192.168.5.55:2222/api?mode=queue&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")) + .Returns(File.ReadAllText(@".\Files\QueueUnknownPriority.txt")); + } + [Test] public void GetQueue_should_return_an_empty_list_when_the_queue_is_empty() { @@ -97,6 +107,17 @@ namespace NzbDrone.Core.Test.ProviderTests.DownloadClientTests.SabProviderTests result.Should().HaveCount(7); } + [Test] + public void GetQueue_should_return_a_list_with_items_even_when_priority_is_non_standard() + { + WithUnknownPriorityQueue(); + + var result = Mocker.Resolve().GetQueue(); + + result.Should().HaveCount(7); + result.Should().OnlyContain(i => i.Priority == SabPriorityType.Normal); + } + [Test] public void is_in_queue_should_find_if_exact_episode_is_in_queue() { diff --git a/NzbDrone.Core/Helpers/SabnzbdPriorityTypeConverter.cs b/NzbDrone.Core/Helpers/SabnzbdPriorityTypeConverter.cs new file mode 100644 index 000000000..40b157e2d --- /dev/null +++ b/NzbDrone.Core/Helpers/SabnzbdPriorityTypeConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Newtonsoft.Json; +using NzbDrone.Core.Model.Sabnzbd; + +namespace NzbDrone.Core.Helpers +{ + public class SabnzbdPriorityTypeConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var priorityType = (SabPriorityType)value; + writer.WriteValue(priorityType.ToString()); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + var queuePriority = reader.Value.ToString(); + + SabPriorityType output; + Enum.TryParse(queuePriority, out output); + + return output; + } + + public override bool CanConvert(Type objectType) + { + return objectType == typeof(SabPriorityType); + } + } +} diff --git a/NzbDrone.Core/Model/Sabnzbd/SabQueueItem.cs b/NzbDrone.Core/Model/Sabnzbd/SabQueueItem.cs index b8e61fee5..fb895acb4 100644 --- a/NzbDrone.Core/Model/Sabnzbd/SabQueueItem.cs +++ b/NzbDrone.Core/Model/Sabnzbd/SabQueueItem.cs @@ -31,6 +31,7 @@ namespace NzbDrone.Core.Model.Sabnzbd } } + [JsonConverter(typeof(SabnzbdPriorityTypeConverter))] public SabPriorityType Priority { get; set; } [JsonProperty(PropertyName = "cat")] diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index d77e6da71..3f3ce06b8 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -243,6 +243,7 @@ +