From 047e97cb22327076fb10e842d03c680b0e12b487 Mon Sep 17 00:00:00 2001 From: Chris Schneider Date: Fri, 22 Feb 2013 09:08:51 -0600 Subject: make metro styled tiles look and act the same --- MediaBrowser.WebDashboard/Html/css/site.css | 44 ++++++++++++++-------- MediaBrowser.WebDashboard/Html/login.html | 2 +- .../Html/scripts/LoginPage.js | 32 ++++++++++------ .../Html/scripts/PluginCatalogPage.js | 6 ++- MediaBrowser.WebDashboard/Html/scripts/site.js | 27 ++++--------- 5 files changed, 62 insertions(+), 49 deletions(-) diff --git a/MediaBrowser.WebDashboard/Html/css/site.css b/MediaBrowser.WebDashboard/Html/css/site.css index c9b2089c73..2c4971bcc7 100644 --- a/MediaBrowser.WebDashboard/Html/css/site.css +++ b/MediaBrowser.WebDashboard/Html/css/site.css @@ -425,7 +425,6 @@ form, .readOnlyContent { font-size: 15px; padding: 0; position: relative; - padding-bottom: 28px; } .posterViewItem a { @@ -436,7 +435,7 @@ form, .readOnlyContent { .posterViewItem img { max-width: 155px; - max-height: 148px; + max-height: 155px; vertical-align: bottom; } @@ -454,19 +453,25 @@ form, .readOnlyContent { .posterViewItemText { text-overflow: ellipsis; overflow: hidden; - text-wrap: none; white-space: nowrap; margin: 0; - padding: 4px 2px 0; - position: absolute; + padding: 4px 0px 0; bottom: 0; left: 0; right: 0; - height: 24px; background: #181818; text-shadow: none; + max-width: 155px; } + .posterViewItemText div{ + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + margin: 0px 4px; + height: 24px; + } + .posterViewItem:hover, .userItem:hover { -moz-box-shadow: 0 0 20px 3px #2572EB; -webkit-box-shadow: 0 0 20px 3px #2572EB; @@ -477,11 +482,11 @@ form, .readOnlyContent { .posterViewItem { font-size: 16px; - padding-bottom: 29px; } .posterViewItemText { padding-top: 5px; + max-width: 190px; } .posterViewItem img { @@ -496,29 +501,37 @@ form, .readOnlyContent { font-size: 17px; } - .posterViewItem img { - max-width: 280px; - max-height: 250px; - } + .posterViewItem img { + max-width: 280px; + max-height: 280px; + } + + .posterViewItemText { + max-width: 280px; + } } @media all and (min-width: 1920px) { .posterViewItem { font-size: 19px; - padding-bottom: 33px; } - .posterViewItemText { + .posterViewItemText div{ height: 28px; } .posterViewItem img { max-width: 352px; - max-height: 300px; + max-height: 352px; + } + + .posterViewItemText { + max-width: 352px; } } +/*DEPRECATED userItem classes .userItem { display: inline-block; margin: 5px; @@ -620,7 +633,8 @@ form, .readOnlyContent { .userItemHeader { font-size: 40px; } -} +}*/ +/*DEPRECATED userItem classes END /* Startup wizard */ .wizardPage { diff --git a/MediaBrowser.WebDashboard/Html/login.html b/MediaBrowser.WebDashboard/Html/login.html index 4cb73c06ef..36c453d555 100644 --- a/MediaBrowser.WebDashboard/Html/login.html +++ b/MediaBrowser.WebDashboard/Html/login.html @@ -7,7 +7,7 @@
-
+
'; -- cgit v1.2.3 From 58cfcd412672d213af01630cf2894ff78a7bf24c Mon Sep 17 00:00:00 2001 From: Chris Schneider Date: Fri, 22 Feb 2013 09:28:35 -0600 Subject: added missing type: attr type: attributes were accidentally omitted during the merge --- MediaBrowser.WebDashboard/Html/scripts/LoginPage.js | 6 ++++-- MediaBrowser.WebDashboard/Html/scripts/site.js | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/MediaBrowser.WebDashboard/Html/scripts/LoginPage.js b/MediaBrowser.WebDashboard/Html/scripts/LoginPage.js index c6d89a4c11..ca4677e04e 100644 --- a/MediaBrowser.WebDashboard/Html/scripts/LoginPage.js +++ b/MediaBrowser.WebDashboard/Html/scripts/LoginPage.js @@ -23,7 +23,8 @@ return ApiClient.getUserImageUrl(user.Id, { width: 240, - tag: user.PrimaryImageTag + tag: user.PrimaryImageTag, + type: "Primary" }); }, @@ -73,7 +74,8 @@ var imgUrl = ApiClient.getUserImageUrl(user.Id, { width: 500, - tag: user.PrimaryImageTag + tag: user.PrimaryImageTag, + type: "Primary" }); html += ''; diff --git a/MediaBrowser.WebDashboard/Html/scripts/site.js b/MediaBrowser.WebDashboard/Html/scripts/site.js index 67f28aeeba..2660697dc2 100644 --- a/MediaBrowser.WebDashboard/Html/scripts/site.js +++ b/MediaBrowser.WebDashboard/Html/scripts/site.js @@ -474,7 +474,8 @@ var Dashboard = { var imageUrl = user.PrimaryImageTag ? ApiClient.getUserImageUrl(user.Id, { height: 400, - tag: user.PrimaryImageTag + tag: user.PrimaryImageTag, + type: "Primary" }) : "css/images/userFlyoutDefault.png"; @@ -566,7 +567,18 @@ var Dashboard = { Dashboard.showLoadingMsg(); - ApiClient.getDirectoryContents(path, { includeDirectories: true }).done(function (folders) { + var promise; + + if (path === "Network") { + promise = ApiClient.getNetworkComputers(); + } + else if (path) { + promise = ApiClient.getDirectoryContents(path, { includeDirectories: true }); + } else { + promise = ApiClient.getDrives(); + } + + promise.done(function (folders) { $('#txtDirectoryPickerPath', page).val(path || ""); @@ -683,7 +695,8 @@ var Dashboard = { var url = ApiClient.getUserImageUrl(user.Id, { width: 225, - tag: user.PrimaryImageTag + tag: user.PrimaryImageTag, + type: "Primary" }); headerHtml += ''; -- cgit v1.2.3 From 5623abb2869d7f3d9c7a06ef39342b4569a3f710 Mon Sep 17 00:00:00 2001 From: Chris Schneider Date: Fri, 22 Feb 2013 09:46:39 -0600 Subject: removed deprecated code --- MediaBrowser.WebDashboard/Html/css/site.css | 105 ---------------------------- 1 file changed, 105 deletions(-) diff --git a/MediaBrowser.WebDashboard/Html/css/site.css b/MediaBrowser.WebDashboard/Html/css/site.css index 2c4971bcc7..186266c4dc 100644 --- a/MediaBrowser.WebDashboard/Html/css/site.css +++ b/MediaBrowser.WebDashboard/Html/css/site.css @@ -531,111 +531,6 @@ form, .readOnlyContent { } } -/*DEPRECATED userItem classes -.userItem { - display: inline-block; - margin: 5px; - font-size: 15px; - text-align: left; -} - -.userItemImage { - height: 100px; - width: 100px; - vertical-align: bottom; -} - -.userItemContent { - display: inline-block; - height: 100px; - width: 180px; - float: right; - text-shadow: none; - font-family: 'Segoe UI Light', 'Open Sans', Arial; -} - -.userItemContentInner { - padding: 15px 5px 5px 10px; - color: #fff; -} - -.userItemHeader { - margin: 0 0 10px; - font-size: 16px; - text-overflow: ellipsis; - overflow: hidden; - text-wrap: avoid; - font-family: 'Segoe UI Semilight', 'Open Sans', Arial; -} - -@media all and (min-width: 750px) { - - .userItem { - font-size: 16px; - } - - .userItemContentInner { - padding: 30px 20px 20px; - } - - .userItemImage { - height: 140px; - width: 140px; - } - - .userItemContent { - height: 140px; - width: 210px; - } - - .userItemHeader { - font-size: 26px; - } -} - -@media all and (min-width: 1200px) { - - .userItem { - font-size: 18px; - } - - .userItemImage { - height: 180px; - width: 180px; - } - - .userItemContent { - height: 180px; - width: 270px; - } - - .userItemHeader { - font-size: 32px; - } -} - -@media all and (min-width: 1920px) { - - .userItem { - font-size: 20px; - } - - .userItemImage { - height: 240px; - width: 240px; - } - - .userItemContent { - height: 240px; - width: 360px; - } - - .userItemHeader { - font-size: 40px; - } -}*/ -/*DEPRECATED userItem classes END - /* Startup wizard */ .wizardPage { background: #e2e2e2; -- cgit v1.2.3 From 83b7b1861421a6f9353deef364e3af97ae7a95fb Mon Sep 17 00:00:00 2001 From: ScottIsAFool Date: Fri, 22 Feb 2013 19:20:30 +0000 Subject: Set the Common, Controller, Model, UI and UI.Controls to go into one folder, set nuspec files up for the packages to make it easier to create nuget packages. --- .gitignore | 1 + MediaBrowser.Common/MediaBrowser.Common.csproj | 3 +++ .../MediaBrowser.Controller.csproj | 3 +-- MediaBrowser.Model/MediaBrowser.Model.csproj | 3 +-- .../MediaBrowser.UI.Controls.csproj | 3 +++ MediaBrowser.UI/MediaBrowser.UI.csproj | 3 +++ Nuget/MediaBrowser.Common.nuspec | 18 ++++++++++++++++++ Nuget/MediaBrowser.Server.Core.nupkg.REMOVED.git-id | 1 - Nuget/MediaBrowser.Server.Core.nuspec | 19 +++++++++++++++++++ Nuget/MediaBrowser.Theater.Core.nuspec | 20 ++++++++++++++++++++ 10 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 Nuget/MediaBrowser.Common.nuspec delete mode 100644 Nuget/MediaBrowser.Server.Core.nupkg.REMOVED.git-id create mode 100644 Nuget/MediaBrowser.Server.Core.nuspec create mode 100644 Nuget/MediaBrowser.Theater.Core.nuspec diff --git a/.gitignore b/.gitignore index 3fbadb705a..d673b0d967 100644 --- a/.gitignore +++ b/.gitignore @@ -145,6 +145,7 @@ publish/ # NuGet Packages Directory ## TODO: If you have NuGet Package Restore enabled, uncomment the next line packages/ +dlls/ # Windows Azure Build Output csx diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 0f0c58f178..6b9e3e2597 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -229,6 +229,9 @@ + + xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i + + + + + + Debug + AnyCPU + {5624B7B5-B5A7-41D8-9F10-CC5611109619} + Library + Properties + MediaBrowser.WebDashboard + MediaBrowser.WebDashboard + v4.5 + 512 + ..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Always + + + + False + ..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.dll + + + False + ..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Common.dll + + + False + ..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Interfaces.dll + + + False + ..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.dll + + + False + ..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.SqlServer.dll + + + False + ..\packages\ServiceStack.Redis.3.9.37\lib\net35\ServiceStack.Redis.dll + + + False + ..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.ServiceInterface.dll + + + False + ..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll + + + + + + + + + + + + + + Properties\SharedVersion.cs + + + + + + + + + {9142eefa-7570-41e1-bfcc-468bb571af2f} + MediaBrowser.Common + + + {17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2} + MediaBrowser.Controller + + + {7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b} + MediaBrowser.Model + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xcopy "$(TargetPath)" "$(SolutionDir)\MediaBrowser.ServerApplication\CorePlugins\" /y + + + \ No newline at end of file -- cgit v1.2.3 From 107c241598f0181102c53e2e1b215d335976028d Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Fri, 22 Feb 2013 15:52:59 -0500 Subject: Added IDisposable to IWebSocketListener --- MediaBrowser.Api/Api.cs | 12 ++++++++++++ MediaBrowser.Common/Kernel/IWebSocketListener.cs | 3 ++- MediaBrowser.Common/MediaBrowser.Common.csproj | 3 --- MediaBrowser.Common/packages.config | 1 - 4 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 MediaBrowser.Api/Api.cs diff --git a/MediaBrowser.Api/Api.cs b/MediaBrowser.Api/Api.cs new file mode 100644 index 0000000000..fda9d1bd82 --- /dev/null +++ b/MediaBrowser.Api/Api.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MediaBrowser.Api +{ + class Api + { + } +} diff --git a/MediaBrowser.Common/Kernel/IWebSocketListener.cs b/MediaBrowser.Common/Kernel/IWebSocketListener.cs index b04bb68851..00be28ed34 100644 --- a/MediaBrowser.Common/Kernel/IWebSocketListener.cs +++ b/MediaBrowser.Common/Kernel/IWebSocketListener.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Net; +using System; using System.Threading.Tasks; namespace MediaBrowser.Common.Kernel @@ -6,7 +7,7 @@ namespace MediaBrowser.Common.Kernel /// ///This is an interface for listening to messages coming through a web socket connection /// - public interface IWebSocketListener + public interface IWebSocketListener : IDisposable { /// /// Processes the message. diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 0f0c58f178..9ad4a12736 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -41,9 +41,6 @@ ..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll - - ..\packages\morelinq.1.0.15631-beta\lib\net35\MoreLinq.dll - ..\packages\NLog.2.0.0.2000\lib\net40\NLog.dll diff --git a/MediaBrowser.Common/packages.config b/MediaBrowser.Common/packages.config index 4ac80b2854..536640094c 100644 --- a/MediaBrowser.Common/packages.config +++ b/MediaBrowser.Common/packages.config @@ -1,7 +1,6 @@  - -- cgit v1.2.3 From a2d215b6ae9d594d71a679a464c9c6a559efe862 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Fri, 22 Feb 2013 19:24:50 -0500 Subject: added simple injector for dependancy management --- MediaBrowser.Api/LibraryService.cs | 5 +- MediaBrowser.Common/Kernel/BaseKernel.cs | 153 ++++++++++++++++++--- MediaBrowser.Common/MediaBrowser.Common.csproj | 4 +- MediaBrowser.Common/Mef/MefUtils.cs | 80 ----------- .../Serialization/DynamicProtobufSerializer.cs | 13 +- MediaBrowser.Common/packages.config | 1 + MediaBrowser.Controller/Kernel.cs | 46 +++++-- .../MediaBrowser.Controller.csproj | 6 +- .../Resolvers/BaseResolutionIgnoreRule.cs | 12 -- .../Resolvers/CoreResolutionIgnoreRule.cs | 6 +- .../Resolvers/IResolutionIgnoreRule.cs | 12 ++ MediaBrowser.Controller/packages.config | 1 + .../MediaBrowser.Server.Sqlite.csproj | 1 - .../SQLiteDisplayPreferencesRepository.cs | 5 +- MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs | 5 +- .../SQLiteUserDataRepository.cs | 5 +- MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs | 5 +- 17 files changed, 208 insertions(+), 152 deletions(-) delete mode 100644 MediaBrowser.Common/Mef/MefUtils.cs delete mode 100644 MediaBrowser.Controller/Resolvers/BaseResolutionIgnoreRule.cs create mode 100644 MediaBrowser.Controller/Resolvers/IResolutionIgnoreRule.cs diff --git a/MediaBrowser.Api/LibraryService.cs b/MediaBrowser.Api/LibraryService.cs index 585bfd45d1..bcf87ab674 100644 --- a/MediaBrowser.Api/LibraryService.cs +++ b/MediaBrowser.Api/LibraryService.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Mef; -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; @@ -213,7 +212,7 @@ namespace MediaBrowser.Api { var kernel = (Kernel)Kernel; - var allTypes = kernel.Assemblies.SelectMany(MefUtils.GetTypes).Where(t => !t.IsAbstract && t.IsSubclassOf(typeof(BaseItem))); + var allTypes = kernel.AllTypes.Where(t => !t.IsAbstract && t.IsSubclassOf(typeof(BaseItem))); if (request.HasInternetProvider) { diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 2b39864089..91965e4690 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -1,7 +1,5 @@ using MediaBrowser.Common.Events; using MediaBrowser.Common.IO; -using MediaBrowser.Common.Localization; -using MediaBrowser.Common.Mef; using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; using MediaBrowser.Common.ScheduledTasks; @@ -13,12 +11,14 @@ using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; +using System.ComponentModel.Composition.Primitives; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; +using SimpleInjector; namespace MediaBrowser.Common.Kernel { @@ -200,13 +200,6 @@ namespace MediaBrowser.Common.Kernel [ImportMany(typeof(IWebSocketListener))] public IEnumerable WebSocketListeners { get; private set; } - /// - /// Gets the list of Localized string files - /// - /// The string files. - [ImportMany(typeof(LocalizedStringData))] - public IEnumerable StringFiles { get; private set; } - /// /// Gets the MEF CompositionContainer /// @@ -241,7 +234,6 @@ namespace MediaBrowser.Common.Kernel /// Gets the rest services. /// /// The rest services. - [ImportMany(typeof(IRestfulService))] public IEnumerable RestServices { get; private set; } /// @@ -265,7 +257,7 @@ namespace MediaBrowser.Common.Kernel get { // Lazy load - LazyInitializer.EnsureInitialized(ref _protobufSerializer, ref _protobufSerializerInitialized, ref _protobufSerializerSyncLock, () => DynamicProtobufSerializer.Create(Assemblies)); + LazyInitializer.EnsureInitialized(ref _protobufSerializer, ref _protobufSerializerInitialized, ref _protobufSerializerSyncLock, () => DynamicProtobufSerializer.Create(AllTypes)); return _protobufSerializer; } private set @@ -341,6 +333,12 @@ namespace MediaBrowser.Common.Kernel /// The assemblies. public Assembly[] Assemblies { get; private set; } + /// + /// Gets all types. + /// + /// All types. + public Type[] AllTypes { get; private set; } + /// /// Initializes a new instance of the class. /// @@ -460,25 +458,83 @@ namespace MediaBrowser.Common.Kernel Assemblies = GetComposablePartAssemblies().ToArray(); - CompositionContainer = MefUtils.GetSafeCompositionContainer(Assemblies.Select(i => new AssemblyCatalog(i))); - - ComposeExportedValues(CompositionContainer); + AllTypes = Assemblies.SelectMany(GetTypes).ToArray(); - CompositionContainer.ComposeParts(this); + ComposeParts(AllTypes); await OnComposablePartsLoaded().ConfigureAwait(false); CompositionContainer.Catalog.Dispose(); } + /// + /// The ioc container + /// + private readonly Container _iocContainer = new Container(); + + /// + /// Composes the parts. + /// + /// All types. + private void ComposeParts(IEnumerable allTypes) + { + var concreteTypes = allTypes.Where(t => t.IsClass && !t.IsAbstract && !t.IsInterface && !t.IsGenericType).ToArray(); + + CompositionContainer = GetSafeCompositionContainer(concreteTypes.Select(i => new TypeCatalog(i))); + + ComposeExportedValues(CompositionContainer, _iocContainer); + + CompositionContainer.ComposeParts(this); + + ComposePartsWithIocContainer(concreteTypes, _iocContainer); + } + + /// + /// Composes the parts with ioc container. + /// + /// All types. + /// The container. + protected virtual void ComposePartsWithIocContainer(Type[] allTypes, Container container) + { + RestServices = GetExports(allTypes); + } + + /// + /// Gets the exports. + /// + /// + /// All types. + /// IEnumerable{``0}. + protected IEnumerable GetExports(Type[] allTypes) + { + var currentType = typeof(T); + + Logger.Info("Composing instances of " + currentType.Name); + + return allTypes.Where(currentType.IsAssignableFrom).Select(Instantiate).Cast().ToArray(); + } + + /// + /// Instantiates the specified type. + /// + /// The type. + /// System.Object. + private object Instantiate(Type type) + { + return _iocContainer.GetInstance(type); + } + /// /// Composes the exported values. /// /// The container. - protected virtual void ComposeExportedValues(CompositionContainer container) + protected virtual void ComposeExportedValues(CompositionContainer container, Container iocContainer) { container.ComposeExportedValue("logger", Logger); container.ComposeExportedValue("appHost", ApplicationHost); + + iocContainer.RegisterSingle(Logger); + iocContainer.RegisterSingle(ApplicationHost); } /// @@ -545,6 +601,71 @@ namespace MediaBrowser.Common.Kernel yield return GetType().Assembly; } + /// + /// Plugins that live on both the server and UI are going to have references to assemblies from both sides. + /// But looks for Parts on one side, it will throw an exception when it seems Types from the other side that it doesn't have a reference to. + /// For example, a plugin provides a Resolver. When MEF runs in the UI, it will throw an exception when it sees the resolver because there won't be a reference to the base class. + /// This method will catch those exceptions while retining the list of Types that MEF is able to resolve. + /// + /// The catalogs. + /// CompositionContainer. + /// catalogs + private static CompositionContainer GetSafeCompositionContainer(IEnumerable catalogs) + { + if (catalogs == null) + { + throw new ArgumentNullException("catalogs"); + } + + var newList = new List(); + + // Go through each Catalog + foreach (var catalog in catalogs) + { + try + { + // Try to have MEF find Parts + catalog.Parts.ToArray(); + + // If it succeeds we can use the entire catalog + newList.Add(catalog); + } + catch (ReflectionTypeLoadException ex) + { + // If it fails we can still get a list of the Types it was able to resolve and create TypeCatalogs + var typeCatalogs = ex.Types.Where(t => t != null).Select(t => new TypeCatalog(t)); + newList.AddRange(typeCatalogs); + } + } + + return new CompositionContainer(new AggregateCatalog(newList)); + } + + /// + /// Gets a list of types within an assembly + /// This will handle situations that would normally throw an exception - such as a type within the assembly that depends on some other non-existant reference + /// + /// The assembly. + /// IEnumerable{Type}. + /// assembly + private static IEnumerable GetTypes(Assembly assembly) + { + if (assembly == null) + { + throw new ArgumentNullException("assembly"); + } + + try + { + return assembly.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + // If it fails we can still get a list of the Types it was able to resolve + return ex.Types.Where(t => t != null); + } + } + /// /// Fires after MEF finishes finding composable parts within plugin assemblies /// diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 9ad4a12736..12c76cff65 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -88,6 +88,9 @@ False ..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll + + ..\packages\SimpleInjector.2.0.0-beta5\lib\net40-client\SimpleInjector.dll + @@ -139,7 +142,6 @@ - diff --git a/MediaBrowser.Common/Mef/MefUtils.cs b/MediaBrowser.Common/Mef/MefUtils.cs deleted file mode 100644 index 744f6cd809..0000000000 --- a/MediaBrowser.Common/Mef/MefUtils.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.Composition.Hosting; -using System.ComponentModel.Composition.Primitives; -using System.Linq; -using System.Reflection; - -namespace MediaBrowser.Common.Mef -{ - /// - /// Class MefUtils - /// - public static class MefUtils - { - /// - /// Plugins that live on both the server and UI are going to have references to assemblies from both sides. - /// But looks for Parts on one side, it will throw an exception when it seems Types from the other side that it doesn't have a reference to. - /// For example, a plugin provides a Resolver. When MEF runs in the UI, it will throw an exception when it sees the resolver because there won't be a reference to the base class. - /// This method will catch those exceptions while retining the list of Types that MEF is able to resolve. - /// - /// The catalogs. - /// CompositionContainer. - /// catalogs - public static CompositionContainer GetSafeCompositionContainer(IEnumerable catalogs) - { - if (catalogs == null) - { - throw new ArgumentNullException("catalogs"); - } - - var newList = new List(); - - // Go through each Catalog - foreach (var catalog in catalogs) - { - try - { - // Try to have MEF find Parts - catalog.Parts.ToArray(); - - // If it succeeds we can use the entire catalog - newList.Add(catalog); - } - catch (ReflectionTypeLoadException ex) - { - // If it fails we can still get a list of the Types it was able to resolve and create TypeCatalogs - var typeCatalogs = ex.Types.Where(t => t != null).Select(t => new TypeCatalog(t)); - newList.AddRange(typeCatalogs); - } - } - - return new CompositionContainer(new AggregateCatalog(newList)); - } - - /// - /// Gets a list of types within an assembly - /// This will handle situations that would normally throw an exception - such as a type within the assembly that depends on some other non-existant reference - /// - /// The assembly. - /// IEnumerable{Type}. - /// assembly - public static IEnumerable GetTypes(Assembly assembly) - { - if (assembly == null) - { - throw new ArgumentNullException("assembly"); - } - - try - { - return assembly.GetTypes(); - } - catch (ReflectionTypeLoadException ex) - { - // If it fails we can still get a list of the Types it was able to resolve - return ex.Types.Where(t => t != null); - } - } - } -} diff --git a/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs b/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs index f83b31322c..359cf9da06 100644 --- a/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs +++ b/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs @@ -1,11 +1,9 @@ -using MediaBrowser.Common.Mef; -using ProtoBuf; +using ProtoBuf; using ProtoBuf.Meta; using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Reflection; namespace MediaBrowser.Common.Serialization { @@ -135,21 +133,20 @@ namespace MediaBrowser.Common.Serialization /// /// Creates the specified assemblies. /// - /// The assemblies. /// DynamicProtobufSerializer. /// assemblies - public static DynamicProtobufSerializer Create(IEnumerable assemblies) + public static DynamicProtobufSerializer Create(IEnumerable types) { - if (assemblies == null) + if (types == null) { - throw new ArgumentNullException("assemblies"); + throw new ArgumentNullException("types"); } var model = TypeModel.Create(); var attributeType = typeof(ProtoContractAttribute); // Find all ProtoContracts in the current assembly - foreach (var type in assemblies.SelectMany(a => MefUtils.GetTypes(a).Where(t => Attribute.IsDefined(t, attributeType)))) + foreach (var type in types.Where(t => Attribute.IsDefined(t, attributeType))) { model.Add(type, true); } diff --git a/MediaBrowser.Common/packages.config b/MediaBrowser.Common/packages.config index 536640094c..96fdb618b8 100644 --- a/MediaBrowser.Common/packages.config +++ b/MediaBrowser.Common/packages.config @@ -13,4 +13,5 @@ + \ No newline at end of file diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index 952160b2b7..ea868ec454 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -1,5 +1,6 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Localization; using MediaBrowser.Common.Plugins; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; @@ -27,6 +28,7 @@ using System.ComponentModel.Composition.Hosting; using System.Linq; using System.Threading; using System.Threading.Tasks; +using SimpleInjector; namespace MediaBrowser.Controller { @@ -178,25 +180,29 @@ namespace MediaBrowser.Controller get { return KernelContext.Server; } } + /// + /// Gets the list of Localized string files + /// + /// The string files. + [ImportMany(typeof(LocalizedStringData))] + public IEnumerable StringFiles { get; private set; } + /// /// Gets the list of plugin configuration pages /// /// The configuration pages. - [ImportMany(typeof(IPluginConfigurationPage))] public IEnumerable PluginConfigurationPages { get; private set; } /// /// Gets the intro providers. /// /// The intro providers. - [ImportMany(typeof(IIntroProvider))] public IEnumerable IntroProviders { get; private set; } /// /// Gets the list of currently registered weather prvoiders /// /// The weather providers. - [ImportMany(typeof(IWeatherProvider))] public IEnumerable WeatherProviders { get; private set; } /// @@ -232,7 +238,6 @@ namespace MediaBrowser.Controller /// Gets the list of available user repositories /// /// The user repositories. - [ImportMany(typeof(IUserRepository))] private IEnumerable UserRepositories { get; set; } /// @@ -251,7 +256,6 @@ namespace MediaBrowser.Controller /// Gets the list of available item repositories /// /// The item repositories. - [ImportMany(typeof(IItemRepository))] private IEnumerable ItemRepositories { get; set; } /// @@ -264,22 +268,19 @@ namespace MediaBrowser.Controller /// Gets the list of available item repositories /// /// The user data repositories. - [ImportMany(typeof(IUserDataRepository))] private IEnumerable UserDataRepositories { get; set; } /// /// Gets the list of available DisplayPreferencesRepositories /// /// The display preferences repositories. - [ImportMany(typeof(IDisplayPreferencesRepository))] private IEnumerable DisplayPreferencesRepositories { get; set; } /// /// Gets the list of entity resolution ignore rules /// /// The entity resolution ignore rules. - [ImportMany(typeof(BaseResolutionIgnoreRule))] - internal IEnumerable EntityResolutionIgnoreRules { get; private set; } + internal IEnumerable EntityResolutionIgnoreRules { get; private set; } /// /// Gets the active user data repository @@ -357,12 +358,35 @@ namespace MediaBrowser.Controller /// Composes the exported values. /// /// The container. - protected override void ComposeExportedValues(CompositionContainer container) + /// The _ioc container. + protected override void ComposeExportedValues(CompositionContainer container, Container iocContainer) { - base.ComposeExportedValues(container); + base.ComposeExportedValues(container, iocContainer); container.ComposeExportedValue("kernel", this); container.ComposeExportedValue("blurayExaminer", BlurayExaminer); + + iocContainer.RegisterSingle(this); + iocContainer.RegisterSingle(BlurayExaminer); + } + + /// + /// Composes the parts with ioc container. + /// + /// All types. + /// The container. + protected override void ComposePartsWithIocContainer(Type[] allTypes, Container container) + { + base.ComposePartsWithIocContainer(allTypes, container); + + EntityResolutionIgnoreRules = GetExports(allTypes); + UserDataRepositories = GetExports(allTypes); + UserRepositories = GetExports(allTypes); + DisplayPreferencesRepositories = GetExports(allTypes); + ItemRepositories = GetExports(allTypes); + WeatherProviders = GetExports(allTypes); + IntroProviders = GetExports(allTypes); + PluginConfigurationPages = GetExports(allTypes); } /// diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 3978e6e397..f962427cdd 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -63,6 +63,10 @@ False ..\packages\protobuf-net.2.0.0.621\lib\net40\protobuf-net.dll + + False + ..\packages\SimpleInjector.2.0.0-beta5\lib\net40-client\SimpleInjector.dll + @@ -165,7 +169,7 @@ - + diff --git a/MediaBrowser.Controller/Resolvers/BaseResolutionIgnoreRule.cs b/MediaBrowser.Controller/Resolvers/BaseResolutionIgnoreRule.cs deleted file mode 100644 index 45effc4da1..0000000000 --- a/MediaBrowser.Controller/Resolvers/BaseResolutionIgnoreRule.cs +++ /dev/null @@ -1,12 +0,0 @@ -using MediaBrowser.Controller.Library; - -namespace MediaBrowser.Controller.Resolvers -{ - /// - /// Provides a base "rule" that anyone can use to have paths ignored by the resolver - /// - public abstract class BaseResolutionIgnoreRule - { - public abstract bool ShouldIgnore(ItemResolveArgs args); - } -} diff --git a/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs b/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs index 2d69f8deff..d237f68f32 100644 --- a/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs +++ b/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs @@ -9,8 +9,8 @@ namespace MediaBrowser.Controller.Resolvers /// /// Provides the core resolver ignore rules /// - [Export(typeof(BaseResolutionIgnoreRule))] - public class CoreResolutionIgnoreRule : BaseResolutionIgnoreRule + [Export(typeof(IResolutionIgnoreRule))] + public class CoreResolutionIgnoreRule : IResolutionIgnoreRule { /// /// Any folder named in this list will be ignored - can be added to at runtime for extensibility @@ -27,7 +27,7 @@ namespace MediaBrowser.Controller.Resolvers "extrafanart" }; - public override bool ShouldIgnore(ItemResolveArgs args) + public bool ShouldIgnore(ItemResolveArgs args) { // Ignore hidden files and folders if (args.IsHidden) diff --git a/MediaBrowser.Controller/Resolvers/IResolutionIgnoreRule.cs b/MediaBrowser.Controller/Resolvers/IResolutionIgnoreRule.cs new file mode 100644 index 0000000000..661688f3c7 --- /dev/null +++ b/MediaBrowser.Controller/Resolvers/IResolutionIgnoreRule.cs @@ -0,0 +1,12 @@ +using MediaBrowser.Controller.Library; + +namespace MediaBrowser.Controller.Resolvers +{ + /// + /// Provides a base "rule" that anyone can use to have paths ignored by the resolver + /// + public interface IResolutionIgnoreRule + { + bool ShouldIgnore(ItemResolveArgs args); + } +} diff --git a/MediaBrowser.Controller/packages.config b/MediaBrowser.Controller/packages.config index e3e4367b73..6fd19eed96 100644 --- a/MediaBrowser.Controller/packages.config +++ b/MediaBrowser.Controller/packages.config @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj b/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj index f4fb64ea57..22e552f8ae 100644 --- a/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj +++ b/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj @@ -36,7 +36,6 @@ - ..\packages\System.Data.SQLite.1.0.84.0\lib\net45\System.Data.SQLite.dll diff --git a/MediaBrowser.Server.Sqlite/SQLiteDisplayPreferencesRepository.cs b/MediaBrowser.Server.Sqlite/SQLiteDisplayPreferencesRepository.cs index 4ef4cf0862..80d389c941 100644 --- a/MediaBrowser.Server.Sqlite/SQLiteDisplayPreferencesRepository.cs +++ b/MediaBrowser.Server.Sqlite/SQLiteDisplayPreferencesRepository.cs @@ -5,7 +5,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Data; using System.IO; using System.Threading; @@ -16,7 +15,6 @@ namespace MediaBrowser.Server.Sqlite /// /// Class SQLiteDisplayPreferencesRepository /// - [Export(typeof(IDisplayPreferencesRepository))] class SQLiteDisplayPreferencesRepository : SqliteRepository, IDisplayPreferencesRepository { /// @@ -40,8 +38,7 @@ namespace MediaBrowser.Server.Sqlite /// Initializes a new instance of the class. /// /// The logger. - [ImportingConstructor] - protected SQLiteDisplayPreferencesRepository([Import("logger")] ILogger logger) + public SQLiteDisplayPreferencesRepository(ILogger logger) : base(logger) { } diff --git a/MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs b/MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs index d00bd63ce5..58a924bc4b 100644 --- a/MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs +++ b/MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs @@ -5,7 +5,6 @@ using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Data; using System.IO; using System.Threading; @@ -16,7 +15,6 @@ namespace MediaBrowser.Server.Sqlite /// /// Class SQLiteItemRepository /// - [Export(typeof(IItemRepository))] public class SQLiteItemRepository : SqliteRepository, IItemRepository { /// @@ -45,8 +43,7 @@ namespace MediaBrowser.Server.Sqlite /// Initializes a new instance of the class. /// /// The logger. - [ImportingConstructor] - protected SQLiteItemRepository([Import("logger")] ILogger logger) + public SQLiteItemRepository(ILogger logger) : base(logger) { } diff --git a/MediaBrowser.Server.Sqlite/SQLiteUserDataRepository.cs b/MediaBrowser.Server.Sqlite/SQLiteUserDataRepository.cs index 732ebc06c0..eaa89508a5 100644 --- a/MediaBrowser.Server.Sqlite/SQLiteUserDataRepository.cs +++ b/MediaBrowser.Server.Sqlite/SQLiteUserDataRepository.cs @@ -4,7 +4,6 @@ using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Data; using System.IO; using System.Threading; @@ -15,7 +14,6 @@ namespace MediaBrowser.Server.Sqlite /// /// Class SQLiteUserDataRepository /// - [Export(typeof(IUserDataRepository))] public class SQLiteUserDataRepository : SqliteRepository, IUserDataRepository { /// @@ -39,8 +37,7 @@ namespace MediaBrowser.Server.Sqlite /// Initializes a new instance of the class. /// /// The logger. - [ImportingConstructor] - protected SQLiteUserDataRepository([Import("logger")] ILogger logger) + public SQLiteUserDataRepository(ILogger logger) : base(logger) { } diff --git a/MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs b/MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs index 8788a488fd..6c0de21615 100644 --- a/MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs +++ b/MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs @@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Persistence; using System; using System.Collections.Generic; -using System.ComponentModel.Composition; using System.Data; using System.IO; using System.Threading; @@ -16,7 +15,6 @@ namespace MediaBrowser.Server.Sqlite /// /// Class SQLiteUserRepository /// - [Export(typeof(IUserRepository))] public class SQLiteUserRepository : SqliteRepository, IUserRepository { /// @@ -40,8 +38,7 @@ namespace MediaBrowser.Server.Sqlite /// Initializes a new instance of the class. /// /// The logger. - [ImportingConstructor] - protected SQLiteUserRepository([Import("logger")] ILogger logger) + public SQLiteUserRepository(ILogger logger) : base(logger) { } -- cgit v1.2.3 From 881bf8b9cbccb1c669489b7470906c314893d760 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Fri, 22 Feb 2013 19:27:56 -0500 Subject: add CorePlugins to ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d673b0d967..b68cb2bdf3 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ local.properties ## Media Browser ################# ProgramData*/ +CorePlugins*/ ProgramData-Server*/ ProgramData-UI*/ -- cgit v1.2.3 From 6a5bf9cc780c6cd878be4c5111d64226208f0597 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Fri, 22 Feb 2013 19:44:20 -0500 Subject: extracted more interfaces --- MediaBrowser.Common/Kernel/BaseKernel.cs | 21 ++++- MediaBrowser.Common/Kernel/IWebSocketListener.cs | 3 +- MediaBrowser.Controller/Drawing/ImageManager.cs | 4 +- MediaBrowser.Controller/Kernel.cs | 4 +- .../MediaBrowser.Controller.csproj | 2 +- .../Providers/BaseImageEnhancer.cs | 99 ---------------------- .../Providers/IImageEnhancer.cs | 55 ++++++++++++ 7 files changed, 80 insertions(+), 108 deletions(-) delete mode 100644 MediaBrowser.Controller/Providers/BaseImageEnhancer.cs create mode 100644 MediaBrowser.Controller/Providers/IImageEnhancer.cs diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 91965e4690..202bd3cab6 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -197,7 +197,6 @@ namespace MediaBrowser.Common.Kernel /// Gets the web socket listeners. /// /// The web socket listeners. - [ImportMany(typeof(IWebSocketListener))] public IEnumerable WebSocketListeners { get; private set; } /// @@ -236,6 +235,11 @@ namespace MediaBrowser.Common.Kernel /// The rest services. public IEnumerable RestServices { get; private set; } + /// + /// The disposable parts + /// + private readonly List _disposableParts = new List(); + /// /// The _protobuf serializer initialized /// @@ -497,6 +501,7 @@ namespace MediaBrowser.Common.Kernel protected virtual void ComposePartsWithIocContainer(Type[] allTypes, Container container) { RestServices = GetExports(allTypes); + WebSocketListeners = GetExports(allTypes); } /// @@ -511,7 +516,11 @@ namespace MediaBrowser.Common.Kernel Logger.Info("Composing instances of " + currentType.Name); - return allTypes.Where(currentType.IsAssignableFrom).Select(Instantiate).Cast().ToArray(); + var parts = allTypes.Where(currentType.IsAssignableFrom).Select(Instantiate).Cast().ToArray(); + + _disposableParts.AddRange(parts.OfType()); + + return parts; } /// @@ -528,6 +537,7 @@ namespace MediaBrowser.Common.Kernel /// Composes the exported values. /// /// The container. + /// protected virtual void ComposeExportedValues(CompositionContainer container, Container iocContainer) { container.ComposeExportedValue("logger", Logger); @@ -733,6 +743,13 @@ namespace MediaBrowser.Common.Kernel DisposeHttpManager(); DisposeComposableParts(); + + foreach (var part in _disposableParts) + { + part.Dispose(); + } + + _disposableParts.Clear(); } } diff --git a/MediaBrowser.Common/Kernel/IWebSocketListener.cs b/MediaBrowser.Common/Kernel/IWebSocketListener.cs index 00be28ed34..b04bb68851 100644 --- a/MediaBrowser.Common/Kernel/IWebSocketListener.cs +++ b/MediaBrowser.Common/Kernel/IWebSocketListener.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Net; -using System; using System.Threading.Tasks; namespace MediaBrowser.Common.Kernel @@ -7,7 +6,7 @@ namespace MediaBrowser.Common.Kernel /// ///This is an interface for listening to messages coming through a web socket connection /// - public interface IWebSocketListener : IDisposable + public interface IWebSocketListener { /// /// Processes the message. diff --git a/MediaBrowser.Controller/Drawing/ImageManager.cs b/MediaBrowser.Controller/Drawing/ImageManager.cs index 16fd4a5b80..a0ba9d550a 100644 --- a/MediaBrowser.Controller/Drawing/ImageManager.cs +++ b/MediaBrowser.Controller/Drawing/ImageManager.cs @@ -541,7 +541,7 @@ namespace MediaBrowser.Controller.Drawing /// Type of the image. /// Guid. /// item - public Guid GetImageCacheTag(string originalImagePath, DateTime dateModified, IEnumerable imageEnhancers, BaseItem item, ImageType imageType) + public Guid GetImageCacheTag(string originalImagePath, DateTime dateModified, IEnumerable imageEnhancers, BaseItem item, ImageType imageType) { if (item == null) { @@ -574,7 +574,7 @@ namespace MediaBrowser.Controller.Drawing /// Type of the image. /// Index of the image. /// Task{EnhancedImage}. - private async Task ExecuteImageEnhancers(IEnumerable imageEnhancers, Image originalImage, BaseItem item, ImageType imageType, int imageIndex) + private async Task ExecuteImageEnhancers(IEnumerable imageEnhancers, Image originalImage, BaseItem item, ImageType imageType, int imageIndex) { var result = originalImage; diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index ea868ec454..25a0494354 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -217,8 +217,7 @@ namespace MediaBrowser.Controller /// Image processors are specialized metadata providers that run after the normal ones /// /// The image enhancers. - [ImportMany(typeof(BaseImageEnhancer))] - public BaseImageEnhancer[] ImageEnhancers { get; private set; } + public IEnumerable ImageEnhancers { get; private set; } /// /// Gets the list of currently registered entity resolvers @@ -387,6 +386,7 @@ namespace MediaBrowser.Controller WeatherProviders = GetExports(allTypes); IntroProviders = GetExports(allTypes); PluginConfigurationPages = GetExports(allTypes); + ImageEnhancers = GetExports(allTypes); } /// diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index b1a1dc567d..26107b9c9e 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -138,7 +138,7 @@ - + diff --git a/MediaBrowser.Controller/Providers/BaseImageEnhancer.cs b/MediaBrowser.Controller/Providers/BaseImageEnhancer.cs deleted file mode 100644 index aeceeaf5fc..0000000000 --- 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 -{ - /// - /// Class BaseImageEnhancer - /// - public abstract class BaseImageEnhancer : IDisposable - { - /// - /// Return true only if the given image for the given item will be enhanced by this enhancer. - /// - /// The item. - /// Type of the image. - /// true if this enhancer will enhance the supplied image for the supplied item, false otherwise - public abstract bool Supports(BaseItem item, ImageType imageType); - - /// - /// Gets the priority or order in which this enhancer should be run. - /// - /// The priority. - public abstract MetadataProviderPriority Priority { get; } - - /// - /// Return the date of the last configuration change affecting the provided baseitem and image type - /// - /// The item. - /// Type of the image. - /// Date of last config change - public virtual DateTime LastConfigurationChange(BaseItem item, ImageType imageType) - { - return DateTime.MinValue; - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Releases unmanaged and - optionally - managed resources. - /// - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - protected virtual void Dispose(bool dispose) - { - } - - /// - /// Gets the size of the enhanced image. - /// - /// The item. - /// Type of the image. - /// Index of the image. - /// Size of the original image. - /// ImageSize. - public virtual ImageSize GetEnhancedImageSize(BaseItem item, ImageType imageType, int imageIndex, ImageSize originalImageSize) - { - return originalImageSize; - } - - /// - /// Enhances the supplied image and returns it - /// - /// The item. - /// The original image. - /// Type of the image. - /// Index of the image. - /// Task{System.Drawing.Image}. - protected abstract Task EnhanceImageAsyncInternal(BaseItem item, Image originalImage, ImageType imageType, int imageIndex); - - /// - /// Enhances the image async. - /// - /// The item. - /// The original image. - /// Type of the image. - /// Index of the image. - /// Task{Image}. - /// - public Task 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/IImageEnhancer.cs b/MediaBrowser.Controller/Providers/IImageEnhancer.cs new file mode 100644 index 0000000000..24296b6641 --- /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 + { + /// + /// Return true only if the given image for the given item will be enhanced by this enhancer. + /// + /// The item. + /// Type of the image. + /// true if this enhancer will enhance the supplied image for the supplied item, false otherwise + bool Supports(BaseItem item, ImageType imageType); + + /// + /// Gets the priority or order in which this enhancer should be run. + /// + /// The priority. + MetadataProviderPriority Priority { get; } + + /// + /// Return the date of the last configuration change affecting the provided baseitem and image type + /// + /// The item. + /// Type of the image. + /// Date of last config change + DateTime LastConfigurationChange(BaseItem item, ImageType imageType); + + /// + /// Gets the size of the enhanced image. + /// + /// The item. + /// Type of the image. + /// Index of the image. + /// Size of the original image. + /// ImageSize. + ImageSize GetEnhancedImageSize(BaseItem item, ImageType imageType, int imageIndex, ImageSize originalImageSize); + + /// + /// Enhances the image async. + /// + /// The item. + /// The original image. + /// Type of the image. + /// Index of the image. + /// Task{Image}. + /// + Task EnhanceImageAsync(BaseItem item, Image originalImage, ImageType imageType, int imageIndex); + } +} \ No newline at end of file -- cgit v1.2.3 From 57cb08085d61682719c6c2804c37aa6aae6fd470 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Fri, 22 Feb 2013 20:24:04 -0500 Subject: fix broken images --- MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs | 15 +++++++++++++++ MediaBrowser.Controller/Kernel.cs | 4 ++-- MediaBrowser.Controller/Library/LibraryManager.cs | 4 ++-- MediaBrowser.Controller/MediaBrowser.Controller.csproj | 1 + .../MediaBrowser.WebDashboard.csproj | 6 +++--- 5 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs diff --git a/MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs b/MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs new file mode 100644 index 0000000000..57e9e8d5d9 --- /dev/null +++ b/MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs @@ -0,0 +1,15 @@ + +namespace MediaBrowser.Controller.Entities +{ + /// + /// Interface IVirtualFolderCreator + /// + public interface IVirtualFolderCreator + { + /// + /// Gets the folder. + /// + /// Folder. + BasePluginFolder GetFolder(); + } +} diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index 25a0494354..6bd48a5020 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -230,8 +230,7 @@ namespace MediaBrowser.Controller /// Gets the list of BasePluginFolders added by plugins /// /// The plugin folders. - [ImportMany(typeof(BasePluginFolder))] - internal IEnumerable PluginFolders { get; private set; } + internal IEnumerable PluginFolderCreators { get; private set; } /// /// Gets the list of available user repositories @@ -387,6 +386,7 @@ namespace MediaBrowser.Controller IntroProviders = GetExports(allTypes); PluginConfigurationPages = GetExports(allTypes); ImageEnhancers = GetExports(allTypes); + PluginFolderCreators = GetExports(allTypes); } /// diff --git a/MediaBrowser.Controller/Library/LibraryManager.cs b/MediaBrowser.Controller/Library/LibraryManager.cs index 4087f9ef86..dfaef12cbf 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/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 26107b9c9e..cfd14f2b71 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -95,6 +95,7 @@ + diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 91ca577a71..85efe04f18 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -389,9 +389,9 @@ - - - + + + -- cgit v1.2.3 From c165f37bb96ad40d863a436795c21b9085f3fde9 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Fri, 22 Feb 2013 22:49:00 -0500 Subject: more dependancy injection. still just beginning --- MediaBrowser.Common/Kernel/BaseKernel.cs | 52 +++---------- MediaBrowser.Common/Kernel/IApplicationHost.cs | 21 +++++ MediaBrowser.Common/MediaBrowser.Common.csproj | 3 - MediaBrowser.Common/packages.config | 1 - MediaBrowser.Controller/Kernel.cs | 75 +++++------------- .../MediaBrowser.Controller.csproj | 4 - MediaBrowser.Controller/MediaInfo/FFMpegManager.cs | 90 +--------------------- .../MediaInfo/FFMpegVideoImageProvider.cs | 19 ++++- .../MediaInfo/FFProbeVideoInfoProvider.cs | 15 +++- MediaBrowser.Controller/packages.config | 1 - MediaBrowser.ServerApplication/App.xaml.cs | 67 +++++++++++++++- .../MediaBrowser.ServerApplication.csproj | 4 + MediaBrowser.ServerApplication/packages.config | 1 + 13 files changed, 147 insertions(+), 206 deletions(-) diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 202bd3cab6..85954cb82c 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -18,7 +18,6 @@ using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; -using SimpleInjector; namespace MediaBrowser.Common.Kernel { @@ -223,12 +222,6 @@ namespace MediaBrowser.Common.Kernel /// The task manager. public TaskManager TaskManager { get; private set; } - /// - /// Gets the iso manager. - /// - /// The iso manager. - public IIsoManager IsoManager { get; private set; } - /// /// Gets the rest services. /// @@ -347,20 +340,14 @@ namespace MediaBrowser.Common.Kernel /// Initializes a new instance of the class. /// /// The app host. - /// The iso manager. /// The logger. /// isoManager - protected BaseKernel(IApplicationHost appHost, IIsoManager isoManager, ILogger logger) + protected BaseKernel(IApplicationHost appHost, ILogger logger) { if (appHost == null) { throw new ArgumentNullException("appHost"); } - - if (isoManager == null) - { - throw new ArgumentNullException("isoManager"); - } if (logger == null) { @@ -368,7 +355,6 @@ namespace MediaBrowser.Common.Kernel } ApplicationHost = appHost; - IsoManager = isoManager; Logger = logger; } @@ -471,11 +457,6 @@ namespace MediaBrowser.Common.Kernel CompositionContainer.Catalog.Dispose(); } - /// - /// The ioc container - /// - private readonly Container _iocContainer = new Container(); - /// /// Composes the parts. /// @@ -486,19 +467,18 @@ namespace MediaBrowser.Common.Kernel CompositionContainer = GetSafeCompositionContainer(concreteTypes.Select(i => new TypeCatalog(i))); - ComposeExportedValues(CompositionContainer, _iocContainer); + RegisterExportedValues(CompositionContainer); CompositionContainer.ComposeParts(this); - ComposePartsWithIocContainer(concreteTypes, _iocContainer); + FindParts(concreteTypes); } /// /// Composes the parts with ioc container. /// /// All types. - /// The container. - protected virtual void ComposePartsWithIocContainer(Type[] allTypes, Container container) + protected virtual void FindParts(Type[] allTypes) { RestServices = GetExports(allTypes); WebSocketListeners = GetExports(allTypes); @@ -530,21 +510,20 @@ namespace MediaBrowser.Common.Kernel /// System.Object. private object Instantiate(Type type) { - return _iocContainer.GetInstance(type); + return ApplicationHost.CreateInstance(type); } /// /// Composes the exported values. /// /// The container. - /// - protected virtual void ComposeExportedValues(CompositionContainer container, Container iocContainer) + protected virtual void RegisterExportedValues(CompositionContainer container) { + ApplicationHost.Register(this); + container.ComposeExportedValue("logger", Logger); container.ComposeExportedValue("appHost", ApplicationHost); - - iocContainer.RegisterSingle(Logger); - iocContainer.RegisterSingle(ApplicationHost); + container.ComposeExportedValue("isoManager", ApplicationHost.Resolve()); } /// @@ -739,7 +718,6 @@ namespace MediaBrowser.Common.Kernel { DisposeTcpManager(); DisposeTaskManager(); - DisposeIsoManager(); DisposeHttpManager(); DisposeComposableParts(); @@ -753,18 +731,6 @@ namespace MediaBrowser.Common.Kernel } } - /// - /// Disposes the iso manager. - /// - private void DisposeIsoManager() - { - if (IsoManager != null) - { - IsoManager.Dispose(); - IsoManager = null; - } - } - /// /// Disposes the TCP manager. /// diff --git a/MediaBrowser.Common/Kernel/IApplicationHost.cs b/MediaBrowser.Common/Kernel/IApplicationHost.cs index 63c63eb3d7..d2b1ab7a24 100644 --- a/MediaBrowser.Common/Kernel/IApplicationHost.cs +++ b/MediaBrowser.Common/Kernel/IApplicationHost.cs @@ -43,5 +43,26 @@ namespace MediaBrowser.Common.Kernel /// /// Task. Task UpdateApplication(CancellationToken cancellationToken, IProgress progress); + + /// + /// Creates an instance of type and resolves all constructor dependancies + /// + /// The type. + /// System.Object. + object CreateInstance(Type type); + + /// + /// Registers a service that other classes can use as a dependancy. + /// + /// + /// The obj. + void Register(T obj) where T : class; + + /// + /// Resolves this instance. + /// + /// + /// ``0. + T Resolve() where T : class; } } diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index ea388e33b8..cae26b3dfc 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -88,9 +88,6 @@ False ..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll - - ..\packages\SimpleInjector.2.0.0-beta5\lib\net40-client\SimpleInjector.dll - diff --git a/MediaBrowser.Common/packages.config b/MediaBrowser.Common/packages.config index 96fdb618b8..536640094c 100644 --- a/MediaBrowser.Common/packages.config +++ b/MediaBrowser.Common/packages.config @@ -13,5 +13,4 @@ - \ No newline at end of file diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index 6bd48a5020..ebf3e724dd 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -28,7 +28,6 @@ using System.ComponentModel.Composition.Hosting; using System.Linq; using System.Threading; using System.Threading.Tasks; -using SimpleInjector; namespace MediaBrowser.Controller { @@ -301,48 +300,16 @@ namespace MediaBrowser.Controller get { return 7359; } } - /// - /// Gets or sets the zip client. - /// - /// The zip client. - private IZipClient ZipClient { get; set; } - - /// - /// Gets or sets the bluray examiner. - /// - /// The bluray examiner. - private IBlurayExaminer BlurayExaminer { get; set; } - /// /// Creates a kernel based on a Data path, which is akin to our current programdata path /// /// The app host. - /// The iso manager. - /// The zip client. - /// The bluray examiner. /// The logger. /// isoManager - 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,26 +323,22 @@ namespace MediaBrowser.Controller /// Composes the exported values. /// /// The container. - /// The _ioc container. - protected override void ComposeExportedValues(CompositionContainer container, Container iocContainer) + protected override void RegisterExportedValues(CompositionContainer container) { - base.ComposeExportedValues(container, iocContainer); - container.ComposeExportedValue("kernel", this); - container.ComposeExportedValue("blurayExaminer", BlurayExaminer); - iocContainer.RegisterSingle(this); - iocContainer.RegisterSingle(BlurayExaminer); + ApplicationHost.Register(this); + + base.RegisterExportedValues(container); } /// /// Composes the parts with ioc container. /// /// All types. - /// The container. - protected override void ComposePartsWithIocContainer(Type[] allTypes, Container container) + protected override void FindParts(Type[] allTypes) { - base.ComposePartsWithIocContainer(allTypes, container); + base.FindParts(allTypes); EntityResolutionIgnoreRules = GetExports(allTypes); UserDataRepositories = GetExports(allTypes); @@ -395,24 +358,22 @@ namespace MediaBrowser.Controller /// Task. 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(); + 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)); + ReloadFileSystemManager(); await UserManager.RefreshUsersMetadata(CancellationToken.None).ConfigureAwait(false); diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index cfd14f2b71..f9765d8523 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -63,10 +63,6 @@ False ..\packages\protobuf-net.2.0.0.621\lib\net40\protobuf-net.dll - - False - ..\packages\SimpleInjector.2.0.0-beta5\lib\net40-client\SimpleInjector.dll - diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs index 9bc1ebaa58..7ef70ea420 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 { @@ -26,22 +25,6 @@ namespace MediaBrowser.Controller.MediaInfo /// public class FFMpegManager : BaseManager { - /// - /// Holds the list of new items to generate chapter image for when the NewItemTimer expires - /// - private readonly List