private List <CandidateAlbumRelease> GetCandidates(LocalAlbumRelease localAlbumRelease, bool includeExisting) { // most general version, nothing has been specified. // get all plausible artists, then all plausible albums, then get releases for each of these. // check if it looks like VA. if (TrackGroupingService.IsVariousArtists(localAlbumRelease.LocalTracks)) { throw new NotImplementedException("Various artists not supported"); } var candidateReleases = new List <CandidateAlbumRelease>(); var artistTag = MostCommon(localAlbumRelease.LocalTracks.Select(x => x.FileTrackInfo.ArtistTitle)) ?? ""; if (artistTag.IsNotNullOrWhiteSpace()) { var possibleArtists = _artistService.GetCandidates(artistTag); foreach (var artist in possibleArtists) { candidateReleases.AddRange(GetCandidatesByArtist(localAlbumRelease, artist, includeExisting)); } } return(candidateReleases); }
private List <CandidateAlbumRelease> GetDbCandidates(LocalAlbumRelease localAlbumRelease, bool includeExisting) { // most general version, nothing has been specified. // get all plausible artists, then all plausible albums, then get releases for each of these. var candidateReleases = new List <CandidateAlbumRelease>(); // check if it looks like VA. if (TrackGroupingService.IsVariousArtists(localAlbumRelease.LocalTracks)) { var va = _artistService.FindById(DistanceCalculator.VariousArtistIds[0]); if (va != null) { candidateReleases.AddRange(GetDbCandidatesByArtist(localAlbumRelease, va, includeExisting)); } } var artistTag = localAlbumRelease.LocalTracks.MostCommon(x => x.FileTrackInfo.ArtistTitle) ?? ""; if (artistTag.IsNotNullOrWhiteSpace()) { var possibleArtists = _artistService.GetCandidates(artistTag); foreach (var artist in possibleArtists) { candidateReleases.AddRange(GetDbCandidatesByArtist(localAlbumRelease, artist, includeExisting)); } } return(candidateReleases); }
public List <CandidateAlbumRelease> GetRemoteCandidates(LocalAlbumRelease localAlbumRelease) { // Gets candidate album releases from the metadata server. // Will eventually need adding locally if we find a match var watch = System.Diagnostics.Stopwatch.StartNew(); List <Album> remoteAlbums; var candidates = new List <CandidateAlbumRelease>(); var albumIds = localAlbumRelease.LocalTracks.Select(x => x.FileTrackInfo.AlbumMBId).Distinct().ToList(); var recordingIds = localAlbumRelease.LocalTracks.Where(x => x.AcoustIdResults != null).SelectMany(x => x.AcoustIdResults).Distinct().ToList(); try { if (albumIds.Count == 1 && albumIds[0].IsNotNullOrWhiteSpace()) { // Use mbids in tags if set remoteAlbums = _albumSearchService.SearchForNewAlbum($"mbid:{albumIds[0]}", null); } else if (recordingIds.Any()) { // If fingerprints present use those remoteAlbums = _albumSearchService.SearchForNewAlbumByRecordingIds(recordingIds); } else { // fall back to artist / album name search string artistTag; if (TrackGroupingService.IsVariousArtists(localAlbumRelease.LocalTracks)) { artistTag = "Various Artists"; } else { artistTag = localAlbumRelease.LocalTracks.MostCommon(x => x.FileTrackInfo.ArtistTitle) ?? ""; } var albumTag = localAlbumRelease.LocalTracks.MostCommon(x => x.FileTrackInfo.AlbumTitle) ?? ""; if (artistTag.IsNullOrWhiteSpace() || albumTag.IsNullOrWhiteSpace()) { return(candidates); } remoteAlbums = _albumSearchService.SearchForNewAlbum(albumTag, artistTag); } } catch (SkyHookException e) { _logger.Info(e, "Skipping album due to SkyHook error"); remoteAlbums = new List <Album>(); } foreach (var album in remoteAlbums) { // We have to make sure various bits and pieces are populated that are normally handled // by a database lazy load foreach (var release in album.AlbumReleases.Value) { release.Album = album; candidates.Add(new CandidateAlbumRelease { AlbumRelease = release, ExistingTracks = new List <TrackFile>() }); } } watch.Stop(); _logger.Debug($"Getting {candidates.Count} remote candidates from tags for {localAlbumRelease.LocalTracks.Count} tracks took {watch.ElapsedMilliseconds}ms"); return(candidates); }