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/ResolverHelper.cs | 134 +++++++++++++++++++-- 1 file changed, 124 insertions(+), 10 deletions(-) (limited to 'MediaBrowser.Server.Implementations/Library/ResolverHelper.cs') diff --git a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs index d071fd232..03e28d7ba 100644 --- a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs +++ b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; using System; using System.IO; using System.Linq; @@ -13,12 +14,55 @@ namespace MediaBrowser.Server.Implementations.Library /// public static class ResolverHelper { + /// + /// Sets the initial item values. + /// + /// The item. + /// The parent. + /// The file system. + /// The library manager. + /// The directory service. + /// Item must have a path + public static void SetInitialItemValues(BaseItem item, Folder parent, IFileSystem fileSystem, ILibraryManager libraryManager, IDirectoryService directoryService) + { + // This version of the below method has no ItemResolveArgs, so we have to require the path already being set + if (string.IsNullOrWhiteSpace(item.Path)) + { + throw new ArgumentException("Item must have a Path"); + } + + // If the resolver didn't specify this + if (parent != null) + { + item.Parent = parent; + } + + item.Id = libraryManager.GetNewItemId(item.Path, item.GetType()); + + // If the resolver didn't specify this + if (string.IsNullOrEmpty(item.DisplayMediaType)) + { + item.DisplayMediaType = item.GetType().Name; + } + + item.IsLocked = item.Path.IndexOf("[dontfetchmeta]", StringComparison.OrdinalIgnoreCase) != -1 || + item.Parents.Any(i => i.IsLocked); + + // Make sure DateCreated and DateModified have values + var fileInfo = directoryService.GetFile(item.Path); + item.DateModified = fileSystem.GetLastWriteTimeUtc(fileInfo); + SetDateCreated(item, fileSystem, fileInfo); + + EnsureName(item, fileInfo); + } + /// /// Sets the initial item values. /// /// The item. /// The args. /// The file system. + /// The library manager. public static void SetInitialItemValues(BaseItem item, ItemResolveArgs args, IFileSystem fileSystem, ILibraryManager libraryManager) { // If the resolver didn't specify this @@ -42,27 +86,26 @@ namespace MediaBrowser.Server.Implementations.Library } // Make sure the item has a name - EnsureName(item, args); + EnsureName(item, args.FileInfo); item.IsLocked = item.Path.IndexOf("[dontfetchmeta]", StringComparison.OrdinalIgnoreCase) != -1 || item.Parents.Any(i => i.IsLocked); // Make sure DateCreated and DateModified have values - EntityResolutionHelper.EnsureDates(fileSystem, item, args, true); + EnsureDates(fileSystem, item, args, true); } /// /// Ensures the name. /// /// The item. - /// The arguments. - private static void EnsureName(BaseItem item, ItemResolveArgs args) + /// The file information. + private static void EnsureName(BaseItem item, FileSystemInfo fileInfo) { // If the subclass didn't supply a name, add it here if (string.IsNullOrEmpty(item.Name) && !string.IsNullOrEmpty(item.Path)) { - //we use our resolve args name here to get the name of the containg folder, not actual video file - item.Name = GetDisplayName(args.FileInfo.Name, (args.FileInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory); + item.Name = GetDisplayName(fileInfo.Name, (fileInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory); } } @@ -74,10 +117,7 @@ namespace MediaBrowser.Server.Implementations.Library /// System.String. private static string GetDisplayName(string path, bool isDirectory) { - //first just get the file or directory name - var fn = isDirectory ? Path.GetFileName(path) : Path.GetFileNameWithoutExtension(path); - - return fn; + return isDirectory ? Path.GetFileName(path) : Path.GetFileNameWithoutExtension(path); } /// @@ -90,5 +130,79 @@ namespace MediaBrowser.Server.Implementations.Library var output = MbNameRegex.Replace(inputString, string.Empty).Trim(); return Regex.Replace(output, @"\s+", " "); } + + /// + /// Ensures DateCreated and DateModified have values + /// + /// The file system. + /// The item. + /// The args. + /// if set to true [include creation time]. + private static void EnsureDates(IFileSystem fileSystem, BaseItem item, ItemResolveArgs args, bool includeCreationTime) + { + if (fileSystem == null) + { + throw new ArgumentNullException("fileSystem"); + } + if (item == null) + { + throw new ArgumentNullException("item"); + } + if (args == null) + { + throw new ArgumentNullException("args"); + } + + // See if a different path came out of the resolver than what went in + if (!string.Equals(args.Path, item.Path, StringComparison.OrdinalIgnoreCase)) + { + var childData = args.IsDirectory ? args.GetFileSystemEntryByPath(item.Path) : null; + + if (childData != null) + { + if (includeCreationTime) + { + SetDateCreated(item, fileSystem, childData); + } + + item.DateModified = fileSystem.GetLastWriteTimeUtc(childData); + } + else + { + var fileData = fileSystem.GetFileSystemInfo(item.Path); + + if (fileData.Exists) + { + if (includeCreationTime) + { + SetDateCreated(item, fileSystem, fileData); + } + item.DateModified = fileSystem.GetLastWriteTimeUtc(fileData); + } + } + } + else + { + if (includeCreationTime) + { + SetDateCreated(item, fileSystem, args.FileInfo); + } + item.DateModified = fileSystem.GetLastWriteTimeUtc(args.FileInfo); + } + } + + private static void SetDateCreated(BaseItem item, IFileSystem fileSystem, FileSystemInfo info) + { + var config = BaseItem.ConfigurationManager.GetMetadataConfiguration(); + + if (config.UseFileCreationTimeForDateAdded) + { + item.DateCreated = fileSystem.GetCreationTimeUtc(info); + } + else + { + item.DateCreated = DateTime.UtcNow; + } + } } } -- cgit v1.2.3