private async Task <T> TryGetValue <T>(string key, string language, Func <Task <T> > resultFactory)
        {
            if (_cache.TryGetValue(key, out T cachedValue))
            {
                return(cachedValue);
            }

            await _cacheWriteLock.WaitAsync().ConfigureAwait(false);

            try
            {
                if (_cache.TryGetValue(key, out cachedValue))
                {
                    return(cachedValue);
                }

                _tvDbClient.AcceptedLanguage = TvdbUtils.NormalizeLanguage(language) ?? DefaultLanguage;
                var result = await resultFactory.Invoke().ConfigureAwait(false);

                _cache.Set(key, result, TimeSpan.FromHours(1));
                return(result);
            }
            finally
            {
                _cacheWriteLock.Release();
            }
        }
        private IEnumerable <RemoteImageInfo> GetImages(Image[] images, string preferredLanguage)
        {
            var list      = new List <RemoteImageInfo>();
            var languages = _tvDbClientManager.GetLanguagesAsync(CancellationToken.None).Result.Data;

            foreach (Image image in images)
            {
                var imageInfo = new RemoteImageInfo
                {
                    RatingType      = RatingType.Score,
                    CommunityRating = (double?)image.RatingsInfo.Average,
                    VoteCount       = image.RatingsInfo.Count,
                    Url             = TvdbUtils.BannerUrl + image.FileName,
                    ProviderName    = Name,
                    Language        = languages.FirstOrDefault(lang => lang.Id == image.LanguageId)?.Abbreviation,
                    ThumbnailUrl    = TvdbUtils.BannerUrl + image.Thumbnail
                };

                var resolution = image.Resolution.Split('x');
                if (resolution.Length == 2)
                {
                    imageInfo.Width  = Convert.ToInt32(resolution[0]);
                    imageInfo.Height = Convert.ToInt32(resolution[1]);
                }

                imageInfo.Type = TvdbUtils.GetImageTypeFromKeyType(image.KeyType);
                list.Add(imageInfo);
            }
            var isLanguageEn = string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase);

            return(list.OrderByDescending(i =>
            {
                if (string.Equals(preferredLanguage, i.Language, StringComparison.OrdinalIgnoreCase))
                {
                    return 3;
                }

                if (!isLanguageEn)
                {
                    if (string.Equals("en", i.Language, StringComparison.OrdinalIgnoreCase))
                    {
                        return 2;
                    }
                }

                if (string.IsNullOrEmpty(i.Language))
                {
                    return isLanguageEn ? 3 : 2;
                }

                return 0;
            })
                   .ThenByDescending(i => i.CommunityRating ?? 0)
                   .ThenByDescending(i => i.VoteCount ?? 0));
        }