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 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)

View File

@ -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 absoluteNumber,
string title,
DateTime? releaseDate,
string path,
Track video,
ICollection<Track> audios,
ICollection<Track> 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,

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

View File

@ -61,15 +61,20 @@ namespace Kyoo.Controllers
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*)");
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<Episode> Get(Expression<Func<Episode, bool>> predicate)

View File

@ -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");