diff options
Diffstat (limited to 'MediaBrowser.Controller/Library')
3 files changed, 274 insertions, 0 deletions
diff --git a/MediaBrowser.Controller/Library/ChildrenChangedEventArgs.cs b/MediaBrowser.Controller/Library/ChildrenChangedEventArgs.cs new file mode 100644 index 000000000..462fcc6d6 --- /dev/null +++ b/MediaBrowser.Controller/Library/ChildrenChangedEventArgs.cs @@ -0,0 +1,34 @@ +using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using MediaBrowser.Controller.Entities;
+
+namespace MediaBrowser.Controller.Library
+{
+ public class ChildrenChangedEventArgs : EventArgs
+ {
+ public Folder Folder { get; set; }
+ public List<BaseItem> ItemsAdded { get; set; }
+ public IEnumerable<BaseItem> ItemsRemoved { get; set; }
+
+ public ChildrenChangedEventArgs()
+ {
+ //initialize the list
+ ItemsAdded = new List<BaseItem>();
+ }
+
+ /// <summary>
+ /// Create the args and set the folder property
+ /// </summary>
+ /// <param name="folder"></param>
+ public ChildrenChangedEventArgs(Folder folder)
+ {
+ //init the folder property
+ this.Folder = folder;
+ //init the list
+ ItemsAdded = new List<BaseItem>();
+ }
+ }
+}
diff --git a/MediaBrowser.Controller/Library/ItemController.cs b/MediaBrowser.Controller/Library/ItemController.cs new file mode 100644 index 000000000..54673e538 --- /dev/null +++ b/MediaBrowser.Controller/Library/ItemController.cs @@ -0,0 +1,136 @@ +using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Controller.Resolvers;
+using MediaBrowser.Common.Extensions;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Library
+{
+ public class ItemController
+ {
+
+ /// <summary>
+ /// Resolves a path into a BaseItem
+ /// </summary>
+ public async Task<BaseItem> GetItem(string path, Folder parent = null, WIN32_FIND_DATA? fileInfo = null, bool allowInternetProviders = true)
+ {
+ var args = new ItemResolveEventArgs
+ {
+ FileInfo = fileInfo ?? FileData.GetFileData(path),
+ Parent = parent,
+ Cancel = false,
+ Path = path
+ };
+
+ // Gather child folder and files
+ if (args.IsDirectory)
+ {
+ args.FileSystemChildren = FileData.GetFileSystemEntries(path, "*").ToArray();
+
+ bool isVirtualFolder = parent != null && parent.IsRoot;
+ args = FileSystemHelper.FilterChildFileSystemEntries(args, isVirtualFolder);
+ }
+ else
+ {
+ args.FileSystemChildren = new WIN32_FIND_DATA[] { };
+ }
+
+
+ // Check to see if we should resolve based on our contents
+ if (!EntityResolutionHelper.ShouldResolvePathContents(args))
+ {
+ return null;
+ }
+
+ BaseItem item = Kernel.Instance.ResolveItem(args);
+
+ return item;
+ }
+
+ /// <summary>
+ /// Gets a Person
+ /// </summary>
+ public Task<Person> GetPerson(string name)
+ {
+ return GetImagesByNameItem<Person>(Kernel.Instance.ApplicationPaths.PeoplePath, name);
+ }
+
+ /// <summary>
+ /// Gets a Studio
+ /// </summary>
+ public Task<Studio> GetStudio(string name)
+ {
+ return GetImagesByNameItem<Studio>(Kernel.Instance.ApplicationPaths.StudioPath, name);
+ }
+
+ /// <summary>
+ /// Gets a Genre
+ /// </summary>
+ public Task<Genre> GetGenre(string name)
+ {
+ return GetImagesByNameItem<Genre>(Kernel.Instance.ApplicationPaths.GenrePath, name);
+ }
+
+ /// <summary>
+ /// Gets a Year
+ /// </summary>
+ public Task<Year> GetYear(int value)
+ {
+ return GetImagesByNameItem<Year>(Kernel.Instance.ApplicationPaths.YearPath, value.ToString());
+ }
+
+ private readonly ConcurrentDictionary<string, object> ImagesByNameItemCache = new ConcurrentDictionary<string, object>(StringComparer.OrdinalIgnoreCase);
+
+ /// <summary>
+ /// Generically retrieves an IBN item
+ /// </summary>
+ private Task<T> GetImagesByNameItem<T>(string path, string name)
+ where T : BaseEntity, new()
+ {
+ name = FileData.GetValidFilename(name);
+
+ path = Path.Combine(path, name);
+
+ // Look for it in the cache, if it's not there, create it
+ if (!ImagesByNameItemCache.ContainsKey(path))
+ {
+ ImagesByNameItemCache[path] = CreateImagesByNameItem<T>(path, name);
+ }
+
+ return ImagesByNameItemCache[path] as Task<T>;
+ }
+
+ /// <summary>
+ /// Creates an IBN item based on a given path
+ /// </summary>
+ private async Task<T> CreateImagesByNameItem<T>(string path, string name)
+ where T : BaseEntity, new()
+ {
+ var item = new T { };
+
+ item.Name = name;
+ item.Id = path.GetMD5();
+
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ }
+
+ item.DateCreated = Directory.GetCreationTimeUtc(path);
+ item.DateModified = Directory.GetLastWriteTimeUtc(path);
+
+ var args = new ItemResolveEventArgs { };
+ args.FileInfo = FileData.GetFileData(path);
+ args.FileSystemChildren = FileData.GetFileSystemEntries(path, "*").ToArray();
+
+ await Kernel.Instance.ExecuteMetadataProviders(item).ConfigureAwait(false);
+
+ return item;
+ }
+ }
+}
diff --git a/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs b/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs new file mode 100644 index 000000000..32b8783df --- /dev/null +++ b/MediaBrowser.Controller/Library/ItemResolveEventArgs.cs @@ -0,0 +1,104 @@ +using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.IO;
+using System.Collections.Generic;
+using System.Linq;
+using System;
+using System.IO;
+
+namespace MediaBrowser.Controller.Library
+{
+ /// <summary>
+ /// This is an EventArgs object used when resolving a Path into a BaseItem
+ /// </summary>
+ public class ItemResolveEventArgs : PreBeginResolveEventArgs
+ {
+ public WIN32_FIND_DATA[] FileSystemChildren { get; set; }
+
+ protected List<string> _additionalLocations = new List<string>();
+ public List<string> AdditionalLocations
+ {
+ get
+ {
+ return _additionalLocations;
+ }
+ set
+ {
+ _additionalLocations = value;
+ }
+ }
+
+ public IEnumerable<string> PhysicalLocations
+ {
+ get
+ {
+ return (new List<string>() {this.Path}).Concat(AdditionalLocations);
+ }
+ }
+
+ public bool IsBDFolder { get; set; }
+ public bool IsDVDFolder { get; set; }
+ public bool IsHDDVDFolder { get; set; }
+
+ /// <summary>
+ /// Store these to reduce disk access in Resolvers
+ /// </summary>
+ public string[] MetadataFiles { get; set; }
+
+ public WIN32_FIND_DATA? GetFileSystemEntry(string path)
+ {
+ WIN32_FIND_DATA entry = FileSystemChildren.FirstOrDefault(f => f.Path.Equals(path, StringComparison.OrdinalIgnoreCase));
+ return entry.cFileName != null ? (WIN32_FIND_DATA?)entry : null;
+ }
+
+ public bool ContainsFile(string name)
+ {
+ return FileSystemChildren.FirstOrDefault(f => f.cFileName.Equals(name, StringComparison.OrdinalIgnoreCase)).cFileName != null;
+ }
+
+ public bool ContainsFolder(string name)
+ {
+ return ContainsFile(name);
+ }
+ }
+
+ /// <summary>
+ /// This is an EventArgs object used before we begin resolving a Path into a BaseItem
+ /// File system children have not been collected yet, but consuming events will
+ /// have a chance to cancel resolution based on the Path, Parent and FileAttributes
+ /// </summary>
+ public class PreBeginResolveEventArgs : EventArgs
+ {
+ public Folder Parent { get; set; }
+
+ public bool Cancel { get; set; }
+
+ public WIN32_FIND_DATA FileInfo { get; set; }
+
+ public string Path { get; set; }
+
+ public bool IsDirectory
+ {
+ get
+ {
+ return FileInfo.dwFileAttributes.HasFlag(FileAttributes.Directory);
+ }
+ }
+
+ public bool IsHidden
+ {
+ get
+ {
+ return FileInfo.IsHidden;
+ }
+ }
+
+ public bool IsSystemFile
+ {
+ get
+ {
+ return FileInfo.IsSystemFile;
+ }
+ }
+
+ }
+}
|
