From 8f024e81996b14a9e6a440a601d0f6c0694f7ab8 Mon Sep 17 00:00:00 2001 From: LukePulverenti Luke Pulverenti luke pulverenti Date: Mon, 20 Aug 2012 11:55:05 -0400 Subject: Fully async'd xml parsing process as well as added resolver and provider priorities --- MediaBrowser.Controller/Kernel.cs | 74 +++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 41 deletions(-) (limited to 'MediaBrowser.Controller/Kernel.cs') diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs index da0263f6f..9e31a5d6c 100644 --- a/MediaBrowser.Controller/Kernel.cs +++ b/MediaBrowser.Controller/Kernel.cs @@ -86,42 +86,10 @@ namespace MediaBrowser.Controller protected override void OnComposablePartsLoaded() { - AddCoreResolvers(); - AddCoreProviders(); - // The base class will start up all the plugins base.OnComposablePartsLoaded(); - } - - private void AddCoreResolvers() - { - List list = EntityResolvers.ToList(); - - // Add the core resolvers - list.AddRange(new IBaseItemResolver[]{ - new AudioResolver(), - new VideoResolver(), - new VirtualFolderResolver(), - new FolderResolver() - }); - - EntityResolvers = list; - } - - private void AddCoreProviders() - { - List list = MetadataProviders.ToList(); - - // Add the core resolvers - list.InsertRange(0, new BaseMetadataProvider[]{ - new ImageFromMediaLocationProvider(), - new LocalTrailerProvider(), - new AudioInfoProvider(), - new FolderProviderFromXml() - }); - - MetadataProviders = list; - + + // Initialize the metadata providers Parallel.ForEach(MetadataProviders, provider => { provider.Init(); @@ -264,19 +232,43 @@ namespace MediaBrowser.Controller // Get all supported providers var supportedProviders = Kernel.Instance.MetadataProviders.Where(i => i.Supports(item)); - // Start with non-internet providers. Run them sequentially - foreach (BaseMetadataProvider provider in supportedProviders.Where(i => !i.RequiresInternet)) + // First priority providers + var providers = supportedProviders.Where(i => !i.RequiresInternet && i.Priority == MetadataProviderPriority.First); + + if (providers.Any()) { - await provider.Fetch(item, args); + await Task.WhenAll( + providers.Select(i => i.Fetch(item, args)) + ); + } + + // Second priority providers + providers = supportedProviders.Where(i => !i.RequiresInternet && i.Priority == MetadataProviderPriority.Second); + + if (providers.Any()) + { + await Task.WhenAll( + providers.Select(i => i.Fetch(item, args)) + ); } - var internetProviders = supportedProviders.Where(i => i.RequiresInternet); + // Lowest priority providers + providers = supportedProviders.Where(i => !i.RequiresInternet && i.Priority == MetadataProviderPriority.Last); + + if (providers.Any()) + { + await Task.WhenAll( + providers.Select(i => i.Fetch(item, args)) + ); + } + + // Execute internet providers + providers = supportedProviders.Where(i => i.RequiresInternet); - if (internetProviders.Any()) + if (providers.Any()) { - // Now execute internet providers in parallel await Task.WhenAll( - internetProviders.Select(i => i.Fetch(item, args)) + providers.Select(i => i.Fetch(item, args)) ); } } -- cgit v1.2.3