aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/All/LocalImageProvider.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/All/LocalImageProvider.cs')
-rw-r--r--MediaBrowser.Providers/All/LocalImageProvider.cs150
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);
}
}