/// <summary>
        /// Fetches the rotten tomatoes id.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="apiKey">The API key.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>Task.</returns>
        private async Task FetchRottenTomatoesId(BaseItem item, string apiKey, CancellationToken cancellationToken)
        {
            var imdbId = item.GetProviderId(MetadataProviders.Imdb);

            RequestHistory.Add(DateTime.UtcNow);

            // Have IMDB Id
            using (var stream = await HttpClient.Get(new HttpRequestOptions
            {
                Url = GetMovieImdbUrl(imdbId, apiKey),
                ResourcePool = _rottenTomatoesResourcePool,
                CancellationToken = cancellationToken
            }).ConfigureAwait(false))
            {
                var hit = JsonSerializer.DeserializeFromStream <RTMovieSearchResult>(stream);

                if (!string.IsNullOrEmpty(hit.id))
                {
                    // Got a result
                    item.CriticRatingSummary = hit.critics_consensus;

                    var rating = float.Parse(hit.ratings.critics_score);

                    if (rating > 0)
                    {
                        item.CriticRating = rating;
                    }

                    item.SetProviderId(MetadataProviders.RottenTomatoes, hit.id);
                }
            }
        }
        /// <summary>
        /// Fetches the async internal.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="force">if set to <c>true</c> [force].</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>Task{System.Boolean}.</returns>
        private async Task FetchAsyncInternal(BaseItem item, bool force, CancellationToken cancellationToken)
        {
            BaseProviderInfo data;

            if (!item.ProviderData.TryGetValue(Id, out data))
            {
                data = new BaseProviderInfo();
                item.ProviderData[Id] = data;
            }

            var imdbId = item.GetProviderId(MetadataProviders.Imdb);

            if (string.IsNullOrEmpty(imdbId))
            {
                data.LastRefreshStatus = ProviderRefreshStatus.Success;
                return;
            }

            var apiKey = GetApiKey();

            if (string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.RottenTomatoes)))
            {
                await FetchRottenTomatoesId(item, apiKey, cancellationToken).ConfigureAwait(false);
            }

            // If still empty we can't continue
            if (string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.RottenTomatoes)))
            {
                data.LastRefreshStatus = ProviderRefreshStatus.Success;
                return;
            }

            RequestHistory.Add(DateTime.UtcNow);

            using (var stream = await HttpClient.Get(new HttpRequestOptions
            {
                Url = GetMovieReviewsUrl(item.GetProviderId(MetadataProviders.RottenTomatoes), apiKey),
                ResourcePool = _rottenTomatoesResourcePool,
                CancellationToken = cancellationToken
            }).ConfigureAwait(false))
            {
                var result = JsonSerializer.DeserializeFromStream <RTReviewList>(stream);

                var criticReviews = result.reviews.Select(rtReview => new ItemReview
                {
                    ReviewerName = rtReview.critic,
                    Publisher    = rtReview.publication,
                    Date         = DateTime.Parse(rtReview.date).ToUniversalTime(),
                    Caption      = rtReview.quote,
                    Url          = rtReview.links.review,
                    Likes        = string.Equals(rtReview.freshness, "fresh", StringComparison.OrdinalIgnoreCase)
                }).ToList();

                await _itemRepo.SaveCriticReviews(item.Id, criticReviews).ConfigureAwait(false);
            }

            data.LastRefreshStatus = ProviderRefreshStatus.Success;
            SetLastRefreshed(item, DateTime.UtcNow);
        }
Exemplo n.º 3
0
        private async Task <ItemUpdateType> FetchAsyncInternal(BaseItem item, CancellationToken cancellationToken)
        {
            var imdbId = item.GetProviderId(MetadataProviders.Imdb);

            if (string.IsNullOrEmpty(imdbId))
            {
                return(ItemUpdateType.None);
            }

            var apiKey = GetApiKey();

            if (string.IsNullOrEmpty(item.GetProviderId(RottenTomatoesExternalId.KeyName)))
            {
                await FetchRottenTomatoesId(item, apiKey, cancellationToken).ConfigureAwait(false);
            }

            // If still empty we can't continue
            if (string.IsNullOrEmpty(item.GetProviderId(RottenTomatoesExternalId.KeyName)))
            {
                return(ItemUpdateType.None);
            }

            if (!_security.IsMBSupporter)
            {
                _logger.Warn("Downloading critic reviews from RottenTomatoes requires a supporter membership.");
                return(ItemUpdateType.None);
            }

            RequestHistory.Add(DateTime.UtcNow);

            using (var stream = await _httpClient.Get(new HttpRequestOptions
            {
                Url = GetMovieReviewsUrl(item.GetProviderId(RottenTomatoesExternalId.KeyName), apiKey),
                ResourcePool = _rottenTomatoesResourcePool,
                CancellationToken = cancellationToken
            }).ConfigureAwait(false))
            {
                var result = _jsonSerializer.DeserializeFromStream <RTReviewList>(stream);

                var criticReviews = result.reviews.Select(rtReview => new ItemReview
                {
                    ReviewerName = rtReview.critic,
                    Publisher    = rtReview.publication,
                    Date         = DateTime.Parse(rtReview.date).ToUniversalTime(),
                    Caption      = rtReview.quote,
                    Url          = rtReview.links.review,
                    Likes        = string.Equals(rtReview.freshness, "fresh", StringComparison.OrdinalIgnoreCase)
                }).ToList();

                await _itemRepo.SaveCriticReviews(item.Id, criticReviews).ConfigureAwait(false);
            }

            return(ItemUpdateType.MetadataDownload);
        }