12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading;
- using System.Threading.Tasks;
- namespace MediaBrowser.Controller.Providers
- {
- public class ItemIdentifier<TLookupInfo, TIdentity>
- where TLookupInfo : ItemLookupInfo
- where TIdentity : IItemIdentity
- {
- public async Task<IEnumerable<TIdentity>> FindIdentities(TLookupInfo item, IProviderManager providerManager, CancellationToken cancellationToken)
- {
- var providers = providerManager.GetItemIdentityProviders<TLookupInfo, TIdentity>();
- var converters = providerManager.GetItemIdentityConverters<TIdentity>();
- var identities = new List<IdentityPair>();
- 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);
- }
- }
- var convertersAvailable = new List<IItemIdentityConverter<TIdentity>>(converters);
- bool changesMade;
- do
- {
- changesMade = false;
- for (int i = convertersAvailable.Count - 1; i >= 0; i--)
- {
- 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))
- {
- 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;
- }
- }
- }
- } while (changesMade);
- return identities.OrderBy(id => id.Order).Select(id => id.Identity);
- }
- private class IdentityPair
- {
- public TIdentity Identity;
- public int Order;
- }
- }
- }
|