diff --git a/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs b/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs
index 79aa0a7c06..0e99ea9df0 100644
--- a/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs
+++ b/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs
@@ -108,6 +108,29 @@ namespace MediaBrowser.Controller.Providers.Movies
return item is Movie;
}
+ ///
+ /// Gets the comparison data.
+ ///
+ /// The imdb id.
+ /// Guid.
+ private Guid GetComparisonData(string imdbId)
+ {
+ return string.IsNullOrEmpty(imdbId) ? Guid.Empty : imdbId.GetMD5();
+ }
+
+ ///
+ /// Gets the priority.
+ ///
+ /// The priority.
+ public override MetadataProviderPriority Priority
+ {
+ get
+ {
+ // Run after moviedb and xml providers
+ return MetadataProviderPriority.Last;
+ }
+ }
+
///
/// Needses the refresh internal.
///
@@ -116,6 +139,8 @@ namespace MediaBrowser.Controller.Providers.Movies
/// true if XXXX, false otherwise
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
/// Task{System.Boolean}.
public override Task 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(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(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(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(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(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(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(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(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);
}
- ///
- /// Gets the comparison data.
- ///
- /// The imdb id.
- /// Guid.
- private Guid GetComparisonData(string imdbId)
- {
- return string.IsNullOrEmpty(imdbId) ? Guid.Empty : imdbId.GetMD5();
- }
-
- ///
- /// Gets the priority.
- ///
- /// The priority.
- 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; }
}