From 9aad3f9dc9725ca88536ae89746a903debebf983 Mon Sep 17 00:00:00 2001 From: tidusjar Date: Tue, 26 Jul 2016 21:27:28 +0100 Subject: [PATCH] More work on #254 --- PlexRequests.UI/Modules/SearchModule.cs | 72 ++++++++++++++----------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/PlexRequests.UI/Modules/SearchModule.cs b/PlexRequests.UI/Modules/SearchModule.cs index d100e2897..6fcae6fd2 100644 --- a/PlexRequests.UI/Modules/SearchModule.cs +++ b/PlexRequests.UI/Modules/SearchModule.cs @@ -117,7 +117,7 @@ namespace PlexRequests.UI.Modules Post["request/movie", true] = async (x, ct) => await RequestMovie((int)Request.Form.movieId); Post["request/tv", true] = async (x, ct) => await RequestTvShow((int)Request.Form.tvId, (string)Request.Form.seasons); - Post["request/tvEpisodes", true] = async (x, ct) => await RequestEpisodes(); + Post["request/tvEpisodes", true] = async (x, ct) => await RequestTvShow(0,"episode"); Post["request/album", true] = async (x, ct) => await RequestAlbum((string)Request.Form.albumId); Post["/notifyuser", true] = async (x, ct) => await NotifyUser((bool)Request.Form.notify); @@ -525,6 +525,14 @@ namespace PlexRequests.UI.Modules /// private async Task RequestTvShow(int showId, string seasons) { + // Get the JSON from the request + var req = (Dictionary.ValueCollection)Request.Form.Values; + var json = req.FirstOrDefault()?.ToString(); + var episodeModel = JsonConvert.DeserializeObject(json); // Convert it into the object + + var episodeResult = false; + var episodeRequest = false; + var settings = await PrService.GetSettingsAsync(); if (!await CheckRequestLimit(settings, RequestType.TvShow)) { @@ -532,6 +540,24 @@ namespace PlexRequests.UI.Modules } Analytics.TrackEventAsync(Category.Search, Action.Request, "TvShow", Username, CookieHelper.GetAnalyticClientId(Cookies)); + // This means we are requesting an episode rather than a whole series or season + if (episodeModel != null) + { + episodeRequest = true; + var sonarrSettings = await SonarrService.GetSettingsAsync(); + if (!sonarrSettings.Enabled) + { + return Response.AsJson("This is currently only supported with Sonarr"); + } + + var series = await GetSonarrSeries(sonarrSettings, episodeModel.ShowId); + if (series != null) + { + // The series already exists in Sonarr + episodeResult = RequestEpisodesWithExistingSeries(episodeModel, series, sonarrSettings); + } + } + var showInfo = TvApi.ShowLookupByTheTvDbId(showId); DateTime firstAir; DateTime.TryParse(showInfo.premiered, out firstAir); @@ -565,6 +591,7 @@ namespace PlexRequests.UI.Modules { providerId = showId.ToString(); } + // TODO: If it's an episode request, check if the episode exists if (Checker.IsTvShowAvailable(shows.ToArray(), showInfo.name, showInfo.premiered?.Substring(0, 4), providerId)) { return Response.AsJson(new JsonResponseModel { Result = false, Message = $"{fullShowName} {Resources.UI.Search_AlreadyInPlex}" }); @@ -596,6 +623,7 @@ namespace PlexRequests.UI.Modules }; var seasonsList = new List(); + //TODO something here for the episodes switch (seasons) { case "first": @@ -609,6 +637,8 @@ namespace PlexRequests.UI.Modules case "all": model.SeasonsRequested = "All"; break; + case "episode": + default: model.SeasonsRequested = seasons; var split = seasons.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); @@ -956,37 +986,8 @@ namespace PlexRequests.UI.Modules return Response.AsJson(new JsonResponseModel { Result = true, Message = message }); } - private async Task RequestEpisodes() + private bool RequestEpisodesWithExistingSeries(EpisodeRequestModel model, Series selectedSeries, SonarrSettings sonarrSettings) { - var req = (Dictionary.ValueCollection)this.Request.Form.Values; - var json = req.FirstOrDefault().ToString(); - var model = JsonConvert.DeserializeObject(json); - //var model = this.Bind(); - if (model == null) - { - return Nancy.Response.NoBody; - } - var sonarrSettings = await SonarrService.GetSettingsAsync(); - if (!sonarrSettings.Enabled) - { - return Response.AsJson("Need sonarr"); - } - - var existingRequest = await RequestService.CheckRequestAsync(model.ShowId); - - - - - // Find the correct series - var task = await Task.Run(() => SonarrApi.GetSeries(sonarrSettings.ApiKey, sonarrSettings.FullUri)).ConfigureAwait(false); - var selectedSeries = task.FirstOrDefault(series => series.tvdbId == model.ShowId); - if (selectedSeries == null) - { - - // Need to add the series as unmonitored. - return Response.AsJson(""); - } - // Show Exists // Look up all episodes var episodes = SonarrApi.GetEpisodes(selectedSeries.id.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri).ToList(); @@ -1010,9 +1011,16 @@ namespace PlexRequests.UI.Modules Task.WaitAll(tasks.ToArray()); SonarrApi.SearchForEpisodes(internalEpisodeIds.ToArray(), sonarrSettings.ApiKey, sonarrSettings.FullUri); + + return true; + } + private async Task GetSonarrSeries(SonarrSettings sonarrSettings, int showId) + { + var task = await Task.Run(() => SonarrApi.GetSeries(sonarrSettings.ApiKey, sonarrSettings.FullUri)).ConfigureAwait(false); + var selectedSeries = task.FirstOrDefault(series => series.tvdbId == showId); - return Response.AsJson(new JsonResponseModel() { Result = true }); + return selectedSeries; } }