diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index 2d49708fe..10c5c116a 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs @@ -354,7 +354,7 @@ namespace MediaBrowser.Controller.Providers } private Dictionary _fileStampExtensionsDictionary; - private Dictionary FileStampExtensionsDictionary + private Dictionary FileStampExtensionsDictionary { get { @@ -400,46 +400,50 @@ namespace MediaBrowser.Controller.Providers // Record the name of each file // Need to sort these because accoring to msdn docs, our i/o methods are not guaranteed in any order - foreach (var file in resolveArgs.FileSystemChildren - .Where(i => IncludeInFileStamp(i, extensions, numExtensions)) - .OrderBy(f => f.Name)) - { - sb.Append(file.Name); - } - - foreach (var file in resolveArgs.MetadataFiles - .Where(i => IncludeInFileStamp(i, extensions, numExtensions)) - .OrderBy(f => f.Name)) - { - sb.Append(file.Name); - } + AddFiles(sb, resolveArgs.FileSystemChildren, extensions, numExtensions); + AddFiles(sb, resolveArgs.MetadataFiles, extensions, numExtensions); return sb.ToString().GetMD5(); } + private static readonly Dictionary FoldersToMonitor = new[] { "extrafanart" } + .ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); + /// - /// Includes the in file stamp. + /// Adds the files. /// - /// The file. + /// The sb. + /// The files. /// The extensions. /// The num extensions. - /// true if XXXX, false otherwise - private bool IncludeInFileStamp(FileSystemInfo file, Dictionary extensions, int numExtensions) + private void AddFiles(StringBuilder sb, IEnumerable files, Dictionary extensions, int numExtensions) { - try + foreach (var file in files + .OrderBy(f => f.Name)) { - if ((file.Attributes & FileAttributes.Directory) == FileAttributes.Directory) + try { - return false; + if ((file.Attributes & FileAttributes.Directory) == FileAttributes.Directory) + { + if (FoldersToMonitor.ContainsKey(file.Name)) + { + sb.Append(file.Name); + + var children = ((DirectoryInfo) file).EnumerateFiles("*", SearchOption.TopDirectoryOnly).ToList(); + AddFiles(sb, children, extensions, numExtensions); + } + } + + // It's a file + else if (numExtensions == 0 || extensions.ContainsKey(file.Extension)) + { + sb.Append(file.Name); + } + } + catch (IOException ex) + { + Logger.ErrorException("Error accessing file attributes for {0}", ex, file.FullName); } - - return numExtensions == 0 || extensions.ContainsKey(file.Extension); - } - catch (IOException ex) - { - Logger.ErrorException("Error accessing file attributes for {0}", ex, file.FullName); - - return false; } } } diff --git a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs index b57184887..8ee82a131 100644 --- a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs @@ -165,7 +165,7 @@ namespace MediaBrowser.Providers } private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - + /// /// Fills in image paths based on files win the folder /// @@ -192,13 +192,13 @@ namespace MediaBrowser.Providers image = GetImage(item, args, string.Format("season-{0}", num)); } - + // Support plex/xbmc convention if (image == null && (item is Movie || item is MusicVideo || item is AdultVideo)) { image = GetImage(item, args, "movie"); } - + // Look for a file with the same name as the item if (image == null) { @@ -233,7 +233,7 @@ namespace MediaBrowser.Providers image = GetImage(item, args, string.Format("season-{0}-banner", num)); } - + if (image != null) { item.SetImage(ImageType.Banner, image.FullName); @@ -344,12 +344,48 @@ namespace MediaBrowser.Providers PopulateBackdrops(item, args, backdropFiles, "background", "background-"); PopulateBackdrops(item, args, backdropFiles, "art", "art-"); + PopulateBackdropsFromExtraFanart(args, backdropFiles); + if (backdropFiles.Count > 0) { item.BackdropImagePaths = backdropFiles; } } + /// + /// Populates the backdrops from extra fanart. + /// + /// The args. + /// The backdrops. + private void PopulateBackdropsFromExtraFanart(ItemResolveArgs args, List backdrops) + { + if (!args.IsDirectory) + { + return; + } + + if (args.ContainsFileSystemEntryByName("extrafanart")) + { + var path = Path.Combine(args.Path, "extrafanart"); + + var imageFiles = Directory.EnumerateFiles(path, "*", SearchOption.TopDirectoryOnly) + .Where(i => + { + var extension = Path.GetExtension(i); + + if (string.IsNullOrEmpty(extension)) + { + return false; + } + + return BaseItem.SupportedImageExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase); + }) + .ToList(); + + backdrops.AddRange(imageFiles); + } + } + /// /// Populates the backdrops. ///