浏览代码

fix timestamps in hls subtitles

Luke Pulverenti 9 年之前
父节点
当前提交
e5655d32f1

+ 5 - 1
MediaBrowser.Api/Subtitles/SubtitleService.cs

@@ -98,6 +98,9 @@ namespace MediaBrowser.Api.Subtitles
 
 
         [ApiMember(Name = "EndPositionTicks", Description = "EndPositionTicks", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         [ApiMember(Name = "EndPositionTicks", Description = "EndPositionTicks", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public long? EndPositionTicks { get; set; }
         public long? EndPositionTicks { get; set; }
+
+        [ApiMember(Name = "CopyTimestamps", Description = "CopyTimestamps", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+        public bool CopyTimestamps { get; set; }
     }
     }
 
 
     [Route("/Videos/{Id}/{MediaSourceId}/Subtitles/{Index}/subtitles.m3u8", "GET", Summary = "Gets an HLS subtitle playlist.")]
     [Route("/Videos/{Id}/{MediaSourceId}/Subtitles/{Index}/subtitles.m3u8", "GET", Summary = "Gets an HLS subtitle playlist.")]
@@ -175,7 +178,7 @@ namespace MediaBrowser.Api.Subtitles
 
 
                 var endPositionTicks = Math.Min(runtime, positionTicks + segmentLengthTicks);
                 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,StartPositionTicks={0}&EndPositionTicks={1}&api_key={2}",
                     positionTicks.ToString(CultureInfo.InvariantCulture),
                     positionTicks.ToString(CultureInfo.InvariantCulture),
                     endPositionTicks.ToString(CultureInfo.InvariantCulture),
                     endPositionTicks.ToString(CultureInfo.InvariantCulture),
                     accessToken);
                     accessToken);
@@ -222,6 +225,7 @@ namespace MediaBrowser.Api.Subtitles
                 request.Format,
                 request.Format,
                 request.StartPositionTicks,
                 request.StartPositionTicks,
                 request.EndPositionTicks,
                 request.EndPositionTicks,
+                request.CopyTimestamps,
                 CancellationToken.None).ConfigureAwait(false);
                 CancellationToken.None).ConfigureAwait(false);
         }
         }
 
 

+ 1 - 7
MediaBrowser.Controller/MediaEncoding/ISubtitleEncoder.cs

@@ -10,13 +10,6 @@ namespace MediaBrowser.Controller.MediaEncoding
         /// <summary>
         /// <summary>
         /// Gets the subtitles.
         /// Gets the subtitles.
         /// </summary>
         /// </summary>
-        /// <param name="itemId">The item identifier.</param>
-        /// <param name="mediaSourceId">The media source identifier.</param>
-        /// <param name="subtitleStreamIndex">Index of the subtitle stream.</param>
-        /// <param name="outputFormat">The output format.</param>
-        /// <param name="startTimeTicks">The start time ticks.</param>
-        /// <param name="endTimeTicks">The end time ticks.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task{Stream}.</returns>
         /// <returns>Task{Stream}.</returns>
         Task<Stream> GetSubtitles(string itemId,
         Task<Stream> GetSubtitles(string itemId,
             string mediaSourceId,
             string mediaSourceId,
@@ -24,6 +17,7 @@ namespace MediaBrowser.Controller.MediaEncoding
             string outputFormat,
             string outputFormat,
             long startTimeTicks,
             long startTimeTicks,
             long? endTimeTicks,
             long? endTimeTicks,
+            bool preserveOriginalTimestamps,
             CancellationToken cancellationToken);
             CancellationToken cancellationToken);
 
 
         /// <summary>
         /// <summary>

+ 4 - 2
MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs

@@ -58,6 +58,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             string outputFormat,
             string outputFormat,
             long startTimeTicks,
             long startTimeTicks,
             long? endTimeTicks,
             long? endTimeTicks,
+            bool preserveOriginalTimestamps,
             CancellationToken cancellationToken)
             CancellationToken cancellationToken)
         {
         {
             var ms = new MemoryStream();
             var ms = new MemoryStream();
@@ -68,7 +69,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 
 
                 var trackInfo = reader.Parse(stream, cancellationToken);
                 var trackInfo = reader.Parse(stream, cancellationToken);
 
 
-                FilterEvents(trackInfo, startTimeTicks, endTimeTicks, false);
+                FilterEvents(trackInfo, startTimeTicks, endTimeTicks, preserveOriginalTimestamps);
 
 
                 var writer = GetWriter(outputFormat);
                 var writer = GetWriter(outputFormat);
 
 
@@ -116,6 +117,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             string outputFormat,
             string outputFormat,
             long startTimeTicks,
             long startTimeTicks,
             long? endTimeTicks,
             long? endTimeTicks,
+            bool preserveOriginalTimestamps,
             CancellationToken cancellationToken)
             CancellationToken cancellationToken)
         {
         {
             var subtitle = await GetSubtitleStream(itemId, mediaSourceId, subtitleStreamIndex, cancellationToken)
             var subtitle = await GetSubtitleStream(itemId, mediaSourceId, subtitleStreamIndex, cancellationToken)
@@ -130,7 +132,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 
 
             using (var stream = subtitle.Item1)
             using (var stream = subtitle.Item1)
             {
             {
-                return await ConvertSubtitles(stream, inputFormat, outputFormat, startTimeTicks, endTimeTicks, cancellationToken).ConfigureAwait(false);
+                return await ConvertSubtitles(stream, inputFormat, outputFormat, startTimeTicks, endTimeTicks, preserveOriginalTimestamps, cancellationToken).ConfigureAwait(false);
             }
             }
         }
         }
 
 

+ 1 - 1
MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs

@@ -748,7 +748,7 @@ namespace MediaBrowser.Server.Implementations.Sync
 
 
             _fileSystem.CreateDirectory(Path.GetDirectoryName(path));
             _fileSystem.CreateDirectory(Path.GetDirectoryName(path));
 
 
-            using (var stream = await _subtitleEncoder.GetSubtitles(streamInfo.ItemId, streamInfo.MediaSourceId, subtitleStreamIndex, subtitleStreamInfo.Format, 0, null, cancellationToken).ConfigureAwait(false))
+            using (var stream = await _subtitleEncoder.GetSubtitles(streamInfo.ItemId, streamInfo.MediaSourceId, subtitleStreamIndex, subtitleStreamInfo.Format, 0, null, false, cancellationToken).ConfigureAwait(false))
             {
             {
                 using (var fs = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, true))
                 using (var fs = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, true))
                 {
                 {