소스 검색

take CriticReviews off of BaseItem and updated nuget

Luke Pulverenti 12 년 전
부모
커밋
3a814a8b92

+ 0 - 7
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; }

+ 0 - 1
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" />

+ 16 - 0
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);
     }
 }

+ 0 - 322
MediaBrowser.Controller/Providers/Movies/RottenTomatoesMovieProvider.cs

@@ -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; }
-        }
-
-    }
-}

+ 1 - 1
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)
             {

+ 60 - 0
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);
+            });
+        }
     }
 }

+ 3 - 3
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>

+ 1 - 1
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>

+ 2 - 2
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>