From 0a3381471ddadd7769526c5f40915e7da8ea965d Mon Sep 17 00:00:00 2001 From: Thomas Gillen Date: Tue, 6 May 2014 03:00:16 +0100 Subject: Updating tvdb providers to use item identities --- MediaBrowser.Controller/Entities/BaseItem.cs | 4 ++ MediaBrowser.Controller/Entities/IHasMetadata.cs | 6 ++ .../MediaBrowser.Controller.csproj | 1 + .../Providers/IProviderManager.cs | 7 ++ .../Providers/ItemIdentifier.cs | 73 +++++++++++++++++++++ .../Providers/ItemLookupInfo.cs | 76 ++++++++++++++++++++-- 6 files changed, 163 insertions(+), 4 deletions(-) create mode 100644 MediaBrowser.Controller/Providers/ItemIdentifier.cs (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index b8ea1bec42..7ba2547c1a 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -32,6 +32,7 @@ namespace MediaBrowser.Controller.Entities ProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase); LockedFields = new List(); ImageInfos = new List(); + Identities = new List(); } /// @@ -244,6 +245,9 @@ namespace MediaBrowser.Controller.Entities public bool IsUnidentified { get; set; } + [IgnoreDataMember] + public List Identities { get; set; } + /// /// Gets or sets the locked fields. /// diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs index 91f37135f1..4e90fb1558 100644 --- a/MediaBrowser.Controller/Entities/IHasMetadata.cs +++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; @@ -55,5 +56,10 @@ namespace MediaBrowser.Controller.Entities /// /// true if this instance is unidentified; otherwise, false. bool IsUnidentified { get; set; } + + /// + /// Gets the item identities. + /// + List Identities { get; set; } } } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 6d09fe163d..de112c3051 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -194,6 +194,7 @@ + diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 242a16ee9c..883fa12b41 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -138,5 +138,12 @@ namespace MediaBrowser.Controller.Providers /// The cancellation token. /// Task{HttpResponseInfo}. Task GetSearchImage(string providerName, string url, CancellationToken cancellationToken); + + IEnumerable> GetItemIdentityProviders() + where TLookupInfo : ItemLookupInfo + where TIdentity : IItemIdentity; + + IEnumerable> GetItemIdentityConverters() + where TIdentity : IItemIdentity; } } \ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ItemIdentifier.cs b/MediaBrowser.Controller/Providers/ItemIdentifier.cs new file mode 100644 index 0000000000..37a8489c6a --- /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 + where TLookupInfo : ItemLookupInfo + where TIdentity : IItemIdentity + { + public async Task> FindIdentities(TLookupInfo item, IProviderManager providerManager, CancellationToken cancellationToken) + { + var providers = providerManager.GetItemIdentityProviders(); + var converters = providerManager.GetItemIdentityConverters(); + + var identities = new List(); + + 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>(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.Select(id => id.Identity); + } + + private class IdentityPair + { + public TIdentity Identity; + public int Order; + } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ItemLookupInfo.cs b/MediaBrowser.Controller/Providers/ItemLookupInfo.cs index 65ee945564..20bc572b41 100644 --- a/MediaBrowser.Controller/Providers/ItemLookupInfo.cs +++ b/MediaBrowser.Controller/Providers/ItemLookupInfo.cs @@ -1,4 +1,7 @@ -using MediaBrowser.Model.Entities; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; @@ -96,8 +99,10 @@ namespace MediaBrowser.Controller.Providers public string Path { get; set; } } - public class EpisodeInfo : ItemLookupInfo + public class EpisodeInfo : ItemLookupInfo, IHasIdentities { + private List _identities = new List(); + public Dictionary SeriesProviderIds { get; set; } public int? IndexNumberEnd { get; set; } @@ -107,6 +112,27 @@ namespace MediaBrowser.Controller.Providers { SeriesProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase); } + + public IEnumerable Identities + { + get { return _identities; } + } + + public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) + { + var identifier = new ItemIdentifier(); + _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); + } + } + + public class EpisodeIdentity : IItemIdentity + { + public string Type { get; set; } + + public string SeriesId { get; set; } + public int? SeasonIndex { get; set; } + public int IndexNumber { get; set; } + public int? IndexNumberEnd { get; set; } } public class SongInfo : ItemLookupInfo @@ -116,9 +142,29 @@ namespace MediaBrowser.Controller.Providers public List Artists { get; set; } } - public class SeriesInfo : ItemLookupInfo + public class SeriesInfo : ItemLookupInfo, IHasIdentities { + private List _identities = new List(); + public int? AnimeSeriesIndex { get; set; } + + public IEnumerable Identities + { + get { return _identities; } + } + + public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) + { + var identifier = new ItemIdentifier(); + _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); + } + } + + public class SeriesIdentity : IItemIdentity + { + public string Type { get; set; } + + public string Id { get; set; } } public class PersonLookupInfo : ItemLookupInfo @@ -151,8 +197,10 @@ namespace MediaBrowser.Controller.Providers public string SeriesName { get; set; } } - public class SeasonInfo : ItemLookupInfo + public class SeasonInfo : ItemLookupInfo, IHasIdentities { + private List _identities = new List(); + public Dictionary SeriesProviderIds { get; set; } public int? AnimeSeriesIndex { get; set; } @@ -160,5 +208,25 @@ namespace MediaBrowser.Controller.Providers { SeriesProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase); } + + public IEnumerable Identities + { + get { return _identities; } + } + + public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) + { + var identifier = new ItemIdentifier(); + _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); + } + } + + public class SeasonIdentity : IItemIdentity + { + public string Type { get; set; } + + public string SeriesId { get; set; } + + public int SeasonIndex { get; set; } } } -- cgit v1.2.3