Implementing playback of subtitles where the language is unknown

This commit is contained in:
Zoe Roux 2020-03-23 21:45:03 +01:00
parent 8fdfc5ce85
commit 2cfb285c22
4 changed files with 28 additions and 9 deletions

View File

@ -21,6 +21,7 @@ namespace Kyoo.Controllers
//Internal read
(Track video, IEnumerable<Track> audios, IEnumerable<Track> subtitles) GetStreams(long episodeID, string showSlug);
Track GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag, bool forced);
Track GetSubtitleById(long id);
//Public read
IEnumerable<Show> GetShows();

View File

@ -96,8 +96,14 @@ namespace Kyoo.Models
//Converting mkv track language to c# system language tag.
if (language == "fre")
language = "fra";
DisplayName = CultureInfo.GetCultures(CultureTypes.NeutralCultures).FirstOrDefault(x => x.ThreeLetterISOLanguageName == language)?.EnglishName ?? language;
if (language == null)
{
Language = ID.ToString();
DisplayName = $"Unknown Language (id: {ID.ToString()})";
}
else
DisplayName = CultureInfo.GetCultures(CultureTypes.NeutralCultures).FirstOrDefault(x => x.ThreeLetterISOLanguageName == language)?.EnglishName ?? language;
Link = "/subtitle/" + episodeSlug + "." + Language;
if (IsForced)

View File

@ -54,7 +54,11 @@ namespace Kyoo.Controllers
&& track.Language == languageTag select track).FirstOrDefault();
}
public Track GetSubtitleById(long id)
{
return (from track in _database.Tracks where track.ID == id select track).FirstOrDefault();
}
public Library GetLibrary(string librarySlug)
{
return (from library in _database.Libraries where library.Slug == librarySlug select library).FirstOrDefault();

View File

@ -23,15 +23,23 @@ namespace Kyoo.Api
[HttpGet("{showSlug}-s{seasonNumber:int}e{episodeNumber:int}.{identifier}.{extension?}")]
public IActionResult GetSubtitle(string showSlug, int seasonNumber, int episodeNumber, string identifier, string extension)
{
string languageTag = identifier.Substring(0, 3);
bool forced = identifier.Length > 3 && identifier.Substring(4) == "forced";
Track subtitle = _libraryManager.GetSubtitle(showSlug, seasonNumber, episodeNumber, languageTag, forced);
Track subtitle;
if (identifier.Length >= 3 && identifier[3] == '-')
{
string languageTag = identifier.Substring(0, 3);
subtitle = _libraryManager.GetSubtitle(showSlug, seasonNumber, episodeNumber, languageTag, forced);
}
else
{
long.TryParse(identifier.Substring(0, 3), out long id);
subtitle = _libraryManager.GetSubtitleById(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.
{
return new ConvertSubripToVtt(subtitle.Path);