internal SteamGameMetadata DownloadGameMetadata(uint appId, BackgroundSource backgroundSource)
        {
            var metadata    = new SteamGameMetadata();
            var productInfo = GetAppInfo(appId);

            metadata.ProductDetails = productInfo;
            metadata.StoreDetails   = GetStoreData(appId);

            // Icon
            if (productInfo != null)
            {
                var iconRoot = @"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.ico";
                var icon     = productInfo["common"]["clienticon"];
                var iconUrl  = string.Empty;
                if (!string.IsNullOrEmpty(icon.Value))
                {
                    iconUrl = string.Format(iconRoot, appId, icon.Value);
                }
                else
                {
                    var newIcon = productInfo["common"]["icon"];
                    if (!string.IsNullOrEmpty(newIcon.Value))
                    {
                        iconRoot = @"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.jpg";
                        iconUrl  = string.Format(iconRoot, appId, newIcon.Value);
                    }
                }

                // There might be no icon assigned to game
                if (!string.IsNullOrEmpty(iconUrl))
                {
                    var iconName = Path.GetFileName(new Uri(iconUrl).AbsolutePath);
                    var iconData = HttpDownloader.DownloadData(iconUrl);
                    metadata.Icon = new MetadataFile(iconName, iconData);
                }
            }

            // Image
            var imageRoot = @"http://cdn.akamai.steamstatic.com/steam/apps/{0}/header.jpg";
            var imageUrl  = string.Format(imageRoot, appId);

            byte[] imageData = null;

            try
            {
                imageData = HttpDownloader.DownloadData(imageUrl);
            }
            catch (WebException e)
            {
                var response = (HttpWebResponse)e.Response;
                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    if (productInfo != null)
                    {
                        imageRoot = @"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.jpg";
                        var image = productInfo["common"]["logo"];
                        if (!string.IsNullOrEmpty(image.Value))
                        {
                            imageUrl  = string.Format(imageRoot, appId, image.Value);
                            imageData = HttpDownloader.DownloadData(imageUrl);
                        }
                    }
                }
                else
                {
                    throw;
                }
            }

            if (imageData != null)
            {
                var imageName = Path.GetFileName(new Uri(imageUrl).AbsolutePath);
                metadata.Image = new MetadataFile(imageName, imageData);
            }

            // Background Image
            switch (backgroundSource)
            {
            case BackgroundSource.Image:
                metadata.BackgroundImage = GetGameBackground(appId);
                break;

            case BackgroundSource.StoreScreenshot:
                metadata.BackgroundImage = Regex.Replace(metadata.StoreDetails.screenshots.First().path_full, "\\?.*$", "");
                break;

            case BackgroundSource.StoreBackground:
                metadata.BackgroundImage = string.Format(@"https://steamcdn-a.akamaihd.net/steam/apps/{0}/page_bg_generated_v6b.jpg", appId);
                break;

            default:
                break;
            }

            return(metadata);
        }
        internal SteamGameMetadata DownloadGameMetadata(uint appId, ISteamMetadataDownloadConfig cfg)
        {
            var metadata    = new SteamGameMetadata();
            var productInfo = GetAppInfo(appId);

            metadata.ProductDetails = productInfo;

            try
            {
                metadata.StoreDetails = GetStoreData(appId, cfg.MetadataOtherLanguage);
                if (cfg.MetadataDescriptionLanguage != cfg.MetadataOtherLanguage)
                {
                    var storeDetailsInDescriptionLanguage = GetStoreData(appId, cfg.MetadataDescriptionLanguage);
                    metadata.StoreDetails.short_description    = storeDetailsInDescriptionLanguage.short_description;
                    metadata.StoreDetails.detailed_description = storeDetailsInDescriptionLanguage.detailed_description;
                    metadata.StoreDetails.about_the_game       = storeDetailsInDescriptionLanguage.about_the_game;
                }
            }
            catch (Exception e)
            {
                logger.Error(e, $"Failed to download Steam store metadata {appId}");
            }

            try
            {
                metadata.UserReviewDetails = GetUserReviewsData(appId);
            }
            catch (Exception e)
            {
                logger.Error(e, $"Failed to download Steam user reviews metadata {appId}");
            }

            // Icon
            if (productInfo != null)
            {
                var iconRoot = @"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.ico";
                var icon     = productInfo["common"]["clienticon"];
                var iconUrl  = string.Empty;
                if (!string.IsNullOrEmpty(icon.Value))
                {
                    iconUrl = string.Format(iconRoot, appId, icon.Value);
                }
                else
                {
                    var newIcon = productInfo["common"]["icon"];
                    if (!string.IsNullOrEmpty(newIcon.Value))
                    {
                        iconRoot = @"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.jpg";
                        iconUrl  = string.Format(iconRoot, appId, newIcon.Value);
                    }
                }

                // There might be no icon assigned to game
                if (!string.IsNullOrEmpty(iconUrl))
                {
                    metadata.Icon = new MetadataFile(iconUrl);
                }
            }

            // Image
            var useBanner = false;

            if (cfg.DownloadVerticalCovers)
            {
                var imageRoot = @"https://steamcdn-a.akamaihd.net/steam/apps/{0}/library_600x900_2x.jpg";
                var imageUrl  = string.Format(imageRoot, appId);
                if (HttpDownloader.GetResponseCode(imageUrl) == HttpStatusCode.OK)
                {
                    metadata.CoverImage = new MetadataFile(imageUrl);
                }
                else
                {
                    useBanner = true;
                }
            }

            if (useBanner || !cfg.DownloadVerticalCovers)
            {
                var imageRoot = @"https://steamcdn-a.akamaihd.net/steam/apps/{0}/header.jpg";
                var imageUrl  = string.Format(imageRoot, appId);
                if (HttpDownloader.GetResponseCode(imageUrl) == HttpStatusCode.OK)
                {
                    metadata.CoverImage = new MetadataFile(imageUrl);
                }
            }

            if (metadata.CoverImage == null)
            {
                if (productInfo != null)
                {
                    var imageRoot = @"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.jpg";
                    var image     = productInfo["common"]["logo"];
                    if (!string.IsNullOrEmpty(image.Value))
                    {
                        var imageUrl = string.Format(imageRoot, appId, image.Value);
                        metadata.CoverImage = new MetadataFile(imageUrl);
                    }
                }
            }

            // Background Image
            var bannerBk = string.Format(@"https://steamcdn-a.akamaihd.net/steam/apps/{0}/library_hero.jpg", appId);
            var storeBk  = string.Format(@"https://steamcdn-a.akamaihd.net/steam/apps/{0}/page_bg_generated_v6b.jpg", appId);

            switch (cfg.BackgroundSource)
            {
            case BackgroundSource.Image:
                var bk = GetGameBackground(appId);
                if (string.IsNullOrEmpty(bk))
                {
                    if (HttpDownloader.GetResponseCode(bannerBk) == HttpStatusCode.OK)
                    {
                        metadata.BackgroundImage = new MetadataFile(bannerBk);
                    }
                }
                else
                {
                    metadata.BackgroundImage = new MetadataFile(bk);
                }
                break;

            case BackgroundSource.StoreScreenshot:
                if (metadata.StoreDetails != null)
                {
                    metadata.BackgroundImage = new MetadataFile(Regex.Replace(metadata.StoreDetails.screenshots.First().path_full, "\\?.*$", ""));
                }
                break;

            case BackgroundSource.StoreBackground:
                if (HttpDownloader.GetResponseCode(storeBk) == HttpStatusCode.OK)
                {
                    metadata.BackgroundImage = new MetadataFile(storeBk);
                }
                break;

            case BackgroundSource.Banner:
                if (HttpDownloader.GetResponseCode(bannerBk) == HttpStatusCode.OK)
                {
                    metadata.BackgroundImage = new MetadataFile(bannerBk);
                }
                break;

            default:
                break;
            }

            return(metadata);
        }
        internal SteamGameMetadata DownloadGameMetadata(uint appId, BackgroundSource backgroundSource)
        {
            var metadata    = new SteamGameMetadata();
            var productInfo = GetAppInfo(appId);

            metadata.ProductDetails = productInfo;

            try
            {
                metadata.StoreDetails = GetStoreData(appId);
            }
            catch (Exception e)
            {
                logger.Error(e, $"Failed to download Steam store metadata {appId}");
            }

            // Icon
            if (productInfo != null)
            {
                var iconRoot = @"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.ico";
                var icon     = productInfo["common"]["clienticon"];
                var iconUrl  = string.Empty;
                if (!string.IsNullOrEmpty(icon.Value))
                {
                    iconUrl = string.Format(iconRoot, appId, icon.Value);
                }
                else
                {
                    var newIcon = productInfo["common"]["icon"];
                    if (!string.IsNullOrEmpty(newIcon.Value))
                    {
                        iconRoot = @"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.jpg";
                        iconUrl  = string.Format(iconRoot, appId, newIcon.Value);
                    }
                }

                // There might be no icon assigned to game
                if (!string.IsNullOrEmpty(iconUrl))
                {
                    metadata.Icon = new MetadataFile(iconUrl);
                }
            }

            // Image
            var imageRoot = @"https://steamcdn-a.akamaihd.net/steam/apps/{0}/header.jpg";
            var imageUrl  = string.Format(imageRoot, appId);

            if (HttpDownloader.GetResponseCode(imageUrl) == HttpStatusCode.OK)
            {
                metadata.CoverImage = new MetadataFile(imageUrl);
            }
            else
            {
                if (productInfo != null)
                {
                    imageRoot = @"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.jpg";
                    var image = productInfo["common"]["logo"];
                    if (!string.IsNullOrEmpty(image.Value))
                    {
                        imageUrl            = string.Format(imageRoot, appId, image.Value);
                        metadata.CoverImage = new MetadataFile(imageUrl);
                    }
                }
            }

            // Background Image
            switch (backgroundSource)
            {
            case BackgroundSource.Image:
                metadata.BackgroundImage = new MetadataFile(GetGameBackground(appId));
                break;

            case BackgroundSource.StoreScreenshot:
                if (metadata.StoreDetails != null)
                {
                    metadata.BackgroundImage = new MetadataFile(Regex.Replace(metadata.StoreDetails.screenshots.First().path_full, "\\?.*$", ""));
                }
                break;

            case BackgroundSource.StoreBackground:
                metadata.BackgroundImage = new MetadataFile(string.Format(@"https://steamcdn-a.akamaihd.net/steam/apps/{0}/page_bg_generated_v6b.jpg", appId));
                break;

            default:
                break;
            }

            return(metadata);
        }
        internal void GetGameData()
        {
            if (currentMetadata != null)
            {
                return;
            }

            try
            {
                var metadataProvider = new MetadataProvider(apiClient);
                if (BuiltinExtensions.GetExtensionFromId(options.GameData.PluginId) == BuiltinExtension.SteamLibrary)
                {
                    var appId = uint.Parse(options.GameData.GameId);
                    currentMetadata = metadataProvider.GetGameMetadata(
                        appId,
                        plugin.SettingsViewModel.Settings.BackgroundSource,
                        plugin.SettingsViewModel.Settings.DownloadVerticalCovers);
                }
                else
                {
                    if (options.IsBackgroundDownload)
                    {
                        var matchedId = GetMatchingGame(options.GameData);
                        if (matchedId > 0)
                        {
                            currentMetadata = metadataProvider.GetGameMetadata(
                                matchedId,
                                plugin.SettingsViewModel.Settings.BackgroundSource,
                                plugin.SettingsViewModel.Settings.DownloadVerticalCovers);
                        }
                        else
                        {
                            currentMetadata = new SteamGameMetadata();
                        }
                    }
                    else
                    {
                        var selectedGame = plugin.PlayniteApi.Dialogs.ChooseItemWithSearch(null, (a) =>
                        {
                            if (uint.TryParse(a, out var appId))
                            {
                                try
                                {
                                    var store = WebApiClient.GetStoreAppDetail(appId);
                                    return(new List <GenericItemOption> {
                                        new StoreSearchResult
                                        {
                                            GameId = appId,
                                            Name = store.name
                                        }
                                    });
                                }
                                catch (Exception e)
                                {
                                    logger.Error(e, $"Failed to get Steam app info {appId}");
                                    return(new List <GenericItemOption>());
                                }
                            }
                            else
                            {
                                try
                                {
                                    var name = StringExtensions.NormalizeGameName(a);
                                    return(new List <GenericItemOption>(UniversalSteamMetadata.GetSearchResults(name)));
                                }
                                catch (Exception e)
                                {
                                    logger.Error(e, $"Failed to get Steam search data for {a}");
                                    return(new List <GenericItemOption>());
                                }
                            }
                        }, options.GameData.Name, string.Empty);

                        if (selectedGame == null)
                        {
                            currentMetadata = new SteamGameMetadata();
                        }
                        else
                        {
                            currentMetadata = metadataProvider.GetGameMetadata(
                                ((StoreSearchResult)selectedGame).GameId,
                                plugin.SettingsViewModel.Settings.BackgroundSource,
                                plugin.SettingsViewModel.Settings.DownloadVerticalCovers);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                logger.Error(e, $"Failed to get Steam metadata.");
                currentMetadata = new SteamGameMetadata();
            }
        }