using System; using System.IO; using System.Linq; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.IO; namespace Emby.Server.Implementations.Library { /// /// Class ResolverHelper. /// 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.IsNullOrEmpty(item.Path)) { throw new ArgumentException("Item must have a Path"); } // If the resolver didn't specify this if (parent != null) { item.SetParent(parent); } item.Id = libraryManager.GetNewItemId(item.Path, item.GetType()); item.IsLocked = item.Path.IndexOf("[dontfetchmeta]", StringComparison.OrdinalIgnoreCase) != -1 || item.GetParents().Any(i => i.IsLocked); // Make sure DateCreated and DateModified have values var fileInfo = directoryService.GetFile(item.Path); SetDateCreated(item, fileSystem, fileInfo); EnsureName(item, item.Path, 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 if (string.IsNullOrEmpty(item.Path)) { item.Path = args.Path; } // If the resolver didn't specify this if (args.Parent != null) { item.SetParent(args.Parent); } item.Id = libraryManager.GetNewItemId(item.Path, item.GetType()); // Make sure the item has a name EnsureName(item, item.Path, args.FileInfo); item.IsLocked = item.Path.IndexOf("[dontfetchmeta]", StringComparison.OrdinalIgnoreCase) != -1 || item.GetParents().Any(i => i.IsLocked); // Make sure DateCreated and DateModified have values EnsureDates(fileSystem, item, args); } /// /// Ensures the name. /// private static void EnsureName(BaseItem item, string fullPath, FileSystemMetadata fileInfo) { // If the subclass didn't supply a name, add it here if (string.IsNullOrEmpty(item.Name) && !string.IsNullOrEmpty(fullPath)) { var fileName = fileInfo == null ? Path.GetFileName(fullPath) : fileInfo.Name; item.Name = GetDisplayName(fileName, fileInfo != null && fileInfo.IsDirectory); } } /// /// Gets the display name. /// /// The path. /// if set to true [is directory]. /// System.String. private static string GetDisplayName(string path, bool isDirectory) { return isDirectory ? Path.GetFileName(path) : Path.GetFileNameWithoutExtension(path); } /// /// Ensures DateCreated and DateModified have values. /// /// The file system. /// The item. /// The args. private static void EnsureDates(IFileSystem fileSystem, BaseItem item, ItemResolveArgs args) { if (fileSystem == null) { throw new ArgumentNullException(nameof(fileSystem)); } if (item == null) { throw new ArgumentNullException(nameof(item)); } if (args == null) { throw new ArgumentNullException(nameof(args)); } // See if a different path came out of the resolver than what went in if (!fileSystem.AreEqual(args.Path, item.Path)) { var childData = args.IsDirectory ? args.GetFileSystemEntryByPath(item.Path) : null; if (childData != null) { SetDateCreated(item, fileSystem, childData); } else { var fileData = fileSystem.GetFileSystemInfo(item.Path); if (fileData.Exists) { SetDateCreated(item, fileSystem, fileData); } } } else { SetDateCreated(item, fileSystem, args.FileInfo); } } private static void SetDateCreated(BaseItem item, IFileSystem fileSystem, FileSystemMetadata info) { var config = BaseItem.ConfigurationManager.GetMetadataConfiguration(); if (config.UseFileCreationTimeForDateAdded) { // directoryService.getFile may return null if (info != null) { var dateCreated = fileSystem.GetCreationTimeUtc(info); if (dateCreated.Equals(DateTime.MinValue)) { dateCreated = DateTime.UtcNow; } item.DateCreated = dateCreated; } } else { item.DateCreated = DateTime.UtcNow; } } } }