using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Ombi.Api.Lidarr; using Ombi.Api.Lidarr.Models; using Ombi.Api.MusicBrainz; using Ombi.Core.Authentication; using Ombi.Core.Engine.Interfaces; using Ombi.Core.Models.Requests; using Ombi.Core.Models.Search.V2.Music; 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 Artist = Hqub.MusicBrainz.API.Entities.Artist; using ReleaseGroup = Ombi.Core.Models.Search.V2.Music.ReleaseGroup; namespace Ombi.Core.Engine.V2 { public class MusicSearchEngineV2 : BaseMediaEngine, IMusicSearchEngineV2 { private readonly IMusicBrainzApi _musicBrainzApi; private readonly ISettingsService _lidarrSettings; private readonly ILidarrApi _lidarrApi; public MusicSearchEngineV2(IPrincipal identity, IRequestServiceMain requestService, IRuleEvaluator rules, OmbiUserManager um, ICacheService cache, ISettingsService ombiSettings, IRepository sub, IMusicBrainzApi musicBrainzApi, ISettingsService lidarrSettings, ILidarrApi lidarrApi) : base(identity, requestService, rules, um, cache, ombiSettings, sub) { _musicBrainzApi = musicBrainzApi; _lidarrSettings = lidarrSettings; _lidarrApi = lidarrApi; } public async Task GetArtistInformation(string artistId) { var artist = await _musicBrainzApi.GetArtistInformation(artistId); var lidarrSettings = await GetLidarrSettings(); Task lidarrArtistTask = null; if (lidarrSettings.Enabled) { lidarrArtistTask = _lidarrApi.GetArtistByForeignId(artistId, lidarrSettings.ApiKey, lidarrSettings.FullUri); } var info = new ArtistInformation { Id = artistId, Name = artist.Name, Country = artist.Country, Region = artist.Area?.Name, Type = artist.Type, StartYear = artist.LifeSpan?.Begin ?? "", EndYear = artist.LifeSpan?.End ?? "", Disambiguation = artist.Disambiguation, ReleaseGroups = new List(), Members = new List() }; foreach (var g in artist.ReleaseGroups) { info.ReleaseGroups.Add(new ReleaseGroup { Type = g.PrimaryType, Id = g.Id, Title = g.Title, ReleaseDate = g.FirstReleaseDate, }); } info.Links = GetLinksForArtist(artist); info.Members = GetBandMembers(artist); if (lidarrArtistTask != null) { var artistResult = await lidarrArtistTask; info.Banner = artistResult.images?.FirstOrDefault(x => x.coverType.Equals("banner", StringComparison.InvariantCultureIgnoreCase))?.url.Replace("http", "https"); info.Logo = artistResult.images?.FirstOrDefault(x => x.coverType.Equals("logo", StringComparison.InvariantCultureIgnoreCase))?.url.Replace("http", "https"); info.Poster = artistResult.images?.FirstOrDefault(x => x.coverType.Equals("poster", StringComparison.InvariantCultureIgnoreCase))?.url.Replace("http", "https"); info.FanArt = artistResult.images?.FirstOrDefault(x => x.coverType.Equals("fanart", StringComparison.InvariantCultureIgnoreCase))?.url.Replace("http", "https"); info.Overview = artistResult.overview; } return info; } public async Task GetReleaseGroupArt(string musicBrainzId, CancellationToken token) { var art = await _musicBrainzApi.GetCoverArtForReleaseGroup(musicBrainzId, token); if (art == null || !art.images.Any()) { return new AlbumArt(); } foreach (var cover in art.images) { //if ((cover.thumbnails?.px250 ?? string.Empty).HasValue()) //{ // return new AlbumArt(cover.thumbnails.px250); //} if ((cover.thumbnails?.small ?? string.Empty).HasValue()) { return new AlbumArt(cover.thumbnails.small); } //if ((cover.thumbnails?.px500 ?? string.Empty).HasValue()) //{ // return new AlbumArt(cover.thumbnails.px500); //} if ((cover.thumbnails?.large ?? string.Empty).HasValue()) { return new AlbumArt(cover.thumbnails.large); } } return new AlbumArt(); } private List GetBandMembers(Artist artist) { var members = new List(); var membersOfBand = artist.Relations.Where(x => x.TypeId == RelationLinks.BandMember); foreach (var member in membersOfBand) { members.Add(new BandMember { Name = member.Artist?.Name, Attributes = member.Attributes, IsCurrentMember = member.Ended == null, End = member.End, Start = member.Begin }); } return members; } private ArtistLinks GetLinksForArtist(Artist artist) { var links = new ArtistLinks(); foreach (var relation in artist.Relations) { switch (relation.TypeId) { case RelationLinks.AllMusic: links.AllMusic = relation.Url?.Resource; break; case RelationLinks.BbcMusic: links.BbcMusic = relation.Url?.Resource; break; case RelationLinks.Discogs: links.Discogs = relation.Url?.Resource; break; case RelationLinks.Homepage: links.HomePage = relation.Url?.Resource; break; case RelationLinks.Imdb: links.Imdb = relation.Url?.Resource; break; case RelationLinks.LastFm: links.LastFm = relation.Url?.Resource; break; case RelationLinks.MySpace: links.MySpace = relation.Url?.Resource; break; case RelationLinks.OnlineCommunity: links.OnlineCommunity = relation.Url?.Resource; break; case RelationLinks.SocialNetwork: if ((relation.Url?.Resource ?? string.Empty).Contains("twitter", CompareOptions.IgnoreCase)) { links.Twitter = relation.Url?.Resource; } if ((relation.Url?.Resource ?? string.Empty).Contains("facebook", CompareOptions.IgnoreCase)) { links.Facebook = relation.Url?.Resource; } if ((relation.Url?.Resource ?? string.Empty).Contains("instagram", CompareOptions.IgnoreCase)) { links.Instagram = relation.Url?.Resource; } if ((relation.Url?.Resource ?? string.Empty).Contains("vk", CompareOptions.IgnoreCase)) { links.Vk = relation.Url?.Resource; } break; case RelationLinks.Streams: if ((relation.Url?.Resource ?? string.Empty).Contains("spotify", CompareOptions.IgnoreCase)) { links.Spotify = relation.Url?.Resource; } if ((relation.Url?.Resource ?? string.Empty).Contains("deezer", CompareOptions.IgnoreCase)) { links.Deezer = relation.Url?.Resource; } break; case RelationLinks.YouTube: links.YouTube = relation.Url?.Resource; break; case RelationLinks.Download: if ((relation.Url?.Resource ?? string.Empty).Contains("google", CompareOptions.IgnoreCase)) { links.Google = relation.Url?.Resource; } if ((relation.Url?.Resource ?? string.Empty).Contains("apple", CompareOptions.IgnoreCase)) { links.Apple = relation.Url?.Resource; } break; } } return links; } private LidarrSettings __lidarrSettings; private async Task GetLidarrSettings() { return __lidarrSettings ?? (__lidarrSettings = await _lidarrSettings.GetSettingsAsync()); } } }