DefaultThemeService.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using MediaBrowser.Controller;
  2. using MediaBrowser.Controller.Dto;
  3. using MediaBrowser.Controller.Entities;
  4. using MediaBrowser.Controller.Entities.Movies;
  5. using MediaBrowser.Controller.Entities.TV;
  6. using MediaBrowser.Controller.Library;
  7. using MediaBrowser.Model.Entities;
  8. using MediaBrowser.Model.Logging;
  9. using ServiceStack.ServiceHost;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Threading.Tasks;
  14. namespace MediaBrowser.Api.DefaultTheme
  15. {
  16. [Route("/MBT/DefaultTheme/TV", "GET")]
  17. public class GetTvView : IReturn<TvView>
  18. {
  19. [ApiMember(Name = "UserId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
  20. public Guid UserId { get; set; }
  21. }
  22. [Route("/MBT/DefaultTheme/Movies", "GET")]
  23. public class GetMovieView : IReturn<MoviesView>
  24. {
  25. [ApiMember(Name = "UserId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
  26. public Guid UserId { get; set; }
  27. }
  28. public class DefaultThemeService : BaseApiService
  29. {
  30. private readonly IUserManager _userManager;
  31. private readonly IDtoService _dtoService;
  32. private readonly ILogger _logger;
  33. private readonly ILibraryManager _libraryManager;
  34. public DefaultThemeService(IUserManager userManager, IDtoService dtoService, ILogger logger, ILibraryManager libraryManager)
  35. {
  36. _userManager = userManager;
  37. _dtoService = dtoService;
  38. _logger = logger;
  39. _libraryManager = libraryManager;
  40. }
  41. public object Get(GetTvView request)
  42. {
  43. var result = GetTvView(request).Result;
  44. return ToOptimizedResult(result);
  45. }
  46. private async Task<TvView> GetTvView(GetTvView request)
  47. {
  48. var user = _userManager.GetUserById(request.UserId);
  49. var series = user.RootFolder.GetRecursiveChildren(user)
  50. .OfType<Series>()
  51. .ToList();
  52. var seriesWithBackdrops = series.Where(i => i.BackdropImagePaths.Count > 0).ToList();
  53. var view = new TvView();
  54. view.BackdropItems = seriesWithBackdrops
  55. .OrderBy(i => Guid.NewGuid())
  56. .Select(i => GetItemStub(i, ImageType.Backdrop))
  57. .Where(i => i != null)
  58. .Take(30)
  59. .ToArray();
  60. view.SpotlightItems = seriesWithBackdrops
  61. .OrderBy(i => Guid.NewGuid())
  62. .Select(i => GetItemStub(i, ImageType.Backdrop))
  63. .Where(i => i != null)
  64. .Take(30)
  65. .ToArray();
  66. view.ShowsItems = series
  67. .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath))
  68. .OrderBy(i => Guid.NewGuid())
  69. .Select(i => GetItemStub(i, ImageType.Primary))
  70. .Where(i => i != null)
  71. .Take(3)
  72. .ToArray();
  73. view.ActorItems = await GetActors(series).ConfigureAwait(false);
  74. return view;
  75. }
  76. public object Get(GetMovieView request)
  77. {
  78. var result = GetMovieView(request).Result;
  79. return ToOptimizedResult(result);
  80. }
  81. private async Task<MoviesView> GetMovieView(GetMovieView request)
  82. {
  83. var user = _userManager.GetUserById(request.UserId);
  84. var items = user.RootFolder.GetRecursiveChildren(user)
  85. .Where(i => i is Movie || i is Trailer || i is BoxSet)
  86. .ToList();
  87. // Exclude trailers from backdrops because they're not always 1080p
  88. var itemsWithBackdrops = items.Where(i => i.BackdropImagePaths.Count > 0 && !(i is Trailer))
  89. .ToList();
  90. var movies = items.OfType<Movie>().ToList();
  91. var moviesWithImages = movies
  92. .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath))
  93. .ToList();
  94. var view = new MoviesView();
  95. view.BackdropItems = itemsWithBackdrops
  96. .OrderBy(i => Guid.NewGuid())
  97. .Select(i => GetItemStub(i, ImageType.Backdrop))
  98. .Where(i => i != null)
  99. .Take(30)
  100. .ToArray();
  101. view.SpotlightItems = itemsWithBackdrops
  102. .OrderBy(i => Guid.NewGuid())
  103. .Select(i => GetItemStub(i, ImageType.Backdrop))
  104. .Where(i => i != null)
  105. .Take(30)
  106. .ToArray();
  107. view.MovieItems = moviesWithImages
  108. .OrderBy(i => Guid.NewGuid())
  109. .Select(i => GetItemStub(i, ImageType.Primary))
  110. .Where(i => i != null)
  111. .Take(3)
  112. .ToArray();
  113. view.TrailerItems = items
  114. .OfType<Trailer>()
  115. .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath))
  116. .OrderBy(i => Guid.NewGuid())
  117. .Select(i => GetItemStub(i, ImageType.Primary))
  118. .Where(i => i != null)
  119. .Take(3)
  120. .ToArray();
  121. view.BoxSetItems = items
  122. .OfType<BoxSet>()
  123. .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath))
  124. .OrderBy(i => Guid.NewGuid())
  125. .Select(i => GetItemStub(i, ImageType.Primary))
  126. .Where(i => i != null)
  127. .Take(3)
  128. .ToArray();
  129. view.PeopleItems = await GetActors(items).ConfigureAwait(false);
  130. view.ThreeDItems = moviesWithImages
  131. .Where(i => i.Is3D)
  132. .OrderBy(i => Guid.NewGuid())
  133. .Select(i => GetItemStub(i, ImageType.Primary))
  134. .Where(i => i != null)
  135. .Take(3)
  136. .ToArray();
  137. view.HDItems = moviesWithImages
  138. .Where(i => i.IsHd)
  139. .OrderBy(i => Guid.NewGuid())
  140. .Select(i => GetItemStub(i, ImageType.Primary))
  141. .Where(i => i != null)
  142. .Take(3)
  143. .ToArray();
  144. return view;
  145. }
  146. private async Task<ItemStub[]> GetActors(IEnumerable<BaseItem> mediaItems)
  147. {
  148. var actorStubs = new List<ItemStub>();
  149. var actors = mediaItems.SelectMany(i => i.People)
  150. .Select(i => i.Name)
  151. .Distinct(StringComparer.OrdinalIgnoreCase)
  152. .ToList();
  153. foreach (var actor in actors)
  154. {
  155. if (actorStubs.Count >= 3)
  156. {
  157. break;
  158. }
  159. try
  160. {
  161. var person = await _libraryManager.GetPerson(actor).ConfigureAwait(false);
  162. if (!string.IsNullOrEmpty(person.PrimaryImagePath))
  163. {
  164. var stub = GetItemStub(person, ImageType.Primary);
  165. if (stub != null)
  166. {
  167. actorStubs.Add(stub);
  168. }
  169. }
  170. }
  171. catch (Exception ex)
  172. {
  173. _logger.ErrorException("Error getting person {0}", ex, actor);
  174. }
  175. }
  176. return actorStubs.ToArray();
  177. }
  178. private ItemStub GetItemStub(BaseItem item, ImageType imageType)
  179. {
  180. var stub = new ItemStub
  181. {
  182. Id = _dtoService.GetDtoId(item),
  183. Name = item.Name
  184. };
  185. var imageManager = Kernel.Instance.ImageManager;
  186. try
  187. {
  188. var imagePath = imageManager.GetImagePath(item, imageType, 0);
  189. stub.ImageTag = imageManager.GetImageCacheTag(item, imageType, imagePath);
  190. }
  191. catch (Exception ex)
  192. {
  193. _logger.ErrorException("Error getting image tag for {0}", ex, item.Path);
  194. return null;
  195. }
  196. return stub;
  197. }
  198. }
  199. }