diff options
Diffstat (limited to 'MediaBrowser.Api/Images')
| -rw-r--r-- | MediaBrowser.Api/Images/ImageService.cs | 94 | ||||
| -rw-r--r-- | MediaBrowser.Api/Images/RemoteImageService.cs | 47 |
2 files changed, 70 insertions, 71 deletions
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 514e85655..8dfecceec 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -1,5 +1,6 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; @@ -334,12 +335,12 @@ namespace MediaBrowser.Api.Images private readonly IItemRepository _itemRepo; private readonly IDtoService _dtoService; private readonly IImageProcessor _imageProcessor; - + private readonly IFileSystem _fileSystem; /// <summary> /// Initializes a new instance of the <see cref="ImageService" /> class. /// </summary> - public ImageService(IUserManager userManager, ILibraryManager libraryManager, IApplicationPaths appPaths, IProviderManager providerManager, IItemRepository itemRepo, IDtoService dtoService, IImageProcessor imageProcessor) + public ImageService(IUserManager userManager, ILibraryManager libraryManager, IApplicationPaths appPaths, IProviderManager providerManager, IItemRepository itemRepo, IDtoService dtoService, IImageProcessor imageProcessor, IFileSystem fileSystem) { _userManager = userManager; _libraryManager = libraryManager; @@ -348,6 +349,7 @@ namespace MediaBrowser.Api.Images _itemRepo = itemRepo; _dtoService = dtoService; _imageProcessor = imageProcessor; + _fileSystem = fileSystem; } /// <summary> @@ -395,9 +397,9 @@ namespace MediaBrowser.Api.Images { var list = new List<ImageInfo>(); - foreach (var image in item.Images) + foreach (var image in item.ImageInfos.Where(i => !item.AllowsMultipleImages(i.Type))) { - var info = GetImageInfo(image.Value, item, null, image.Key); + var info = GetImageInfo(item, image, null); if (info != null) { @@ -405,28 +407,16 @@ namespace MediaBrowser.Api.Images } } - var index = 0; - - foreach (var image in item.BackdropImagePaths) + foreach (var imageType in item.ImageInfos.Select(i => i.Type).Distinct().Where(item.AllowsMultipleImages)) { - var info = GetImageInfo(image, item, index, ImageType.Backdrop); - - if (info != null) - { - list.Add(info); - } - - index++; - } + var index = 0; - index = 0; + // Prevent implicitly captured closure + var currentImageType = imageType; - var hasScreenshots = item as IHasScreenshots; - if (hasScreenshots != null) - { - foreach (var image in hasScreenshots.ScreenshotImagePaths) + foreach (var image in item.ImageInfos.Where(i => i.Type == currentImageType)) { - var info = GetImageInfo(image, item, index, ImageType.Screenshot); + var info = GetImageInfo(item, image, index); if (info != null) { @@ -441,7 +431,7 @@ namespace MediaBrowser.Api.Images if (video != null) { - index = 0; + var index = 0; foreach (var chapter in _itemRepo.GetChapters(video.Id)) { @@ -449,7 +439,13 @@ namespace MediaBrowser.Api.Images { var image = chapter.ImagePath; - var info = GetImageInfo(image, item, index, ImageType.Chapter); + var info = GetImageInfo(item, new ItemImageInfo + { + Path = image, + Type = ImageType.Chapter, + DateModified = _fileSystem.GetLastWriteTimeUtc(image) + + }, index); if (info != null) { @@ -464,20 +460,20 @@ namespace MediaBrowser.Api.Images return list; } - private ImageInfo GetImageInfo(string path, IHasImages item, int? imageIndex, ImageType type) + private ImageInfo GetImageInfo(IHasImages item, ItemImageInfo info, int? imageIndex) { try { - var fileInfo = new FileInfo(path); + var fileInfo = new FileInfo(info.Path); - var size = _imageProcessor.GetImageSize(path); + var size = _imageProcessor.GetImageSize(info.Path); return new ImageInfo { - Path = path, + Path = info.Path, ImageIndex = imageIndex, - ImageType = type, - ImageTag = _imageProcessor.GetImageCacheTag(item, type, path), + ImageType = info.Type, + ImageTag = _imageProcessor.GetImageCacheTag(item, info), Size = fileInfo.Length, Width = Convert.ToInt32(size.Width), Height = Convert.ToInt32(size.Height) @@ -485,7 +481,7 @@ namespace MediaBrowser.Api.Images } catch (Exception ex) { - Logger.ErrorException("Error getting image information for {0}", ex, path); + Logger.ErrorException("Error getting image information for {0}", ex, info.Path); return null; } @@ -584,7 +580,7 @@ namespace MediaBrowser.Api.Images { var item = _userManager.Users.First(i => i.Id == request.Id); - var task = item.DeleteImage(request.Type, request.Index); + var task = item.DeleteImage(request.Type, request.Index ?? 0); Task.WaitAll(task); } @@ -597,7 +593,7 @@ namespace MediaBrowser.Api.Images { var item = _libraryManager.GetItemById(request.Id); - var task = item.DeleteImage(request.Type, request.Index); + var task = item.DeleteImage(request.Type, request.Index ?? 0); Task.WaitAll(task); } @@ -613,7 +609,7 @@ namespace MediaBrowser.Api.Images var item = GetItemByName(request.Name, type, _libraryManager); - var task = item.DeleteImage(request.Type, request.Index); + var task = item.DeleteImage(request.Type, request.Index ?? 0); Task.WaitAll(task); } @@ -671,15 +667,15 @@ namespace MediaBrowser.Api.Images /// </exception> public object GetImage(ImageRequest request, IHasImages item) { - var imagePath = GetImagePath(request, item); + var imageInfo = GetImageInfo(request, item); - if (string.IsNullOrEmpty(imagePath)) + if (imageInfo == null) { throw new ResourceNotFoundException(string.Format("{0} does not have an image of type {1}", item.Name, request.Type)); } // See if we can avoid a file system lookup by looking for the file in ResolveArgs - var originalFileImageDateModified = item.GetImageDateModified(imagePath); + var originalFileImageDateModified = imageInfo.DateModified; var supportedImageEnhancers = request.EnableImageEnhancers ? _imageProcessor.ImageEnhancers.Where(i => { @@ -696,16 +692,9 @@ namespace MediaBrowser.Api.Images }).ToList() : new List<IImageEnhancer>(); - // 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 = GetMimeType(request.Format, imagePath); + var contentType = GetMimeType(request.Format, imageInfo.Path); - var cacheGuid = _imageProcessor.GetImageCacheTag(item, request.Type, imagePath, originalFileImageDateModified, supportedImageEnhancers); + var cacheGuid = _imageProcessor.GetImageCacheTag(item, request.Type, imageInfo.Path, originalFileImageDateModified, supportedImageEnhancers); TimeSpan? cacheDuration = null; @@ -724,7 +713,7 @@ namespace MediaBrowser.Api.Images Request = currentRequest, OriginalImageDateModified = originalFileImageDateModified, Enhancers = supportedImageEnhancers, - OriginalImagePath = imagePath, + OriginalImagePath = imageInfo.Path, ImageProcessor = _imageProcessor }, contentType); @@ -758,11 +747,11 @@ namespace MediaBrowser.Api.Images /// <param name="request">The request.</param> /// <param name="item">The item.</param> /// <returns>System.String.</returns> - private string GetImagePath(ImageRequest request, IHasImages item) + private ItemImageInfo GetImageInfo(ImageRequest request, IHasImages item) { var index = request.Index ?? 0; - return item.GetImagePath(request.Type, index); + return item.GetImageInfo(request.Type, index); } /// <summary> @@ -800,12 +789,7 @@ namespace MediaBrowser.Api.Images await _providerManager.SaveImage(entity, memoryStream, mimeType, imageType, null, CancellationToken.None).ConfigureAwait(false); - await entity.RefreshMetadata(new MetadataRefreshOptions - { - ImageRefreshMode = ImageRefreshMode.ValidationOnly, - ForceSave = true - - }, CancellationToken.None).ConfigureAwait(false); + await entity.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); } } } diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs index deba146e8..36b509c74 100644 --- a/MediaBrowser.Api/Images/RemoteImageService.cs +++ b/MediaBrowser.Api/Images/RemoteImageService.cs @@ -40,6 +40,9 @@ namespace MediaBrowser.Api.Images [ApiMember(Name = "ProviderName", Description = "Optional. The image provider to use", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string ProviderName { get; set; } + + [ApiMember(Name = "IncludeAllLanguages", Description = "Optional.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] + public bool IncludeAllLanguages { get; set; } } [Route("/Items/{Id}/RemoteImages", "GET")] @@ -145,8 +148,8 @@ namespace MediaBrowser.Api.Images [Api(Description = "Gets a remote image")] public class GetRemoteImage { - [ApiMember(Name = "Url", Description = "The image url", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] - public string Url { get; set; } + [ApiMember(Name = "ImageUrl", Description = "The image url", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] + public string ImageUrl { get; set; } } public class RemoteImageService : BaseApiService @@ -193,7 +196,7 @@ namespace MediaBrowser.Api.Images private List<ImageProviderInfo> GetImageProviders(BaseItem item) { - return _providerManager.GetImageProviderInfo(item).ToList(); + return _providerManager.GetRemoteImageProviderInfo(item).ToList(); } public object Get(GetRemoteImages request) @@ -217,14 +220,28 @@ namespace MediaBrowser.Api.Images private RemoteImageResult GetRemoteImageResult(BaseItem item, BaseRemoteImageRequest request) { - var images = _providerManager.GetAvailableRemoteImages(item, CancellationToken.None, request.ProviderName, request.Type).Result; + var images = _providerManager.GetAvailableRemoteImages(item, new RemoteImageQuery + { + ProviderName = request.ProviderName, + IncludeAllLanguages = request.IncludeAllLanguages, + IncludeDisabledProviders = true, + ImageType = request.Type + + }, CancellationToken.None).Result; var imagesList = images.ToList(); + var allProviders = _providerManager.GetRemoteImageProviderInfo(item); + + if (request.Type.HasValue) + { + allProviders = allProviders.Where(i => i.SupportedImages.Contains(request.Type.Value)); + } + var result = new RemoteImageResult { TotalRecordCount = imagesList.Count, - Providers = images.Select(i => i.ProviderName) + Providers = allProviders.Select(i => i.Name) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList() }; @@ -281,13 +298,7 @@ namespace MediaBrowser.Api.Images { await _providerManager.SaveImage(item, request.ImageUrl, null, request.Type, null, CancellationToken.None).ConfigureAwait(false); - await item.RefreshMetadata(new MetadataRefreshOptions - { - ForceSave = true, - ImageRefreshMode = ImageRefreshMode.ValidationOnly, - MetadataRefreshMode = MetadataRefreshMode.None - - }, CancellationToken.None).ConfigureAwait(false); + await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); } /// <summary> @@ -309,7 +320,7 @@ namespace MediaBrowser.Api.Images /// <returns>Task{System.Object}.</returns> private async Task<object> GetRemoteImage(GetRemoteImage request) { - var urlHash = request.Url.GetMD5(); + var urlHash = request.ImageUrl.GetMD5(); var pointerCachePath = GetFullCachePath(urlHash.ToString()); string contentPath; @@ -326,12 +337,16 @@ namespace MediaBrowser.Api.Images return ToStaticFileResult(contentPath); } } + catch (DirectoryNotFoundException) + { + // Means the file isn't cached yet + } catch (FileNotFoundException) { // Means the file isn't cached yet } - await DownloadImage(request.Url, urlHash, pointerCachePath).ConfigureAwait(false); + await DownloadImage(request.ImageUrl, urlHash, pointerCachePath).ConfigureAwait(false); // Read the pointer file again using (var reader = new StreamReader(pointerCachePath)) @@ -362,7 +377,6 @@ namespace MediaBrowser.Api.Images var fullCachePath = GetFullCachePath(urlHash + "." + ext); Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath)); - using (var stream = result.Content) { using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileMode.Create, FileAccess.Write, FileShare.Read, true)) @@ -371,6 +385,7 @@ namespace MediaBrowser.Api.Images } } + Directory.CreateDirectory(Path.GetDirectoryName(pointerCachePath)); using (var writer = new StreamWriter(pointerCachePath)) { await writer.WriteAsync(fullCachePath).ConfigureAwait(false); @@ -384,7 +399,7 @@ namespace MediaBrowser.Api.Images /// <returns>System.String.</returns> private string GetFullCachePath(string filename) { - return Path.Combine(_appPaths.DownloadedImagesDataPath, filename.Substring(0, 1), filename); + return Path.Combine(_appPaths.CachePath, "remote-images", filename.Substring(0, 1), filename); } } } |
