private void IdentifyRelease(LocalEdition localBookRelease, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config) { var watch = System.Diagnostics.Stopwatch.StartNew(); var candidateReleases = _candidateService.GetDbCandidatesFromTags(localBookRelease, idOverrides, config.IncludeExisting); if (candidateReleases.Count == 0 && config.AddNewAuthors) { candidateReleases = _candidateService.GetRemoteCandidates(localBookRelease); } if (candidateReleases.Count == 0) { // can't find any candidates even after fingerprinting // populate the overrides and return foreach (var localTrack in localBookRelease.LocalBooks) { localTrack.Edition = idOverrides.Edition; localTrack.Book = idOverrides.Book; localTrack.Author = idOverrides.Author; } return; } _logger.Debug($"Got {candidateReleases.Count} candidates for {localBookRelease.LocalBooks.Count} tracks in {watch.ElapsedMilliseconds}ms"); // convert all the TrackFiles that represent extra files to List<LocalTrack> var allLocalTracks = ToLocalTrack(candidateReleases .SelectMany(x => x.ExistingFiles) .DistinctBy(x => x.Path), localBookRelease); _logger.Debug($"Retrieved {allLocalTracks.Count} possible tracks in {watch.ElapsedMilliseconds}ms"); GetBestRelease(localBookRelease, candidateReleases, allLocalTracks); _logger.Debug($"Best release found in {watch.ElapsedMilliseconds}ms"); localBookRelease.PopulateMatch(); _logger.Debug($"IdentifyRelease done in {watch.ElapsedMilliseconds}ms"); }
private void IdentifyRelease(LocalEdition localBookRelease, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config) { var watch = System.Diagnostics.Stopwatch.StartNew(); bool usedRemote = false; IEnumerable <CandidateEdition> candidateReleases = _candidateService.GetDbCandidatesFromTags(localBookRelease, idOverrides, config.IncludeExisting); // convert all the TrackFiles that represent extra files to List<LocalTrack> // local candidates are actually a list so this is fine to enumerate var allLocalTracks = ToLocalTrack(candidateReleases .SelectMany(x => x.ExistingFiles) .DistinctBy(x => x.Path), localBookRelease); _logger.Debug($"Retrieved {allLocalTracks.Count} possible tracks in {watch.ElapsedMilliseconds}ms"); if (!candidateReleases.Any()) { candidateReleases = _candidateService.GetRemoteCandidates(localBookRelease, idOverrides); if (!config.AddNewAuthors) { candidateReleases = candidateReleases.Where(x => x.Edition.Book.Value.Id > 0); } usedRemote = true; } if (!candidateReleases.Any()) { // can't find any candidates even after using remote search // populate the overrides and return foreach (var localTrack in localBookRelease.LocalBooks) { localTrack.Edition = idOverrides.Edition; localTrack.Book = idOverrides.Book; localTrack.Author = idOverrides.Author; } return; } GetBestRelease(localBookRelease, candidateReleases, allLocalTracks); // If the result isn't great and we haven't tried remote candidates, try looking for remote candidates // Goodreads may have a better edition of a local book if (localBookRelease.Distance.NormalizedDistance() > 0.15 && !usedRemote) { _logger.Debug("Match not good enough, trying remote candidates"); candidateReleases = _candidateService.GetRemoteCandidates(localBookRelease, idOverrides); if (!config.AddNewAuthors) { candidateReleases = candidateReleases.Where(x => x.Edition.Book.Value.Id > 0); } GetBestRelease(localBookRelease, candidateReleases, allLocalTracks); } _logger.Debug($"Best release found in {watch.ElapsedMilliseconds}ms"); localBookRelease.PopulateMatch(); _logger.Debug($"IdentifyRelease done in {watch.ElapsedMilliseconds}ms"); }