Adding an identify route for shows

This commit is contained in:
Zoe Roux 2020-04-19 21:29:48 +02:00
parent f6a418ca26
commit 14227edf36
8 changed files with 43 additions and 14 deletions

View File

@ -27,6 +27,7 @@ namespace Kyoo.Controllers
IEnumerable<Show> SearchShows(string searchQuery); IEnumerable<Show> SearchShows(string searchQuery);
IEnumerable<Collection> SearchCollections(string searchQuery); IEnumerable<Collection> SearchCollections(string searchQuery);
Library GetLibrary(string librarySlug); Library GetLibrary(string librarySlug);
Library GetLibraryForShow(string showSlug);
IEnumerable<Library> GetLibraries(); IEnumerable<Library> GetLibraries();
IEnumerable<Studio> GetStudios(); IEnumerable<Studio> GetStudios();
Show GetShowBySlug(string slug); Show GetShowBySlug(string slug);

View File

@ -11,7 +11,7 @@ namespace Kyoo.Controllers
Task<Collection> GetCollectionFromName(string name); Task<Collection> GetCollectionFromName(string name);
Task<Show> GetShowByID(Show show); Task<Show> GetShowByID(Show show);
Task<IEnumerable<Show>> GetShowsFromName(string showName, bool isMovie); Task<IEnumerable<Show>> SearchShows(string showName, bool isMovie);
Task<IEnumerable<PeopleLink>> GetPeople(Show show); Task<IEnumerable<PeopleLink>> GetPeople(Show show);
Task<Season> GetSeason(Show show, long seasonNumber); Task<Season> GetSeason(Show show, long seasonNumber);

View File

@ -7,6 +7,7 @@ namespace Kyoo.Controllers
public interface IProviderManager public interface IProviderManager
{ {
Task<Collection> GetCollectionFromName(string name, Library library); Task<Collection> GetCollectionFromName(string name, Library library);
Task<Show> CompleteShow(Show show, Library library);
Task<Show> SearchShow(string showName, bool isMovie, Library library); Task<Show> SearchShow(string showName, bool isMovie, Library library);
Task<IEnumerable<Show>> SearchShows(string showName, bool isMovie, Library library); Task<IEnumerable<Show>> SearchShows(string showName, bool isMovie, Library library);
Task<Season> GetSeason(Show show, long seasonNumber, Library library); Task<Season> GetSeason(Show show, long seasonNumber, Library library);

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.14</PackageVersion> <PackageVersion>1.0.15</PackageVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -24,6 +24,11 @@ namespace Kyoo.Controllers
return _database.Libraries; return _database.Libraries;
} }
public Library GetLibraryForShow(string showSlug)
{
return _database.LibraryLinks.FirstOrDefault(x => x.Show.Slug == showSlug)?.Library;
}
public IEnumerable<string> GetLibrariesPath() public IEnumerable<string> GetLibrariesPath()
{ {
IEnumerable<string> paths = new List<string>(); IEnumerable<string> paths = new List<string>();

View File

@ -2,6 +2,7 @@
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
@ -20,14 +21,15 @@ namespace Kyoo.Controllers
{ {
T ret = new T(); T ret = new T();
if (library.Providers == null) IEnumerable<IMetadataProvider> providers = library?.Providers != null
return ret; ? _providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name))
: _providers;
foreach (IMetadataProvider provider in _providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name))) foreach (IMetadataProvider provider in providers)
{ {
try try
{ {
if (library.Providers.Contains(provider.Name)) 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.Name} coudln't work for {what}. Exception: {ex.Message}");
@ -40,14 +42,15 @@ namespace Kyoo.Controllers
{ {
List<T> ret = new List<T>(); List<T> ret = new List<T>();
if (library.Providers == null) IEnumerable<IMetadataProvider> providers = library?.Providers != null
return ret; ? _providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name))
: _providers;
foreach (IMetadataProvider provider in _providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name))) foreach (IMetadataProvider provider in providers)
{ {
try try
{ {
if (library.Providers.Contains(provider.Name)) 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.Name} coudln't work for {what}. Exception: {ex.Message}");
@ -64,9 +67,20 @@ namespace Kyoo.Controllers
return collection; return collection;
} }
public async Task<Show> CompleteShow(Show show, Library library)
{
return await GetMetadata(provider => provider.GetShowByID(show), library, $"the show {show.Title}");
}
public async Task<Show> SearchShow(string showName, bool isMovie, Library library) public async Task<Show> SearchShow(string showName, bool isMovie, Library library)
{ {
Show show = await GetMetadata(async provider => (await provider.GetShowsFromName(showName, isMovie))?.FirstOrDefault(), library, $"the show {showName}"); Show show = await GetMetadata(async provider =>
{
Show searchResult = (await provider.SearchShows(showName, isMovie))?.FirstOrDefault();
if (searchResult == null)
return null;
return await provider.GetShowByID(searchResult);
}, library, $"the show {showName}");
show.Slug = Utility.ToSlug(showName); show.Slug = Utility.ToSlug(showName);
show.Title ??= showName; show.Title ??= showName;
show.IsMovie = isMovie; show.IsMovie = isMovie;
@ -75,7 +89,7 @@ namespace Kyoo.Controllers
public async Task<IEnumerable<Show>> SearchShows(string showName, bool isMovie, Library library) public async Task<IEnumerable<Show>> SearchShows(string showName, bool isMovie, Library library)
{ {
IEnumerable<Show> shows = await GetMetadata(provider => provider.GetShowsFromName(showName, isMovie), library, $"the show {showName}"); IEnumerable<Show> shows = await GetMetadata(provider => provider.SearchShows(showName, isMovie), library, $"the show {showName}");
return shows.Select(show => return shows.Select(show =>
{ {
show.Slug = Utility.ToSlug(showName); show.Slug = Utility.ToSlug(showName);

View File

@ -52,8 +52,8 @@ namespace Kyoo
services.AddDbContext<DatabaseContext>(options => services.AddDbContext<DatabaseContext>(options =>
{ {
options.UseLazyLoadingProxies() options.UseLazyLoadingProxies()
.UseSqlite(_configuration.GetConnectionString("Database")) .UseSqlite(_configuration.GetConnectionString("Database"));
.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole())); //.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()));
}); });
services.AddDbContext<IdentityDatabase>(options => services.AddDbContext<IdentityDatabase>(options =>

View File

@ -67,5 +67,13 @@ namespace Kyoo.Api
{ {
return await _providerManager.SearchShows(name, isMovie, null); return await _providerManager.SearchShows(name, isMovie, null);
} }
[HttpGet("details")]
[Authorize(Policy = "Read")]
public async Task<Show> IdentityShow([FromBody] Show show)
{
Library library = _libraryManager.GetLibraryForShow(show.Slug);
return await _providerManager.CompleteShow(show, library);
}
} }
} }