diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index 9abda1c4..9fef9a4a 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -121,25 +121,25 @@ namespace Kyoo.Controllers Pagination limit = default ) => GetEpisodesFromSeason(showSlug, seasonNumber, where, new Sort(sort), limit); - Task> GetPeopleFromShow(int showID, - Expression> where = null, - Sort sort = default, + Task> GetPeopleFromShow(int showID, + Expression> where = null, + Sort sort = default, Pagination limit = default); - Task> GetPeopleFromShow(int showID, - [Optional] Expression> where, - Expression> sort, + Task> GetPeopleFromShow(int showID, + [Optional] Expression> where, + Expression> sort, Pagination limit = default - ) => GetPeopleFromShow(showID, where, new Sort(sort), limit); + ) => GetPeopleFromShow(showID, where, new Sort(sort), limit); - Task> GetPeopleFromShow(string showSlug, - Expression> where = null, - Sort sort = default, + Task> GetPeopleFromShow(string showSlug, + Expression> where = null, + Sort sort = default, Pagination limit = default); - Task> GetPeopleFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, + Task> GetPeopleFromShow(string showSlug, + [Optional] Expression> where, + Expression> sort, Pagination limit = default - ) => GetPeopleFromShow(showSlug, where, new Sort(sort), limit); + ) => GetPeopleFromShow(showSlug, where, new Sort(sort), limit); Task> GetGenresFromShow(int showID, Expression> where = null, diff --git a/Kyoo.Common/Controllers/IMetadataProvider.cs b/Kyoo.Common/Controllers/IMetadataProvider.cs index 1852739f..c552d5e3 100644 --- a/Kyoo.Common/Controllers/IMetadataProvider.cs +++ b/Kyoo.Common/Controllers/IMetadataProvider.cs @@ -12,7 +12,7 @@ namespace Kyoo.Controllers Task GetShowByID(Show show); Task> SearchShows(string showName, bool isMovie); - Task> GetPeople(Show show); + Task> GetPeople(Show show); Task GetSeason(Show show, int seasonNumber); diff --git a/Kyoo.Common/Controllers/IProviderManager.cs b/Kyoo.Common/Controllers/IProviderManager.cs index b5c3da50..07f09cb2 100644 --- a/Kyoo.Common/Controllers/IProviderManager.cs +++ b/Kyoo.Common/Controllers/IProviderManager.cs @@ -12,6 +12,6 @@ namespace Kyoo.Controllers Task> SearchShows(string showName, bool isMovie, Library library); Task GetSeason(Show show, int seasonNumber, Library library); Task GetEpisode(Show show, string episodePath, int seasonNumber, int episodeNumber, int absoluteNumber, Library library); - Task> GetPeople(Show show, Library library); + Task> GetPeople(Show show, Library library); } } \ No newline at end of file diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index 01877446..e2659bdd 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -421,25 +421,25 @@ namespace Kyoo.Controllers public interface IPeopleRepository : IRepository { - Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, + Task> GetFromShow(int showID, + Expression> where = null, + Sort sort = default, Pagination limit = default); - Task> GetFromShow(int showID, - [Optional] Expression> where, - Expression> sort, + Task> GetFromShow(int showID, + [Optional] Expression> where, + Expression> sort, Pagination limit = default - ) => GetFromShow(showID, where, new Sort(sort), limit); + ) => GetFromShow(showID, where, new Sort(sort), limit); - Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, + Task> GetFromShow(string showSlug, + Expression> where = null, + Sort sort = default, Pagination limit = default); - Task> GetFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, + Task> GetFromShow(string showSlug, + [Optional] Expression> where, + Expression> sort, Pagination limit = default - ) => GetFromShow(showSlug, where, new Sort(sort), limit); + ) => GetFromShow(showSlug, where, new Sort(sort), limit); Task> GetFromPeople(int showID, Expression> where = null, diff --git a/Kyoo.Common/Controllers/IThumbnailsManager.cs b/Kyoo.Common/Controllers/IThumbnailsManager.cs index 9dad54ed..0e966b12 100644 --- a/Kyoo.Common/Controllers/IThumbnailsManager.cs +++ b/Kyoo.Common/Controllers/IThumbnailsManager.cs @@ -9,6 +9,6 @@ namespace Kyoo.Controllers Task Validate(Show show, bool alwaysDownload = false); Task Validate(Season season, bool alwaysDownload = false); Task Validate(Episode episode, bool alwaysDownload = false); - Task> Validate(IEnumerable actors, bool alwaysDownload = false); + Task> Validate(IEnumerable actors, bool alwaysDownload = false); } } diff --git a/Kyoo.Common/Controllers/Implementations/LibraryManager.cs b/Kyoo.Common/Controllers/Implementations/LibraryManager.cs index cb926f21..6743bc56 100644 --- a/Kyoo.Common/Controllers/Implementations/LibraryManager.cs +++ b/Kyoo.Common/Controllers/Implementations/LibraryManager.cs @@ -303,17 +303,17 @@ namespace Kyoo.Controllers return EpisodeRepository.GetFromSeason(showSlug, seasonNumber, where, sort, limit); } - public Task> GetPeopleFromShow(int showID, - Expression> where = null, - Sort sort = default, + public Task> GetPeopleFromShow(int showID, + Expression> where = null, + Sort sort = default, Pagination limit = default) { return PeopleRepository.GetFromShow(showID, where, sort, limit); } - public Task> GetPeopleFromShow(string showSlug, - Expression> where = null, - Sort sort = default, + public Task> GetPeopleFromShow(string showSlug, + Expression> where = null, + Sort sort = default, Pagination limit = default) { return PeopleRepository.GetFromShow(showSlug, where, sort, limit); diff --git a/Kyoo.Common/Kyoo.Common.csproj b/Kyoo.Common/Kyoo.Common.csproj index bdd20619..ac43b9a0 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.21 + 1.0.22 diff --git a/Kyoo.Common/Models/PeopleLink.cs b/Kyoo.Common/Models/PeopleRole.cs similarity index 91% rename from Kyoo.Common/Models/PeopleLink.cs rename to Kyoo.Common/Models/PeopleRole.cs index 04555298..edb760b9 100644 --- a/Kyoo.Common/Models/PeopleLink.cs +++ b/Kyoo.Common/Models/PeopleRole.cs @@ -5,7 +5,7 @@ using Newtonsoft.Json; namespace Kyoo.Models { - public class PeopleLink : IResource + public class PeopleRole : IResource { [JsonIgnore] public int ID { get; set; } [JsonIgnore] public int PeopleID { get; set; } @@ -40,9 +40,9 @@ namespace Kyoo.Models public string Role { get; set; } public string Type { get; set; } - public PeopleLink() {} + public PeopleRole() {} - public PeopleLink(People people, Show show, string role, string type) + public PeopleRole(People people, Show show, string role, string type) { People = people; Show = show; @@ -50,7 +50,7 @@ namespace Kyoo.Models Type = type; } - public PeopleLink(string slug, + public PeopleRole(string slug, string name, string role, string type, @@ -85,7 +85,7 @@ namespace Kyoo.Models public ShowRole() {} - public ShowRole(PeopleLink x) + public ShowRole(PeopleRole x) { ID = x.ID; Role = x.Role; @@ -105,7 +105,7 @@ namespace Kyoo.Models IsMovie = x.Show.IsMovie; } - public static Expression> FromPeopleRole => x => new ShowRole + public static Expression> FromPeopleRole => x => new ShowRole { ID = x.ID, Role = x.Role, diff --git a/Kyoo.Common/Models/Resources/People.cs b/Kyoo.Common/Models/Resources/People.cs index 78a9c87d..8a97a918 100644 --- a/Kyoo.Common/Models/Resources/People.cs +++ b/Kyoo.Common/Models/Resources/People.cs @@ -12,7 +12,7 @@ namespace Kyoo.Models public string Poster { get; set; } public virtual IEnumerable ExternalIDs { get; set; } - [JsonIgnore] public virtual IEnumerable Roles { get; set; } + [JsonIgnore] public virtual IEnumerable Roles { get; set; } public People() {} diff --git a/Kyoo.Common/Models/Resources/Show.cs b/Kyoo.Common/Models/Resources/Show.cs index aabfc697..8e910814 100644 --- a/Kyoo.Common/Models/Resources/Show.cs +++ b/Kyoo.Common/Models/Resources/Show.cs @@ -37,7 +37,7 @@ namespace Kyoo.Models [NotMergable] [JsonIgnore] public virtual IEnumerable GenreLinks { get; set; } [JsonIgnore] public int? StudioID { get; set; } public virtual Studio Studio { get; set; } - [JsonIgnore] public virtual IEnumerable People { get; set; } + [JsonIgnore] public virtual IEnumerable People { get; set; } [JsonIgnore] public virtual IEnumerable Seasons { get; set; } [JsonIgnore] public virtual IEnumerable Episodes { get; set; } @@ -53,7 +53,7 @@ namespace Kyoo.Models [NotMergable] [JsonIgnore] public IEnumerable Collections { - get => CollectionLinks.Select(x => x.Collection); + get => CollectionLinks?.Select(x => x.Collection); set => CollectionLinks = value?.Select(x => new CollectionLink(x, this)); } @@ -126,7 +126,7 @@ namespace Kyoo.Models foreach (GenreLink genre in GenreLinks) genre.Show = this; if (People != null) - foreach (PeopleLink link in People) + foreach (PeopleRole link in People) link.Show = this; if (Seasons != null) foreach (Season season in Seasons) diff --git a/Kyoo.CommonAPI/JsonSerializer.cs b/Kyoo.CommonAPI/JsonSerializer.cs index 11c696fe..029b9cb9 100644 --- a/Kyoo.CommonAPI/JsonSerializer.cs +++ b/Kyoo.CommonAPI/JsonSerializer.cs @@ -79,7 +79,7 @@ namespace Kyoo.Controllers { {typeof(Show), new HashSet {"genres", "studio"}}, {typeof(Episode), new HashSet {"tracks"}}, - {typeof(PeopleLink), new HashSet {"show"}} + {typeof(PeopleRole), new HashSet {"show"}} }) }, context.HttpContext.RequestServices.GetRequiredService>(), diff --git a/Kyoo.CommonAPI/LocalRepository.cs b/Kyoo.CommonAPI/LocalRepository.cs index 2bb43812..d7b8deda 100644 --- a/Kyoo.CommonAPI/LocalRepository.cs +++ b/Kyoo.CommonAPI/LocalRepository.cs @@ -1,7 +1,9 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Reflection; using System.Threading.Tasks; using Kyoo.CommonApi; using Kyoo.Models; @@ -136,7 +138,20 @@ namespace Kyoo.Controllers return old; } - protected abstract Task Validate(T ressource); + protected virtual Task Validate(T ressource) + { + foreach (PropertyInfo property in typeof(T).GetProperties() + .Where(x => typeof(IEnumerable).IsAssignableFrom(x.PropertyType) + && !typeof(string).IsAssignableFrom(x.PropertyType))) + { + object value = property.GetValue(ressource); + if (value is ICollection || value == null) + continue; + value = Utility.RunGenericMethod(typeof(Enumerable), "ToList", Utility.GetEnumerableType((IEnumerable)value), new [] { value}); + property.SetValue(ressource, value); + } + return Task.CompletedTask; + } public virtual async Task Delete(int id) { diff --git a/Kyoo/Controllers/PluginManager.cs b/Kyoo/Controllers/PluginManager.cs index 68104b48..6dc249c9 100644 --- a/Kyoo/Controllers/PluginManager.cs +++ b/Kyoo/Controllers/PluginManager.cs @@ -66,9 +66,12 @@ namespace Kyoo.Controllers public void ReloadPlugins() { string pluginFolder = _config.GetValue("plugins"); - if (!Directory.Exists(pluginFolder)) + if (!Directory.Exists(pluginFolder)) + { + Console.WriteLine("\nPlugin directory does not exist. No plugin loaded.\n"); return; - + } + string[] pluginsPaths = Directory.GetFiles(pluginFolder); _plugins = pluginsPaths.SelectMany(path => { @@ -83,20 +86,21 @@ namespace Kyoo.Controllers } catch (Exception ex) { - Console.Error.WriteLine($"Error loading the plugin at {path}.\nException: {ex.Message}\n\n"); - return null; + Console.Error.WriteLine($"\nError loading the plugin at {path}.\n{ex.GetType().Name}: {ex.Message}\n"); + return Array.Empty(); } - }).Where(x => x != null).ToList(); + }).ToList(); if (!_plugins.Any()) { - Console.WriteLine("No plugin enabled."); + Console.WriteLine("\nNo plugin enabled.\n"); return; } - Console.WriteLine("Plugin enabled:"); + Console.WriteLine("\nPlugin enabled:"); foreach (IPlugin plugin in _plugins) Console.WriteLine($"\t{plugin.Name}"); + Console.WriteLine(); } } } \ No newline at end of file diff --git a/Kyoo/Controllers/ProviderManager.cs b/Kyoo/Controllers/ProviderManager.cs index a614e39a..1dcef733 100644 --- a/Kyoo/Controllers/ProviderManager.cs +++ b/Kyoo/Controllers/ProviderManager.cs @@ -146,9 +146,9 @@ namespace Kyoo.Controllers return episode; } - public async Task> GetPeople(Show show, Library library) + public async Task> GetPeople(Show show, Library library) { - List people = await GetMetadata( + List people = await GetMetadata( provider => provider.GetPeople(show), library, $"a cast member of {show.Title}"); diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index 533b4a6f..8e69ab35 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -60,11 +60,6 @@ namespace Kyoo.Controllers return obj; } - protected override Task Validate(Collection ressource) - { - return Task.CompletedTask; - } - public override async Task Delete(Collection obj) { if (obj == null) diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 9c0676e4..089c8b93 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -119,6 +119,8 @@ namespace Kyoo.Controllers if (obj.ShowID <= 0) throw new InvalidOperationException($"Can't store an episode not related to any show (showID: {obj.ShowID})."); + await base.Validate(obj); + if (obj.ExternalIDs != null) { foreach (MetadataID link in obj.ExternalIDs) diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index f3a93873..4f35c06a 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -55,11 +55,6 @@ namespace Kyoo.Controllers return obj; } - protected override Task Validate(Genre ressource) - { - return Task.CompletedTask; - } - public override async Task Delete(Genre obj) { if (obj == null) diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index db39e22d..65f83038 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -74,6 +74,8 @@ namespace Kyoo.Controllers if (obj.Paths == null || !obj.Paths.Any()) throw new ArgumentException("The library should have a least one path."); + await base.Validate(obj); + if (obj.ProviderLinks != null) foreach (ProviderLink link in obj.ProviderLinks) link.Provider = await _providers.CreateIfNotExists(link.Provider); diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index a9f2e920..fc5bf2ae 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -67,6 +67,8 @@ namespace Kyoo.Controllers protected override async Task Validate(People obj) { + await base.Validate(obj); + if (obj.ExternalIDs != null) foreach (MetadataID link in obj.ExternalIDs) link.Provider = await _providers.CreateIfNotExists(link.Provider); @@ -82,14 +84,14 @@ namespace Kyoo.Controllers foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Deleted; if (obj.Roles != null) - foreach (PeopleLink link in obj.Roles) + foreach (PeopleRole link in obj.Roles) _database.Entry(link).State = EntityState.Deleted; await _database.SaveChangesAsync(); } - public async Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, + public async Task> GetFromShow(int showID, + Expression> where = null, + Sort sort = default, Pagination limit = default) { if (sort.Key?.Body is MemberExpression member) @@ -102,7 +104,7 @@ namespace Kyoo.Controllers }; } - ICollection people = await ApplyFilters(_database.PeopleRoles.Where(x => x.ShowID == showID), + ICollection people = await ApplyFilters(_database.PeopleRoles.Where(x => x.ShowID == showID), id => _database.PeopleRoles.FirstOrDefaultAsync(x => x.ID == id), x => x.People.Name, where, @@ -113,9 +115,9 @@ namespace Kyoo.Controllers return people; } - public async Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, + public async Task> GetFromShow(string showSlug, + Expression> where = null, + Sort sort = default, Pagination limit = default) { if (sort.Key?.Body is MemberExpression member) @@ -128,7 +130,7 @@ namespace Kyoo.Controllers }; } - ICollection people = await ApplyFilters(_database.PeopleRoles.Where(x => x.Show.Slug == showSlug), + ICollection people = await ApplyFilters(_database.PeopleRoles.Where(x => x.Show.Slug == showSlug), id => _database.PeopleRoles.FirstOrDefaultAsync(x => x.ID == id), x => x.People.Name, where, diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index 79025b00..bb0534a2 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -32,6 +32,8 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); + if (obj.Slug == null) + throw new ArgumentException($"Provider's slug can't be null (name: {obj.Name})."); _database.Entry(obj).State = EntityState.Added; @@ -39,11 +41,6 @@ namespace Kyoo.Controllers return obj; } - protected override Task Validate(ProviderID ressource) - { - return Task.CompletedTask; - } - public override async Task Delete(ProviderID obj) { if (obj == null) diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index 4875ed85..4b6bf1bb 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -98,6 +98,8 @@ namespace Kyoo.Controllers if (obj.ShowID <= 0) throw new InvalidOperationException($"Can't store a season not related to any show (showID: {obj.ShowID})."); + await base.Validate(obj); + if (obj.ExternalIDs != null) { foreach (MetadataID link in obj.ExternalIDs) diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index a23d6c35..6f01d2cb 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -97,7 +97,7 @@ namespace Kyoo.Controllers foreach (GenreLink entry in obj.GenreLinks) _database.Entry(entry).State = EntityState.Added; if (obj.People != null) - foreach (PeopleLink entry in obj.People) + foreach (PeopleRole entry in obj.People) _database.Entry(entry).State = EntityState.Added; if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) @@ -109,6 +109,8 @@ namespace Kyoo.Controllers protected override async Task Validate(Show obj) { + await base.Validate(obj); + if (obj.Studio != null) obj.Studio = await _studios.CreateIfNotExists(obj.Studio); @@ -117,7 +119,7 @@ namespace Kyoo.Controllers link.Genre = await _genres.CreateIfNotExists(link.Genre); if (obj.People != null) - foreach (PeopleLink link in obj.People) + foreach (PeopleRole link in obj.People) link.People = await _people.CreateIfNotExists(link.People); if (obj.ExternalIDs != null) @@ -157,7 +159,7 @@ namespace Kyoo.Controllers _database.Entry(entry).State = EntityState.Deleted; if (obj.People != null) - foreach (PeopleLink entry in obj.People) + foreach (PeopleRole entry in obj.People) _database.Entry(entry).State = EntityState.Deleted; if (obj.ExternalIDs != null) diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index e2680341..30dd1b1f 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -38,11 +38,6 @@ namespace Kyoo.Controllers return obj; } - protected override Task Validate(Studio ressource) - { - return Task.CompletedTask; - } - public override async Task Delete(Studio obj) { if (obj == null) diff --git a/Kyoo/Controllers/ThumbnailsManager.cs b/Kyoo/Controllers/ThumbnailsManager.cs index ba40992a..cb457467 100644 --- a/Kyoo/Controllers/ThumbnailsManager.cs +++ b/Kyoo/Controllers/ThumbnailsManager.cs @@ -57,7 +57,7 @@ namespace Kyoo.Controllers return show; } - public async Task> Validate(IEnumerable people, bool alwaysDownload) + public async Task> Validate(IEnumerable people, bool alwaysDownload) { if (people == null) return null; @@ -65,7 +65,7 @@ namespace Kyoo.Controllers string root = _config.GetValue("peoplePath"); Directory.CreateDirectory(root); - foreach (PeopleLink peop in people) + foreach (PeopleRole peop in people) { string localPath = Path.Combine(root, peop.People.Slug + ".jpg"); if (peop.People.Poster == null) diff --git a/Kyoo/Models/DatabaseContext.cs b/Kyoo/Models/DatabaseContext.cs index e730ca69..883ac77d 100644 --- a/Kyoo/Models/DatabaseContext.cs +++ b/Kyoo/Models/DatabaseContext.cs @@ -69,7 +69,7 @@ namespace Kyoo public DbSet Providers { get; set; } public DbSet MetadataIds { get; set; } - public DbSet PeopleRoles { get; set; } + public DbSet PeopleRoles { get; set; } // This is used because EF doesn't support Many-To-Many relationships so for now we need to override the getter/setters to store this. @@ -134,7 +134,7 @@ namespace Kyoo .Ignore(x => x.Libraries) .Ignore(x => x.Collections); - modelBuilder.Entity() + modelBuilder.Entity() .Ignore(x => x.Slug) .Ignore(x => x.Name) .Ignore(x => x.Poster) diff --git a/Kyoo/Tasks/MetadataLoader.cs b/Kyoo/Tasks/MetadataLoader.cs index 1fb923d9..a6ae96af 100644 --- a/Kyoo/Tasks/MetadataLoader.cs +++ b/Kyoo/Tasks/MetadataLoader.cs @@ -22,8 +22,13 @@ namespace Kyoo.Tasks using IServiceScope serviceScope = serviceProvider.CreateScope(); IProviderRepository providers = serviceScope.ServiceProvider.GetService(); IPluginManager pluginManager = serviceScope.ServiceProvider.GetService(); + foreach (IMetadataProvider provider in pluginManager.GetPlugins()) + { + if (string.IsNullOrEmpty(provider.Provider.Slug)) + throw new ArgumentException($"Empty provider slug (name: {provider.Provider.Name})."); await providers.CreateIfNotExists(provider.Provider); + } } public Task> GetPossibleParameters() diff --git a/Kyoo/Views/API/ShowApi.cs b/Kyoo/Views/API/ShowApi.cs index e5af30a7..76d5436e 100644 --- a/Kyoo/Views/API/ShowApi.cs +++ b/Kyoo/Views/API/ShowApi.cs @@ -154,7 +154,7 @@ namespace Kyoo.Api [HttpGet("{showID:int}/people")] [Authorize(Policy = "Read")] - public async Task>> GetPeople(int showID, + public async Task>> GetPeople(int showID, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, @@ -166,9 +166,9 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetPeopleFromShow(showID, - ApiHelper.ParseWhere(where), - new Sort(sortBy), + ICollection ressources = await _libraryManager.GetPeopleFromShow(showID, + ApiHelper.ParseWhere(where), + new Sort(sortBy), new Pagination(limit, afterID)); return Page(ressources, limit); @@ -185,7 +185,7 @@ namespace Kyoo.Api [HttpGet("{slug}/people")] [Authorize(Policy = "Read")] - public async Task>> GetPeople(string slug, + public async Task>> GetPeople(string slug, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, @@ -197,9 +197,9 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetPeopleFromShow(slug, - ApiHelper.ParseWhere(where), - new Sort(sortBy), + ICollection ressources = await _libraryManager.GetPeopleFromShow(slug, + ApiHelper.ParseWhere(where), + new Sort(sortBy), new Pagination(limit, afterID)); return Page(ressources, limit);