Fixing movies playback & security headers

This commit is contained in:
Zoe Roux 2021-03-27 02:16:07 +01:00
parent 467e420587
commit d5eb5f905a
5 changed files with 30 additions and 17 deletions

View File

@ -8,7 +8,7 @@ namespace Kyoo.Models
public class Episode : IResource, IOnMerge public class Episode : IResource, IOnMerge
{ {
public int ID { get; set; } 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 string ShowSlug { private get; set; }
[SerializeIgnore] public int ShowID { get; set; } [SerializeIgnore] public int ShowID { get; set; }
[LoadableRelation(nameof(ShowID))] public virtual Show Show { get; set; } [LoadableRelation(nameof(ShowID))] public virtual Show Show { get; set; }
@ -74,13 +74,16 @@ namespace Kyoo.Models
Path = path; 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) if (showSlug == null)
throw new ArgumentException("Show's slug is null. Can't find episode's slug."); throw new ArgumentException("Show's slug is null. Can't find episode's slug.");
if (seasonNumber == -1) return seasonNumber switch
return showSlug; {
return $"{showSlug}-s{seasonNumber}e{episodeNumber}"; -1 when absoluteNumber == -1 => showSlug,
-1 => $"{showSlug}-{absoluteNumber}",
_ => $"{showSlug}-s{seasonNumber}e{episodeNumber}"
};
} }
public void OnMerge(object merged) public void OnMerge(object merged)

View File

@ -31,6 +31,7 @@ namespace Kyoo.Models
public string ShowSlug { get; set; } public string ShowSlug { get; set; }
public int SeasonNumber { get; set; } public int SeasonNumber { get; set; }
public int EpisodeNumber { get; set; } public int EpisodeNumber { get; set; }
public int AbsoluteNumber { get; set; }
public string Title { get; set; } public string Title { get; set; }
public string Slug { get; set; } public string Slug { get; set; }
public DateTime? ReleaseDate { get; set; } public DateTime? ReleaseDate { get; set; }
@ -55,6 +56,7 @@ namespace Kyoo.Models
Show show, Show show,
int seasonNumber, int seasonNumber,
int episodeNumber, int episodeNumber,
int absoluteNumber,
string title, string title,
DateTime? releaseDate, DateTime? releaseDate,
string path) string path)
@ -64,6 +66,7 @@ namespace Kyoo.Models
ShowSlug = show.Slug; ShowSlug = show.Slug;
SeasonNumber = seasonNumber; SeasonNumber = seasonNumber;
EpisodeNumber = episodeNumber; EpisodeNumber = episodeNumber;
AbsoluteNumber = absoluteNumber;
Title = title; Title = title;
ReleaseDate = releaseDate; ReleaseDate = releaseDate;
Path = path; Path = path;
@ -74,20 +77,21 @@ namespace Kyoo.Models
Backdrop = show.Backdrop; Backdrop = show.Backdrop;
Container = Path.Substring(Path.LastIndexOf('.') + 1); Container = Path.Substring(Path.LastIndexOf('.') + 1);
Slug = Episode.GetSlug(ShowSlug, seasonNumber, episodeNumber); Slug = Episode.GetSlug(ShowSlug, seasonNumber, episodeNumber, absoluteNumber);
} }
private WatchItem(int episodeID, private WatchItem(int episodeID,
Show show, Show show,
int seasonNumber, int seasonNumber,
int episodeNumber, int episodeNumber,
int absoluteNumber,
string title, string title,
DateTime? releaseDate, DateTime? releaseDate,
string path, string path,
Track video, Track video,
ICollection<Track> audios, ICollection<Track> audios,
ICollection<Track> subtitles) ICollection<Track> subtitles)
: this(episodeID, show, seasonNumber, episodeNumber, title, releaseDate, path) : this(episodeID, show, seasonNumber, episodeNumber, absoluteNumber, title, releaseDate, path)
{ {
Video = video; Video = video;
Audios = audios; Audios = audios;
@ -123,6 +127,7 @@ namespace Kyoo.Models
ep.Show, ep.Show,
ep.SeasonNumber, ep.SeasonNumber,
ep.EpisodeNumber, ep.EpisodeNumber,
ep.AbsoluteNumber,
ep.Title, ep.Title,
ep.ReleaseDate, ep.ReleaseDate,
ep.Path, ep.Path,

@ -1 +1 @@
Subproject commit 5023f0653dfc62356aae6e0aaa7f71f2473ef417 Subproject commit c72c78989b17f6b92edd7210470ef9cdf24f159f

View File

@ -61,17 +61,22 @@ namespace Kyoo.Controllers
return ret; return ret;
} }
public override Task<Episode> Get(string slug) public override async Task<Episode> Get(string slug)
{ {
Match match = Regex.Match(slug, @"(?<show>.*)-s(?<season>\d*)e(?<episode>\d*)"); Match match = Regex.Match(slug, @"(?<show>.*)-s(?<season>\d*)e(?<episode>\d*)");
if (!match.Success) if (match.Success)
return _database.Episodes.FirstOrDefaultAsync(x => x.Show.Slug == slug); {
return Get(match.Groups["show"].Value, return await Get(match.Groups["show"].Value,
int.Parse(match.Groups["season"].Value), int.Parse(match.Groups["season"].Value),
int.Parse(match.Groups["episode"].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<Episode> Get(Expression<Func<Episode, bool>> predicate) public override async Task<Episode> Get(Expression<Func<Episode, bool>> predicate)
{ {
Episode ret = await base.Get(predicate); Episode ret = await base.Get(predicate);

View File

@ -197,7 +197,7 @@ namespace Kyoo
ctx.Response.Headers.Remove("X-Powered-By"); ctx.Response.Headers.Remove("X-Powered-By");
ctx.Response.Headers.Remove("Server"); ctx.Response.Headers.Remove("Server");
ctx.Response.Headers.Add("Feature-Policy", "autoplay 'self'; fullscreen"); 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("X-Frame-Options", "SAMEORIGIN");
ctx.Response.Headers.Add("Referrer-Policy", "no-referrer"); ctx.Response.Headers.Add("Referrer-Policy", "no-referrer");
ctx.Response.Headers.Add("Access-Control-Allow-Origin", "null"); ctx.Response.Headers.Add("Access-Control-Allow-Origin", "null");