private Album AddSkyhookData(Album newAlbum)
        {
            Tuple <string, Album, List <ArtistMetadata> > tuple = null;

            try
            {
                tuple = _albumInfo.GetAlbumInfo(newAlbum.ForeignAlbumId);
            }
            catch (AlbumNotFoundException)
            {
                _logger.Error("Album with MusicBrainz Id {0} was not found, it may have been removed from Musicbrainz.", newAlbum.ForeignAlbumId);

                throw new ValidationException(new List <ValidationFailure>
                {
                    new ValidationFailure("MusicbrainzId", "An album with this ID was not found", newAlbum.ForeignAlbumId)
                });
            }

            newAlbum.UseMetadataFrom(tuple.Item2);
            newAlbum.Added = DateTime.UtcNow;

            var metadata = tuple.Item3.Single(x => x.ForeignArtistId == tuple.Item1);

            newAlbum.ArtistMetadata = metadata;

            return(newAlbum);
        }
        protected override RemoteData GetRemoteData(Album local, List <Album> remote)
        {
            var result = new RemoteData();

            // remove not in remote list and ShouldDelete is true
            if (remote != null &&
                !remote.Any(x => x.ForeignAlbumId == local.ForeignAlbumId || x.OldForeignAlbumIds.Contains(local.ForeignAlbumId)) &&
                ShouldDelete(local))
            {
                return(result);
            }

            Tuple <string, Album, List <ArtistMetadata> > tuple = null;

            try
            {
                tuple = _albumInfo.GetAlbumInfo(local.ForeignAlbumId);
            }
            catch (AlbumNotFoundException)
            {
                return(result);
            }

            if (tuple.Item2.AlbumReleases.Value.Count == 0)
            {
                _logger.Debug($"{local} has no valid releases, removing.");
                return(result);
            }

            result.Entity    = tuple.Item2;
            result.Entity.Id = local.Id;
            result.Metadata  = tuple.Item3;
            return(result);
        }