using System; using AutoMapper; using Microsoft.Extensions.Logging; using Ombi.Api.TheMovieDb; using Ombi.Api.TheMovieDb.Models; using Ombi.Core.Models.Requests; using Ombi.Core.Models.Search; using System.Collections.Generic; using System.Linq; using System.Security.Principal; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Ombi.Core.Rule.Interfaces; using Microsoft.Extensions.Caching.Memory; using Ombi.Api.Lidarr; using Ombi.Api.Lidarr.Models; using Ombi.Core.Authentication; 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; namespace Ombi.Core.Engine { public class MusicSearchEngine : BaseMediaEngine, IMusicSearchEngine { public MusicSearchEngine(IPrincipal identity, IRequestServiceMain service, ILidarrApi lidarrApi, IMapper mapper, ILogger logger, IRuleEvaluator r, OmbiUserManager um, ICacheService mem, ISettingsService s, IRepository sub, ISettingsService lidarrSettings) : base(identity, service, r, um, mem, s, sub) { _lidarrApi = lidarrApi; _lidarrSettings = lidarrSettings; Mapper = mapper; Logger = logger; } private readonly ILidarrApi _lidarrApi; private IMapper Mapper { get; } private ILogger Logger { get; } private readonly ISettingsService _lidarrSettings; /// /// Searches the specified album. /// /// The search. /// public async Task> SearchAlbum(string search) { var settings = await GetSettings(); var result = await _lidarrApi.AlbumLookup(search, settings.ApiKey, settings.FullUri); var vm = new List(); foreach (var r in result) { vm.Add(await MapIntoAlbumVm(r, settings)); } return vm; } /// /// Searches the specified artist /// /// The search. /// public async Task> SearchArtist(string search) { var settings = await GetSettings(); var result = await _lidarrApi.ArtistLookup(search, settings.ApiKey, settings.FullUri); var vm = new List(); foreach (var r in result) { vm.Add(await MapIntoArtistVm(r)); } return vm; } /// /// Returns all albums by the specified artist /// /// /// public async Task GetArtistAlbums(string foreignArtistId) { var settings = await GetSettings(); return await _lidarrApi.GetArtistByForeignId(foreignArtistId, settings.ApiKey, settings.FullUri); } /// /// Returns the artist that produced the album /// /// /// public async Task GetAlbumArtist(string foreignArtistId) { var settings = await GetSettings(); return await _lidarrApi.GetArtistByForeignId(foreignArtistId, settings.ApiKey, settings.FullUri); } public async Task GetArtist(int artistId) { var settings = await GetSettings(); return await _lidarrApi.GetArtist(artistId, settings.ApiKey, settings.FullUri); } private async Task MapIntoArtistVm(ArtistLookup a) { var vm = new SearchArtistViewModel { ArtistName = a.artistName, ArtistType = a.artistType, Banner = a.images?.FirstOrDefault(x => x.coverType.Equals("banner"))?.url, Logo = a.images?.FirstOrDefault(x => x.coverType.Equals("logo"))?.url, CleanName = a.cleanName, Disambiguation = a.disambiguation, ForignArtistId = a.foreignArtistId, Links = a.links, Overview = a.overview, }; var poster = a.images?.FirstOrDefault(x => x.coverType.Equals("poaster")); if (poster == null) { vm.Poster = a.remotePoster; } await Rules.StartSpecificRules(vm, SpecificRules.LidarrArtist); return vm; } private async Task MapIntoAlbumVm(AlbumLookup a, LidarrSettings settings) { var vm = new SearchAlbumViewModel { ForeignAlbumId = a.foreignAlbumId, Monitored = a.monitored, Rating = a.ratings?.value ?? 0m, ReleaseDate = a.releaseDate, Title = a.title, Disk = a.images?.FirstOrDefault(x => x.coverType.Equals("disc"))?.url }; if (vm.Monitored) { // The JSON is different for some stupid reason // Need to lookup the artist now and all the images -.-" var artist = await _lidarrApi.GetArtist(a.artistId, settings.ApiKey, settings.FullUri); vm.ArtistName = artist.artistName; vm.ForeignArtistId = artist.foreignArtistId; } else { vm.ForeignArtistId = a.artist?.foreignArtistId; vm.ArtistName = a.artist?.artistName; } vm.Cover = a.images?.FirstOrDefault(x => x.coverType.Equals("cover"))?.url; if (vm.Cover.IsNullOrEmpty()) { vm.Cover = a.remoteCover; } await Rules.StartSpecificRules(vm, SpecificRules.LidarrAlbum); await RunSearchRules(vm); return vm; } private LidarrSettings _settings; private async Task GetSettings() { return _settings ?? (_settings = await _lidarrSettings.GetSettingsAsync()); } } }