diff options
Diffstat (limited to 'MediaBrowser.Controller/Providers/ItemIdentifier.cs')
| -rw-r--r-- | MediaBrowser.Controller/Providers/ItemIdentifier.cs | 63 |
1 files changed, 13 insertions, 50 deletions
diff --git a/MediaBrowser.Controller/Providers/ItemIdentifier.cs b/MediaBrowser.Controller/Providers/ItemIdentifier.cs index 13e4f137f..bbc6dd76c 100644 --- a/MediaBrowser.Controller/Providers/ItemIdentifier.cs +++ b/MediaBrowser.Controller/Providers/ItemIdentifier.cs @@ -1,73 +1,36 @@ -using System.Collections.Generic; -using System.Linq; +using System.Linq; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Controller.Providers { - public class ItemIdentifier<TLookupInfo, TIdentity> + public static class ItemIdentifier<TLookupInfo> where TLookupInfo : ItemLookupInfo - where TIdentity : IItemIdentity { - public async Task<IEnumerable<TIdentity>> FindIdentities(TLookupInfo item, IProviderManager providerManager, CancellationToken cancellationToken) + public static async Task FindIdentities(TLookupInfo item, IProviderManager providerManager, CancellationToken cancellationToken) { - var providers = providerManager.GetItemIdentityProviders<TLookupInfo, TIdentity>(); - var converters = providerManager.GetItemIdentityConverters<TIdentity>(); - - var identities = new List<IdentityPair>(); - + var providers = providerManager.GetItemIdentityProviders<TLookupInfo>(); + var converters = providerManager.GetItemIdentityConverters<TLookupInfo>().ToList(); + foreach (var provider in providers) { - var result = new IdentityPair - { - Identity = await provider.FindIdentity(item), - Order = provider.Order - }; - - if (!Equals(result.Identity, default(TIdentity))) - { - identities.Add(result); - } + await provider.Identify(item); } - var convertersAvailable = new List<IItemIdentityConverter<TIdentity>>(converters); - bool changesMade; + bool changesMade = true; - do + while (changesMade) { changesMade = false; - for (int i = convertersAvailable.Count - 1; i >= 0; i--) + foreach (var converter in converters) { - var converter = convertersAvailable[i]; - var input = identities.FirstOrDefault(id => id.Identity.Type == converter.SourceType); - var existing = identities.Where(id => id.Identity.Type == converter.ResultType); - - if (input != null && !existing.Any(id => id.Order <= converter.Order)) + if (await converter.Convert(item)) { - var result = new IdentityPair - { - Identity = await converter.Convert(input.Identity).ConfigureAwait(false), - Order = converter.Order - }; - - if (!Equals(result.Identity, default(TIdentity))) - { - identities.Add(result); - convertersAvailable.RemoveAt(i); - changesMade = true; - } + changesMade = true; } } - } while (changesMade); - - return identities.OrderBy(id => id.Order).Select(id => id.Identity); - } - - private class IdentityPair - { - public TIdentity Identity; - public int Order; + } } } }
\ No newline at end of file |
