From 1a0823ca80559417c67323aaeaa1ef5243e98031 Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Mon, 25 Apr 2022 18:53:44 +0200 Subject: [PATCH 01/22] feat(discover): Add new trending source experimental feature --- .../Engine/Interfaces/IMovieEngineV2.cs | 1 + .../Engine/V2/MovieSearchEngineV2.cs | 16 +++++++++++ src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs | 14 +++++++--- .../Settings/Models/FeatureSettings.cs | 1 + src/Ombi.TheMovieDbApi/IMovieDbApi.cs | 2 ++ src/Ombi.TheMovieDbApi/TheMovieDbApi.cs | 27 +++++++++++++++++++ .../carousel-list/carousel-list.component.ts | 4 +++ .../src/app/services/searchV2.service.ts | 4 +++ .../src/app/state/features/features.facade.ts | 4 ++- .../app/state/features/features.selectors.ts | 7 ++++- src/Ombi/Controllers/V2/SearchController.cs | 21 ++++++++++++--- 11 files changed, 93 insertions(+), 8 deletions(-) diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieEngineV2.cs b/src/Ombi.Core/Engine/Interfaces/IMovieEngineV2.cs index 2d86443d1..f70c34c1e 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieEngineV2.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieEngineV2.cs @@ -17,6 +17,7 @@ namespace Ombi.Core.Engine.Interfaces Task> UpcomingMovies(); Task> NowPlayingMovies(); Task> NowPlayingMovies(int currentPosition, int amountToLoad); + Task> TrendingMovies(int currentPosition, int amountToLoad); Task GetCollection(int collectionId, CancellationToken cancellationToken, string langCode = null); Task GetTvDbId(int theMovieDbId); Task> PopularMovies(int currentlyLoaded, int toLoad, CancellationToken cancellationToken, string langCustomCode = null); diff --git a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs index 3acd7d1f0..74a49930c 100644 --- a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs @@ -208,6 +208,22 @@ namespace Ombi.Core.Engine.V2 } return await TransformMovieResultsToResponse(results); } + + public async Task> TrendingMovies(int currentPosition, int amountToLoad) + { + var langCode = await DefaultLanguageCode(null); + + var pages = PaginationHelper.GetNextPages(currentPosition, amountToLoad, _theMovieDbMaxPageItems); + + var results = new List(); + foreach (var pagesToLoad in pages) + { + var apiResult = await Cache.GetOrAddAsync(nameof(NowPlayingMovies) + pagesToLoad.Page + langCode, + () => MovieApi.TrendingMovies(langCode, pagesToLoad.Page), DateTimeOffset.Now.AddHours(12)); + results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take)); + } + return await TransformMovieResultsToResponse(results); + } public async Task> SeasonalList(int currentPosition, int amountToLoad, CancellationToken cancellationToken) { diff --git a/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs index 344ced813..6de747964 100644 --- a/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs @@ -26,6 +26,7 @@ using System.Diagnostics; using Ombi.Core.Engine.Interfaces; using Ombi.Core.Models.UI; using Ombi.Core.Helpers; +using Ombi.Core.Services; namespace Ombi.Core.Engine.V2 { @@ -37,10 +38,12 @@ namespace Ombi.Core.Engine.V2 private readonly IMovieDbApi _movieApi; private readonly ISettingsService _customization; private readonly ITvRequestEngine _requestEngine; + private readonly IFeatureService _feature; public TvSearchEngineV2(ICurrentUser identity, IRequestServiceMain service, ITvMazeApi tvMaze, IMapper mapper, ITraktApi trakt, IRuleEvaluator r, OmbiUserManager um, ICacheService memCache, ISettingsService s, - IRepository sub, IMovieDbApi movieApi, ISettingsService customization, ITvRequestEngine requestEngine) + IRepository sub, IMovieDbApi movieApi, ISettingsService customization, ITvRequestEngine requestEngine, + IFeatureService feature) : base(identity, service, r, um, memCache, s, sub) { _tvMaze = tvMaze; @@ -49,6 +52,7 @@ namespace Ombi.Core.Engine.V2 _movieApi = movieApi; _customization = customization; _requestEngine = requestEngine; + _feature = feature; } @@ -132,15 +136,19 @@ namespace Ombi.Core.Engine.V2 } public async Task> Trending(int currentlyLoaded, int amountToLoad) - { + { var langCode = await DefaultLanguageCode(null); + var isNewTrendingSourceEnabled = await _feature.FeatureEnabled(FeatureNames.NewTrendingSource); var pages = PaginationHelper.GetNextPages(currentlyLoaded, amountToLoad, ResultLimit); var results = new List(); foreach (var pagesToLoad in pages) { + var search = ( async () => (isNewTrendingSourceEnabled) ? + await _movieApi.TrendingTv(langCode, pagesToLoad.Page) + : await _movieApi.TopRatedTv(langCode, pagesToLoad.Page)); var apiResult = await Cache.GetOrAddAsync(nameof(Trending) + langCode + pagesToLoad.Page, - async () => await _movieApi.TopRatedTv(langCode, pagesToLoad.Page), DateTimeOffset.Now.AddHours(12)); + search, DateTimeOffset.Now.AddHours(12)); results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take)); } diff --git a/src/Ombi.Settings/Settings/Models/FeatureSettings.cs b/src/Ombi.Settings/Settings/Models/FeatureSettings.cs index 6a285d422..b4301b328 100644 --- a/src/Ombi.Settings/Settings/Models/FeatureSettings.cs +++ b/src/Ombi.Settings/Settings/Models/FeatureSettings.cs @@ -20,5 +20,6 @@ namespace Ombi.Settings.Settings.Models public static class FeatureNames { public const string Movie4KRequests = nameof(Movie4KRequests); + public const string NewTrendingSource = nameof(NewTrendingSource); } } diff --git a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs index 51da958b6..4f3885ef0 100644 --- a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs @@ -15,6 +15,7 @@ namespace Ombi.Api.TheMovieDb Task GetMovieInformation(int movieId); Task GetMovieInformationWithExtraInfo(int movieId, string langCode = "en"); Task> NowPlaying(string languageCode, int? page = null); + Task> TrendingMovies(string languageCode, int? page = null); Task> PopularMovies(string languageCode, int? page = null, CancellationToken cancellationToken = default(CancellationToken)); Task> PopularTv(string langCode, int? page = null, CancellationToken cancellationToken = default(CancellationToken)); Task> SearchMovie(string searchTerm, int? year, string languageCode); @@ -23,6 +24,7 @@ namespace Ombi.Api.TheMovieDb Task> TopRated(string languageCode, int? page = null); Task> Upcoming(string languageCode, int? page = null); Task> TopRatedTv(string languageCode, int? page = null); + Task> TrendingTv(string languageCode, int? page = null); Task> UpcomingTv(string languageCode, int? page = null); Task> SimilarMovies(int movieId, string langCode); Task Find(string externalId, ExternalSource source); diff --git a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs index 02862fb7d..ba61ccfcf 100644 --- a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs @@ -281,6 +281,33 @@ namespace Ombi.Api.TheMovieDb var result = await Api.Request>(request); return Mapper.Map>(result.results); } + + public Task> TrendingMovies(string langCode, int? page = null) + { + return Trending("movie", langCode, page); + } + + public Task> TrendingTv(string langCode, int? page = null) + { + return Trending("tv", langCode, page); + } + private async Task> Trending(string type, string langCode, int? page = null) + { + // https://developers.themoviedb.org/3/trending/get-trending + var timeWindow = "week"; // another option can be 'day' + var request = new Request($"trending/{type}/{timeWindow}", BaseUri, HttpMethod.Get); + request.AddQueryString("api_key", ApiToken); + request.AddQueryString("language", langCode); + + if (page != null) + { + request.AddQueryString("page", page.ToString()); + } + + AddRetry(request); + var result = await Api.Request>(request); + return Mapper.Map>(result.results); + } public Task> Upcoming(string langCode, int? page = null) { diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts index 9617c993e..92896a877 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts @@ -224,7 +224,11 @@ export class CarouselListComponent implements OnInit { this.movies = await this.searchService.popularMoviesByPage(this.currentlyLoaded, this.amountToLoad); break; case DiscoverType.Trending: + if(this.featureFacade.isNewTrendingSourceEnabled) { + this.movies = await this.searchService.trendingMoviesByPage(this.currentlyLoaded, this.amountToLoad); + } else { this.movies = await this.searchService.nowPlayingMoviesByPage(this.currentlyLoaded, this.amountToLoad); + } break; case DiscoverType.Upcoming: this.movies = await this.searchService.upcomingMoviesByPage(this.currentlyLoaded, this.amountToLoad); diff --git a/src/Ombi/ClientApp/src/app/services/searchV2.service.ts b/src/Ombi/ClientApp/src/app/services/searchV2.service.ts index 56b1057c6..fd43044f5 100644 --- a/src/Ombi/ClientApp/src/app/services/searchV2.service.ts +++ b/src/Ombi/ClientApp/src/app/services/searchV2.service.ts @@ -91,6 +91,10 @@ export class SearchV2Service extends ServiceHelpers { return this.http.get(`${this.url}/Movie/nowplaying/${currentlyLoaded}/${toLoad}`).toPromise(); } + public trendingMoviesByPage(currentlyLoaded: number, toLoad: number): Promise { + return this.http.get(`${this.url}/Movie/trending/${currentlyLoaded}/${toLoad}`).toPromise(); + } + public topRatedMovies(): Observable { return this.http.get(`${this.url}/Movie/toprated`); } diff --git a/src/Ombi/ClientApp/src/app/state/features/features.facade.ts b/src/Ombi/ClientApp/src/app/state/features/features.facade.ts index 10e229eba..4dd74d3f9 100644 --- a/src/Ombi/ClientApp/src/app/state/features/features.facade.ts +++ b/src/Ombi/ClientApp/src/app/state/features/features.facade.ts @@ -23,4 +23,6 @@ export class FeaturesFacade { public is4kEnabled = (): boolean => this.store.selectSnapshot(FeaturesSelectors.is4kEnabled); -} \ No newline at end of file + public isNewTrendingSourceEnabled = (): boolean => this.store.selectSnapshot(FeaturesSelectors.isNewTrendingSourceEnabled); + +} diff --git a/src/Ombi/ClientApp/src/app/state/features/features.selectors.ts b/src/Ombi/ClientApp/src/app/state/features/features.selectors.ts index 143dfb875..cda4921a7 100644 --- a/src/Ombi/ClientApp/src/app/state/features/features.selectors.ts +++ b/src/Ombi/ClientApp/src/app/state/features/features.selectors.ts @@ -15,4 +15,9 @@ export class FeaturesSelectors { return features.filter(x => x.name === "Movie4KRequests")[0].enabled; } -} \ No newline at end of file + @Selector([FeaturesSelectors.features]) + public static isNewTrendingSourceEnabled(features: IFeatureEnablement[]): boolean { + return features.filter(x => x.name === "NewTrendingSource")[0].enabled; + } + +} diff --git a/src/Ombi/Controllers/V2/SearchController.cs b/src/Ombi/Controllers/V2/SearchController.cs index 5227f06ec..c487fc4c2 100644 --- a/src/Ombi/Controllers/V2/SearchController.cs +++ b/src/Ombi/Controllers/V2/SearchController.cs @@ -285,6 +285,21 @@ namespace Ombi.Controllers.V2 () => _movieEngineV2.NowPlayingMovies(currentPosition, amountToLoad), DateTimeOffset.Now.AddHours(12)); } + + /// + /// Returns trending movies by page + /// + /// We use TheMovieDb as the Provider + /// + [HttpGet("movie/trending/{currentPosition}/{amountToLoad}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesDefaultResponseType] + public Task> TrendingMovies(int currentPosition, int amountToLoad) + { + return _mediaCacheService.GetOrAddAsync(nameof(TrendingMovies) + currentPosition + amountToLoad, + () => _movieEngineV2.TrendingMovies(currentPosition, amountToLoad), + DateTimeOffset.Now.AddHours(12)); + } /// /// Returns top rated movies. @@ -392,14 +407,14 @@ namespace Ombi.Controllers.V2 /// /// Returns trending shows by page /// - /// We use Trakt.tv as the Provider + /// We use TheMovieDb as the Provider /// [HttpGet("tv/trending/{currentPosition}/{amountToLoad}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesDefaultResponseType] - public Task> Trending(int currentPosition, int amountToLoad) + public Task> TrendingTv(int currentPosition, int amountToLoad) { - return _mediaCacheService.GetOrAddAsync(nameof(Trending) + currentPosition + amountToLoad, + return _mediaCacheService.GetOrAddAsync(nameof(TrendingTv) + currentPosition + amountToLoad, () => _tvEngineV2.Trending(currentPosition, amountToLoad), DateTimeOffset.Now.AddHours(12)); } From a373359ae8e6bad42b558a6e01a8ff2840d3bbaa Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Mon, 25 Apr 2022 18:54:29 +0200 Subject: [PATCH 02/22] fix(settings): Allow toggling features when there are more than one --- .../src/app/settings/features/features.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ombi/ClientApp/src/app/settings/features/features.component.html b/src/Ombi/ClientApp/src/app/settings/features/features.component.html index 4eb975cfe..37de15a4c 100644 --- a/src/Ombi/ClientApp/src/app/settings/features/features.component.html +++ b/src/Ombi/ClientApp/src/app/settings/features/features.component.html @@ -8,7 +8,7 @@
- +

{{feature.name}}

@@ -17,4 +17,4 @@
- \ No newline at end of file + From 6794b887f6544fb41528bdd9728b7824b65e47ee Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Mon, 25 Apr 2022 19:16:26 +0200 Subject: [PATCH 03/22] fix(discover): Fix new trending feature detection --- .../components/carousel-list/carousel-list.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts index 92896a877..dee44fff9 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts @@ -38,6 +38,7 @@ export class CarouselListComponent implements OnInit { public loadingFlag: boolean; public DiscoverType = DiscoverType; public is4kEnabled = false; + public isNewTrendingSourceEnabled = false; get mediaTypeStorageKey() { return "DiscoverOptions" + this.discoverType.toString(); @@ -139,6 +140,7 @@ export class CarouselListComponent implements OnInit { public async ngOnInit() { this.is4kEnabled = this.featureFacade.is4kEnabled(); + this.isNewTrendingSourceEnabled = this.featureFacade.isNewTrendingSourceEnabled(); this.currentlyLoaded = 0; const localDiscoverOptions = +this.storageService.get(this.mediaTypeStorageKey); if (localDiscoverOptions) { @@ -224,7 +226,7 @@ export class CarouselListComponent implements OnInit { this.movies = await this.searchService.popularMoviesByPage(this.currentlyLoaded, this.amountToLoad); break; case DiscoverType.Trending: - if(this.featureFacade.isNewTrendingSourceEnabled) { + if(this.isNewTrendingSourceEnabled) { this.movies = await this.searchService.trendingMoviesByPage(this.currentlyLoaded, this.amountToLoad); } else { this.movies = await this.searchService.nowPlayingMoviesByPage(this.currentlyLoaded, this.amountToLoad); From 03d94220c7eaafb50c6c80a6ed1150794b873ac3 Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Mon, 25 Apr 2022 19:16:47 +0200 Subject: [PATCH 04/22] fix(discover): Fix cache mix up --- src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs index 74a49930c..1a353cb55 100644 --- a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs @@ -218,7 +218,7 @@ namespace Ombi.Core.Engine.V2 var results = new List(); foreach (var pagesToLoad in pages) { - var apiResult = await Cache.GetOrAddAsync(nameof(NowPlayingMovies) + pagesToLoad.Page + langCode, + var apiResult = await Cache.GetOrAddAsync(nameof(TrendingMovies) + pagesToLoad.Page + langCode, () => MovieApi.TrendingMovies(langCode, pagesToLoad.Page), DateTimeOffset.Now.AddHours(12)); results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take)); } From 70a6a8f953e5bc0d42b371df8cf43a7d18994253 Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Tue, 26 Apr 2022 12:56:02 +0200 Subject: [PATCH 05/22] refactor(discover): Move movie trending feature toggle to backend --- .../Engine/Interfaces/IMovieEngineV2.cs | 1 - .../Engine/V2/MovieSearchEngineV2.cs | 29 +++++++------------ .../carousel-list/carousel-list.component.ts | 6 ---- .../src/app/services/searchV2.service.ts | 4 --- .../src/app/state/features/features.facade.ts | 4 +-- .../app/state/features/features.selectors.ts | 7 +---- src/Ombi/Controllers/V2/SearchController.cs | 15 ---------- 7 files changed, 13 insertions(+), 53 deletions(-) diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieEngineV2.cs b/src/Ombi.Core/Engine/Interfaces/IMovieEngineV2.cs index f70c34c1e..2d86443d1 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieEngineV2.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieEngineV2.cs @@ -17,7 +17,6 @@ namespace Ombi.Core.Engine.Interfaces Task> UpcomingMovies(); Task> NowPlayingMovies(); Task> NowPlayingMovies(int currentPosition, int amountToLoad); - Task> TrendingMovies(int currentPosition, int amountToLoad); Task GetCollection(int collectionId, CancellationToken cancellationToken, string langCode = null); Task GetTvDbId(int theMovieDbId); Task> PopularMovies(int currentlyLoaded, int toLoad, CancellationToken cancellationToken, string langCustomCode = null); diff --git a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs index 1a353cb55..d4aede4f6 100644 --- a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs @@ -11,6 +11,7 @@ using Ombi.Core.Models.Search; using Ombi.Core.Models.Search.V2; using Ombi.Core.Models.UI; using Ombi.Core.Rule.Interfaces; +using Ombi.Core.Services; using Ombi.Core.Settings; using Ombi.Helpers; using Ombi.Settings.Settings.Models; @@ -31,7 +32,8 @@ namespace Ombi.Core.Engine.V2 { public MovieSearchEngineV2(ICurrentUser identity, IRequestServiceMain service, IMovieDbApi movApi, IMapper mapper, ILogger logger, IRuleEvaluator r, OmbiUserManager um, ICacheService mem, ISettingsService s, IRepository sub, - ISettingsService customizationSettings, IMovieRequestEngine movieRequestEngine, IHttpClientFactory httpClientFactory) + ISettingsService customizationSettings, IMovieRequestEngine movieRequestEngine, IHttpClientFactory httpClientFactory, + IFeatureService feature) : base(identity, service, r, um, mem, s, sub) { MovieApi = movApi; @@ -40,6 +42,7 @@ namespace Ombi.Core.Engine.V2 _customizationSettings = customizationSettings; _movieRequestEngine = movieRequestEngine; _client = httpClientFactory.CreateClient(); + _feature = feature; } private IMovieDbApi MovieApi { get; } @@ -48,6 +51,7 @@ namespace Ombi.Core.Engine.V2 private readonly ISettingsService _customizationSettings; private readonly IMovieRequestEngine _movieRequestEngine; private readonly HttpClient _client; + private readonly IFeatureService _feature; public async Task GetFullMovieInformation(int theMovieDbId, CancellationToken cancellationToken, string langCode = null) { @@ -196,30 +200,19 @@ namespace Ombi.Core.Engine.V2 public async Task> NowPlayingMovies(int currentPosition, int amountToLoad) { var langCode = await DefaultLanguageCode(null); + var isNewTrendingSourceEnabled = await _feature.FeatureEnabled(FeatureNames.NewTrendingSource); var pages = PaginationHelper.GetNextPages(currentPosition, amountToLoad, _theMovieDbMaxPageItems); var results = new List(); foreach (var pagesToLoad in pages) { + var search = () => (isNewTrendingSourceEnabled) ? + MovieApi.TrendingMovies(langCode, pagesToLoad.Page) + : MovieApi.NowPlaying(langCode, pagesToLoad.Page); + var apiResult = await Cache.GetOrAddAsync(nameof(NowPlayingMovies) + pagesToLoad.Page + langCode, - () => MovieApi.NowPlaying(langCode, pagesToLoad.Page), DateTimeOffset.Now.AddHours(12)); - results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take)); - } - return await TransformMovieResultsToResponse(results); - } - - public async Task> TrendingMovies(int currentPosition, int amountToLoad) - { - var langCode = await DefaultLanguageCode(null); - - var pages = PaginationHelper.GetNextPages(currentPosition, amountToLoad, _theMovieDbMaxPageItems); - - var results = new List(); - foreach (var pagesToLoad in pages) - { - var apiResult = await Cache.GetOrAddAsync(nameof(TrendingMovies) + pagesToLoad.Page + langCode, - () => MovieApi.TrendingMovies(langCode, pagesToLoad.Page), DateTimeOffset.Now.AddHours(12)); + search, DateTimeOffset.Now.AddHours(12)); results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take)); } return await TransformMovieResultsToResponse(results); diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts index dee44fff9..9617c993e 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts @@ -38,7 +38,6 @@ export class CarouselListComponent implements OnInit { public loadingFlag: boolean; public DiscoverType = DiscoverType; public is4kEnabled = false; - public isNewTrendingSourceEnabled = false; get mediaTypeStorageKey() { return "DiscoverOptions" + this.discoverType.toString(); @@ -140,7 +139,6 @@ export class CarouselListComponent implements OnInit { public async ngOnInit() { this.is4kEnabled = this.featureFacade.is4kEnabled(); - this.isNewTrendingSourceEnabled = this.featureFacade.isNewTrendingSourceEnabled(); this.currentlyLoaded = 0; const localDiscoverOptions = +this.storageService.get(this.mediaTypeStorageKey); if (localDiscoverOptions) { @@ -226,11 +224,7 @@ export class CarouselListComponent implements OnInit { this.movies = await this.searchService.popularMoviesByPage(this.currentlyLoaded, this.amountToLoad); break; case DiscoverType.Trending: - if(this.isNewTrendingSourceEnabled) { - this.movies = await this.searchService.trendingMoviesByPage(this.currentlyLoaded, this.amountToLoad); - } else { this.movies = await this.searchService.nowPlayingMoviesByPage(this.currentlyLoaded, this.amountToLoad); - } break; case DiscoverType.Upcoming: this.movies = await this.searchService.upcomingMoviesByPage(this.currentlyLoaded, this.amountToLoad); diff --git a/src/Ombi/ClientApp/src/app/services/searchV2.service.ts b/src/Ombi/ClientApp/src/app/services/searchV2.service.ts index fd43044f5..56b1057c6 100644 --- a/src/Ombi/ClientApp/src/app/services/searchV2.service.ts +++ b/src/Ombi/ClientApp/src/app/services/searchV2.service.ts @@ -91,10 +91,6 @@ export class SearchV2Service extends ServiceHelpers { return this.http.get(`${this.url}/Movie/nowplaying/${currentlyLoaded}/${toLoad}`).toPromise(); } - public trendingMoviesByPage(currentlyLoaded: number, toLoad: number): Promise { - return this.http.get(`${this.url}/Movie/trending/${currentlyLoaded}/${toLoad}`).toPromise(); - } - public topRatedMovies(): Observable { return this.http.get(`${this.url}/Movie/toprated`); } diff --git a/src/Ombi/ClientApp/src/app/state/features/features.facade.ts b/src/Ombi/ClientApp/src/app/state/features/features.facade.ts index 4dd74d3f9..10e229eba 100644 --- a/src/Ombi/ClientApp/src/app/state/features/features.facade.ts +++ b/src/Ombi/ClientApp/src/app/state/features/features.facade.ts @@ -23,6 +23,4 @@ export class FeaturesFacade { public is4kEnabled = (): boolean => this.store.selectSnapshot(FeaturesSelectors.is4kEnabled); - public isNewTrendingSourceEnabled = (): boolean => this.store.selectSnapshot(FeaturesSelectors.isNewTrendingSourceEnabled); - -} +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/state/features/features.selectors.ts b/src/Ombi/ClientApp/src/app/state/features/features.selectors.ts index cda4921a7..143dfb875 100644 --- a/src/Ombi/ClientApp/src/app/state/features/features.selectors.ts +++ b/src/Ombi/ClientApp/src/app/state/features/features.selectors.ts @@ -15,9 +15,4 @@ export class FeaturesSelectors { return features.filter(x => x.name === "Movie4KRequests")[0].enabled; } - @Selector([FeaturesSelectors.features]) - public static isNewTrendingSourceEnabled(features: IFeatureEnablement[]): boolean { - return features.filter(x => x.name === "NewTrendingSource")[0].enabled; - } - -} +} \ No newline at end of file diff --git a/src/Ombi/Controllers/V2/SearchController.cs b/src/Ombi/Controllers/V2/SearchController.cs index c487fc4c2..429add7c8 100644 --- a/src/Ombi/Controllers/V2/SearchController.cs +++ b/src/Ombi/Controllers/V2/SearchController.cs @@ -285,21 +285,6 @@ namespace Ombi.Controllers.V2 () => _movieEngineV2.NowPlayingMovies(currentPosition, amountToLoad), DateTimeOffset.Now.AddHours(12)); } - - /// - /// Returns trending movies by page - /// - /// We use TheMovieDb as the Provider - /// - [HttpGet("movie/trending/{currentPosition}/{amountToLoad}")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesDefaultResponseType] - public Task> TrendingMovies(int currentPosition, int amountToLoad) - { - return _mediaCacheService.GetOrAddAsync(nameof(TrendingMovies) + currentPosition + amountToLoad, - () => _movieEngineV2.TrendingMovies(currentPosition, amountToLoad), - DateTimeOffset.Now.AddHours(12)); - } /// /// Returns top rated movies. From 4f12939e22020a67a5ee75e2907923faea136e8d Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Tue, 26 Apr 2022 12:58:21 +0200 Subject: [PATCH 06/22] feat(discover): Default trending source to new logic --- src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs | 8 ++++---- src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs | 8 ++++---- src/Ombi.Settings/Settings/Models/FeatureSettings.cs | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs index d4aede4f6..3423bc139 100644 --- a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs @@ -200,16 +200,16 @@ namespace Ombi.Core.Engine.V2 public async Task> NowPlayingMovies(int currentPosition, int amountToLoad) { var langCode = await DefaultLanguageCode(null); - var isNewTrendingSourceEnabled = await _feature.FeatureEnabled(FeatureNames.NewTrendingSource); + var isOldTrendingSourceEnabled = await _feature.FeatureEnabled(FeatureNames.OldTrendingSource); var pages = PaginationHelper.GetNextPages(currentPosition, amountToLoad, _theMovieDbMaxPageItems); var results = new List(); foreach (var pagesToLoad in pages) { - var search = () => (isNewTrendingSourceEnabled) ? - MovieApi.TrendingMovies(langCode, pagesToLoad.Page) - : MovieApi.NowPlaying(langCode, pagesToLoad.Page); + var search = () => (isOldTrendingSourceEnabled) ? + MovieApi.NowPlaying(langCode, pagesToLoad.Page) + : MovieApi.TrendingMovies(langCode, pagesToLoad.Page); var apiResult = await Cache.GetOrAddAsync(nameof(NowPlayingMovies) + pagesToLoad.Page + langCode, search, DateTimeOffset.Now.AddHours(12)); diff --git a/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs index 6de747964..21035567a 100644 --- a/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs @@ -138,15 +138,15 @@ namespace Ombi.Core.Engine.V2 public async Task> Trending(int currentlyLoaded, int amountToLoad) { var langCode = await DefaultLanguageCode(null); - var isNewTrendingSourceEnabled = await _feature.FeatureEnabled(FeatureNames.NewTrendingSource); + var isOldTrendingSourceEnabled = await _feature.FeatureEnabled(FeatureNames.OldTrendingSource); var pages = PaginationHelper.GetNextPages(currentlyLoaded, amountToLoad, ResultLimit); var results = new List(); foreach (var pagesToLoad in pages) { - var search = ( async () => (isNewTrendingSourceEnabled) ? - await _movieApi.TrendingTv(langCode, pagesToLoad.Page) - : await _movieApi.TopRatedTv(langCode, pagesToLoad.Page)); + var search = ( async () => (isOldTrendingSourceEnabled) ? + await _movieApi.TopRatedTv(langCode, pagesToLoad.Page) + : await _movieApi.TrendingTv(langCode, pagesToLoad.Page)); var apiResult = await Cache.GetOrAddAsync(nameof(Trending) + langCode + pagesToLoad.Page, search, DateTimeOffset.Now.AddHours(12)); results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take)); diff --git a/src/Ombi.Settings/Settings/Models/FeatureSettings.cs b/src/Ombi.Settings/Settings/Models/FeatureSettings.cs index b4301b328..9d0149e5d 100644 --- a/src/Ombi.Settings/Settings/Models/FeatureSettings.cs +++ b/src/Ombi.Settings/Settings/Models/FeatureSettings.cs @@ -20,6 +20,6 @@ namespace Ombi.Settings.Settings.Models public static class FeatureNames { public const string Movie4KRequests = nameof(Movie4KRequests); - public const string NewTrendingSource = nameof(NewTrendingSource); + public const string OldTrendingSource = nameof(OldTrendingSource); } } From 5973056393274759fb5b340088a09f7d929eaf79 Mon Sep 17 00:00:00 2001 From: Conventional Changelog Action Date: Tue, 26 Apr 2022 14:45:31 +0000 Subject: [PATCH 07/22] chore(release): :rocket: v4.18.0 --- CHANGELOG.md | 26 +++++++++++++++++--------- version.json | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bae5e4851..256e31749 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +# [4.18.0](https://github.com/Ombi-app/Ombi/compare/v4.17.0...v4.18.0) (2022-04-26) + + +### Bug Fixes + +* **discover:** Fix cache mix up ([03d9422](https://github.com/Ombi-app/Ombi/commit/03d94220c7eaafb50c6c80a6ed1150794b873ac3)) +* **discover:** Fix new trending feature detection ([6794b88](https://github.com/Ombi-app/Ombi/commit/6794b887f6544fb41528bdd9728b7824b65e47ee)) +* **settings:** Allow toggling features when there are more than one ([a373359](https://github.com/Ombi-app/Ombi/commit/a373359ae8e6bad42b558a6e01a8ff2840d3bbaa)) + + +### Features + +* **discover:** Add new trending source experimental feature ([1a0823c](https://github.com/Ombi-app/Ombi/commit/1a0823ca80559417c67323aaeaa1ef5243e98031)) +* **discover:** Default trending source to new logic ([4f12939](https://github.com/Ombi-app/Ombi/commit/4f12939e22020a67a5ee75e2907923faea136e8d)) + + + # [4.17.0](https://github.com/Ombi-app/Ombi/compare/v4.16.17...v4.17.0) (2022-04-25) @@ -329,12 +346,3 @@ -## [4.12.2](https://github.com/Ombi-app/Ombi/compare/v4.12.1...v4.12.2) (2022-02-16) - - -### Bug Fixes - -* **requests:** :bug: Fixed the approve 4k option on the requests list not working as expected ([c0189da](https://github.com/Ombi-app/Ombi/commit/c0189dad478ea375beda61ba3bee3f029a39b8e5)) - - - diff --git a/version.json b/version.json index e4a3f1a5b..48c62b29c 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "4.17.0" + "version": "4.18.0" } \ No newline at end of file From 5938077d82a5357f79c07b218b3986557a5816e8 Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:33:33 +0200 Subject: [PATCH 08/22] feat(sync): Detect reidentified movies in Emby and Jellyfin --- .../Jobs/Emby/EmbyContentSync.cs | 43 ++++++++++++------ .../Jobs/Jellyfin/JellyfinContentSync.cs | 44 +++++++++++++------ 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs b/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs index b4d61f93d..8d93c804c 100644 --- a/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs @@ -265,23 +265,22 @@ namespace Ombi.Schedule.Jobs.Emby return; } _logger.LogDebug($"Adding new movie {movieInfo.Name}"); - - content.Add(new EmbyContent - { - ImdbId = movieInfo.ProviderIds.Imdb, - TheMovieDbId = movieInfo.ProviderIds?.Tmdb, - Title = movieInfo.Name, - Type = MediaType.Movie, - EmbyId = movieInfo.Id, - Url = EmbyHelper.GetEmbyMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname), - AddedAt = DateTime.UtcNow, - Quality = has4K ? null : quality, - Has4K = has4K - }); + var newMovie = new EmbyContent(); + newMovie.AddedAt = DateTime.UtcNow; + MapEmbyContent(newMovie, movieInfo, server, has4K, quality); + content.Add(newMovie); } else { - if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase)) + var movieHasChanged = false; + if(existingMovie.ImdbId != movieInfo.ProviderIds.Imdb || existingMovie.TheMovieDbId != movieInfo.ProviderIds.Tmdb) + { + _logger.LogDebug($"Updating existing movie '{movieInfo.Name}'"); + MapEmbyContent(existingMovie, movieInfo, server, has4K, quality); + movieHasChanged = true; + + } + else if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase)) { _logger.LogDebug($"We have found another quality for Movie '{movieInfo.Name}', Quality: '{quality}'"); existingMovie.Quality = has4K ? null : quality; @@ -290,6 +289,11 @@ namespace Ombi.Schedule.Jobs.Emby // Probably could refactor here // If a 4k movie comes in (we don't store the quality on 4k) // it will always get updated even know it's not changed + movieHasChanged = true; + } + + if(movieHasChanged) + { toUpdate.Add(existingMovie); } else @@ -300,6 +304,17 @@ namespace Ombi.Schedule.Jobs.Emby } } + private void MapEmbyContent(EmbyContent content, EmbyMovie movieInfo, EmbyServers server, bool has4K, string quality){ + content.ImdbId = movieInfo.ProviderIds.Imdb; + content.TheMovieDbId = movieInfo.ProviderIds?.Tmdb; + content.Title = movieInfo.Name; + content.Type = MediaType.Movie; + content.EmbyId = movieInfo.Id; + content.Url = EmbyHelper.GetEmbyMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname); + content.Quality = has4K ? null : quality; + content.Has4K = has4K; + } + private bool ValidateSettings(EmbyServers server) { if (server?.Ip == null || string.IsNullOrEmpty(server?.ApiKey)) diff --git a/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs b/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs index 060c974e7..eb937ecf0 100644 --- a/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs @@ -230,22 +230,22 @@ namespace Ombi.Schedule.Jobs.Jellyfin return; } _logger.LogDebug($"Adding new movie {movieInfo.Name}"); - content.Add(new JellyfinContent - { - ImdbId = movieInfo.ProviderIds.Imdb, - TheMovieDbId = movieInfo.ProviderIds?.Tmdb, - Title = movieInfo.Name, - Type = MediaType.Movie, - JellyfinId = movieInfo.Id, - Url = JellyfinHelper.GetJellyfinMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname), - AddedAt = DateTime.UtcNow, - Quality = has4K ? null : quality, - Has4K = has4K - }); + var newMovie = new JellyfinContent(); + newMovie.AddedAt = DateTime.UtcNow; + MapJellyfinMovie(newMovie, movieInfo, server, has4K, quality); + content.Add(newMovie);; } else { - if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase)) + var movieHasChanged = false; + if(existingMovie.ImdbId != movieInfo.ProviderIds.Imdb || existingMovie.TheMovieDbId != movieInfo.ProviderIds.Tmdb) + { + _logger.LogDebug($"Updating existing movie '{movieInfo.Name}'"); + MapJellyfinMovie(existingMovie, movieInfo, server, has4K, quality); + movieHasChanged = true; + + } + else if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase)) { _logger.LogDebug($"We have found another quality for Movie '{movieInfo.Name}', Quality: '{quality}'"); existingMovie.Quality = has4K ? null : quality; @@ -255,6 +255,12 @@ namespace Ombi.Schedule.Jobs.Jellyfin // If a 4k movie comes in (we don't store the quality on 4k) // it will always get updated even know it's not changed toUpdate.Add(existingMovie); + movieHasChanged = true; + } + + if(movieHasChanged) + { + toUpdate.Add(existingMovie); } else { @@ -264,6 +270,18 @@ namespace Ombi.Schedule.Jobs.Jellyfin } } + private void MapJellyfinMovie(JellyfinContent content, JellyfinMovie movieInfo, JellyfinServers server, bool has4K, string quality) + { + content.ImdbId = movieInfo.ProviderIds.Imdb; + content.TheMovieDbId = movieInfo.ProviderIds?.Tmdb; + content.Title = movieInfo.Name; + content.Type = MediaType.Movie; + content.JellyfinId = movieInfo.Id; + content.Url = JellyfinHelper.GetJellyfinMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname); + content.Quality = has4K ? null : quality; + content.Has4K = has4K; + } + private bool ValidateSettings(JellyfinServers server) { if (server?.Ip == null || string.IsNullOrEmpty(server?.ApiKey)) From 9096e91d55d268819bce22831f8a8b27f2a1776b Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Tue, 26 Apr 2022 18:17:07 +0200 Subject: [PATCH 09/22] feat(sync): Detect reidentified series in Emby and Jellyfin --- src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs | 11 +++++++++++ .../Jobs/Jellyfin/JellyfinContentSync.cs | 11 +++++++++++ src/Ombi.Store/Repository/EmbyContentRepository.cs | 7 +++++++ .../Repository/IMediaServerContentRepository.cs | 1 + .../Repository/JellyfinContentRepository.cs | 7 +++++++ src/Ombi.Store/Repository/MediaServerRepository.cs | 1 + src/Ombi.Store/Repository/PlexContentRepository.cs | 7 +++++++ 7 files changed, 45 insertions(+) diff --git a/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs b/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs index 8d93c804c..c0acba55c 100644 --- a/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs @@ -157,6 +157,17 @@ namespace Ombi.Schedule.Jobs.Emby } var existingTv = await _repo.GetByEmbyId(tvShow.Id); + + if (existingTv != null && + ( existingTv.ImdbId != tvShow.ProviderIds?.Imdb + || existingTv.TheMovieDbId != tvShow.ProviderIds?.Tmdb + || existingTv.TvDbId != tvShow.ProviderIds?.Tvdb)) + { + _logger.LogCritical($"Series '{tvShow.Name}' has different IDs, probably a reidentification."); + await _repo.DeleteTv(existingTv); + existingTv = null; + } + if (existingTv == null) { _logger.LogDebug("Adding new TV Show {0}", tvShow.Name); diff --git a/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs b/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs index eb937ecf0..cdbb88661 100644 --- a/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs @@ -132,6 +132,17 @@ namespace Ombi.Schedule.Jobs.Jellyfin } var existingTv = await _repo.GetByJellyfinId(tvShow.Id); + + if (existingTv != null && + ( existingTv.ImdbId != tvShow.ProviderIds?.Imdb + || existingTv.TheMovieDbId != tvShow.ProviderIds?.Tmdb + || existingTv.TvDbId != tvShow.ProviderIds?.Tvdb)) + { + _logger.LogDebug($"Series '{tvShow.Name}' has different IDs, probably a reidentification."); + await _repo.DeleteTv(existingTv); + existingTv = null; + } + if (existingTv == null) { _logger.LogDebug("Adding new TV Show {0}", tvShow.Name); diff --git a/src/Ombi.Store/Repository/EmbyContentRepository.cs b/src/Ombi.Store/Repository/EmbyContentRepository.cs index df88d8292..8f9904ebb 100644 --- a/src/Ombi.Store/Repository/EmbyContentRepository.cs +++ b/src/Ombi.Store/Repository/EmbyContentRepository.cs @@ -102,6 +102,13 @@ namespace Ombi.Store.Repository return InternalSaveChanges(); } + public override async Task DeleteTv(EmbyContent tv) + { + var episodesToDelete = GetAllEpisodes().Cast().Where(x => x.ParentId == tv.EmbyId).ToList(); + Db.EmbyEpisode.RemoveRange(episodesToDelete); + await Delete(tv); + } + public override RecentlyAddedType RecentlyAddedType => RecentlyAddedType.Emby; } } \ No newline at end of file diff --git a/src/Ombi.Store/Repository/IMediaServerContentRepository.cs b/src/Ombi.Store/Repository/IMediaServerContentRepository.cs index db4835a16..3f165b7e6 100644 --- a/src/Ombi.Store/Repository/IMediaServerContentRepository.cs +++ b/src/Ombi.Store/Repository/IMediaServerContentRepository.cs @@ -14,6 +14,7 @@ namespace Ombi.Store.Repository IQueryable GetAllEpisodes(); Task Add(IMediaServerEpisode content); Task AddRange(IEnumerable content); + Task DeleteTv(Content tv); void UpdateWithoutSave(IMediaServerContent existingContent); } } \ No newline at end of file diff --git a/src/Ombi.Store/Repository/JellyfinContentRepository.cs b/src/Ombi.Store/Repository/JellyfinContentRepository.cs index c3451da62..8dc729a6b 100644 --- a/src/Ombi.Store/Repository/JellyfinContentRepository.cs +++ b/src/Ombi.Store/Repository/JellyfinContentRepository.cs @@ -104,6 +104,13 @@ namespace Ombi.Store.Repository return InternalSaveChanges(); } + public override async Task DeleteTv(JellyfinContent tv) + { + var episodesToDelete = GetAllEpisodes().Cast().Where(x => x.ParentId == tv.JellyfinId).ToList(); + Db.JellyfinEpisode.RemoveRange(episodesToDelete); + await Delete(tv); + } + public override RecentlyAddedType RecentlyAddedType => RecentlyAddedType.Jellyfin; } } diff --git a/src/Ombi.Store/Repository/MediaServerRepository.cs b/src/Ombi.Store/Repository/MediaServerRepository.cs index c1c7d4ec8..251fe3cea 100644 --- a/src/Ombi.Store/Repository/MediaServerRepository.cs +++ b/src/Ombi.Store/Repository/MediaServerRepository.cs @@ -22,5 +22,6 @@ namespace Ombi.Store.Repository public abstract Task AddRange(IEnumerable content); public abstract void UpdateWithoutSave(IMediaServerContent existingContent); public abstract Task UpdateRange(IEnumerable existingContent); + public abstract Task DeleteTv(T tv); } } \ No newline at end of file diff --git a/src/Ombi.Store/Repository/PlexContentRepository.cs b/src/Ombi.Store/Repository/PlexContentRepository.cs index 96dfbe8e1..9f34af6a1 100644 --- a/src/Ombi.Store/Repository/PlexContentRepository.cs +++ b/src/Ombi.Store/Repository/PlexContentRepository.cs @@ -169,5 +169,12 @@ namespace Ombi.Store.Repository Db.PlexServerContent.UpdateRange((IEnumerable)existingContent); return InternalSaveChanges(); } + + public override Task DeleteTv(PlexServerContent tv) + { + // not used for now + // TODO: delete episodes, then delete series + throw new NotImplementedException(); + } } } \ No newline at end of file From ae25e41b1b01dcc949e1cdc4f7e9a69040e587d4 Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Tue, 26 Apr 2022 18:51:06 +0200 Subject: [PATCH 10/22] Fix sync log criticity --- src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs b/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs index c0acba55c..46cd7cf76 100644 --- a/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs @@ -163,7 +163,7 @@ namespace Ombi.Schedule.Jobs.Emby || existingTv.TheMovieDbId != tvShow.ProviderIds?.Tmdb || existingTv.TvDbId != tvShow.ProviderIds?.Tvdb)) { - _logger.LogCritical($"Series '{tvShow.Name}' has different IDs, probably a reidentification."); + _logger.LogDebug($"Series '{tvShow.Name}' has different IDs, probably a reidentification."); await _repo.DeleteTv(existingTv); existingTv = null; } From 4da0a597d7127c9cb8eeeaf8b49f0f9ed98ecbd5 Mon Sep 17 00:00:00 2001 From: Jamie Date: Tue, 26 Apr 2022 20:02:06 +0100 Subject: [PATCH 11/22] Update pr.yml [skip ci] --- .github/workflows/pr.yml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 08955b8a5..c45a555a7 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -5,6 +5,11 @@ on: types: [opened, synchronize, reopened] workflow_dispatch: +permissions: + pull-requests: write + issues: write + repository-projects: write + jobs: build-ui: runs-on: ubuntu-latest @@ -28,8 +33,7 @@ jobs: unit-test: runs-on: ubuntu-latest - permissions: - checks: write + steps: - uses: actions/checkout@v2 - uses: actions/setup-dotnet@v1 @@ -47,7 +51,16 @@ jobs: - name: Run Unit Tests run: | cd src - dotnet test --configuration "Release" --logger "trx;LogFileName=test-results.trx" + dotnet test --configuration "Release" --logger "trx;LogFileName=test-results.trx" || true + + - name: Test Report + uses: dorny/test-reporter@v1 + if: always() + with: + name: DotNET Tests + path: "**/test-results.trx" + reporter: dotnet-trx + fail-on-error: true analysis: runs-on: ubuntu-latest From 75d279b83a4ce7ef5ae328790d47191c870f40f3 Mon Sep 17 00:00:00 2001 From: Jamie Date: Tue, 26 Apr 2022 20:02:43 +0100 Subject: [PATCH 12/22] Update label.yml [skip ci] --- .github/workflows/label.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 7c724a62a..4e0c7b2de 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -7,6 +7,10 @@ name: Labeler on: [pull_request] +permissions: + pull-requests: write + issues: write + repository-projects: write jobs: label: From a96d2a7818b50d8dd6ec999f672400070123ec7c Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Wed, 27 Apr 2022 08:15:25 +0200 Subject: [PATCH 13/22] Fix formatting --- src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs | 7 +++---- src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs b/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs index 46cd7cf76..27cdf0f3a 100644 --- a/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs @@ -170,7 +170,7 @@ namespace Ombi.Schedule.Jobs.Emby if (existingTv == null) { - _logger.LogDebug("Adding new TV Show {0}", tvShow.Name); + _logger.LogDebug("Adding TV Show {0}", tvShow.Name); mediaToAdd.Add(new EmbyContent { TvDbId = tvShow.ProviderIds?.Tvdb, @@ -284,12 +284,11 @@ namespace Ombi.Schedule.Jobs.Emby else { var movieHasChanged = false; - if(existingMovie.ImdbId != movieInfo.ProviderIds.Imdb || existingMovie.TheMovieDbId != movieInfo.ProviderIds.Tmdb) + if (existingMovie.ImdbId != movieInfo.ProviderIds.Imdb || existingMovie.TheMovieDbId != movieInfo.ProviderIds.Tmdb) { _logger.LogDebug($"Updating existing movie '{movieInfo.Name}'"); MapEmbyContent(existingMovie, movieInfo, server, has4K, quality); movieHasChanged = true; - } else if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase)) { @@ -303,7 +302,7 @@ namespace Ombi.Schedule.Jobs.Emby movieHasChanged = true; } - if(movieHasChanged) + if (movieHasChanged) { toUpdate.Add(existingMovie); } diff --git a/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs b/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs index cdbb88661..5519b3413 100644 --- a/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs @@ -145,7 +145,7 @@ namespace Ombi.Schedule.Jobs.Jellyfin if (existingTv == null) { - _logger.LogDebug("Adding new TV Show {0}", tvShow.Name); + _logger.LogDebug("Adding TV Show {0}", tvShow.Name); mediaToAdd.Add(new JellyfinContent { TvDbId = tvShow.ProviderIds?.Tvdb, @@ -249,12 +249,11 @@ namespace Ombi.Schedule.Jobs.Jellyfin else { var movieHasChanged = false; - if(existingMovie.ImdbId != movieInfo.ProviderIds.Imdb || existingMovie.TheMovieDbId != movieInfo.ProviderIds.Tmdb) + if (existingMovie.ImdbId != movieInfo.ProviderIds.Imdb || existingMovie.TheMovieDbId != movieInfo.ProviderIds.Tmdb) { _logger.LogDebug($"Updating existing movie '{movieInfo.Name}'"); MapJellyfinMovie(existingMovie, movieInfo, server, has4K, quality); movieHasChanged = true; - } else if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase)) { @@ -269,7 +268,7 @@ namespace Ombi.Schedule.Jobs.Jellyfin movieHasChanged = true; } - if(movieHasChanged) + if (movieHasChanged) { toUpdate.Add(existingMovie); } From 9e45e816c395d6f31dd26df3de3ea0ec2f46a3fc Mon Sep 17 00:00:00 2001 From: Jamie Date: Wed, 27 Apr 2022 08:03:20 +0100 Subject: [PATCH 14/22] Update pr.yml [skip ci] --- .github/workflows/pr.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c45a555a7..7465635cc 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -51,16 +51,7 @@ jobs: - name: Run Unit Tests run: | cd src - dotnet test --configuration "Release" --logger "trx;LogFileName=test-results.trx" || true - - - name: Test Report - uses: dorny/test-reporter@v1 - if: always() - with: - name: DotNET Tests - path: "**/test-results.trx" - reporter: dotnet-trx - fail-on-error: true + dotnet test --configuration "Release" --logger "trx;LogFileName=test-results.trx" analysis: runs-on: ubuntu-latest From 7017806bfb0da0730cb14261104519d1b8f40b3a Mon Sep 17 00:00:00 2001 From: Jamie Date: Wed, 27 Apr 2022 08:04:26 +0100 Subject: [PATCH 15/22] Update label.yml [skip ci] --- .github/workflows/label.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 4e0c7b2de..402c5ffd0 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -7,10 +7,8 @@ name: Labeler on: [pull_request] -permissions: - pull-requests: write - issues: write - repository-projects: write + +permissions: write-all jobs: label: From da6ed76bd66135a3003670ae9e7b1516f00e43fa Mon Sep 17 00:00:00 2001 From: contrib-readme-bot Date: Wed, 27 Apr 2022 07:05:31 +0000 Subject: [PATCH 16/22] chore: :busts_in_silhouette: Updated Contributors [skip ci] --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a8360d6c8..7f3b6bb55 100644 --- a/README.md +++ b/README.md @@ -99,19 +99,19 @@ Here are some of the features Ombi has: Drew - - - anojht -
- Anojh Thayaparan -
- sephrat
Sephrat
+ + + + anojht +
+ Anojh Thayaparan +
From 1ac0e5768b9704f6ea7441b635df1702f0c31396 Mon Sep 17 00:00:00 2001 From: Conventional Changelog Action Date: Wed, 27 Apr 2022 07:09:25 +0000 Subject: [PATCH 17/22] chore(release): :rocket: v4.19.0 --- CHANGELOG.md | 14 ++++++++++---- version.json | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 256e31749..230f732fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# [4.19.0](https://github.com/Ombi-app/Ombi/compare/v4.18.0...v4.19.0) (2022-04-27) + + +### Features + +* **sync:** Detect reidentified movies in Emby and Jellyfin ([5938077](https://github.com/Ombi-app/Ombi/commit/5938077d82a5357f79c07b218b3986557a5816e8)) +* **sync:** Detect reidentified series in Emby and Jellyfin ([9096e91](https://github.com/Ombi-app/Ombi/commit/9096e91d55d268819bce22831f8a8b27f2a1776b)) + + + # [4.18.0](https://github.com/Ombi-app/Ombi/compare/v4.17.0...v4.18.0) (2022-04-26) @@ -342,7 +352,3 @@ -## [4.12.3](https://github.com/Ombi-app/Ombi/compare/v4.12.2...v4.12.3) (2022-02-16) - - - diff --git a/version.json b/version.json index 48c62b29c..0a0bca1d6 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "4.18.0" + "version": "4.19.0" } \ No newline at end of file From 44840bcd87bf67ba0ccec0cf25ac9639090ea945 Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Wed, 27 Apr 2022 09:14:29 +0200 Subject: [PATCH 18/22] refactor(newsletter): Clarify very rare cases where newsletter doesn't publish a series --- src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs | 38 +++----------------- 1 file changed, 5 insertions(+), 33 deletions(-) diff --git a/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs b/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs index a11a9ff80..f0f30f869 100644 --- a/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs +++ b/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs @@ -409,7 +409,9 @@ namespace Ombi.Schedule.Jobs.Ombi private HashSet FilterEpisodes(IEnumerable source, IEnumerable recentlyAdded) { var itemsToReturn = new HashSet(); - foreach (var ep in source.Where(x => x.Series.HasTvDb)) + foreach (var ep in source.Where(x => x.Series.HasTvDb // needed for recentlyAddedLog + && x.Series.HasTheMovieDb // needed to fetch info to publish, this is just in case... + )) { var tvDbId = StringHelper.IntParseLinq(ep.Series.TvDbId); if (recentlyAdded.Any(x => x.ContentId == tvDbId && x.EpisodeNumber == ep.EpisodeNumber && x.SeasonNumber == ep.SeasonNumber)) @@ -665,48 +667,18 @@ namespace Ombi.Schedule.Jobs.Ombi var orderedTv = series.OrderByDescending(x => x.AddedAt); foreach (var t in orderedTv) { - if (!t.HasTvDb) - { - // We may need to use themoviedb for the imdbid or their own id to get info - if (t.HasTheMovieDb) - { - int.TryParse(t.TheMovieDbId, out var movieId); - var externals = await _movieApi.GetTvExternals(movieId); - if (externals == null || externals.tvdb_id <= 0) - { - // needed later for recently added log - _log.LogWarning($"{t.Title} has no TVDB ID, it won't be published."); - continue; - } - t.TvDbId = externals.tvdb_id.ToString(); - } - // WE could check the below but we need to get the moviedb and then perform the above, let the metadata job figure this out. - //else if(t.HasImdb) - //{ - // // Check the imdbid - // var externals = await _movieApi.Find(t.ImdbId, ExternalSource.imdb_id); - // if (externals?.tv_results == null || externals.tv_results.Length <= 0) - // { - // continue; - // } - // t.TvDbId = externals.tv_results.FirstOrDefault()..ToString(); - //} - - } - try { var tvInfo = await _movieApi.GetTVInfo(t.TheMovieDbId, languageCode); if (tvInfo == null) { - _log.LogWarning($"TMDB does not know series {t.Title}, it won't be published."); + _log.LogError($"TMDB does not know series {t.Title}. This shouldn't happen because our media server knows it as ID '{t.TheMovieDbId}'."); continue; } if (tvInfo.backdrop_path.HasValue()) { - AddBackgroundInsideTable($"https://image.tmdb.org/t/p/w500{tvInfo.backdrop_path}"); } else @@ -732,7 +704,7 @@ namespace Ombi.Schedule.Jobs.Ombi } catch (Exception e) { - _log.LogError(e, "Error when processing Plex TV {0}", t.Title); + _log.LogError(e, "Error when processing TV {0}", t.Title); } finally { From 77057432510b620bdc4901de42dbe7eadf87a8fb Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Wed, 27 Apr 2022 09:18:11 +0200 Subject: [PATCH 19/22] refactor(newsletter): Clarify very rare cases where newsletter doesn't publish movie --- src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs b/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs index f0f30f869..0782a796a 100644 --- a/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs +++ b/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs @@ -503,16 +503,11 @@ namespace Ombi.Schedule.Jobs.Ombi foreach (var content in ordered) { int.TryParse(content.TheMovieDbId, out var movieDbId); - if (movieDbId <= 0) - { - _log.LogWarning($"{content.Title} does not have a TMDB ID, it won't be published."); - continue; - } var info = await _movieApi.GetMovieInformationWithExtraInfo(movieDbId, defaultLanguageCode); var mediaurl = content.Url; if (info == null) { - _log.LogWarning($"TMDB does not know movie {content.Title}, it won't be published."); + _log.LogError($"TMDB does not know movie {content.Title}. This shouldn't happen because our media server knows it as ID '{movieDbId}'."); continue; } try From b54fba5c990a0cc440c78e5a8411b019d2c0e46d Mon Sep 17 00:00:00 2001 From: Conventional Changelog Action Date: Wed, 27 Apr 2022 07:56:54 +0000 Subject: [PATCH 20/22] chore(release): :rocket: v4.19.1 --- CHANGELOG.md | 8 ++++---- version.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 230f732fc..df382b310 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [4.19.1](https://github.com/Ombi-app/Ombi/compare/v4.19.0...v4.19.1) (2022-04-27) + + + # [4.19.0](https://github.com/Ombi-app/Ombi/compare/v4.18.0...v4.19.0) (2022-04-27) @@ -348,7 +352,3 @@ -## [4.12.4](https://github.com/Ombi-app/Ombi/compare/v4.12.3...v4.12.4) (2022-02-17) - - - diff --git a/version.json b/version.json index 0a0bca1d6..d9208778d 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "4.19.0" + "version": "4.19.1" } \ No newline at end of file From 8357819b53b8c675c0b246d7006b5a778bdba33f Mon Sep 17 00:00:00 2001 From: sephrat <34862846+sephrat@users.noreply.github.com> Date: Thu, 28 Apr 2022 09:55:34 +0200 Subject: [PATCH 21/22] feat(discover): Show more relevant shows in upcoming TV --- src/Ombi.Core/Engine/MovieSearchEngine.cs | 2 +- .../Engine/V2/MovieSearchEngineV2.cs | 4 +-- src/Ombi.TheMovieDbApi/IMovieDbApi.cs | 2 +- src/Ombi.TheMovieDbApi/TheMovieDbApi.cs | 36 ++++++++++++------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/Ombi.Core/Engine/MovieSearchEngine.cs b/src/Ombi.Core/Engine/MovieSearchEngine.cs index 682a999eb..975e48d11 100644 --- a/src/Ombi.Core/Engine/MovieSearchEngine.cs +++ b/src/Ombi.Core/Engine/MovieSearchEngine.cs @@ -161,7 +161,7 @@ namespace Ombi.Core.Engine var result = await Cache.GetOrAddAsync(CacheKeys.UpcomingMovies, async () => { var langCode = await DefaultLanguageCode(null); - return await MovieApi.Upcoming(langCode); + return await MovieApi.UpcomingMovies(langCode); }, DateTimeOffset.Now.AddHours(12)); if (result != null) { diff --git a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs index 3423bc139..27edbacbb 100644 --- a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs @@ -287,7 +287,7 @@ namespace Ombi.Core.Engine.V2 var result = await Cache.GetOrAddAsync(CacheKeys.UpcomingMovies, async () => { var langCode = await DefaultLanguageCode(null); - return await MovieApi.Upcoming(langCode); + return await MovieApi.UpcomingMovies(langCode); }, DateTimeOffset.Now.AddHours(12)); if (result != null) { @@ -307,7 +307,7 @@ namespace Ombi.Core.Engine.V2 foreach (var pagesToLoad in pages) { var apiResult = await Cache.GetOrAddAsync(nameof(UpcomingMovies) + pagesToLoad.Page + langCode, - () => MovieApi.Upcoming(langCode, pagesToLoad.Page), DateTimeOffset.Now.AddHours(12)); + () => MovieApi.UpcomingMovies(langCode, pagesToLoad.Page), DateTimeOffset.Now.AddHours(12)); results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take)); } return await TransformMovieResultsToResponse(results); diff --git a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs index 4f3885ef0..12f5255b4 100644 --- a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs @@ -22,7 +22,7 @@ namespace Ombi.Api.TheMovieDb Task> GetMoviesViaKeywords(string keywordId, string langCode, CancellationToken cancellationToken, int? page = null); Task> SearchTv(string searchTerm, string year = default); Task> TopRated(string languageCode, int? page = null); - Task> Upcoming(string languageCode, int? page = null); + Task> UpcomingMovies(string languageCode, int? page = null); Task> TopRatedTv(string languageCode, int? page = null); Task> TrendingTv(string languageCode, int? page = null); Task> UpcomingTv(string languageCode, int? page = null); diff --git a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs index ba61ccfcf..5b0817388 100644 --- a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs @@ -308,22 +308,12 @@ namespace Ombi.Api.TheMovieDb var result = await Api.Request>(request); return Mapper.Map>(result.results); } - - public Task> Upcoming(string langCode, int? page = null) - { - return Upcoming("movie", langCode, page); - } - public Task> UpcomingTv(string langCode, int? page = null) - { - return Upcoming("tv", langCode, page); - } - /// /// Maintains filter parity with /movie/upcoming. /// - private async Task> Upcoming(string type, string langCode, int? page = null) + public async Task> UpcomingMovies(string langCode, int? page = null) { - var request = new Request($"discover/{type}", BaseUri, HttpMethod.Get); + var request = new Request($"discover/movie", BaseUri, HttpMethod.Get); request.AddQueryString("api_key", ApiToken); request.AddQueryString("language", langCode); @@ -340,7 +330,27 @@ namespace Ombi.Api.TheMovieDb request.AddQueryString("page", page.ToString()); } await AddDiscoverSettings(request); - await AddGenreFilter(request, type); + await AddGenreFilter(request, "movie"); + AddRetry(request); + var result = await Api.Request>(request); + return Mapper.Map>(result.results); + } + public async Task> UpcomingTv(string langCode, int? page = null) + { + var request = new Request($"discover/tv", BaseUri, HttpMethod.Get); + request.AddQueryString("api_key", ApiToken); + request.AddQueryString("language", langCode); + + // Search for shows that will air in the next month + var startDate = DateTime.Today.AddDays(1); + request.AddQueryString($"first_air_date.gte", startDate.ToString("yyyy-MM-dd")); + request.AddQueryString($"first_air_date.lte", startDate.AddDays(30).ToString("yyyy-MM-dd")); + if (page != null) + { + request.AddQueryString("page", page.ToString()); + } + await AddDiscoverSettings(request); + await AddGenreFilter(request, "tv"); AddRetry(request); var result = await Api.Request>(request); return Mapper.Map>(result.results); From d03b29856dd0b7d8a1d3e7b41d283b34b6b6ed09 Mon Sep 17 00:00:00 2001 From: Conventional Changelog Action Date: Thu, 28 Apr 2022 09:48:12 +0000 Subject: [PATCH 22/22] chore(release): :rocket: v4.20.0 --- CHANGELOG.md | 19 +++++++++---------- version.json | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df382b310..55e1a648d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# [4.20.0](https://github.com/Ombi-app/Ombi/compare/v4.19.1...v4.20.0) (2022-04-28) + + +### Features + +* **discover:** Show more relevant shows in upcoming TV ([8357819](https://github.com/Ombi-app/Ombi/commit/8357819b53b8c675c0b246d7006b5a778bdba33f)) + + + ## [4.19.1](https://github.com/Ombi-app/Ombi/compare/v4.19.0...v4.19.1) (2022-04-27) @@ -342,13 +351,3 @@ -## [4.12.5](https://github.com/Ombi-app/Ombi/compare/v4.12.4...v4.12.5) (2022-02-21) - - -### Bug Fixes - -* **emby:** :bug: Fixed the emby content sync [#4513](https://github.com/Ombi-app/Ombi/issues/4513) ([2927504](https://github.com/Ombi-app/Ombi/commit/2927504f0e0b4e7251e69b44e0e30c7ec9519980)) -* **emby:** :bug: Fixed the emby content sync [#4513](https://github.com/Ombi-app/Ombi/issues/4513) ([bd441cb](https://github.com/Ombi-app/Ombi/commit/bd441cb54fd77d6befb03fae321dc36c29f0de2e)) - - - diff --git a/version.json b/version.json index d9208778d..bcef7521a 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "4.19.1" + "version": "4.20.0" } \ No newline at end of file