diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index 237e541f..d4fff41d 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -6,7 +6,6 @@ namespace Kyoo.Controllers public interface ILibraryManager { //Read values - string GetShowExternalIDs(long showID); Studio GetStudio(long showID); IEnumerable GetPeople(long showID); IEnumerable GetGenreForShow(long showID); diff --git a/Kyoo.Common/Models/MetadataID.cs b/Kyoo.Common/Models/MetadataID.cs new file mode 100644 index 00000000..29075460 --- /dev/null +++ b/Kyoo.Common/Models/MetadataID.cs @@ -0,0 +1,33 @@ +namespace Kyoo.Models +{ + public class MetadataID + { + public string ProviderName; + public string ProviderLogo; + public string ID; + public string Link; + + public MetadataID() { } + + public MetadataID(string providerValue) + { + string[] values = providerValue.Split('='); + ProviderName = values[0]; + ID = values[1]; + } + + public MetadataID(string providerName, string id) + { + ProviderName = providerName; + ID = id; + } + + public MetadataID(string providerName, string providerLogo, string id, string link) + { + ProviderName = providerName; + ProviderLogo = providerLogo; + ID = id; + Link = link; + } + } +} \ No newline at end of file diff --git a/Kyoo.Common/Models/Show.cs b/Kyoo.Common/Models/Show.cs index a26e490a..231c46f5 100644 --- a/Kyoo.Common/Models/Show.cs +++ b/Kyoo.Common/Models/Show.cs @@ -25,7 +25,7 @@ namespace Kyoo.Models [JsonIgnore] public string ImgLogo { get; set; } [JsonIgnore] public string ImgBackdrop { get; set; } - public string ExternalIDs { get; set; } + public IEnumerable ExternalIDs { get; set; } public bool IsMovie { get; set; } @@ -42,21 +42,18 @@ namespace Kyoo.Models [JsonIgnore] public virtual IEnumerable Seasons { get; set; } [JsonIgnore] public virtual IEnumerable Episodes { get; set; } - - public string GetAliases() - { - return Aliases == null ? null : string.Join('|', Aliases); - } - - public string GetGenres() - { - return Genres == null ? null : string.Join('|', Genres); - } - - public Show() { } - public Show(string slug, string title, IEnumerable aliases, string path, string overview, string trailerUrl, IEnumerable genres, Status? status, long? startYear, long? endYear, string externalIDs) + public Show(string slug, + string title, + IEnumerable aliases, + string path, string overview, + string trailerUrl, + IEnumerable genres, + Status? status, + long? startYear, + long? endYear, + IEnumerable externalIDs) { Slug = slug; Title = title; @@ -72,7 +69,20 @@ namespace Kyoo.Models IsCollection = false; } - public Show(string slug, string title, IEnumerable aliases, string path, string overview, string trailerUrl, Status? status, long? startYear, long? endYear, string imgPrimary, string imgThumb, string imgLogo, string imgBackdrop, string externalIDs) + public Show(string slug, + string title, + IEnumerable aliases, + string path, + string overview, + string trailerUrl, + Status? status, + long? startYear, + long? endYear, + string imgPrimary, + string imgThumb, + string imgLogo, + string imgBackdrop, + IEnumerable externalIDs) { Slug = slug; Title = title; @@ -93,12 +103,7 @@ namespace Kyoo.Models public string GetID(string provider) { - if (ExternalIDs?.Contains(provider) != true) - return null; - int startIndex = ExternalIDs.IndexOf(provider, StringComparison.Ordinal) + provider.Length + 1; //The + 1 is for the '=' - if (ExternalIDs.IndexOf('|', startIndex) == -1) - return ExternalIDs.Substring(startIndex); - return ExternalIDs.Substring(startIndex, ExternalIDs.IndexOf('|', startIndex) - startIndex); + return ExternalIDs.FirstOrDefault(x => x.ProviderName == provider)?.ID; } public Show Merge(Show other) @@ -122,7 +127,7 @@ namespace Kyoo.Models ImgLogo ??= other.ImgLogo; ImgBackdrop ??= other.ImgBackdrop; Studio ??= other.Studio; - ExternalIDs = string.Join('|', new [] { ExternalIDs, other.ExternalIDs }.Where(x => !string.IsNullOrEmpty(x))); + ExternalIDs = Utility.MergeLists(ExternalIDs, other.ExternalIDs, (x, y) => x.ProviderName == y.ProviderName); return this; } } diff --git a/Kyoo/Controllers/LibraryManager.cs b/Kyoo/Controllers/LibraryManager.cs index 4680c51f..af41337d 100644 --- a/Kyoo/Controllers/LibraryManager.cs +++ b/Kyoo/Controllers/LibraryManager.cs @@ -35,12 +35,6 @@ namespace Kyoo.Controllers return Enumerable.Aggregate(_database.Libraries, paths, (current, lib) => current.Concat(lib.Paths)); } - public string GetShowExternalIDs(long showID) - { - return (from show in _database.Shows where show.ID == showID select show.ExternalIDs).FirstOrDefault(); - } - - public (Track video, IEnumerable audios, IEnumerable subtitles) GetStreams(long episodeID, string episodeSlug) { IEnumerable tracks = _database.Tracks.Where(track => track.EpisodeID == episodeID); diff --git a/Kyoo/Models/DatabaseContext.cs b/Kyoo/Models/DatabaseContext.cs index 63b5fc92..a17bb058 100644 --- a/Kyoo/Models/DatabaseContext.cs +++ b/Kyoo/Models/DatabaseContext.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using IdentityServer4.EntityFramework.Entities; @@ -92,6 +93,7 @@ namespace Kyoo private ValueComparer stringArrayComparer = new ValueComparer( (l1, l2) => l1.SequenceEqual(l2), arr => arr.Aggregate(0, (i, s) => s.GetHashCode())); + protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -100,6 +102,12 @@ namespace Kyoo modelBuilder.Entity().Property(e => e.Paths).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer); modelBuilder.Entity().Property(e => e.Providers).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer); modelBuilder.Entity().Property(e => e.Aliases).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer); + modelBuilder.Entity().Property(e => e.ExternalIDs).HasConversion(new ValueConverter, string>( + ids => string.Join("|", ids.Select(x => $"{x.ProviderName}={x.ID}")), + ids => ids.Split('|', StringSplitOptions.None).Select(x => new MetadataID(x)))) + .Metadata.SetValueComparer( new ValueComparer>( + (l1, l2) => l1.SequenceEqual(l2), + arr => arr.Aggregate(0, (i, s) => s.GetHashCode()))); modelBuilder.Entity() .Property(t => t.IsDefault)