diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2017-10-21 12:39:52 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2017-10-21 12:39:52 -0400 |
| commit | e7ecd418c43b966bac3c34d09e6f97c1176a749c (patch) | |
| tree | 00e9fbb89b26ad38cc8a8c867bb2ea6413e53c15 | |
| parent | 0cf4f01dc72b3775e3af067ed1eef51c683a3c02 (diff) | |
update home video library support
14 files changed, 234 insertions, 173 deletions
diff --git a/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs b/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs index 55063872c..5c205dd19 100644 --- a/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs +++ b/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs @@ -28,7 +28,7 @@ namespace Emby.Server.Implementations.Devices [IgnoreDataMember] public override string CollectionType { - get { return MediaBrowser.Model.Entities.CollectionType.Photos; } + get { return MediaBrowser.Model.Entities.CollectionType.HomeVideos; } } [IgnoreDataMember] diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index 083a14788..1ecbabf2f 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -435,7 +435,6 @@ <Compile Include="Data\BaseSqliteRepository.cs" /> <Compile Include="Data\CleanDatabaseScheduledTask.cs" /> <Compile Include="Data\SqliteExtensions.cs" /> - <Compile Include="Photos\PhotoAlbumImageProvider.cs" /> <Compile Include="Playlists\ManualPlaylistsFolder.cs" /> <Compile Include="Playlists\PlaylistImageProvider.cs" /> <Compile Include="Playlists\PlaylistManager.cs" /> @@ -573,6 +572,7 @@ <Compile Include="Updates\InstallationManager.cs" /> <Compile Include="UserViews\CollectionFolderImageProvider.cs" /> <Compile Include="UserViews\DynamicImageProvider.cs" /> + <Compile Include="UserViews\FolderImageProvider.cs" /> <Compile Include="Xml\XmlReaderSettingsFactory.cs" /> </ItemGroup> <ItemGroup> diff --git a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs index 3f9ea79c6..5cd7e4262 100644 --- a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs +++ b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs @@ -42,23 +42,14 @@ namespace Emby.Server.Implementations.Images return true; } - public virtual IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) + public virtual ImageType[] GetSupportedImages(IHasMetadata item) { - return new List<ImageType> + return new ImageType[] { - ImageType.Primary, - ImageType.Thumb + ImageType.Primary }; } - private IEnumerable<ImageType> GetEnabledImages(IHasMetadata item) - { - //var options = ProviderManager.GetMetadataOptions(item); - - return GetSupportedImages(item); - //return GetSupportedImages(item).Where(i => IsEnabled(options, i, item)).ToList(); - } - public async Task<ItemUpdateType> FetchAsync(T item, MetadataRefreshOptions options, CancellationToken cancellationToken) { if (!Supports(item)) @@ -67,7 +58,7 @@ namespace Emby.Server.Implementations.Images } var updateType = ItemUpdateType.None; - var supportedImages = GetEnabledImages(item).ToList(); + var supportedImages = GetSupportedImages(item); if (supportedImages.Contains(ImageType.Primary)) { @@ -253,7 +244,7 @@ namespace Emby.Server.Implementations.Images return false; } - var supportedImages = GetEnabledImages(item).ToList(); + var supportedImages = GetSupportedImages(item); if (supportedImages.Contains(ImageType.Primary) && HasChanged(item, ImageType.Primary)) { @@ -283,8 +274,7 @@ namespace Emby.Server.Implementations.Images return false; } - var age = DateTime.UtcNow - image.DateModified; - if (age.TotalDays <= MaxImageAgeDays) + if (!HasChangedByDate(item, image)) { return false; } @@ -293,6 +283,16 @@ namespace Emby.Server.Implementations.Images return true; } + protected virtual bool HasChangedByDate(IHasMetadata item, ItemImageInfo image) + { + var age = DateTime.UtcNow - image.DateModified; + if (age.TotalDays <= MaxImageAgeDays) + { + return false; + } + return true; + } + protected List<BaseItem> GetFinalItems(IEnumerable<BaseItem> items) { return GetFinalItems(items, 4); diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index fc5cab0a0..94cafa3e2 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -11,7 +11,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; - +using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; @@ -216,12 +216,12 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<MusicVideo>(args.Path, args.Parent, files, args.DirectoryService, collectionType, true, false); + return FindMovie<MusicVideo>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, false); } if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<Video>(args.Path, args.Parent, files, args.DirectoryService, collectionType, false, false); + return FindMovie<Video>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, false); } if (string.IsNullOrEmpty(collectionType)) @@ -239,13 +239,13 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies } { - return FindMovie<Movie>(args.Path, args.Parent, files, args.DirectoryService, collectionType, true, true); + return FindMovie<Movie>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, true); } } if (string.Equals(collectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<Movie>(args.Path, args.Parent, files, args.DirectoryService, collectionType, true, true); + return FindMovie<Movie>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, true); } return null; @@ -361,11 +361,15 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies /// </summary> /// <typeparam name="T"></typeparam> /// <returns>Movie.</returns> - private T FindMovie<T>(string path, Folder parent, List<FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, string collectionType, bool allowFilesAsFolders, bool parseName) + private T FindMovie<T>(ItemResolveArgs args, string path, Folder parent, List<FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, string collectionType, bool parseName) where T : Video, new() { var multiDiscFolders = new List<FileSystemMetadata>(); + var libraryOptions = args.GetLibraryOptions(); + var supportPhotos = string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && libraryOptions.EnablePhotos; + var photos = new List<FileSystemMetadata>(); + // Search for a folder rip foreach (var child in fileSystemEntries) { @@ -406,30 +410,37 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies Set3DFormat(movie); return movie; } + else if (supportPhotos && !child.IsHidden && PhotoResolver.IsImageFile(child.FullName, _imageProcessor)) + { + photos.Add(child); + } } - if (allowFilesAsFolders) - { - // TODO: Allow GetMultiDiscMovie in here - var supportsMultiVersion = !string.Equals(collectionType, CollectionType.HomeVideos) && - !string.Equals(collectionType, CollectionType.Photos) && - !string.Equals(collectionType, CollectionType.MusicVideos); + // TODO: Allow GetMultiDiscMovie in here + var supportsMultiVersion = !string.Equals(collectionType, CollectionType.HomeVideos) && + !string.Equals(collectionType, CollectionType.Photos) && + !string.Equals(collectionType, CollectionType.MusicVideos); + + var result = ResolveVideos<T>(parent, fileSystemEntries, directoryService, supportsMultiVersion, collectionType, parseName) ?? + new MultiItemResolverResult(); - var result = ResolveVideos<T>(parent, fileSystemEntries, directoryService, supportsMultiVersion, collectionType, parseName) ?? - new MultiItemResolverResult(); + if (result.Items.Count == 1) + { + var videoPath = result.Items[0].Path; + var hasPhotos = photos.Any(i => !PhotoResolver.IsOwnedByResolvedMedia(LibraryManager, libraryOptions, videoPath, i.Name)); - if (result.Items.Count == 1) + if (!hasPhotos) { var movie = (T)result.Items[0]; movie.IsInMixedFolder = false; movie.Name = Path.GetFileName(movie.ContainingFolderPath); return movie; } + } - if (result.Items.Count == 0 && multiDiscFolders.Count > 0) - { - return GetMultiDiscMovie<T>(multiDiscFolders, directoryService); - } + if (result.Items.Count == 0 && multiDiscFolders.Count > 0) + { + return GetMultiDiscMovie<T>(multiDiscFolders, directoryService); } return null; @@ -544,8 +555,11 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies return !validCollectionTypes.Contains(collectionType, StringComparer.OrdinalIgnoreCase); } - public MovieResolver(ILibraryManager libraryManager, IFileSystem fileSystem) : base(libraryManager, fileSystem) + private IImageProcessor _imageProcessor; + + public MovieResolver(ILibraryManager libraryManager, IFileSystem fileSystem, IImageProcessor imageProcessor) : base(libraryManager, fileSystem) { + _imageProcessor = imageProcessor; } } } diff --git a/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs b/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs index 3d7ede879..a9cfea34d 100644 --- a/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs @@ -12,9 +12,12 @@ namespace Emby.Server.Implementations.Library.Resolvers public class PhotoAlbumResolver : FolderResolver<PhotoAlbum> { private readonly IImageProcessor _imageProcessor; - public PhotoAlbumResolver(IImageProcessor imageProcessor) + private ILibraryManager _libraryManager; + + public PhotoAlbumResolver(IImageProcessor imageProcessor, ILibraryManager libraryManager) { _imageProcessor = imageProcessor; + _libraryManager = libraryManager; } /// <summary> @@ -25,14 +28,18 @@ namespace Emby.Server.Implementations.Library.Resolvers protected override PhotoAlbum Resolve(ItemResolveArgs args) { // Must be an image file within a photo collection - if (args.IsDirectory && string.Equals(args.GetCollectionType(), CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) + if (args.IsDirectory) { - if (HasPhotos(args)) + if (string.Equals(args.GetCollectionType(), CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) || + string.Equals(args.GetCollectionType(), CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) { - return new PhotoAlbum + if (HasPhotos(args)) { - Path = args.Path - }; + return new PhotoAlbum + { + Path = args.Path + }; + } } } @@ -41,7 +48,32 @@ namespace Emby.Server.Implementations.Library.Resolvers private bool HasPhotos(ItemResolveArgs args) { - return args.FileSystemChildren.Any(i => (!i.IsDirectory) && PhotoResolver.IsImageFile(i.FullName, _imageProcessor)); + var files = args.FileSystemChildren; + + foreach (var file in files) + { + if (!file.IsDirectory && PhotoResolver.IsImageFile(file.FullName, _imageProcessor)) + { + var libraryOptions = args.GetLibraryOptions(); + var filename = file.Name; + var ownedByMedia = false; + + foreach (var siblingFile in files) + { + if (PhotoResolver.IsOwnedByMedia(_libraryManager, libraryOptions, siblingFile.FullName, filename)) + { + ownedByMedia = true; + break; + } + } + + if (!ownedByMedia) + { + return true; + } + } + } + return false; } public override ResolverPriority Priority diff --git a/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs b/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs index 04312f277..48f5802a9 100644 --- a/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs @@ -35,7 +35,6 @@ namespace Emby.Server.Implementations.Library.Resolvers // Must be an image file within a photo collection var collectionType = args.GetCollectionType(); - if (string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase) || (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && args.GetLibraryOptions().EnablePhotos)) { @@ -44,9 +43,15 @@ namespace Emby.Server.Implementations.Library.Resolvers var filename = Path.GetFileNameWithoutExtension(args.Path); // Make sure the image doesn't belong to a video file - if (_fileSystem.GetFilePaths(_fileSystem.GetDirectoryName(args.Path)).Any(i => IsOwnedByMedia(args.GetLibraryOptions(), i, filename))) + var files = args.DirectoryService.GetFiles(_fileSystem.GetDirectoryName(args.Path)); + var libraryOptions = args.GetLibraryOptions(); + + foreach (var file in files) { - return null; + if (IsOwnedByMedia(_libraryManager, libraryOptions, file.FullName, filename)) + { + return null; + } } return new Photo @@ -60,14 +65,21 @@ namespace Emby.Server.Implementations.Library.Resolvers return null; } - private bool IsOwnedByMedia(LibraryOptions libraryOptions, string file, string imageFilename) + internal static bool IsOwnedByMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename) { - if (_libraryManager.IsVideoFile(file, libraryOptions)) + if (libraryManager.IsVideoFile(file, libraryOptions)) { - if (imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase)) - { - return true; - } + return IsOwnedByResolvedMedia(libraryManager, libraryOptions, file, imageFilename); + } + + return false; + } + + internal static bool IsOwnedByResolvedMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename) + { + if (imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase)) + { + return true; } return false; @@ -81,7 +93,8 @@ namespace Emby.Server.Implementations.Library.Resolvers "fanart", "backdrop", "poster", - "cover" + "cover", + "logo" }; internal static bool IsImageFile(string path, IImageProcessor imageProcessor) diff --git a/Emby.Server.Implementations/Localization/Core/ru.json b/Emby.Server.Implementations/Localization/Core/ru.json index aa624f0e7..d27b1ca93 100644 --- a/Emby.Server.Implementations/Localization/Core/ru.json +++ b/Emby.Server.Implementations/Localization/Core/ru.json @@ -53,9 +53,9 @@ "UserCreatedWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d", "UserPasswordChangedWithName": "\u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0451\u043d", "UserDeletedWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d", - "UserConfigurationUpdatedWithName": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", - "MessageServerConfigurationUpdated": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", - "MessageNamedServerConfigurationUpdatedWithValue": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0440\u0430\u0437\u0434\u0435\u043b {0}) \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "UserConfigurationUpdatedWithName": "\u041a\u043e\u043d\u0444\u0438\u0433-\u0438\u044f \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "MessageServerConfigurationUpdated": "\u041a\u043e\u043d\u0444\u0438\u0433-\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "MessageNamedServerConfigurationUpdatedWithValue": "\u041a\u043e\u043d\u0444\u0438\u0433-\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0440\u0430\u0437\u0434\u0435\u043b {0}) \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", "MessageApplicationUpdated": "Emby Server \u0431\u044b\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d", "FailedLoginAttemptWithUserName": "{0} - \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430", "AuthenticationSucceededWithUserName": "{0} - \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u0430", diff --git a/Emby.Server.Implementations/Localization/LocalizationManager.cs b/Emby.Server.Implementations/Localization/LocalizationManager.cs index 48df96289..650f388a1 100644 --- a/Emby.Server.Implementations/Localization/LocalizationManager.cs +++ b/Emby.Server.Implementations/Localization/LocalizationManager.cs @@ -319,6 +319,10 @@ namespace Emby.Server.Implementations.Localization { culture = _configurationManager.Configuration.UICulture; } + if (string.IsNullOrWhiteSpace(culture)) + { + culture = DefaultCulture; + } var dictionary = GetLocalizationDictionary(culture); @@ -332,19 +336,31 @@ namespace Emby.Server.Implementations.Localization return phrase; } + const string DefaultCulture = "en-US"; + private readonly ConcurrentDictionary<string, Dictionary<string, string>> _dictionaries = new ConcurrentDictionary<string, Dictionary<string, string>>(StringComparer.OrdinalIgnoreCase); public Dictionary<string, string> GetLocalizationDictionary(string culture) { + if (string.IsNullOrWhiteSpace(culture)) + { + throw new ArgumentNullException("culture"); + } + const string prefix = "Core"; var key = prefix + culture; - return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, "en-US.json")); + return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, DefaultCulture + ".json")); } private Dictionary<string, string> GetDictionary(string prefix, string culture, string baseFilename) { + if (string.IsNullOrWhiteSpace(culture)) + { + throw new ArgumentNullException("culture"); + } + var dictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); var namespaceName = GetType().Namespace + "." + prefix; diff --git a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs deleted file mode 100644 index f7c65f63d..000000000 --- a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediaBrowser.Common.Configuration; -using MediaBrowser.Controller.Drawing; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Providers; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Emby.Server.Implementations.Images; -using MediaBrowser.Model.IO; -using MediaBrowser.Model.Entities; - -namespace Emby.Server.Implementations.Photos -{ - public class PhotoAlbumImageProvider : BaseDynamicImageProvider<PhotoAlbum> - { - public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor) - : base(fileSystem, providerManager, applicationPaths, imageProcessor) - { - } - - protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) - { - var photoAlbum = (PhotoAlbum)item; - var items = GetFinalItems(photoAlbum.Children); - - return items; - } - - protected override string CreateImage(IHasMetadata item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) - { - return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); - } - } -} diff --git a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs index fa1d5b74e..f051e856a 100644 --- a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs @@ -28,14 +28,6 @@ namespace Emby.Server.Implementations.UserViews { } - public override IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) - { - return new List<ImageType> - { - ImageType.Primary - }; - } - protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) { var view = (CollectionFolder)item; @@ -126,14 +118,6 @@ namespace Emby.Server.Implementations.UserViews _libraryManager = libraryManager; } - public override IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) - { - return new List<ImageType> - { - ImageType.Primary - }; - } - protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) { var view = (ManualCollectionsFolder)item; diff --git a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs index 885dfec58..23b8c9b9e 100644 --- a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs @@ -31,23 +31,6 @@ namespace Emby.Server.Implementations.UserViews _libraryManager = libraryManager; } - public override IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) - { - var view = (UserView)item; - if (IsUsingCollectionStrip(view)) - { - return new List<ImageType> - { - ImageType.Primary - }; - } - - return new List<ImageType> - { - ImageType.Primary - }; - } - protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) { var view = (UserView)item; diff --git a/Emby.Server.Implementations/UserViews/FolderImageProvider.cs b/Emby.Server.Implementations/UserViews/FolderImageProvider.cs new file mode 100644 index 000000000..80a74e877 --- /dev/null +++ b/Emby.Server.Implementations/UserViews/FolderImageProvider.cs @@ -0,0 +1,100 @@ +using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.Drawing; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Emby.Server.Implementations.Images; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Querying; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Dto; + +namespace Emby.Server.Implementations.Photos +{ + public abstract class BaseFolderImageProvider<T> : BaseDynamicImageProvider<T> + where T : Folder, new () + { + protected ILibraryManager _libraryManager; + + public BaseFolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor) + { + _libraryManager = libraryManager; + } + + protected override List<BaseItem> GetItemsWithImages(IHasMetadata item) + { + return _libraryManager.GetItemList(new InternalItemsQuery + { + Parent = item as BaseItem, + GroupByPresentationUniqueKey = false, + DtoOptions = new DtoOptions(true), + ImageTypes = new ImageType[] { ImageType.Primary } + }); + } + + protected override string CreateImage(IHasMetadata item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + { + return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); + } + + protected override bool Supports(IHasMetadata item) + { + if (item is PhotoAlbum || item is MusicAlbum) + { + return true; + } + + if (item.GetType() == typeof(Folder)) + { + var folder = item as Folder; + if (folder.IsTopParent) + { + return false; + } + return true; + } + + return false; + } + + protected override bool HasChangedByDate(IHasMetadata item, ItemImageInfo image) + { + if (item is MusicAlbum) + { + return false; + } + + return base.HasChangedByDate(item, image); + } + } + + public class FolderImageProvider : BaseFolderImageProvider<Folder> + { + public FolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager) + { + } + } + + public class MusicAlbumImageProvider : BaseFolderImageProvider<MusicAlbum> + { + public MusicAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager) + { + } + } + + public class PhotoAlbumImageProvider : BaseFolderImageProvider<PhotoAlbum> + { + public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager) + { + } + } +} diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index a7d4a1b06..ae4499350 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -85,7 +85,6 @@ <Compile Include="Movies\MovieDbImageProvider.cs" /> <Compile Include="Movies\FanartMovieImageProvider.cs" /> <Compile Include="MusicGenres\MusicGenreMetadataService.cs" /> - <Compile Include="Music\AlbumImageFromSongProvider.cs" /> <Compile Include="Music\AlbumMetadataService.cs" /> <Compile Include="Music\ArtistMetadataService.cs" /> <Compile Include="Music\AudioDbAlbumImageProvider.cs" /> diff --git a/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs b/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs deleted file mode 100644 index 57e20b852..000000000 --- a/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs +++ /dev/null @@ -1,46 +0,0 @@ -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.Providers; -using MediaBrowser.Model.Entities; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Providers.Music -{ - public class AlbumImageFromSongProvider : IDynamicImageProvider - { - public IEnumerable<ImageType> GetSupportedImages(IHasMetadata item) - { - return new List<ImageType> { ImageType.Primary }; - } - - public Task<DynamicImageResponse> GetImage(IHasMetadata item, ImageType type, CancellationToken cancellationToken) - { - var album = (MusicAlbum)item; - - var image = album.GetRecursiveChildren(i => !i.IsFolder) - .Select(i => i.GetImageInfo(type, 0)) - .FirstOrDefault(i => i != null && i.IsLocalFile); - - var imagePath = image == null ? null : image.Path; - - return Task.FromResult(new DynamicImageResponse - { - Path = imagePath, - HasImage = !string.IsNullOrEmpty(imagePath) - }); - } - - public string Name - { - get { return "Image Extractor"; } - } - - public bool Supports(IHasMetadata item) - { - return item is MusicAlbum; - } - } -} |
