aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Providers/ItemIdentifier.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller/Providers/ItemIdentifier.cs')
-rw-r--r--MediaBrowser.Controller/Providers/ItemIdentifier.cs63
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