mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-16 02:02:55 -07:00
Merge pull request #4624 from sephrat/trending
Improve trending section
This commit is contained in:
commit
a1ff72d428
7 changed files with 57 additions and 10 deletions
|
@ -11,6 +11,7 @@ using Ombi.Core.Models.Search;
|
||||||
using Ombi.Core.Models.Search.V2;
|
using Ombi.Core.Models.Search.V2;
|
||||||
using Ombi.Core.Models.UI;
|
using Ombi.Core.Models.UI;
|
||||||
using Ombi.Core.Rule.Interfaces;
|
using Ombi.Core.Rule.Interfaces;
|
||||||
|
using Ombi.Core.Services;
|
||||||
using Ombi.Core.Settings;
|
using Ombi.Core.Settings;
|
||||||
using Ombi.Helpers;
|
using Ombi.Helpers;
|
||||||
using Ombi.Settings.Settings.Models;
|
using Ombi.Settings.Settings.Models;
|
||||||
|
@ -31,7 +32,8 @@ namespace Ombi.Core.Engine.V2
|
||||||
{
|
{
|
||||||
public MovieSearchEngineV2(ICurrentUser identity, IRequestServiceMain service, IMovieDbApi movApi, IMapper mapper,
|
public MovieSearchEngineV2(ICurrentUser identity, IRequestServiceMain service, IMovieDbApi movApi, IMapper mapper,
|
||||||
ILogger<MovieSearchEngineV2> logger, IRuleEvaluator r, OmbiUserManager um, ICacheService mem, ISettingsService<OmbiSettings> s, IRepository<RequestSubscription> sub,
|
ILogger<MovieSearchEngineV2> logger, IRuleEvaluator r, OmbiUserManager um, ICacheService mem, ISettingsService<OmbiSettings> s, IRepository<RequestSubscription> sub,
|
||||||
ISettingsService<CustomizationSettings> customizationSettings, IMovieRequestEngine movieRequestEngine, IHttpClientFactory httpClientFactory)
|
ISettingsService<CustomizationSettings> customizationSettings, IMovieRequestEngine movieRequestEngine, IHttpClientFactory httpClientFactory,
|
||||||
|
IFeatureService feature)
|
||||||
: base(identity, service, r, um, mem, s, sub)
|
: base(identity, service, r, um, mem, s, sub)
|
||||||
{
|
{
|
||||||
MovieApi = movApi;
|
MovieApi = movApi;
|
||||||
|
@ -40,6 +42,7 @@ namespace Ombi.Core.Engine.V2
|
||||||
_customizationSettings = customizationSettings;
|
_customizationSettings = customizationSettings;
|
||||||
_movieRequestEngine = movieRequestEngine;
|
_movieRequestEngine = movieRequestEngine;
|
||||||
_client = httpClientFactory.CreateClient();
|
_client = httpClientFactory.CreateClient();
|
||||||
|
_feature = feature;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IMovieDbApi MovieApi { get; }
|
private IMovieDbApi MovieApi { get; }
|
||||||
|
@ -48,6 +51,7 @@ namespace Ombi.Core.Engine.V2
|
||||||
private readonly ISettingsService<CustomizationSettings> _customizationSettings;
|
private readonly ISettingsService<CustomizationSettings> _customizationSettings;
|
||||||
private readonly IMovieRequestEngine _movieRequestEngine;
|
private readonly IMovieRequestEngine _movieRequestEngine;
|
||||||
private readonly HttpClient _client;
|
private readonly HttpClient _client;
|
||||||
|
private readonly IFeatureService _feature;
|
||||||
|
|
||||||
public async Task<MovieFullInfoViewModel> GetFullMovieInformation(int theMovieDbId, CancellationToken cancellationToken, string langCode = null)
|
public async Task<MovieFullInfoViewModel> GetFullMovieInformation(int theMovieDbId, CancellationToken cancellationToken, string langCode = null)
|
||||||
{
|
{
|
||||||
|
@ -196,14 +200,19 @@ namespace Ombi.Core.Engine.V2
|
||||||
public async Task<IEnumerable<SearchMovieViewModel>> NowPlayingMovies(int currentPosition, int amountToLoad)
|
public async Task<IEnumerable<SearchMovieViewModel>> NowPlayingMovies(int currentPosition, int amountToLoad)
|
||||||
{
|
{
|
||||||
var langCode = await DefaultLanguageCode(null);
|
var langCode = await DefaultLanguageCode(null);
|
||||||
|
var isOldTrendingSourceEnabled = await _feature.FeatureEnabled(FeatureNames.OldTrendingSource);
|
||||||
|
|
||||||
var pages = PaginationHelper.GetNextPages(currentPosition, amountToLoad, _theMovieDbMaxPageItems);
|
var pages = PaginationHelper.GetNextPages(currentPosition, amountToLoad, _theMovieDbMaxPageItems);
|
||||||
|
|
||||||
var results = new List<MovieDbSearchResult>();
|
var results = new List<MovieDbSearchResult>();
|
||||||
foreach (var pagesToLoad in pages)
|
foreach (var pagesToLoad in pages)
|
||||||
{
|
{
|
||||||
|
var search = () => (isOldTrendingSourceEnabled) ?
|
||||||
|
MovieApi.NowPlaying(langCode, pagesToLoad.Page)
|
||||||
|
: MovieApi.TrendingMovies(langCode, pagesToLoad.Page);
|
||||||
|
|
||||||
var apiResult = await Cache.GetOrAddAsync(nameof(NowPlayingMovies) + pagesToLoad.Page + langCode,
|
var apiResult = await Cache.GetOrAddAsync(nameof(NowPlayingMovies) + pagesToLoad.Page + langCode,
|
||||||
() => MovieApi.NowPlaying(langCode, pagesToLoad.Page), DateTimeOffset.Now.AddHours(12));
|
search, DateTimeOffset.Now.AddHours(12));
|
||||||
results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take));
|
results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take));
|
||||||
}
|
}
|
||||||
return await TransformMovieResultsToResponse(results);
|
return await TransformMovieResultsToResponse(results);
|
||||||
|
|
|
@ -26,6 +26,7 @@ using System.Diagnostics;
|
||||||
using Ombi.Core.Engine.Interfaces;
|
using Ombi.Core.Engine.Interfaces;
|
||||||
using Ombi.Core.Models.UI;
|
using Ombi.Core.Models.UI;
|
||||||
using Ombi.Core.Helpers;
|
using Ombi.Core.Helpers;
|
||||||
|
using Ombi.Core.Services;
|
||||||
|
|
||||||
namespace Ombi.Core.Engine.V2
|
namespace Ombi.Core.Engine.V2
|
||||||
{
|
{
|
||||||
|
@ -37,10 +38,12 @@ namespace Ombi.Core.Engine.V2
|
||||||
private readonly IMovieDbApi _movieApi;
|
private readonly IMovieDbApi _movieApi;
|
||||||
private readonly ISettingsService<CustomizationSettings> _customization;
|
private readonly ISettingsService<CustomizationSettings> _customization;
|
||||||
private readonly ITvRequestEngine _requestEngine;
|
private readonly ITvRequestEngine _requestEngine;
|
||||||
|
private readonly IFeatureService _feature;
|
||||||
|
|
||||||
public TvSearchEngineV2(ICurrentUser identity, IRequestServiceMain service, ITvMazeApi tvMaze, IMapper mapper,
|
public TvSearchEngineV2(ICurrentUser identity, IRequestServiceMain service, ITvMazeApi tvMaze, IMapper mapper,
|
||||||
ITraktApi trakt, IRuleEvaluator r, OmbiUserManager um, ICacheService memCache, ISettingsService<OmbiSettings> s,
|
ITraktApi trakt, IRuleEvaluator r, OmbiUserManager um, ICacheService memCache, ISettingsService<OmbiSettings> s,
|
||||||
IRepository<RequestSubscription> sub, IMovieDbApi movieApi, ISettingsService<CustomizationSettings> customization, ITvRequestEngine requestEngine)
|
IRepository<RequestSubscription> sub, IMovieDbApi movieApi, ISettingsService<CustomizationSettings> customization, ITvRequestEngine requestEngine,
|
||||||
|
IFeatureService feature)
|
||||||
: base(identity, service, r, um, memCache, s, sub)
|
: base(identity, service, r, um, memCache, s, sub)
|
||||||
{
|
{
|
||||||
_tvMaze = tvMaze;
|
_tvMaze = tvMaze;
|
||||||
|
@ -49,6 +52,7 @@ namespace Ombi.Core.Engine.V2
|
||||||
_movieApi = movieApi;
|
_movieApi = movieApi;
|
||||||
_customization = customization;
|
_customization = customization;
|
||||||
_requestEngine = requestEngine;
|
_requestEngine = requestEngine;
|
||||||
|
_feature = feature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -132,15 +136,19 @@ namespace Ombi.Core.Engine.V2
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<SearchTvShowViewModel>> Trending(int currentlyLoaded, int amountToLoad)
|
public async Task<IEnumerable<SearchTvShowViewModel>> Trending(int currentlyLoaded, int amountToLoad)
|
||||||
{
|
{
|
||||||
var langCode = await DefaultLanguageCode(null);
|
var langCode = await DefaultLanguageCode(null);
|
||||||
|
var isOldTrendingSourceEnabled = await _feature.FeatureEnabled(FeatureNames.OldTrendingSource);
|
||||||
|
|
||||||
var pages = PaginationHelper.GetNextPages(currentlyLoaded, amountToLoad, ResultLimit);
|
var pages = PaginationHelper.GetNextPages(currentlyLoaded, amountToLoad, ResultLimit);
|
||||||
var results = new List<MovieDbSearchResult>();
|
var results = new List<MovieDbSearchResult>();
|
||||||
foreach (var pagesToLoad in pages)
|
foreach (var pagesToLoad in pages)
|
||||||
{
|
{
|
||||||
|
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,
|
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));
|
results.AddRange(apiResult.Skip(pagesToLoad.Skip).Take(pagesToLoad.Take));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,5 +20,6 @@ namespace Ombi.Settings.Settings.Models
|
||||||
public static class FeatureNames
|
public static class FeatureNames
|
||||||
{
|
{
|
||||||
public const string Movie4KRequests = nameof(Movie4KRequests);
|
public const string Movie4KRequests = nameof(Movie4KRequests);
|
||||||
|
public const string OldTrendingSource = nameof(OldTrendingSource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ namespace Ombi.Api.TheMovieDb
|
||||||
Task<MovieResponseDto> GetMovieInformation(int movieId);
|
Task<MovieResponseDto> GetMovieInformation(int movieId);
|
||||||
Task<MovieResponseDto> GetMovieInformationWithExtraInfo(int movieId, string langCode = "en");
|
Task<MovieResponseDto> GetMovieInformationWithExtraInfo(int movieId, string langCode = "en");
|
||||||
Task<List<MovieDbSearchResult>> NowPlaying(string languageCode, int? page = null);
|
Task<List<MovieDbSearchResult>> NowPlaying(string languageCode, int? page = null);
|
||||||
|
Task<List<MovieDbSearchResult>> TrendingMovies(string languageCode, int? page = null);
|
||||||
Task<List<MovieDbSearchResult>> PopularMovies(string languageCode, int? page = null, CancellationToken cancellationToken = default(CancellationToken));
|
Task<List<MovieDbSearchResult>> PopularMovies(string languageCode, int? page = null, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
Task<List<MovieDbSearchResult>> PopularTv(string langCode, int? page = null, CancellationToken cancellationToken = default(CancellationToken));
|
Task<List<MovieDbSearchResult>> PopularTv(string langCode, int? page = null, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
Task<List<MovieDbSearchResult>> SearchMovie(string searchTerm, int? year, string languageCode);
|
Task<List<MovieDbSearchResult>> SearchMovie(string searchTerm, int? year, string languageCode);
|
||||||
|
@ -23,6 +24,7 @@ namespace Ombi.Api.TheMovieDb
|
||||||
Task<List<MovieDbSearchResult>> TopRated(string languageCode, int? page = null);
|
Task<List<MovieDbSearchResult>> TopRated(string languageCode, int? page = null);
|
||||||
Task<List<MovieDbSearchResult>> Upcoming(string languageCode, int? page = null);
|
Task<List<MovieDbSearchResult>> Upcoming(string languageCode, int? page = null);
|
||||||
Task<List<MovieDbSearchResult>> TopRatedTv(string languageCode, int? page = null);
|
Task<List<MovieDbSearchResult>> TopRatedTv(string languageCode, int? page = null);
|
||||||
|
Task<List<MovieDbSearchResult>> TrendingTv(string languageCode, int? page = null);
|
||||||
Task<List<MovieDbSearchResult>> UpcomingTv(string languageCode, int? page = null);
|
Task<List<MovieDbSearchResult>> UpcomingTv(string languageCode, int? page = null);
|
||||||
Task<List<MovieDbSearchResult>> SimilarMovies(int movieId, string langCode);
|
Task<List<MovieDbSearchResult>> SimilarMovies(int movieId, string langCode);
|
||||||
Task<FindResult> Find(string externalId, ExternalSource source);
|
Task<FindResult> Find(string externalId, ExternalSource source);
|
||||||
|
|
|
@ -281,6 +281,33 @@ namespace Ombi.Api.TheMovieDb
|
||||||
var result = await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
var result = await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
||||||
return Mapper.Map<List<MovieDbSearchResult>>(result.results);
|
return Mapper.Map<List<MovieDbSearchResult>>(result.results);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<List<MovieDbSearchResult>> TrendingMovies(string langCode, int? page = null)
|
||||||
|
{
|
||||||
|
return Trending("movie", langCode, page);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<List<MovieDbSearchResult>> TrendingTv(string langCode, int? page = null)
|
||||||
|
{
|
||||||
|
return Trending("tv", langCode, page);
|
||||||
|
}
|
||||||
|
private async Task<List<MovieDbSearchResult>> 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<TheMovieDbContainer<SearchResult>>(request);
|
||||||
|
return Mapper.Map<List<MovieDbSearchResult>>(result.results);
|
||||||
|
}
|
||||||
|
|
||||||
public Task<List<MovieDbSearchResult>> Upcoming(string langCode, int? page = null)
|
public Task<List<MovieDbSearchResult>> Upcoming(string langCode, int? page = null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<div *ngFor="let feature of features">
|
<div *ngFor="let feature of features">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-1">
|
<div class="col-1">
|
||||||
<mat-slide-toggle [checked]="feature.enabled" (change)="updateFeature($event, feature)" id="enable"></mat-slide-toggle>
|
<mat-slide-toggle [checked]="feature.enabled" (change)="updateFeature($event, feature)" id="enable{{feature.name}}"></mat-slide-toggle>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-2">
|
<div class="col-2">
|
||||||
<h3>{{feature.name}}</h3>
|
<h3>{{feature.name}}</h3>
|
||||||
|
@ -17,4 +17,4 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -392,14 +392,14 @@ namespace Ombi.Controllers.V2
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns trending shows by page
|
/// Returns trending shows by page
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>We use Trakt.tv as the Provider</remarks>
|
/// <remarks>We use TheMovieDb as the Provider</remarks>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("tv/trending/{currentPosition}/{amountToLoad}")]
|
[HttpGet("tv/trending/{currentPosition}/{amountToLoad}")]
|
||||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
[ProducesDefaultResponseType]
|
[ProducesDefaultResponseType]
|
||||||
public Task<IEnumerable<SearchTvShowViewModel>> Trending(int currentPosition, int amountToLoad)
|
public Task<IEnumerable<SearchTvShowViewModel>> TrendingTv(int currentPosition, int amountToLoad)
|
||||||
{
|
{
|
||||||
return _mediaCacheService.GetOrAddAsync(nameof(Trending) + currentPosition + amountToLoad,
|
return _mediaCacheService.GetOrAddAsync(nameof(TrendingTv) + currentPosition + amountToLoad,
|
||||||
() => _tvEngineV2.Trending(currentPosition, amountToLoad),
|
() => _tvEngineV2.Trending(currentPosition, amountToLoad),
|
||||||
DateTimeOffset.Now.AddHours(12));
|
DateTimeOffset.Now.AddHours(12));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue