aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/Images
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/Images')
-rw-r--r--MediaBrowser.Api/Images/ImageByNameService.cs277
-rw-r--r--MediaBrowser.Api/Images/ImageRequest.cs100
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs771
-rw-r--r--MediaBrowser.Api/Images/RemoteImageService.cs298
4 files changed, 0 insertions, 1446 deletions
diff --git a/MediaBrowser.Api/Images/ImageByNameService.cs b/MediaBrowser.Api/Images/ImageByNameService.cs
deleted file mode 100644
index 45b7d0c10..000000000
--- a/MediaBrowser.Api/Images/ImageByNameService.cs
+++ /dev/null
@@ -1,277 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Net;
-using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Services;
-using Microsoft.Extensions.Logging;
-
-namespace MediaBrowser.Api.Images
-{
- /// <summary>
- /// Class GetGeneralImage
- /// </summary>
- [Route("/Images/General/{Name}/{Type}", "GET", Summary = "Gets a general image by name")]
- public class GetGeneralImage
- {
- /// <summary>
- /// Gets or sets the name.
- /// </summary>
- /// <value>The name.</value>
- [ApiMember(Name = "Name", Description = "The name of the image", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Name { get; set; }
-
- [ApiMember(Name = "Type", Description = "Image Type (primary, backdrop, logo, etc).", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Type { get; set; }
- }
-
- /// <summary>
- /// Class GetRatingImage
- /// </summary>
- [Route("/Images/Ratings/{Theme}/{Name}", "GET", Summary = "Gets a rating image by name")]
- public class GetRatingImage
- {
- /// <summary>
- /// Gets or sets the name.
- /// </summary>
- /// <value>The name.</value>
- [ApiMember(Name = "Name", Description = "The name of the image", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Name { get; set; }
-
- /// <summary>
- /// Gets or sets the theme.
- /// </summary>
- /// <value>The theme.</value>
- [ApiMember(Name = "Theme", Description = "The theme to get the image from", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Theme { get; set; }
- }
-
- /// <summary>
- /// Class GetMediaInfoImage
- /// </summary>
- [Route("/Images/MediaInfo/{Theme}/{Name}", "GET", Summary = "Gets a media info image by name")]
- public class GetMediaInfoImage
- {
- /// <summary>
- /// Gets or sets the name.
- /// </summary>
- /// <value>The name.</value>
- [ApiMember(Name = "Name", Description = "The name of the image", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Name { get; set; }
-
- /// <summary>
- /// Gets or sets the theme.
- /// </summary>
- /// <value>The theme.</value>
- [ApiMember(Name = "Theme", Description = "The theme to get the image from", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Theme { get; set; }
- }
-
- [Route("/Images/MediaInfo", "GET", Summary = "Gets all media info image by name")]
- [Authenticated]
- public class GetMediaInfoImages : IReturn<List<ImageByNameInfo>>
- {
- }
-
- [Route("/Images/Ratings", "GET", Summary = "Gets all rating images by name")]
- [Authenticated]
- public class GetRatingImages : IReturn<List<ImageByNameInfo>>
- {
- }
-
- [Route("/Images/General", "GET", Summary = "Gets all general images by name")]
- [Authenticated]
- public class GetGeneralImages : IReturn<List<ImageByNameInfo>>
- {
- }
-
- /// <summary>
- /// Class ImageByNameService
- /// </summary>
- public class ImageByNameService : BaseApiService
- {
- /// <summary>
- /// The _app paths
- /// </summary>
- private readonly IServerApplicationPaths _appPaths;
-
- private readonly IFileSystem _fileSystem;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="ImageByNameService" /> class.
- /// </summary>
- public ImageByNameService(
- ILogger<ImageByNameService> logger,
- IServerConfigurationManager serverConfigurationManager,
- IHttpResultFactory resultFactory,
- IFileSystem fileSystem)
- : base(logger, serverConfigurationManager, resultFactory)
- {
- _appPaths = serverConfigurationManager.ApplicationPaths;
- _fileSystem = fileSystem;
- }
-
- public object Get(GetMediaInfoImages request)
- {
- return ToOptimizedResult(GetImageList(_appPaths.MediaInfoImagesPath, true));
- }
-
- public object Get(GetRatingImages request)
- {
- return ToOptimizedResult(GetImageList(_appPaths.RatingsPath, true));
- }
-
- public object Get(GetGeneralImages request)
- {
- return ToOptimizedResult(GetImageList(_appPaths.GeneralPath, false));
- }
-
- private List<ImageByNameInfo> GetImageList(string path, bool supportsThemes)
- {
- try
- {
- return _fileSystem.GetFiles(path, BaseItem.SupportedImageExtensions, false, true)
- .Select(i => new ImageByNameInfo
- {
- Name = _fileSystem.GetFileNameWithoutExtension(i),
- FileLength = i.Length,
-
- // For themeable images, use the Theme property
- // For general images, the same object structure is fine,
- // but it's not owned by a theme, so call it Context
- Theme = supportsThemes ? GetThemeName(i.FullName, path) : null,
- Context = supportsThemes ? null : GetThemeName(i.FullName, path),
-
- Format = i.Extension.ToLowerInvariant().TrimStart('.')
- })
- .OrderBy(i => i.Name)
- .ToList();
- }
- catch (IOException)
- {
- return new List<ImageByNameInfo>();
- }
- }
-
- private string GetThemeName(string path, string rootImagePath)
- {
- var parentName = Path.GetDirectoryName(path);
-
- if (string.Equals(parentName, rootImagePath, StringComparison.OrdinalIgnoreCase))
- {
- return null;
- }
-
- parentName = Path.GetFileName(parentName);
-
- return string.Equals(parentName, "all", StringComparison.OrdinalIgnoreCase) ?
- null :
- parentName;
- }
-
- /// <summary>
- /// Gets the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <returns>System.Object.</returns>
- public Task<object> Get(GetGeneralImage request)
- {
- var filename = string.Equals(request.Type, "primary", StringComparison.OrdinalIgnoreCase)
- ? "folder"
- : request.Type;
-
- var paths = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(_appPaths.GeneralPath, request.Name, filename + i)).ToList();
-
- var path = paths.FirstOrDefault(File.Exists) ?? paths.FirstOrDefault();
-
- return ResultFactory.GetStaticFileResult(Request, path);
- }
-
- /// <summary>
- /// Gets the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <returns>System.Object.</returns>
- public object Get(GetRatingImage request)
- {
- var themeFolder = Path.Combine(_appPaths.RatingsPath, request.Theme);
-
- if (Directory.Exists(themeFolder))
- {
- var path = BaseItem.SupportedImageExtensions
- .Select(i => Path.Combine(themeFolder, request.Name + i))
- .FirstOrDefault(File.Exists);
-
- if (!string.IsNullOrEmpty(path))
- {
- return ResultFactory.GetStaticFileResult(Request, path);
- }
- }
-
- var allFolder = Path.Combine(_appPaths.RatingsPath, "all");
-
- if (Directory.Exists(allFolder))
- {
- // Avoid implicitly captured closure
- var currentRequest = request;
-
- var path = BaseItem.SupportedImageExtensions
- .Select(i => Path.Combine(allFolder, currentRequest.Name + i))
- .FirstOrDefault(File.Exists);
-
- if (!string.IsNullOrEmpty(path))
- {
- return ResultFactory.GetStaticFileResult(Request, path);
- }
- }
-
- throw new ResourceNotFoundException("MediaInfo image not found: " + request.Name);
- }
-
- /// <summary>
- /// Gets the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <returns>System.Object.</returns>
- public Task<object> Get(GetMediaInfoImage request)
- {
- var themeFolder = Path.Combine(_appPaths.MediaInfoImagesPath, request.Theme);
-
- if (Directory.Exists(themeFolder))
- {
- var path = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(themeFolder, request.Name + i))
- .FirstOrDefault(File.Exists);
-
- if (!string.IsNullOrEmpty(path))
- {
- return ResultFactory.GetStaticFileResult(Request, path);
- }
- }
-
- var allFolder = Path.Combine(_appPaths.MediaInfoImagesPath, "all");
-
- if (Directory.Exists(allFolder))
- {
- // Avoid implicitly captured closure
- var currentRequest = request;
-
- var path = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(allFolder, currentRequest.Name + i))
- .FirstOrDefault(File.Exists);
-
- if (!string.IsNullOrEmpty(path))
- {
- return ResultFactory.GetStaticFileResult(Request, path);
- }
- }
-
- throw new ResourceNotFoundException("MediaInfo image not found: " + request.Name);
- }
- }
-}
diff --git a/MediaBrowser.Api/Images/ImageRequest.cs b/MediaBrowser.Api/Images/ImageRequest.cs
deleted file mode 100644
index 71ff09b63..000000000
--- a/MediaBrowser.Api/Images/ImageRequest.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Services;
-
-namespace MediaBrowser.Api.Images
-{
- /// <summary>
- /// Class ImageRequest
- /// </summary>
- public class ImageRequest : DeleteImageRequest
- {
- /// <summary>
- /// The max width
- /// </summary>
- [ApiMember(Name = "MaxWidth", Description = "The maximum image width to return.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int? MaxWidth { get; set; }
-
- /// <summary>
- /// The max height
- /// </summary>
- [ApiMember(Name = "MaxHeight", Description = "The maximum image height to return.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int? MaxHeight { get; set; }
-
- /// <summary>
- /// The width
- /// </summary>
- [ApiMember(Name = "Width", Description = "The fixed image width to return.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int? Width { get; set; }
-
- /// <summary>
- /// The height
- /// </summary>
- [ApiMember(Name = "Height", Description = "The fixed image height to return.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int? Height { get; set; }
-
- /// <summary>
- /// Gets or sets the quality.
- /// </summary>
- /// <value>The quality.</value>
- [ApiMember(Name = "Quality", Description = "Optional quality setting, from 0-100. Defaults to 90 and should suffice in most cases.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int? Quality { get; set; }
-
- /// <summary>
- /// Gets or sets the tag.
- /// </summary>
- /// <value>The tag.</value>
- [ApiMember(Name = "Tag", Description = "Optional. Supply the cache tag from the item object to receive strong caching headers.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
- public string Tag { get; set; }
-
- [ApiMember(Name = "CropWhitespace", Description = "Specify if whitespace should be cropped out of the image. True/False. If unspecified, whitespace will be cropped from logos and clear art.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
- public bool? CropWhitespace { get; set; }
-
- [ApiMember(Name = "EnableImageEnhancers", Description = "Enable or disable image enhancers such as cover art.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
- public bool EnableImageEnhancers { get; set; }
-
- [ApiMember(Name = "Format", Description = "Determines the output foramt of the image - original,gif,jpg,png", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
- public string Format { get; set; }
-
- [ApiMember(Name = "AddPlayedIndicator", Description = "Optional. Add a played indicator", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
- public bool AddPlayedIndicator { get; set; }
-
- [ApiMember(Name = "PercentPlayed", Description = "Optional percent to render for the percent played overlay", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public double? PercentPlayed { get; set; }
-
- [ApiMember(Name = "UnplayedCount", Description = "Optional unplayed count overlay to render", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int? UnplayedCount { get; set; }
-
- public int? Blur { get; set; }
-
- [ApiMember(Name = "BackgroundColor", Description = "Optional. Apply a background color for transparent images.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
- public string BackgroundColor { get; set; }
-
- [ApiMember(Name = "ForegroundLayer", Description = "Optional. Apply a foreground layer on top of the image.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
- public string ForegroundLayer { get; set; }
-
- public ImageRequest()
- {
- EnableImageEnhancers = true;
- }
- }
-
- /// <summary>
- /// Class DeleteImageRequest
- /// </summary>
- public class DeleteImageRequest
- {
- /// <summary>
- /// Gets or sets the type of the image.
- /// </summary>
- /// <value>The type of the image.</value>
- [ApiMember(Name = "Type", Description = "Image Type", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET,POST,DELETE")]
- public ImageType Type { get; set; }
-
- /// <summary>
- /// Gets or sets the index.
- /// </summary>
- /// <value>The index.</value>
- [ApiMember(Name = "Index", Description = "Image Index", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET,POST,DELETE")]
- public int? Index { get; set; }
- }
-}
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
deleted file mode 100644
index 2e9b3e6cb..000000000
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ /dev/null
@@ -1,771 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Drawing;
-using MediaBrowser.Controller.Dto;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Net;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Drawing;
-using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Services;
-using Microsoft.Extensions.Logging;
-using Microsoft.Net.Http.Headers;
-
-namespace MediaBrowser.Api.Images
-{
- /// <summary>
- /// Class GetItemImage.
- /// </summary>
- [Route("/Items/{Id}/Images", "GET", Summary = "Gets information about an item's images")]
- [Authenticated]
- public class GetItemImageInfos : IReturn<List<ImageInfo>>
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Id { get; set; }
- }
-
- [Route("/Items/{Id}/Images/{Type}", "GET")]
- [Route("/Items/{Id}/Images/{Type}/{Index}", "GET")]
- [Route("/Items/{Id}/Images/{Type}", "HEAD")]
- [Route("/Items/{Id}/Images/{Type}/{Index}", "HEAD")]
- [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}/{PercentPlayed}/{UnplayedCount}", "GET")]
- [Route("/Items/{Id}/Images/{Type}/{Index}/{Tag}/{Format}/{MaxWidth}/{MaxHeight}/{PercentPlayed}/{UnplayedCount}", "HEAD")]
- public class GetItemImage : ImageRequest
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path")]
- public Guid Id { get; set; }
- }
-
- /// <summary>
- /// Class UpdateItemImageIndex
- /// </summary>
- [Route("/Items/{Id}/Images/{Type}/{Index}/Index", "POST", Summary = "Updates the index for an item image")]
- [Authenticated(Roles = "admin")]
- public class UpdateItemImageIndex : IReturnVoid
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
- public string Id { get; set; }
-
- /// <summary>
- /// Gets or sets the type of the image.
- /// </summary>
- /// <value>The type of the image.</value>
- [ApiMember(Name = "Type", Description = "Image Type", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
- public ImageType Type { get; set; }
-
- /// <summary>
- /// Gets or sets the index.
- /// </summary>
- /// <value>The index.</value>
- [ApiMember(Name = "Index", Description = "Image Index", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "POST")]
- public int Index { get; set; }
-
- /// <summary>
- /// Gets or sets the new index.
- /// </summary>
- /// <value>The new index.</value>
- [ApiMember(Name = "NewIndex", Description = "The new image index", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
- public int NewIndex { get; set; }
- }
-
- /// <summary>
- /// Class GetPersonImage
- /// </summary>
- [Route("/Artists/{Name}/Images/{Type}", "GET")]
- [Route("/Artists/{Name}/Images/{Type}/{Index}", "GET")]
- [Route("/Genres/{Name}/Images/{Type}", "GET")]
- [Route("/Genres/{Name}/Images/{Type}/{Index}", "GET")]
- [Route("/MusicGenres/{Name}/Images/{Type}", "GET")]
- [Route("/MusicGenres/{Name}/Images/{Type}/{Index}", "GET")]
- [Route("/Persons/{Name}/Images/{Type}", "GET")]
- [Route("/Persons/{Name}/Images/{Type}/{Index}", "GET")]
- [Route("/Studios/{Name}/Images/{Type}", "GET")]
- [Route("/Studios/{Name}/Images/{Type}/{Index}", "GET")]
- ////[Route("/Years/{Year}/Images/{Type}", "GET")]
- ////[Route("/Years/{Year}/Images/{Type}/{Index}", "GET")]
- [Route("/Artists/{Name}/Images/{Type}", "HEAD")]
- [Route("/Artists/{Name}/Images/{Type}/{Index}", "HEAD")]
- [Route("/Genres/{Name}/Images/{Type}", "HEAD")]
- [Route("/Genres/{Name}/Images/{Type}/{Index}", "HEAD")]
- [Route("/MusicGenres/{Name}/Images/{Type}", "HEAD")]
- [Route("/MusicGenres/{Name}/Images/{Type}/{Index}", "HEAD")]
- [Route("/Persons/{Name}/Images/{Type}", "HEAD")]
- [Route("/Persons/{Name}/Images/{Type}/{Index}", "HEAD")]
- [Route("/Studios/{Name}/Images/{Type}", "HEAD")]
- [Route("/Studios/{Name}/Images/{Type}/{Index}", "HEAD")]
- ////[Route("/Years/{Year}/Images/{Type}", "HEAD")]
- ////[Route("/Years/{Year}/Images/{Type}/{Index}", "HEAD")]
- public class GetItemByNameImage : ImageRequest
- {
- /// <summary>
- /// Gets or sets the name.
- /// </summary>
- /// <value>The name.</value>
- [ApiMember(Name = "Name", Description = "Item name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Name { get; set; }
- }
-
- /// <summary>
- /// Class GetUserImage
- /// </summary>
- [Route("/Users/{Id}/Images/{Type}", "GET")]
- [Route("/Users/{Id}/Images/{Type}/{Index}", "GET")]
- [Route("/Users/{Id}/Images/{Type}", "HEAD")]
- [Route("/Users/{Id}/Images/{Type}/{Index}", "HEAD")]
- public class GetUserImage : ImageRequest
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public Guid Id { get; set; }
- }
-
- /// <summary>
- /// Class DeleteItemImage
- /// </summary>
- [Route("/Items/{Id}/Images/{Type}", "DELETE")]
- [Route("/Items/{Id}/Images/{Type}/{Index}", "DELETE")]
- [Authenticated(Roles = "admin")]
- public class DeleteItemImage : DeleteImageRequest, IReturnVoid
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
- public string Id { get; set; }
- }
-
- /// <summary>
- /// Class DeleteUserImage
- /// </summary>
- [Route("/Users/{Id}/Images/{Type}", "DELETE")]
- [Route("/Users/{Id}/Images/{Type}/{Index}", "DELETE")]
- [Authenticated]
- public class DeleteUserImage : DeleteImageRequest, IReturnVoid
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
- public Guid Id { get; set; }
- }
-
- /// <summary>
- /// Class PostUserImage
- /// </summary>
- [Route("/Users/{Id}/Images/{Type}", "POST")]
- [Route("/Users/{Id}/Images/{Type}/{Index}", "POST")]
- [Authenticated]
- public class PostUserImage : DeleteImageRequest, IRequiresRequestStream, IReturnVoid
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
- public string Id { get; set; }
-
- /// <summary>
- /// The raw Http Request Input Stream
- /// </summary>
- /// <value>The request stream.</value>
- public Stream RequestStream { get; set; }
- }
-
- /// <summary>
- /// Class PostItemImage
- /// </summary>
- [Route("/Items/{Id}/Images/{Type}", "POST")]
- [Route("/Items/{Id}/Images/{Type}/{Index}", "POST")]
- [Authenticated(Roles = "admin")]
- public class PostItemImage : DeleteImageRequest, IRequiresRequestStream, IReturnVoid
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
- public string Id { get; set; }
-
- /// <summary>
- /// The raw Http Request Input Stream
- /// </summary>
- /// <value>The request stream.</value>
- public Stream RequestStream { get; set; }
- }
-
- /// <summary>
- /// Class ImageService
- /// </summary>
- public class ImageService : BaseApiService
- {
- private readonly IUserManager _userManager;
-
- private readonly ILibraryManager _libraryManager;
-
- private readonly IProviderManager _providerManager;
-
- private readonly IImageProcessor _imageProcessor;
- private readonly IFileSystem _fileSystem;
- private readonly IAuthorizationContext _authContext;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="ImageService" /> class.
- /// </summary>
- public ImageService(
- ILogger<ImageService> logger,
- IServerConfigurationManager serverConfigurationManager,
- IHttpResultFactory httpResultFactory,
- IUserManager userManager,
- ILibraryManager libraryManager,
- IProviderManager providerManager,
- IImageProcessor imageProcessor,
- IFileSystem fileSystem,
- IAuthorizationContext authContext)
- : base(logger, serverConfigurationManager, httpResultFactory)
- {
- _userManager = userManager;
- _libraryManager = libraryManager;
- _providerManager = providerManager;
- _imageProcessor = imageProcessor;
- _fileSystem = fileSystem;
- _authContext = authContext;
- }
-
- /// <summary>
- /// Gets the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <returns>System.Object.</returns>
- public object Get(GetItemImageInfos request)
- {
- var item = _libraryManager.GetItemById(request.Id);
-
- var result = GetItemImageInfos(item);
-
- return ToOptimizedResult(result);
- }
-
- /// <summary>
- /// Gets the item image infos.
- /// </summary>
- /// <param name="item">The item.</param>
- /// <returns>Task{List{ImageInfo}}.</returns>
- public List<ImageInfo> GetItemImageInfos(BaseItem item)
- {
- var list = new List<ImageInfo>();
-
- var itemImages = item.ImageInfos;
-
- foreach (var image in itemImages)
- {
- if (!item.AllowsMultipleImages(image.Type))
- {
- var info = GetImageInfo(item, image, null);
-
- if (info != null)
- {
- list.Add(info);
- }
- }
- }
-
- foreach (var imageType in itemImages.Select(i => i.Type).Distinct().Where(item.AllowsMultipleImages))
- {
- var index = 0;
-
- // Prevent implicitly captured closure
- var currentImageType = imageType;
-
- foreach (var image in itemImages.Where(i => i.Type == currentImageType))
- {
- var info = GetImageInfo(item, image, index);
-
- if (info != null)
- {
- list.Add(info);
- }
-
- index++;
- }
- }
-
- return list;
- }
-
- private ImageInfo GetImageInfo(BaseItem item, ItemImageInfo info, int? imageIndex)
- {
- int? width = null;
- int? height = null;
- long length = 0;
-
- try
- {
- if (info.IsLocalFile)
- {
- var fileInfo = _fileSystem.GetFileInfo(info.Path);
- length = fileInfo.Length;
-
- ImageDimensions size = _imageProcessor.GetImageDimensions(item, info);
- _libraryManager.UpdateImages(item);
- width = size.Width;
- height = size.Height;
-
- if (width <= 0 || height <= 0)
- {
- width = null;
- height = null;
- }
- }
- }
- catch (Exception ex)
- {
- Logger.LogError(ex, "Error getting image information for {Item}", item.Name);
- }
-
- try
- {
- return new ImageInfo
- {
- Path = info.Path,
- ImageIndex = imageIndex,
- ImageType = info.Type,
- ImageTag = _imageProcessor.GetImageCacheTag(item, info),
- Size = length,
- Width = width,
- Height = height
- };
- }
- catch (Exception ex)
- {
- Logger.LogError(ex, "Error getting image information for {Path}", info.Path);
-
- return null;
- }
- }
-
- /// <summary>
- /// Gets the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <returns>System.Object.</returns>
- public object Get(GetItemImage request)
- {
- return GetImage(request, request.Id, null, false);
- }
-
- /// <summary>
- /// Gets the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <returns>System.Object.</returns>
- public object Head(GetItemImage request)
- {
- return GetImage(request, request.Id, null, true);
- }
-
- /// <summary>
- /// Gets the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <returns>System.Object.</returns>
- public object Get(GetUserImage request)
- {
- var item = _userManager.GetUserById(request.Id);
-
- return GetImage(request, Guid.Empty, item, false);
- }
-
- public object Head(GetUserImage request)
- {
- var item = _userManager.GetUserById(request.Id);
-
- return GetImage(request, Guid.Empty, item, true);
- }
-
- public object Get(GetItemByNameImage request)
- {
- var type = GetPathValue(0).ToString();
-
- var item = GetItemByName(request.Name, type, _libraryManager, new DtoOptions(false));
-
- return GetImage(request, item.Id, item, false);
- }
-
- public object Head(GetItemByNameImage request)
- {
- var type = GetPathValue(0).ToString();
-
- var item = GetItemByName(request.Name, type, _libraryManager, new DtoOptions(false));
-
- return GetImage(request, item.Id, item, true);
- }
-
- /// <summary>
- /// Posts the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- public Task Post(PostUserImage request)
- {
- var id = Guid.Parse(GetPathValue(1));
-
- AssertCanUpdateUser(_authContext, _userManager, id, true);
-
- request.Type = Enum.Parse<ImageType>(GetPathValue(3).ToString(), true);
-
- var item = _userManager.GetUserById(id);
-
- return PostImage(item, request.RequestStream, request.Type, Request.ContentType);
- }
-
- /// <summary>
- /// Posts the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- public Task Post(PostItemImage request)
- {
- var id = Guid.Parse(GetPathValue(1));
-
- request.Type = Enum.Parse<ImageType>(GetPathValue(3).ToString(), true);
-
- var item = _libraryManager.GetItemById(id);
-
- return PostImage(item, request.RequestStream, request.Type, Request.ContentType);
- }
-
- /// <summary>
- /// Deletes the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- public void Delete(DeleteUserImage request)
- {
- var userId = request.Id;
- AssertCanUpdateUser(_authContext, _userManager, userId, true);
-
- var item = _userManager.GetUserById(userId);
-
- item.DeleteImage(request.Type, request.Index ?? 0);
- }
-
- /// <summary>
- /// Deletes the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- public void Delete(DeleteItemImage request)
- {
- var item = _libraryManager.GetItemById(request.Id);
-
- item.DeleteImage(request.Type, request.Index ?? 0);
- }
-
- /// <summary>
- /// Posts the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- public void Post(UpdateItemImageIndex request)
- {
- var item = _libraryManager.GetItemById(request.Id);
-
- UpdateItemIndex(item, request.Type, request.Index, request.NewIndex);
- }
-
- /// <summary>
- /// Updates the index of the item.
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="type">The type.</param>
- /// <param name="currentIndex">Index of the current.</param>
- /// <param name="newIndex">The new index.</param>
- /// <returns>Task.</returns>
- private void UpdateItemIndex(BaseItem item, ImageType type, int currentIndex, int newIndex)
- {
- item.SwapImages(type, currentIndex, newIndex);
- }
-
- /// <summary>
- /// Gets the image.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <param name="item">The item.</param>
- /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
- /// <returns>System.Object.</returns>
- /// <exception cref="ResourceNotFoundException"></exception>
- public Task<object> GetImage(ImageRequest request, Guid itemId, BaseItem item, bool isHeadRequest)
- {
- if (request.PercentPlayed.HasValue)
- {
- if (request.PercentPlayed.Value <= 0)
- {
- request.PercentPlayed = null;
- }
- else if (request.PercentPlayed.Value >= 100)
- {
- request.PercentPlayed = null;
- request.AddPlayedIndicator = true;
- }
- }
-
- if (request.PercentPlayed.HasValue)
- {
- request.UnplayedCount = null;
- }
-
- if (request.UnplayedCount.HasValue
- && request.UnplayedCount.Value <= 0)
- {
- request.UnplayedCount = null;
- }
-
- if (item == null)
- {
- item = _libraryManager.GetItemById(itemId);
-
- if (item == null)
- {
- throw new ResourceNotFoundException(string.Format("Item {0} not found.", itemId.ToString("N", CultureInfo.InvariantCulture)));
- }
- }
-
- var imageInfo = GetImageInfo(request, item);
- if (imageInfo == null)
- {
- var displayText = item == null ? itemId.ToString() : item.Name;
- throw new ResourceNotFoundException(string.Format("{0} does not have an image of type {1}", displayText, request.Type));
- }
-
- bool cropwhitespace;
- if (request.CropWhitespace.HasValue)
- {
- cropwhitespace = request.CropWhitespace.Value;
- }
- else
- {
- cropwhitespace = request.Type == ImageType.Logo || request.Type == ImageType.Art;
- }
-
- var outputFormats = GetOutputFormats(request);
-
- TimeSpan? cacheDuration = null;
-
- if (!string.IsNullOrEmpty(request.Tag))
- {
- cacheDuration = TimeSpan.FromDays(365);
- }
-
- var responseHeaders = new Dictionary<string, string>
- {
- {"transferMode.dlna.org", "Interactive"},
- {"realTimeInfo.dlna.org", "DLNA.ORG_TLAG=*"}
- };
-
- return GetImageResult(
- item,
- itemId,
- request,
- imageInfo,
- cropwhitespace,
- outputFormats,
- cacheDuration,
- responseHeaders,
- isHeadRequest);
- }
-
- private async Task<object> GetImageResult(
- BaseItem item,
- Guid itemId,
- ImageRequest request,
- ItemImageInfo image,
- bool cropwhitespace,
- IReadOnlyCollection<ImageFormat> supportedFormats,
- TimeSpan? cacheDuration,
- IDictionary<string, string> headers,
- bool isHeadRequest)
- {
- if (!image.IsLocalFile)
- {
- item ??= _libraryManager.GetItemById(itemId);
- image = await _libraryManager.ConvertImageToLocal(item, image, request.Index ?? 0).ConfigureAwait(false);
- }
-
- var options = new ImageProcessingOptions
- {
- CropWhiteSpace = cropwhitespace,
- Height = request.Height,
- ImageIndex = request.Index ?? 0,
- Image = image,
- Item = item,
- ItemId = itemId,
- MaxHeight = request.MaxHeight,
- MaxWidth = request.MaxWidth,
- Quality = request.Quality ?? 100,
- Width = request.Width,
- AddPlayedIndicator = request.AddPlayedIndicator,
- PercentPlayed = request.PercentPlayed ?? 0,
- UnplayedCount = request.UnplayedCount,
- Blur = request.Blur,
- BackgroundColor = request.BackgroundColor,
- ForegroundLayer = request.ForegroundLayer,
- SupportedOutputFormats = supportedFormats
- };
-
- var imageResult = await _imageProcessor.ProcessImage(options).ConfigureAwait(false);
-
- headers[HeaderNames.Vary] = HeaderNames.Accept;
-
- return await ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions
- {
- CacheDuration = cacheDuration,
- ResponseHeaders = headers,
- ContentType = imageResult.Item2,
- DateLastModified = imageResult.Item3,
- IsHeadRequest = isHeadRequest,
- Path = imageResult.Item1,
-
- FileShare = FileShare.Read
-
- }).ConfigureAwait(false);
- }
-
- private ImageFormat[] GetOutputFormats(ImageRequest request)
- {
- if (!string.IsNullOrWhiteSpace(request.Format)
- && Enum.TryParse(request.Format, true, out ImageFormat format))
- {
- return new[] { format };
- }
-
- return GetClientSupportedFormats();
- }
-
- private ImageFormat[] GetClientSupportedFormats()
- {
- var supportedFormats = Request.AcceptTypes ?? Array.Empty<string>();
- if (supportedFormats.Length > 0)
- {
- for (int i = 0; i < supportedFormats.Length; i++)
- {
- int index = supportedFormats[i].IndexOf(';');
- if (index != -1)
- {
- supportedFormats[i] = supportedFormats[i].Substring(0, index);
- }
- }
- }
-
- var acceptParam = Request.QueryString["accept"];
-
- var supportsWebP = SupportsFormat(supportedFormats, acceptParam, "webp", false);
-
- if (!supportsWebP)
- {
- var userAgent = Request.UserAgent ?? string.Empty;
- if (userAgent.IndexOf("crosswalk", StringComparison.OrdinalIgnoreCase) != -1 &&
- userAgent.IndexOf("android", StringComparison.OrdinalIgnoreCase) != -1)
- {
- supportsWebP = true;
- }
- }
-
- var formats = new List<ImageFormat>(4);
-
- if (supportsWebP)
- {
- formats.Add(ImageFormat.Webp);
- }
-
- formats.Add(ImageFormat.Jpg);
- formats.Add(ImageFormat.Png);
-
- if (SupportsFormat(supportedFormats, acceptParam, "gif", true))
- {
- formats.Add(ImageFormat.Gif);
- }
-
- return formats.ToArray();
- }
-
- private bool SupportsFormat(IEnumerable<string> requestAcceptTypes, string acceptParam, string format, bool acceptAll)
- {
- var mimeType = "image/" + format;
-
- if (requestAcceptTypes.Contains(mimeType))
- {
- return true;
- }
-
- if (acceptAll && requestAcceptTypes.Contains("*/*"))
- {
- return true;
- }
-
- return string.Equals(Request.QueryString["accept"], format, StringComparison.OrdinalIgnoreCase);
- }
-
- /// <summary>
- /// Gets the image path.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <param name="item">The item.</param>
- /// <returns>System.String.</returns>
- private ItemImageInfo GetImageInfo(ImageRequest request, BaseItem item)
- {
- var index = request.Index ?? 0;
-
- return item.GetImageInfo(request.Type, index);
- }
-
- /// <summary>
- /// Posts the image.
- /// </summary>
- /// <param name="entity">The entity.</param>
- /// <param name="inputStream">The input stream.</param>
- /// <param name="imageType">Type of the image.</param>
- /// <param name="mimeType">Type of the MIME.</param>
- /// <returns>Task.</returns>
- public async Task PostImage(BaseItem entity, Stream inputStream, ImageType imageType, string mimeType)
- {
- using var reader = new StreamReader(inputStream);
- var text = await reader.ReadToEndAsync().ConfigureAwait(false);
-
- var bytes = Convert.FromBase64String(text);
-
- var memoryStream = new MemoryStream(bytes)
- {
- Position = 0
- };
-
- // Handle image/png; charset=utf-8
- mimeType = mimeType.Split(';').FirstOrDefault();
-
- await _providerManager.SaveImage(entity, memoryStream, mimeType, imageType, null, CancellationToken.None).ConfigureAwait(false);
-
- entity.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None);
- }
- }
-}
diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs
deleted file mode 100644
index 23bf54712..000000000
--- a/MediaBrowser.Api/Images/RemoteImageService.cs
+++ /dev/null
@@ -1,298 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Net;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Providers;
-using MediaBrowser.Model.Services;
-using Microsoft.Extensions.Logging;
-
-namespace MediaBrowser.Api.Images
-{
- public class BaseRemoteImageRequest : IReturn<RemoteImageResult>
- {
- [ApiMember(Name = "Type", Description = "The image type", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
- public ImageType? Type { get; set; }
-
- /// <summary>
- /// Skips over a given number of items within the results. Use for paging.
- /// </summary>
- /// <value>The start index.</value>
- [ApiMember(Name = "StartIndex", Description = "Optional. The record index to start at. All items with a lower index will be dropped from the results.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int? StartIndex { get; set; }
-
- /// <summary>
- /// The maximum number of items to return
- /// </summary>
- /// <value>The limit.</value>
- [ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int? Limit { get; set; }
-
- [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", Summary = "Gets available remote images for an item")]
- [Authenticated]
- public class GetRemoteImages : BaseRemoteImageRequest
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Id { get; set; }
- }
-
- [Route("/Items/{Id}/RemoteImages/Providers", "GET", Summary = "Gets available remote image providers for an item")]
- [Authenticated]
- public class GetRemoteImageProviders : IReturn<List<ImageProviderInfo>>
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
- public string Id { get; set; }
- }
-
- public class BaseDownloadRemoteImage : IReturnVoid
- {
- [ApiMember(Name = "Type", Description = "The image type", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET,POST")]
- public ImageType Type { get; set; }
-
- [ApiMember(Name = "ProviderName", Description = "The image provider", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET,POST")]
- public string ProviderName { get; set; }
-
- [ApiMember(Name = "ImageUrl", Description = "The image url", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET,POST")]
- public string ImageUrl { get; set; }
- }
-
- [Route("/Items/{Id}/RemoteImages/Download", "POST", Summary = "Downloads a remote image for an item")]
- [Authenticated(Roles = "Admin")]
- public class DownloadRemoteImage : BaseDownloadRemoteImage
- {
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
- public string Id { get; set; }
- }
-
- [Route("/Images/Remote", "GET", Summary = "Gets a remote image")]
- public class GetRemoteImage
- {
- [ApiMember(Name = "ImageUrl", Description = "The image url", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
- public string ImageUrl { get; set; }
- }
-
- public class RemoteImageService : BaseApiService
- {
- private readonly IProviderManager _providerManager;
-
- private readonly IServerApplicationPaths _appPaths;
- private readonly IHttpClient _httpClient;
- private readonly IFileSystem _fileSystem;
-
- private readonly ILibraryManager _libraryManager;
-
- public RemoteImageService(
- ILogger<RemoteImageService> logger,
- IServerConfigurationManager serverConfigurationManager,
- IHttpResultFactory httpResultFactory,
- IProviderManager providerManager,
- IServerApplicationPaths appPaths,
- IHttpClient httpClient,
- IFileSystem fileSystem,
- ILibraryManager libraryManager)
- : base(logger, serverConfigurationManager, httpResultFactory)
- {
- _providerManager = providerManager;
- _appPaths = appPaths;
- _httpClient = httpClient;
- _fileSystem = fileSystem;
- _libraryManager = libraryManager;
- }
-
- public object Get(GetRemoteImageProviders request)
- {
- var item = _libraryManager.GetItemById(request.Id);
-
- var result = GetImageProviders(item);
-
- return ToOptimizedResult(result);
- }
-
- private List<ImageProviderInfo> GetImageProviders(BaseItem item)
- {
- return _providerManager.GetRemoteImageProviderInfo(item).ToList();
- }
-
- public async Task<object> Get(GetRemoteImages request)
- {
- var item = _libraryManager.GetItemById(request.Id);
-
- var images = await _providerManager.GetAvailableRemoteImages(item, new RemoteImageQuery
- {
- ProviderName = request.ProviderName,
- IncludeAllLanguages = request.IncludeAllLanguages,
- IncludeDisabledProviders = true,
- ImageType = request.Type
-
- }, CancellationToken.None).ConfigureAwait(false);
-
- var imagesList = images.ToArray();
-
- 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.Length,
- Providers = allProviders.Select(i => i.Name)
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToArray()
- };
-
- if (request.StartIndex.HasValue)
- {
- imagesList = imagesList.Skip(request.StartIndex.Value)
- .ToArray();
- }
-
- if (request.Limit.HasValue)
- {
- imagesList = imagesList.Take(request.Limit.Value)
- .ToArray();
- }
-
- result.Images = imagesList;
-
- return result;
- }
-
- /// <summary>
- /// Posts the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- public Task Post(DownloadRemoteImage request)
- {
- var item = _libraryManager.GetItemById(request.Id);
-
- return DownloadRemoteImage(item, request);
- }
-
- /// <summary>
- /// Downloads the remote image.
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="request">The request.</param>
- /// <returns>Task.</returns>
- private async Task DownloadRemoteImage(BaseItem item, BaseDownloadRemoteImage request)
- {
- await _providerManager.SaveImage(item, request.ImageUrl, request.Type, null, CancellationToken.None).ConfigureAwait(false);
-
- item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None);
- }
-
- /// <summary>
- /// Gets the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <returns>System.Object.</returns>
- public async Task<object> Get(GetRemoteImage request)
- {
- var urlHash = request.ImageUrl.GetMD5();
- var pointerCachePath = GetFullCachePath(urlHash.ToString());
-
- string contentPath;
-
- try
- {
- contentPath = File.ReadAllText(pointerCachePath);
-
- if (File.Exists(contentPath))
- {
- return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false);
- }
- }
- catch (FileNotFoundException)
- {
- // Means the file isn't cached yet
- }
- catch (IOException)
- {
- // Means the file isn't cached yet
- }
-
- await DownloadImage(request.ImageUrl, urlHash, pointerCachePath).ConfigureAwait(false);
-
- // Read the pointer file again
- contentPath = File.ReadAllText(pointerCachePath);
-
- return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Downloads the image.
- /// </summary>
- /// <param name="url">The URL.</param>
- /// <param name="urlHash">The URL hash.</param>
- /// <param name="pointerCachePath">The pointer cache path.</param>
- /// <returns>Task.</returns>
- private async Task DownloadImage(string url, Guid urlHash, string pointerCachePath)
- {
- using var result = await _httpClient.GetResponse(new HttpRequestOptions
- {
- Url = url,
- BufferContent = false
- }).ConfigureAwait(false);
- var ext = result.ContentType.Split('/')[^1];
-
- var fullCachePath = GetFullCachePath(urlHash + "." + ext);
-
- Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath));
- var stream = result.Content;
- await using (stream.ConfigureAwait(false))
- {
- var filestream = new FileStream(fullCachePath, FileMode.Create, FileAccess.Write, FileShare.Read, IODefaults.FileStreamBufferSize, true);
- await using (filestream.ConfigureAwait(false))
- {
- await stream.CopyToAsync(filestream).ConfigureAwait(false);
- }
- }
-
- Directory.CreateDirectory(Path.GetDirectoryName(pointerCachePath));
- File.WriteAllText(pointerCachePath, fullCachePath);
- }
-
- /// <summary>
- /// Gets the full cache path.
- /// </summary>
- /// <param name="filename">The filename.</param>
- /// <returns>System.String.</returns>
- private string GetFullCachePath(string filename)
- {
- return Path.Combine(_appPaths.CachePath, "remote-images", filename.Substring(0, 1), filename);
- }
- }
-}