using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { class ManualMovieDbImageProvider : IImageProvider { private readonly IJsonSerializer _jsonSerializer; private readonly IServerConfigurationManager _config; public ManualMovieDbImageProvider(IJsonSerializer jsonSerializer, IServerConfigurationManager config) { _jsonSerializer = jsonSerializer; _config = config; } public string Name { get { return "TheMovieDB"; } } public bool Supports(BaseItem item, ImageType imageType) { if (MovieDbImagesProvider.SupportsItem(item)) { return imageType == ImageType.Primary || imageType == ImageType.Backdrop; } return false; } public async Task> GetAvailableImages(BaseItem item, ImageType imageType, CancellationToken cancellationToken) { var images = await GetAllImages(item, cancellationToken).ConfigureAwait(false); return images.Where(i => i.Type == imageType); } public async Task> GetAllImages(BaseItem item, CancellationToken cancellationToken) { var list = new List(); var results = FetchImages(item, _jsonSerializer); if (results == null) { return list; } var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); var tmdbImageUrl = tmdbSettings.images.base_url + "original"; list.AddRange(GetPosters(results, item).Select(i => new RemoteImageInfo { Url = tmdbImageUrl + 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 })); list.AddRange(GetBackdrops(results, item).Select(i => new RemoteImageInfo { Url = tmdbImageUrl + i.file_path, CommunityRating = i.vote_average, VoteCount = i.vote_count, Width = i.width, Height = i.height, ProviderName = Name, Type = ImageType.Backdrop })); return list; } /// /// Gets the posters. /// /// The images. /// The item. /// IEnumerable{MovieDbProvider.Poster}. private IEnumerable GetPosters(MovieDbProvider.Images images, BaseItem item) { var language = _config.Configuration.PreferredMetadataLanguage; var isLanguageEn = string.Equals(language, "en", StringComparison.OrdinalIgnoreCase); var eligiblePosters = images.posters == null ? new List() : images.posters.Where(i => i.width >= _config.Configuration.MinMoviePosterWidth) .ToList(); return eligiblePosters.OrderByDescending(i => { if (string.Equals(language, i.iso_639_1, StringComparison.OrdinalIgnoreCase)) { return 3; } if (!isLanguageEn) { if (string.Equals("en", i.iso_639_1, StringComparison.OrdinalIgnoreCase)) { return 2; } } if (string.IsNullOrEmpty(i.iso_639_1)) { return isLanguageEn ? 3 : 2; } return 0; }) .ThenByDescending(i => i.vote_average) .ToList(); } /// /// Gets the backdrops. /// /// The images. /// The item. /// IEnumerable{MovieDbProvider.Backdrop}. private IEnumerable GetBackdrops(MovieDbProvider.Images images, BaseItem item) { var eligibleBackdrops = images.backdrops == null ? new List() : images.backdrops.Where(i => i.width >= _config.Configuration.MinMovieBackdropWidth) .ToList(); return eligibleBackdrops.OrderByDescending(i => i.vote_average); } /// /// Fetches the images. /// /// The item. /// The json serializer. /// Task{MovieImages}. private MovieDbProvider.Images FetchImages(BaseItem item, IJsonSerializer jsonSerializer) { var path = MovieDbProvider.Current.GetDataFilePath(item, "default"); if (!string.IsNullOrEmpty(path)) { var fileInfo = new FileInfo(path); if (fileInfo.Exists) { return jsonSerializer.DeserializeFromFile(path).images; } } return null; } } }