ImageHandler.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. using MediaBrowser.Common.Logging;
  2. using MediaBrowser.Common.Net;
  3. using MediaBrowser.Common.Net.Handlers;
  4. using MediaBrowser.Controller;
  5. using MediaBrowser.Controller.Entities;
  6. using MediaBrowser.Model.Entities;
  7. using System;
  8. using System.ComponentModel.Composition;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Net;
  12. using System.Threading.Tasks;
  13. namespace MediaBrowser.Api.HttpHandlers
  14. {
  15. [Export(typeof(BaseHandler))]
  16. public class ImageHandler : BaseHandler
  17. {
  18. public override bool HandlesRequest(HttpListenerRequest request)
  19. {
  20. return ApiService.IsApiUrlMatch("image", request);
  21. }
  22. private string _imagePath;
  23. private async Task<string> GetImagePath()
  24. {
  25. if (_imagePath == null)
  26. {
  27. _imagePath = await DiscoverImagePath();
  28. }
  29. return _imagePath;
  30. }
  31. private async Task<string> DiscoverImagePath()
  32. {
  33. string personName = QueryString["personname"];
  34. if (!string.IsNullOrEmpty(personName))
  35. {
  36. return (await Kernel.Instance.ItemController.GetPerson(personName).ConfigureAwait(false)).PrimaryImagePath;
  37. }
  38. string genreName = QueryString["genre"];
  39. if (!string.IsNullOrEmpty(genreName))
  40. {
  41. return (await Kernel.Instance.ItemController.GetGenre(genreName).ConfigureAwait(false)).PrimaryImagePath;
  42. }
  43. string year = QueryString["year"];
  44. if (!string.IsNullOrEmpty(year))
  45. {
  46. return (await Kernel.Instance.ItemController.GetYear(int.Parse(year)).ConfigureAwait(false)).PrimaryImagePath;
  47. }
  48. string studio = QueryString["studio"];
  49. if (!string.IsNullOrEmpty(studio))
  50. {
  51. return (await Kernel.Instance.ItemController.GetStudio(studio).ConfigureAwait(false)).PrimaryImagePath;
  52. }
  53. string userId = QueryString["userid"];
  54. if (!string.IsNullOrEmpty(userId))
  55. {
  56. return ApiService.GetUserById(userId, false).PrimaryImagePath;
  57. }
  58. BaseItem item = ApiService.GetItemById(QueryString["id"]);
  59. string imageIndex = QueryString["index"];
  60. int index = string.IsNullOrEmpty(imageIndex) ? 0 : int.Parse(imageIndex);
  61. return GetImagePathFromTypes(item, ImageType, index);
  62. }
  63. private Stream _sourceStream;
  64. private async Task<Stream> GetSourceStream()
  65. {
  66. await EnsureSourceStream().ConfigureAwait(false);
  67. return _sourceStream;
  68. }
  69. private bool _sourceStreamEnsured;
  70. private async Task EnsureSourceStream()
  71. {
  72. if (!_sourceStreamEnsured)
  73. {
  74. try
  75. {
  76. _sourceStream = File.OpenRead(await GetImagePath().ConfigureAwait(false));
  77. }
  78. catch (FileNotFoundException ex)
  79. {
  80. StatusCode = 404;
  81. Logger.LogException(ex);
  82. }
  83. catch (DirectoryNotFoundException ex)
  84. {
  85. StatusCode = 404;
  86. Logger.LogException(ex);
  87. }
  88. catch (UnauthorizedAccessException ex)
  89. {
  90. StatusCode = 403;
  91. Logger.LogException(ex);
  92. }
  93. finally
  94. {
  95. _sourceStreamEnsured = true;
  96. }
  97. }
  98. }
  99. public async override Task<string> GetContentType()
  100. {
  101. await EnsureSourceStream().ConfigureAwait(false);
  102. if (await GetSourceStream().ConfigureAwait(false) == null)
  103. {
  104. return null;
  105. }
  106. return MimeTypes.GetMimeType(await GetImagePath().ConfigureAwait(false));
  107. }
  108. public override TimeSpan CacheDuration
  109. {
  110. get
  111. {
  112. return TimeSpan.FromDays(365);
  113. }
  114. }
  115. protected async override Task<DateTime?> GetLastDateModified()
  116. {
  117. await EnsureSourceStream().ConfigureAwait(false);
  118. if (await GetSourceStream().ConfigureAwait(false) == null)
  119. {
  120. return null;
  121. }
  122. return File.GetLastWriteTimeUtc(await GetImagePath().ConfigureAwait(false));
  123. }
  124. private int? Height
  125. {
  126. get
  127. {
  128. string val = QueryString["height"];
  129. if (string.IsNullOrEmpty(val))
  130. {
  131. return null;
  132. }
  133. return int.Parse(val);
  134. }
  135. }
  136. private int? Width
  137. {
  138. get
  139. {
  140. string val = QueryString["width"];
  141. if (string.IsNullOrEmpty(val))
  142. {
  143. return null;
  144. }
  145. return int.Parse(val);
  146. }
  147. }
  148. private int? MaxHeight
  149. {
  150. get
  151. {
  152. string val = QueryString["maxheight"];
  153. if (string.IsNullOrEmpty(val))
  154. {
  155. return null;
  156. }
  157. return int.Parse(val);
  158. }
  159. }
  160. private int? MaxWidth
  161. {
  162. get
  163. {
  164. string val = QueryString["maxwidth"];
  165. if (string.IsNullOrEmpty(val))
  166. {
  167. return null;
  168. }
  169. return int.Parse(val);
  170. }
  171. }
  172. private int? Quality
  173. {
  174. get
  175. {
  176. string val = QueryString["quality"];
  177. if (string.IsNullOrEmpty(val))
  178. {
  179. return null;
  180. }
  181. return int.Parse(val);
  182. }
  183. }
  184. private ImageType ImageType
  185. {
  186. get
  187. {
  188. string imageType = QueryString["type"];
  189. if (string.IsNullOrEmpty(imageType))
  190. {
  191. return ImageType.Primary;
  192. }
  193. return (ImageType)Enum.Parse(typeof(ImageType), imageType, true);
  194. }
  195. }
  196. protected override async Task WriteResponseToOutputStream(Stream stream)
  197. {
  198. ImageProcessor.ProcessImage(await GetSourceStream().ConfigureAwait(false), stream, Width, Height, MaxWidth, MaxHeight, Quality);
  199. }
  200. private string GetImagePathFromTypes(BaseItem item, ImageType imageType, int imageIndex)
  201. {
  202. if (imageType == ImageType.Logo)
  203. {
  204. return item.LogoImagePath;
  205. }
  206. if (imageType == ImageType.Backdrop)
  207. {
  208. return item.BackdropImagePaths.ElementAt(imageIndex);
  209. }
  210. if (imageType == ImageType.Banner)
  211. {
  212. return item.BannerImagePath;
  213. }
  214. if (imageType == ImageType.Art)
  215. {
  216. return item.ArtImagePath;
  217. }
  218. if (imageType == ImageType.Thumbnail)
  219. {
  220. return item.ThumbnailImagePath;
  221. }
  222. return item.PrimaryImagePath;
  223. }
  224. }
  225. }