diff options
6 files changed, 240 insertions, 14 deletions
diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index 784337e3b..2fef9a035 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Controller.Entities { - public interface IHasImages + public interface IHasImages : IHasProviderIds { /// <summary> /// Gets the name. diff --git a/MediaBrowser.Controller/Providers/IHasMetadata.cs b/MediaBrowser.Controller/Providers/IHasMetadata.cs index 33c5184b8..4ee54f69e 100644 --- a/MediaBrowser.Controller/Providers/IHasMetadata.cs +++ b/MediaBrowser.Controller/Providers/IHasMetadata.cs @@ -8,7 +8,7 @@ namespace MediaBrowser.Controller.Providers /// <summary> /// Interface IHasMetadata /// </summary> - public interface IHasMetadata : IHasImages, IHasProviderIds + public interface IHasMetadata : IHasImages { /// <summary> /// Gets the preferred metadata country code. diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs new file mode 100644 index 000000000..961982bfd --- /dev/null +++ b/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 + }); + } + } +} diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs index 2fe18fafa..3908535f4 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs @@ -20,8 +20,10 @@ namespace MediaBrowser.Providers.BoxSets public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet> { 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 IJsonSerializer _json; private readonly IServerConfigurationManager _config; @@ -33,6 +35,7 @@ namespace MediaBrowser.Providers.BoxSets _json = json; _config = config; _fileSystem = fileSystem; + Current = this; } public async Task<MetadataResult<BoxSet>> GetMetadata(ItemId id, CancellationToken cancellationToken) @@ -49,23 +52,37 @@ namespace MediaBrowser.Providers.BoxSets 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.Item = GetItem(mainResult); } - } 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) { var item = new BoxSet(); @@ -219,7 +236,7 @@ namespace MediaBrowser.Providers.BoxSets public string file_path { get; set; } public int height { 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 width { get; set; } } @@ -230,7 +247,7 @@ namespace MediaBrowser.Providers.BoxSets public string file_path { get; set; } public int height { 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 width { get; set; } } diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index ce996ccfc..06c70d75d 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -66,6 +66,7 @@ <ItemGroup> <Compile Include="All\LocalImageProvider.cs" /> <Compile Include="BoxSets\BoxSetMetadataService.cs" /> + <Compile Include="BoxSets\MovieDbBoxSetImageProvider.cs" /> <Compile Include="BoxSets\MovieDbBoxSetProvider.cs" /> <Compile Include="GameGenres\GameGenreMetadataService.cs" /> <Compile Include="Genres\GenreMetadataService.cs" /> diff --git a/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs b/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs index c8cd746dc..8c6e2d92e 100644 --- a/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs +++ b/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs @@ -46,7 +46,7 @@ namespace MediaBrowser.Providers.Movies } // 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) |
