ManualMovieDbImageProvider.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. var language = _config.Configuration.PreferredMetadataLanguage;
  76. var isLanguageEn = string.Equals(language, "en", StringComparison.OrdinalIgnoreCase);
  77. return list.OrderByDescending(i =>
  78. {
  79. if (string.Equals(language, i.Language, StringComparison.OrdinalIgnoreCase))
  80. {
  81. return 3;
  82. }
  83. if (!isLanguageEn)
  84. {
  85. if (string.Equals("en", i.Language, StringComparison.OrdinalIgnoreCase))
  86. {
  87. return 2;
  88. }
  89. }
  90. if (string.IsNullOrEmpty(i.Language))
  91. {
  92. return isLanguageEn ? 3 : 2;
  93. }
  94. return 0;
  95. })
  96. .ThenByDescending(i => i.CommunityRating ?? 0)
  97. .ThenByDescending(i => i.VoteCount ?? 0)
  98. .ToList();
  99. }
  100. /// <summary>
  101. /// Gets the posters.
  102. /// </summary>
  103. /// <param name="images">The images.</param>
  104. /// <param name="item">The item.</param>
  105. /// <returns>IEnumerable{MovieDbProvider.Poster}.</returns>
  106. private IEnumerable<MovieDbProvider.Poster> GetPosters(MovieDbProvider.Images images, BaseItem item)
  107. {
  108. var language = _config.Configuration.PreferredMetadataLanguage;
  109. return images.posters ?? new List<MovieDbProvider.Poster>();
  110. }
  111. /// <summary>
  112. /// Gets the backdrops.
  113. /// </summary>
  114. /// <param name="images">The images.</param>
  115. /// <param name="item">The item.</param>
  116. /// <returns>IEnumerable{MovieDbProvider.Backdrop}.</returns>
  117. private IEnumerable<MovieDbProvider.Backdrop> GetBackdrops(MovieDbProvider.Images images, BaseItem item)
  118. {
  119. var eligibleBackdrops = images.backdrops == null ? new List<MovieDbProvider.Backdrop>() :
  120. images.backdrops
  121. .ToList();
  122. return eligibleBackdrops.OrderByDescending(i => i.vote_average)
  123. .ThenByDescending(i => i.vote_count);
  124. }
  125. /// <summary>
  126. /// Fetches the images.
  127. /// </summary>
  128. /// <param name="item">The item.</param>
  129. /// <param name="jsonSerializer">The json serializer.</param>
  130. /// <returns>Task{MovieImages}.</returns>
  131. private MovieDbProvider.Images FetchImages(BaseItem item, IJsonSerializer jsonSerializer)
  132. {
  133. var path = MovieDbProvider.Current.GetImagesDataFilePath(item);
  134. if (!string.IsNullOrEmpty(path))
  135. {
  136. var fileInfo = new FileInfo(path);
  137. if (fileInfo.Exists)
  138. {
  139. return jsonSerializer.DeserializeFromFile<MovieDbProvider.CompleteMovieData>(path).images;
  140. }
  141. }
  142. return null;
  143. }
  144. public int Priority
  145. {
  146. get { return 2; }
  147. }
  148. }
  149. }