From 2a284ce75cd79ec74dbd384051c4566f7dfe38de Mon Sep 17 00:00:00 2001 From: tidusjar Date: Tue, 13 Apr 2021 10:49:20 +0100 Subject: [PATCH] Fixed the issue where TV Shows were not being hidden from the Discover section --- src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs | 91 ++++++++++++------- .../Rule/Rules/Search/PlexAvailabilityRule.cs | 14 +++ src/Ombi.Mapping/Profiles/TvProfile.cs | 4 +- .../Models/MovieDbSearchResult.cs | 10 +- 4 files changed, 82 insertions(+), 37 deletions(-) diff --git a/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs index 952c897d6..a24878da7 100644 --- a/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs @@ -22,6 +22,7 @@ using Microsoft.EntityFrameworkCore; using System.Threading; using Ombi.Api.TheMovieDb; using Ombi.Api.TheMovieDb.Models; +using System.Diagnostics; namespace Ombi.Core.Engine.V2 { @@ -69,39 +70,7 @@ namespace Ombi.Core.Engine.V2 { var seasonEpisodes = (await _movieApi.GetSeasonEpisodes(show.id, tvSeason.season_number, token)); - foreach (var episode in seasonEpisodes.episodes) - { - var season = mapped.SeasonRequests.FirstOrDefault(x => x.SeasonNumber == episode.season_number); - if (season == null) - { - var newSeason = new SeasonRequests - { - SeasonNumber = episode.season_number, - Overview = tvSeason.overview, - Episodes = new List() - }; - newSeason.Episodes.Add(new EpisodeRequests - { - //Url = episode...ToHttpsUrl(), - Title = episode.name, - AirDate = episode.air_date.HasValue() ? DateTime.Parse(episode.air_date) : DateTime.MinValue, - EpisodeNumber = episode.episode_number, - - }); - mapped.SeasonRequests.Add(newSeason); - } - else - { - // We already have the season, so just add the episode - season.Episodes.Add(new EpisodeRequests - { - //Url = e.url.ToHttpsUrl(), - Title = episode.name, - AirDate = episode.air_date.HasValue() ? DateTime.Parse(episode.air_date) : DateTime.MinValue, - EpisodeNumber = episode.episode_number, - }); - } - } + MapSeasons(mapped.SeasonRequests, tvSeason, seasonEpisodes); } return await ProcessResult(mapped); @@ -152,6 +121,7 @@ namespace Ombi.Core.Engine.V2 async () => await _movieApi.TopRatedTv(langCode, pagesToLoad.Page), DateTime.Now.AddHours(12)); results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take)); } + var processed = ProcessResults(results); return await processed; } @@ -177,22 +147,73 @@ namespace Ombi.Core.Engine.V2 return data; } - private async Task> ProcessResults(IEnumerable items) + private async Task> ProcessResults(List items) { var retVal = new List(); var settings = await _customization.GetSettingsAsync(); + foreach (var tvMazeSearch in items) { + var show = await Cache.GetOrAdd(nameof(GetShowInformation) + tvMazeSearch.Id.ToString(), + async () => await _movieApi.GetTVInfo(tvMazeSearch.Id.ToString()), DateTime.Now.AddHours(12)); + foreach (var tvSeason in show.seasons.Where(x => x.season_number != 0)) // skip the first season + { + var seasonEpisodes = await Cache.GetOrAdd("SeasonEpisodes" + show.id + tvSeason.season_number, async () => + { + return await _movieApi.GetSeasonEpisodes(show.id, tvSeason.season_number, CancellationToken.None); + }, DateTime.Now.AddHours(12)); + + MapSeasons(tvMazeSearch.SeasonRequests, tvSeason, seasonEpisodes); + } + var result = await ProcessResult(tvMazeSearch); - if (result == null || settings.HideAvailableFromDiscover && result.Available) + if (result == null || settings.HideAvailableFromDiscover && result.FullyAvailable) { continue; } retVal.Add(result); } + return retVal; } + private static void MapSeasons(List seasonRequests, Season tvSeason, SeasonDetails seasonEpisodes) + { + foreach (var episode in seasonEpisodes.episodes) + { + var season = seasonRequests.FirstOrDefault(x => x.SeasonNumber == episode.season_number); + if (season == null) + { + var newSeason = new SeasonRequests + { + SeasonNumber = episode.season_number, + Overview = tvSeason.overview, + Episodes = new List() + }; + newSeason.Episodes.Add(new EpisodeRequests + { + //Url = episode...ToHttpsUrl(), + Title = episode.name, + AirDate = episode.air_date.HasValue() ? DateTime.Parse(episode.air_date) : DateTime.MinValue, + EpisodeNumber = episode.episode_number, + + }); + seasonRequests.Add(newSeason); + } + else + { + // We already have the season, so just add the episode + season.Episodes.Add(new EpisodeRequests + { + //Url = e.url.ToHttpsUrl(), + Title = episode.name, + AirDate = episode.air_date.HasValue() ? DateTime.Parse(episode.air_date) : DateTime.MinValue, + EpisodeNumber = episode.episode_number, + }); + } + } + } + private async Task ProcessResult(T tvMazeSearch) { var item = _mapper.Map(tvMazeSearch); diff --git a/src/Ombi.Core/Rule/Rules/Search/PlexAvailabilityRule.cs b/src/Ombi.Core/Rule/Rules/Search/PlexAvailabilityRule.cs index 2a239d1d3..d0397cc15 100644 --- a/src/Ombi.Core/Rule/Rules/Search/PlexAvailabilityRule.cs +++ b/src/Ombi.Core/Rule/Rules/Search/PlexAvailabilityRule.cs @@ -25,6 +25,7 @@ namespace Ombi.Core.Rule.Rules.Search PlexServerContent item = null; var useImdb = false; var useTheMovieDb = false; + var useId = false; var useTvDb = false; if (obj.ImdbId.HasValue()) { @@ -36,6 +37,14 @@ namespace Ombi.Core.Rule.Rules.Search } if (item == null) { + if (obj.Id > 0) + { + item = await PlexContentRepository.Get(obj.Id.ToString()); + if (item != null) + { + useId = true; + } + } if (obj.TheMovieDbId.HasValue()) { item = await PlexContentRepository.Get(obj.TheMovieDbId); @@ -60,6 +69,11 @@ namespace Ombi.Core.Rule.Rules.Search if (item != null) { + if (useId) + { + obj.TheMovieDbId = obj.Id.ToString(); + useTheMovieDb = true; + } obj.Available = true; obj.PlexUrl = item.Url; obj.Quality = item.Quality; diff --git a/src/Ombi.Mapping/Profiles/TvProfile.cs b/src/Ombi.Mapping/Profiles/TvProfile.cs index 55f5ccf9e..0aceffc4f 100644 --- a/src/Ombi.Mapping/Profiles/TvProfile.cs +++ b/src/Ombi.Mapping/Profiles/TvProfile.cs @@ -81,7 +81,9 @@ namespace Ombi.Mapping.Profiles .ForMember(dest => dest.Rating, opts => opts.MapFrom(src => src.VoteAverage.ToString())) .ForMember(dest => dest.BackdropPath, opts => opts.MapFrom(src => src.PosterPath)) //.ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.Runtime.ToString())) - .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Title)); + .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Title)) + .ForMember(dest => dest.SeasonRequests, opts => opts.MapFrom(src => src.SeasonRequests)) + ; //.ForMember(dest => dest.Status, opts => opts.MapFrom(src => TraktEnumHelper.GetDescription(src.Status))) //.ForMember(dest => dest.Trailer, // opts => opts.MapFrom(src => src.Trailer != null ? src.Trailer.ToString().ToHttpsUrl() : string.Empty)) diff --git a/src/Ombi.TheMovieDbApi/Models/MovieDbSearchResult.cs b/src/Ombi.TheMovieDbApi/Models/MovieDbSearchResult.cs index 0e4a8852f..e936578e9 100644 --- a/src/Ombi.TheMovieDbApi/Models/MovieDbSearchResult.cs +++ b/src/Ombi.TheMovieDbApi/Models/MovieDbSearchResult.cs @@ -1,4 +1,7 @@ -namespace Ombi.Api.TheMovieDb.Models +using Ombi.Store.Repository.Requests; +using System.Collections.Generic; + +namespace Ombi.Api.TheMovieDb.Models { public class MovieDbSearchResult { @@ -16,5 +19,10 @@ public int VoteCount { get; set; } public bool Video { get; set; } public float VoteAverage { get; set; } + + /// + /// Mapped Property and not set from the API + /// + public List SeasonRequests { get; set; } = new List(); } } \ No newline at end of file