diff --git a/Kyoo.Common/Controllers/IMetadataProvider.cs b/Kyoo.Common/Controllers/IMetadataProvider.cs index 6bafa691..3a0472b9 100644 --- a/Kyoo.Common/Controllers/IMetadataProvider.cs +++ b/Kyoo.Common/Controllers/IMetadataProvider.cs @@ -6,8 +6,8 @@ namespace Kyoo.Controllers { public interface IMetadataProvider { - public string Name { get; } - + ProviderID Provider { get; } + Task GetCollectionFromName(string name); Task GetShowByID(Show show); diff --git a/Kyoo.Common/Kyoo.Common.csproj b/Kyoo.Common/Kyoo.Common.csproj index 4c5a99f5..c0ffcb47 100644 --- a/Kyoo.Common/Kyoo.Common.csproj +++ b/Kyoo.Common/Kyoo.Common.csproj @@ -11,7 +11,7 @@ SDG GPL-3.0-or-later true - 1.0.15 + 1.0.17 diff --git a/Kyoo.Common/Models/Library.cs b/Kyoo.Common/Models/Library.cs index 2a493ca1..d9d5c7ca 100644 --- a/Kyoo.Common/Models/Library.cs +++ b/Kyoo.Common/Models/Library.cs @@ -8,11 +8,11 @@ namespace Kyoo.Models public string Slug { get; set; } public string Name { get; set; } public string[] Paths { get; set; } - public string[] Providers { get; set; } + public ProviderID[] Providers { get; set; } public Library() { } - public Library(string slug, string name, string[] paths, string[] providers) + public Library(string slug, string name, string[] paths, ProviderID[] providers) { Slug = slug; Name = name; diff --git a/Kyoo.Common/Models/MetadataID.cs b/Kyoo.Common/Models/MetadataID.cs index 29075460..9f0b18ce 100644 --- a/Kyoo.Common/Models/MetadataID.cs +++ b/Kyoo.Common/Models/MetadataID.cs @@ -2,31 +2,21 @@ namespace Kyoo.Models { public class MetadataID { - public string ProviderName; - public string ProviderLogo; - public string ID; - public string Link; + public long ID { get; set; } + public long ShowID { get; set; } + public virtual Show Show { get; set; } + public long ProviderID { get; set; } + public virtual ProviderID Provider {get; set; } + + public string DataID { get; set; } + public string Link { get; set; } public MetadataID() { } - public MetadataID(string providerValue) + public MetadataID(ProviderID provider, string dataID, string link) { - 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; + Provider = provider; + DataID = dataID; Link = link; } } diff --git a/Kyoo.Common/Models/ProviderID.cs b/Kyoo.Common/Models/ProviderID.cs new file mode 100644 index 00000000..53a02d82 --- /dev/null +++ b/Kyoo.Common/Models/ProviderID.cs @@ -0,0 +1,39 @@ +namespace Kyoo.Models +{ + public class ProviderID + { + public long ID { get; set; } + public string Name { get; set; } + public string Logo { get; set; } + + public ProviderID() { } + + public ProviderID(long id, string name, string logo) + { + ID = id; + Name = name; + Logo = logo; + } + + protected bool Equals(ProviderID other) + { + return Name == other.Name; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType() != this.GetType()) + return false; + return Equals((ProviderID)obj); + } + + public override int GetHashCode() + { + return Name != null ? Name.GetHashCode() : 0; + } + } +} \ No newline at end of file diff --git a/Kyoo.Common/Models/Show.cs b/Kyoo.Common/Models/Show.cs index 231c46f5..a4fa2804 100644 --- a/Kyoo.Common/Models/Show.cs +++ b/Kyoo.Common/Models/Show.cs @@ -1,5 +1,4 @@ -using System; -using Newtonsoft.Json; +using Newtonsoft.Json; using System.Collections.Generic; using System.Linq; @@ -103,7 +102,7 @@ namespace Kyoo.Models public string GetID(string provider) { - return ExternalIDs.FirstOrDefault(x => x.ProviderName == provider)?.ID; + return ExternalIDs.FirstOrDefault(x => x.Provider.Name == provider)?.DataID; } public Show Merge(Show other) @@ -127,7 +126,7 @@ namespace Kyoo.Models ImgLogo ??= other.ImgLogo; ImgBackdrop ??= other.ImgBackdrop; Studio ??= other.Studio; - ExternalIDs = Utility.MergeLists(ExternalIDs, other.ExternalIDs, (x, y) => x.ProviderName == y.ProviderName); + ExternalIDs = Utility.MergeLists(ExternalIDs, other.ExternalIDs, (x, y) => x.Provider != y.Provider); return this; } } diff --git a/Kyoo/Controllers/ProviderManager.cs b/Kyoo/Controllers/ProviderManager.cs index 0cc595ea..6e4d536d 100644 --- a/Kyoo/Controllers/ProviderManager.cs +++ b/Kyoo/Controllers/ProviderManager.cs @@ -2,7 +2,6 @@ using Kyoo.Models; using System.Collections.Generic; using System.Linq; -using System.Net.Mail; using System.Threading.Tasks; namespace Kyoo.Controllers @@ -22,17 +21,17 @@ namespace Kyoo.Controllers T ret = new T(); IEnumerable providers = library?.Providers != null - ? _providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name)) + ? _providers.Where(x => library.Providers.Contains(x.Provider)) + .OrderBy(provider => Array.IndexOf(library.Providers, provider.Provider)) : _providers; foreach (IMetadataProvider provider in providers) { try { - if (library?.Providers == null || library.Providers.Contains(provider.Name)) - ret = ret.Merge(await providerCall(provider)); + ret = ret.Merge(await providerCall(provider)); } catch (Exception ex) { - Console.Error.WriteLine($"\tThe provider {provider.Name} coudln't work for {what}. Exception: {ex.Message}"); + Console.Error.WriteLine($"\tThe provider {provider.Provider.Name} coudln't work for {what}. Exception: {ex.Message}"); } } return ret; @@ -43,17 +42,17 @@ namespace Kyoo.Controllers List ret = new List(); IEnumerable providers = library?.Providers != null - ? _providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name)) + ? _providers.Where(x => library.Providers.Contains(x.Provider)) + .OrderBy(provider => Array.IndexOf(library.Providers, provider.Provider)) : _providers; foreach (IMetadataProvider provider in providers) { try { - if (library?.Providers == null || library.Providers.Contains(provider.Name)) - ret.AddRange(await providerCall(provider) ?? new List()); + ret.AddRange(await providerCall(provider) ?? new List()); } catch (Exception ex) { - Console.Error.WriteLine($"\tThe provider {provider.Name} coudln't work for {what}. Exception: {ex.Message}"); + Console.Error.WriteLine($"\tThe provider {provider.Provider.Name} coudln't work for {what}. Exception: {ex.Message}"); } } return ret; diff --git a/Kyoo/Models/DatabaseContext.cs b/Kyoo/Models/DatabaseContext.cs index a17bb058..ac6ed62d 100644 --- a/Kyoo/Models/DatabaseContext.cs +++ b/Kyoo/Models/DatabaseContext.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using IdentityServer4.EntityFramework.Entities; @@ -77,6 +76,8 @@ namespace Kyoo public DbSet Genres { get; set; } public DbSet Peoples { get; set; } public DbSet Studios { get; set; } + public DbSet ProviderIds { get; set; } + public DbSet MetadataIds { get; set; } public DbSet LibraryLinks { get; set; } public DbSet CollectionLinks { get; set; } @@ -102,12 +103,6 @@ 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) diff --git a/Kyoo/Views/API/SubtitleAPI.cs b/Kyoo/Views/API/SubtitleAPI.cs index 5b279e5f..82034a16 100644 --- a/Kyoo/Views/API/SubtitleAPI.cs +++ b/Kyoo/Views/API/SubtitleAPI.cs @@ -127,9 +127,9 @@ namespace Kyoo.Api if (line == "") { lines.Add(""); - List processedBlock = ConvertBlock(lines); - for (int i = 0; i < processedBlock.Count; i++) - await writer.WriteLineAsync(processedBlock[i]); + IEnumerable processedBlock = ConvertBlock(lines); + foreach (string t in processedBlock) + await writer.WriteLineAsync(t); lines.Clear(); } else @@ -141,44 +141,24 @@ namespace Kyoo.Api await context.HttpContext.Response.Body.FlushAsync(); } - private static List ConvertBlock(List lines) + private static IEnumerable ConvertBlock(IList lines) { lines[1] = lines[1].Replace(',', '.'); if (lines[2].Length > 5) { - switch (lines[2].Substring(0, 6)) + lines[1] += lines[2].Substring(0, 6) switch { - case "{\\an1}": - lines[1] += " line:93% position:15%"; - break; - case "{\\an2}": - lines[1] += " line:93%"; - break; - case "{\\an3}": - lines[1] += " line:93% position:85%"; - break; - case "{\\an4}": - lines[1] += " line:50% position:15%"; - break; - case "{\\an5}": - lines[1] += " line:50%"; - break; - case "{\\an6}": - lines[1] += " line:50% position:85%"; - break; - case "{\\an7}": - lines[1] += " line:7% position:15%"; - break; - case "{\\an8}": - lines[1] += " line:7%"; - break; - case "{\\an9}": - lines[1] += " line:7% position:85%"; - break; - default: - lines[1] += " line:93%"; - break; - } + "{\\an1}" => " line:93% position:15%", + "{\\an2}" => " line:93%", + "{\\an3}" => " line:93% position:85%", + "{\\an4}" => " line:50% position:15%", + "{\\an5}" => " line:50%", + "{\\an6}" => " line:50% position:85%", + "{\\an7}" => " line:7% position:15%", + "{\\an8}" => " line:7%", + "{\\an9}" => " line:7% position:85%", + _ => " line:93%" + }; } if (lines[2].StartsWith("{\\an"))