diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs | 116 |
1 files changed, 85 insertions, 31 deletions
diff --git a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs index 369e8512f..4ff42c1fd 100644 --- a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs +++ b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs @@ -1,8 +1,10 @@ -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; @@ -14,18 +16,34 @@ using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Photos { - public abstract class BaseDynamicImageProvider<T> : IHasChangeMonitor, IForcedProvider - where T : IHasImages + public abstract class BaseDynamicImageProvider<T> : IHasChangeMonitor, IForcedProvider, ICustomMetadataProvider<T>, IHasOrder + where T : IHasMetadata { protected IFileSystem FileSystem { get; private set; } protected IProviderManager ProviderManager { get; private set; } + protected IApplicationPaths ApplicationPaths { get; private set; } - protected BaseDynamicImageProvider(IFileSystem fileSystem, IProviderManager providerManager) + protected BaseDynamicImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths) { + ApplicationPaths = applicationPaths; ProviderManager = providerManager; FileSystem = fileSystem; } + public virtual bool Supports(IHasImages item) + { + return true; + } + + public virtual IEnumerable<ImageType> GetSupportedImages(IHasImages item) + { + return new List<ImageType> + { + ImageType.Primary, + ImageType.Thumb + }; + } + public async Task<ItemUpdateType> FetchAsync(T item, MetadataRefreshOptions options, CancellationToken cancellationToken) { if (!Supports(item)) @@ -39,37 +57,23 @@ namespace MediaBrowser.Server.Implementations.Photos return primaryResult | thumbResult; } - protected virtual bool Supports(IHasImages item) - { - return true; - } - - protected abstract Task<List<BaseItem>> GetItemsWithImages(IHasImages item); - - private const string Version = "3"; - protected string GetConfigurationCacheKey(List<BaseItem> items) - { - return (Version + "_" + string.Join(",", items.Select(i => i.Id.ToString("N")).ToArray())).GetMD5().ToString("N"); - } - protected async Task<ItemUpdateType> FetchAsync(IHasImages item, ImageType imageType, MetadataRefreshOptions options, CancellationToken cancellationToken) { var items = await GetItemsWithImages(item).ConfigureAwait(false); - var cacheKey = GetConfigurationCacheKey(items); + var cacheKey = GetConfigurationCacheKey(items, item.Name); if (!HasChanged(item, imageType, cacheKey)) { return ItemUpdateType.None; } - return await FetchAsyncInternal(item, items, imageType, cacheKey, options, cancellationToken).ConfigureAwait(false); + return await FetchToFileInternal(item, items, imageType, cacheKey, cancellationToken).ConfigureAwait(false); } - protected async Task<ItemUpdateType> FetchAsyncInternal(IHasImages item, + protected async Task<ItemUpdateType> FetchToFileInternal(IHasImages item, List<BaseItem> itemsWithImages, - ImageType imageType, - string cacheKey, - MetadataRefreshOptions options, + ImageType imageType, + string cacheKey, CancellationToken cancellationToken) { var stream = await CreateImageAsync(item, itemsWithImages, imageType, 0).ConfigureAwait(false); @@ -103,19 +107,54 @@ namespace MediaBrowser.Server.Implementations.Photos return ItemUpdateType.ImageUpdate; } + public async Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken) + { + var items = await GetItemsWithImages(item).ConfigureAwait(false); + var cacheKey = GetConfigurationCacheKey(items, item.Name); + + var result = await CreateImageAsync(item, items, type, 0).ConfigureAwait(false); + + return new DynamicImageResponse + { + HasImage = result != null, + Stream = result, + InternalCacheKey = cacheKey, + Format = ImageFormat.Png + }; + } + + protected abstract Task<List<BaseItem>> GetItemsWithImages(IHasImages item); + + private const string Version = "3"; + protected string GetConfigurationCacheKey(List<BaseItem> items, string itemName) + { + return (Version + "_" + (itemName ?? string.Empty) + "_" + string.Join(",", items.Select(i => i.Id.ToString("N")).ToArray())).GetMD5().ToString("N"); + } + protected Task<Stream> GetThumbCollage(List<BaseItem> items) { - return DynamicImageHelpers.GetThumbCollage(items.Select(i => i.GetImagePath(ImageType.Primary) ?? i.GetImagePath(ImageType.Thumb)).ToList(), + var files = items + .Select(i => i.GetImagePath(ImageType.Primary) ?? i.GetImagePath(ImageType.Thumb)) + .Where(i => !string.IsNullOrWhiteSpace(i)) + .ToList(); + + return DynamicImageHelpers.GetThumbCollage(files, FileSystem, 1600, - 900); + 900, + ApplicationPaths); } protected Task<Stream> GetSquareCollage(List<BaseItem> items) { - return DynamicImageHelpers.GetSquareCollage(items.Select(i => i.GetImagePath(ImageType.Primary) ?? i.GetImagePath(ImageType.Thumb)).ToList(), + var files = items + .Select(i => i.GetImagePath(ImageType.Primary) ?? i.GetImagePath(ImageType.Thumb)) + .Where(i => !string.IsNullOrWhiteSpace(i)) + .ToList(); + + return DynamicImageHelpers.GetSquareCollage(files, FileSystem, - 800); + 800, ApplicationPaths); } public string Name @@ -123,9 +162,9 @@ namespace MediaBrowser.Server.Implementations.Photos get { return "Dynamic Image Provider"; } } - public async Task<Stream> CreateImageAsync(IHasImages item, + protected virtual async Task<Stream> CreateImageAsync(IHasImages item, List<BaseItem> itemsWithImages, - ImageType imageType, + ImageType imageType, int imageIndex) { if (itemsWithImages.Count == 0) @@ -146,7 +185,7 @@ namespace MediaBrowser.Server.Implementations.Photos } var items = GetItemsWithImages(item).Result; - var cacheKey = GetConfigurationCacheKey(items); + var cacheKey = GetConfigurationCacheKey(items, item.Name); return HasChanged(item, ImageType.Primary, cacheKey) || HasChanged(item, ImageType.Thumb, cacheKey); } @@ -176,11 +215,17 @@ namespace MediaBrowser.Server.Implementations.Photos protected List<BaseItem> GetFinalItems(List<BaseItem> items) { // Rotate the images no more than once per week + return GetFinalItems(items, 4); + } + + protected virtual List<BaseItem> GetFinalItems(List<BaseItem> items, int limit) + { + // Rotate the images no more than once per week var random = new Random(GetWeekOfYear()).Next(); return items .OrderBy(i => random - items.IndexOf(i)) - .Take(4) + .Take(limit) .OrderBy(i => i.Name) .ToList(); } @@ -195,5 +240,14 @@ namespace MediaBrowser.Server.Implementations.Photos return weekNo; } + + public int Order + { + get + { + // Run before the default image provider which will download placeholders + return 0; + } + } } } |
