You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Ombi/src/Ombi.Core/Engine/V2/MultiSearchEngine.cs

134 lines
5.0 KiB

using System;
using System.Collections.Generic;
using System.Security.Principal;
using System.Threading;
using System.Threading.Tasks;
using Ombi.Api.MusicBrainz;
using Ombi.Api.TheMovieDb;
using Ombi.Api.TheMovieDb.Models;
using Ombi.Core.Authentication;
using Ombi.Core.Helpers;
using Ombi.Core.Models.Requests;
using Ombi.Core.Models.Search.V2;
using Ombi.Core.Rule.Interfaces;
using Ombi.Core.Settings;
using Ombi.Helpers;
using Ombi.Settings.Settings.Models;
using Ombi.Settings.Settings.Models.External;
using Ombi.Store.Entities;
using Ombi.Store.Repository;
using Ombi.TheMovieDbApi.Models;
// Due to conflicting Genre models in
// Ombi.TheMovieDbApi.Models and Ombi.Api.TheMovieDb.Models
using Genre = Ombi.TheMovieDbApi.Models.Genre;
namespace Ombi.Core.Engine.V2
{
public class MultiSearchEngine : BaseMediaEngine, IMultiSearchEngine
{
public MultiSearchEngine(ICurrentUser identity, IRequestServiceMain requestService, IRuleEvaluator rules,
OmbiUserManager um, ICacheService cache, ISettingsService<OmbiSettings> ombiSettings, IRepository<RequestSubscription> sub,
IMovieDbApi movieDbApi, ISettingsService<LidarrSettings> lidarrSettings, IMusicBrainzApi musicApi)
: base(identity, requestService, rules, um, cache, ombiSettings, sub)
{
_movieDbApi = movieDbApi;
_lidarrSettings = lidarrSettings;
_musicApi = musicApi;
}
private readonly IMovieDbApi _movieDbApi;
private readonly ISettingsService<LidarrSettings> _lidarrSettings;
private readonly IMusicBrainzApi _musicApi;
private bool _demo = DemoSingleton.Instance.Demo;
public async Task<List<MultiSearchResult>> MultiSearch(string searchTerm, MultiSearchFilter filter, CancellationToken cancellationToken)
{
var lang = await DefaultLanguageCode(null);
var model = new List<MultiSearchResult>();
var movieDbData = (await _movieDbApi.MultiSearch(searchTerm, lang, cancellationToken)).results;
var lidarrSettings = await _lidarrSettings.GetSettingsAsync();
if (lidarrSettings.Enabled && filter.Music)
{
var artistResult = await _musicApi.SearchArtist(searchTerm);
foreach (var artist in artistResult)
{
model.Add(new MultiSearchResult
{
MediaType = "Artist",
Title = artist.Name,
Id = artist.Id
});
}
}
foreach (var multiSearch in movieDbData)
{
if (DemoCheck(multiSearch.title) || DemoCheck(multiSearch.name))
{
continue;
}
var result = new MultiSearchResult
{
MediaType = multiSearch.media_type,
Poster = multiSearch.poster_path,
Overview = multiSearch.overview
};
if (multiSearch.media_type.Equals("movie", StringComparison.InvariantCultureIgnoreCase) && filter.Movies)
{
if (multiSearch.release_date.HasValue() && DateTime.TryParse(multiSearch.release_date, out var releaseDate))
{
result.Title = $"{multiSearch.title} ({releaseDate.Year})";
}
else
{
result.Title = multiSearch.title;
}
}
else if (multiSearch.media_type.Equals("tv", StringComparison.InvariantCultureIgnoreCase) && filter.TvShows)
{
if (multiSearch.release_date.HasValue() && DateTime.TryParse(multiSearch.release_date, out var releaseDate))
{
result.Title = $"{multiSearch.name} ({releaseDate.Year})";
}
else
{
result.Title = multiSearch.name;
}
}
else if (multiSearch.media_type.Equals("person", StringComparison.InvariantCultureIgnoreCase) && filter.People)
{
result.Title = multiSearch.name;
}
else
{
continue;
}
result.Id = multiSearch.id.ToString();
model.Add(result);
}
return model;
}
public async Task<IEnumerable<Genre>> GetGenres(string media, CancellationToken cancellationToken)
{
var lang = await DefaultLanguageCode(null);
return await _movieDbApi.GetGenres(media, cancellationToken, lang);
}
public async Task<IEnumerable<Language>> GetLanguages(CancellationToken cancellationToken)
{
return await _movieDbApi.GetLanguages(cancellationToken);
}
}
}