using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Server.Implementations.Photos; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using MediaBrowser.Common.IO; using MediaBrowser.Model.IO; using MediaBrowser.Controller.Collections; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Querying; namespace MediaBrowser.Server.Implementations.UserViews { public class CollectionFolderImageProvider : BaseDynamicImageProvider { public CollectionFolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor) : base(fileSystem, providerManager, applicationPaths, imageProcessor) { } public override IEnumerable GetSupportedImages(IHasImages item) { return new List { ImageType.Primary }; } protected override async Task> GetItemsWithImages(IHasImages item) { var view = (CollectionFolder)item; var recursive = !new[] { CollectionType.Playlists, CollectionType.Channels }.Contains(view.CollectionType ?? string.Empty, StringComparer.OrdinalIgnoreCase); var result = await view.GetItems(new InternalItemsQuery { CollapseBoxSetItems = false, Recursive = recursive, ExcludeItemTypes = new[] { "UserView", "CollectionFolder", "Playlist" } }).ConfigureAwait(false); var items = result.Items.Select(i => { var episode = i as Episode; if (episode != null) { var series = episode.Series; if (series != null) { return series; } return episode; } var season = i as Season; if (season != null) { var series = season.Series; if (series != null) { return series; } return season; } var audio = i as Audio; if (audio != null) { var album = audio.AlbumEntity; if (album != null && album.HasImage(ImageType.Primary)) { return album; } } return i; }).DistinctBy(i => i.Id); return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8); } protected override bool Supports(IHasImages item) { return item is CollectionFolder; } protected override async Task CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) { var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ".png"); if (imageType == ImageType.Primary) { if (itemsWithImages.Count == 0) { return null; } return await CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540).ConfigureAwait(false); } return await base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex).ConfigureAwait(false); } } public class ManualCollectionFolderImageProvider : BaseDynamicImageProvider { private readonly ILibraryManager _libraryManager; public ManualCollectionFolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) : base(fileSystem, providerManager, applicationPaths, imageProcessor) { _libraryManager = libraryManager; } public override IEnumerable GetSupportedImages(IHasImages item) { return new List { ImageType.Primary }; } protected override async Task> GetItemsWithImages(IHasImages item) { var view = (ManualCollectionsFolder)item; var recursive = !new[] { CollectionType.Playlists, CollectionType.Channels }.Contains(view.CollectionType ?? string.Empty, StringComparer.OrdinalIgnoreCase); var items = _libraryManager.GetItemList(new InternalItemsQuery { Recursive = recursive, IncludeItemTypes = new[] { typeof(BoxSet).Name }, Limit = 20, SortBy = new[] { ItemSortBy.Random } }); return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8); } protected override bool Supports(IHasImages item) { return item is ManualCollectionsFolder; } protected override async Task CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) { var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ".png"); if (imageType == ImageType.Primary) { if (itemsWithImages.Count == 0) { return null; } return await CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540).ConfigureAwait(false); } return await base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex).ConfigureAwait(false); } } }