From a834da3990dd3cf8d0de61c39cdc52caeb937f00 Mon Sep 17 00:00:00 2001 From: tidusjar Date: Thu, 22 Sep 2016 21:44:51 +0100 Subject: [PATCH] Added different sonarr search commands. #515 --- PlexRequests.Api.Interfaces/ISonarrApi.cs | 2 + .../PlexRequests.Api.Models.csproj | 3 + .../Sonarr/SonarrAddEpisodeBody.cs | 2 +- .../Sonarr/SonarrSearchCommand.cs | 38 +++++++++++++ .../Sonarr/SonarrSeasonSearchResult.cs | 55 ++++++++++++++++++ .../Sonarr/SonarrSeriesSearchResult.cs | 56 +++++++++++++++++++ PlexRequests.Api/SonarrApi.cs | 53 ++++++++++++++++++ PlexRequests.UI/Helpers/TvSender.cs | 16 ++++++ 8 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 PlexRequests.Api.Models/Sonarr/SonarrSearchCommand.cs create mode 100644 PlexRequests.Api.Models/Sonarr/SonarrSeasonSearchResult.cs create mode 100644 PlexRequests.Api.Models/Sonarr/SonarrSeriesSearchResult.cs diff --git a/PlexRequests.Api.Interfaces/ISonarrApi.cs b/PlexRequests.Api.Interfaces/ISonarrApi.cs index 5c5594ad8..c0a40449c 100644 --- a/PlexRequests.Api.Interfaces/ISonarrApi.cs +++ b/PlexRequests.Api.Interfaces/ISonarrApi.cs @@ -48,5 +48,7 @@ namespace PlexRequests.Api.Interfaces SonarrEpisode UpdateEpisode(SonarrEpisode episodeInfo, string apiKey, Uri baseUrl); SonarrAddEpisodeResult SearchForEpisodes(int[] episodeIds, string apiKey, Uri baseUrl); Series UpdateSeries(Series series, string apiKey, Uri baseUrl); + SonarrSeasonSearchResult SearchForSeason(int seriesId, int seasonNumber, string apiKey, Uri baseUrl); + SonarrSeriesSearchResult SearchForSeries(int seriesId, string apiKey, Uri baseUrl); } } \ No newline at end of file diff --git a/PlexRequests.Api.Models/PlexRequests.Api.Models.csproj b/PlexRequests.Api.Models/PlexRequests.Api.Models.csproj index 20363d996..6426f8050 100644 --- a/PlexRequests.Api.Models/PlexRequests.Api.Models.csproj +++ b/PlexRequests.Api.Models/PlexRequests.Api.Models.csproj @@ -89,6 +89,9 @@ + + + diff --git a/PlexRequests.Api.Models/Sonarr/SonarrAddEpisodeBody.cs b/PlexRequests.Api.Models/Sonarr/SonarrAddEpisodeBody.cs index 265d881d1..6cf970241 100644 --- a/PlexRequests.Api.Models/Sonarr/SonarrAddEpisodeBody.cs +++ b/PlexRequests.Api.Models/Sonarr/SonarrAddEpisodeBody.cs @@ -29,6 +29,6 @@ namespace PlexRequests.Api.Models.Sonarr public class SonarrAddEpisodeBody { public string name { get; set; } - public int[] episodeIds { get; set; } + public int[] episodeIds { get; set; } } } \ No newline at end of file diff --git a/PlexRequests.Api.Models/Sonarr/SonarrSearchCommand.cs b/PlexRequests.Api.Models/Sonarr/SonarrSearchCommand.cs new file mode 100644 index 000000000..f2649cd94 --- /dev/null +++ b/PlexRequests.Api.Models/Sonarr/SonarrSearchCommand.cs @@ -0,0 +1,38 @@ +#region Copyright +// /************************************************************************ +// Copyright (c) 2016 Jamie Rees +// File: SonarrSearchCommand.cs +// Created By: Jamie Rees +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ************************************************************************/ +#endregion + +using System.Xml.Linq; + +namespace PlexRequests.Api.Models.Sonarr +{ + public class SonarrSearchCommand + { + public int seriesId { get; set; } + public int seasonNumber { get; set; } + public string name { get; set; } + } +} \ No newline at end of file diff --git a/PlexRequests.Api.Models/Sonarr/SonarrSeasonSearchResult.cs b/PlexRequests.Api.Models/Sonarr/SonarrSeasonSearchResult.cs new file mode 100644 index 000000000..a0fe8bb29 --- /dev/null +++ b/PlexRequests.Api.Models/Sonarr/SonarrSeasonSearchResult.cs @@ -0,0 +1,55 @@ +#region Copyright +// /************************************************************************ +// Copyright (c) 2016 Jamie Rees +// File: SonarrSeasonSearchResult.cs +// Created By: Jamie Rees +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ************************************************************************/ +#endregion +namespace PlexRequests.Api.Models.Sonarr +{ + public class SeasonBody + { + public int seriesId { get; set; } + public int seasonNumber { get; set; } + public bool sendUpdatesToClient { get; set; } + public bool updateScheduledTask { get; set; } + public string completionMessage { get; set; } + public string name { get; set; } + public string trigger { get; set; } + } + + public class SonarrSeasonSearchResult + { + public string name { get; set; } + public SeasonBody body { get; set; } + public string priority { get; set; } + public string status { get; set; } + public string queued { get; set; } + public string trigger { get; set; } + public string state { get; set; } + public bool manual { get; set; } + public string startedOn { get; set; } + public bool sendUpdatesToClient { get; set; } + public bool updateScheduledTask { get; set; } + public int id { get; set; } + } +} \ No newline at end of file diff --git a/PlexRequests.Api.Models/Sonarr/SonarrSeriesSearchResult.cs b/PlexRequests.Api.Models/Sonarr/SonarrSeriesSearchResult.cs new file mode 100644 index 000000000..76e5fc9ad --- /dev/null +++ b/PlexRequests.Api.Models/Sonarr/SonarrSeriesSearchResult.cs @@ -0,0 +1,56 @@ +#region Copyright +// /************************************************************************ +// Copyright (c) 2016 Jamie Rees +// File: SonarrSeriesSearchResult.cs +// Created By: Jamie Rees +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ************************************************************************/ +#endregion +namespace PlexRequests.Api.Models.Sonarr +{ + public class SeriesBody + { + public int seriesId { get; set; } + public bool sendUpdatesToClient { get; set; } + public bool updateScheduledTask { get; set; } + public string completionMessage { get; set; } + public string name { get; set; } + public string trigger { get; set; } + } + + public class SonarrSeriesSearchResult + { + public string name { get; set; } + public SeriesBody body { get; set; } + public string priority { get; set; } + public string status { get; set; } + public string queued { get; set; } + public string started { get; set; } + public string trigger { get; set; } + public string state { get; set; } + public bool manual { get; set; } + public string startedOn { get; set; } + public string stateChangeTime { get; set; } + public bool sendUpdatesToClient { get; set; } + public bool updateScheduledTask { get; set; } + public int id { get; set; } + } +} \ No newline at end of file diff --git a/PlexRequests.Api/SonarrApi.cs b/PlexRequests.Api/SonarrApi.cs index 6cc8019f3..6cc82fefa 100644 --- a/PlexRequests.Api/SonarrApi.cs +++ b/PlexRequests.Api/SonarrApi.cs @@ -327,5 +327,58 @@ namespace PlexRequests.Api return null; } } + + public SonarrSeasonSearchResult SearchForSeason(int seriesId, int seasonNumber, string apiKey, Uri baseUrl) + { + var request = new RestRequest { Resource = "/api/Command", Method = Method.POST }; + request.AddHeader("X-Api-Key", apiKey); + + var body = new SonarrSearchCommand + { + name = "SeasonSearch", + seriesId = seriesId, + seasonNumber = seasonNumber + }; + request.AddJsonBody(body); + + try + { + var policy = RetryHandler.RetryAndWaitPolicy((exception, timespan) => + Log.Error(exception, "Exception when calling SearchForSeason for Sonarr, Retrying {0}", timespan)); + + return policy.Execute(() => Api.ExecuteJson(request, baseUrl)); + } + catch (Exception e) + { + Log.Error(e, "There has been an API exception when put the Sonarr SearchForSeason"); + return null; + } + } + + public SonarrSeriesSearchResult SearchForSeries(int seriesId, string apiKey, Uri baseUrl) + { + var request = new RestRequest { Resource = "/api/Command", Method = Method.POST }; + request.AddHeader("X-Api-Key", apiKey); + + var body = new SonarrSearchCommand + { + name = "SeriesSearch", + seriesId = seriesId + }; + request.AddJsonBody(body); + + try + { + var policy = RetryHandler.RetryAndWaitPolicy((exception, timespan) => + Log.Error(exception, "Exception when calling SearchForSeries for Sonarr, Retrying {0}", timespan)); + + return policy.Execute(() => Api.ExecuteJson(request, baseUrl)); + } + catch (Exception e) + { + Log.Error(e, "There has been an API exception when put the Sonarr SearchForSeries"); + return null; + } + } } } \ No newline at end of file diff --git a/PlexRequests.UI/Helpers/TvSender.cs b/PlexRequests.UI/Helpers/TvSender.cs index fe1572044..705ceecb1 100644 --- a/PlexRequests.UI/Helpers/TvSender.cs +++ b/PlexRequests.UI/Helpers/TvSender.cs @@ -112,6 +112,7 @@ namespace PlexRequests.UI.Helpers return addResult; } + // Series exists, don't need to add it if (series != null) { var requestAll = model.SeasonsRequested.Equals("All", StringComparison.CurrentCultureIgnoreCase); @@ -127,7 +128,10 @@ namespace PlexRequests.UI.Helpers { season.monitored = true; } + SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); + SonarrApi.SearchForSeason(series.id, season.seasonNumber, sonarrSettings.ApiKey, sonarrSettings.FullUri); } + return new SonarrAddSeries { title = series.title }; // We have updated it } if (requestAll) @@ -137,18 +141,30 @@ namespace PlexRequests.UI.Helpers { season.monitored = true; } + + SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); + SonarrApi.SearchForSeries(series.id, sonarrSettings.ApiKey, sonarrSettings.FullUri); // Search For all episodes!" + return new SonarrAddSeries { title = series.title }; // We have updated it } if (first) { var firstSeries = series?.seasons?.OrderBy(x => x.seasonNumber)?.FirstOrDefault() ?? new Season(); firstSeries.monitored = true; + SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); + SonarrApi.SearchForSeason(series.id, firstSeries.seasonNumber, sonarrSettings.ApiKey, + sonarrSettings.FullUri); + return new SonarrAddSeries { title = series.title }; // We have updated it } if (latest) { var lastSeries = series?.seasons?.OrderByDescending(x => x.seasonNumber)?.FirstOrDefault() ?? new Season(); lastSeries.monitored = true; + SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); + SonarrApi.SearchForSeason(series.id, lastSeries.seasonNumber, sonarrSettings.ApiKey, + sonarrSettings.FullUri); + return new SonarrAddSeries { title = series.title }; // We have updated it }