diff options
Diffstat (limited to 'MediaBrowser.Api/Subtitles/SubtitleService.cs')
| -rw-r--r-- | MediaBrowser.Api/Subtitles/SubtitleService.cs | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/MediaBrowser.Api/Subtitles/SubtitleService.cs b/MediaBrowser.Api/Subtitles/SubtitleService.cs index c2183ad7b..160fda065 100644 --- a/MediaBrowser.Api/Subtitles/SubtitleService.cs +++ b/MediaBrowser.Api/Subtitles/SubtitleService.cs @@ -98,6 +98,10 @@ namespace MediaBrowser.Api.Subtitles [ApiMember(Name = "EndPositionTicks", Description = "EndPositionTicks", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public long? EndPositionTicks { get; set; } + + [ApiMember(Name = "CopyTimestamps", Description = "CopyTimestamps", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] + public bool CopyTimestamps { get; set; } + public bool AddVttTimeMap { get; set; } } [Route("/Videos/{Id}/{MediaSourceId}/Subtitles/{Index}/subtitles.m3u8", "GET", Summary = "Gets an HLS subtitle playlist.")] @@ -175,7 +179,7 @@ namespace MediaBrowser.Api.Subtitles var endPositionTicks = Math.Min(runtime, positionTicks + segmentLengthTicks); - var url = string.Format("stream.vtt?StartPositionTicks={0}&EndPositionTicks={1}&api_key={2}", + var url = string.Format("stream.vtt?CopyTimestamps=true&AddVttTimeMap=true&StartPositionTicks={0}&EndPositionTicks={1}&api_key={2}", positionTicks.ToString(CultureInfo.InvariantCulture), endPositionTicks.ToString(CultureInfo.InvariantCulture), accessToken); @@ -190,7 +194,7 @@ namespace MediaBrowser.Api.Subtitles return ResultFactory.GetResult(builder.ToString(), MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary<string, string>()); } - public object Get(GetSubtitle request) + public async Task<object> Get(GetSubtitle request) { if (string.Equals(request.Format, "js", StringComparison.OrdinalIgnoreCase)) { @@ -209,20 +213,32 @@ namespace MediaBrowser.Api.Subtitles return ToStaticFileResult(subtitleStream.Path); } - var stream = GetSubtitles(request).Result; + using (var stream = await GetSubtitles(request).ConfigureAwait(false)) + { + using (var reader = new StreamReader(stream)) + { + var text = reader.ReadToEnd(); + + if (string.Equals(request.Format, "vtt", StringComparison.OrdinalIgnoreCase) && request.AddVttTimeMap) + { + text = text.Replace("WEBVTT", "WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000"); + } - return ResultFactory.GetResult(stream, MimeTypes.GetMimeType("file." + request.Format)); + return ResultFactory.GetResult(text, MimeTypes.GetMimeType("file." + request.Format)); + } + } } - private async Task<Stream> GetSubtitles(GetSubtitle request) + private Task<Stream> GetSubtitles(GetSubtitle request) { - return await _subtitleEncoder.GetSubtitles(request.Id, + return _subtitleEncoder.GetSubtitles(request.Id, request.MediaSourceId, request.Index, request.Format, request.StartPositionTicks, request.EndPositionTicks, - CancellationToken.None).ConfigureAwait(false); + request.CopyTimestamps, + CancellationToken.None); } public object Get(SearchRemoteSubtitles request) |
