diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index f97718db..c2aef739 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -10,6 +10,7 @@ namespace Kyoo.Controllers Library GetLibrary(string librarySlug); Collection GetCollection(string slug); Show GetShow(string slug); + Season GetSeason(string showSlug, long seasonNumber); Episode GetEpisode(string showSlug, long seasonNumber, long episodeNumber); Episode GetMovieEpisode(string movieSlug); Genre GetGenre(string slug); @@ -18,9 +19,12 @@ namespace Kyoo.Controllers // Get all IEnumerable GetLibraries(); + IEnumerable GetCollections(); IEnumerable GetShows(); IEnumerable GetEpisodes(); + IEnumerable GetTracks(); IEnumerable GetStudios(); + IEnumerable GetPeoples(); IEnumerable GetGenres(); // Search diff --git a/Kyoo/Controllers/LibraryManager.cs b/Kyoo/Controllers/LibraryManager.cs index 1ad9d559..f04fda4c 100644 --- a/Kyoo/Controllers/LibraryManager.cs +++ b/Kyoo/Controllers/LibraryManager.cs @@ -33,7 +33,12 @@ namespace Kyoo.Controllers { return _database.Shows.FirstOrDefault(show => show.Slug == slug); } - + + public Season GetSeason(string showSlug, long seasonNumber) + { + return _database.Seasons.FirstOrDefault(x => x.Show.Slug == showSlug && x.SeasonNumber == seasonNumber); + } + public Episode GetEpisode(string showSlug, long seasonNumber, long episodeNumber) { return _database.Episodes.FirstOrDefault(x => x.EpisodeNumber == episodeNumber @@ -67,10 +72,15 @@ namespace Kyoo.Controllers { return _database.Libraries; } - + + public IEnumerable GetCollections() + { + return _database.Collections; + } + public IEnumerable GetShows() { - return _database.LibraryLinks.AsEnumerable().Select(x => x.Show ?? x.Collection.AsShow()); + return _database.Shows; } public IEnumerable GetEpisodes() @@ -87,6 +97,17 @@ namespace Kyoo.Controllers { return _database.Studios; } + + public IEnumerable GetPeoples() + { + return _database.Peoples; + } + + public IEnumerable GetTracks() + { + return _database.Tracks; + } + #endregion #region GetHelper diff --git a/Kyoo/Views/API/ShowsAPI.cs b/Kyoo/Views/API/ShowsAPI.cs index 652773eb..d656130c 100644 --- a/Kyoo/Views/API/ShowsAPI.cs +++ b/Kyoo/Views/API/ShowsAPI.cs @@ -37,7 +37,7 @@ namespace Kyoo.Api [Authorize(Policy="Read")] public IEnumerable GetShows() { - return _libraryManager.GetShows(); + return _database.LibraryLinks.AsEnumerable().Select(x => x.Show ?? x.Collection.AsShow()); } [HttpGet("{slug}")] diff --git a/Kyoo/Views/API/SubtitleAPI.cs b/Kyoo/Views/API/SubtitleAPI.cs index 82034a16..df875fca 100644 --- a/Kyoo/Views/API/SubtitleAPI.cs +++ b/Kyoo/Views/API/SubtitleAPI.cs @@ -1,8 +1,8 @@ -using System; -using Kyoo.Models; +using Kyoo.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading.Tasks; using Kyoo.Controllers; using Microsoft.AspNetCore.Authorization; @@ -31,22 +31,21 @@ namespace Kyoo.Api Track subtitle = null; if (languageTag != null) - subtitle = _libraryManager.GetSubtitle(showSlug, seasonNumber, episodeNumber, languageTag, forced); + subtitle = _libraryManager.GetEpisode(showSlug, seasonNumber, episodeNumber)?.Tracks + .FirstOrDefault(x => x.Language == languageTag && x.IsForced == forced); if (subtitle == null) { string idString = identifier.IndexOf('-') != -1 ? identifier.Substring(0, identifier.IndexOf('-')) : identifier; long.TryParse(idString, out long id); - subtitle = _libraryManager.GetSubtitleById(id); + subtitle = _libraryManager.GetTracks().FirstOrDefault(x => x.ID == id); } if (subtitle == null) return NotFound(); - if (subtitle.Codec == "subrip" && extension == "vtt") //The request wants a WebVTT from a Subrip subtitle, convert it on the fly and send it. - { + if (subtitle.Codec == "subrip" && extension == "vtt") return new ConvertSubripToVtt(subtitle.Path); - } string mime; if (subtitle.Codec == "ass") @@ -54,7 +53,7 @@ namespace Kyoo.Api else mime = "application/x-subrip"; - //Should use appropriate mime type here + // TODO Should use appropriate mime type here return PhysicalFile(subtitle.Path, mime); } @@ -63,15 +62,15 @@ namespace Kyoo.Api public async Task ExtractSubtitle(string showSlug, long seasonNumber, long episodeNumber) { Episode episode = _libraryManager.GetEpisode(showSlug, seasonNumber, episodeNumber); - _libraryManager.ClearSubtitles(episode.ID); + episode.Tracks = null; Track[] tracks = await _transcoder.ExtractSubtitles(episode.Path); foreach (Track track in tracks) { track.EpisodeID = episode.ID; - _libraryManager.RegisterTrack(track); + _libraryManager.Register(track); } - + await _libraryManager.SaveChanges(); return "Done. " + tracks.Length + " track(s) extracted."; } @@ -79,17 +78,18 @@ namespace Kyoo.Api [Authorize(Policy="Admin")] public async Task ExtractSubtitle(string showSlug) { - IEnumerable episodes = _libraryManager.GetEpisodes(showSlug); + IEnumerable episodes = _libraryManager.GetShow(showSlug).Episodes; foreach (Episode episode in episodes) { - _libraryManager.ClearSubtitles(episode.ID); + episode.Tracks = null; Track[] tracks = await _transcoder.ExtractSubtitles(episode.Path); foreach (Track track in tracks) { track.EpisodeID = episode.ID; - _libraryManager.RegisterTrack(track); + _libraryManager.Register(track); } + await _libraryManager.SaveChanges(); } return "Done.";