From 80b3ad7bd20329e6a5bbf6eeb76af62c87434a7c Mon Sep 17 00:00:00 2001 From: LukePulverenti Luke Pulverenti luke pulverenti Date: Thu, 19 Jul 2012 22:22:44 -0400 Subject: Moved the http server to it's own assembly. added comments and made other minor re-organizations. --- .../Events/ItemResolveEventArgs.cs | 11 +- MediaBrowser.Controller/IO/DirectoryWatchers.cs | 4 +- MediaBrowser.Controller/IO/Shortcut.cs | 3 + MediaBrowser.Controller/Kernel.cs | 126 ++++++++++++++++++++- MediaBrowser.Controller/Library/ItemController.cs | 6 + .../MediaBrowser.Controller.csproj | 4 + MediaBrowser.Controller/Resolvers/AudioResolver.cs | 2 + .../Resolvers/BaseItemResolver.cs | 19 ++++ .../Resolvers/FolderResolver.cs | 1 + MediaBrowser.Controller/Resolvers/VideoResolver.cs | 14 ++- MediaBrowser.Controller/UserController.cs | 35 +++++- MediaBrowser.Controller/Xml/BaseItemXmlParser.cs | 30 +++-- MediaBrowser.Controller/Xml/FolderXmlParser.cs | 4 + MediaBrowser.Controller/Xml/XmlExtensions.cs | 13 ++- 14 files changed, 242 insertions(+), 30 deletions(-) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Events/ItemResolveEventArgs.cs b/MediaBrowser.Controller/Events/ItemResolveEventArgs.cs index c05c139fb0..7c4af71ebc 100644 --- a/MediaBrowser.Controller/Events/ItemResolveEventArgs.cs +++ b/MediaBrowser.Controller/Events/ItemResolveEventArgs.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; -using MediaBrowser.Model.Entities; using System.IO; -using System.Linq; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Events { + /// + /// This is an EventArgs object used when resolving a Path into a BaseItem + /// public class ItemResolveEventArgs : PreBeginResolveEventArgs { public IEnumerable> FileSystemChildren { get; set; } @@ -57,6 +59,11 @@ namespace MediaBrowser.Controller.Events } } + /// + /// 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 + /// public class PreBeginResolveEventArgs : EventArgs { public string Path { get; set; } diff --git a/MediaBrowser.Controller/IO/DirectoryWatchers.cs b/MediaBrowser.Controller/IO/DirectoryWatchers.cs index dd27695834..8d102e80ce 100644 --- a/MediaBrowser.Controller/IO/DirectoryWatchers.cs +++ b/MediaBrowser.Controller/IO/DirectoryWatchers.cs @@ -24,9 +24,9 @@ namespace MediaBrowser.Controller.IO pathsToWatch.Add(rootFolder.Path); - foreach (Folder folder in rootFolder.FolderChildren) + foreach (Folder folder in rootFolder.Children.OfType()) { - foreach (Folder subFolder in folder.FolderChildren) + foreach (Folder subFolder in folder.Children.OfType()) { if (Path.IsPathRooted(subFolder.Path)) { diff --git a/MediaBrowser.Controller/IO/Shortcut.cs b/MediaBrowser.Controller/IO/Shortcut.cs index 376d16a795..83e2c0eda3 100644 --- a/MediaBrowser.Controller/IO/Shortcut.cs +++ b/MediaBrowser.Controller/IO/Shortcut.cs @@ -5,6 +5,9 @@ using System.Text; namespace MediaBrowser.Controller.IO { + /// + /// Contains helpers to interact with shortcut files (.lnk) + /// public static class Shortcut { #region Signitures were imported from http://pinvoke.net diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index 3f6e7bbb0e..9cbef68740 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -7,7 +7,6 @@ using System.Text; using System.Threading.Tasks; using MediaBrowser.Common.Json; using MediaBrowser.Common.Logging; -using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; using MediaBrowser.Controller.Events; using MediaBrowser.Controller.IO; @@ -16,6 +15,7 @@ using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Users; +using MediaBrowser.Net; namespace MediaBrowser.Controller { @@ -79,7 +79,7 @@ namespace MediaBrowser.Controller ReloadHttpServer(); - ReloadPlugins(); + LoadPlugins(); // Get users from users folder // Load root media folder @@ -94,7 +94,7 @@ namespace MediaBrowser.Controller Logger.LoggerInstance.LogSeverity = Configuration.LogSeverity; } - private void ReloadPlugins() + private void LoadPlugins() { // Find plugins Plugins = PluginController.GetAllPlugins(); @@ -261,7 +261,7 @@ namespace MediaBrowser.Controller /// public IEnumerable GetParentalAllowedChildren(Folder folder, Guid userId) { - return folder.Children.ToList().Where(i => IsParentalAllowed(i, userId)); + return folder.Children.Where(i => IsParentalAllowed(i, userId)); } /// @@ -307,7 +307,7 @@ namespace MediaBrowser.Controller { DateTime now = DateTime.Now; - return GetParentalAllowedRecursiveChildren(parent, userId).Where(i => (now - i.DateCreated).TotalDays < Configuration.RecentItemDays); + return GetParentalAllowedRecursiveChildren(parent, userId).Where(i => !(i is Folder) && (now - i.DateCreated).TotalDays < Configuration.RecentItemDays); } /// @@ -330,6 +330,11 @@ namespace MediaBrowser.Controller { return GetParentalAllowedRecursiveChildren(parent, userId).Where(i => { + if (i is Folder) + { + return false; + } + var userdata = GetUserItemData(userId, i.Id); return userdata != null && userdata.PlaybackPosition.Ticks > 0; @@ -359,5 +364,116 @@ namespace MediaBrowser.Controller { return GetParentalAllowedRecursiveChildren(parent, userId).Where(f => f.People != null && f.People.Any(s => s.Name.Equals(personName, StringComparison.OrdinalIgnoreCase))); } + + /// + /// Gets all studios from all recursive children of a folder + /// The CategoryInfo class is used to keep track of the number of times each studio appears + /// + public IEnumerable GetAllStudios(Folder parent, Guid userId) + { + Dictionary data = new Dictionary(); + + // Get all the allowed recursive children + IEnumerable allItems = Kernel.Instance.GetParentalAllowedRecursiveChildren(parent, userId); + + foreach (var item in allItems) + { + // Add each studio from the item to the data dictionary + // If the studio already exists, increment the count + if (item.Studios == null) + { + continue; + } + + foreach (string val in item.Studios) + { + if (!data.ContainsKey(val)) + { + data.Add(val, 1); + } + else + { + data[val]++; + } + } + } + + // Now go through the dictionary and create a Category for each studio + List list = new List(); + + foreach (string key in data.Keys) + { + // Get the original entity so that we can also supply the PrimaryImagePath + Studio entity = Kernel.Instance.ItemController.GetStudio(key); + + if (entity != null) + { + list.Add(new CategoryInfo() + { + Name = entity.Name, + ItemCount = data[key], + PrimaryImagePath = entity.PrimaryImagePath + }); + } + } + + return list; + } + + /// + /// Gets all genres from all recursive children of a folder + /// The CategoryInfo class is used to keep track of the number of times each genres appears + /// + public IEnumerable GetAllGenres(Folder parent, Guid userId) + { + Dictionary data = new Dictionary(); + + // Get all the allowed recursive children + IEnumerable allItems = Kernel.Instance.GetParentalAllowedRecursiveChildren(parent, userId); + + foreach (var item in allItems) + { + // Add each genre from the item to the data dictionary + // If the genre already exists, increment the count + if (item.Genres == null) + { + continue; + } + + foreach (string val in item.Genres) + { + if (!data.ContainsKey(val)) + { + data.Add(val, 1); + } + else + { + data[val]++; + } + } + } + + // Now go through the dictionary and create a Category for each genre + List list = new List(); + + foreach (string key in data.Keys) + { + // Get the original entity so that we can also supply the PrimaryImagePath + Genre entity = Kernel.Instance.ItemController.GetGenre(key); + + if (entity != null) + { + list.Add(new CategoryInfo() + { + Name = entity.Name, + ItemCount = data[key], + PrimaryImagePath = entity.PrimaryImagePath + }); + } + } + + return list; + } + } } diff --git a/MediaBrowser.Controller/Library/ItemController.cs b/MediaBrowser.Controller/Library/ItemController.cs index b872e8dbae..fee53e3bb6 100644 --- a/MediaBrowser.Controller/Library/ItemController.cs +++ b/MediaBrowser.Controller/Library/ItemController.cs @@ -323,6 +323,12 @@ namespace MediaBrowser.Controller.Library return null; } + public Genre GetGenre(string name) + { + // not yet implemented + return null; + } + public Year GetYear(int value) { // not yet implemented diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 719d279eeb..1f57090a67 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -66,6 +66,10 @@ {7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b} MediaBrowser.Model + + {5da08d1c-0d52-4b1b-aa66-e4a171d938f6} + MediaBrowser.Net + diff --git a/MediaBrowser.Controller/Resolvers/AudioResolver.cs b/MediaBrowser.Controller/Resolvers/AudioResolver.cs index f9ce5ecd70..2ca54e71d4 100644 --- a/MediaBrowser.Controller/Resolvers/AudioResolver.cs +++ b/MediaBrowser.Controller/Resolvers/AudioResolver.cs @@ -8,6 +8,8 @@ namespace MediaBrowser.Controller.Resolvers { protected override Audio Resolve(ItemResolveEventArgs args) { + // Return audio if the path is a file and has a matching extension + if (!args.IsFolder) { if (IsAudioFile(args.Path)) diff --git a/MediaBrowser.Controller/Resolvers/BaseItemResolver.cs b/MediaBrowser.Controller/Resolvers/BaseItemResolver.cs index e2c49e90c1..dccdf57e1b 100644 --- a/MediaBrowser.Controller/Resolvers/BaseItemResolver.cs +++ b/MediaBrowser.Controller/Resolvers/BaseItemResolver.cs @@ -15,6 +15,9 @@ namespace MediaBrowser.Controller.Resolvers return null; } + /// + /// Sets initial values on the newly resolved item + /// protected virtual void SetItemValues(T item, ItemResolveEventArgs args) { // If the subclass didn't specify this @@ -23,6 +26,7 @@ namespace MediaBrowser.Controller.Resolvers item.Path = args.Path; } + // If the subclass didn't specify this if (args.Parent != null) { item.Parent = args.Parent; @@ -40,9 +44,14 @@ namespace MediaBrowser.Controller.Resolvers if (item != null) { + // Set initial values on the newly resolved item + SetItemValues(item, args); + // Make sure the item has a name EnsureName(item); + + // Make sure DateCreated and DateModified have values EnsureDates(item); } @@ -59,6 +68,9 @@ namespace MediaBrowser.Controller.Resolvers } + /// + /// Ensures DateCreated and DateModified have values + /// private void EnsureDates(T item) { // If the subclass didn't supply dates, add them here @@ -73,6 +85,9 @@ namespace MediaBrowser.Controller.Resolvers } } + /// + /// Fills in image paths based on files win the folder + /// protected virtual void PopulateImages(T item, ItemResolveEventArgs args) { List backdropFiles = new List(); @@ -88,6 +103,7 @@ namespace MediaBrowser.Controller.Resolvers string ext = Path.GetExtension(filePath); + // Only support png and jpg files if (!ext.EndsWith("png", StringComparison.OrdinalIgnoreCase) && !ext.EndsWith("jpg", StringComparison.OrdinalIgnoreCase)) { continue; @@ -137,6 +153,9 @@ namespace MediaBrowser.Controller.Resolvers } } + /// + /// Weed this to keep a list of resolvers, since Resolvers are built with generics + /// public interface IBaseItemResolver { BaseItem ResolvePath(ItemResolveEventArgs args); diff --git a/MediaBrowser.Controller/Resolvers/FolderResolver.cs b/MediaBrowser.Controller/Resolvers/FolderResolver.cs index 5c57c6bb3c..6101a45fd8 100644 --- a/MediaBrowser.Controller/Resolvers/FolderResolver.cs +++ b/MediaBrowser.Controller/Resolvers/FolderResolver.cs @@ -29,6 +29,7 @@ namespace MediaBrowser.Controller.Resolvers item.IsRoot = args.Parent == null; + // Read data from folder.xml, if it exists PopulateFolderMetadata(item, args); } diff --git a/MediaBrowser.Controller/Resolvers/VideoResolver.cs b/MediaBrowser.Controller/Resolvers/VideoResolver.cs index ba51dab875..df304c3290 100644 --- a/MediaBrowser.Controller/Resolvers/VideoResolver.cs +++ b/MediaBrowser.Controller/Resolvers/VideoResolver.cs @@ -1,20 +1,26 @@ -using System.IO; +using System.Collections.Generic; +using System.IO; using MediaBrowser.Controller.Events; using MediaBrowser.Model.Entities; -using System.Linq; -using System.Collections.Generic; namespace MediaBrowser.Controller.Resolvers { + /// + /// Resolves a Path into a Video + /// public class VideoResolver : BaseVideoResolver