diff options
| author | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-23 10:32:54 -0500 |
|---|---|---|
| committer | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-23 10:32:54 -0500 |
| commit | 33ed929b526acbda696f00f5966917ebd6a9ded2 (patch) | |
| tree | 18e75812ce71274a3e02f800536e8c144f4e5c45 /MediaBrowser.Controller | |
| parent | 02634588710f65ce952d0229d7da6b9c9d341492 (diff) | |
| parent | e30b96217333cadb78dcc0a47545afd145c683a7 (diff) | |
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Conflicts:
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.Api.dll
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.ApiInteraction.Javascript.dll
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.Server.Sqlite.dll
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.Server.WorldWeatherOnline.dll
MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.WebDashboard.dll
Diffstat (limited to 'MediaBrowser.Controller')
58 files changed, 710 insertions, 391 deletions
diff --git a/MediaBrowser.Controller/Drawing/ImageManager.cs b/MediaBrowser.Controller/Drawing/ImageManager.cs index 16fd4a5b8..a0ba9d550 100644 --- a/MediaBrowser.Controller/Drawing/ImageManager.cs +++ b/MediaBrowser.Controller/Drawing/ImageManager.cs @@ -541,7 +541,7 @@ namespace MediaBrowser.Controller.Drawing /// <param name="imageType">Type of the image.</param> /// <returns>Guid.</returns> /// <exception cref="System.ArgumentNullException">item</exception> - public Guid GetImageCacheTag(string originalImagePath, DateTime dateModified, IEnumerable<BaseImageEnhancer> imageEnhancers, BaseItem item, ImageType imageType) + public Guid GetImageCacheTag(string originalImagePath, DateTime dateModified, IEnumerable<IImageEnhancer> imageEnhancers, BaseItem item, ImageType imageType) { if (item == null) { @@ -574,7 +574,7 @@ namespace MediaBrowser.Controller.Drawing /// <param name="imageType">Type of the image.</param> /// <param name="imageIndex">Index of the image.</param> /// <returns>Task{EnhancedImage}.</returns> - private async Task<Image> ExecuteImageEnhancers(IEnumerable<BaseImageEnhancer> imageEnhancers, Image originalImage, BaseItem item, ImageType imageType, int imageIndex) + private async Task<Image> ExecuteImageEnhancers(IEnumerable<IImageEnhancer> imageEnhancers, Image originalImage, BaseItem item, ImageType imageType, int imageIndex) { var result = originalImage; diff --git a/MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs b/MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs new file mode 100644 index 000000000..57e9e8d5d --- /dev/null +++ b/MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs @@ -0,0 +1,15 @@ + +namespace MediaBrowser.Controller.Entities +{ + /// <summary> + /// Interface IVirtualFolderCreator + /// </summary> + public interface IVirtualFolderCreator + { + /// <summary> + /// Gets the folder. + /// </summary> + /// <returns>Folder.</returns> + BasePluginFolder GetFolder(); + } +} diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 6a76e2125..5b7661dcf 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Common.Win32; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index 140c90814..c80c59eaf 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -2,6 +2,7 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Common.Win32; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index f27e8c689..426e7f18e 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Common.Serialization; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Tasks; using System; diff --git a/MediaBrowser.Controller/IO/DirectoryWatchers.cs b/MediaBrowser.Controller/IO/DirectoryWatchers.cs index 62e1a6a36..06ce95ec9 100644 --- a/MediaBrowser.Controller/IO/DirectoryWatchers.cs +++ b/MediaBrowser.Controller/IO/DirectoryWatchers.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.IO; +using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.ScheduledTasks; @@ -67,15 +68,26 @@ namespace MediaBrowser.Controller.IO private ILogger Logger { get; set; } /// <summary> + /// Gets or sets the task manager. + /// </summary> + /// <value>The task manager.</value> + private ITaskManager TaskManager { get; set; } + + /// <summary> /// Initializes a new instance of the <see cref="DirectoryWatchers" /> class. /// </summary> - public DirectoryWatchers(ILogger logger) + public DirectoryWatchers(ILogger logger, ITaskManager taskManager) { if (logger == null) { throw new ArgumentNullException("logger"); } + if (taskManager == null) + { + throw new ArgumentNullException("taskManager"); + } + TaskManager = taskManager; Logger = logger; } @@ -421,7 +433,7 @@ namespace MediaBrowser.Controller.IO // If the root folder changed, run the library task so the user can see it if (itemsToRefresh.Any(i => i is AggregateFolder)) { - Kernel.Instance.TaskManager.CancelIfRunningAndQueue<RefreshMediaLibraryTask>(); + TaskManager.CancelIfRunningAndQueue<RefreshMediaLibraryTask>(); return; } diff --git a/MediaBrowser.Controller/IO/FileSystem.cs b/MediaBrowser.Controller/IO/FileSystem.cs new file mode 100644 index 000000000..c7b7c660b --- /dev/null +++ b/MediaBrowser.Controller/IO/FileSystem.cs @@ -0,0 +1,336 @@ +using MediaBrowser.Common.Win32; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace MediaBrowser.Controller.IO +{ + /// <summary> + /// Class FileSystem + /// </summary> + public static class FileSystem + { + /// <summary> + /// Gets information about a path + /// </summary> + /// <param name="path">The path.</param> + /// <returns>System.Nullable{WIN32_FIND_DATA}.</returns> + /// <exception cref="System.ArgumentNullException">path</exception> + /// <exception cref="System.IO.IOException">GetFileData failed for + path</exception> + public static WIN32_FIND_DATA? GetFileData(string path) + { + if (string.IsNullOrEmpty(path)) + { + throw new ArgumentNullException("path"); + } + + WIN32_FIND_DATA data; + var handle = NativeMethods.FindFirstFileEx(path, FINDEX_INFO_LEVELS.FindExInfoBasic, out data, + FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, FindFirstFileExFlags.NONE); + + var getFilename = false; + + if (handle == NativeMethods.INVALID_HANDLE_VALUE && !Path.HasExtension(path)) + { + if (!path.EndsWith("*", StringComparison.OrdinalIgnoreCase)) + { + NativeMethods.FindClose(handle); + + handle = NativeMethods.FindFirstFileEx(Path.Combine(path, "*"), FINDEX_INFO_LEVELS.FindExInfoBasic, out data, + FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, FindFirstFileExFlags.NONE); + + getFilename = true; + } + } + + if (handle == IntPtr.Zero) + { + throw new IOException("GetFileData failed for " + path); + } + + NativeMethods.FindClose(handle); + + // According to MSDN documentation, this will default to 1601 for paths that don't exist. + if (data.CreationTimeUtc.Year == 1601) + { + return null; + } + + if (getFilename) + { + data.cFileName = Path.GetFileName(path); + } + + data.Path = path; + return data; + } + + /// <summary> + /// Gets all files within a folder + /// </summary> + /// <param name="path">The path.</param> + /// <param name="searchPattern">The search pattern.</param> + /// <returns>IEnumerable{WIN32_FIND_DATA}.</returns> + public static IEnumerable<WIN32_FIND_DATA> GetFiles(string path, string searchPattern = "*") + { + return GetFileSystemEntries(path, searchPattern, includeDirectories: false); + } + + /// <summary> + /// Gets all sub-directories within a folder + /// </summary> + /// <param name="path">The path.</param> + /// <returns>IEnumerable{WIN32_FIND_DATA}.</returns> + public static IEnumerable<WIN32_FIND_DATA> GetDirectories(string path) + { + return GetFileSystemEntries(path, includeFiles: false); + } + + /// <summary> + /// Gets all file system entries within a foler + /// </summary> + /// <param name="path">The path.</param> + /// <param name="searchPattern">The search pattern.</param> + /// <param name="includeFiles">if set to <c>true</c> [include files].</param> + /// <param name="includeDirectories">if set to <c>true</c> [include directories].</param> + /// <returns>IEnumerable{WIN32_FIND_DATA}.</returns> + /// <exception cref="System.ArgumentNullException">path</exception> + /// <exception cref="System.IO.IOException">GetFileSystemEntries failed</exception> + public static IEnumerable<WIN32_FIND_DATA> GetFileSystemEntries(string path, string searchPattern = "*", bool includeFiles = true, bool includeDirectories = true) + { + if (string.IsNullOrEmpty(path)) + { + throw new ArgumentNullException("path"); + } + + var lpFileName = Path.Combine(path, searchPattern); + + WIN32_FIND_DATA lpFindFileData; + var handle = NativeMethods.FindFirstFileEx(lpFileName, FINDEX_INFO_LEVELS.FindExInfoBasic, out lpFindFileData, + FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, FindFirstFileExFlags.FIND_FIRST_EX_LARGE_FETCH); + + if (handle == IntPtr.Zero) + { + var hr = Marshal.GetLastWin32Error(); + if (hr != 2 && hr != 0x12) + { + throw new IOException("GetFileSystemEntries failed"); + } + yield break; + } + + if (IncludeInFindFileOutput(lpFindFileData.cFileName, lpFindFileData.dwFileAttributes, includeFiles, includeDirectories)) + { + lpFindFileData.Path = Path.Combine(path, lpFindFileData.cFileName); + + yield return lpFindFileData; + } + + while (NativeMethods.FindNextFile(handle, out lpFindFileData) != IntPtr.Zero) + { + if (IncludeInFindFileOutput(lpFindFileData.cFileName, lpFindFileData.dwFileAttributes, includeFiles, includeDirectories)) + { + lpFindFileData.Path = Path.Combine(path, lpFindFileData.cFileName); + yield return lpFindFileData; + } + } + + NativeMethods.FindClose(handle); + } + + /// <summary> + /// Includes the in find file output. + /// </summary> + /// <param name="cFileName">Name of the c file.</param> + /// <param name="attributes">The attributes.</param> + /// <param name="includeFiles">if set to <c>true</c> [include files].</param> + /// <param name="includeDirectories">if set to <c>true</c> [include directories].</param> + /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> + public static bool IncludeInFindFileOutput(string cFileName, FileAttributes attributes, bool includeFiles, bool includeDirectories) + { + if (cFileName.Equals(".", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + if (cFileName.Equals("..", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + if (!includeFiles && !attributes.HasFlag(FileAttributes.Directory)) + { + return false; + } + + if (!includeDirectories && attributes.HasFlag(FileAttributes.Directory)) + { + return false; + } + + return true; + } + + /// <summary> + /// The space char + /// </summary> + private const char SpaceChar = ' '; + /// <summary> + /// The invalid file name chars + /// </summary> + private static readonly char[] InvalidFileNameChars = Path.GetInvalidFileNameChars(); + + /// <summary> + /// Takes a filename and removes invalid characters + /// </summary> + /// <param name="filename">The filename.</param> + /// <returns>System.String.</returns> + /// <exception cref="System.ArgumentNullException">filename</exception> + public static string GetValidFilename(string filename) + { + if (string.IsNullOrEmpty(filename)) + { + throw new ArgumentNullException("filename"); + } + + foreach (var c in InvalidFileNameChars) + { + filename = filename.Replace(c, SpaceChar); + } + + return filename; + } + + /// <summary> + /// Resolves the shortcut. + /// </summary> + /// <param name="filename">The filename.</param> + /// <returns>System.String.</returns> + /// <exception cref="System.ArgumentNullException">filename</exception> + public static string ResolveShortcut(string filename) + { + if (string.IsNullOrEmpty(filename)) + { + throw new ArgumentNullException("filename"); + } + + var link = new ShellLink(); + ((IPersistFile)link).Load(filename, NativeMethods.STGM_READ); + // TODO: if I can get hold of the hwnd call resolve first. This handles moved and renamed files. + // ((IShellLinkW)link).Resolve(hwnd, 0) + var sb = new StringBuilder(NativeMethods.MAX_PATH); + WIN32_FIND_DATA data; + ((IShellLinkW)link).GetPath(sb, sb.Capacity, out data, 0); + return sb.ToString(); + } + + /// <summary> + /// Creates a shortcut file pointing to a specified path + /// </summary> + /// <param name="shortcutPath">The shortcut path.</param> + /// <param name="target">The target.</param> + /// <exception cref="System.ArgumentNullException">shortcutPath</exception> + public static void CreateShortcut(string shortcutPath, string target) + { + if (string.IsNullOrEmpty(shortcutPath)) + { + throw new ArgumentNullException("shortcutPath"); + } + + if (string.IsNullOrEmpty(target)) + { + throw new ArgumentNullException("target"); + } + + var link = new ShellLink(); + + ((IShellLinkW)link).SetPath(target); + + ((IPersistFile)link).Save(shortcutPath, true); + } + + /// <summary> + /// Determines whether the specified filename is shortcut. + /// </summary> + /// <param name="filename">The filename.</param> + /// <returns><c>true</c> if the specified filename is shortcut; otherwise, <c>false</c>.</returns> + /// <exception cref="System.ArgumentNullException">filename</exception> + public static bool IsShortcut(string filename) + { + if (string.IsNullOrEmpty(filename)) + { + throw new ArgumentNullException("filename"); + } + + return string.Equals(Path.GetExtension(filename), ".lnk", StringComparison.OrdinalIgnoreCase); + } + + /// <summary> + /// Copies all. + /// </summary> + /// <param name="source">The source.</param> + /// <param name="target">The target.</param> + /// <exception cref="System.ArgumentNullException">source</exception> + /// <exception cref="System.ArgumentException">The source and target directories are the same</exception> + public static void CopyAll(string source, string target) + { + if (string.IsNullOrEmpty(source)) + { + throw new ArgumentNullException("source"); + } + if (string.IsNullOrEmpty(target)) + { + throw new ArgumentNullException("target"); + } + + if (source.Equals(target, StringComparison.OrdinalIgnoreCase)) + { + throw new ArgumentException("The source and target directories are the same"); + } + + // Check if the target directory exists, if not, create it. + if (!Directory.Exists(target)) + { + Directory.CreateDirectory(target); + } + + foreach (var file in Directory.EnumerateFiles(source)) + { + File.Copy(file, Path.Combine(target, Path.GetFileName(file)), true); + } + + // Copy each subdirectory using recursion. + foreach (var dir in Directory.EnumerateDirectories(source)) + { + CopyAll(dir, Path.Combine(target, Path.GetFileName(dir))); + } + } + + /// <summary> + /// Parses the ini file. + /// </summary> + /// <param name="path">The path.</param> + /// <returns>NameValueCollection.</returns> + public static NameValueCollection ParseIniFile(string path) + { + var values = new NameValueCollection(); + + foreach (var line in File.ReadAllLines(path)) + { + var data = line.Split('='); + + if (data.Length < 2) continue; + + var key = data[0]; + + var value = data.Length == 2 ? data[1] : string.Join(string.Empty, data, 1, data.Length - 1); + + values[key] = value; + } + + return values; + } + } +} diff --git a/MediaBrowser.Controller/IO/FileSystemManager.cs b/MediaBrowser.Controller/IO/FileSystemManager.cs index 9b54bb9d8..611b402d8 100644 --- a/MediaBrowser.Controller/IO/FileSystemManager.cs +++ b/MediaBrowser.Controller/IO/FileSystemManager.cs @@ -1,5 +1,6 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Logging; using System; @@ -26,17 +27,18 @@ namespace MediaBrowser.Controller.IO /// The _logger /// </summary> private readonly ILogger _logger; - + /// <summary> /// Initializes a new instance of the <see cref="FileSystemManager" /> class. /// </summary> /// <param name="kernel">The kernel.</param> /// <param name="logger">The logger.</param> - public FileSystemManager(Kernel kernel, ILogger logger) + /// <param name="taskManager">The task manager.</param> + public FileSystemManager(Kernel kernel, ILogger logger, ITaskManager taskManager) : base(kernel) { _logger = logger; - DirectoryWatchers = new DirectoryWatchers(logger); + DirectoryWatchers = new DirectoryWatchers(logger, taskManager); } /// <summary> diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index 952160b2b..21cfb5ddb 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Kernel; using MediaBrowser.Common.Plugins; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; @@ -16,14 +15,10 @@ using MediaBrowser.Controller.ScheduledTasks; using MediaBrowser.Controller.Updates; using MediaBrowser.Controller.Weather; using MediaBrowser.Model.Configuration; -using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; -using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.System; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; -using System.ComponentModel.Composition.Hosting; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -179,31 +174,33 @@ namespace MediaBrowser.Controller } /// <summary> + /// Gets the list of Localized string files + /// </summary> + /// <value>The string files.</value> + public IEnumerable<LocalizedStringData> StringFiles { get; private set; } + + /// <summary> /// Gets the list of plugin configuration pages /// </summary> /// <value>The configuration pages.</value> - [ImportMany(typeof(IPluginConfigurationPage))] public IEnumerable<IPluginConfigurationPage> PluginConfigurationPages { get; private set; } /// <summary> /// Gets the intro providers. /// </summary> /// <value>The intro providers.</value> - [ImportMany(typeof(IIntroProvider))] public IEnumerable<IIntroProvider> IntroProviders { get; private set; } /// <summary> /// Gets the list of currently registered weather prvoiders /// </summary> /// <value>The weather providers.</value> - [ImportMany(typeof(IWeatherProvider))] public IEnumerable<IWeatherProvider> WeatherProviders { get; private set; } /// <summary> /// Gets the list of currently registered metadata prvoiders /// </summary> /// <value>The metadata providers enumerable.</value> - [ImportMany(typeof(BaseMetadataProvider))] public BaseMetadataProvider[] MetadataProviders { get; private set; } /// <summary> @@ -211,28 +208,24 @@ namespace MediaBrowser.Controller /// Image processors are specialized metadata providers that run after the normal ones /// </summary> /// <value>The image enhancers.</value> - [ImportMany(typeof(BaseImageEnhancer))] - public BaseImageEnhancer[] ImageEnhancers { get; private set; } + public IEnumerable<IImageEnhancer> ImageEnhancers { get; private set; } /// <summary> /// Gets the list of currently registered entity resolvers /// </summary> /// <value>The entity resolvers enumerable.</value> - [ImportMany(typeof(IBaseItemResolver))] - internal IBaseItemResolver[] EntityResolvers { get; private set; } + internal IEnumerable<IBaseItemResolver> EntityResolvers { get; private set; } /// <summary> /// Gets the list of BasePluginFolders added by plugins /// </summary> /// <value>The plugin folders.</value> - [ImportMany(typeof(BasePluginFolder))] - internal IEnumerable<BasePluginFolder> PluginFolders { get; private set; } + internal IEnumerable<IVirtualFolderCreator> PluginFolderCreators { get; private set; } /// <summary> /// Gets the list of available user repositories /// </summary> /// <value>The user repositories.</value> - [ImportMany(typeof(IUserRepository))] private IEnumerable<IUserRepository> UserRepositories { get; set; } /// <summary> @@ -251,7 +244,6 @@ namespace MediaBrowser.Controller /// Gets the list of available item repositories /// </summary> /// <value>The item repositories.</value> - [ImportMany(typeof(IItemRepository))] private IEnumerable<IItemRepository> ItemRepositories { get; set; } /// <summary> @@ -264,22 +256,19 @@ namespace MediaBrowser.Controller /// Gets the list of available item repositories /// </summary> /// <value>The user data repositories.</value> - [ImportMany(typeof(IUserDataRepository))] private IEnumerable<IUserDataRepository> UserDataRepositories { get; set; } /// <summary> /// Gets the list of available DisplayPreferencesRepositories /// </summary> /// <value>The display preferences repositories.</value> - [ImportMany(typeof(IDisplayPreferencesRepository))] private IEnumerable<IDisplayPreferencesRepository> DisplayPreferencesRepositories { get; set; } /// <summary> /// Gets the list of entity resolution ignore rules /// </summary> /// <value>The entity resolution ignore rules.</value> - [ImportMany(typeof(BaseResolutionIgnoreRule))] - internal IEnumerable<BaseResolutionIgnoreRule> EntityResolutionIgnoreRules { get; private set; } + internal IEnumerable<IResolutionIgnoreRule> EntityResolutionIgnoreRules { get; private set; } /// <summary> /// Gets the active user data repository @@ -303,47 +292,15 @@ namespace MediaBrowser.Controller } /// <summary> - /// Gets or sets the zip client. - /// </summary> - /// <value>The zip client.</value> - private IZipClient ZipClient { get; set; } - - /// <summary> - /// Gets or sets the bluray examiner. - /// </summary> - /// <value>The bluray examiner.</value> - private IBlurayExaminer BlurayExaminer { get; set; } - - /// <summary> /// Creates a kernel based on a Data path, which is akin to our current programdata path /// </summary> /// <param name="appHost">The app host.</param> - /// <param name="isoManager">The iso manager.</param> - /// <param name="zipClient">The zip client.</param> - /// <param name="blurayExaminer">The bluray examiner.</param> /// <param name="logger">The logger.</param> /// <exception cref="System.ArgumentNullException">isoManager</exception> - public Kernel(IApplicationHost appHost, IIsoManager isoManager, IZipClient zipClient, IBlurayExaminer blurayExaminer, ILogger logger) - : base(appHost, isoManager, logger) + public Kernel(IApplicationHost appHost, ILogger logger) + : base(appHost, logger) { - if (isoManager == null) - { - throw new ArgumentNullException("isoManager"); - } - - if (zipClient == null) - { - throw new ArgumentNullException("zipClient"); - } - - if (blurayExaminer == null) - { - throw new ArgumentNullException("blurayExaminer"); - } - Instance = this; - ZipClient = zipClient; - BlurayExaminer = blurayExaminer; // For now there's no real way to inject this properly BaseItem.Logger = logger; @@ -356,13 +313,43 @@ namespace MediaBrowser.Controller /// <summary> /// Composes the exported values. /// </summary> - /// <param name="container">The container.</param> - protected override void ComposeExportedValues(CompositionContainer container) + protected override void RegisterExportedValues() { - base.ComposeExportedValues(container); + ApplicationHost.Register(this); + + base.RegisterExportedValues(); + } - container.ComposeExportedValue("kernel", this); - container.ComposeExportedValue("blurayExaminer", BlurayExaminer); + /// <summary> + /// Composes the parts with ioc container. + /// </summary> + /// <param name="allTypes">All types.</param> + protected override void FindParts(Type[] allTypes) + { + InstallationManager = (InstallationManager)ApplicationHost.CreateInstance(typeof(InstallationManager)); + FFMpegManager = (FFMpegManager)ApplicationHost.CreateInstance(typeof(FFMpegManager)); + LibraryManager = (LibraryManager)ApplicationHost.CreateInstance(typeof(LibraryManager)); + UserManager = (UserManager)ApplicationHost.CreateInstance(typeof(UserManager)); + ImageManager = (ImageManager)ApplicationHost.CreateInstance(typeof(ImageManager)); + ProviderManager = (ProviderManager)ApplicationHost.CreateInstance(typeof(ProviderManager)); + UserDataManager = (UserDataManager)ApplicationHost.CreateInstance(typeof(UserDataManager)); + PluginSecurityManager = (PluginSecurityManager)ApplicationHost.CreateInstance(typeof(PluginSecurityManager)); + + base.FindParts(allTypes); + + EntityResolutionIgnoreRules = GetExports<IResolutionIgnoreRule>(allTypes); + UserDataRepositories = GetExports<IUserDataRepository>(allTypes); + UserRepositories = GetExports<IUserRepository>(allTypes); + DisplayPreferencesRepositories = GetExports<IDisplayPreferencesRepository>(allTypes); + ItemRepositories = GetExports<IItemRepository>(allTypes); + WeatherProviders = GetExports<IWeatherProvider>(allTypes); + IntroProviders = GetExports<IIntroProvider>(allTypes); + PluginConfigurationPages = GetExports<IPluginConfigurationPage>(allTypes); + ImageEnhancers = GetExports<IImageEnhancer>(allTypes).OrderBy(e => e.Priority).ToArray(); + PluginFolderCreators = GetExports<IVirtualFolderCreator>(allTypes); + StringFiles = GetExports<LocalizedStringData>(allTypes); + EntityResolvers = GetExports<IBaseItemResolver>(allTypes).OrderBy(e => e.Priority).ToArray(); + MetadataProviders = GetExports<BaseMetadataProvider>(allTypes).OrderBy(e => e.Priority).ToArray(); } /// <summary> @@ -371,24 +358,14 @@ namespace MediaBrowser.Controller /// <returns>Task.</returns> protected override async Task ReloadInternal() { - Logger.Info("Extracting tools"); - // Reset these so that they can be lazy loaded again Users = null; RootFolder = null; - ReloadResourcePools(); - InstallationManager = new InstallationManager(this, ZipClient, Logger); - LibraryManager = new LibraryManager(this, Logger); - UserManager = new UserManager(this, Logger); - FFMpegManager = new FFMpegManager(this, ZipClient, Logger); - ImageManager = new ImageManager(this, Logger); - ProviderManager = new ProviderManager(this, Logger); - UserDataManager = new UserDataManager(this, Logger); - PluginSecurityManager = new PluginSecurityManager(this); - await base.ReloadInternal().ConfigureAwait(false); + ReloadResourcePools(); + ReloadFileSystemManager(); await UserManager.RefreshUsersMetadata(CancellationToken.None).ConfigureAwait(false); @@ -456,15 +433,6 @@ namespace MediaBrowser.Controller DisplayPreferencesRepository = GetRepository(DisplayPreferencesRepositories, Configuration.DisplayPreferencesRepository); var displayPreferencesRepoTask = DisplayPreferencesRepository.Initialize(); - // Sort the resolvers by priority - EntityResolvers = EntityResolvers.OrderBy(e => e.Priority).ToArray(); - - // Sort the providers by priority - MetadataProviders = MetadataProviders.OrderBy(e => e.Priority).ToArray(); - - // Sort the image processors by priority - ImageEnhancers = ImageEnhancers.OrderBy(e => e.Priority).ToArray(); - await Task.WhenAll(itemRepoTask, userRepoTask, userDataRepoTask, displayPreferencesRepoTask).ConfigureAwait(false); } @@ -503,7 +471,7 @@ namespace MediaBrowser.Controller { DisposeFileSystemManager(); - FileSystemManager = new FileSystemManager(this, Logger); + FileSystemManager = new FileSystemManager(this, Logger, TaskManager); FileSystemManager.StartWatchers(); } diff --git a/MediaBrowser.Controller/Library/ItemResolveArgs.cs b/MediaBrowser.Controller/Library/ItemResolveArgs.cs index c95300f74..4d58af437 100644 --- a/MediaBrowser.Controller/Library/ItemResolveArgs.cs +++ b/MediaBrowser.Controller/Library/ItemResolveArgs.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using MediaBrowser.Controller.IO; namespace MediaBrowser.Controller.Library { diff --git a/MediaBrowser.Controller/Library/LibraryManager.cs b/MediaBrowser.Controller/Library/LibraryManager.cs index 4087f9ef8..dfaef12cb 100644 --- a/MediaBrowser.Controller/Library/LibraryManager.cs +++ b/MediaBrowser.Controller/Library/LibraryManager.cs @@ -186,9 +186,9 @@ namespace MediaBrowser.Controller.Library var rootFolder = Kernel.ItemRepository.RetrieveItem(rootFolderPath.GetMBId(typeof(AggregateFolder))) as AggregateFolder ?? (AggregateFolder)GetItem(rootFolderPath); // Add in the plug-in folders - foreach (var child in Kernel.PluginFolders) + foreach (var child in Kernel.PluginFolderCreators) { - rootFolder.AddVirtualChild(child); + rootFolder.AddVirtualChild(child.GetFolder()); } return rootFolder; diff --git a/MediaBrowser.Controller/Localization/BaseStrings.cs b/MediaBrowser.Controller/Localization/BaseStrings.cs index c76df7c7c..22486d90d 100644 --- a/MediaBrowser.Controller/Localization/BaseStrings.cs +++ b/MediaBrowser.Controller/Localization/BaseStrings.cs @@ -1,9 +1,6 @@ -using MediaBrowser.Common.Localization; -using System.ComponentModel.Composition; - + namespace MediaBrowser.Controller.Localization { - [Export(typeof(LocalizedStringData))] public class BaseStrings : LocalizedStringData { public BaseStrings() diff --git a/MediaBrowser.Controller/Localization/LocalizedStringData.cs b/MediaBrowser.Controller/Localization/LocalizedStringData.cs new file mode 100644 index 000000000..71200b8c8 --- /dev/null +++ b/MediaBrowser.Controller/Localization/LocalizedStringData.cs @@ -0,0 +1,51 @@ +using System.IO; +using System.Xml.Serialization; + +namespace MediaBrowser.Controller.Localization +{ + /// <summary> + /// Class LocalizedStringData + /// </summary> + public class LocalizedStringData + { + /// <summary> + /// The this version + /// </summary> + [XmlIgnore] + public string ThisVersion = "1.0000"; + /// <summary> + /// The prefix + /// </summary> + [XmlIgnore] + public string Prefix = ""; + /// <summary> + /// The file name + /// </summary> + public string FileName; //this is public so it will serialize and we know where to save ourselves + /// <summary> + /// The version + /// </summary> + public string Version = ""; //this will get saved so we can check it against us for changes + + /// <summary> + /// Saves this instance. + /// </summary> + public void Save() + { + Save(FileName); + } + + /// <summary> + /// Saves the specified file. + /// </summary> + /// <param name="file">The file.</param> + public void Save(string file) + { + var xs = new XmlSerializer(GetType()); + using (var fs = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None)) + { + xs.Serialize(fs, this); + } + } + } +} diff --git a/MediaBrowser.Controller/Localization/LocalizedStrings.cs b/MediaBrowser.Controller/Localization/LocalizedStrings.cs index 01b259591..6405be5f8 100644 --- a/MediaBrowser.Controller/Localization/LocalizedStrings.cs +++ b/MediaBrowser.Controller/Localization/LocalizedStrings.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Localization; -using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Logging; using System; using System.Collections.Concurrent; using System.Globalization; diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 3978e6e39..213c30bac 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -64,7 +64,6 @@ <HintPath>..\packages\protobuf-net.2.0.0.621\lib\net40\protobuf-net.dll</HintPath> </Reference> <Reference Include="System" /> - <Reference Include="System.ComponentModel.Composition" /> <Reference Include="System.Core" /> <Reference Include="System.Data" /> <Reference Include="System.Drawing" /> @@ -91,6 +90,7 @@ <Compile Include="Entities\Genre.cs" /> <Compile Include="Entities\ICollectionFolder.cs" /> <Compile Include="Entities\IndexFolder.cs" /> + <Compile Include="Entities\IVirtualFolderCreator.cs" /> <Compile Include="Entities\Movies\BoxSet.cs" /> <Compile Include="Entities\Movies\Movie.cs" /> <Compile Include="Entities\Person.cs" /> @@ -107,6 +107,7 @@ <Compile Include="Entities\CollectionFolder.cs" /> <Compile Include="Entities\Year.cs" /> <Compile Include="Extensions\XmlExtensions.cs" /> + <Compile Include="IO\FileSystem.cs" /> <Compile Include="IO\FileSystemManager.cs" /> <Compile Include="IO\NetworkShares.cs" /> <Compile Include="Library\ChildrenChangedEventArgs.cs" /> @@ -117,6 +118,7 @@ <Compile Include="Localization\AURatingsDictionary.cs" /> <Compile Include="Localization\BaseStrings.cs" /> <Compile Include="Localization\GBRatingsDictionary.cs" /> + <Compile Include="Localization\LocalizedStringData.cs" /> <Compile Include="Localization\LocalizedStrings.cs" /> <Compile Include="Localization\NLRatingsDictionary.cs" /> <Compile Include="Localization\Ratings.cs" /> @@ -134,7 +136,7 @@ <Compile Include="Plugins\IPluginConfigurationPage.cs" /> <Compile Include="Plugins\PluginSecurityManager.cs" /> <Compile Include="Providers\FanartBaseProvider.cs" /> - <Compile Include="Providers\BaseImageEnhancer.cs" /> + <Compile Include="Providers\IImageEnhancer.cs" /> <Compile Include="Providers\ImagesByNameProvider.cs" /> <Compile Include="Providers\MediaInfo\BaseFFMpegImageProvider.cs" /> <Compile Include="Providers\MediaInfo\BaseFFMpegProvider.cs" /> @@ -165,7 +167,7 @@ <Compile Include="Providers\MediaInfo\FFMpegVideoImageProvider.cs" /> <Compile Include="Resolvers\Audio\MusicAlbumResolver.cs" /> <Compile Include="Resolvers\Audio\MusicArtistResolver.cs" /> - <Compile Include="Resolvers\BaseResolutionIgnoreRule.cs" /> + <Compile Include="Resolvers\IResolutionIgnoreRule.cs" /> <Compile Include="Resolvers\CoreResolutionIgnoreRule.cs" /> <Compile Include="Resolvers\EntityResolutionHelper.cs" /> <Compile Include="Resolvers\LocalTrailerResolver.cs" /> @@ -223,8 +225,7 @@ <ItemGroup /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <PropertyGroup> - <PostBuildEvent> - </PostBuildEvent> + <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</PostBuildEvent> </PropertyGroup> <PropertyGroup> <PreBuildEvent> diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs index 9bc1ebaa5..7ef70ea42 100644 --- a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs +++ b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs @@ -4,9 +4,9 @@ using MediaBrowser.Common.Kernel; using MediaBrowser.Common.Serialization; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.ComponentModel; @@ -17,7 +17,6 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Logging; namespace MediaBrowser.Controller.MediaInfo { @@ -27,22 +26,6 @@ namespace MediaBrowser.Controller.MediaInfo public class FFMpegManager : BaseManager<Kernel> { /// <summary> - /// Holds the list of new items to generate chapter image for when the NewItemTimer expires - /// </summary> - private readonly List<Video> _newlyAddedItems = new List<Video>(); - - /// <summary> - /// The amount of time to wait before generating chapter images - /// </summary> - private const int NewItemDelay = 300000; - - /// <summary> - /// The current new item timer - /// </summary> - /// <value>The new item timer.</value> - private Timer NewItemTimer { get; set; } - - /// <summary> /// Gets or sets the video image cache. /// </summary> /// <value>The video image cache.</value> @@ -96,74 +79,10 @@ namespace MediaBrowser.Controller.MediaInfo AudioImageCache = new FileSystemRepository(AudioImagesDataPath); SubtitleCache = new FileSystemRepository(SubtitleCachePath); - Kernel.LibraryManager.LibraryChanged += LibraryManager_LibraryChanged; - Task.Run(() => VersionedDirectoryPath = GetVersionedDirectoryPath()); } /// <summary> - /// Handles the LibraryChanged event of the LibraryManager control. - /// </summary> - /// <param name="sender">The source of the event.</param> - /// <param name="e">The <see cref="ChildrenChangedEventArgs" /> instance containing the event data.</param> - void LibraryManager_LibraryChanged(object sender, ChildrenChangedEventArgs e) - { - var videos = e.ItemsAdded.OfType<Video>().ToList(); - - // Use a timer to prevent lots of these notifications from showing in a short period of time - if (videos.Count > 0) - { - lock (_newlyAddedItems) - { - _newlyAddedItems.AddRange(videos); - - if (NewItemTimer == null) - { - NewItemTimer = new Timer(NewItemTimerCallback, null, NewItemDelay, Timeout.Infinite); - } - else - { - NewItemTimer.Change(NewItemDelay, Timeout.Infinite); - } - } - } - } - - /// <summary> - /// Called when the new item timer expires - /// </summary> - /// <param name="state">The state.</param> - private async void NewItemTimerCallback(object state) - { - List<Video> newItems; - - // Lock the list and release all resources - lock (_newlyAddedItems) - { - newItems = _newlyAddedItems.ToList(); - _newlyAddedItems.Clear(); - - NewItemTimer.Dispose(); - NewItemTimer = null; - } - - // Limit the number of videos we generate images for - // The idea is to catch new items that are added here and there - // Mass image generation can be left to the scheduled task - foreach (var video in newItems.Where(c => c.Chapters != null).Take(3)) - { - try - { - await PopulateChapterImages(video, CancellationToken.None, true, true).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.ErrorException("Error creating chapter images for {0}", ex, video.Name); - } - } - } - - /// <summary> /// Releases unmanaged and - optionally - managed resources. /// </summary> /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> @@ -171,15 +90,8 @@ namespace MediaBrowser.Controller.MediaInfo { if (dispose) { - if (NewItemTimer != null) - { - NewItemTimer.Dispose(); - } - SetErrorMode(ErrorModes.SYSTEM_DEFAULT); - Kernel.LibraryManager.LibraryChanged -= LibraryManager_LibraryChanged; - AudioImageCache.Dispose(); VideoImageCache.Dispose(); } diff --git a/MediaBrowser.Controller/Providers/BaseImageEnhancer.cs b/MediaBrowser.Controller/Providers/BaseImageEnhancer.cs deleted file mode 100644 index aeceeaf5f..000000000 --- a/MediaBrowser.Controller/Providers/BaseImageEnhancer.cs +++ /dev/null @@ -1,99 +0,0 @@ -using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Drawing; -using MediaBrowser.Model.Entities; -using System; -using System.Drawing; -using System.Threading.Tasks; - -namespace MediaBrowser.Controller.Providers -{ - /// <summary> - /// Class BaseImageEnhancer - /// </summary> - public abstract class BaseImageEnhancer : IDisposable - { - /// <summary> - /// Return true only if the given image for the given item will be enhanced by this enhancer. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="imageType">Type of the image.</param> - /// <returns><c>true</c> if this enhancer will enhance the supplied image for the supplied item, <c>false</c> otherwise</returns> - public abstract bool Supports(BaseItem item, ImageType imageType); - - /// <summary> - /// Gets the priority or order in which this enhancer should be run. - /// </summary> - /// <value>The priority.</value> - public abstract MetadataProviderPriority Priority { get; } - - /// <summary> - /// Return the date of the last configuration change affecting the provided baseitem and image type - /// </summary> - /// <param name="item">The item.</param> - /// <param name="imageType">Type of the image.</param> - /// <returns>Date of last config change</returns> - public virtual DateTime LastConfigurationChange(BaseItem item, ImageType imageType) - { - return DateTime.MinValue; - } - - /// <summary> - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// </summary> - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// <summary> - /// Releases unmanaged and - optionally - managed resources. - /// </summary> - /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> - protected virtual void Dispose(bool dispose) - { - } - - /// <summary> - /// Gets the size of the enhanced image. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="imageType">Type of the image.</param> - /// <param name="imageIndex">Index of the image.</param> - /// <param name="originalImageSize">Size of the original image.</param> - /// <returns>ImageSize.</returns> - public virtual ImageSize GetEnhancedImageSize(BaseItem item, ImageType imageType, int imageIndex, ImageSize originalImageSize) - { - return originalImageSize; - } - - /// <summary> - /// Enhances the supplied image and returns it - /// </summary> - /// <param name="item">The item.</param> - /// <param name="originalImage">The original image.</param> - /// <param name="imageType">Type of the image.</param> - /// <param name="imageIndex">Index of the image.</param> - /// <returns>Task{System.Drawing.Image}.</returns> - protected abstract Task<Image> EnhanceImageAsyncInternal(BaseItem item, Image originalImage, ImageType imageType, int imageIndex); - - /// <summary> - /// Enhances the image async. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="originalImage">The original image.</param> - /// <param name="imageType">Type of the image.</param> - /// <param name="imageIndex">Index of the image.</param> - /// <returns>Task{Image}.</returns> - /// <exception cref="System.ArgumentNullException"></exception> - public Task<Image> EnhanceImageAsync(BaseItem item, Image originalImage, ImageType imageType, int imageIndex) - { - if (item == null || originalImage == null) - { - throw new ArgumentNullException(); - } - - return EnhanceImageAsyncInternal(item, originalImage, imageType, imageIndex); - } - } -} diff --git a/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs b/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs index ab0f37b96..16b120ebd 100644 --- a/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs +++ b/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs @@ -1,7 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Entities; using System; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers /// <summary> /// Provides metadata for Folders and all subclasses by parsing folder.xml /// </summary> - [Export(typeof(BaseMetadataProvider))] public class FolderProviderFromXml : BaseMetadataProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/IImageEnhancer.cs b/MediaBrowser.Controller/Providers/IImageEnhancer.cs new file mode 100644 index 000000000..24296b664 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IImageEnhancer.cs @@ -0,0 +1,55 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Drawing; +using MediaBrowser.Model.Entities; +using System; +using System.Drawing; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers +{ + public interface IImageEnhancer + { + /// <summary> + /// Return true only if the given image for the given item will be enhanced by this enhancer. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="imageType">Type of the image.</param> + /// <returns><c>true</c> if this enhancer will enhance the supplied image for the supplied item, <c>false</c> otherwise</returns> + bool Supports(BaseItem item, ImageType imageType); + + /// <summary> + /// Gets the priority or order in which this enhancer should be run. + /// </summary> + /// <value>The priority.</value> + MetadataProviderPriority Priority { get; } + + /// <summary> + /// Return the date of the last configuration change affecting the provided baseitem and image type + /// </summary> + /// <param name="item">The item.</param> + /// <param name="imageType">Type of the image.</param> + /// <returns>Date of last config change</returns> + DateTime LastConfigurationChange(BaseItem item, ImageType imageType); + + /// <summary> + /// Gets the size of the enhanced image. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="imageType">Type of the image.</param> + /// <param name="imageIndex">Index of the image.</param> + /// <param name="originalImageSize">Size of the original image.</param> + /// <returns>ImageSize.</returns> + ImageSize GetEnhancedImageSize(BaseItem item, ImageType imageType, int imageIndex, ImageSize originalImageSize); + + /// <summary> + /// Enhances the image async. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="originalImage">The original image.</param> + /// <param name="imageType">Type of the image.</param> + /// <param name="imageIndex">Index of the image.</param> + /// <returns>Task{Image}.</returns> + /// <exception cref="System.ArgumentNullException"></exception> + Task<Image> EnhanceImageAsync(BaseItem item, Image originalImage, ImageType imageType, int imageIndex); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs index 985876406..4c3250ff4 100644 --- a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs @@ -3,7 +3,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.IO; using System.Linq; using System.Threading; @@ -14,7 +13,6 @@ namespace MediaBrowser.Controller.Providers /// <summary> /// Provides images for all types by looking for standard images - folder, backdrop, logo, etc. /// </summary> - [Export(typeof(BaseMetadataProvider))] public class ImageFromMediaLocationProvider : BaseMetadataProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs index 114176e2c..fcc31a75e 100644 --- a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs +++ b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs @@ -1,9 +1,8 @@ -using System.Globalization; -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Win32; +using MediaBrowser.Common.Win32; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using System; -using System.ComponentModel.Composition; +using System.Globalization; using System.IO; using System.Linq; @@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers /// <summary> /// Provides images for generic types by looking for standard images in the IBN /// </summary> - [Export(typeof(BaseMetadataProvider))] public class ImagesByNameProvider : ImageFromMediaLocationProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs index 523192d4e..907c692b8 100644 --- a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs +++ b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Model.Entities; using System; -using System.ComponentModel.Composition; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers.MediaInfo /// <summary> /// Uses ffmpeg to create video images /// </summary> - [Export(typeof(BaseMetadataProvider))] public class FFMpegAudioImageProvider : BaseFFMpegImageProvider<Audio> { diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegVideoImageProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegVideoImageProvider.cs index 2f617b5b1..636454cd0 100644 --- a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegVideoImageProvider.cs +++ b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegVideoImageProvider.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Entities; using System; -using System.ComponentModel.Composition; using System.Threading; using System.Threading.Tasks; @@ -11,10 +10,23 @@ namespace MediaBrowser.Controller.Providers.MediaInfo /// <summary> /// Uses ffmpeg to create video images /// </summary> - [Export(typeof(BaseMetadataProvider))] public class FFMpegVideoImageProvider : BaseFFMpegImageProvider<Video> { /// <summary> + /// The _iso manager + /// </summary> + private readonly IIsoManager _isoManager; + + /// <summary> + /// Initializes a new instance of the <see cref="FFMpegVideoImageProvider" /> class. + /// </summary> + /// <param name="isoManager">The iso manager.</param> + public FFMpegVideoImageProvider(IIsoManager isoManager) + { + _isoManager = isoManager; + } + + /// <summary> /// Supportses the specified item. /// </summary> /// <param name="item">The item.</param> @@ -30,7 +42,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo if (video != null) { - if (video.VideoType == VideoType.Iso && video.IsoType.HasValue && Kernel.Instance.IsoManager.CanMount(item.Path)) + if (video.VideoType == VideoType.Iso && video.IsoType.HasValue && _isoManager.CanMount(item.Path)) { return true; } @@ -82,7 +94,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo { if (item.VideoType == VideoType.Iso) { - return Kernel.Instance.IsoManager.Mount(item.Path, cancellationToken); + return _isoManager.Mount(item.Path, cancellationToken); } return NullMountTaskResult; diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs index 49c829fff..01711d771 100644 --- a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs +++ b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs @@ -5,7 +5,6 @@ using MediaBrowser.Controller.MediaInfo; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -15,7 +14,6 @@ namespace MediaBrowser.Controller.Providers.MediaInfo /// <summary> /// Extracts audio information using ffprobe /// </summary> - [Export(typeof(BaseMetadataProvider))] public class FFProbeAudioInfoProvider : BaseFFProbeProvider<Audio> { /// <summary> diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs index 2df495b23..443d28b67 100644 --- a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs +++ b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs @@ -6,7 +6,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.MediaInfo; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.IO; using System.Linq; using System.Threading; @@ -17,7 +16,6 @@ namespace MediaBrowser.Controller.Providers.MediaInfo /// <summary> /// Extracts video information using ffprobe /// </summary> - [Export(typeof(BaseMetadataProvider))] public class FFProbeVideoInfoProvider : BaseFFProbeProvider<Video> { /// <summary> @@ -32,13 +30,18 @@ namespace MediaBrowser.Controller.Providers.MediaInfo /// <value>The bluray examiner.</value> private IBlurayExaminer BlurayExaminer { get; set; } + /// <summary> + /// The _iso manager + /// </summary> + private readonly IIsoManager _isoManager; + /// <summary> /// Initializes a new instance of the <see cref="FFProbeVideoInfoProvider" /> class. /// </summary> + /// <param name="isoManager">The iso manager.</param> /// <param name="blurayExaminer">The bluray examiner.</param> /// <exception cref="System.ArgumentNullException">blurayExaminer</exception> - [ImportingConstructor] - public FFProbeVideoInfoProvider([Import("blurayExaminer")] IBlurayExaminer blurayExaminer) + public FFProbeVideoInfoProvider(IIsoManager isoManager, IBlurayExaminer blurayExaminer) : base() { if (blurayExaminer == null) @@ -47,6 +50,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo } BlurayExaminer = blurayExaminer; + _isoManager = isoManager; BdInfoCache = new FileSystemRepository(Path.Combine(Kernel.Instance.ApplicationPaths.CachePath, "bdinfo")); } @@ -76,7 +80,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo { if (video.VideoType == VideoType.Iso) { - return Kernel.Instance.IsoManager.CanMount(item.Path); + return _isoManager.CanMount(item.Path); } return video.VideoType == VideoType.VideoFile || video.VideoType == VideoType.Dvd || video.VideoType == VideoType.BluRay; @@ -101,7 +105,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo { PopulateDvdStreamFiles(item, mount); } - + base.OnPreFetch(item, mount); } @@ -115,7 +119,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo { if (item.VideoType == VideoType.Iso) { - return Kernel.Instance.IsoManager.Mount(item.Path, cancellationToken); + return _isoManager.Mount(item.Path, cancellationToken); } return base.MountIsoIfNeeded(item, cancellationToken); diff --git a/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs b/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs index 38e547523..e833e4931 100644 --- a/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs @@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Net; using System; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -15,7 +14,6 @@ namespace MediaBrowser.Controller.Providers.Movies /// <summary> /// Class FanArtMovieProvider /// </summary> - [Export(typeof(BaseMetadataProvider))] class FanArtMovieProvider : FanartBaseProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs index 2319e5cfa..72f8a3fc7 100644 --- a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs @@ -7,7 +7,6 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Globalization; using System.IO; using System.Linq; @@ -29,7 +28,6 @@ namespace MediaBrowser.Controller.Providers.Movies /// <summary> /// Class MovieDbProvider /// </summary> - [Export(typeof(BaseMetadataProvider))] public class MovieDbProvider : BaseMetadataProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs index ad5f6626b..45079ddda 100644 --- a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs +++ b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs @@ -1,7 +1,6 @@ using MediaBrowser.Common.Serialization; using MediaBrowser.Controller.Entities; using System; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers.Movies /// <summary> /// Class MovieProviderFromJson /// </summary> - [Export(typeof(BaseMetadataProvider))] public class MovieProviderFromJson : MovieDbProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs index b180fa580..274930bc8 100644 --- a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs +++ b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs @@ -1,7 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using System; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers.Movies /// <summary> /// Class MovieProviderFromXml /// </summary> - [Export(typeof(BaseMetadataProvider))] public class MovieProviderFromXml : BaseMetadataProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs b/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs index 19a707be3..b4b4933e2 100644 --- a/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs +++ b/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs @@ -1,7 +1,6 @@ using MediaBrowser.Common.Serialization; using MediaBrowser.Controller.Entities; using System; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers.Movies /// <summary> /// Class PersonProviderFromJson /// </summary> - [Export(typeof(BaseMetadataProvider))] class PersonProviderFromJson : TmdbPersonProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs b/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs index 4cdfc5894..7b5d62fb0 100644 --- a/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs @@ -4,7 +4,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Net; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Globalization; using System.IO; using System.Linq; @@ -17,7 +16,6 @@ namespace MediaBrowser.Controller.Providers.Movies /// <summary> /// Class TmdbPersonProvider /// </summary> - [Export(typeof(BaseMetadataProvider))] public class TmdbPersonProvider : BaseMetadataProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/SortNameProvider.cs b/MediaBrowser.Controller/Providers/SortNameProvider.cs index 071732f3e..933b0c78c 100644 --- a/MediaBrowser.Controller/Providers/SortNameProvider.cs +++ b/MediaBrowser.Controller/Providers/SortNameProvider.cs @@ -1,7 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.TV; -using System.ComponentModel.Composition; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers /// <summary> /// Class SortNameProvider /// </summary> - [Export(typeof(BaseMetadataProvider))] public class SortNameProvider : BaseMetadataProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs index a493ce746..c6210f74c 100644 --- a/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Model.Entities; using System; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers.TV /// <summary> /// Class EpisodeImageFromMediaLocationProvider /// </summary> - [Export(typeof(BaseMetadataProvider))] public class EpisodeImageFromMediaLocationProvider : BaseMetadataProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs b/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs index 08d0988eb..7a96e368c 100644 --- a/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs +++ b/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Model.Entities; using System; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers.TV /// <summary> /// Class EpisodeProviderFromXml /// </summary> - [Export(typeof(BaseMetadataProvider))] public class EpisodeProviderFromXml : BaseMetadataProvider { /// <summary> diff --git a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs index 2640e0482..05ab172a8 100644 --- a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs @@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Net; using System; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -12,7 +11,6 @@ using System.Xml; namespace MediaBrowser.Controller.Providers.TV { - [Export(typeof(BaseMetadataProvider))] class FanArtTVProvider : FanartBaseProvider { protected string FanArtBaseUrl = "http://api.fanart.tv/webservice/series/{0}/{1}/xml/all/1/1"; diff --git a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs index d1d931a62..b06598114 100644 --- a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs @@ -5,7 +5,6 @@ using MediaBrowser.Controller.Resolvers.TV; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Net; using System; -using System.ComponentModel.Composition; using System.IO; using System.Linq; using System.Threading; @@ -18,7 +17,6 @@ namespace MediaBrowser.Controller.Providers.TV /// <summary> /// Class RemoteEpisodeProvider /// </summary> - [Export(typeof(BaseMetadataProvider))] class RemoteEpisodeProvider : BaseMetadataProvider { diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs index 277b6d891..3e7f6b1a2 100644 --- a/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs @@ -5,7 +5,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Net; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -16,7 +15,6 @@ namespace MediaBrowser.Controller.Providers.TV /// <summary> /// Class RemoteSeasonProvider /// </summary> - [Export(typeof(BaseMetadataProvider))] class RemoteSeasonProvider : BaseMetadataProvider { diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs index 985aa0262..b8941dbba 100644 --- a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs @@ -7,7 +7,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Net; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.IO; using System.Net; using System.Text; @@ -20,7 +19,6 @@ namespace MediaBrowser.Controller.Providers.TV /// <summary> /// Class RemoteSeriesProvider /// </summary> - [Export(typeof(BaseMetadataProvider))] class RemoteSeriesProvider : BaseMetadataProvider { diff --git a/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs b/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs index c92841fb6..aa2cde28d 100644 --- a/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs +++ b/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Model.Entities; using System; -using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers.TV /// <summary> /// Class SeriesProviderFromXml /// </summary> - [Export(typeof(BaseMetadataProvider))] public class SeriesProviderFromXml : BaseMetadataProvider { /// <summary> diff --git a/MediaBrowser.Controller/Resolvers/Audio/AudioResolver.cs b/MediaBrowser.Controller/Resolvers/Audio/AudioResolver.cs index f827bf047..6e1bbfbfe 100644 --- a/MediaBrowser.Controller/Resolvers/Audio/AudioResolver.cs +++ b/MediaBrowser.Controller/Resolvers/Audio/AudioResolver.cs @@ -1,16 +1,26 @@ using MediaBrowser.Controller.Library; -using System.ComponentModel.Composition; namespace MediaBrowser.Controller.Resolvers.Audio { - [Export(typeof(IBaseItemResolver))] + /// <summary> + /// Class AudioResolver + /// </summary> public class AudioResolver : BaseItemResolver<Entities.Audio.Audio> { + /// <summary> + /// Gets the priority. + /// </summary> + /// <value>The priority.</value> public override ResolverPriority Priority { get { return ResolverPriority.Last; } } - + + /// <summary> + /// Resolves the specified args. + /// </summary> + /// <param name="args">The args.</param> + /// <returns>Entities.Audio.Audio.</returns> protected override Entities.Audio.Audio Resolve(ItemResolveArgs args) { // Return audio if the path is a file and has a matching extension diff --git a/MediaBrowser.Controller/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Controller/Resolvers/Audio/MusicAlbumResolver.cs index 8b2e49f31..d8d2c326d 100644 --- a/MediaBrowser.Controller/Resolvers/Audio/MusicAlbumResolver.cs +++ b/MediaBrowser.Controller/Resolvers/Audio/MusicAlbumResolver.cs @@ -1,17 +1,27 @@ using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; -using System.ComponentModel.Composition; namespace MediaBrowser.Controller.Resolvers.Audio { - [Export(typeof(IBaseItemResolver))] + /// <summary> + /// Class MusicAlbumResolver + /// </summary> public class MusicAlbumResolver : BaseItemResolver<MusicAlbum> { + /// <summary> + /// Gets the priority. + /// </summary> + /// <value>The priority.</value> public override ResolverPriority Priority { get { return ResolverPriority.Third; } // we need to be ahead of the generic folder resolver but behind the movie one } - + + /// <summary> + /// Resolves the specified args. + /// </summary> + /// <param name="args">The args.</param> + /// <returns>MusicAlbum.</returns> protected override MusicAlbum Resolve(ItemResolveArgs args) { if (!args.IsDirectory) return null; diff --git a/MediaBrowser.Controller/Resolvers/Audio/MusicArtistResolver.cs b/MediaBrowser.Controller/Resolvers/Audio/MusicArtistResolver.cs index 8060e8d33..45f96d3ab 100644 --- a/MediaBrowser.Controller/Resolvers/Audio/MusicArtistResolver.cs +++ b/MediaBrowser.Controller/Resolvers/Audio/MusicArtistResolver.cs @@ -1,18 +1,28 @@ using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; -using System.ComponentModel.Composition; using System.Linq; namespace MediaBrowser.Controller.Resolvers.Audio { - [Export(typeof(IBaseItemResolver))] + /// <summary> + /// Class MusicArtistResolver + /// </summary> public class MusicArtistResolver : BaseItemResolver<MusicArtist> { + /// <summary> + /// Gets the priority. + /// </summary> + /// <value>The priority.</value> public override ResolverPriority Priority { get { return ResolverPriority.Third; } // we need to be ahead of the generic folder resolver but behind the movie one } + /// <summary> + /// Resolves the specified args. + /// </summary> + /// <param name="args">The args.</param> + /// <returns>MusicArtist.</returns> protected override MusicArtist Resolve(ItemResolveArgs args) { if (!args.IsDirectory) return null; diff --git a/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs b/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs index 2d69f8def..770b673a5 100644 --- a/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs +++ b/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs @@ -1,7 +1,6 @@ using MediaBrowser.Controller.Library; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Linq; namespace MediaBrowser.Controller.Resolvers @@ -9,8 +8,7 @@ namespace MediaBrowser.Controller.Resolvers /// <summary> /// Provides the core resolver ignore rules /// </summary> - [Export(typeof(BaseResolutionIgnoreRule))] - public class CoreResolutionIgnoreRule : BaseResolutionIgnoreRule + public class CoreResolutionIgnoreRule : IResolutionIgnoreRule { /// <summary> /// Any folder named in this list will be ignored - can be added to at runtime for extensibility @@ -27,7 +25,12 @@ namespace MediaBrowser.Controller.Resolvers "extrafanart" }; - public override bool ShouldIgnore(ItemResolveArgs args) + /// <summary> + /// Shoulds the ignore. + /// </summary> + /// <param name="args">The args.</param> + /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> + public bool ShouldIgnore(ItemResolveArgs args) { // Ignore hidden files and folders if (args.IsHidden) diff --git a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs index 75e130526..f406cb185 100644 --- a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs +++ b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Win32; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using System; using System.Collections.Generic; diff --git a/MediaBrowser.Controller/Resolvers/FolderResolver.cs b/MediaBrowser.Controller/Resolvers/FolderResolver.cs index e37c18692..c356b8c84 100644 --- a/MediaBrowser.Controller/Resolvers/FolderResolver.cs +++ b/MediaBrowser.Controller/Resolvers/FolderResolver.cs @@ -1,13 +1,11 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; -using System.ComponentModel.Composition; namespace MediaBrowser.Controller.Resolvers { /// <summary> /// Class FolderResolver /// </summary> - [Export(typeof(IBaseItemResolver))] public class FolderResolver : BaseFolderResolver<Folder> { /// <summary> diff --git a/MediaBrowser.Controller/Resolvers/BaseResolutionIgnoreRule.cs b/MediaBrowser.Controller/Resolvers/IResolutionIgnoreRule.cs index 45effc4da..661688f3c 100644 --- a/MediaBrowser.Controller/Resolvers/BaseResolutionIgnoreRule.cs +++ b/MediaBrowser.Controller/Resolvers/IResolutionIgnoreRule.cs @@ -5,8 +5,8 @@ namespace MediaBrowser.Controller.Resolvers /// <summary> /// Provides a base "rule" that anyone can use to have paths ignored by the resolver /// </summary> - public abstract class BaseResolutionIgnoreRule + public interface IResolutionIgnoreRule { - public abstract bool ShouldIgnore(ItemResolveArgs args); + bool ShouldIgnore(ItemResolveArgs args); } } diff --git a/MediaBrowser.Controller/Resolvers/LocalTrailerResolver.cs b/MediaBrowser.Controller/Resolvers/LocalTrailerResolver.cs index c26b0ce37..a61e010b3 100644 --- a/MediaBrowser.Controller/Resolvers/LocalTrailerResolver.cs +++ b/MediaBrowser.Controller/Resolvers/LocalTrailerResolver.cs @@ -1,7 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using System; -using System.ComponentModel.Composition; using System.IO; namespace MediaBrowser.Controller.Resolvers @@ -9,7 +8,6 @@ namespace MediaBrowser.Controller.Resolvers /// <summary> /// Class LocalTrailerResolver /// </summary> - [Export(typeof(IBaseItemResolver))] public class LocalTrailerResolver : BaseVideoResolver<Trailer> { /// <summary> diff --git a/MediaBrowser.Controller/Resolvers/Movies/BoxSetResolver.cs b/MediaBrowser.Controller/Resolvers/Movies/BoxSetResolver.cs index ccca0cfab..2eee2a98b 100644 --- a/MediaBrowser.Controller/Resolvers/Movies/BoxSetResolver.cs +++ b/MediaBrowser.Controller/Resolvers/Movies/BoxSetResolver.cs @@ -1,7 +1,6 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Library; using System; -using System.ComponentModel.Composition; using System.IO; namespace MediaBrowser.Controller.Resolvers.Movies @@ -9,7 +8,6 @@ namespace MediaBrowser.Controller.Resolvers.Movies /// <summary> /// Class BoxSetResolver /// </summary> - [Export(typeof(IBaseItemResolver))] public class BoxSetResolver : BaseFolderResolver<BoxSet> { /// <summary> diff --git a/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs index 14f635747..9443221a3 100644 --- a/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs @@ -6,7 +6,6 @@ using MediaBrowser.Controller.Providers.Movies; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.IO; namespace MediaBrowser.Controller.Resolvers.Movies @@ -14,7 +13,6 @@ namespace MediaBrowser.Controller.Resolvers.Movies /// <summary> /// Class MovieResolver /// </summary> - [Export(typeof(IBaseItemResolver))] public class MovieResolver : BaseVideoResolver<Movie> { /// <summary> diff --git a/MediaBrowser.Controller/Resolvers/TV/EpisodeResolver.cs b/MediaBrowser.Controller/Resolvers/TV/EpisodeResolver.cs index f2f3ce122..d1789bcbb 100644 --- a/MediaBrowser.Controller/Resolvers/TV/EpisodeResolver.cs +++ b/MediaBrowser.Controller/Resolvers/TV/EpisodeResolver.cs @@ -1,14 +1,20 @@ -using System; -using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; -using System.ComponentModel.Composition; using MediaBrowser.Model.Entities; +using System; namespace MediaBrowser.Controller.Resolvers.TV { - [Export(typeof(IBaseItemResolver))] + /// <summary> + /// Class EpisodeResolver + /// </summary> public class EpisodeResolver : BaseVideoResolver<Episode> { + /// <summary> + /// Resolves the specified args. + /// </summary> + /// <param name="args">The args.</param> + /// <returns>Episode.</returns> protected override Episode Resolve(ItemResolveArgs args) { // If the parent is a Season or Series, then this is an Episode if the VideoResolver returns something @@ -40,6 +46,11 @@ namespace MediaBrowser.Controller.Resolvers.TV return null; } + /// <summary> + /// Sets the initial item values. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="args">The args.</param> protected override void SetInitialItemValues(Episode item, ItemResolveArgs args) { base.SetInitialItemValues(item, args); diff --git a/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs b/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs index 6569c85bc..9ea474207 100644 --- a/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs +++ b/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs @@ -1,13 +1,19 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using System; -using System.ComponentModel.Composition; namespace MediaBrowser.Controller.Resolvers.TV { - [Export(typeof(IBaseItemResolver))] + /// <summary> + /// Class SeasonResolver + /// </summary> public class SeasonResolver : BaseFolderResolver<Season> { + /// <summary> + /// Resolves the specified args. + /// </summary> + /// <param name="args">The args.</param> + /// <returns>Season.</returns> protected override Season Resolve(ItemResolveArgs args) { if (args.Parent is Series && args.IsDirectory) @@ -21,6 +27,11 @@ namespace MediaBrowser.Controller.Resolvers.TV return null; } + /// <summary> + /// Sets the initial item values. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="args">The args.</param> protected override void SetInitialItemValues(Season item, ItemResolveArgs args) { base.SetInitialItemValues(item, args); diff --git a/MediaBrowser.Controller/Resolvers/TV/SeriesResolver.cs b/MediaBrowser.Controller/Resolvers/TV/SeriesResolver.cs index 7c0bc3df1..c973cfe87 100644 --- a/MediaBrowser.Controller/Resolvers/TV/SeriesResolver.cs +++ b/MediaBrowser.Controller/Resolvers/TV/SeriesResolver.cs @@ -3,7 +3,6 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using System; -using System.ComponentModel.Composition; using System.IO; namespace MediaBrowser.Controller.Resolvers.TV @@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Resolvers.TV /// <summary> /// Class SeriesResolver /// </summary> - [Export(typeof(IBaseItemResolver))] public class SeriesResolver : BaseFolderResolver<Series> { /// <summary> diff --git a/MediaBrowser.Controller/Resolvers/VideoResolver.cs b/MediaBrowser.Controller/Resolvers/VideoResolver.cs index bfb364349..5f2f8d954 100644 --- a/MediaBrowser.Controller/Resolvers/VideoResolver.cs +++ b/MediaBrowser.Controller/Resolvers/VideoResolver.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using System; -using System.ComponentModel.Composition; using System.IO; namespace MediaBrowser.Controller.Resolvers @@ -10,7 +9,6 @@ namespace MediaBrowser.Controller.Resolvers /// <summary> /// Resolves a Path into a Video /// </summary> - [Export(typeof(IBaseItemResolver))] public class VideoResolver : BaseVideoResolver<Video> { /// <summary> diff --git a/MediaBrowser.Controller/ScheduledTasks/ChapterImagesTask.cs b/MediaBrowser.Controller/ScheduledTasks/ChapterImagesTask.cs index d3d30ed77..1a64bb853 100644 --- a/MediaBrowser.Controller/ScheduledTasks/ChapterImagesTask.cs +++ b/MediaBrowser.Controller/ScheduledTasks/ChapterImagesTask.cs @@ -1,19 +1,30 @@ using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Controller.ScheduledTasks { - [Export(typeof(IScheduledTask))] + /// <summary> + /// Class ChapterImagesTask + /// </summary> class ChapterImagesTask : BaseScheduledTask<Kernel> { /// <summary> + /// Initializes a new instance of the <see cref="ChapterImagesTask" /> class. + /// </summary> + /// <param name="kernel">The kernel.</param> + /// <param name="logger"></param> + public ChapterImagesTask(Kernel kernel, ITaskManager taskManager, ILogger logger) + : base(kernel, taskManager, logger) + { + } + + /// <summary> /// Creates the triggers that define when the task will run /// </summary> /// <returns>IEnumerable{BaseTaskTrigger}.</returns> diff --git a/MediaBrowser.Controller/ScheduledTasks/ImageCleanupTask.cs b/MediaBrowser.Controller/ScheduledTasks/ImageCleanupTask.cs index 57fc280de..8dd0895c9 100644 --- a/MediaBrowser.Controller/ScheduledTasks/ImageCleanupTask.cs +++ b/MediaBrowser.Controller/ScheduledTasks/ImageCleanupTask.cs @@ -1,11 +1,9 @@ -using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; -using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.IO; using System.Linq; using System.Threading; @@ -16,10 +14,19 @@ namespace MediaBrowser.Controller.ScheduledTasks /// <summary> /// Class ImageCleanupTask /// </summary> - [Export(typeof(IScheduledTask))] public class ImageCleanupTask : BaseScheduledTask<Kernel> { /// <summary> + /// Initializes a new instance of the <see cref="ImageCleanupTask" /> class. + /// </summary> + /// <param name="kernel">The kernel.</param> + /// <param name="logger"></param> + public ImageCleanupTask(Kernel kernel, ITaskManager taskManager, ILogger logger) + : base(kernel, taskManager, logger) + { + } + + /// <summary> /// Creates the triggers that define when the task will run /// </summary> /// <returns>IEnumerable{BaseTaskTrigger}.</returns> diff --git a/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs b/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs index 2a91f0716..ee55ff2e9 100644 --- a/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs +++ b/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs @@ -1,7 +1,7 @@ using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Threading; using System.Threading.Tasks; @@ -10,10 +10,19 @@ namespace MediaBrowser.Controller.ScheduledTasks /// <summary> /// Class PeopleValidationTask /// </summary> - [Export(typeof(IScheduledTask))] public class PeopleValidationTask : BaseScheduledTask<Kernel> { /// <summary> + /// Initializes a new instance of the <see cref="PeopleValidationTask" /> class. + /// </summary> + /// <param name="kernel">The kernel.</param> + /// <param name="logger"></param> + public PeopleValidationTask(Kernel kernel, ITaskManager taskManager, ILogger logger) + : base(kernel, taskManager, logger) + { + } + + /// <summary> /// Creates the triggers that define when the task will run /// </summary> /// <returns>IEnumerable{BaseTaskTrigger}.</returns> diff --git a/MediaBrowser.Controller/ScheduledTasks/PluginUpdateTask.cs b/MediaBrowser.Controller/ScheduledTasks/PluginUpdateTask.cs index 3d79193d5..854c3b82f 100644 --- a/MediaBrowser.Controller/ScheduledTasks/PluginUpdateTask.cs +++ b/MediaBrowser.Controller/ScheduledTasks/PluginUpdateTask.cs @@ -1,9 +1,8 @@ using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; -using MediaBrowser.Model.Tasks; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.IO; using System.Linq; using System.Threading; @@ -14,10 +13,19 @@ namespace MediaBrowser.Controller.ScheduledTasks /// <summary> /// Plugin Update Task /// </summary> - [Export(typeof(IScheduledTask))] public class PluginUpdateTask : BaseScheduledTask<Kernel> { /// <summary> + /// Initializes a new instance of the <see cref="PluginUpdateTask" /> class. + /// </summary> + /// <param name="kernel">The kernel.</param> + /// <param name="logger"></param> + public PluginUpdateTask(Kernel kernel, ITaskManager taskManager, ILogger logger) + : base(kernel, taskManager, logger) + { + } + + /// <summary> /// Creates the triggers that define when the task will run /// </summary> /// <returns>IEnumerable{BaseTaskTrigger}.</returns> diff --git a/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs b/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs index f0fcb8aba..76e60f2ef 100644 --- a/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs +++ b/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs @@ -1,8 +1,8 @@ using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Tasks; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Threading; using System.Threading.Tasks; @@ -11,10 +11,19 @@ namespace MediaBrowser.Controller.ScheduledTasks /// <summary> /// Class RefreshMediaLibraryTask /// </summary> - [Export(typeof(IScheduledTask))] public class RefreshMediaLibraryTask : BaseScheduledTask<Kernel> { /// <summary> + /// Initializes a new instance of the <see cref="RefreshMediaLibraryTask" /> class. + /// </summary> + /// <param name="kernel">The kernel.</param> + /// <param name="logger"></param> + public RefreshMediaLibraryTask(Kernel kernel, ITaskManager taskManager, ILogger logger) + : base(kernel, taskManager, logger) + { + } + + /// <summary> /// Gets the default triggers. /// </summary> /// <returns>IEnumerable{BaseTaskTrigger}.</returns> @@ -22,7 +31,7 @@ namespace MediaBrowser.Controller.ScheduledTasks { return new BaseTaskTrigger[] { - new StartupTrigger(Kernel), + new StartupTrigger(), new SystemEventTrigger{ SystemEvent = SystemEvent.WakeFromSleep}, |
