diff --git a/Kyoo.Common/Models/Resources/Episode.cs b/Kyoo.Common/Models/Resources/Episode.cs index c346be0e..27feefd3 100644 --- a/Kyoo.Common/Models/Resources/Episode.cs +++ b/Kyoo.Common/Models/Resources/Episode.cs @@ -8,7 +8,7 @@ namespace Kyoo.Models public class Episode : IResource, IOnMerge { public int ID { get; set; } - public string Slug => GetSlug(ShowSlug, SeasonNumber, EpisodeNumber); + public string Slug => GetSlug(ShowSlug, SeasonNumber, EpisodeNumber, AbsoluteNumber); [SerializeIgnore] public string ShowSlug { private get; set; } [SerializeIgnore] public int ShowID { get; set; } [LoadableRelation(nameof(ShowID))] public virtual Show Show { get; set; } @@ -74,13 +74,16 @@ namespace Kyoo.Models Path = path; } - public static string GetSlug(string showSlug, int seasonNumber, int episodeNumber) + public static string GetSlug(string showSlug, int seasonNumber, int episodeNumber, int absoluteNumber) { if (showSlug == null) throw new ArgumentException("Show's slug is null. Can't find episode's slug."); - if (seasonNumber == -1) - return showSlug; - return $"{showSlug}-s{seasonNumber}e{episodeNumber}"; + return seasonNumber switch + { + -1 when absoluteNumber == -1 => showSlug, + -1 => $"{showSlug}-{absoluteNumber}", + _ => $"{showSlug}-s{seasonNumber}e{episodeNumber}" + }; } public void OnMerge(object merged) diff --git a/Kyoo.Common/Models/WatchItem.cs b/Kyoo.Common/Models/WatchItem.cs index fc260699..ccf5f602 100644 --- a/Kyoo.Common/Models/WatchItem.cs +++ b/Kyoo.Common/Models/WatchItem.cs @@ -31,6 +31,7 @@ namespace Kyoo.Models public string ShowSlug { get; set; } public int SeasonNumber { get; set; } public int EpisodeNumber { get; set; } + public int AbsoluteNumber { get; set; } public string Title { get; set; } public string Slug { get; set; } public DateTime? ReleaseDate { get; set; } @@ -55,6 +56,7 @@ namespace Kyoo.Models Show show, int seasonNumber, int episodeNumber, + int absoluteNumber, string title, DateTime? releaseDate, string path) @@ -64,6 +66,7 @@ namespace Kyoo.Models ShowSlug = show.Slug; SeasonNumber = seasonNumber; EpisodeNumber = episodeNumber; + AbsoluteNumber = absoluteNumber; Title = title; ReleaseDate = releaseDate; Path = path; @@ -74,20 +77,21 @@ namespace Kyoo.Models Backdrop = show.Backdrop; Container = Path.Substring(Path.LastIndexOf('.') + 1); - Slug = Episode.GetSlug(ShowSlug, seasonNumber, episodeNumber); + Slug = Episode.GetSlug(ShowSlug, seasonNumber, episodeNumber, absoluteNumber); } private WatchItem(int episodeID, Show show, int seasonNumber, - int episodeNumber, + int episodeNumber, + int absoluteNumber, string title, DateTime? releaseDate, string path, Track video, ICollection audios, ICollection subtitles) - : this(episodeID, show, seasonNumber, episodeNumber, title, releaseDate, path) + : this(episodeID, show, seasonNumber, episodeNumber, absoluteNumber, title, releaseDate, path) { Video = video; Audios = audios; @@ -123,6 +127,7 @@ namespace Kyoo.Models ep.Show, ep.SeasonNumber, ep.EpisodeNumber, + ep.AbsoluteNumber, ep.Title, ep.ReleaseDate, ep.Path, diff --git a/Kyoo.WebApp b/Kyoo.WebApp index 5023f065..c72c7898 160000 --- a/Kyoo.WebApp +++ b/Kyoo.WebApp @@ -1 +1 @@ -Subproject commit 5023f0653dfc62356aae6e0aaa7f71f2473ef417 +Subproject commit c72c78989b17f6b92edd7210470ef9cdf24f159f diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 77901701..121a1fed 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -61,15 +61,20 @@ namespace Kyoo.Controllers return ret; } - public override Task Get(string slug) + public override async Task Get(string slug) { Match match = Regex.Match(slug, @"(?.*)-s(?\d*)e(?\d*)"); - - if (!match.Success) - return _database.Episodes.FirstOrDefaultAsync(x => x.Show.Slug == slug); - return Get(match.Groups["show"].Value, - int.Parse(match.Groups["season"].Value), - int.Parse(match.Groups["episode"].Value)); + + if (match.Success) + { + return await Get(match.Groups["show"].Value, + int.Parse(match.Groups["season"].Value), + int.Parse(match.Groups["episode"].Value)); + } + + Episode episode = await _database.Episodes.FirstOrDefaultAsync(x => x.Show.Slug == slug); + episode.ShowSlug = slug; + return episode; } public override async Task Get(Expression> predicate) diff --git a/Kyoo/Startup.cs b/Kyoo/Startup.cs index f0796f53..0ff5577f 100644 --- a/Kyoo/Startup.cs +++ b/Kyoo/Startup.cs @@ -197,7 +197,7 @@ namespace Kyoo ctx.Response.Headers.Remove("X-Powered-By"); ctx.Response.Headers.Remove("Server"); ctx.Response.Headers.Add("Feature-Policy", "autoplay 'self'; fullscreen"); - ctx.Response.Headers.Add("Content-Security-Policy", "default-src 'self'; script-src 'self' blob: 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"); + ctx.Response.Headers.Add("Content-Security-Policy", "default-src 'self'; script-src 'self' blob: 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src 'self' https://www.youtube.com"); ctx.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN"); ctx.Response.Headers.Add("Referrer-Policy", "no-referrer"); ctx.Response.Headers.Add("Access-Control-Allow-Origin", "null");