public static async Task <string> GetAlbumImageImageUrlAsync(string album)
        {
            var urlToReturn = string.Empty;

            if (Availability)
            {
                if (!string.IsNullOrEmpty(album) && !Banlist.AlbumMetadataRetrieveBanlist.ContainsKey(album))
                {
                    try
                    {
                        urlToReturn = await GrooveMusicMetadata.GetAlbumImageLinkAsync(album);

                        if (string.IsNullOrEmpty(urlToReturn))
                        {
                            urlToReturn = await AppleMusicMetadata.GetAlbumImageImageUrlAsync(album);
                        }
                    }
                    catch (Exception)
                    {
                        // Typically that should not happen.
                        // Investigate if that happens.
                    }
                }
            }

            return(urlToReturn);
        }
        public static async Task <IEntityInfo[]> GetArtistsAsync(string artist)
        {
            var artists = (await Task.WhenAll(
                               GrooveMusicMetadata.GetArtistsAsync(artist),
                               LastFmArtistMetadata.GetArtistsAsync(artist)))
                          .SelectMany(x => x)
                          .ToList();

            artists.Sort(new ArtistSimilarityComparer(artist));
            return(artists.ToArray());
        }
        public static async Task <IEntityInfo[]> GetAlbumsAsync(string album, string artist)
        {
            var albums = (await Task.WhenAll(
                              AppleMusicMetadata.GetAlbumsAsync($"{album} {artist}"),
                              GrooveMusicMetadata.GetAlbumsAsync($"{album} {artist}")))
                         .SelectMany(x => x)
                         .ToList();

            albums.Sort(new AlbumSimilarityComparer(album, artist));
            return(albums.ToArray());
        }
        /// <summary>
        /// Load artist intro for a specific artist.
        /// </summary>
        /// <param name="elem"></param>
        /// <returns></returns>
        public static async Task <DbArtist> LoadArtistIntroAsync(this DbArtist elem)
        {
            if (InternetConnectivityDetector.HasInternetConnection)
            {
                try
                {
                    var bio = await GrooveMusicMetadata.GetArtistBio(elem.Name);

                    elem.Intro = bio;
                }
                catch (Exception ex)
                {
                    TelemetryHelper.TrackExceptionAsync(ex);
                }
            }

            return(elem);
        }
        /// <summary>
        /// Load online content for a specific artist.
        /// </summary>
        /// <param name="elem"></param>
        /// <returns></returns>
        public static async Task <string> LoadArtistOnlineContentAsync(this DbArtist elem)
        {
            // Check internet connection
            if (InternetConnectivityDetector.HasInternetConnection)
            {
                // Return Online content
                try
                {
                    var modifyFlag = false;

                    if (string.IsNullOrEmpty(elem.Intro))
                    {
                        var bio = await GrooveMusicMetadata.GetArtistBio(elem.Name);

                        if (!string.IsNullOrEmpty(bio))
                        {
                            modifyFlag = true;
                        }
                    }

                    if (modifyFlag)
                    {
                        using (var scope = ApplicationServiceBase.App.GetScope())
                            using (var context = scope.ServiceProvider.GetRequiredService <MedialibraryDbContext>())
                            {
                                context.Entry(elem).Entity.ImagePath = elem.ImagePath;
                                context.Entry(elem).Entity.Intro     = elem.Intro;
                                context.Entry(elem).State            = EntityState.Modified;
                                await context.SaveChangesAsync();
                            }

                        return(elem.ImagePath);
                    }
                }
                catch (Exception ex)
                {
                    TelemetryHelper.TrackExceptionAsync(ex);
                }
            }

            return(string.Empty);
        }