diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-05-10 23:43:10 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-05-10 23:43:10 -0400 |
| commit | 3a814a8b922c0720a7f7d4f686cecdb78af945be (patch) | |
| tree | cd62c1883084e4b93cc268e390cad1191cc20585 | |
| parent | 37c1c8626f9854e52c6987d2a99369fac6dea198 (diff) | |
take CriticReviews off of BaseItem and updated nuget
9 files changed, 83 insertions, 337 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 9f02fdc90..a0dba1aab 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -30,7 +30,6 @@ namespace MediaBrowser.Controller.Entities TrailerUrls = new List<string>(); Studios = new List<string>(); People = new List<PersonInfo>(); - CriticReviews = new List<ItemReview>(); Taglines = new List<string>(); ScreenshotImagePaths = new List<string>(); BackdropImagePaths = new List<string>(); @@ -671,12 +670,6 @@ namespace MediaBrowser.Controller.Entities /// <value>The parent index number.</value> public int? ParentIndexNumber { get; set; } - /// <summary> - /// Gets or sets the critic reviews. - /// </summary> - /// <value>The critic reviews.</value> - public List<ItemReview> CriticReviews { get; set; } - public List<Guid> ThemeSongIds { get; set; } public List<Guid> ThemeVideoIds { get; set; } public List<Guid> LocalTrailerIds { get; set; } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 378011e34..2ffa8333a 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -119,7 +119,6 @@ <Compile Include="Providers\MediaInfo\MediaEncoderHelpers.cs" /> <Compile Include="Providers\MetadataProviderPriority.cs" /> <Compile Include="Providers\Movies\OpenMovieDatabaseProvider.cs" /> - <Compile Include="Providers\Movies\RottenTomatoesMovieProvider.cs" /> <Compile Include="Providers\Music\FanArtArtistByNameProvider.cs" /> <Compile Include="Providers\Music\LastfmAlbumProvider.cs" /> <Compile Include="Providers\Music\FanArtAlbumProvider.cs" /> diff --git a/MediaBrowser.Controller/Persistence/IItemRepository.cs b/MediaBrowser.Controller/Persistence/IItemRepository.cs index c91aeb9a5..6f71ee9be 100644 --- a/MediaBrowser.Controller/Persistence/IItemRepository.cs +++ b/MediaBrowser.Controller/Persistence/IItemRepository.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Persistence { @@ -48,5 +49,20 @@ namespace MediaBrowser.Controller.Persistence /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> Task SaveChildren(Guid parentId, IEnumerable<BaseItem> children, CancellationToken cancellationToken); + + /// <summary> + /// Gets the critic reviews. + /// </summary> + /// <param name="itemId">The item id.</param> + /// <returns>Task{IEnumerable{ItemReview}}.</returns> + Task<IEnumerable<ItemReview>> GetCriticReviews(Guid itemId); + + /// <summary> + /// Saves the critic reviews. + /// </summary> + /// <param name="itemId">The item id.</param> + /// <param name="criticReviews">The critic reviews.</param> + /// <returns>Task.</returns> + Task SaveCriticReviews(Guid itemId, IEnumerable<ItemReview> criticReviews); } } diff --git a/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs b/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs deleted file mode 100644 index 1ddc8d72c..000000000 --- a/MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs +++ /dev/null @@ -1,322 +0,0 @@ -using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Configuration; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Entities.Movies; -using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Serialization; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Controller.Providers.Movies -{ - /// <summary> - /// Class RottenTomatoesMovieProvider - /// </summary> - public class RottenTomatoesProvider : BaseMetadataProvider - { - // http://developer.rottentomatoes.com/iodocs - - private const string MoviesReviews = @"movies/{1}/reviews.json?review_type=top_critic&page_limit=10&page=1&country=us&apikey={0}"; - - private const string ApiKey = "x9wjnvv39ntjmt9zs95nm7bg"; - - private const string BasicUrl = @"http://api.rottentomatoes.com/api/public/v1.0/"; - private const string MovieImdb = @"movie_alias.json?id={1}&type=imdb&apikey={0}"; - - private readonly SemaphoreSlim _rottenTomatoesResourcePool = new SemaphoreSlim(1, 1); - - /// <summary> - /// Gets the json serializer. - /// </summary> - /// <value>The json serializer.</value> - protected IJsonSerializer JsonSerializer { get; private set; } - - /// <summary> - /// Gets the HTTP client. - /// </summary> - /// <value>The HTTP client.</value> - protected IHttpClient HttpClient { get; private set; } - - /// <summary> - /// Initializes a new instance of the <see cref="RottenTomatoesMovieProvider"/> class. - /// </summary> - /// <param name="logManager">The log manager.</param> - /// <param name="configurationManager">The configuration manager.</param> - /// <param name="jsonSerializer">The json serializer.</param> - /// <param name="httpClient">The HTTP client.</param> - public RottenTomatoesProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IJsonSerializer jsonSerializer, IHttpClient httpClient) - : base(logManager, configurationManager) - { - JsonSerializer = jsonSerializer; - HttpClient = httpClient; - } - - /// <summary> - /// Gets the provider version. - /// </summary> - /// <value>The provider version.</value> - protected override string ProviderVersion - { - get - { - return "5"; - } - } - - /// <summary> - /// Gets a value indicating whether [requires internet]. - /// </summary> - /// <value><c>true</c> if [requires internet]; otherwise, <c>false</c>.</value> - public override bool RequiresInternet - { - get - { - return true; - } - } - - /// <summary> - /// Gets a value indicating whether [refresh on version change]. - /// </summary> - /// <value><c>true</c> if [refresh on version change]; otherwise, <c>false</c>.</value> - protected override bool RefreshOnVersionChange - { - get - { - return true; - } - } - - /// <summary> - /// Supports the specified item. - /// </summary> - /// <param name="item">The item.</param> - /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> - public override bool Supports(BaseItem item) - { - return false; - var trailer = item as Trailer; - - if (trailer != null) - { - return !trailer.IsLocalTrailer; - } - - // Don't support local trailers - return item is Movie; - } - - /// <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> - /// <param name="providerInfo">The provider info.</param> - /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> - protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) - { - // Refresh if rt id has changed - if (providerInfo.Data != GetComparisonData(item.GetProviderId(MetadataProviders.Imdb))) - { - return true; - } - - return base.NeedsRefreshInternal(item, providerInfo); - } - - /// <summary> - /// Fetches metadata and returns true or false indicating if any work that requires persistence was done - /// </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> - public override async Task<bool> FetchAsync(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.Data = GetComparisonData(imdbId); - data.LastRefreshStatus = ProviderRefreshStatus.Success; - return true; - } - - await FetchRottenTomatoesId(item, cancellationToken).ConfigureAwait(false); - - using (var stream = await HttpClient.Get(new HttpRequestOptions - { - Url = GetMovieReviewsUrl(item.GetProviderId(MetadataProviders.RottenTomatoes)), - ResourcePool = _rottenTomatoesResourcePool, - CancellationToken = cancellationToken, - EnableResponseCache = true - - }).ConfigureAwait(false)) - { - - var result = JsonSerializer.DeserializeFromStream<RTReviewList>(stream); - - item.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(); - } - - data.Data = GetComparisonData(item.GetProviderId(MetadataProviders.Imdb)); - data.LastRefreshStatus = ProviderRefreshStatus.Success; - SetLastRefreshed(item, DateTime.UtcNow); - - return true; - } - - /// <summary> - /// Fetches the rotten tomatoes id. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - private async Task FetchRottenTomatoesId(BaseItem item, CancellationToken cancellationToken) - { - var imdbId = item.GetProviderId(MetadataProviders.Imdb); - - // Have IMDB Id - using (var stream = await HttpClient.Get(new HttpRequestOptions - { - Url = GetMovieImdbUrl(imdbId), - ResourcePool = _rottenTomatoesResourcePool, - CancellationToken = cancellationToken, - EnableResponseCache = true - - }).ConfigureAwait(false)) - { - var hit = JsonSerializer.DeserializeFromStream<RTMovieSearchResult>(stream); - - if (!string.IsNullOrEmpty(hit.id)) - { - // Got a result - item.CriticRatingSummary = hit.critics_consensus; - item.CriticRating = float.Parse(hit.ratings.critics_score); - - item.SetProviderId(MetadataProviders.RottenTomatoes, hit.id); - } - } - } - - - // Utility functions to get the URL of the API calls - - private string GetMovieReviewsUrl(string rtId) - { - return BasicUrl + string.Format(MoviesReviews, ApiKey, rtId); - } - private string GetMovieImdbUrl(string imdbId) - { - return BasicUrl + string.Format(MovieImdb, ApiKey, imdbId.TrimStart('t')); - } - - // Data contract classes for use with the Rotten Tomatoes API - - protected class RTReviewList - { - public int total { get; set; } - public List<RTReview> reviews { get; set; } - } - - protected class RTReview - { - public string critic { get; set; } - public string date { get; set; } - public string freshness { get; set; } - public string publication { get; set; } - public string quote { get; set; } - public RTReviewLink links { get; set; } - public string original_score { get; set; } - } - - protected class RTReviewLink - { - public string review { get; set; } - } - - protected class RTSearchResults - { - public int total { get; set; } - public List<RTMovieSearchResult> movies { get; set; } - public RTSearchLinks links { get; set; } - public string link_template { get; set; } - } - - protected class RTSearchLinks - { - public string self { get; set; } - public string next { get; set; } - public string previous { get; set; } - } - - protected class RTMovieSearchResult - { - public string title { get; set; } - public int year { get; set; } - public string runtime { get; set; } - public string synopsis { get; set; } - public string critics_consensus { get; set; } - public string mpaa_rating { get; set; } - public string id { get; set; } - public RTRatings ratings { get; set; } - public RTAlternateIds alternate_ids { get; set; } - } - - protected class RTRatings - { - public string critics_rating { get; set; } - public string critics_score { get; set; } - } - - protected class RTAlternateIds - { - public string imdb { get; set; } - } - - } -}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/Music/LastfmHelper.cs b/MediaBrowser.Controller/Providers/Music/LastfmHelper.cs index 52dfeb9f2..72e3a3a6e 100644 --- a/MediaBrowser.Controller/Providers/Music/LastfmHelper.cs +++ b/MediaBrowser.Controller/Providers/Music/LastfmHelper.cs @@ -26,7 +26,7 @@ namespace MediaBrowser.Controller.Providers.Music } } - artist.PremiereDate = yearFormed > 0 ? new DateTime(yearFormed, 1,1) : DateTime.MinValue; + artist.PremiereDate = yearFormed > 0 ? new DateTime(yearFormed, 1, 1, 0, 0, 0, DateTimeKind.Utc) : (DateTime?)null; artist.ProductionYear = yearFormed; if (data.tags != null) { diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs index 9138baad0..a8108f56e 100644 --- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs @@ -2,6 +2,7 @@ using System.Linq; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Persistence; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using MediaBrowser.Server.Implementations.Reflection; @@ -321,5 +322,64 @@ namespace MediaBrowser.Server.Implementations.Sqlite } }); } + + /// <summary> + /// Gets the critic reviews path. + /// </summary> + /// <value>The critic reviews path.</value> + private string CriticReviewsPath + { + get + { + var path = Path.Combine(_appPaths.DataPath, "critic-reviews"); + + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + + return path; + } + } + + /// <summary> + /// Gets the critic reviews. + /// </summary> + /// <param name="itemId">The item id.</param> + /// <returns>Task{IEnumerable{ItemReview}}.</returns> + public Task<IEnumerable<ItemReview>> GetCriticReviews(Guid itemId) + { + return Task.Run<IEnumerable<ItemReview>>(() => + { + + try + { + var path = Path.Combine(CriticReviewsPath, itemId + ".json"); + + return _jsonSerializer.DeserializeFromFile<List<ItemReview>>(path); + } + catch (FileNotFoundException) + { + return new List<ItemReview>(); + } + + }); + } + + /// <summary> + /// Saves the critic reviews. + /// </summary> + /// <param name="itemId">The item id.</param> + /// <param name="criticReviews">The critic reviews.</param> + /// <returns>Task.</returns> + public Task SaveCriticReviews(Guid itemId, IEnumerable<ItemReview> criticReviews) + { + return Task.Run(() => + { + var path = Path.Combine(CriticReviewsPath, itemId + ".json"); + + _jsonSerializer.SerializeToFile(criticReviews.ToList(), path); + }); + } } } diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 1feb82848..dd40546c9 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Common.Internal</id> - <version>3.0.98</version> + <version>3.0.100</version> <title>MediaBrowser.Common.Internal</title> <authors>Luke</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,9 +12,9 @@ <description>Contains common components shared by Media Browser Theatre and Media Browser Server. Not intended for plugin developer consumption.</description> <copyright>Copyright © Media Browser 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.98" /> + <dependency id="MediaBrowser.Common" version="3.0.100" /> <dependency id="NLog" version="2.0.1.2" /> - <dependency id="ServiceStack.Text" version="3.9.98" /> + <dependency id="ServiceStack.Text" version="3.9.100" /> <dependency id="SimpleInjector" version="2.2.1" /> </dependencies> </metadata> diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 85d2ca3c5..5524946a8 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <metadata> <id>MediaBrowser.Common</id> - <version>3.0.98</version> + <version>3.0.100</version> <title>MediaBrowser.Common</title> <authors>Media Browser Team</authors> <owners>ebr,Luke,scottisafool</owners> diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 5670f8a6c..e7f1a628a 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <metadata> <id>MediaBrowser.Server.Core</id> - <version>3.0.98</version> + <version>3.0.100</version> <title>Media Browser.Server.Core</title> <authors>Media Browser Team</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,7 +12,7 @@ <description>Contains core components required to build plugins for Media Browser Server.</description> <copyright>Copyright © Media Browser 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.98" /> + <dependency id="MediaBrowser.Common" version="3.0.100" /> </dependencies> </metadata> <files> |
