aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-12-04 00:24:41 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-12-04 00:24:41 -0500
commit5eb44c42c586af34dd16efc76240d0d6c8e02069 (patch)
treeda16bbb5f3ab9d7e7ba642aca82628794b7f7847 /MediaBrowser.Server.Implementations/Library/LibraryManager.cs
parent56f6b0335ce40aeab275f1038b96a8ecc642f18f (diff)
resolve mixed folder detection
Diffstat (limited to 'MediaBrowser.Server.Implementations/Library/LibraryManager.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs106
1 files changed, 69 insertions, 37 deletions
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
/// </summary>
/// <param name="args">The args.</param>
/// <returns>BaseItem.</returns>
- 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<T> ResolvePaths<T>(IEnumerable<FileSystemInfo> files, IDirectoryService directoryService, Folder parent, string collectionType = null)
- where T : BaseItem
+ public IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemInfo> files, IDirectoryService directoryService, Folder parent, string collectionType)
+ {
+ var fileList = files.ToList();
+
+ if (parent != null)
+ {
+ var multiItemResolvers = EntityResolvers.OfType<IMultiItemResolver>();
+
+ foreach (var resolver in multiItemResolvers)
+ {
+ var result = resolver.ResolveMultiple(parent, fileList, collectionType, directoryService);
+
+ if (result != null && result.Items.Count > 0)
+ {
+ var items = new List<BaseItem>();
+ 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<BaseItem> ResolveFileList(IEnumerable<FileSystemInfo> 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);
}
/// <summary>
@@ -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<Video>(files, directoryService, null).Select(video =>
+ return ResolvePaths(files, directoryService, null, null)
+ .OfType<Video>()
+ .Select(video =>
{
// Try to retrieve it from the db. If we don't find it, use the resolved version
var dbItem = GetItemById(video.Id) as Video;
@@ -1775,27 +1805,29 @@ 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<Video>(files, directoryService, null).Select(video =>
- {
- // Try to retrieve it from the db. If we don't find it, use the resolved version
- var dbItem = GetItemById(video.Id) as Video;
-
- if (dbItem != null)
+ return ResolvePaths(files, directoryService, null, null)
+ .OfType<Video>()
+ .Select(video =>
{
- video = dbItem;
- }
+ // Try to retrieve it from the db. If we don't find it, use the resolved version
+ var dbItem = GetItemById(video.Id) as Video;
- SetExtraTypeFromFilename(video);
+ if (dbItem != null)
+ {
+ video = dbItem;
+ }
- return video;
+ SetExtraTypeFromFilename(video);
- // Sort them so that the list can be easily compared for changes
- }).OrderBy(i => i.Path).ToList();
+ return video;
+
+ // Sort them so that the list can be easily compared for changes
+ }).OrderBy(i => i.Path).ToList();
}
private void SetExtraTypeFromFilename(Video item)
{
- var resolver = new ExtraResolver(new ExtendedNamingOptions(), new Naming.Logging.NullLogger());
+ var resolver = new ExtraResolver(new ExtendedNamingOptions(), new Naming.Logging.NullLogger(), new RegexProvider());
var result = resolver.GetExtraInfo(item.Path);