2
0
Эх сурвалжийг харах

convert boxset image provider

Luke Pulverenti 11 жил өмнө
parent
commit
8072059f3e

+ 1 - 1
MediaBrowser.Controller/Entities/IHasImages.cs

@@ -5,7 +5,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Controller.Entities
 namespace MediaBrowser.Controller.Entities
 {
 {
-    public interface IHasImages
+    public interface IHasImages : IHasProviderIds
     {
     {
         /// <summary>
         /// <summary>
         /// Gets the name.
         /// Gets the name.

+ 1 - 1
MediaBrowser.Controller/Providers/IHasMetadata.cs

@@ -8,7 +8,7 @@ namespace MediaBrowser.Controller.Providers
     /// <summary>
     /// <summary>
     /// Interface IHasMetadata
     /// Interface IHasMetadata
     /// </summary>
     /// </summary>
-    public interface IHasMetadata : IHasImages, IHasProviderIds
+    public interface IHasMetadata : IHasImages
     {
     {
         /// <summary>
         /// <summary>
         /// Gets the preferred metadata country code.
         /// Gets the preferred metadata country code.

+ 208 - 0
MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs

@@ -0,0 +1,208 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Providers;
+using MediaBrowser.Model.Serialization;
+using MediaBrowser.Providers.Movies;
+
+namespace MediaBrowser.Providers.BoxSets
+{
+    class MovieDbBoxSetImageProvider : IRemoteImageProvider
+    {
+        private readonly IJsonSerializer _jsonSerializer;
+        private readonly IHttpClient _httpClient;
+
+        public MovieDbBoxSetImageProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient)
+        {
+            _jsonSerializer = jsonSerializer;
+            _httpClient = httpClient;
+        }
+
+        public string Name
+        {
+            get { return ProviderName; }
+        }
+
+        public static string ProviderName
+        {
+            get { return "TheMovieDb"; }
+        }
+
+        public bool Supports(IHasImages item)
+        {
+            return item is BoxSet;
+        }
+
+        public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
+        {
+            return new List<ImageType>
+            {
+                ImageType.Primary, 
+                ImageType.Backdrop
+            };
+        }
+
+        public async Task<IEnumerable<RemoteImageInfo>> GetImages(IHasImages item, ImageType imageType, CancellationToken cancellationToken)
+        {
+            var images = await GetAllImages(item, cancellationToken).ConfigureAwait(false);
+
+            return images.Where(i => i.Type == imageType);
+        }
+
+        public async Task<IEnumerable<RemoteImageInfo>> GetAllImages(IHasImages item, CancellationToken cancellationToken)
+        {
+            var tmdbId = item.GetProviderId(MetadataProviders.Tmdb);
+
+            if (!string.IsNullOrEmpty(tmdbId))
+            {
+                var language = item.GetPreferredMetadataLanguage();
+
+                var mainResult = await MovieDbBoxSetProvider.Current.GetMovieDbResult(tmdbId, language, cancellationToken).ConfigureAwait(false);
+
+                if (mainResult != null)
+                {
+                    var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
+
+                    var tmdbImageUrl = tmdbSettings.images.base_url + "original";
+
+                    return GetImages(mainResult, language, tmdbImageUrl);
+                }
+            }
+
+            return new List<RemoteImageInfo>();
+        }
+
+        private IEnumerable<RemoteImageInfo> GetImages(MovieDbBoxSetProvider.RootObject obj, string language, string baseUrl)
+        {
+            var list = new List<RemoteImageInfo>();
+
+            var images = obj.images ?? new MovieDbBoxSetProvider.Images();
+
+            list.AddRange(GetPosters(images).Select(i => new RemoteImageInfo
+            {
+                Url = baseUrl + i.file_path,
+                CommunityRating = i.vote_average,
+                VoteCount = i.vote_count,
+                Width = i.width,
+                Height = i.height,
+                Language = i.iso_639_1,
+                ProviderName = Name,
+                Type = ImageType.Primary,
+                RatingType = RatingType.Score
+            }));
+
+            list.AddRange(GetBackdrops(images).Select(i => new RemoteImageInfo
+            {
+                Url = baseUrl + i.file_path,
+                CommunityRating = i.vote_average,
+                VoteCount = i.vote_count,
+                Width = i.width,
+                Height = i.height,
+                ProviderName = Name,
+                Type = ImageType.Backdrop,
+                RatingType = RatingType.Score
+            }));
+
+            var isLanguageEn = string.Equals(language, "en", StringComparison.OrdinalIgnoreCase);
+
+            return list.OrderByDescending(i =>
+            {
+                if (string.Equals(language, i.Language, StringComparison.OrdinalIgnoreCase))
+                {
+                    return 3;
+                }
+                if (!isLanguageEn)
+                {
+                    if (string.Equals("en", i.Language, StringComparison.OrdinalIgnoreCase))
+                    {
+                        return 2;
+                    }
+                }
+                if (string.IsNullOrEmpty(i.Language))
+                {
+                    return isLanguageEn ? 3 : 2;
+                }
+                return 0;
+            })
+                .ThenByDescending(i => i.CommunityRating ?? 0)
+                .ThenByDescending(i => i.VoteCount ?? 0)
+                .ToList();
+        }
+
+        /// <summary>
+        /// Gets the posters.
+        /// </summary>
+        /// <param name="images">The images.</param>
+        /// <returns>IEnumerable{MovieDbProvider.Poster}.</returns>
+        private IEnumerable<MovieDbBoxSetProvider.Poster> GetPosters(MovieDbBoxSetProvider.Images images)
+        {
+            return images.posters ?? new List<MovieDbBoxSetProvider.Poster>();
+        }
+
+        /// <summary>
+        /// Gets the backdrops.
+        /// </summary>
+        /// <param name="images">The images.</param>
+        /// <returns>IEnumerable{MovieDbProvider.Backdrop}.</returns>
+        private IEnumerable<MovieDbBoxSetProvider.Backdrop> GetBackdrops(MovieDbBoxSetProvider.Images images)
+        {
+            var eligibleBackdrops = images.backdrops == null ? new List<MovieDbBoxSetProvider.Backdrop>() :
+                images.backdrops
+                .ToList();
+
+            return eligibleBackdrops.OrderByDescending(i => i.vote_average)
+                .ThenByDescending(i => i.vote_count);
+        }
+
+        /// <summary>
+        /// Fetches the images.
+        /// </summary>
+        /// <param name="item">The item.</param>
+        /// <param name="jsonSerializer">The json serializer.</param>
+        /// <param name="cancellationToken">The cancellation token.</param>
+        /// <returns>Task{MovieImages}.</returns>
+        private async Task<MovieDbProvider.Images> FetchImages(BaseItem item, IJsonSerializer jsonSerializer,
+            CancellationToken cancellationToken)
+        {
+            await MovieDbProvider.Current.EnsureMovieInfo(item, cancellationToken).ConfigureAwait(false);
+
+            var path = MovieDbProvider.Current.GetDataFilePath(item);
+
+            if (!string.IsNullOrEmpty(path))
+            {
+                var fileInfo = new FileInfo(path);
+
+                if (fileInfo.Exists)
+                {
+                    return jsonSerializer.DeserializeFromFile<MovieDbProvider.CompleteMovieData>(path).images;
+                }
+            }
+
+            return null;
+        }
+
+        public int Order
+        {
+            get { return 0; }
+        }
+
+        public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
+        {
+            return _httpClient.GetResponse(new HttpRequestOptions
+            {
+                CancellationToken = cancellationToken,
+                Url = url,
+                ResourcePool = MovieDbProvider.Current.MovieDbResourcePool
+            });
+        }
+    }
+}

+ 28 - 11
MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs

@@ -20,8 +20,10 @@ namespace MediaBrowser.Providers.BoxSets
     public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet>
     public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet>
     {
     {
         private  readonly CultureInfo _enUs = new CultureInfo("en-US");
         private  readonly CultureInfo _enUs = new CultureInfo("en-US");
-        private const string GetCollectionInfo3 = @"http://api.themoviedb.org/3/collection/{0}?api_key={1}&append_to_response=images"; 
-        
+        private const string GetCollectionInfo3 = @"http://api.themoviedb.org/3/collection/{0}?api_key={1}&append_to_response=images";
+
+        internal static MovieDbBoxSetProvider Current;
+
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly IJsonSerializer _json;
         private readonly IJsonSerializer _json;
         private readonly IServerConfigurationManager _config;
         private readonly IServerConfigurationManager _config;
@@ -33,6 +35,7 @@ namespace MediaBrowser.Providers.BoxSets
             _json = json;
             _json = json;
             _config = config;
             _config = config;
             _fileSystem = fileSystem;
             _fileSystem = fileSystem;
+            Current = this;
         }
         }
 
 
         public async Task<MetadataResult<BoxSet>> GetMetadata(ItemId id, CancellationToken cancellationToken)
         public async Task<MetadataResult<BoxSet>> GetMetadata(ItemId id, CancellationToken cancellationToken)
@@ -49,23 +52,37 @@ namespace MediaBrowser.Providers.BoxSets
 
 
             if (!string.IsNullOrEmpty(tmdbId))
             if (!string.IsNullOrEmpty(tmdbId))
             {
             {
-                await EnsureInfo(tmdbId, id.MetadataLanguage, cancellationToken).ConfigureAwait(false);
+                var mainResult = await GetMovieDbResult(tmdbId, id.MetadataLanguage, cancellationToken).ConfigureAwait(false);
 
 
-                var dataFilePath = GetDataFilePath(_config.ApplicationPaths, tmdbId, id.MetadataLanguage);
-
-                if (!string.IsNullOrEmpty(dataFilePath))
+                if (mainResult != null)
                 {
                 {
-                    var mainResult = _json.DeserializeFromFile<RootObject>(dataFilePath);
-
                     result.HasMetadata = true;
                     result.HasMetadata = true;
                     result.Item = GetItem(mainResult);
                     result.Item = GetItem(mainResult);
                 }
                 }
-                
             }
             }
 
 
             return result;
             return result;
         }
         }
 
 
+        internal async Task<RootObject> GetMovieDbResult(string tmdbId, string language, CancellationToken cancellationToken)
+        {
+            if (string.IsNullOrEmpty(tmdbId))
+            {
+                throw new ArgumentNullException("tmdbId");
+            }
+
+            await EnsureInfo(tmdbId, language, cancellationToken).ConfigureAwait(false);
+
+            var dataFilePath = GetDataFilePath(_config.ApplicationPaths, tmdbId, language);
+
+            if (!string.IsNullOrEmpty(dataFilePath))
+            {
+                return _json.DeserializeFromFile<RootObject>(dataFilePath);
+            }
+
+            return null;
+        }
+
         private BoxSet GetItem(RootObject obj)
         private BoxSet GetItem(RootObject obj)
         {
         {
             var item = new BoxSet();
             var item = new BoxSet();
@@ -219,7 +236,7 @@ namespace MediaBrowser.Providers.BoxSets
             public string file_path { get; set; }
             public string file_path { get; set; }
             public int height { get; set; }
             public int height { get; set; }
             public string iso_639_1 { get; set; }
             public string iso_639_1 { get; set; }
-            public object vote_average { get; set; }
+            public double vote_average { get; set; }
             public int vote_count { get; set; }
             public int vote_count { get; set; }
             public int width { get; set; }
             public int width { get; set; }
         }
         }
@@ -230,7 +247,7 @@ namespace MediaBrowser.Providers.BoxSets
             public string file_path { get; set; }
             public string file_path { get; set; }
             public int height { get; set; }
             public int height { get; set; }
             public string iso_639_1 { get; set; }
             public string iso_639_1 { get; set; }
-            public object vote_average { get; set; }
+            public double vote_average { get; set; }
             public int vote_count { get; set; }
             public int vote_count { get; set; }
             public int width { get; set; }
             public int width { get; set; }
         }
         }

+ 1 - 0
MediaBrowser.Providers/MediaBrowser.Providers.csproj

@@ -66,6 +66,7 @@
   <ItemGroup>
   <ItemGroup>
     <Compile Include="All\LocalImageProvider.cs" />
     <Compile Include="All\LocalImageProvider.cs" />
     <Compile Include="BoxSets\BoxSetMetadataService.cs" />
     <Compile Include="BoxSets\BoxSetMetadataService.cs" />
+    <Compile Include="BoxSets\MovieDbBoxSetImageProvider.cs" />
     <Compile Include="BoxSets\MovieDbBoxSetProvider.cs" />
     <Compile Include="BoxSets\MovieDbBoxSetProvider.cs" />
     <Compile Include="GameGenres\GameGenreMetadataService.cs" />
     <Compile Include="GameGenres\GameGenreMetadataService.cs" />
     <Compile Include="Genres\GenreMetadataService.cs" />
     <Compile Include="Genres\GenreMetadataService.cs" />

+ 1 - 1
MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs

@@ -46,7 +46,7 @@ namespace MediaBrowser.Providers.Movies
             }
             }
 
 
             // Don't support local trailers
             // Don't support local trailers
-            return item is Movie || item is BoxSet || item is MusicVideo;
+            return item is Movie || item is MusicVideo;
         }
         }
 
 
         public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
         public IEnumerable<ImageType> GetSupportedImages(IHasImages item)