diff options
| author | Mark van Veen <mark2xv@gmail.com> | 2013-05-05 18:55:53 +0200 |
|---|---|---|
| committer | Mark van Veen <mark2xv@gmail.com> | 2013-05-05 18:55:53 +0200 |
| commit | 7c2aa12db8c3c7a96a812342825f91b8fa1eabb9 (patch) | |
| tree | 713c82850f27eba6777224f2adcb1db0642a0f99 | |
| parent | 31cc00be9e9a845abff9a3ab4be45e4f8a096494 (diff) | |
Updated RottenTomatoes provider to use 'using' blocks
| -rw-r--r-- | MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs | 187 |
1 files changed, 98 insertions, 89 deletions
diff --git a/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs b/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs index 79aa0a7c0..0e99ea9df 100644 --- a/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs @@ -109,6 +109,29 @@ namespace MediaBrowser.Controller.Providers.Movies } /// <summary> + /// Gets the comparison data. + /// </summary> + /// <param name="imdbId">The imdb id.</param> + /// <returns>Guid.</returns> + private Guid GetComparisonData(string imdbId) + { + return string.IsNullOrEmpty(imdbId) ? Guid.Empty : imdbId.GetMD5(); + } + + /// <summary> + /// Gets the priority. + /// </summary> + /// <value>The priority.</value> + public override MetadataProviderPriority Priority + { + get + { + // Run after moviedb and xml providers + return MetadataProviderPriority.Last; + } + } + + /// <summary> /// Needses the refresh internal. /// </summary> /// <param name="item">The item.</param> @@ -116,6 +139,8 @@ namespace MediaBrowser.Controller.Providers.Movies /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) { + return true; + // Refresh if imdb id has changed if (providerInfo.Data != GetComparisonData(item.GetProviderId(MetadataProviders.Imdb))) { @@ -134,114 +159,116 @@ namespace MediaBrowser.Controller.Providers.Movies /// <returns>Task{System.Boolean}.</returns> public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) { - // Lastly, record the Imdb id here BaseProviderInfo data; + // See whether there's an IMDB Id available string imdbId = null; - if (item.ProviderData.TryGetValue(Id, out data)) { imdbId = item.GetProviderId(MetadataProviders.Imdb); } - else - { - // Wat - } - - RTMovieSearchResult hit = null; - Stream stream = null; if (string.IsNullOrEmpty(imdbId)) { // No IMDB Id, search RT for an ID int page = 1; - stream = HttpClient.Get(MovieSearchUrl(item.Name, page), _rottenTomatoesResourcePool, cancellationToken).Result; - RTSearchResults result = JsonSerializer.DeserializeFromStream<RTSearchResults>(stream); - - if (result.total == 1) + using (Stream stream = HttpClient.Get(MovieSearchUrl(item.Name, page), _rottenTomatoesResourcePool, cancellationToken).Result) { - hit = result.movies[0]; - } - else if (result.total > 1) - { - while (hit == null) + RTSearchResults result = JsonSerializer.DeserializeFromStream<RTSearchResults>(stream); + + if (result.total == 1) { - // See if there's an absolute hit somewhere - foreach (var searchHit in result.movies) - { - if (string.Equals(searchHit.title, item.Name, StringComparison.InvariantCultureIgnoreCase)) - { - hit = searchHit; - break; - } - } + // With only one result we'll have to assume that this is the movie we're searching for + hit = result.movies[0]; + } + else if (result.total > 1) + { + // If there are more results than one + // Step 1: Loop through all current results, see if there's an exact match (not case sensitive) somewhere, if so, accept that as the searched item, else go to step 2 + // Step 2: Retrieve the next page and go to step 1 if there are results, else, stop checking - if (hit == null) + while (hit == null) { - Stream newPageStream = HttpClient.Get(MovieSearchUrl(item.Name, page++), _rottenTomatoesResourcePool, cancellationToken).Result; - result = JsonSerializer.DeserializeFromStream<RTSearchResults>(stream); + foreach (var searchHit in result.movies) + { + if (string.Equals(searchHit.title, item.Name, StringComparison.InvariantCultureIgnoreCase)) + { + hit = searchHit; + break; + } + } - if (result.total == 0) + if (hit == null) { - // No results found on RottenTomatoes - break; + using (Stream newPageStream = HttpClient.Get(MovieSearchUrl(item.Name, page++), _rottenTomatoesResourcePool, cancellationToken).Result) + { + result = JsonSerializer.DeserializeFromStream<RTSearchResults>(stream); + + if (result.total == 0) + { + // No results found on RottenTomatoes + break; + } + } } + // while end } } } + // if null end } else { // Have IMDB Id - stream = HttpClient.Get(MovieImdbUrl(imdbId), _rottenTomatoesResourcePool, cancellationToken).Result; - RTMovieSearchResult result = JsonSerializer.DeserializeFromStream<RTMovieSearchResult>(stream); - - if (!string.IsNullOrEmpty(result.id)) + using (Stream stream = HttpClient.Get(MovieImdbUrl(imdbId), _rottenTomatoesResourcePool, cancellationToken).Result) { - // got a result - hit = result; + RTMovieSearchResult result = JsonSerializer.DeserializeFromStream<RTMovieSearchResult>(stream); + + if (!string.IsNullOrEmpty(result.id)) + { + // Got a result + hit = result; + } } } - stream.Dispose(); - stream = null; + // If we found any results, that's great! if (hit != null) { item.CriticRatingSummary = hit.critics_concensus; item.CriticRating = float.Parse(hit.ratings.critics_score); - stream = HttpClient.Get(MovieReviewsUrl(hit.id), _rottenTomatoesResourcePool, cancellationToken).Result; - - RTReviewList result = JsonSerializer.DeserializeFromStream<RTReviewList>(stream); - - item.CriticReviews.Clear(); - foreach (var rtReview in result.reviews) + using (Stream stream = HttpClient.Get(MovieReviewsUrl(hit.id), _rottenTomatoesResourcePool, cancellationToken).Result) { - ItemReview review = new ItemReview(); - - review.ReviewerName = rtReview.critic; - review.Publisher = rtReview.publication; - review.Date = DateTime.Parse(rtReview.date).ToUniversalTime(); - review.Caption = rtReview.quote; - review.Url = rtReview.links.review; - item.CriticReviews.Add(review); - } - if (data == null) - { - data = new BaseProviderInfo(); - } + RTReviewList result = JsonSerializer.DeserializeFromStream<RTReviewList>(stream); + + item.CriticReviews.Clear(); + foreach (var rtReview in result.reviews) + { + ItemReview review = new ItemReview(); + + review.ReviewerName = rtReview.critic; + review.Publisher = rtReview.publication; + review.Date = DateTime.Parse(rtReview.date).ToUniversalTime(); + review.Caption = rtReview.quote; + review.Url = rtReview.links.review; + item.CriticReviews.Add(review); + } - data.Data = GetComparisonData(hit.alternate_ids.imdb); + if (data == null) + { + data = new BaseProviderInfo(); + } - item.SetProviderId(MetadataProviders.Imdb, hit.alternate_ids.imdb); - item.SetProviderId(MetadataProviders.RottenTomatoes, hit.id); + data.Data = GetComparisonData(hit.alternate_ids.imdb); - stream.Dispose(); - stream = null; + item.SetProviderId(MetadataProviders.Imdb, hit.alternate_ids.imdb); + item.SetProviderId(MetadataProviders.RottenTomatoes, hit.id); + } } else { @@ -254,13 +281,17 @@ namespace MediaBrowser.Controller.Providers.Movies if (data != null) { data.Data = GetComparisonData(imdbId); + data.LastRefreshStatus = ProviderRefreshStatus.Success; } - + SetLastRefreshed(item, DateTime.UtcNow); + return Task.FromResult(true); } + // Utility functions to get the URL of the API calls + private string MovieUrl(string rtId) { return BasicUrl + string.Format(Movie, ApiKey, rtId); @@ -281,28 +312,6 @@ namespace MediaBrowser.Controller.Providers.Movies return BasicUrl + string.Format(MoviesReviews, ApiKey, rtId); } - /// <summary> - /// Gets the comparison data. - /// </summary> - /// <param name="imdbId">The imdb id.</param> - /// <returns>Guid.</returns> - private Guid GetComparisonData(string imdbId) - { - return string.IsNullOrEmpty(imdbId) ? Guid.Empty : imdbId.GetMD5(); - } - - /// <summary> - /// Gets the priority. - /// </summary> - /// <value>The priority.</value> - public override MetadataProviderPriority Priority - { - get - { - // Run after moviedb and xml providers - return MetadataProviderPriority.Last; - } - } // Data contract classes for use with the Rotten Tomatoes API @@ -361,7 +370,7 @@ namespace MediaBrowser.Controller.Providers.Movies public RTReviewLink links { get; set; } } - protected class RTReviewLink + protected class RTReviewLink { public string review { get; set; } } |
