diff --git a/Kyoo/ClientApp/src/app/services/library-resolver.service.ts b/Kyoo/ClientApp/src/app/services/library-resolver.service.ts index 7594a4fe..bfba2b67 100644 --- a/Kyoo/ClientApp/src/app/services/library-resolver.service.ts +++ b/Kyoo/ClientApp/src/app/services/library-resolver.service.ts @@ -27,7 +27,7 @@ export class LibraryResolverService implements Resolve } else { - return this.http.get("api/library/" + slug).pipe(catchError((error: HttpErrorResponse) => + return this.http.get("api/libraries/" + slug).pipe(catchError((error: HttpErrorResponse) => { console.log(error.status + " - " + error.message); if (error.status == 404) diff --git a/Kyoo/Controllers/LibrariesController.cs b/Kyoo/Controllers/LibrariesController.cs index 3775655d..a2c05df3 100644 --- a/Kyoo/Controllers/LibrariesController.cs +++ b/Kyoo/Controllers/LibrariesController.cs @@ -21,5 +21,16 @@ namespace Kyoo.Controllers { return libraryManager.GetLibraries(); } + + [HttpGet("{librarySlug}")] + public ActionResult> GetShows(string librarySlug) + { + Library library = libraryManager.GetLibrary(librarySlug); + + if (library == null) + return NotFound(); + + return libraryManager.GetShowsInLibrary(library.id); + } } } \ No newline at end of file diff --git a/Kyoo/Controllers/ShowsController.cs b/Kyoo/Controllers/ShowsController.cs index 8a0253c2..97f7ecae 100644 --- a/Kyoo/Controllers/ShowsController.cs +++ b/Kyoo/Controllers/ShowsController.cs @@ -19,7 +19,7 @@ namespace Kyoo.Controllers [HttpGet] public IEnumerable GetShows() { - return libraryManager.QueryShows(null); + return libraryManager.GetShows(); } [HttpGet("{slug}")] diff --git a/Kyoo/InternalAPI/LibraryManager/ILibraryManager.cs b/Kyoo/InternalAPI/LibraryManager/ILibraryManager.cs index 6a9bcb1a..4bcfd16a 100644 --- a/Kyoo/InternalAPI/LibraryManager/ILibraryManager.cs +++ b/Kyoo/InternalAPI/LibraryManager/ILibraryManager.cs @@ -8,7 +8,7 @@ namespace Kyoo.InternalAPI { //Read values string GetShowExternalIDs(long showID); - IEnumerable QueryShows(string selection); + IEnumerable GetShows(); Studio GetStudio(long showID); List GetDirectors(long showID); List GetPeople(long showID); @@ -16,6 +16,7 @@ namespace Kyoo.InternalAPI List GetSeasons(long showID); int GetSeasonCount(string showSlug, long seasonNumber); IEnumerable GetShowsInCollection(long collectionID); + List GetShowsInLibrary(long libraryID); IEnumerable GetShowsByPeople(long peopleID); IEnumerable GetLibrariesPath(); @@ -24,6 +25,7 @@ namespace Kyoo.InternalAPI Track GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag, bool forced); //Public read + Library GetLibrary(string librarySlug); IEnumerable GetLibraries(); Show GetShowBySlug(string slug); Season GetSeason(string showSlug, long seasonNumber); diff --git a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs index d73f505d..4c97659f 100644 --- a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs +++ b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs @@ -271,7 +271,23 @@ namespace Kyoo.InternalAPI } - public IEnumerable QueryShows(string selection) + public Library GetLibrary(string librarySlug) + { + string query = "SELECT * FROM libraries WHERE slug = $slug;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$slug", librarySlug); + SQLiteDataReader reader = cmd.ExecuteReader(); + + if (reader.Read()) + return Library.FromReader(reader); + else + return null; + } + } + + public IEnumerable GetShows() { List shows = new List(); SQLiteDataReader reader; @@ -580,6 +596,22 @@ namespace Kyoo.InternalAPI } } + public List GetShowsInLibrary(long libraryID) + { + List shows = new List(); + SQLiteDataReader reader; + string query = "SELECT id, slug, title, startYear, endYear, '0' FROM (SELECT id, slug, title, startYear, endYear, '0' FROM shows JOIN librariesLinks lb ON lb.showID = id WHERE lb.libraryID = $libraryID) LEFT JOIN collectionsLinks l ON l.showID = id WHERE l.showID IS NULL UNION SELECT id, slug, name, startYear, endYear, '1' FROM collections JOIN collectionsLinks l ON l.collectionID = collections.id JOIN librariesLinks lb ON lb.showID = l.showID WHERE lb.libraryID = $libraryID ORDER BY title;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$libraryID", libraryID); + reader = cmd.ExecuteReader(); + while (reader.Read()) + shows.Add(Show.FromQueryReader(reader)); + } + return shows; + } + public IEnumerable GetShowsByPeople(long peopleID) { string query = "SELECT * FROM shows JOIN peopleLinks l ON l.showID = shows.id WHERE l.peopleID = $id;"; diff --git a/Kyoo/Models/Library.cs b/Kyoo/Models/Library.cs index 200a7c1d..638091c9 100644 --- a/Kyoo/Models/Library.cs +++ b/Kyoo/Models/Library.cs @@ -2,7 +2,7 @@ namespace Kyoo.Models { - public struct Library + public class Library { [JsonIgnore] public readonly long id; public string Slug; diff --git a/Kyoo/Models/Show.cs b/Kyoo/Models/Show.cs index c6fb6784..634ef121 100644 --- a/Kyoo/Models/Show.cs +++ b/Kyoo/Models/Show.cs @@ -99,7 +99,7 @@ namespace Kyoo.Models Title = reader["title"] as string, StartYear = reader["startYear"] as long?, EndYear = reader["endYear"] as long?, - IsCollection = reader[4] as string == "1" + IsCollection = reader["'0'"] as string == "1" }; } diff --git a/Unit Tests/Kyoo-InternalAPI/Library-Tests.cs b/Unit Tests/Kyoo-InternalAPI/Library-Tests.cs new file mode 100644 index 00000000..9a6e86d6 --- /dev/null +++ b/Unit Tests/Kyoo-InternalAPI/Library-Tests.cs @@ -0,0 +1,26 @@ +using Kyoo.InternalAPI; +using Kyoo.Models; +using Microsoft.Extensions.Configuration; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UnitTests.Kyoo_InternalAPI +{ + public class LibraryTests + { + private IConfiguration config; + private ILibraryManager libraryManager; + + [SetUp] + public void Setup() + { + config = new ConfigurationBuilder() + .AddJsonFile("appsettings.json") + .Build(); + libraryManager = new LibraryManager(config); + } + } +} diff --git a/Unit Tests/Kyoo-InternalAPI/Thumbnails-Tests.cs b/Unit Tests/Kyoo-InternalAPI/Thumbnails-Tests.cs index 021bbdf0..8229a107 100644 --- a/Unit Tests/Kyoo-InternalAPI/Thumbnails-Tests.cs +++ b/Unit Tests/Kyoo-InternalAPI/Thumbnails-Tests.cs @@ -1,8 +1,6 @@ -using Kyoo; -using Kyoo.InternalAPI; +using Kyoo.InternalAPI; using Kyoo.InternalAPI.ThumbnailsManager; using Kyoo.Models; -using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.Configuration; using NUnit.Framework; using System.Diagnostics; @@ -12,7 +10,7 @@ using System.Threading.Tasks; namespace UnitTests.Kyoo_InternalAPI { - public class Tests + public class ThumbnailsTests { private IConfiguration config; @@ -29,7 +27,7 @@ namespace UnitTests.Kyoo_InternalAPI { LibraryManager library = new LibraryManager(config); ThumbnailsManager manager = new ThumbnailsManager(config); - Show show = library.GetShowBySlug(library.QueryShows(null).FirstOrDefault().Slug); + Show show = library.GetShowBySlug(library.GetShows().FirstOrDefault().Slug); Debug.WriteLine("&Show: " + show.Path); string posterPath = Path.Combine(show.Path, "poster.jpg"); File.Delete(posterPath);