| 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;        }    }}
 |