From 2cfb285c22cb3814ebec5e5d45e0340b21173da0 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 23 Mar 2020 21:45:03 +0100 Subject: [PATCH] Implementing playback of subtitles where the language is unknown --- Kyoo.Common/Controllers/ILibraryManager.cs | 1 + Kyoo.Common/Models/Track.cs | 10 ++++++++-- Kyoo/Controllers/LibraryManager.cs | 6 +++++- Kyoo/Views/API/SubtitleAPI.cs | 20 ++++++++++++++------ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index ff59610d..adbb055f 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -21,6 +21,7 @@ namespace Kyoo.Controllers //Internal read (Track video, IEnumerable audios, IEnumerable 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 GetShows(); diff --git a/Kyoo.Common/Models/Track.cs b/Kyoo.Common/Models/Track.cs index 8e2c1ab6..ea7b5ce7 100644 --- a/Kyoo.Common/Models/Track.cs +++ b/Kyoo.Common/Models/Track.cs @@ -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) diff --git a/Kyoo/Controllers/LibraryManager.cs b/Kyoo/Controllers/LibraryManager.cs index 690517af..7fbb1f1c 100644 --- a/Kyoo/Controllers/LibraryManager.cs +++ b/Kyoo/Controllers/LibraryManager.cs @@ -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(); diff --git a/Kyoo/Views/API/SubtitleAPI.cs b/Kyoo/Views/API/SubtitleAPI.cs index 3f2be5c6..980a8f8a 100644 --- a/Kyoo/Views/API/SubtitleAPI.cs +++ b/Kyoo/Views/API/SubtitleAPI.cs @@ -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);