private SearchResults RunSearch(DatabaseRelease release)
 {
     return(this.discogs.Search(new SearchQuery()
     {
         Type = SearchItemType.Release,
         Artist = release.JoinedAlbumArtists,
         ReleaseTitle = release.Title
     }, new PaginationRequest(1, 50)));
 }
        private ReleaseData GetReleaseImages(DatabaseRelease release)
        {
            ReleaseData data = new ReleaseData();

            data.Release = release;

            var searchResult   = this.RunSearch(release);
            var releaseResults = searchResult.Results.Cast <ReleaseSearchResult>().ToArray();
            List <ReleaseSearchResult> releasesToScan = new List <ReleaseSearchResult>();

            var firstReleases = releaseResults.Take(15).Select(r => this.discogs.GetRelease(r.Id)).ToArray();

            if (firstReleases.Any(r => this.MatchTracklist(release, r) && r.Images != null && r.Images.Length > 0))
            {
                foreach (ReleaseSearchResult releaseResult in releaseResults.Take(30))
                {
                    Release discogsRelease = this.discogs.GetRelease(releaseResult.Id);
                    if (this.MatchTracklist(release, discogsRelease) && discogsRelease.Images != null && discogsRelease.Images.Length > 0)
                    {
                        releasesToScan.Add(releaseResult);
                    }
                }
            }
            else
            {
                releasesToScan.AddRange(releaseResults);
            }

            foreach (var releaseResult in releasesToScan)
            {
                if (data.Images.Count >= 9)
                {
                    break;
                }

                var discogsRelease = discogs.GetRelease(releaseResult.Id);
                var image          = discogsRelease.Aggregate.DesiredImage;
                if (image == null)
                {
                    continue;
                }
                var imageData = this.discogs.GetImage(image.Uri);

                data.Images.Add(new ImageItem()
                {
                    Image = image,
                    Data  = imageData
                });
            }

            data.Deduplicate();

            return(data);
        }
        private bool MatchTracklist(DatabaseRelease release, Release discogsRelease)
        {
            if (release.Tracklist.Count != discogsRelease.Tracklist.Length)
            {
                return(false);
            }

            int matches = 0;

            for (int i = 0; i < release.Tracklist.Count; ++i)
            {
                if (release.Tracklist[i].Title.ToLower() == discogsRelease.Tracklist[i].Title.ToLower())
                {
                    ++matches;
                }
            }

            return(matches >= release.Tracklist.Count * 2 / 3);
        }
 private SearchResults RunSearch(DatabaseRelease release)
 {
     return this.discogs.Search(new SearchQuery()
        {
            Type = SearchItemType.Release,
            Artist = release.JoinedAlbumArtists,
            ReleaseTitle = release.Title
        }, new PaginationRequest(1, 50));
 }
        private bool MatchTracklist(DatabaseRelease release, Release discogsRelease)
        {
            if (release.Tracklist.Count != discogsRelease.Tracklist.Length)
            {
                return false;
            }

            int matches = 0;
            for (int i = 0; i < release.Tracklist.Count; ++i)
            {
                if (release.Tracklist[i].Title.ToLower() == discogsRelease.Tracklist[i].Title.ToLower())
                {
                    ++matches;
                }
            }

            return matches >= release.Tracklist.Count * 2 / 3;
        }
        private ReleaseData GetReleaseImages(DatabaseRelease release)
        {
            ReleaseData data = new ReleaseData();
            data.Release = release;

            var searchResult = this.RunSearch(release);
            var releaseResults = searchResult.Results.Cast<ReleaseSearchResult>().ToArray();
            List<ReleaseSearchResult> releasesToScan = new List<ReleaseSearchResult>();

            var firstReleases = releaseResults.Take(15).Select(r => this.discogs.GetRelease(r.Id)).ToArray();
            if (firstReleases.Any(r => this.MatchTracklist(release, r) && r.Images != null && r.Images.Length > 0))
            {
                foreach (ReleaseSearchResult releaseResult in releaseResults.Take(30))
                {
                    Release discogsRelease = this.discogs.GetRelease(releaseResult.Id);
                    if (this.MatchTracklist(release, discogsRelease) && discogsRelease.Images != null && discogsRelease.Images.Length > 0)
                    {
                        releasesToScan.Add(releaseResult);
                    }
                }
            }
            else
            {
                releasesToScan.AddRange(releaseResults);
            }

            foreach (var releaseResult in releasesToScan)
            {
                if (data.Images.Count >= 9)
                {
                    break;
                }

                var discogsRelease = discogs.GetRelease(releaseResult.Id);
                var image = discogsRelease.Aggregate.DesiredImage;
                if (image == null)
                {
                    continue;
                }
                var imageData = this.discogs.GetImage(image.Uri);

                data.Images.Add(new ImageItem()
                {
                    Image = image,
                    Data = imageData
                });
            }

            data.Deduplicate();

            return data;
        }