From 767cdc1f6f6a63ce997fc9476911e2c361f9d402 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Wed, 20 Feb 2013 20:33:05 -0500 Subject: Pushing missing changes --- MediaBrowser.Api/Images/ImageService.cs | 286 ++++++++++++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 MediaBrowser.Api/Images/ImageService.cs (limited to 'MediaBrowser.Api/Images/ImageService.cs') diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs new file mode 100644 index 0000000000..5e5888b3e5 --- /dev/null +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -0,0 +1,286 @@ +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Model.Entities; +using ServiceStack.ServiceHost; +using System; +using System.ComponentModel.Composition; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace MediaBrowser.Api.Images +{ + /// + /// Class GetItemImage + /// + [Route("/Items/{Id}/Images/{Type}", "GET")] + [Route("/Items/{Id}/Images/{Type}/{Index}", "GET")] + public class GetItemImage : ImageRequest + { + /// + /// Gets or sets the id. + /// + /// The id. + public string Id { get; set; } + } + + /// + /// Class GetPersonImage + /// + [Route("/Persons/{Name}/Images/{Type}", "GET")] + [Route("/Persons/{Name}/Images/{Type}/{Index}", "GET")] + public class GetPersonImage : ImageRequest + { + /// + /// Gets or sets the name. + /// + /// The name. + public string Name { get; set; } + } + + /// + /// Class GetStudioImage + /// + [Route("/Studios/{Name}/Images/{Type}", "GET")] + [Route("/Studios/{Name}/Images/{Type}/{Index}", "GET")] + public class GetStudioImage : ImageRequest + { + /// + /// Gets or sets the name. + /// + /// The name. + public string Name { get; set; } + } + + /// + /// Class GetGenreImage + /// + [Route("/Genres/{Name}/Images/{Type}", "GET")] + [Route("/Genres/{Name}/Images/{Type}/{Index}", "GET")] + public class GetGenreImage : ImageRequest + { + /// + /// Gets or sets the name. + /// + /// The name. + public string Name { get; set; } + } + + /// + /// Class GetYearImage + /// + [Route("/Years/{Year}/Images/{Type}", "GET")] + [Route("/Years/{Year}/Images/{Type}/{Index}", "GET")] + public class GetYearImage : ImageRequest + { + /// + /// Gets or sets the year. + /// + /// The year. + public int Year { get; set; } + } + + /// + /// Class GetUserImage + /// + [Route("/Users/{Id}/Images/{Type}", "GET")] + [Route("/Users/{Id}/Images/{Type}/{Index}", "GET")] + public class GetUserImage : ImageRequest + { + /// + /// Gets or sets the id. + /// + /// The id. + public Guid Id { get; set; } + } + + /// + /// Class DeleteUserImage + /// + [Route("/Users/{Id}/Images/{Type}", "DELETE")] + [Route("/Users/{Id}/Images/{Type}/{Index}", "DELETE")] + public class DeleteUserImage : DeleteImageRequest + { + /// + /// Gets or sets the id. + /// + /// The id. + public Guid Id { get; set; } + } + + /// + /// Class ImageService + /// + [Export(typeof(IRestfulService))] + public class ImageService : BaseRestService + { + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetItemImage request) + { + var item = DtoBuilder.GetItemByClientId(request.Id); + + return GetImage(request, item); + } + + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetUserImage request) + { + var kernel = (Kernel)Kernel; + + var item = kernel.Users.First(i => i.Id == request.Id); + + return GetImage(request, item); + } + + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetYearImage request) + { + var kernel = (Kernel)Kernel; + + var item = kernel.LibraryManager.GetYear(request.Year).Result; + + return GetImage(request, item); + } + + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetStudioImage request) + { + var kernel = (Kernel)Kernel; + + var item = kernel.LibraryManager.GetStudio(request.Name).Result; + + return GetImage(request, item); + } + + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetPersonImage request) + { + var kernel = (Kernel)Kernel; + + var item = kernel.LibraryManager.GetPerson(request.Name).Result; + + return GetImage(request, item); + } + + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetGenreImage request) + { + var kernel = (Kernel)Kernel; + + var item = kernel.LibraryManager.GetGenre(request.Name).Result; + + return GetImage(request, item); + } + + /// + /// Deletes the specified request. + /// + /// The request. + public void Delete(DeleteUserImage request) + { + var kernel = (Kernel)Kernel; + + var item = kernel.Users.First(i => i.Id == request.Id); + + var task = item.DeleteImage(request.Type); + + Task.WaitAll(task); + } + + /// + /// Gets the image. + /// + /// The request. + /// The item. + /// System.Object. + /// + private object GetImage(ImageRequest request, BaseItem item) + { + var kernel = (Kernel)Kernel; + + var index = request.Index ?? 0; + + var imagePath = GetImagePath(kernel, request, item); + + if (string.IsNullOrEmpty(imagePath)) + { + throw new ResourceNotFoundException(); + } + + // See if we can avoid a file system lookup by looking for the file in ResolveArgs + var originalFileImageDateModified = kernel.ImageManager.GetImageDateModified(item, request.Type, index); + + var supportedImageEnhancers = kernel.ImageEnhancers.Where(i => i.Supports(item, request.Type)).ToList(); + + // If the file does not exist GetLastWriteTimeUtc will return jan 1, 1601 as opposed to throwing an exception + // http://msdn.microsoft.com/en-us/library/system.io.file.getlastwritetimeutc.aspx + if (originalFileImageDateModified.Year == 1601 && !File.Exists(imagePath)) + { + throw new ResourceNotFoundException(string.Format("File not found: {0}", imagePath)); + } + + var contentType = MimeTypes.GetMimeType(imagePath); + var dateLastModified = (supportedImageEnhancers.Select(e => e.LastConfigurationChange(item, request.Type)).Concat(new[] { originalFileImageDateModified })).Max(); + + var cacheGuid = kernel.ImageManager.GetImageCacheTag(imagePath, originalFileImageDateModified, supportedImageEnhancers, item, request.Type); + + TimeSpan? cacheDuration = null; + + if (!string.IsNullOrEmpty(request.Tag) && cacheGuid == new Guid(request.Tag)) + { + cacheDuration = TimeSpan.FromDays(365); + } + + return ToCachedResult(cacheGuid, dateLastModified, cacheDuration, () => new ImageWriter + { + Item = item, + Request = request, + CropWhiteSpace = request.Type == ImageType.Logo || request.Type == ImageType.Art, + OriginalImageDateModified = originalFileImageDateModified, + ContentType = contentType + + }, contentType); + } + + /// + /// Gets the image path. + /// + /// The kernel. + /// The request. + /// The item. + /// System.String. + private string GetImagePath(Kernel kernel, ImageRequest request, BaseItem item) + { + var index = request.Index ?? 0; + + return kernel.ImageManager.GetImagePath(item, request.Type, index); + } + } +} -- cgit v1.2.3