mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-18 20:24:20 +01:00
Re-designed item identity providers
This commit is contained in:
@@ -1,12 +0,0 @@
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
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; }
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public class EpisodeInfo : ItemLookupInfo, IHasIdentities<EpisodeIdentity>
|
||||
public class EpisodeInfo : ItemLookupInfo
|
||||
{
|
||||
private List<EpisodeIdentity> _identities = new List<EpisodeIdentity>();
|
||||
|
||||
public Dictionary<string, string> SeriesProviderIds { get; set; }
|
||||
|
||||
public int? IndexNumberEnd { get; set; }
|
||||
@@ -19,16 +14,5 @@ namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
public IEnumerable<EpisodeIdentity> Identities
|
||||
{
|
||||
get { return _identities; }
|
||||
}
|
||||
|
||||
public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken)
|
||||
{
|
||||
var identifier = new ItemIdentifier<EpisodeInfo, EpisodeIdentity>();
|
||||
_identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public interface IHasIdentities<out TIdentity>
|
||||
where TIdentity : IItemIdentity
|
||||
{
|
||||
IEnumerable<TIdentity> Identities { get; }
|
||||
|
||||
Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public interface IItemIdentity
|
||||
{
|
||||
string Type { get; }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public interface IItemIdentityConverter : IHasOrder { }
|
||||
public interface IItemIdentityConverter { }
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public interface IItemIdentityProvider : IHasOrder { }
|
||||
public interface IItemIdentityProvider { }
|
||||
}
|
||||
@@ -195,18 +195,16 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// Gets the item identity providers.
|
||||
/// </summary>
|
||||
/// <typeparam name="TLookupInfo">The type of the t lookup information.</typeparam>
|
||||
/// <typeparam name="TIdentity">The type of the t identity.</typeparam>
|
||||
/// <returns>IEnumerable<IItemIdentityProvider<TLookupInfo, TIdentity>>.</returns>
|
||||
IEnumerable<IItemIdentityProvider<TLookupInfo, TIdentity>> GetItemIdentityProviders<TLookupInfo, TIdentity>()
|
||||
where TLookupInfo : ItemLookupInfo
|
||||
where TIdentity : IItemIdentity;
|
||||
IEnumerable<IItemIdentityProvider<TLookupInfo>> GetItemIdentityProviders<TLookupInfo>()
|
||||
where TLookupInfo : ItemLookupInfo;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the item identity converters.
|
||||
/// </summary>
|
||||
/// <typeparam name="TIdentity">The type of the t identity.</typeparam>
|
||||
/// <typeparam name="TLookupInfo">The type of the t lookup information.</typeparam>
|
||||
/// <returns>IEnumerable<IItemIdentityConverter<TIdentity>>.</returns>
|
||||
IEnumerable<IItemIdentityConverter<TIdentity>> GetItemIdentityConverters<TIdentity>()
|
||||
where TIdentity : IItemIdentity;
|
||||
IEnumerable<IItemIdentityConverter<TLookupInfo>> GetItemIdentityConverters<TLookupInfo>()
|
||||
where TLookupInfo : ItemLookupInfo;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,20 +2,15 @@
|
||||
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public interface IItemIdentityProvider<in TLookupInfo, TIdentity> : IItemIdentityProvider
|
||||
public interface IItemIdentityProvider<in TLookupInfo> : IItemIdentityProvider
|
||||
where TLookupInfo : ItemLookupInfo
|
||||
where TIdentity : IItemIdentity
|
||||
{
|
||||
Task<TIdentity> FindIdentity(TLookupInfo info);
|
||||
Task Identify(TLookupInfo info);
|
||||
}
|
||||
|
||||
public interface IItemIdentityConverter<TIdentity> : IItemIdentityConverter
|
||||
where TIdentity : IItemIdentity
|
||||
public interface IItemIdentityConverter<in TLookupInfo> : IItemIdentityConverter
|
||||
where TLookupInfo : ItemLookupInfo
|
||||
{
|
||||
Task<TIdentity> Convert(TIdentity identity);
|
||||
|
||||
string SourceType { get; }
|
||||
|
||||
string ResultType { get; }
|
||||
Task<bool> Convert(TLookupInfo info);
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public class SeasonIdentity : IItemIdentity
|
||||
{
|
||||
public string Type { get; set; }
|
||||
|
||||
public string SeriesId { get; set; }
|
||||
|
||||
public int SeasonIndex { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public class SeasonInfo : ItemLookupInfo, IHasIdentities<SeasonIdentity>
|
||||
public class SeasonInfo : ItemLookupInfo
|
||||
{
|
||||
private List<SeasonIdentity> _identities = new List<SeasonIdentity>();
|
||||
|
||||
public Dictionary<string, string> SeriesProviderIds { get; set; }
|
||||
public int? AnimeSeriesIndex { get; set; }
|
||||
|
||||
@@ -17,16 +12,5 @@ namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
public IEnumerable<SeasonIdentity> Identities
|
||||
{
|
||||
get { return _identities; }
|
||||
}
|
||||
|
||||
public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken)
|
||||
{
|
||||
var identifier = new ItemIdentifier<SeasonInfo, SeasonIdentity>();
|
||||
_identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public class SeriesIdentity : IItemIdentity
|
||||
{
|
||||
public string Type { get; set; }
|
||||
|
||||
public string Id { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,25 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
public class SeriesInfo : ItemLookupInfo, IHasIdentities<SeriesIdentity>
|
||||
public class SeriesInfo : ItemLookupInfo
|
||||
{
|
||||
private List<SeriesIdentity> _identities = new List<SeriesIdentity>();
|
||||
|
||||
public int? AnimeSeriesIndex { get; set; }
|
||||
|
||||
public IEnumerable<SeriesIdentity> Identities
|
||||
{
|
||||
get { return _identities; }
|
||||
}
|
||||
|
||||
public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken)
|
||||
{
|
||||
var identifier = new ItemIdentifier<SeriesInfo, SeriesIdentity>();
|
||||
_identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user