aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/Images
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/Images')
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs94
-rw-r--r--MediaBrowser.Api/Images/RemoteImageService.cs47
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);
}
}
}