Reworking handling of providers

This commit is contained in:
Zoe Roux 2020-04-23 21:58:35 +02:00
parent da12eae0a2
commit 9580056df1
9 changed files with 84 additions and 82 deletions

View File

@ -6,8 +6,8 @@ namespace Kyoo.Controllers
{ {
public interface IMetadataProvider public interface IMetadataProvider
{ {
public string Name { get; } ProviderID Provider { get; }
Task<Collection> GetCollectionFromName(string name); Task<Collection> GetCollectionFromName(string name);
Task<Show> GetShowByID(Show show); Task<Show> GetShowByID(Show show);

View File

@ -11,7 +11,7 @@
<Company>SDG</Company> <Company>SDG</Company>
<PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression> <PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<PackageVersion>1.0.15</PackageVersion> <PackageVersion>1.0.17</PackageVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -8,11 +8,11 @@ namespace Kyoo.Models
public string Slug { get; set; } public string Slug { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string[] Paths { get; set; } public string[] Paths { get; set; }
public string[] Providers { get; set; } public ProviderID[] Providers { get; set; }
public Library() { } public Library() { }
public Library(string slug, string name, string[] paths, string[] providers) public Library(string slug, string name, string[] paths, ProviderID[] providers)
{ {
Slug = slug; Slug = slug;
Name = name; Name = name;

View File

@ -2,31 +2,21 @@ namespace Kyoo.Models
{ {
public class MetadataID public class MetadataID
{ {
public string ProviderName; public long ID { get; set; }
public string ProviderLogo; public long ShowID { get; set; }
public string ID; public virtual Show Show { get; set; }
public string Link; 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() { }
public MetadataID(string providerValue) public MetadataID(ProviderID provider, string dataID, string link)
{ {
string[] values = providerValue.Split('='); Provider = provider;
ProviderName = values[0]; DataID = dataID;
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; Link = link;
} }
} }

View File

@ -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;
}
}
}

View File

@ -1,5 +1,4 @@
using System; using Newtonsoft.Json;
using Newtonsoft.Json;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -103,7 +102,7 @@ namespace Kyoo.Models
public string GetID(string provider) 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) public Show Merge(Show other)
@ -127,7 +126,7 @@ namespace Kyoo.Models
ImgLogo ??= other.ImgLogo; ImgLogo ??= other.ImgLogo;
ImgBackdrop ??= other.ImgBackdrop; ImgBackdrop ??= other.ImgBackdrop;
Studio ??= other.Studio; 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; return this;
} }
} }

View File

@ -2,7 +2,6 @@
using Kyoo.Models; using Kyoo.Models;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Mail;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Kyoo.Controllers namespace Kyoo.Controllers
@ -22,17 +21,17 @@ namespace Kyoo.Controllers
T ret = new T(); T ret = new T();
IEnumerable<IMetadataProvider> providers = library?.Providers != null IEnumerable<IMetadataProvider> 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; : _providers;
foreach (IMetadataProvider provider in providers) foreach (IMetadataProvider provider in providers)
{ {
try 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) { } 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; return ret;
@ -43,17 +42,17 @@ namespace Kyoo.Controllers
List<T> ret = new List<T>(); List<T> ret = new List<T>();
IEnumerable<IMetadataProvider> providers = library?.Providers != null IEnumerable<IMetadataProvider> 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; : _providers;
foreach (IMetadataProvider provider in providers) foreach (IMetadataProvider provider in providers)
{ {
try try
{ {
if (library?.Providers == null || library.Providers.Contains(provider.Name)) ret.AddRange(await providerCall(provider) ?? new List<T>());
ret.AddRange(await providerCall(provider) ?? new List<T>());
} catch (Exception ex) { } 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; return ret;

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using IdentityServer4.EntityFramework.Entities; using IdentityServer4.EntityFramework.Entities;
@ -77,6 +76,8 @@ namespace Kyoo
public DbSet<Genre> Genres { get; set; } public DbSet<Genre> Genres { get; set; }
public DbSet<People> Peoples { get; set; } public DbSet<People> Peoples { get; set; }
public DbSet<Studio> Studios { get; set; } public DbSet<Studio> Studios { get; set; }
public DbSet<ProviderID> ProviderIds { get; set; }
public DbSet<MetadataID> MetadataIds { get; set; }
public DbSet<LibraryLink> LibraryLinks { get; set; } public DbSet<LibraryLink> LibraryLinks { get; set; }
public DbSet<CollectionLink> CollectionLinks { get; set; } public DbSet<CollectionLink> CollectionLinks { get; set; }
@ -102,12 +103,6 @@ namespace Kyoo
modelBuilder.Entity<Library>().Property(e => e.Paths).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer); modelBuilder.Entity<Library>().Property(e => e.Paths).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer);
modelBuilder.Entity<Library>().Property(e => e.Providers).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer); modelBuilder.Entity<Library>().Property(e => e.Providers).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer);
modelBuilder.Entity<Show>().Property(e => e.Aliases).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer); modelBuilder.Entity<Show>().Property(e => e.Aliases).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer);
modelBuilder.Entity<Show>().Property(e => e.ExternalIDs).HasConversion(new ValueConverter<IEnumerable<MetadataID>, 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<IEnumerable<MetadataID>>(
(l1, l2) => l1.SequenceEqual(l2),
arr => arr.Aggregate(0, (i, s) => s.GetHashCode())));
modelBuilder.Entity<Track>() modelBuilder.Entity<Track>()
.Property(t => t.IsDefault) .Property(t => t.IsDefault)

View File

@ -127,9 +127,9 @@ namespace Kyoo.Api
if (line == "") if (line == "")
{ {
lines.Add(""); lines.Add("");
List<string> processedBlock = ConvertBlock(lines); IEnumerable<string> processedBlock = ConvertBlock(lines);
for (int i = 0; i < processedBlock.Count; i++) foreach (string t in processedBlock)
await writer.WriteLineAsync(processedBlock[i]); await writer.WriteLineAsync(t);
lines.Clear(); lines.Clear();
} }
else else
@ -141,44 +141,24 @@ namespace Kyoo.Api
await context.HttpContext.Response.Body.FlushAsync(); await context.HttpContext.Response.Body.FlushAsync();
} }
private static List<string> ConvertBlock(List<string> lines) private static IEnumerable<string> ConvertBlock(IList<string> lines)
{ {
lines[1] = lines[1].Replace(',', '.'); lines[1] = lines[1].Replace(',', '.');
if (lines[2].Length > 5) if (lines[2].Length > 5)
{ {
switch (lines[2].Substring(0, 6)) lines[1] += lines[2].Substring(0, 6) switch
{ {
case "{\\an1}": "{\\an1}" => " line:93% position:15%",
lines[1] += " line:93% position:15%"; "{\\an2}" => " line:93%",
break; "{\\an3}" => " line:93% position:85%",
case "{\\an2}": "{\\an4}" => " line:50% position:15%",
lines[1] += " line:93%"; "{\\an5}" => " line:50%",
break; "{\\an6}" => " line:50% position:85%",
case "{\\an3}": "{\\an7}" => " line:7% position:15%",
lines[1] += " line:93% position:85%"; "{\\an8}" => " line:7%",
break; "{\\an9}" => " line:7% position:85%",
case "{\\an4}": _ => " line:93%"
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;
}
} }
if (lines[2].StartsWith("{\\an")) if (lines[2].StartsWith("{\\an"))