diff --git a/Kyoo.Common/Controllers/IMetadataProvider.cs b/Kyoo.Common/Controllers/IMetadataProvider.cs index 60e56da8..0bcf2193 100644 --- a/Kyoo.Common/Controllers/IMetadataProvider.cs +++ b/Kyoo.Common/Controllers/IMetadataProvider.cs @@ -8,18 +8,14 @@ namespace Kyoo.Controllers { public string Name { get; } - //For the collection Task GetCollectionFromName(string name); - //For the show Task GetShowByID(Show show); - Task GetShowFromName(string showName, bool isMovie); + Task> GetShowsFromName(string showName, bool isMovie); Task> GetPeople(Show show); - //For the seasons Task GetSeason(Show show, long seasonNumber); - //For the episodes Task GetEpisode(Show show, long seasonNumber, long episodeNumber, long absoluteNumber); } } diff --git a/Kyoo.Common/Controllers/IProviderManager.cs b/Kyoo.Common/Controllers/IProviderManager.cs index d57a584f..303506ed 100644 --- a/Kyoo.Common/Controllers/IProviderManager.cs +++ b/Kyoo.Common/Controllers/IProviderManager.cs @@ -7,7 +7,8 @@ namespace Kyoo.Controllers public interface IProviderManager { Task GetCollectionFromName(string name, Library library); - Task GetShowFromName(string showName, string showPath, bool isMovie, Library library); + Task SearchShow(string showName, bool isMovie, Library library); + Task> SearchShows(string showName, bool isMovie, Library library); Task GetSeason(Show show, long seasonNumber, Library library); Task GetEpisode(Show show, string episodePath, long seasonNumber, long episodeNumber, long absoluteNumber, Library library); Task> GetPeople(Show show, Library library); diff --git a/Kyoo.Common/Controllers/IThumbnailsManager.cs b/Kyoo.Common/Controllers/IThumbnailsManager.cs index aa9fa196..75188809 100644 --- a/Kyoo.Common/Controllers/IThumbnailsManager.cs +++ b/Kyoo.Common/Controllers/IThumbnailsManager.cs @@ -7,7 +7,7 @@ namespace Kyoo.Controllers public interface IThumbnailsManager { Task Validate(Show show); - Task> Validate(List actors); + Task> Validate(IEnumerable actors); Task Validate(Episode episode); } } diff --git a/Kyoo.Common/Kyoo.Common.csproj b/Kyoo.Common/Kyoo.Common.csproj index f286e422..a6a6e838 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.13 + 1.0.14 diff --git a/Kyoo/Controllers/ProviderManager.cs b/Kyoo/Controllers/ProviderManager.cs index fcc4cc75..af8ae26e 100644 --- a/Kyoo/Controllers/ProviderManager.cs +++ b/Kyoo/Controllers/ProviderManager.cs @@ -9,15 +9,14 @@ namespace Kyoo.Controllers public class ProviderManager : IProviderManager { private readonly IEnumerable _providers; - private readonly IThumbnailsManager _thumbnailsManager; - public ProviderManager(IThumbnailsManager thumbnailsManager, IPluginManager pluginManager) + public ProviderManager(IPluginManager pluginManager) { - _thumbnailsManager = thumbnailsManager; _providers = pluginManager.GetPlugins(); } - public async Task GetMetadata(Func> providerCall, Library library, string what) where T : IMergable, new() + private async Task GetMetadata(Func> providerCall, Library library, string what) + where T : IMergable, new() { T ret = new T(); @@ -36,8 +35,8 @@ namespace Kyoo.Controllers } return ret; } - - public async Task> GetMetadata(Func>> providerCall, Library library, string what) + + private async Task> GetMetadata(Func>> providerCall, Library library, string what) { List ret = new List(); @@ -65,16 +64,26 @@ namespace Kyoo.Controllers return collection; } - public async Task GetShowFromName(string showName, string showPath, bool isMovie, Library library) + public async Task SearchShow(string showName, bool isMovie, Library library) { - Show show = await GetMetadata(provider => provider.GetShowFromName(showName, isMovie), library, $"the show {showName}"); - show.Path = showPath; + Show show = await GetMetadata(async provider => (await provider.GetShowsFromName(showName, isMovie))?.FirstOrDefault(), library, $"the show {showName}"); show.Slug = Utility.ToSlug(showName); show.Title ??= showName; show.IsMovie = isMovie; - await _thumbnailsManager.Validate(show); return show; } + + public async Task> SearchShows(string showName, bool isMovie, Library library) + { + IEnumerable shows = await GetMetadata(provider => provider.GetShowsFromName(showName, isMovie), library, $"the show {showName}"); + return shows.Select(show => + { + show.Slug = Utility.ToSlug(showName); + show.Title ??= showName; + show.IsMovie = isMovie; + return show; + }); + } public async Task GetSeason(Show show, long seasonNumber, Library library) { @@ -93,14 +102,12 @@ namespace Kyoo.Controllers episode.SeasonNumber = episode.SeasonNumber != -1 ? episode.SeasonNumber : seasonNumber; episode.EpisodeNumber = episode.EpisodeNumber != -1 ? episode.EpisodeNumber : episodeNumber; episode.AbsoluteNumber = episode.AbsoluteNumber != -1 ? episode.AbsoluteNumber : absoluteNumber; - await _thumbnailsManager.Validate(episode); return episode; } public async Task> GetPeople(Show show, Library library) { IEnumerable people = await GetMetadata(provider => provider.GetPeople(show), library, $"a cast member of {show.Title}"); - people = await _thumbnailsManager.Validate(people.ToList()); return people; } } diff --git a/Kyoo/Controllers/ThumbnailsManager.cs b/Kyoo/Controllers/ThumbnailsManager.cs index 9388ff1e..ec059677 100644 --- a/Kyoo/Controllers/ThumbnailsManager.cs +++ b/Kyoo/Controllers/ThumbnailsManager.cs @@ -68,7 +68,7 @@ namespace Kyoo.Controllers return show; } - public async Task> Validate(List people) + public async Task> Validate(IEnumerable people) { if (people == null) return null; diff --git a/Kyoo/Tasks/Crawler.cs b/Kyoo/Tasks/Crawler.cs index d856e97d..c4ca99a7 100644 --- a/Kyoo/Tasks/Crawler.cs +++ b/Kyoo/Tasks/Crawler.cs @@ -22,6 +22,7 @@ namespace Kyoo.Controllers public int Priority => 0; private ILibraryManager _libraryManager; + private IThumbnailsManager _thumbnailsManager; private IProviderManager _metadataProvider; private ITranscoder _transcoder; private IConfiguration _config; @@ -41,6 +42,7 @@ namespace Kyoo.Controllers { using IServiceScope serviceScope = serviceProvider.CreateScope(); _libraryManager = serviceScope.ServiceProvider.GetService(); + _thumbnailsManager = serviceScope.ServiceProvider.GetService(); _metadataProvider = serviceScope.ServiceProvider.GetService(); _transcoder = serviceScope.ServiceProvider.GetService(); _config = serviceScope.ServiceProvider.GetService(); @@ -129,18 +131,21 @@ namespace Kyoo.Controllers Show show = _libraryManager.GetShow(showPath); if (show != null) return show; - show = await _metadataProvider.GetShowFromName(showTitle, showPath, isMovie, library); + show = await _metadataProvider.SearchShow(showTitle, isMovie, library); + show.Path = showPath; show.People = (await _metadataProvider.GetPeople(show, library)).GroupBy(x => x.Slug).Select(x => x.First()) .Select(x => { People existing = _libraryManager.GetPeopleBySlug(x.Slug); return existing != null ? new PeopleLink(existing, show, x.Role, x.Type) : x; }).ToList(); + show.People = await _thumbnailsManager.Validate(show.People); show.Genres = show.Genres.Select(x => { Genre existing = _libraryManager.GetGenreBySlug(x.Slug); return existing ?? x; }); + await _thumbnailsManager.Validate(show); return show; } @@ -166,7 +171,8 @@ namespace Kyoo.Controllers Console.Error.WriteLine("\tError: You don't have any provider that support absolute epiode numbering. Install one and try again."); return null; } - + + await _thumbnailsManager.Validate(episode); await GetTracks(episode); return episode; } @@ -193,16 +199,19 @@ namespace Kyoo.Controllers private static IEnumerable GetExtractedSubtitles(Episode episode) { - string path = Path.Combine(Path.GetDirectoryName(episode.Path), "Subtitles"); List tracks = new List(); + if (episode.Path == null) + return tracks; + string path = Path.Combine(Path.GetDirectoryName(episode.Path)!, "Subtitles"); + if (!Directory.Exists(path)) return tracks; foreach (string sub in Directory.EnumerateFiles(path, "", SearchOption.AllDirectories)) { string episodeLink = Path.GetFileNameWithoutExtension(episode.Path); - if (!sub.Contains(episodeLink)) + if (!sub.Contains(episodeLink!)) continue; string language = sub.Substring(Path.GetDirectoryName(sub).Length + episodeLink.Length + 2, 3); bool isDefault = sub.Contains("default"); diff --git a/Kyoo/Views/API/ShowsAPI.cs b/Kyoo/Views/API/ShowsAPI.cs index 5f1a8fa3..5edf1d61 100644 --- a/Kyoo/Views/API/ShowsAPI.cs +++ b/Kyoo/Views/API/ShowsAPI.cs @@ -1,6 +1,7 @@ using Kyoo.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; +using System.Threading.Tasks; using Kyoo.Controllers; using Kyoo.Models.Exceptions; using Microsoft.AspNetCore.Authorization; @@ -10,13 +11,15 @@ namespace Kyoo.Api [Route("api/shows")] [Route("api/show")] [ApiController] - public class ShowsController : ControllerBase + public class ShowsAPI : ControllerBase { private readonly ILibraryManager _libraryManager; + private readonly IProviderManager _providerManager; - public ShowsController(ILibraryManager libraryManager) + public ShowsAPI(ILibraryManager libraryManager, IProviderManager providerManager) { _libraryManager = libraryManager; + _providerManager = providerManager; } [HttpGet] @@ -57,5 +60,12 @@ namespace Kyoo.Api } return Ok(); } + + [HttpGet("identify/{name}")] + [Authorize(Policy = "Read")] + public async Task> IdentityShow(string name, [FromQuery] bool isMovie) + { + return await _providerManager.SearchShows(name, isMovie, null); + } } } diff --git a/Kyoo/Views/WebClient b/Kyoo/Views/WebClient index 16ebfac8..b77c04fa 160000 --- a/Kyoo/Views/WebClient +++ b/Kyoo/Views/WebClient @@ -1 +1 @@ -Subproject commit 16ebfac8ba9ea07715de8a3d1b99e0242db9518f +Subproject commit b77c04fa6e129bc8cf4f22489064509e02846071