diff --git a/PlexRequests.Api.Interfaces/ISickRageApi.cs b/PlexRequests.Api.Interfaces/ISickRageApi.cs index 516b8784f..a5770b56f 100644 --- a/PlexRequests.Api.Interfaces/ISickRageApi.cs +++ b/PlexRequests.Api.Interfaces/ISickRageApi.cs @@ -32,9 +32,11 @@ namespace PlexRequests.Api.Interfaces { public interface ISickRageApi { - SickRageTvAdd AddSeries(int tvdbId, bool latest, string quality, string apiKey, + SickRageTvAdd AddSeries(int tvdbId, int seasoncount, int[] seasons, string quality, string apiKey, Uri baseUrl); SickRagePing Ping(string apiKey, Uri baseUrl); + + SickRageTvAdd AddSeason(int tvdbId, int season, string apiKey, Uri baseUrl); } } \ No newline at end of file diff --git a/PlexRequests.Api.Interfaces/ISonarrApi.cs b/PlexRequests.Api.Interfaces/ISonarrApi.cs index d9e7c61db..e4dce0c3a 100644 --- a/PlexRequests.Api.Interfaces/ISonarrApi.cs +++ b/PlexRequests.Api.Interfaces/ISonarrApi.cs @@ -36,7 +36,7 @@ namespace PlexRequests.Api.Interfaces List GetProfiles(string apiKey, Uri baseUrl); SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, - bool episodes, string apiKey, Uri baseUrl); + int seasonCount, int[] seasons, string apiKey, Uri baseUrl); SystemStatus SystemStatus(string apiKey, Uri baseUrl); } diff --git a/PlexRequests.Api.Models/PlexRequests.Api.Models.csproj b/PlexRequests.Api.Models/PlexRequests.Api.Models.csproj index 8a4da4222..fdbf08e5b 100644 --- a/PlexRequests.Api.Models/PlexRequests.Api.Models.csproj +++ b/PlexRequests.Api.Models/PlexRequests.Api.Models.csproj @@ -67,6 +67,7 @@ + diff --git a/PlexRequests.Api.Models/Tv/TVMazeShow.cs b/PlexRequests.Api.Models/Tv/TVMazeShow.cs index 165658602..faebd6d84 100644 --- a/PlexRequests.Api.Models/Tv/TVMazeShow.cs +++ b/PlexRequests.Api.Models/Tv/TVMazeShow.cs @@ -23,5 +23,6 @@ namespace PlexRequests.Api.Models.Tv public string summary { get; set; } public int updated { get; set; } public Links _links { get; set; } + public int seasonCount { get; set; } } } \ No newline at end of file diff --git a/PlexRequests.Api.Models/Tv/TvMazeSeasons.cs b/PlexRequests.Api.Models/Tv/TvMazeSeasons.cs new file mode 100644 index 000000000..bce31cea5 --- /dev/null +++ b/PlexRequests.Api.Models/Tv/TvMazeSeasons.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlexRequests.Api.Models.Tv +{ + public class TvMazeSeasons : TvMazeShow + { + public int number { get; set; } + } +} diff --git a/PlexRequests.Api/Mocks/MockSonarrApi.cs b/PlexRequests.Api/Mocks/MockSonarrApi.cs index 8508d5a13..dfb816f8a 100644 --- a/PlexRequests.Api/Mocks/MockSonarrApi.cs +++ b/PlexRequests.Api/Mocks/MockSonarrApi.cs @@ -43,7 +43,7 @@ namespace PlexRequests.Api.Mocks return obj; } - public SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, bool episodes, + public SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, int seasonCount, int[] seasons, string apiKey, Uri baseUrl) { var json = MockApiData.Sonarr_AddSeriesResult; diff --git a/PlexRequests.Api/SickrageApi.cs b/PlexRequests.Api/SickrageApi.cs index f81693f5d..fe27968fe 100644 --- a/PlexRequests.Api/SickrageApi.cs +++ b/PlexRequests.Api/SickrageApi.cs @@ -28,9 +28,11 @@ #endregion using System; +using System.Linq; using NLog; using PlexRequests.Api.Interfaces; using PlexRequests.Api.Models.SickRage; +using PlexRequests.Helpers; using RestSharp; namespace PlexRequests.Api @@ -47,13 +49,11 @@ namespace PlexRequests.Api private ApiRequest Api { get; } - public SickRageTvAdd AddSeries(int tvdbId, bool latest, string quality, string apiKey, + public SickRageTvAdd AddSeries(int tvdbId, int seasonCount, int[] seasons, string quality, string apiKey, Uri baseUrl) { - string status; - var futureStatus = SickRageStatus.Wanted; - - status = latest ? SickRageStatus.Skipped : SickRageStatus.Wanted; + var futureStatus = seasons.Length > 0 && !seasons.Any(x => x == seasonCount) ? SickRageStatus.Skipped : SickRageStatus.Wanted; + var status = seasons.Length > 0 ? SickRageStatus.Skipped : SickRageStatus.Wanted; var request = new RestRequest { @@ -71,6 +71,17 @@ namespace PlexRequests.Api var obj = Api.Execute(request, baseUrl); + if (seasons.Length > 0 && obj.result != "failure") + { + //handle the seasons requested + foreach (int s in seasons) + { + var result = AddSeason(tvdbId, s, apiKey, baseUrl); + Log.Trace("SickRage adding season results: "); + Log.Trace(result.DumpJson()); + } + } + return obj; } @@ -87,5 +98,22 @@ namespace PlexRequests.Api return obj; } + + public SickRageTvAdd AddSeason(int tvdbId, int season, string apiKey, Uri baseUrl) + { + var request = new RestRequest + { + Resource = "/api/{apiKey}/?cmd=episode.setstatus", + Method = Method.GET + }; + request.AddUrlSegment("apiKey", apiKey); + request.AddQueryParameter("tvdbid", tvdbId.ToString()); + request.AddQueryParameter("season", season.ToString()); + request.AddQueryParameter("status", SickRageStatus.Wanted); + + var obj = Api.Execute(request, baseUrl); + + return obj; + } } } \ No newline at end of file diff --git a/PlexRequests.Api/SonarrApi.cs b/PlexRequests.Api/SonarrApi.cs index 148f27d23..166b41497 100644 --- a/PlexRequests.Api/SonarrApi.cs +++ b/PlexRequests.Api/SonarrApi.cs @@ -26,7 +26,7 @@ #endregion using System; using System.Collections.Generic; - +using System.Linq; using NLog; using PlexRequests.Api.Interfaces; using PlexRequests.Api.Models.Sonarr; @@ -54,7 +54,7 @@ namespace PlexRequests.Api return obj; } - public SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, bool episodes, string apiKey, Uri baseUrl) + public SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, int seasonCount, int[] seasons, string apiKey, Uri baseUrl) { var request = new RestRequest @@ -64,24 +64,28 @@ namespace PlexRequests.Api }; var options = new SonarrAddSeries(); - if (episodes) - { - options.addOptions = new AddOptions - { - ignoreEpisodesWithFiles = true, - ignoreEpisodesWithoutFiles = true, - searchForMissingEpisodes = false - }; - } - else - { - options.addOptions = new AddOptions - { - ignoreEpisodesWithFiles = false, - searchForMissingEpisodes = true, - ignoreEpisodesWithoutFiles = false - }; - } + + + //I'm fairly certain we won't need this logic anymore since we're manually adding the seasons + //if (seasons.Length == 0) + //{ + // options.addOptions = new AddOptions + // { + // ignoreEpisodesWithFiles = true, + // ignoreEpisodesWithoutFiles = true, + // searchForMissingEpisodes = false + // }; + //} + //else + //{ + // options.addOptions = new AddOptions + // { + // ignoreEpisodesWithFiles = false, + // ignoreEpisodesWithoutFiles = false, + // searchForMissingEpisodes = true + // }; + //} + options.seasonFolder = seasonFolders; options.title = title; options.qualityProfileId = qualityId; @@ -90,6 +94,15 @@ namespace PlexRequests.Api options.seasons = new List(); options.rootFolderPath = rootPath; + for (var i = 1; i <= seasonCount; i++) + { + var season = new Season + { + seasonNumber = i, + monitored = seasons.Length == 0 || seasons.Any(x => x == i) + }; + options.seasons.Add(season); + } request.AddHeader("X-Api-Key", apiKey); request.AddJsonBody(options); diff --git a/PlexRequests.Api/TvMazeApi.cs b/PlexRequests.Api/TvMazeApi.cs index 8b6cb9f37..6043710d7 100644 --- a/PlexRequests.Api/TvMazeApi.cs +++ b/PlexRequests.Api/TvMazeApi.cs @@ -26,7 +26,7 @@ #endregion using System; using System.Collections.Generic; - +using System.Linq; using NLog; using PlexRequests.Api.Models.Tv; @@ -79,7 +79,25 @@ namespace PlexRequests.Api request.AddUrlSegment("id", theTvDbId.ToString()); request.AddHeader("Content-Type", "application/json"); - return Api.Execute(request, new Uri(Uri)); + var obj = Api.Execute(request, new Uri(Uri)); + obj.seasonCount = GetSeasonCount(obj.id); + + return obj; + } + + public int GetSeasonCount(int id) + { + var request = new RestRequest + { + Method = Method.GET, + Resource = "shows/{id}/seasons" + }; + request.AddUrlSegment("id", id.ToString()); + request.AddHeader("Content-Type", "application/json"); + + var obj = Api.Execute>(request, new Uri(Uri)); + var seasons = obj.Select(x => x.number > 0); + return seasons.Count(); } } diff --git a/PlexRequests.Core/Setup.cs b/PlexRequests.Core/Setup.cs index c467dfac3..3163f8c56 100644 --- a/PlexRequests.Core/Setup.cs +++ b/PlexRequests.Core/Setup.cs @@ -110,7 +110,6 @@ namespace PlexRequests.Core Available = r.Available, ImdbId = show.externals.imdb, Issues = r.Issues, - LatestTv = r.LatestTv, OtherMessage = r.OtherMessage, Overview = show.summary.RemoveHtml(), RequestedBy = r.RequestedBy, diff --git a/PlexRequests.Store/RequestedModel.cs b/PlexRequests.Store/RequestedModel.cs index 247433329..5f746b841 100644 --- a/PlexRequests.Store/RequestedModel.cs +++ b/PlexRequests.Store/RequestedModel.cs @@ -23,8 +23,9 @@ namespace PlexRequests.Store public bool Available { get; set; } public IssueState Issues { get; set; } public string OtherMessage { get; set; } - public bool LatestTv { get; set; } public string AdminNote { get; set; } + public int[] SeasonList { get; set; } + public int SeasonCount { get; set; } } public enum RequestType diff --git a/PlexRequests.UI/Content/search.js b/PlexRequests.UI/Content/search.js index 4e765594b..14168b5ce 100644 --- a/PlexRequests.UI/Content/search.js +++ b/PlexRequests.UI/Content/search.js @@ -39,9 +39,14 @@ $(document).on("click", ".dropdownTv", function (e) { var $form = $('#form' + buttonId); var data = $form.serialize(); var seasons = $(this).attr("season-select"); - if (seasons === "1") { + if (seasons === "2") { // Send over the latest - data = data + "&latest=true"; + data = data + "&seasons=latest"; + } + if (seasons === "1") { + // Send over the first season + data = data + "&seasons=first"; + } var type = $form.prop('method'); diff --git a/PlexRequests.UI/Helpers/TvSender.cs b/PlexRequests.UI/Helpers/TvSender.cs index 9e63749fc..6c2f59ace 100644 --- a/PlexRequests.UI/Helpers/TvSender.cs +++ b/PlexRequests.UI/Helpers/TvSender.cs @@ -54,7 +54,7 @@ namespace PlexRequests.UI.Helpers int qualityProfile; int.TryParse(sonarrSettings.QualityProfile, out qualityProfile); var result = SonarrApi.AddSeries(model.ProviderId, model.Title, qualityProfile, - sonarrSettings.SeasonFolders, sonarrSettings.RootPath, model.LatestTv, sonarrSettings.ApiKey, + sonarrSettings.SeasonFolders, sonarrSettings.RootPath, model.SeasonCount, model.SeasonList, sonarrSettings.ApiKey, sonarrSettings.FullUri); Log.Trace("Sonarr Add Result: "); @@ -65,7 +65,7 @@ namespace PlexRequests.UI.Helpers public SickRageTvAdd SendToSickRage(SickRageSettings sickRageSettings, RequestedModel model) { - var result = SickrageApi.AddSeries(model.ProviderId, model.LatestTv, sickRageSettings.QualityProfile, + var result = SickrageApi.AddSeries(model.ProviderId, model.SeasonCount, model.SeasonList, sickRageSettings.QualityProfile, sickRageSettings.ApiKey, sickRageSettings.FullUri); Log.Trace("SickRage Add Result: "); diff --git a/PlexRequests.UI/Modules/SearchModule.cs b/PlexRequests.UI/Modules/SearchModule.cs index 5e29f15e9..67fe62c22 100644 --- a/PlexRequests.UI/Modules/SearchModule.cs +++ b/PlexRequests.UI/Modules/SearchModule.cs @@ -79,7 +79,7 @@ namespace PlexRequests.UI.Modules Get["movie/playing"] = parameters => CurrentlyPlayingMovies(); Post["request/movie"] = parameters => RequestMovie((int)Request.Form.movieId); - Post["request/tv"] = parameters => RequestTvShow((int)Request.Form.tvId, (bool)Request.Form.latest); + Post["request/tv"] = parameters => RequestTvShow((int)Request.Form.tvId, (string)Request.Form.seasons); } private TheMovieDbApi MovieApi { get; } private INotificationService NotificationService { get; } @@ -263,7 +263,7 @@ namespace PlexRequests.UI.Modules /// The show identifier. /// if set to true [latest]. /// - private Response RequestTvShow(int showId, bool latest) + private Response RequestTvShow(int showId, string seasons) { if (RequestService.CheckRequest(showId)) { @@ -289,7 +289,6 @@ namespace PlexRequests.UI.Modules DateTime firstAir; DateTime.TryParse(showInfo.premiered, out firstAir); - var model = new RequestedModel { ProviderId = showInfo.externals?.thetvdb ?? 0, @@ -303,10 +302,21 @@ namespace PlexRequests.UI.Modules Approved = false, RequestedBy = Session[SessionKeys.UsernameKey].ToString(), Issues = IssueState.None, - LatestTv = latest, - ImdbId = showInfo.externals?.imdb ?? string.Empty + ImdbId = showInfo.externals?.imdb ?? string.Empty, + SeasonCount = showInfo.seasonCount }; - + var seasonsList = new List(); + switch (seasons) + { + case "first": + seasonsList.Add(1); + break; + case "latest": + seasonsList.Add(model.SeasonCount); + break; + } + + model.SeasonList = seasonsList.ToArray(); var settings = PrService.GetSettings(); if (!settings.RequireApproval) @@ -361,23 +371,23 @@ namespace PlexRequests.UI.Modules return result; } - private Response SendToSickRage(SickRageSettings sickRageSettings, RequestedModel model) - { - var result = SickrageApi.AddSeries(model.ProviderId, model.LatestTv, sickRageSettings.QualityProfile, - sickRageSettings.ApiKey, sickRageSettings.FullUri); + //private Response SendToSickRage(SickRageSettings sickRageSettings, RequestedModel model) + //{ + // var result = SickrageApi.AddSeries(model.ProviderId, model.SeasonCount, model.SeasonList, sickRageSettings.QualityProfile, + // sickRageSettings.ApiKey, sickRageSettings.FullUri); - Log.Trace("SickRage Result: "); - Log.Trace(result.DumpJson()); + // Log.Trace("SickRage Result: "); + // Log.Trace(result.DumpJson()); - if (result?.result == "success") - { - model.Approved = true; - Log.Debug("Adding tv to database requests (No approval required & SickRage)"); - RequestService.AddRequest(model); + // if (result?.result == "success") + // { + // model.Approved = true; + // Log.Debug("Adding tv to database requests (No approval required & SickRage)"); + // RequestService.AddRequest(model); - return Response.AsJson(new JsonResponseModel { Result = true }); - } - return Response.AsJson(new JsonResponseModel { Result = false, Message = "Something went wrong adding the movie to SickRage! Please check your settings." }); - } + // return Response.AsJson(new JsonResponseModel { Result = true }); + // } + // return Response.AsJson(new JsonResponseModel { Result = false, Message = "Something went wrong adding the movie to SickRage! Please check your settings." }); + //} } } \ No newline at end of file diff --git a/PlexRequests.UI/Views/Search/Index.cshtml b/PlexRequests.UI/Views/Search/Index.cshtml index 7e41c6b4d..553ac32d7 100644 --- a/PlexRequests.UI/Views/Search/Index.cshtml +++ b/PlexRequests.UI/Views/Search/Index.cshtml @@ -84,7 +84,7 @@
- + {{#if_eq type "movie"}} {{/if_eq}} @@ -96,7 +96,8 @@
{{/if_eq}}