From 5eb44c42c586af34dd16efc76240d0d6c8e02069 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 4 Dec 2014 00:24:41 -0500 Subject: resolve mixed folder detection --- .../Library/LibraryManager.cs | 106 ++++++++++++++------- 1 file changed, 69 insertions(+), 37 deletions(-) (limited to 'MediaBrowser.Server.Implementations/Library/LibraryManager.cs') diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 9c3255833..e06720192 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -466,22 +466,10 @@ namespace MediaBrowser.Server.Implementations.Library /// /// The args. /// BaseItem. - public BaseItem ResolveItem(ItemResolveArgs args) + private BaseItem ResolveItem(ItemResolveArgs args) { - var item = EntityResolvers.Select(r => - { - try - { - return r.ResolvePath(args); - } - catch (Exception ex) - { - _logger.ErrorException("Error in {0} resolving {1}", ex, r.GetType().Name, args.Path); - - return null; - } - - }).FirstOrDefault(i => i != null); + var item = EntityResolvers.Select(r => Resolve(args, r)) + .FirstOrDefault(i => i != null); if (item != null) { @@ -491,6 +479,19 @@ namespace MediaBrowser.Server.Implementations.Library return item; } + private BaseItem Resolve(ItemResolveArgs args, IItemResolver resolver) + { + try + { + return resolver.ResolvePath(args); + } + catch (Exception ex) + { + _logger.ErrorException("Error in {0} resolving {1}", ex, resolver.GetType().Name, args.Path); + return null; + } + } + public Guid GetNewItemId(string key, Type type) { if (string.IsNullOrWhiteSpace(key)) @@ -565,7 +566,7 @@ namespace MediaBrowser.Server.Implementations.Library return ResolvePath(fileInfo, new DirectoryService(_logger), parent, collectionType); } - public BaseItem ResolvePath(FileSystemInfo fileInfo, IDirectoryService directoryService, Folder parent = null, string collectionType = null) + private BaseItem ResolvePath(FileSystemInfo fileInfo, IDirectoryService directoryService, Folder parent = null, string collectionType = null) { if (fileInfo == null) { @@ -645,23 +646,50 @@ namespace MediaBrowser.Server.Implementations.Library return !args.ContainsFileSystemEntryByName(".ignore"); } - public List ResolvePaths(IEnumerable files, IDirectoryService directoryService, Folder parent, string collectionType = null) - where T : BaseItem + public IEnumerable ResolvePaths(IEnumerable files, IDirectoryService directoryService, Folder parent, string collectionType) + { + var fileList = files.ToList(); + + if (parent != null) + { + var multiItemResolvers = EntityResolvers.OfType(); + + foreach (var resolver in multiItemResolvers) + { + var result = resolver.ResolveMultiple(parent, fileList, collectionType, directoryService); + + if (result != null && result.Items.Count > 0) + { + var items = new List(); + items.AddRange(result.Items); + + foreach (var item in items) + { + ResolverHelper.SetInitialItemValues(item, parent, _fileSystem, this, directoryService); + } + items.AddRange(ResolveFileList(result.ExtraFiles, directoryService, parent, collectionType)); + return items; + } + } + } + + return ResolveFileList(fileList, directoryService, parent, collectionType); + } + + private IEnumerable ResolveFileList(IEnumerable fileList, IDirectoryService directoryService, Folder parent, string collectionType) { - return files.Select(f => + return fileList.Select(f => { try { - return ResolvePath(f, directoryService, parent, collectionType) as T; + return ResolvePath(f, directoryService, parent, collectionType); } catch (Exception ex) { _logger.ErrorException("Error resolving path {0}", ex, f.FullName); return null; } - - }).Where(i => i != null) - .ToList(); + }).Where(i => i != null); } /// @@ -1724,7 +1752,9 @@ namespace MediaBrowser.Server.Implementations.Library files.AddRange(currentVideo.Extras.Where(i => string.Equals(i.ExtraType, "trailer", StringComparison.OrdinalIgnoreCase)).Select(i => new FileInfo(i.Path))); } - return ResolvePaths