diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index 129db913..c627d715 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -191,6 +191,46 @@ namespace Kyoo.Controllers Expression> sort, Pagination limit = default ) => GetCollectionsFromShow(showSlug, where, new Sort(sort), limit); + + Task> GetShowsFromLibrary(int id, + Expression> where = null, + Sort sort = default, + Pagination limit = default); + Task> GetShowsFromLibrary(int id, + [Optional] Expression> where, + Expression> sort, + Pagination limit = default + ) => GetShowsFromLibrary(id, where, new Sort(sort), limit); + + Task> GetShowsFromLibrary(string slug, + Expression> where = null, + Sort sort = default, + Pagination limit = default); + Task> GetShowsFromLibrary(string slug, + [Optional] Expression> where, + Expression> sort, + Pagination limit = default + ) => GetShowsFromLibrary(slug, where, new Sort(sort), limit); + + Task> GetCollectionsFromLibrary(int id, + Expression> where = null, + Sort sort = default, + Pagination limit = default); + Task> GetCollectionsFromLibrary(int id, + [Optional] Expression> where, + Expression> sort, + Pagination limit = default + ) => GetCollectionsFromLibrary(id, where, new Sort(sort), limit); + + Task> GetCollectionsFromLibrary(string showSlug, + Expression> where = null, + Sort sort = default, + Pagination limit = default); + Task> GetCollectionsFromLibrary(string showSlug, + [Optional] Expression> where, + Expression> sort, + Pagination limit = default + ) => GetCollectionsFromLibrary(showSlug, where, new Sort(sort), limit); // Helpers diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index c273a89a..4cde8d27 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -102,6 +102,46 @@ namespace Kyoo.Controllers public interface IShowRepository : IRepository { Task AddShowLink(int showID, int? libraryID, int? collectionID); + + Task> GetFromLibrary(int id, + Expression> where = null, + Sort sort = default, + Pagination limit = default); + Task> GetFromLibrary(int id, + [Optional] Expression> where, + Expression> sort, + Pagination limit = default + ) => GetFromLibrary(id, where, new Sort(sort), limit); + + Task> GetFromLibrary(string slug, + Expression> where = null, + Sort sort = default, + Pagination limit = default); + Task> GetFromLibrary(string slug, + [Optional] Expression> where, + Expression> sort, + Pagination limit = default + ) => GetFromLibrary(slug, where, new Sort(sort), limit); + + // Task> GetFromCollection(int id, + // Expression> where = null, + // Sort sort = default, + // Pagination limit = default); + // Task> GetFromCollection(int id, + // [Optional] Expression> where, + // Expression> sort, + // Pagination limit = default + // ) => GetFromCollection(id, where, new Sort(sort), limit); + // + // Task> GetFromCollection(string slug, + // Expression> where = null, + // Sort sort = default, + // Pagination limit = default); + // Task> GetFromCollection(string slug, + // [Optional] Expression> where, + // Expression> sort, + // Pagination limit = default + // ) => GetFromCollection(slug, where, new Sort(sort), limit); } public interface ISeasonRepository : IRepository @@ -238,6 +278,26 @@ namespace Kyoo.Controllers Expression> sort, Pagination limit = default ) => GetFromShow(showSlug, where, new Sort(sort), limit); + + Task> GetFromLibrary(int id, + Expression> where = null, + Sort sort = default, + Pagination limit = default); + Task> GetFromLibrary(int id, + [Optional] Expression> where, + Expression> sort, + Pagination limit = default + ) => GetFromLibrary(id, where, new Sort(sort), limit); + + Task> GetFromLibrary(string slug, + Expression> where = null, + Sort sort = default, + Pagination limit = default); + Task> GetFromLibrary(string slug, + [Optional] Expression> where, + Expression> sort, + Pagination limit = default + ) => GetFromLibrary(slug, where, new Sort(sort), limit); } public interface IGenreRepository : IRepository diff --git a/Kyoo.Common/Controllers/Implementations/LibraryManager.cs b/Kyoo.Common/Controllers/Implementations/LibraryManager.cs index 0148b953..d9ffc4d0 100644 --- a/Kyoo.Common/Controllers/Implementations/LibraryManager.cs +++ b/Kyoo.Common/Controllers/Implementations/LibraryManager.cs @@ -329,6 +329,38 @@ namespace Kyoo.Controllers return CollectionRepository.GetFromShow(showSlug, where, sort, limit); } + public Task> GetShowsFromLibrary(int id, + Expression> where = null, + Sort sort = default, + Pagination limit = default) + { + return ShowRepository.GetFromLibrary(id, where, sort, limit); + } + + public Task> GetShowsFromLibrary(string slug, + Expression> where = null, + Sort sort = default, + Pagination limit = default) + { + return ShowRepository.GetFromLibrary(slug, where, sort, limit); + } + + public Task> GetCollectionsFromLibrary(int id, + Expression> where = null, + Sort sort = default, + Pagination limit = default) + { + return CollectionRepository.GetFromLibrary(id, where, sort, limit); + } + + public Task> GetCollectionsFromLibrary(string slug, + Expression> where = null, + Sort sort = default, + Pagination limit = default) + { + return CollectionRepository.GetFromLibrary(slug, where, sort, limit); + } + public Task AddShowLink(int showID, int? libraryID, int? collectionID) { return ShowRepository.AddShowLink(showID, libraryID, collectionID); diff --git a/Kyoo.CommonAPI/CrudApi.cs b/Kyoo.CommonAPI/CrudApi.cs index 55d1ae33..8cca2f79 100644 --- a/Kyoo.CommonAPI/CrudApi.cs +++ b/Kyoo.CommonAPI/CrudApi.cs @@ -1,15 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Linq.Expressions; -using System.Runtime.InteropServices; using System.Threading.Tasks; using Kyoo.Controllers; using Kyoo.Models; using Kyoo.Models.Exceptions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Configuration; namespace Kyoo.CommonApi @@ -29,7 +26,7 @@ namespace Kyoo.CommonApi [HttpGet("{id:int}")] [Authorize(Policy = "Read")] [JsonDetailed] - public async Task> Get(int id) + public virtual async Task> Get(int id) { T ressource = await _repository.Get(id); if (ressource == null) @@ -41,7 +38,7 @@ namespace Kyoo.CommonApi [HttpGet("{slug}")] [Authorize(Policy = "Read")] [JsonDetailed] - public async Task> Get(string slug) + public virtual async Task> Get(string slug) { T ressource = await _repository.Get(slug); if (ressource == null) @@ -52,7 +49,7 @@ namespace Kyoo.CommonApi [HttpGet] [Authorize(Policy = "Read")] - public async Task>> GetAll([FromQuery] string sortBy, + public virtual async Task>> GetAll([FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, [FromQuery] int limit = 20) @@ -86,12 +83,16 @@ namespace Kyoo.CommonApi [HttpPost] [Authorize(Policy = "Write")] - public async Task> Create([FromBody] T ressource) + public virtual async Task> Create([FromBody] T ressource) { try { return await _repository.Create(ressource); } + catch (ArgumentException ex) + { + return BadRequest(new {Error = ex.Message}); + } catch (DuplicatedItemException) { T existing = await _repository.Get(ressource.Slug); @@ -101,21 +102,22 @@ namespace Kyoo.CommonApi [HttpPut] [Authorize(Policy = "Write")] - public async Task> Edit([FromQuery] bool resetOld, [FromBody] T ressource) + public virtual async Task> Edit([FromQuery] bool resetOld, [FromBody] T ressource) { - if (ressource.ID <= 0) - { - T old = await _repository.Get(ressource.Slug); - if (old == null) - return NotFound(); - ressource.ID = old.ID; - } + if (ressource.ID > 0) + return await _repository.Edit(ressource, resetOld); + + T old = await _repository.Get(ressource.Slug); + if (old == null) + return NotFound(); + + ressource.ID = old.ID; return await _repository.Edit(ressource, resetOld); } [HttpPut("{id:int}")] [Authorize(Policy = "Write")] - public async Task> Edit(int id, [FromQuery] bool resetOld, [FromBody] T ressource) + public virtual async Task> Edit(int id, [FromQuery] bool resetOld, [FromBody] T ressource) { ressource.ID = id; try @@ -130,7 +132,7 @@ namespace Kyoo.CommonApi [HttpPut("{slug}")] [Authorize(Policy = "Write")] - public async Task> Edit(string slug, [FromQuery] bool resetOld, [FromBody] T ressource) + public virtual async Task> Edit(string slug, [FromQuery] bool resetOld, [FromBody] T ressource) { T old = await _repository.Get(slug); if (old == null) @@ -141,7 +143,7 @@ namespace Kyoo.CommonApi [HttpDelete("{id:int}")] [Authorize(Policy = "Write")] - public async Task Delete(int id) + public virtual async Task Delete(int id) { try { @@ -157,7 +159,7 @@ namespace Kyoo.CommonApi [HttpDelete("{slug}")] [Authorize(Policy = "Write")] - public async Task Delete(string slug) + public virtual async Task Delete(string slug) { try { diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index 1d66634a..84ddc900 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -14,12 +14,14 @@ namespace Kyoo.Controllers { private readonly DatabaseContext _database; private readonly Lazy _shows; + private readonly Lazy _libraries; protected override Expression> DefaultSort => x => x.Name; public CollectionRepository(DatabaseContext database, IServiceProvider services) : base(database) { _database = database; _shows = new Lazy(services.GetRequiredService); + _libraries = new Lazy(services.GetRequiredService); } public override void Dispose() @@ -27,6 +29,8 @@ namespace Kyoo.Controllers base.Dispose(); if (_shows.IsValueCreated) _shows.Value.Dispose(); + if (_libraries.IsValueCreated) + _libraries.Value.Dispose(); } public override async ValueTask DisposeAsync() @@ -34,6 +38,8 @@ namespace Kyoo.Controllers await _database.DisposeAsync(); if (_shows.IsValueCreated) await _shows.Value.DisposeAsync(); + if (_libraries.IsValueCreated) + await _libraries.Value.DisposeAsync(); } public override async Task> Search(string query) @@ -117,5 +123,39 @@ namespace Kyoo.Controllers throw new ItemNotFound(); return collections; } + + public async Task> GetFromLibrary(int id, + Expression> where = null, + Sort sort = default, + Pagination limit = default) + { + ICollection collections = await ApplyFilters(_database.LibraryLinks + .Where(x => x.LibraryID == id && x.CollectionID != null) + .Select(x => x.Collection), + where, + sort, + limit); + if (!collections.Any() && await _libraries.Value.Get(id) == null) + throw new ItemNotFound(); + return collections; + } + + public async Task> GetFromLibrary(string slug, + Expression> where = null, + Sort sort = default, + Pagination limit = default) + { + ICollection collections = await ApplyFilters(_database.LibraryLinks + .Where(x => x.Library.Slug == slug && x.CollectionID != null) + .Select(x => x.Collection), + where, + sort, + limit); + if (!collections.Any() && await _libraries.Value.Get(slug) == null) + throw new ItemNotFound(); + return collections; + } } + + } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index 43732277..5df3c071 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -78,6 +78,13 @@ namespace Kyoo.Controllers protected override async Task Validate(Library obj) { + if (string.IsNullOrEmpty(obj.Slug)) + throw new ArgumentException("The library's slug must be set and not empty"); + if (string.IsNullOrEmpty(obj.Name)) + throw new ArgumentException("The library's name must be set and not empty"); + if (obj.Paths == null || !obj.Paths.Any()) + throw new ArgumentException("The library should have a least one path."); + if (obj.ProviderLinks != null) foreach (ProviderLink link in obj.ProviderLinks) link.Provider = await _providers.CreateIfNotExists(link.Provider); diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 5d9f3af8..2c0e1a16 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -19,6 +19,8 @@ namespace Kyoo.Controllers private readonly IProviderRepository _providers; private readonly Lazy _seasons; private readonly Lazy _episodes; + private readonly Lazy _libraries; + private readonly Lazy _collections; protected override Expression> DefaultSort => x => x.Title; public ShowRepository(DatabaseContext database, @@ -36,6 +38,8 @@ namespace Kyoo.Controllers _providers = providers; _seasons = new Lazy(services.GetRequiredService); _episodes = new Lazy(services.GetRequiredService); + _libraries = new Lazy(services.GetRequiredService); + _collections = new Lazy(services.GetRequiredService); } public override void Dispose() @@ -49,6 +53,10 @@ namespace Kyoo.Controllers _seasons.Value.Dispose(); if (_episodes.IsValueCreated) _episodes.Value.Dispose(); + if (_libraries.IsValueCreated) + _libraries.Value.Dispose(); + if (_collections.IsValueCreated) + _collections.Value.Dispose(); } public override async ValueTask DisposeAsync() @@ -62,6 +70,10 @@ namespace Kyoo.Controllers await _seasons.Value.DisposeAsync(); if (_episodes.IsValueCreated) await _episodes.Value.DisposeAsync(); + if (_libraries.IsValueCreated) + await _libraries.Value.DisposeAsync(); + if (_collections.IsValueCreated) + await _collections.Value.DisposeAsync(); } public override async Task> Search(string query) @@ -181,5 +193,37 @@ namespace Kyoo.Controllers if (obj.Episodes != null) await _episodes.Value.DeleteRange(obj.Episodes); } + + public async Task> GetFromLibrary(int id, + Expression> where = null, + Sort sort = default, + Pagination limit = default) + { + ICollection shows = await ApplyFilters(_database.LibraryLinks + .Where(x => x.LibraryID == id && x.ShowID != null) + .Select(x => x.Show), + where, + sort, + limit); + if (!shows.Any() && await _libraries.Value.Get(id) == null) + throw new ItemNotFound(); + return shows; + } + + public async Task> GetFromLibrary(string slug, + Expression> where = null, + Sort sort = default, + Pagination limit = default) + { + ICollection shows = await ApplyFilters(_database.LibraryLinks + .Where(x => x.Library.Slug == slug && x.ShowID != null) + .Select(x => x.Show), + where, + sort, + limit); + if (!shows.Any() && await _libraries.Value.Get(slug) == null) + throw new ItemNotFound(); + return shows; + } } } \ No newline at end of file diff --git a/Kyoo/Views/API/LibrariesAPI.cs b/Kyoo/Views/API/LibrariesAPI.cs deleted file mode 100644 index eeeee468..00000000 --- a/Kyoo/Views/API/LibrariesAPI.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Kyoo.Controllers; -using Kyoo.Models; -using Microsoft.AspNetCore.Mvc; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; - -namespace Kyoo.Api -{ - [Route("api/libraries")] - [Route("api/library")] - [ApiController] - public class LibrariesAPI : ControllerBase - { - private readonly ILibraryManager _libraryManager; - private readonly ITaskManager _taskManager; - - public LibrariesAPI(ILibraryManager libraryManager, ITaskManager taskManager) - { - _libraryManager = libraryManager; - _taskManager = taskManager; - } - - [HttpGet] - public async Task> GetLibraries() - { - return await _libraryManager.GetLibraries(); - } - - [Route("/api/library/create")] - [HttpPost] - [Authorize(Policy="Admin")] - public async Task CreateLibrary([FromBody] Library library) - { - if (!ModelState.IsValid) - return BadRequest(library); - if (string.IsNullOrEmpty(library.Slug)) - return BadRequest(new {error = "The library's slug must be set and not empty"}); - if (string.IsNullOrEmpty(library.Name)) - return BadRequest(new {error = "The library's name must be set and not empty"}); - if (library.Paths == null || !library.Paths.Any()) - return BadRequest(new {error = "The library should have a least one path."}); - if (await _libraryManager.GetLibrary(library.Slug) != null) - return BadRequest(new {error = "Duplicated library slug"}); - await _libraryManager.RegisterLibrary(library); - _taskManager.StartTask("scan", library.Slug); - return Ok(); - } - - [HttpGet("{librarySlug}")] - [Authorize(Policy="Read")] - public async Task>> GetShows(string librarySlug) - { - Library library = await _libraryManager.GetLibrary(librarySlug); - - if (library == null) - return NotFound(); - - return library.Shows.Concat(library.Collections.Select(x => x.AsShow())).ToList(); - } - } -} \ No newline at end of file diff --git a/Kyoo/Views/API/LibrariesApi.cs b/Kyoo/Views/API/LibrariesApi.cs new file mode 100644 index 00000000..055df5b9 --- /dev/null +++ b/Kyoo/Views/API/LibrariesApi.cs @@ -0,0 +1,236 @@ +using System; +using System.Collections.Generic; +using Kyoo.Controllers; +using Kyoo.Models; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using Kyoo.CommonApi; +using Kyoo.Models.Exceptions; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Configuration; + +namespace Kyoo.Api +{ + [Route("api/library")] + [Route("api/libraries")] + [ApiController] + public class LibrariesAPI : CrudApi + { + private readonly ILibraryManager _libraryManager; + private readonly ITaskManager _taskManager; + + public LibrariesAPI(ILibraryManager libraryManager, ITaskManager taskManager, IConfiguration configuration) + : base(libraryManager.LibraryRepository, configuration) + { + _libraryManager = libraryManager; + _taskManager = taskManager; + } + + [Authorize(Policy = "Admin")] + public override async Task> Create(Library ressource) + { + ActionResult result = await base.Create(ressource); + if (result.Value != null) + _taskManager.StartTask("scan", result.Value.Slug); + return result; + } + + [HttpGet("{id:int}/show")] + [HttpGet("{id:int}/shows")] + [Authorize(Policy = "Read")] + public async Task>> GetShows(int id, + [FromQuery] string sortBy, + [FromQuery] int afterID, + [FromQuery] Dictionary where, + [FromQuery] int limit = 50) + { + where.Remove("id"); + where.Remove("sortBy"); + where.Remove("limit"); + where.Remove("afterID"); + + try + { + ICollection ressources = await _libraryManager.GetShowsFromLibrary(id, + ApiHelper.ParseWhere(where), + new Sort(sortBy), + new Pagination(limit, afterID)); + + return Page(ressources, limit); + } + catch (ItemNotFound) + { + return NotFound(); + } + catch (ArgumentException ex) + { + return BadRequest(new {Error = ex.Message}); + } + } + + [HttpGet("{slug}/show")] + [HttpGet("{slug}/shows")] + [Authorize(Policy = "Read")] + public async Task>> GetShows(string slug, + [FromQuery] string sortBy, + [FromQuery] int afterID, + [FromQuery] Dictionary where, + [FromQuery] int limit = 20) + { + where.Remove("slug"); + where.Remove("sortBy"); + where.Remove("limit"); + where.Remove("afterID"); + + try + { + ICollection ressources = await _libraryManager.GetShowsFromLibrary(slug, + ApiHelper.ParseWhere(where), + new Sort(sortBy), + new Pagination(limit, afterID)); + + return Page(ressources, limit); + } + catch (ItemNotFound) + { + return NotFound(); + } + catch (ArgumentException ex) + { + return BadRequest(new {Error = ex.Message}); + } + } + + [HttpGet("{id:int}/collection")] + [HttpGet("{id:int}/collections")] + [Authorize(Policy = "Read")] + public async Task>> GetCollections(int id, + [FromQuery] string sortBy, + [FromQuery] int afterID, + [FromQuery] Dictionary where, + [FromQuery] int limit = 50) + { + where.Remove("id"); + where.Remove("sortBy"); + where.Remove("limit"); + where.Remove("afterID"); + + try + { + ICollection ressources = await _libraryManager.GetCollectionsFromLibrary(id, + ApiHelper.ParseWhere(where), + new Sort(sortBy), + new Pagination(limit, afterID)); + + return Page(ressources, limit); + } + catch (ItemNotFound) + { + return NotFound(); + } + catch (ArgumentException ex) + { + return BadRequest(new {Error = ex.Message}); + } + } + + [HttpGet("{slug}/collection")] + [HttpGet("{slug}/collections")] + [Authorize(Policy = "Read")] + public async Task>> GetCollections(string slug, + [FromQuery] string sortBy, + [FromQuery] int afterID, + [FromQuery] Dictionary where, + [FromQuery] int limit = 20) + { + where.Remove("slug"); + where.Remove("sortBy"); + where.Remove("limit"); + where.Remove("afterID"); + + try + { + ICollection ressources = await _libraryManager.GetCollectionsFromLibrary(slug, + ApiHelper.ParseWhere(where), + new Sort(sortBy), + new Pagination(limit, afterID)); + + return Page(ressources, limit); + } + catch (ItemNotFound) + { + return NotFound(); + } + catch (ArgumentException ex) + { + return BadRequest(new {Error = ex.Message}); + } + } + + // [HttpGet("{id:int}/item")] + // [HttpGet("{id:int}/items")] + // [Authorize(Policy = "Read")] + // public async Task>> GetItems(int id, + // [FromQuery] string sortBy, + // [FromQuery] int afterID, + // [FromQuery] Dictionary where, + // [FromQuery] int limit = 50) + // { + // where.Remove("id"); + // where.Remove("sortBy"); + // where.Remove("limit"); + // where.Remove("afterID"); + // + // try + // { + // ICollection ressources = await _libraryManager.GetItemsFromLibrary(id, + // ApiHelper.ParseWhere(where), + // new Sort(sortBy), + // new Pagination(limit, afterID)); + // + // return Page(ressources, limit); + // } + // catch (ItemNotFound) + // { + // return NotFound(); + // } + // catch (ArgumentException ex) + // { + // return BadRequest(new {Error = ex.Message}); + // } + // } + // + // [HttpGet("{slug}/collection")] + // [HttpGet("{slug}/collections")] + // [Authorize(Policy = "Read")] + // public async Task>> GetCollections(string slug, + // [FromQuery] string sortBy, + // [FromQuery] int afterID, + // [FromQuery] Dictionary where, + // [FromQuery] int limit = 20) + // { + // where.Remove("slug"); + // where.Remove("sortBy"); + // where.Remove("limit"); + // where.Remove("afterID"); + // + // try + // { + // ICollection ressources = await _libraryManager.GetCollectionsFromLibrary(slug, + // ApiHelper.ParseWhere(where), + // new Sort(sortBy), + // new Pagination(limit, afterID)); + // + // return Page(ressources, limit); + // } + // catch (ItemNotFound) + // { + // return NotFound(); + // } + // catch (ArgumentException ex) + // { + // return BadRequest(new {Error = ex.Message}); + // } + // } + } +} \ No newline at end of file diff --git a/Kyoo/Views/API/ShowsApi.cs b/Kyoo/Views/API/ShowsApi.cs index 012b1931..bda73f63 100644 --- a/Kyoo/Views/API/ShowsApi.cs +++ b/Kyoo/Views/API/ShowsApi.cs @@ -18,8 +18,7 @@ namespace Kyoo.Api { private readonly ILibraryManager _libraryManager; - public ShowsApi(ILibraryManager libraryManager, - IConfiguration configuration) + public ShowsApi(ILibraryManager libraryManager, IConfiguration configuration) : base(libraryManager.ShowRepository, configuration) { _libraryManager = libraryManager; diff --git a/Kyoo/appsettings.json b/Kyoo/appsettings.json index 10101c80..6463ba2a 100644 --- a/Kyoo/appsettings.json +++ b/Kyoo/appsettings.json @@ -33,5 +33,5 @@ "plugins": "plugins/", "defaultPermissions": "read,play,write,admin", "newUserPermissions": "read,play,write,admin", - "regex": "(?:\\/(?.*?))?\\/(?.*)(?: \\(\\d+\\))?\\/\\k(?: \\(\\d+\\))?(?:(?: S(?\\d+)E(?\\d+))| (?\\d+))?.*$" + "regex": "(?:\\/(?.*?))?\\/(?.*?)(?: \\(\\d+\\))?\\/\\k(?: \\(\\d+\\))?(?:(?: S(?\\d+)E(?\\d+))| (?\\d+))?.*$" } \ No newline at end of file