ManualMovieDbImageProvider.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. using MediaBrowser.Controller.Configuration;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Providers;
  4. using MediaBrowser.Model.Dto;
  5. using MediaBrowser.Model.Entities;
  6. using MediaBrowser.Model.Providers;
  7. using MediaBrowser.Model.Serialization;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. namespace MediaBrowser.Providers.Movies
  15. {
  16. class ManualMovieDbImageProvider : IImageProvider
  17. {
  18. private readonly IJsonSerializer _jsonSerializer;
  19. private readonly IServerConfigurationManager _config;
  20. public ManualMovieDbImageProvider(IJsonSerializer jsonSerializer, IServerConfigurationManager config)
  21. {
  22. _jsonSerializer = jsonSerializer;
  23. _config = config;
  24. }
  25. public string Name
  26. {
  27. get { return ProviderName; }
  28. }
  29. public static string ProviderName
  30. {
  31. get { return "TheMovieDb"; }
  32. }
  33. public bool Supports(BaseItem item)
  34. {
  35. return MovieDbImagesProvider.SupportsItem(item);
  36. }
  37. public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, ImageType imageType, CancellationToken cancellationToken)
  38. {
  39. var images = await GetAllImages(item, cancellationToken).ConfigureAwait(false);
  40. return images.Where(i => i.Type == imageType);
  41. }
  42. public async Task<IEnumerable<RemoteImageInfo>> GetAllImages(BaseItem item, CancellationToken cancellationToken)
  43. {
  44. var list = new List<RemoteImageInfo>();
  45. var results = FetchImages(item, _jsonSerializer);
  46. if (results == null)
  47. {
  48. return list;
  49. }
  50. var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
  51. var tmdbImageUrl = tmdbSettings.images.base_url + "original";
  52. list.AddRange(GetPosters(results, item).Select(i => new RemoteImageInfo
  53. {
  54. Url = tmdbImageUrl + i.file_path,
  55. CommunityRating = i.vote_average,
  56. VoteCount = i.vote_count,
  57. Width = i.width,
  58. Height = i.height,
  59. Language = i.iso_639_1,
  60. ProviderName = Name,
  61. Type = ImageType.Primary,
  62. RatingType = RatingType.Score
  63. }));
  64. list.AddRange(GetBackdrops(results, item).Select(i => new RemoteImageInfo
  65. {
  66. Url = tmdbImageUrl + i.file_path,
  67. CommunityRating = i.vote_average,
  68. VoteCount = i.vote_count,
  69. Width = i.width,
  70. Height = i.height,
  71. ProviderName = Name,
  72. Type = ImageType.Backdrop,
  73. RatingType = RatingType.Score
  74. }));
  75. return list;
  76. }
  77. /// <summary>
  78. /// Gets the posters.
  79. /// </summary>
  80. /// <param name="images">The images.</param>
  81. /// <param name="item">The item.</param>
  82. /// <returns>IEnumerable{MovieDbProvider.Poster}.</returns>
  83. private IEnumerable<MovieDbProvider.Poster> GetPosters(MovieDbProvider.Images images, BaseItem item)
  84. {
  85. var language = _config.Configuration.PreferredMetadataLanguage;
  86. var isLanguageEn = string.Equals(language, "en", StringComparison.OrdinalIgnoreCase);
  87. var eligiblePosters = images.posters == null ?
  88. new List<MovieDbProvider.Poster>() :
  89. images.posters
  90. .ToList();
  91. return eligiblePosters.OrderByDescending(i =>
  92. {
  93. if (string.Equals(language, i.iso_639_1, StringComparison.OrdinalIgnoreCase))
  94. {
  95. return 3;
  96. }
  97. if (!isLanguageEn)
  98. {
  99. if (string.Equals("en", i.iso_639_1, StringComparison.OrdinalIgnoreCase))
  100. {
  101. return 2;
  102. }
  103. }
  104. if (string.IsNullOrEmpty(i.iso_639_1))
  105. {
  106. return isLanguageEn ? 3 : 2;
  107. }
  108. return 0;
  109. })
  110. .ThenByDescending(i => i.vote_average)
  111. .ThenByDescending(i => i.vote_count)
  112. .ToList();
  113. }
  114. /// <summary>
  115. /// Gets the backdrops.
  116. /// </summary>
  117. /// <param name="images">The images.</param>
  118. /// <param name="item">The item.</param>
  119. /// <returns>IEnumerable{MovieDbProvider.Backdrop}.</returns>
  120. private IEnumerable<MovieDbProvider.Backdrop> GetBackdrops(MovieDbProvider.Images images, BaseItem item)
  121. {
  122. var eligibleBackdrops = images.backdrops == null ? new List<MovieDbProvider.Backdrop>() :
  123. images.backdrops
  124. .ToList();
  125. return eligibleBackdrops.OrderByDescending(i => i.vote_average)
  126. .ThenByDescending(i => i.vote_count);
  127. }
  128. /// <summary>
  129. /// Fetches the images.
  130. /// </summary>
  131. /// <param name="item">The item.</param>
  132. /// <param name="jsonSerializer">The json serializer.</param>
  133. /// <returns>Task{MovieImages}.</returns>
  134. private MovieDbProvider.Images FetchImages(BaseItem item, IJsonSerializer jsonSerializer)
  135. {
  136. var path = MovieDbProvider.Current.GetImagesDataFilePath(item);
  137. if (!string.IsNullOrEmpty(path))
  138. {
  139. var fileInfo = new FileInfo(path);
  140. if (fileInfo.Exists)
  141. {
  142. return jsonSerializer.DeserializeFromFile<MovieDbProvider.CompleteMovieData>(path).images;
  143. }
  144. }
  145. return null;
  146. }
  147. public int Priority
  148. {
  149. get { return 2; }
  150. }
  151. }
  152. }