diff options
Diffstat (limited to 'MediaBrowser.Providers/All/LocalImageProvider.cs')
| -rw-r--r-- | MediaBrowser.Providers/All/LocalImageProvider.cs | 150 |
1 files changed, 78 insertions, 72 deletions
diff --git a/MediaBrowser.Providers/All/LocalImageProvider.cs b/MediaBrowser.Providers/All/LocalImageProvider.cs index 5883781f9..354b081cf 100644 --- a/MediaBrowser.Providers/All/LocalImageProvider.cs +++ b/MediaBrowser.Providers/All/LocalImageProvider.cs @@ -1,8 +1,8 @@ -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System; @@ -13,15 +13,8 @@ using System.Linq; namespace MediaBrowser.Providers.All { - public class LocalImageProvider : IImageFileProvider + public class LocalImageProvider : ILocalImageFileProvider { - private readonly IFileSystem _fileSystem; - - public LocalImageProvider(IFileSystem fileSystem) - { - _fileSystem = fileSystem; - } - public string Name { get { return "Local Images"; } @@ -34,9 +27,7 @@ namespace MediaBrowser.Providers.All public bool Supports(IHasImages item) { - var locationType = item.LocationType; - - if (locationType == LocationType.FileSystem) + if (item.SupportsLocalMetadata) { // Episode has it's own provider if (item.IsOwnedItem || item is Episode || item is Audio) @@ -47,7 +38,7 @@ namespace MediaBrowser.Providers.All return true; } - if (locationType == LocationType.Virtual) + if (item.LocationType == LocationType.Virtual) { var season = item as Season; @@ -65,34 +56,63 @@ namespace MediaBrowser.Providers.All return false; } - private IEnumerable<string> GetFiles(IHasImages item, bool includeDirectories) + private IEnumerable<FileSystemInfo> GetFiles(IHasImages item, bool includeDirectories, IDirectoryService directoryService) { if (item.LocationType != LocationType.FileSystem) { - return new List<string>(); + return new List<FileSystemInfo>(); } var path = item.ContainingFolderPath; if (includeDirectories) { - return Directory.EnumerateFileSystemEntries(path, "*", SearchOption.TopDirectoryOnly); + return directoryService.GetFileSystemEntries(path) + .Where(i => BaseItem.SupportedImageExtensions.Contains(i.Extension, StringComparer.OrdinalIgnoreCase) || + (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory); } - return Directory.EnumerateFiles(path, "*", SearchOption.TopDirectoryOnly); + + return directoryService.GetFiles(path) + .Where(i => BaseItem.SupportedImageExtensions.Contains(i.Extension, StringComparer.OrdinalIgnoreCase)); } - public List<LocalImageInfo> GetImages(IHasImages item) + public List<LocalImageInfo> GetImages(IHasImages item, IDirectoryService directoryService) { - var files = GetFileDictionary(GetFiles(item, true)); + var files = GetFiles(item, true, directoryService).ToList(); var list = new List<LocalImageInfo>(); - PopulateImages(item, list, files); + PopulateImages(item, list, files, true, directoryService); return list; } - private void PopulateImages(IHasImages item, List<LocalImageInfo> images, Dictionary<string, string> files) + public List<LocalImageInfo> GetImages(IHasImages item, string path, IDirectoryService directoryService) + { + return GetImages(item, new[] { path }, directoryService); + } + + public List<LocalImageInfo> GetImages(IHasImages item, IEnumerable<string> paths, IDirectoryService directoryService) + { + var files = paths.SelectMany(directoryService.GetFiles) + .Where(i => + { + var ext = i.Extension; + + return !string.IsNullOrEmpty(ext) && + BaseItem.SupportedImageExtensions.Contains(ext, StringComparer.OrdinalIgnoreCase); + }) + .Cast<FileSystemInfo>() + .ToList(); + + var list = new List<LocalImageInfo>(); + + PopulateImages(item, list, files, false, directoryService); + + return list; + } + + private void PopulateImages(IHasImages item, List<LocalImageInfo> images, List<FileSystemInfo> files, bool supportParentSeriesFiles, IDirectoryService directoryService) { var imagePrefix = string.Empty; @@ -103,7 +123,7 @@ namespace MediaBrowser.Providers.All } PopulatePrimaryImages(item, images, files, imagePrefix); - PopulateBackdrops(item, images, files, imagePrefix); + PopulateBackdrops(item, images, files, imagePrefix, directoryService); PopulateScreenshots(images, files, imagePrefix); AddImage(files, images, imagePrefix + "logo", ImageType.Logo); @@ -122,15 +142,18 @@ namespace MediaBrowser.Providers.All AddImage(files, images, imagePrefix + "thumb", ImageType.Thumb); AddImage(files, images, imagePrefix + "landscape", ImageType.Thumb); - var season = item as Season; - - if (season != null) + if (supportParentSeriesFiles) { - PopulateSeasonImagesFromSeriesFolder(season, images); + var season = item as Season; + + if (season != null) + { + PopulateSeasonImagesFromSeriesFolder(season, images, directoryService); + } } } - private void PopulatePrimaryImages(IHasImages item, List<LocalImageInfo> images, Dictionary<string, string> files, string imagePrefix) + private void PopulatePrimaryImages(IHasImages item, List<LocalImageInfo> images, List<FileSystemInfo> files, string imagePrefix) { AddImage(files, images, imagePrefix + "folder", ImageType.Primary); AddImage(files, images, imagePrefix + "cover", ImageType.Primary); @@ -161,7 +184,7 @@ namespace MediaBrowser.Providers.All } } - private void PopulateBackdrops(IHasImages item, List<LocalImageInfo> images, Dictionary<string, string> files, string imagePrefix) + private void PopulateBackdrops(IHasImages item, List<LocalImageInfo> images, List<FileSystemInfo> files, string imagePrefix, IDirectoryService directoryService) { PopulateBackdrops(images, files, imagePrefix, "backdrop", "backdrop", ImageType.Backdrop); @@ -179,19 +202,21 @@ namespace MediaBrowser.Providers.All PopulateBackdrops(images, files, imagePrefix, "background", "background-", ImageType.Backdrop); PopulateBackdrops(images, files, imagePrefix, "art", "art-", ImageType.Backdrop); - string extraFanartFolder; - if (files.TryGetValue("extrafanart", out extraFanartFolder)) + var extraFanartFolder = files.OfType<DirectoryInfo>() + .FirstOrDefault(i => string.Equals(i.Name, "extrafanart", StringComparison.OrdinalIgnoreCase)); + + if (extraFanartFolder != null) { - PopulateBackdropsFromExtraFanart(extraFanartFolder, images); + PopulateBackdropsFromExtraFanart(extraFanartFolder.FullName, images, directoryService); } } - private void PopulateBackdropsFromExtraFanart(string path, List<LocalImageInfo> images) + private void PopulateBackdropsFromExtraFanart(string path, List<LocalImageInfo> images, IDirectoryService directoryService) { - var imageFiles = Directory.EnumerateFiles(path, "*", SearchOption.TopDirectoryOnly) + var imageFiles = directoryService.GetFiles(path) .Where(i => { - var extension = Path.GetExtension(i); + var extension = i.Extension; if (string.IsNullOrEmpty(extension)) { @@ -203,17 +228,17 @@ namespace MediaBrowser.Providers.All images.AddRange(imageFiles.Select(i => new LocalImageInfo { - Path = i, + FileInfo = i, Type = ImageType.Backdrop })); } - private void PopulateScreenshots(List<LocalImageInfo> images, Dictionary<string, string> files, string imagePrefix) + private void PopulateScreenshots(List<LocalImageInfo> images, List<FileSystemInfo> files, string imagePrefix) { PopulateBackdrops(images, files, imagePrefix, "screenshot", "screenshot", ImageType.Screenshot); } - private void PopulateBackdrops(List<LocalImageInfo> images, Dictionary<string, string> files, string imagePrefix, string firstFileName, string subsequentFileNamePrefix, ImageType type) + private void PopulateBackdrops(List<LocalImageInfo> images, List<FileSystemInfo> files, string imagePrefix, string firstFileName, string subsequentFileNamePrefix, ImageType type) { AddImage(files, images, imagePrefix + firstFileName, type); @@ -236,7 +261,7 @@ namespace MediaBrowser.Providers.All } private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - private void PopulateSeasonImagesFromSeriesFolder(Season season, List<LocalImageInfo> images) + private void PopulateSeasonImagesFromSeriesFolder(Season season, List<LocalImageInfo> images, IDirectoryService directoryService) { var seasonNumber = season.IndexNumber; @@ -246,7 +271,7 @@ namespace MediaBrowser.Providers.All return; } - var files = GetFileDictionary(GetFiles(series, false)); + var seriesFiles = GetFiles(series, false, directoryService).ToList(); // Try using the season name var prefix = season.Name.ToLower().Replace(" ", string.Empty); @@ -265,39 +290,22 @@ namespace MediaBrowser.Providers.All foreach (var filename in filenamePrefixes) { - AddImage(files, images, filename + "-poster", ImageType.Primary); - AddImage(files, images, filename + "-fanart", ImageType.Backdrop); - AddImage(files, images, filename + "-banner", ImageType.Banner); - AddImage(files, images, filename + "-landscape", ImageType.Thumb); + AddImage(seriesFiles, images, filename + "-poster", ImageType.Primary); + AddImage(seriesFiles, images, filename + "-fanart", ImageType.Backdrop); + AddImage(seriesFiles, images, filename + "-banner", ImageType.Banner); + AddImage(seriesFiles, images, filename + "-landscape", ImageType.Thumb); } } - private Dictionary<string, string> GetFileDictionary(IEnumerable<string> paths) + private bool AddImage(IEnumerable<FileSystemInfo> files, List<LocalImageInfo> images, string name, ImageType type) { - var dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); - - foreach (var path in paths) - { - var filename = Path.GetFileName(path); - - if (!string.IsNullOrEmpty(filename)) - { - dict[filename] = path; - } - } - - return dict; - } - - private bool AddImage(Dictionary<string, string> dict, List<LocalImageInfo> images, string name, ImageType type) - { - var image = GetImage(dict, name); + var image = GetImage(files, name) as FileInfo; if (image != null) { images.Add(new LocalImageInfo { - Path = image, + FileInfo = image, Type = type }); @@ -307,16 +315,14 @@ namespace MediaBrowser.Providers.All return false; } - private string GetImage(Dictionary<string, string> dict, string name) + private FileSystemInfo GetImage(IEnumerable<FileSystemInfo> files, string name) { - return BaseItem.SupportedImageExtensions - .Select(i => - { - var filename = name + i; - string path; + var candidates = files + .Where(i => string.Equals(name, Path.GetFileNameWithoutExtension(i.Name), StringComparison.OrdinalIgnoreCase)) + .ToList(); - return dict.TryGetValue(filename, out path) ? path : null; - }) + return BaseItem.SupportedImageExtensions + .Select(i => candidates.FirstOrDefault(c => string.Equals(c.Extension, i, StringComparison.OrdinalIgnoreCase))) .FirstOrDefault(i => i != null); } } |
