diff options
Diffstat (limited to 'MediaBrowser.Controller/Providers/ItemIdentifier.cs')
| -rw-r--r-- | MediaBrowser.Controller/Providers/ItemIdentifier.cs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/MediaBrowser.Controller/Providers/ItemIdentifier.cs b/MediaBrowser.Controller/Providers/ItemIdentifier.cs new file mode 100644 index 000000000..13e4f137f --- /dev/null +++ b/MediaBrowser.Controller/Providers/ItemIdentifier.cs @@ -0,0 +1,73 @@ +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; + } + } +}
\ No newline at end of file |
