ItemIdentifier.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. namespace MediaBrowser.Controller.Providers
  6. {
  7. public class ItemIdentifier<TLookupInfo, TIdentity>
  8. where TLookupInfo : ItemLookupInfo
  9. where TIdentity : IItemIdentity
  10. {
  11. public async Task<IEnumerable<TIdentity>> FindIdentities(TLookupInfo item, IProviderManager providerManager, CancellationToken cancellationToken)
  12. {
  13. var providers = providerManager.GetItemIdentityProviders<TLookupInfo, TIdentity>();
  14. var converters = providerManager.GetItemIdentityConverters<TIdentity>();
  15. var identities = new List<IdentityPair>();
  16. foreach (var provider in providers)
  17. {
  18. var result = new IdentityPair
  19. {
  20. Identity = await provider.FindIdentity(item),
  21. Order = provider.Order
  22. };
  23. if (!Equals(result.Identity, default(TIdentity)))
  24. {
  25. identities.Add(result);
  26. }
  27. }
  28. var convertersAvailable = new List<IItemIdentityConverter<TIdentity>>(converters);
  29. bool changesMade;
  30. do
  31. {
  32. changesMade = false;
  33. for (int i = convertersAvailable.Count - 1; i >= 0; i--)
  34. {
  35. var converter = convertersAvailable[i];
  36. var input = identities.FirstOrDefault(id => id.Identity.Type == converter.SourceType);
  37. var existing = identities.Where(id => id.Identity.Type == converter.ResultType);
  38. if (input != null && !existing.Any(id => id.Order <= converter.Order))
  39. {
  40. var result = new IdentityPair
  41. {
  42. Identity = await converter.Convert(input.Identity).ConfigureAwait(false),
  43. Order = converter.Order
  44. };
  45. if (!Equals(result.Identity, default(TIdentity)))
  46. {
  47. identities.Add(result);
  48. convertersAvailable.RemoveAt(i);
  49. changesMade = true;
  50. }
  51. }
  52. }
  53. } while (changesMade);
  54. return identities.OrderBy(id => id.Order).Select(id => id.Identity);
  55. }
  56. private class IdentityPair
  57. {
  58. public TIdentity Identity;
  59. public int Order;
  60. }
  61. }
  62. }